./PaxHeaders.7406/icedtea-web-1.80000644000000000000000000000013213441764407013302 xustar0030 mtime=1552410887.101183471 30 atime=1552410887.104183464 30 ctime=1552410887.101183471 icedtea-web-1.8/0000755000175000002070000000000013441764407014032 5ustar00jvanekmock00000000000000icedtea-web-1.8/PaxHeaders.7406/win-installer0000644000000000000000000000013213441742745015736 xustar0030 mtime=1552401893.169832552 30 atime=1552410887.104183464 30 ctime=1552410887.101183471 icedtea-web-1.8/win-installer/0000755000175000002070000000000013441742745016623 5ustar00jvanekmock00000000000000icedtea-web-1.8/win-installer/PaxHeaders.7406/greetings_banner.bmp0000644000000000000000000000013113441742745022026 xustar0029 mtime=1552401893.15183259 30 atime=1552402157.289253364 30 ctime=1552410887.101183471 icedtea-web-1.8/win-installer/greetings_banner.bmp0000644000175000002070000226162613441742745022656 0ustar00jvanekmock00000000000000BM–c 6(э8 `c з з кџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЩџЉџ‰џiџQџDџ:џ0џ &џ џ џ џ )џ4џ@џKџYџxџ—џЗџеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџбџ џjџ:џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ 'џNџƒџКџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЌџqџ;џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џUџ‹џЫџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџОџsџ (џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џKџ—џдџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџвџ‰џ;џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ`џБџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџаџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ:џЄџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЯџyџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ:џ›џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџ|џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџ(((џ222џ>>>џKKKџZZZџ\\\џRRRџGGGџ;;;џ,,,џџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ:џДџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЇџ.џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ>>>џmmmџ‘‘‘џЙЙЙџнннџќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёёёџЫЫЫџІІІџ€€€џZZZџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џeџЯџкџкџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџШџVџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ555џuuuџДДДџёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ–––џWWWџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ‘џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ™џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ,,,џ………џоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџЕЕЕџ\\\џџ џ џ џ џ џ џ џ џ џ џ џ џ џ џGџЪџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџеџeџ џ џ џ џ џ џ џ џ џ џ џ џ џџlllџЦЦЦџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џžžžџ>>>џ џ џ џ џ џ џ џ џ џ џ џ џ џ "џЊџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџСџ9џ џ џ џ џ џ џ џ џ џ џ џ џџtttџчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХХХџSSSџ џ џ џ џ џ џ џ џ џ џ џ џ џrџиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џ џ џ џ џ џџ‡‡‡џ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЦЦЦџOOOџ џ џ џ џ џ џ џ џ џ џ џ џEџЮџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџŽџ џ џ џ џ џ џ џ џ џ џ џ џcccџыыыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРРРџ000џ џ џ џ џ џ џ џ џ џ џ џ.џФџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џ џ џ џ џ777џЧЧЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџџџ џ џ џ џ џ џ џ џ џ џ $џЛџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџfџ џ џ џ џ џ џ џ џ џ џџ‘‘‘џќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџDDDџ џ џ џ џ џ џ џ џ џ џ џБџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџXџ џ џ џ џ џ џ џ џ џ џ+++џЭЭЭџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћћџ}}}џ џ џ џ џ џ џ џ џ џ џ џЌџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџhџ џ џ џ џ џ џ џ џ џ џVVVџяяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџЙЙЙџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘‘‘џЦЦЦџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџПППџ!!!џ џ џ џ џ џ џ џ џ џ џЙџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ|џ џ џ џ џ џ џ џ џ џ џ‘‘‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџkkkџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхххџ:::џ џ џ џ џ џ џ џ џ џ "џУџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џ џ џџЉЉЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуууџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓѓѓџNNNџ џ џ џ џ џ џ џ џ џ,џЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџкџкџкџкџкџЁџ џ џ џ џ џ џ џ џ џџНННџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХХХџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџ^^^џ џ џ џ џ џ џ џ џ џ:џеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџФџ џ џ џ џ џ џ џ џ џџЭЭЭџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗЗЗџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џзззџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џrrrџ џ џ џ џ џ џ џ џ џeџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџ?џ џ џ џ џ џ џ џ џџЧЧЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊЊЊџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џУУУџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџhhhџ џ џ џ џ џ џ џ џ џ˜џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџlџ џ џ џ џ џ џ џ џџЙЙЙџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџœœœџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џВВВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџWWWџ џ џ џ џ џ џ џ џ џПџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЅџ џ џ џ џ џ џ џ џ џЃЃЃџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽŽŽџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ   џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџCCCџ џ џ џ џ џ џ џ џ5џеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЮџ џ џ џ џ џ џ џ џ џ‹‹‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џŽŽŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџ+++џ џ џ џ џ џ џ џ џrџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџdџ џ џ џ џ џ џ џ џPPPџ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџsssџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ{{{џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭЭЭџџ џ џ џ џ џ џ џ џЛџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЖџ џ џ џ џ џ џ џ џ%%%џьььџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџeeeџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џiiiџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ”””џ џ џ џ џ џ џ џ џDџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџ9џ џ џ џ џ џ џ џџФФФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXXXџ џ џ џ џ џ џ џ{Lџвџо†џо†џюџяџі”џџ™џџ™џа~џ) џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џWWWџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџYYYџ џ џ џ џ џ џ џ џ—џкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ‰џ џ џ џ џ џ џ џ џƒƒƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџIIIџ џ џ џ џ џ џM1џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ bџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џEEEџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џ"""џ џ џ џ џ џ џ џ "џбџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџдџ џ џ џ џ џ џ џ џ---џїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ<<<џ џ џ џ џ џ џtHџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џНsџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ222џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉЉЉџ џ џ џ џ џ џ џ џyџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ„џ џ џ џ џ џ џ џ џИИИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ///џ џ џ џ џ џ џnDџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џУvџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџIIIџ џ џ џ џ џ џ џ џбџкџкџкџкџйџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџ %џ џ џ џ џ џ џ џ[[[џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!!!џ џ џ џ џ џ џg@џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џЪzџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџџ џ џ џ џ џ џ џ€џкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џџуууџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џ џ џ џ џ`<џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џб~џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{{{џ џ џ џ џ џ џ џ !џеџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџїїўџіі§џяя§џяя§џччћџччќџссћџффћџъъќџ№№§џїїўџўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџ-џ џ џ џ џ џ џ џsssџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџ џ џ џ џ џ џ џZ9џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џи‚џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџџ џ џ џ џ џ џ џˆџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№§џппњџЯЯјџООѕџЏЏѓџЃЃђџ™™ёџŒŒяџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŠŠюџяџ™™№џЈЈђџЙЙѕџЩЩїџккњџъъќџњњўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџžџ џ џ џ џ џ џ џџуууџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџ џ џ џ џ џ џ џS5џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џо†џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЬЬЬџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxxxџ џ џ џ џ џ џ џ-џкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§џџццћџЭЭјџЗЗѕџЁЁёџŒŒюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ““№џЋЋѓџХХіџррћџљљўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџQџ џ џ џ џ џ џ џjjjџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпппџ џ џ џ џ џ џ џM1џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џхŠџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џКККџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшшшџџ џ џ џ џ џ џ џБџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњўџннњџООіџЂЂёџŠŠюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‡‡эџ››№џЕЕєџаајџђђ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЯџ џ џ џ џ џ џ џ џлллџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџбббџ џ џ џ џ џ џ џ@*џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џкƒџ џ џ џ џ* џ џ џ џ џ џ џ џ џ џ џ џЈЈЈџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџoooџ џ џ џ џ џ џ џfџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшшќџФФіџЄЄђџ‰‰юџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџžžёџТТіџццћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ‰џ џ џ џ џ џ џ џUUUџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУУУџ џ џ џ џ џ џ џ џеџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џћ—џe?џ џ џ џ bџџ™џј•џzKџ џ џ џ џ џ џ џ џ џ•••џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџ џ џ џ џ џ џ џ џзџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§ўџооњџЙЙѕџ””яџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ’’яџЖЖѕџллљџ§§ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ=џ џ џ џ џ џ џ џЎЎЎџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖЖЖџ џ џ џ џ џ џ џ џ џa=џlCџc>џ\:џ[9џK0џK0џB+џ" џ џ џ џyKџџ™џџ™џџ™џџ™џАkџ џ џ џ џ џ џ џ џƒƒƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ>>>џ џ џ џ џ џ џ џџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџччќџККѕџ‘‘яџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‘‘юџККѕџщщќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџТџ џ џ џ џ џ џ џџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈЈЈџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џB+џњ–џџ™џџ™џџ™џџ™џџ™џкƒџ4"џ џ џ џ џ џ џqqqџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ———џ џ џ џ џ џ џ џSџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№ќџТТіџ””яџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЂЂђџаајџјјўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ‰џ џ џ џ џ џ џ џmmmџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџšššџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ$ џщŒџџ™џџ™џџ™џџ™џџ™џџ™џџ™џѓ’џ^;џ џ џ џ џ џ___џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџџ џ џ џ џ џ џ џиџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§џџззљџЈЈђџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‹‹юџЗЗєџююќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџTџ џ џ џ џ џ џ џХХХџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЧxџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џG.џ џ џ џ џLLLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџUUUџ џ џ џ џ џ џ џДџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјўџЪЪїџ””№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‡‡эџЊЊѓџххћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ џ џ џ џ џ џ џџќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џXџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ”[џ џ џ џ џ:::џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџœœœџ џ џ џ џ џ џ џ}џкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьь§џЖЖѕџŠŠюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЇЇђџррћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЙџ џ џ џ џ џ џ џXXXџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџrrrџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џяџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ‚Pџ џ џ џ џ(((џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџлллџ џ џ џ џ џ џ џIџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџччћџ­­ѓџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЂЂђџуућџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџƒџ џ џ џ џ џ џ џ–––џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdddџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЩyџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џу‰џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(((џ џ џ џ џ џ џ џзџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуућџЉЉѓџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ­­ѓџээќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџTџ џ џ џ џ џ џ џжжжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџVVVџ џ џ џ џ џ џ џ џ џ џ џ џ џmDџгџкƒџT5џ џ* џд€џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џј•џ>(џ џ џ џ џ џ џјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџeeeџ џ џ џ џ џ џ џДџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыы§џЎЎѓџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџˆˆюџЖЖєџєє§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ4џ џ џ џ џ џ џџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHHHџ џ џ џ џ џ џ џ џ џ џ џxJџцŠџџ™џџ™џџ™џѓ’џ џ џ џЉgџџ™џџ™џџ™џџ™џџ™џџ™џџ™џnDџ џ џ џ џ џ џ џчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄЄЄџ џ џ џ џ џ џ џ“џкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџээќџЏЏѓџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџяџЧЧїџ§§ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ џ џ џ џ џ џ џKKKџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ;;;џ џ џ џ џ џ џ џ џ џ„Qџэџџ™џџ™џџ™џџ™џџ™џџ™џ‡Sџ џ џ џsGџњ–џџ™џџ™џџ™џџ™џЄdџ џ џ џ џ џ џ џ џеееџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаааџ џ џ џ џ џ џ џuџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіі§џККѕџˆˆюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџœœ№џццћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџХџ џ џ џ џ џ џ џqqqџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ---џ џ џ џ џ џ џ" џXџѓ’џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џяџ џ џ џ џB+џхŠџџ™џџ™џа~џ џ џ џ џ џ џ џ џ џТТТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєєєџ џ џ џ џ џ џ џUџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§џџЫЫјџяџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‡‡эџЛЛѕџљљўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЅџ џ џ џ џ џ џ џ–––џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џ џ џ џyKџї”џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ{Lџ џ џ џ џ џ†Rџ…Rџ џ џ џ џ џ џ џ џ џ џАААџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ%%%џ џ џ џ џ џ џ5џкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуућџ™™№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ””яџллљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ†џ џ џ џ џ џ џ џМММџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џ џ џ' џў˜џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џшŒџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џžžžџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџJJJџ џ џ џ џ џ џ џкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџииљџˆˆюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџГГєџљљўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџoџ џ џ џ џ џ џ џрррџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџ џ џ џ џ џ/ џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џqFџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џŒŒŒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџqqqџ џ џ џ џ џ џ џЯџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџээќџŠŠюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ——№џццћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџeџ џ џ џ џ џ џ џіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыыыџ џ џ џ џ џ џШyџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џр‡џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џyyyџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ………џ џ џ џ џ џ џ џФџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ­­ѓџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџˆˆюџЧЧїџўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџZџ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ џ џ џ џ џ џS5џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џe?џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џgggџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ’’’џ џ џ џ џ џ џ џКџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљўџˆˆюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЅЅђџђђ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџPџ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаааџ џ џ џ џ џ џ џгџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џвџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џUUUџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸŸŸџ џ џ џ џ џ џ џЏџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџттћџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџяџссћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџкџкџкџкџкџEџ џ џ џ џ џ џ&&&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТТТџ џ џ џ џ џ џ џ_<џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џѓ’џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џCCCџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋЋЋџ џ џ џ џ џ џ џЅџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџллљџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџˆˆюџЭЭјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ;џ џ џ џ џ џ џ111џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДДДџ џ џ џ џ џ џ џ џл„џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џŒVџ џ џ џ џ џ џ џ џџ џ џ џ џ џ џ000џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИИИџ џ џ џ џ џ џ џ™џкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџччќџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЖЖѕџќќўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ:џ џ џ џ џ џ џ444џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЇЇЇџ џ џ џ џ џ џ џ џjBџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џУvџN2џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛЛЛџ џ џ џ џ џ џ џ—џкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§џџюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЂЂђџєє§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџCџ џ џ џ џ џ џ(((џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜˜˜џ џ џ џ џ џ џ џ џ џф‰џџ™џџ™џџ™џџ™џџ™џџ™џў˜џИpџD,џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎЎџ џ џ џ џ џ џ џЂџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџННіџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ““яџъъќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџNџ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹‹‹џ џ џ џ џ џ џ џ џ џvIџџ™џџ™џџ™џџ™џ§˜џ­iџ9%џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џяяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЂЂЂџ џ џ џ џ џ џ џЌџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјўџ••№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŽŽяџссћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџWџ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џЫЫЫџ‹‹‹џНННџџџџџ~~~џ џ џ џ џ џ џ џ џ џ џЭ|џџ™џњ–џЂcџ/џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џмммџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•••џ џ џ џ џ џ џ џЗџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџььќџ••№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŠŠюџииљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџbџ џ џ џ џ џ џ џљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиииџkkkџ!!!џ џ џšššџџџџџpppџ џ џ џ џ џ џ џ џ џ џ џB+џ џ џ џ џ џ џ џ џ џ џ џPPPџВВВџ---џ џ џ џ џuuuџŠŠŠџ222џ џ џ џ џ џЪЪЪџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆˆˆџ џ џ џ џ џ џ џСџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіі§џККѕџŒŒяџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‡‡эџЭЭјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџlџ џ џ џ џ џ џ џшшшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџiiiџ џ џ џ џ џЈЈЈџџџџџbbbџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џGGGџЩЩЩџџџџџџџџџvvvџ џ џ џ џNNNџџџџџџџџџ000џ џ џ џ џИИИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxxxџ џ џ џ џ џ џ џЬџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњўџззљџББєџюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџССіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ~џ џ џ џ џ џ џ џФФФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџАААџџ џ џ џ џ џ џЖЖЖџџџџџUUUџ џ џ џ џ>>>џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ666џИИИџџџџџџџџџџџџџџџџџМММџ џ џ џ џџѕѕѕџџџџџMMMџ џ џ џ џІІІџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџTTTџ џ џ џ џ џ џ џзџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџуућџККѕџ’’яџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџММѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџŸџ џ џ џ џ џ џ џŸŸŸџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџџ џ џ џ џ џ џ џ џУУУџџџџџGGGџ џ џ џ џ­­­џчччџ“““џ===џ џ џ џ џ џ џ џ џ џJJJџДДДџ§§§џџџџџџџџџџџџџџџџџџџџџјјјџџ џ џ џ џИИИџџџџџ```џ џ џ џ џ“““џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ...џ џ џ џ џ џ џ-џкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџччќџТТіџ™™ёџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџММѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџНџ џ џ џ џ џ џ џyyyџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџvvvџ џ џ џ џ џ џ џ џ џбббџџџџџ999џ џ џ џ џЛЛЛџџџџџџџџџџџџџъъъџЗЗЗџˆˆˆџmmmџdddџeeeџ„„„џЋЋЋџэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRRRџ џ џ џ џrrrџџџџџrrrџ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџџ џ џ џ џ џ џMџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџччћџММѕџ’’яџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџММѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџ џ џ џ џ џ џ џTTTџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџœœœџ џ џ џ џ џ џ џ џ џ џоооџџџџџ,,,џ џ џ џ џШШШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜˜˜џ џ џ џ џ***џџџџџ„„„џ џ џ џ џoooџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйййџ џ џ џ џ џ џ џlџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџуућџЖЖєџŒŒюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџММѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ-џ џ џ џ џ џ џ+++џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧЧЧџџ џ џ џ џ џ џ џ џ џ џэээџџџџџџ џ џ џ џзззџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпппџ џ џ џ џ џкккџ–––џ џ џ џ џ]]]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџАААџ џ џ џ џ џ џ џџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џђђђџ№№№џћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњўџддљџЉЉѓџˆˆюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџННѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџLџ џ џ џ џ џ џ џфффџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџ===џ џ џ џ џ џ џ џ џ џ џ џљљљџџџџџџ џ џ џ џфффџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ///џ џ џ џ џ”””џЉЉЉџ џ џ џ џJJJџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџtttџ џ џ џ џ џ џ џЌџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџЏЏЏџ‘‘‘џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џџЇЇЇџДДДџПППџЭЭЭџмммџьььџњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєє§џЪЪїџœœ№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЦЦїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџwџ џ џ џ џ џ џ џІІІџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊЊЊџ џ џ џ џ џ џ џ џ џ џ џџџџџџїїїџ џ џ џ џ џђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџvvvџ џ џ џ џNNNџЛЛЛџ џ џ џ џ888џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ444џ џ џ џ џ џ џ џбџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џМММџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ”””џІІІџЙЙЙџЫЫЫџоооџёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџччќџЖЖєџ‹‹юџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџаајџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЌџ џ џ џ џ џ џ џgggџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ000џ џ џ џ џ џ џ џ џ џ џ џ џџџџџъъъџ џ џ џ џ џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМММџ џ џ џ џџУУУџ џ џ џ џ&&&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџ џ џ џ џ џ џ џ=џкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗЗЗџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џЈЈЈџПППџжжжџэээџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџііўџЧЧіџ••№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџˆˆюџккњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџ џ џ џ џ џ џ џ'''џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеееџ џ џ џ џ џ џ џ џ џ џ џ џ///џџџџџмммџ џ џ џ џџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџоооџэээџяяяџшшшџџ џ џ џ џ———џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊЊЊџ џ џ џ џ џ џ џrџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзззџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џЉЉЉџХХХџсссџњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџккљџЁЁёџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŠŠюџттћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџHџ џ џ џ џ џ џ џйййџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‡‡‡џ џ џ џ џ џ џ џ џ џ џ џ џ<<<џџџџџЮЮЮџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhhџ џ џ џ џ џ џ џЇџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџžžžџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџЅЅЅџТТТџуууџ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџттћџЋЋђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŽŽяџыы§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ}џ џ џ џ џ џ џ џ‚‚‚џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџAAAџ џ џ џ џ џ џ џ џ џ џ џ џIIIџџџџџСССџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џхххџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџџ џ џ џ џ џ џ џдџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џЏЏЏџаааџђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыы§џВВѓџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ••№џѕѕўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЕџ џ џ џ џ џ џ џ)))џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"""џ џ џ џ џ џ џ џ џ џ џ џ џWWWџџџџџОООџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џмммџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌЌЌџ џ џ џ џ џ џ џDџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиииџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЅЅЅџЩЩЩџюююџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъќџВВѓџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЂЂёџќќўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ-џ џ џ џ џ џ џ џТТТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџ џ џ џ џ џ џ џ џ џ џ џ џ џeeeџџџџџюююџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ%%%џњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRRRџ џ џ џ џ џ џ џ‹џкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеееџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ   џЩЩЩџђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшшћџІІђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЖЖѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџwџ џ џ џ џ џ џ џiiiџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцццџ џ џ џ џ џ џ џ џ џ џ џ џ џqqqџџџџџџџџџСССџ888џџџџџџџџџџџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ:::џЮЮЮџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџџ џ џ џ џ џ џ џЮџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоооџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŒŒŒџЈЈЈџгггџљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџммњџšš№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЪЪїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџСџ џ џ џ џ џ џ џџюююџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьььџ џ џ џ џ џ џ џ џ џ џ џ џ џZZZџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНННџ џ џ џ џџѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŠŠŠџ џ џ џ џ џ џ џSџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџЙЙЙџщщщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§ўџЮЮјџюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‡‡эџппћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ?џ џ џ џ џ џ џ џ„„„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџџ џ џ џ џ џ џ џ џ џ џ џ џџШШШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџџ џ џ џ џЖЖЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕџџ џ џ џ џ џ џ џŸџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘‘‘џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џІІІџжжжџ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїўџККѕџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџюџђђ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ‹џ џ џ џ џ џ џ џџѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ***џ џ џ џ џ џ џ џ џ џ џ џ џ џџ[[[џ{{{џ|||џ|||џ|||џ|||џ|||џ|||џ|||џ|||џ|||џ|||џ|||џ|||џ|||џ|||џ|||џ|||џйййџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџTTTџ џ џ џ џpppџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ’’’џ џ џ џ џ џ џ џ џзџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃЃЃџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ˜˜˜џЫЫЫџљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџттћџ™™№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЁЁёџ§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџбџ џ џ џ џ џ џ џ џŽŽŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRRRџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џрррџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџšššџ џ џ џ џ***џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџ$$$џ џ џ џ џ џ џ џqџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖЖЖџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џРРРџѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќџџССіџˆˆюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџООіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџuџ џ џ џ џ џ џ џ!!!џєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸŸŸџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ777џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрррџ џ џ џ џ џйййџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџšššџ џ џ џ џ џ џ џ џЫџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШШШџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџНННџєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџффћџ––№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџккњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЮџ џ џ џ џ џ џ џ џ}}}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџщщщџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ„„„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ000џ џ џ џ џ’’’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюююџџ џ џ џ џ џ џ џiџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмммџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џУУУџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљўџГГєџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŽŽюџёё§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџlџ џ џ џ џ џ џ џџиииџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPPPџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџкккџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxxxџ џ џ џ џLLLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џЉЉЉџџыыыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџlllџ џ џ џ џ џ џ џ џХџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєєєџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ•••џаааџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжљџяџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЄЄёџўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЫџ џ џ џ џ џ џ џ џFFFџўўўџџџџџџџџџџџџџџџџџџџџџџџџџбббџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џmmmџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОООџ џ џ џ џџєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџВВВџZZZџџ џ џџпппџџџџџџџџџџџџџџџџџџџџџЬЬЬџ џ џ џ џ џ џ џ џaџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ———џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŸŸŸџпппџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџээќџ™™№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЩЩїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџlџ џ џ џ џ џ џ џ џЈЈЈџџџџџџџџџџџџџџџџџџџџџџџџџџџџџcccџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџџ џ џ џ џЕЕЕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџХХХџmmmџџ џ џ џ џ џ џxxxџџџџџџџџџџџџџџџџџќќќџ:::џ џ џ џ џ џ џ џ џУџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎЎџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џБББџѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїўџЈЈђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŠŠюџъъќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџбџ $џ џ џ џ џ џ џ џџрррџџџџџџџџџџџџџџџџџџџџџџџџџшшшџ%%%џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџUUUџ џ џ џ џoooџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиииџ€€€џ)))џ џ џ џ џ џ џ џ џ џnnnџџџџџџџџџџџџџџџџџ‚‚‚џ џ џ џ џ џ џ џ џzџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЦЦЦџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џЮЮЮџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџННіџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџёџќќўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ˜џ џ џ џ џ џ џ џ џ>>>џљљљџџџџџџџџџџџџџџџџџџџџџџџџџаааџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џtttџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ›››џ џ џ џ џ)))џџџџџџџџџџџџџџџџџчччџ’’’џ;;;џ џ џ џ џ џ џ џ џ џ џ џџЭЭЭџџџџџџџџџџџџџСССџ џ џ џ џ џ џ џ џ,џжџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЅЅЅџэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮЮјџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџППіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџHџ џ џ џ џ џ џ џ џzzzџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДДДџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џUUUџќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџсссџ џ џ џ џ џиииџѓѓѓџІІІџNNNџ џ џ џ џ џ џ џ џ џ џ џ џџaaaџаааџџџџџџџџџџџџџщщщџ"""џ џ џ џ џ џ џ џ џЅџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџЩЩЩџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеељџˆˆюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџˆˆюџччћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџОџ џ џ џ џ џ џ џ џ џЖЖЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШШШџ"""џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џlllџћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ222џ џ џ џ џ777џџ џ џ џ џ џ џ џ џ џ џ џ џMMMџІІІџѓѓѓџџџџџџџџџџџџџџџџџќќќџHHHџ џ џ џ џ џ џ џ џUџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџžžžџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЈЈЈџёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџммњџŠŠюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџœœ№џ§§ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ~џ џ џ џ џ џ џ џ џџЮЮЮџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџFFFџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџЈЈЈџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxxxџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ:::џ’’’џчччџџџџџџџџџџџџџџџџџџџџџџџџџўўўџjjjџ џ џ џ џ џ џ џ џ џЩџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКККџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ“““џмммџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџттћџŒŒюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЩЩїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџKџ џ џ џ џ џ џ џ џџкккџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОООџ777џ џ џ џ џ џ џ џ џ џ џ џ џ џџ|||џяяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОООџ џ џ џ џ џ џ џ џ џ џ џ џ%%%џtttџбббџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€€€џ џ џ џ џ џ џ џ џ џЄџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеееџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џНННџќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџррћџ‰‰юџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‹‹юџяя§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЬџ $џ џ џ џ џ џ џ џ џ***џчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџЗЗЗџkkkџ"""џ џ џ џ џ џ џ џџKKKџ–––џчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџџ џ џ џ џ џ џ џ џџmmmџФФФџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџšššџ џ џ џ џ џ џ џ џ џvџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џІІІџєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиињџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЈЈђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЌџ џ џ џ џ џ џ џ џ џ777џыыыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џжжжџКККџЄЄЄџŽŽŽџ———џВВВџШШШџђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ]]]џ џ џ џ џ џџZZZџВВВџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІІІџ џ џ џ џ џ џ џ џ џBџиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџьььџшшшџёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜˜˜џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ˜˜˜џшшшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЯЯјџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџййљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ}џ џ џ џ џ џ џ џ џ џ///џрррџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоооџ---џ џ џGGGџŸŸŸџ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“““џ џ џ џ џ џ џ џ џ џ џЧџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыыыџВВВџџ‹‹‹џ‹‹‹џ‹‹‹џ™™™џЧЧЧџњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗЗЗџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџжжжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФФіџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ––№џќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџfџ џ џ џ џ џ џ џ џ џ"""џбббџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћћџвввџчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџ„„„џ џ џ џ џ џ џ џ џ џ џГџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ›››џэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЩЩЩџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎѓџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЦЦїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџRџ џ џ џ џ џ џ џ џ џџФФФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџgggџ џ џ џ џ џ џ џ џ џ џЉџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЯЯЯџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ–––џёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џНННџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљўџšš№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŒŒюџѓѓ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџDџ џ џ џ џ џ џ џ џ џџ„„„џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуууџCCCџ џ џ џ џ џ џ џ џ џ џ—џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчччџŽŽŽџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ­­­џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЂЂЂџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џБББџќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџээќџюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџДДєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџаџ5џ џ џ џ џ џ џ џ џ џ џTTTџюююџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕЕЕџџ џ џ џ џ џ џ џ џ џ џŠџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџœœœџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џщщщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџСССџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ­­­џќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџккњџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‡‡эџщщќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЮџ>џ џ џ џ џ џ џ џ џ џ џ'''џЦЦЦџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџxxxџ џ џ џ џ џ џ џ џ џ џ џџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗЗЗџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЛЛЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтттџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЋЋЋџћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИИѕџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЋЋѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџдџPџ џ џ џ џ џ џ џ џ џ џ џcccџьььџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџСССџ111џ џ џ џ џ џ џ џ џ џ џ џџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ’’’џћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џ“““џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЉЉЉџћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљўџ••№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџффћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџ^џ џ џ џ џ џ џ џ џ џ џ џџ”””џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчччџcccџ џ џ џ џ џ џ џ џ џ џ џ џЉџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџ•••џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џжжжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДДДџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ­­­џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџррћџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЃЃђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџpџ џ џ џ џ џ џ џ џ џ џ џ џBBBџПППџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џ‡‡‡џџ џ џ џ џ џ џ џ џ џ џ џ #џИџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕЕЕџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЊЊЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џАААџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖЖєџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџооњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџœџ џ џ џ џ џ џ џ џ џ џ џ џ џ999џ­­­џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьььџ„„„џџ џ џ џ џ џ џ џ џ џ џ џ џIџЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмммџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŒŒŒџёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџŽŽŽџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џКККџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјўџ““яџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЂЂђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџСџ:џ џ џ џ џ џ џ џ џ џ џ џ џ џ777џЄЄЄџѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеееџtttџџ џ џ џ џ џ џ џ џ џ џ џ џ џ}џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћћџšššџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЧЧЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉЉЉџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џШШШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџббјџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџссћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџrџ џ џ џ џ џ џ џ џ џ џ џ џ џ џџ\\\џЕЕЕџћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюююџџCCCџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ #џЊџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУУУџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ›››џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаааџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џзззџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџœœ№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЈЈђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџІџ,џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ$$$џmmmџЌЌЌџъъъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџЭЭЭџџMMMџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џcџЮџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюююџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џуууџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџфффџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџннњџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџччћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџyџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ444џtttџЃЃЃџЩЩЩџюююџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџмммџИИИџџVVVџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ7џВџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎЎџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЗЗЗџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉЉЉџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ–––џѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЇЇђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџААєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџСџLџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџDDDџ\\\џjjjџvvvџ€€€џџ‘‘‘џ‰‰‰џ|||џnnnџcccџUUUџ222џџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џˆџиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџбббџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џІІІџќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщщќџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‡‡эџ№№§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЈџDџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џrџЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅЅЅџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џгггџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џМММџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛЛѕџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџООѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџДџVџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џrџЮџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйййџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЃЃЃџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋЋЋџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џйййџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§џџЋЋђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџюџћћўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЗџ[џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ0џƒџвџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ   џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзззџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ’’’џ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџЩЩїџяџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџввјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџШџеџкџкџкџкџкџкџкџкџкџвџ‘џEџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џhџЕџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џИИИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџ“““џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џІІІџ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћўџиињџААєџŒŒюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ  ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџPџ)џЁџкџкџкџкџкџкџкџкџкџкџкџЦџ}џBџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ &џ[џ џзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЁЁЁџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМММџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЩЩЩџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћўџккњџГГєџŽŽюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџшшќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџМџ џ џ џ2џ”џйџкџкџкџкџкџкџкџкџкџкџкџзџАџyџAџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џPџ‡џПџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЫЫЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшшшџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџюююџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџуућџККѕџ‘‘юџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџММѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџYџ џ џ џ џ џ.џŽџзџкџкџкџкџкџкџкџкџкџкџкџкџкџжџЛџ™џ{џ[џ<џ "џ џ џ џ џ џ џ џ џ џ џ џ+џKџiџ‰џЈџЩџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊЊЊџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џœœœџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ   џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЈЈЈџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџуућџККѕџ““№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‘‘яџ§§ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџУџ џ џ џ џ џ џ џ џ*џЦџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџбџЩџОџКџСџЬџиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьььџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џрррџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џвввџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџччќџТТіџ˜˜№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџннњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџdџ џ џ џ џ џ џ џ џ>џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЙЙЙџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЏЏЏџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџŽŽŽџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ’’’џєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџццћџППіџ™™ёџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџББѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЫџ џ џ џ џ џ џ џ џ џЁџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџ‘‘‘џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџАААџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џБББџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыыќџХХіџŸŸђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŒŒяџћћўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџmџ џ џ џ џ џ џ џ џ1џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџбббџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џУУУџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џмммџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёё§џЫЫјџЅЅђџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџммњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЯџ џ џ џ џ џ џ џ џ џ–џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄЄЄџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ”””џћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџ–––џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џžžžџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџііўџббјџЋЋѓџŠŠюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЖЖєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџwџ џ џ џ џ џ џ џ џ*џиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьььџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џаааџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУУУџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џвввџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњўџззљџББєџюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ’’яџўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџгџ џ џ џ џ џ џ џ џ џџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФФФџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џœœœџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓѓѓџŽŽŽџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ———џњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџььќџЧЧїџВВєџЎЎѓџДДѕџЖЖєџООіџССіџЧЧїџЧЧїџЧЧїџЧЧїџЧЧїџЧЧїџЧЧїџЦЦїџООѕџЙЙѕџЕЕєџЎЎѓџЇЇђџ™™ёџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџффћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џ џ "џеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џкккџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДДДџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЩЩЩџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїўџББєџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџФФіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџ #џ џ џ џ џ џ џ џ џƒџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыыыџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЇЇЇџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчччџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ’’’џіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕўџ™™№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџІІђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ‹џ џ џ џ џ џ џ џ џ џвџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХХХџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џхххџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅЅЅџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џРРРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈЈђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‹‹юџќќўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџ,џ џ џ џ џ џ џ џ џxџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄЄЄџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џБББџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзззџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџппњџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџуућџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ”џ џ џ џ џ џ џ џ џ џЭџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŒŒŒџюююџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џ˜˜˜џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џФФФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕЕѕџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЧЧїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ4џ џ џ џ џ џ џ џ џoџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеееџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џМММџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШШШџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ”””џћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџААѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџŸџ џ џ џ џ џ џ џ џ џЩџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗЗЗџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џбббџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜˜№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџšš№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ=џ џ џ џ џ џ џ џ џfџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџšššџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џТТТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЙЙЙџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄЄђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџˆˆюџћћўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЭџgџ2џ џ џ џ џ џ џ џСџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђђђџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьььџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џнннџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТТіџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџшшќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЫџ•џMџ џ џ џ[џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзззџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џТТТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎЎџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЉЉЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёё§џˆˆюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџллљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЬџ…џ<џЛџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРРРџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцццџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џыыыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВВѓџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџррћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџСџІџ”џŒџ‚џyџyџ…џџ™џЌџЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉЉЉџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џТТТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊЊЊџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џРРРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыы§џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџѕѕўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЛџ…џSџ2џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ;џ`џ“џЩџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ’’’џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ–––џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌЌѓџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЅЅђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџŸџWџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ.џiџЕџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёёёџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џУУУџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈЈЈџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џпппџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџххћџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‡‡эџуућџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЖџgџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ/џ}џШџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрррџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрррџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЕЕЕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  ёџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЦЦїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџВџPџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ]џТџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЯЯЯџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џУУУџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅЅЅџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџббјџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџККѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЌџ?џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ\џХџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОООџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џдддџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќџџяџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџГГєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЬџdџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џrџеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБББџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џКККџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЂЂЂџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЉЉЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџООіџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЏЏѓџўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџŠџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџ@@@џ___џlllџ{{{џ‡‡‡џƒƒƒџwwwџkkkџWWWџ666џџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ0џ­џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈЈЈџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџээќџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЌЌѓџ§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЯџPџ џ џ џ џ џ џ џ џ џ џ џ џ џџ@@@џ~~~џНННџыыыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џрррџЌЌЌџmmmџ///џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ|џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЎЎЎџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЁЁЁџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џиииџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  ђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЎЎѓџ§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџАџ 'џ џ џ џ џ џ џ џ џ џ џ џ џDDDџžžžџ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ„„„џ,,,џ џ џ џ џ џ џ џ џ џ џ џ џGџЫџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“““џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џфффџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЗЗЗџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЫјџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџААѓџ§§ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ”џ џ џ џ џ џ џ џ џ џ џ џџqqqџнннџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџТТТџPPPџ џ џ џ џ џ џ џ џ џ џ џ $џЛџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЅЅЅџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈЈЈџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ”””џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєє§џˆˆюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџВВѓџўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџƒџ џ џ џ џ џ џ џ џ џ џџyyyџшшшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮЮЮџUUUџ џ џ џ џ џ џ џ џ џ џ џЎџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓѓѓџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џиииџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхххџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џцццџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈЈђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЛЛѕџўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџrџ џ џ џ џ џ џ џ џ џ џPPPџнннџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКККџ...џ џ џ џ џ џ џ џ џ џ џЁџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщщщџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џšššџќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎЎџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џФФФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮЮјџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџТТіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџxџ џ џ џ џ џ џ џ џ џџЏЏЏџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџ‚‚‚џ џ џ џ џ џ џ џ џ џ џЉџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЭЭЭџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыыыџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЂЂЂџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђђ§џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџˆˆюџббјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џ џ џ>>>џпппџџџџџџџџџџџџџюююџ”””џ•••џдддџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТТТџ###џ џ џ џ џ џ џ џ џ џДџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕЕЕџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŒŒŒџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџžžёџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџяџммљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ›џ џ џ џ џ џ џ џ џ џvvvџћћћџџџџџџџџџџџџџљљљџ)))џџџџ)))џЉЉЉџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщщщџDDDџ џ џ џ џ џ џ џ џ џСџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЖЖЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џŽŽŽџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџССіџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ““яџшшќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџМџ џ џ џ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџУУУџџџџџџџSSSџѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ\\\џџџ;;;џџјјјџџџџџџџџџјјјџ[[[џ џ џ џ џ џ џ џ џ5џеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џсссџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМММџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џФФФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџххћџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЂЂђџѕѕўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџдџ3џ џ џ џ џ џ џ џ џЅЅЅџџџџџџџџџџџџџџџџџџџџџџџџџрррџџџџџџџџ999џїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖЖЖџ џџџџџџ(((џЪЪЪџџџџџџџџџќќќџiiiџ џ џ џ џ џ џ џ џgџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŸŸŸџ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєєєџ‘‘‘џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЉЉЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§ўџŒŒюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџДДєџќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџaџ џ џ џ џ џ џ џ џ———џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFFFџџџџџџџџ```џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџПППџџџџџџџџџ џвввџџџџџџџџџўўўџcccџ џ џ џ џ џ џ џ џ˜џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхххџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЪЪЪџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХХХџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІІђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‰‰юџЯЯјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЃџ џ џ џ џ џ џ џ џ‰‰‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ†††џџџџџџџџџЦЦЦџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩЩЩџ џџџџџџџџџџџѕѕѕџџџџџџџџџљљљџKKKџ џ џ џ џ џ џ џ џЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхххџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџ———џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џщщщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТТіџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ””№џффћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџдџ)џ џ џ џ џ џ џ џgggџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ†††џџџџџџџџџGGGџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгггџџџџџџџџџџџџџ”””џџџџџџџџџџџџџѓѓѓџ///џ џ џ џ џ џ џ џ^џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчччџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џБББџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЮЮЮџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџппћџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЉЉѓџііўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџvџ џ џ џ џ џ џ џ333џѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ]]]џџџџ џ;#џџџџџшшшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмммџџџџџџџџџџџџџџNNNџџџџџџџџџџџџџџџџџеееџџ џ џ џ џ џ џ џЌџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џпппџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄЄЄџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЖЖЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљўџ‡‡эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‰‰юџЪЪїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџУџ џ џ џ џ џ џ џџиииџџџџџџџџџаааџYYYџaaaџЪЪЪџџџџџџџџџџџџџџџџџИИИџџџџџ9"џВkџџџџџЃЃЃџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџџџџџџџџџџџџџџџ???џџџџџџџџџџџџџџџџџџџџџžžžџ џ џ џ џ џ џ џ5џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џšššџљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхххџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЃЃЃџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ——№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџšš№џщщќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџcџ џ џ џ џ џ џ џ‘‘‘џџџџџџџџџ№№№џџџџџ;;;џ‡‡‡џЖЖЖџ———џ џџџџџ‡Qџј•џџџџџwwwџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџ'''џџџџџџџџџџџџџџџkkkџџџџџџџџџџџџџџџџџџџџџџџџџPPPџ џ џ џ џ џ џ џžџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЛЛЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГГГџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋЋѓџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЙЙѕџћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџШџ џ џ џ џ џ џ џ333џњњњџџџџџџџџџХХХџџџџџџџџџџџџџ1џљ•џџ™џ'џџџџ[[[џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џ111џџџџџџџџџџџџџџџџгггџџџџџџџџџџџџџџџџџџџџџџџџџмммџџ џ џ џ џ џ џ8џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђђђџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џяяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџООѕџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ––№џррћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџйџкџкџкџкџlџ џ џ џ џ џ џ џУУУџџџџџџџџџџџџџхххџџџџџџџџџџџџџкƒџџ™џџ™џ2џџџџџоооџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕџ<<<џџџџџџџџџџџџџџџџ“““џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€€€џ џ џ џ џ џ џ џЅџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄЄЄџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ™™™џјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУУУџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џлллџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџггљџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЙЙѕџљљўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџвџ џ џ џ џ џ џ џOOOџџџџџџџџџџџџџџџџџџџџџ!!!џџџџџџџџџџџб}џџ™џџ™џџ™џJ,џџџџџ$$$џчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџKKKџџџџџџџџџџџџџџџџƒƒƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђђђџџ џ џ џ џ џ џHџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ­­­џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЙЙЙџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџ˜˜˜џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џШШШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџццћџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ™™№џссћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџ’џ џ џ џ џ џ џ џФФФџџџџџџџџџџџџџџџџџџџџџcccџџџџџџџџџ_9џьŽџџ™џџ™џџ™џџ™џЦwџџџџџџ///џяяяџџџџџџџџџџџџџџџџџџџџџќќќџWWWџџџџџџџџџџџџџџџџrrrџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‚‚‚џ џ џ џ џ џ џ џЧџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИИИџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џнннџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдддџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џДДДџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђђ§џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‹‹юџЦЦїџќќўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџGџ џ џ џ џ џ џFFFџџџџџџџџџџџџџџџџџџџџџџџџџгггџџџџџџoCџЛpџп†џџ™џџ™џџ™џџ™џџ™џџ™џџ™џЎhџџџџџџ;;;џѕѕѕџџџџџџџџџџџџџўўўџeeeџџџџџџџџџџџџџџџџnnnџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџџ џ џ џ џ џ џџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЫЫџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ———џїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІІІџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЁЁЁџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§џџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџЋЋѓџ№№§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџШџ џ џ џ џ џ џ џЋЋЋџџџџџџџџџџџџџџџџџџџџџџџџџџџџџQQQџџџџџџ5 џ‹SџИnџзџј•џџ™џџ™џџ™џџ™џџ™џ^џџџџџџJJJџњњњџџџџџџџџџ˜˜˜џџџџџџџџџџџџџџџџiiiџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhhџ џ џ џ џ џ џ4џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоооџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЖЖЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщщщџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ“““џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ››№џооњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџ‰џ џ џ џ џ џ џџіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџ џџџџџџџџџџˆRџџ™џџ™џџ™џџ™џџ™џ‹SџџџџџџYYYџ§§§џџџџџЬЬЬџџџџџџџџџџџџџџџaaaџ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТТТџ џ џ џ џ џ џ џСџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђђђџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џжжжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНННџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџšš№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџяџЮЮјџ§§ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџSџ џ џ џ џ џ џkkkџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџбббџџџџџџџџџџџ‰Rџџ™џџ™џџ™џџ™џџ™џyIџџџџџџjjjџџџџџџџџџДДДџџџџџџџџџџџџџTTTџћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџ***џ џ џ џ џ џ џџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ’’’џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџ•••џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЂЂёџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŒŒяџРРіџјјўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџ џ џ џ џ џ џ џЙЙЙџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџOOOџџџџџџџџџџ˜[џџ™џџ™џџ™џџ™џў˜џf=џџџџџџ}}}џџџџџџџџџЃЃЃџџџџџџџџџџџPPPџњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџwwwџ џ џ џ џ џ џVџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІІІџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŸŸŸџњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдддџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џрррџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄЄђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‰‰юџЖЖєџєєўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџЙџ џ џ џ џ џ џџѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬџbbbџџџџџџџџџІdџџ™џџ™џџ™џџ™џќ—џV4џџџџџџџџџџџџџџџƒƒƒџџџџџџџџџFFFџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕЕЕџ џ џ џ џ џ џ џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКККџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џИИИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈЈЈџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џгггџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅЅђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŠŠюџЙЙѕџђђ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џBBBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцццџФФФџ111џџџџџџГkџџ™џџ™џџ™џџ™џљ•џF*џџџџџџЁЁЁџџџџџџџџџnnnџџџџџџџBBBџїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёёёџџ џ џ џ џ џ џХџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮЮЮџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џеееџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џХХХџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІІђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŒŒяџККѕџђђ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџlџ џ џ џ џ џ џ}}}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџ)))џџџџџ џПsџџ™џџ™џџ™џџ™џѕ“џ<$џџџџџџЌЌЌџџџџџ§§§џUUUџџџџџ999џѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ;;;џ џ џ џ џ џ џЅџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщщщџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНННџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џИИИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈЈђџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ’’яџХХїџїїўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџMџ џ џ џ џ џ џІІІџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџ џџџџџ џХvџџ™џџ™џџ™џџ™џ№џ0џџџџџџРРРџџџџџїїїџ???џџџ666џёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџbbbџ џ џ џ џ џ џ…џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџ“““џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŸŸŸџњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџ•••џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЎЎЎџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋЋѓџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ  ђџддљџќќўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџ-џ џ џ џ џ џ џЫЫЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџлллџџџџџџ џЯ|џџ™џџ™џџ™џџ™џх‰џ!џџџџџџЬЬЬџџџџџ№№№џ...џ222џяяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆˆˆџ џ џ џ џ џ џfџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏЏЏџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЕЕЕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЇЇЇџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЙЙѕџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‹‹юџДДѕџххћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџ џ џ џ џ џ џ џ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџвввџџџџџџ џи‚џџ™џџ™џџ™џџ™џм„џџџџџџџзззџџџџџћћћџќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎЎџ џ џ џ џ џ џKџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭЭЭџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЧЧЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊЊЊџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ   џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџййљџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџŸŸђџЮЮјџјјўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџзџ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШШШџ џџџџџџс‡џџ™џџ™џџ™џџ™џв~џ џџџџџџрррџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХХХџ џ џ џ џ џ џ@џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыыыџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џжжжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§ўџ——№џ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ——№џРРіџъъќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџЮџ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНННџџџџџџ&џш‹џџ™џџ™џџ™џџ™џЧwџ џџџџџ%%%џшшшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгггџ џ џ џ џ џ џ6џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ”””џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџцццџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШШШџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџттћџ‰‰юџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ––№џММѕџххћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџФџ џ џ џ џ џ џ,,,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБББџџџџџџ/џяџџ™џџ™џџ™џџ™џЛpџџџџџџ///џяяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпппџ џ џ џ џ џ џ*џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВВВџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ———џѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џŸŸŸџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџккњџŒŒюџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ††эџ‡‡эџ  ёџЦЦїџъъќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџЛџ џ џ џ џ џ џ555џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџўўўџџџџџЃЃЃџџџџџџ:#џє’џџ™џџ™џџ™џџ™џ­hџџџџџџAAAџїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџ џ џ џ џ џ џ #џкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЂЂЂџњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцццџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№ќџЖЖѕџŽŽяџ††эџ††эџ††эџ™™ёџИИєџииљџіі§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџУџ џ џ џ џ џ џ---џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ|||џџrrrџџџџџџџџџ•••џџџџџџE)џј•џџ™џџ™џџ™џџ™џ–ZџџџџџџNNNџћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрррџ џ џ џ џ џ џ*џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џБББџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКККџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўџџюю§џшшќџїїўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџЭџ џ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрррџЦЦЦџюююџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ~~~џџџџzzzџџџџџџџџџ„„„џџџџџџR1џќ—џџ™џџ™џџ™џџ™џƒOџџџџџџ]]]џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгггџ џ џ џ џ џ џ5џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВВВџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џПППџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџ–––џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џяяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџзџ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеееџDDDџџџџХХХџџџџџџџџџџџџџџџџџџџџџџџџџ€€€џџџџџџƒƒƒџџџџџџџџџwwwџџџџџџ_9џў˜џџ™џџ™џџ™џџ™џsEџџџџџџmmmџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЦЦЦџ џ џ џ џ џ џ?џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џФФФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзззџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџ џ џ џ џ џ џ џѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџІІІџџџџџџ999џџџџџџџџџџџџџџџџџџџџџƒƒƒџџџџџџџџ‹‹‹џџџџџўўўџgggџџџџџџnBџџ™џџ™џџ™џџ™џў˜џc;џџџџџџ………џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџАААџ џ џ џ џ џ џKџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћћџ‘‘‘џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЫЫЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎЎџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџйџкџкџкџкџ)џ џ џ џ џ џ џЮЮЮџџџџџџџџџџџџџџџџџџџџџšššџџџџџџџџїїїџџџџџџџџџџџџџ………џџџџџџџџџџ“““џџџџџ§§§џYYYџџџџџџ‚Nџџ™џџ™џџ™џџ™џћ—џO/џџџџџџ^^^џfffџ]]]џxxxџЂЂЂџщщщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹‹‹џ џ џ џ џ џ џcџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕЕЕџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џаааџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓѓѓџ’’’џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џыыыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџJџ џ џ џ џ џ џЉЉЉџџџџџџџџџџџџџџџџџГГГџџџџџџџџџœœœџџџџџџџџџ‡‡‡џџџџџџџџџџџџœœœџџџџџњњњџLLLџџџџџџ’Xџџ™џџ™џџ™џџ™џї”џA'џџџџџџџџџџџTTTџгггџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџeeeџ џ џ џ џ џ џƒџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŒŒŒџжжжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџвввџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џщщщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџjџ џ џ џ џ џ џ€€€џџџџџџџџџџџџџфффџџџџџџџџџџџ!!!џWWWџџџџџџџџџџџџџџЃЃЃџџџџџіііџ@@@џџџџџџ `џџ™џџ™џџ™џџ™џё‘џ3џџџџџџџџџџџџ„„„џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ???џ џ џ џ џ џ џЃџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџšššџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŒŒŒџйййџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊЊЊџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џшшшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџŠџ џ џ џ џ џ џGGGџџџџџџџџџџџџџWWWџџџџџџџџџџџџџџџџџџџџџџџџџџџчччџџџџџђђђџ555џџџџџџЎhџџ™џџ™џџ™џџ™џъŒџ(џџџџџџџџџџџџ```џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕџџ џ џ џ џ џ џУџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЫЫџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџпппџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяяяџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџЕџ џ џ џ џ џ џџіііџџџџџмммџџџџџџџџџџџџџџџџџџџџџџџџџџџTTTџ§§§џџџџџџџџџьььџ+++џџџџџџКpџџ™џџ™џџ™џџ™џтˆџ0џџџ!џ"џџџџџџџџyyyџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКККџ џ џ џ џ џ џ џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŽŽŽџиииџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џыыыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџйџ џ џ џ џ џ џ џПППџџџџџ‘‘‘џџџџџџџџџџџџџџџџџџџџџџџџџџIIIџљљљџџџџџџџџџџџџџџџџџхххџ###џџџџџ џХvџџ™џџ™џџ™џџ™џџ™џуˆџћ—џџ™џџ™џї”џЋgџ'џџџџџџЭЭЭџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{{{џ џ џ џ џ џ џSџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКККџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŒŒŒџвввџџџџџџџџџџџџџџџџџџџџџџџџџўўўџІІІџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџPџ џ џ џ џ џ џrrrџџџџџ}}}џџџџџџџџџџџџџџџџџџџџџџџџџ>>>џіііџџџџџџџџџџџџџџџџџџџџџџџџџоооџџџџџџ џв~џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џі”џP0џџџџџ555џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџ///џ џ џ џ џ џ џ‰џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьььџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЫЫЫџџџџџџџџџџџџџџџџџџџџџџџџџэээџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџ„џ џ џ џ џ џ џџјјјџРРРџџџџџџџџџџџџџџџџџџџџџџџџ555џђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеееџџџџџџ,џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џј•џ3џџџџџДДДџџџџџџџџџџџџџџџџџџџџџШШШџ џ џ џ џ џ џ џНџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉЉЉџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џХХХџџџџџџџџџџџџџџџџџџџџџџџџџЧЧЧџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџУџ џ џ џ џ џ џ џБББџџџџџЌЌЌџCCCџ џ'''џџџџџџџџџџџџџџџџџџџ,,,џэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЫЫџџџџџџќ—џџ™џџ™џџ™џџ™џџ™џџ™џџ™џХvџЊfџРsџ№џЪyџџџџџXXXџџџџџџџџџџџџџџџџџџџџџoooџ џ џ џ џ џ џ-џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џПППџџџџџџџџџџџџџџџџџџџџџ§§§џЁЁЁџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџ@џ џ џ џ џ џ џNNNџџџџџџџџџџџџџџџџџўўўџKKKџџџџџџџџџџџџџџџџџ###џчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBBBџџџџ*џџ™џџ™џџ™џџ™џџ™џџ™џЧwџ<$џџџџџS2џ!џџџџ џѕѕѕџџџџџџџџџџџџџђђђџџ џ џ џ џ џ џzџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІІІџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЗЗЗџќќќџџџџџџџџџџџџџџџџџшшшџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џЭЭЭџџџџџџџџџџџџџџџџџбббџџџџџџџџџџџџџџџџџЎЎЎџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџa:џџ™џџ™џџ™џџ™џї”џpCџџџџџџџџџџџџџЮЮЮџџџџџџџџџџџџџ‹‹‹џ џ џ џ џ џ џ џУџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтттџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЇЇЇџѕѕѕџџџџџџџџџџџџџџџџџСССџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŽŽŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџаџ џ џ џ џ џ џ џYYYџџџџџџџџџџџџџџџџџџџџџZZZџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџwGџџ™џџ™џџ™џѕ“џD)џџџџџџџџџџџџџџЇЇЇџџџџџџџџџѕѕѕџџ џ џ џ џ џ џAџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊЊЊџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ———џшшшџџџџџџџџџџџџџќќќџžžžџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ•••џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџeџ џ џ џ џ џ џ џЮЮЮџџџџџџџџџџџџџџџџџщщщџџџџџџџџџџџџџџџџDDDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџxHџџ™џџ™џџ™џS2џџџџџџџџџџџџџџџџџџџџџџџџŒŒŒџ џ џ џ џ џ џ џџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцццџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џкккџџџџџџџџџџџџџфффџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŸŸŸџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџУџ џ џ џ џ џ џ џ<<<џ§§§џџџџџџџџџџџџџџџџџЌЌЌџџџџџџџџџџџџџџџџмммџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ)))џџџџU3џџ™џџ™џЊfџџџџџџ333џИИИџЋЋЋџ<<<џџџџџџџџџџџџуууџџ џ џ џ џ џ џ0џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎЎџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џРРРџўўўџџџџџџџџџМММџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЇЇЇџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ[џ џ џ џ џ џ џ џœœœџџџџџџџџџџџџџџџџџџџџџlllџџџџџџџџџџџџџџџ```џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџOOOџџџџ џї”џџ™џB(џџџџџtttџћћћџџџџџџџџџўўўџ‘‘‘џџџџџџЏЏЏџџџџџXXXџ џ џ џ џ џ џ џ•џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыыыџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џВВВџњњњџџџџџљљљџ™™™џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џАААџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџНџ џ џ џ џ џ џ џџрррџџџџџџџџџџџџџџџџџњњњџ<<<џџџџџџџџџџџџџџџРРРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“““џџџџџ”Yџџ™џ!џџџџFFFџџџџџџџџџџџџџџџџџџџџџџџџџФФФџџџџџэээџЋЋЋџ џ џ џ џ џ џ џ.џиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМММџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŸŸŸџыыыџџџџџпппџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џКККџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџlџ џ џ џ џ џ џ џ===џљљљџџџџџџџџџџџџџџџџџэээџ)))џџџџџџџџџџџџџџџэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџџџџџ џв~џџџџџ~~~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџnnnџcccџаааџмммџџ џ џ џ џ џ џ џЅџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџ–––џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџЬЬЬџџџџџИИИџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џТТТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџбџ #џ џ џ џ џ џ џ џvvvџџџџџџџџџџџџџџџџџџџџџфффџ%%%џџџџџџџџџџџџџџ@@@џњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhhџџџџџ џџџџџrrrџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџ999џ џ џ џ џ џ џ џTџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЎЎЎџюююџ–––џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЬЬЬџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ™џ џ џ џ џ џ џ џ џ”””џџџџџџџџџџџџџџџџџџџџџщщщџ222џџџџџџџџџџџџџџQQQџљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёёёџџџџџџџџџџ+++џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џ\\\џ џ џ џ џ џ џ џ џХџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌЌЌџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ•••џМММџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џкккџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџUџ џ џ џ џ џ џ џ џЌЌЌџџџџџџџџџџџџџџџџџџџџџѕѕѕџ\\\џџџџџџџџџџџџџџHHHџёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџСССџ џџџџџџџџџКККџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџlllџ џ џ џ џ џ џ џ џŽџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџŽŽŽџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŒŒŒџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џшшшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџаџ)џ џ џ џ џ џ џ џџГГГџџџџџџџџџџџџџџџџџџџџџџџџџІІІџџџџџџџџџџџџџџ&&&џдддџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧЧЧџџџџџџџџџ<<<џџџџџџџџџџџџџџџџџџџџџџџџџўўўџxxxџ џ џ џ џ џ џ џ џZџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФФФџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЖџ џ џ џ џ џ џ џ џ џžžžџџџџџџџџџџџџџџџџџџџџџџџџџђђђџŠŠŠџџџџџџџџџџџџџџ„„„џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйййџEEEџџџџџџџџўўўџџџџџџџџџџџџџџџџџќќќџjjjџ џ џ џ џ џ џ џ џ-џбџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџЁЁЁџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џ џ џ‰‰‰џўўўџџџџџџџџџџџџџџџџџџџџџџџџџїїїџžžžџTTTџџџџџџџџџџџџЫЫЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕЕЕџ666џџџџџCCCџџџџџџџџџџџџџџџџџёёёџQQQџ џ џ џ џ џ џ џ џ џЛџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џžžžџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ‚џ џ џ џ џ џ џ џ џ џKKKџщщщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџЫЫЫџЊЊЊџџwwwџwwwџwwwџwwwџџЂЂЂџСССџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџсссџџRRRџkkkџъъъџџџџџџџџџџџџџЯЯЯџ---џ џ џ џ џ џ џ џ џ џЊџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџбббџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЌЌЌџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџjџ џ џ џ џ џ џ џ џ џ&&&џСССџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџ“““џџ џ џ џ џ џ џ џ џ џŸџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџАААџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џМММџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџdџ џ џ џ џ џ џ џ џ џ џbbbџшшшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЫЫџ;;;џ џ џ џ џ џ џ џ џ џ џ–џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџ˜˜˜џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЯЯЯџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџvџ џ џ џ џ џ џ џ џ џ џџŒŒŒџђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџgggџ џ џ џ џ џ џ џ џ џ џ џЅџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтттџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џтттџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџˆџ џ џ џ џ џ џ џ џ џ џ џџџъъъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгггџ```џ џ џ џ џ џ џ џ џ џ џ џ џБџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШШШџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџІџ џ џ џ џ џ џ џ џ џ џ џ џ џKKKџЅЅЅџѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяяяџџCCCџ џ џ џ џ џ џ џ џ џ џ џ џ6џПџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДДДџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ”””џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЧџAџ џ џ џ џ џ џ џ џ џ џ џ џ џџQQQџџЭЭЭџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џНННџ~~~џ@@@џџ џ џ џ џ џ џ џ џ џ џ џ џ џkџзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћћџЄЄЄџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЇЇЇџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџ{џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ,,,џPPPџoooџ|||џ‹‹‹џ•••џ‘‘‘џ†††џzzzџgggџGGGџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ %џ џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓѓѓџ———џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЛЛЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџФџVџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џdџаџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщщщџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џвввџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџžџ1џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џNџЛџкџкџкџкџкџкџ™џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џыыыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЃџ:џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џPџИџкџкџкџкџкџкџЬџLџ џџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭЭЭџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЈџXџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ #џnџОџкџкџкџкџкџкџкџœџ !џ џ џ џФџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧЧЧџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЇЇЇџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџбџџIџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ !џ[џІџиџкџкџкџкџкџкџкџЛџBџ џ џ џ џ џIџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџСССџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џПППџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџЌџxџEџ %џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ-џRџ†џЛџкџкџкџкџкџкџкџкџкџШџ`џ џ џ џ џ џ џ џ џ“џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМММџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џиииџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџгџЕџ™џˆџ~џvџkџkџyџ‚џ‹џŸџНџзџкџкџкџкџкџкџкџкџкџкџкџкџкџРџ џ џ џ џ џ џ џ џ џ џШџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖЖЖџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џ џ џSџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџЕЕЕџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џœœœџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџ=џ џ џ џ џ џ џ џ џ џ™џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОООџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џКККџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЛџ џ џ џ џ џ џ џ џ џ џЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧЧЧџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џзззџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ{џ џ џ џ џ џ џ џ џ џ[џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаааџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџ:џ џ џ џ џ џ џ џ џ џ џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиииџŽŽŽџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ   џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЙџ џ џ џ џ џ џ џ џ џ #џаџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрррџ’’’џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џПППџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџsџ џ џ џ џ џ џ џ џ џbџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюююџŸŸŸџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џуууџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџ3џ џ џ џ џ џ џ џ џ џЇџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџАААџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ“““џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџГџ џ џ џ џ џ џ џ џ џ %џбџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧЧЧџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЕЕЕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџlџ џ џ џ џ џ џ џ џ џhџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмммџ‘‘‘џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џиииџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџдџ-џ џ џ џ џ џ џ џ џ џЊџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџЃЃЃџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŽŽŽџљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ­џ џ џ џ џ џ џ џ џ џ*џгџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џТТТџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЎЎЎџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџfџ џ џ џ џ џ џ џ џ џpџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџšššџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џиииџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџбџ (џ џ џ џ џ џ џ џ џ џБџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџЙЙЙџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‘‘‘џћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџІџ џ џ џ џ џ џ џ џ џ0џжџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиииџ”””џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џИИИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ^џ џ џ џ џ џ џ џ џ џwџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџЙЙЙџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џтттџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЯџ #џ џ џ џ џ џ џ џ џ џЗџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцццџЁЁЁџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ™™™џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЃџ џ џ џ џ џ џ џ џ џ7џзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџдддџ“““џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џШШШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџWџ џ џ џ џ џ џ џ џ џ}џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєєєџДДДџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЮџ џ џ џ џ џ џ џ џ џ џПџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшшшџЋЋЋџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЖЖЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ›џ џ џ џ џ џ џ џ #џƒџеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуууџІІІџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џцццџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџQџ џ џ џ џ џeџаџкџкџкџкџкџкџкџкџкџкџкџЪџЊџŸџ”џŠџ”џЁџ­џЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџЁЁЁџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЄЄЄџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЪџ џ џ џ>џЛџкџкџкџкџкџкџкџкџзџЉџrџ>џ џ џ џ џ џ џ џ џ џ џ џBџwџ­џиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзззџЁЁЁџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џлллџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ‘џ џeџжџкџкџкџкџкџкџкџАџdџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џiџЗџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффџБББџŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ   џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџГџкџкџкџкџкџкџкџЄџ?џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џGџЋџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяяяџРРРџ’’’џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џйййџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџКџ?џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џJџРџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџЩЩЩџ™™™џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŸŸŸџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџoџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ{џиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџсссџЗЗЗџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џйййџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџТџ:џ џ џ џ џ џ џ џ џ џ џ џ џ џ+++џHHHџUUUџ\\\џTTTџGGGџ)))џ џ џ џ џ џ џ џ џ џ џ џ џ џDџЩџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћћџиииџ­­­џџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЇЇЇџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЌџ џ џ џ џ џ џ џ џ џ џ џFFFџŒŒŒџЪЪЪџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџХХХџ‡‡‡џ???џ џ џ џ џ џ џ џ џ џ џ !џЖџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђђђџЩЩЩџЃЃЃџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŒŒŒџъъъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџŸџ џ џ џ џ џ џ џ џ џџ‚‚‚џсссџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџyyyџџ џ џ џ џ џ џ џ џ џЉџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕџдддџБББџ‘‘‘џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џЙЙЙџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЁџ џ џ џ џ џ џ џ џџ†††џѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээџzzzџџ џ џ џ џ џ џ џ џЌџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџпппџНННџšššџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ“““џѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЏџ џ џ џ џ џ џ џ џJJJџпппџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзззџ???џ џ џ џ џ џ џ џ џКџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џжжжџНННџЂЂЂџџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џŽŽŽџпппџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЦџ џ џ џ џ џ џ џ џ‡‡‡џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџxxxџ џ џ џ џ џ џ џ (џЯџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџтттџЧЧЧџ­­­џ•••џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ———џсссџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџBџ џ џ џ џ џ џџЊЊЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃЃЃџџ џ џ џ џ џ џPџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџхххџвввџРРРџЎЎЎџ›››џŒŒŒџ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџІІІџЫЫЫџљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ|џ џ џ џ џ џ џџКККџџџџџџџџџЙЙЙџ###џџџџџџџџџџџџџџџџџџџџџџџ џ+++џХХХџџџџџџџџџЊЊЊџ џ џ џ џ џ џ џџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџьььџоооџдддџЩЩЩџОООџДДДџЈЈЈџžžžџ“““џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џ‹‹‹џџ’’’џ———џЄЄЄџЎЎЎџМММџЧЧЧџдддџпппџьььџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџТџ џ џ џ џ џ џ џЉЉЉџџџџџџџџџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџџџџџџџџџ———џ џ џ џ џ џ џ џЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџїїїџѕѕѕџяяяџяяяџъъъџшшшџхххџтттџшшшџьььџяяяџѕѕѕџїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџPџ џ џ џ џ џ џ|||џџџџџџџџџџџџџчччџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџџџџџџџџџџџџџhhhџ џ џ џ џ џ џaџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЖџ џ џ џ џ џ џ@@@џћћћџџџџџџџџџџџџџџџџџDDDџџџџџџџџџџџџџџџџџџџџџџџџџџVVVџџџџџџџџџџџџџџџџџѕѕѕџ111џ џ џ џ џ џ џТџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџRџ џ џ џ џ џџвввџџџџџџџџџџџџџџџџџџџџџѕѕѕџ‘‘‘џwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџwwwџ———џјјјџџџџџџџџџџџџџџџџџџџџџФФФџ џ џ џ џ џ џcџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџХџ џ џ џ џ џ џsssџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ___џ џ џ џ џ џ џаџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ{џ џ џ џ џ џџхххџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуууџ\\\џ|||џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиииџ џ џ џ џ џ џŒџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ/џ џ џ џ џ џjjjџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџ///џ џ џsssџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџWWWџ џ џ џ џ џ?џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџФџ џ џ џ џ џ џЧЧЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёёёџ:::џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГГГџ џ џ џ џ џ џаџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџŽџ џ џ џ џ џ***џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџFFFџ џ џ џ џ џ џЊЊЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџџ џ џ џ џ џžџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџZџ џ џ џ џ џlllџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџSSSџ џ џ џ џ џ џ џџПППџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXXXџ џ џ џ џ џjџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ8џ џ џ џ џ џЊЊЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџfffџ џ џ џ џ џ џ џ џ џџгггџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–––џ џ џ џ џ џHџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ џ џ џ џ џ џзззџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџvvvџ џ џ џ џ џ џ џ џ џ џ џ$$$џуууџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТТТџ џ џ џ џ џ )џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЭџ џ џ џ џ џ џјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€€€џ џ џ џ џ џ џ џ џ џ џ џ џ џ444џ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшшшџ џ џ џ џ џ џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџСџ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–––џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џHHHџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџ џ џ џ џ џ џбџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЗџ џ џ џ џ џ+++џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІІІџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ```џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џ џ џ џЧџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџГџ џ џ џ џ џ000џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГГГџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џ џ џ џСџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЛџ џ џ џ џ џ%%%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџПППџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЁЁЁџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џ џ џ џЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЦџ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ222џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ888џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџ џ џ џ џ џ џжџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџдџ џ џ џ џ џ џыыыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhhџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџџ&&&џЂЂЂџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйййџ џ џ џ џ џ џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ &џ џ џ џ џ џХХХџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцццџоооџоо˜˜џ џ џ џ џ џ џ џ џ џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГГГџ џ џ џ џ џ6џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџEџ џ џ џ џ џ‘‘‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏЏЏџ џ џ џ џ џ џ џ џ џ џ џ џ џ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ|||џ џ џ џ џ џVџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџnџ џ џ џ џ џRRRџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВВВџ џ џ џ џ џ џ џ џ џ џ џ џ џћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ===џ џ џ џ џ џ~џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЄџ џ џ џ џ џџёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДДДџ џ џ џ џ џ џ џ џ џ џ џ џ џљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхххџ џ џ џ џ џ џЖџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџгџ џ џ џ џ џ џЁЁЁџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖЖЖџ џ џ џ џ џ џ џ џ џ џ џ џ џїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽŽŽџ џ џ џ џ џ џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџPџ џ џ џ џ џ<<<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИИИџ џ џ џ џ џ џ џ џ џ џ џ џ џѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћћџ,,,џ џ џ џ џ џ`џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџšџ џ џ џ џ џ џМММџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКККџ џ џ џ џ џ џ џ џ џ џ џ џ џѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЇЇЇџ џ џ џ џ џ џЌџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџ џ џ џ џ џ џ:::џќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМММџ џ џ џ џ џ џ џ џ џ џ џ џ џђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџ,,,џ џ џ џ џ џ,џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ}џ џ џ џ џ џ џ˜˜˜џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџПППџ џ џ џ џ џ џ џ џ џ џ џ џ џяяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„„„џ џ џ џ џ џ џŽџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџаџ џ џ џ џ џ џџкккџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџСССџ џ џ џ џ џ џ џ џ џ џ џ џ џэээџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЫЫџџ џ џ џ џ џ %џзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџƒџ џ џ џ џ џ џ666џєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУУУџ џ џ џ џ џ џ џ џ џ џ џ џ џъъъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюююџ***џ џ џ џ џ џ џ“џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџ6џ џ џ џ џ џ џKKKџљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФФФџ џ џ џ џ џ џ џ џ џ џ џ џ џщщщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџDDDџ џ џ џ џ џ џBџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџБџ џ џ џ џ џ џ џ[[[џљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџ џ џ џ џ џ џ џ џ џ џ џ џџіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєєєџMMMџ џ џ џ џ џ џ џНџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џKKKџђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋЋЋџ|||џ|||џ|||џ|||џ|||џ|||џ|||џŒŒŒџџџџаааџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыыыџ???џ џ џ џ џ џ џ џ’џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџQџ џ џ џ џ џ џ џ---џЯЯЯџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУУУџ$$$џ џ џ џ џ џ џ џaџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџдџ?џ џ џ џ џ џ џ џџџѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёёёџtttџ џ џ џ џ џ џ џ џLџзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЯџ7џ џ џ џ џ џ џ џ џ'''џšššџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєєєџ‘‘‘џ џ џ џ џ џ џ џ џ џAџгџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџаџCџ џ џ џ џ џ џ џ џ џ!!!џyyyџвввџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџЫЫЫџsssџџ џ џ џ џ џ џ џ џ џPџдџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџеџ[џ џ џ џ џ џ џ џ џ џ џ џ###џbbbџ‘‘‘џЗЗЗџвввџоооџъъъџоооџаааџГГГџŽŽŽџ]]]џџ џ џ џ џ џ џ џ џ џ џ џgџиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ•џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџНџFџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џQџХџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ˜џ-џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ4џЃџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџ™џ:џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ@џ џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџМџqџ0џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ5џwџСџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЪџ—џrџRџ7џ 'џ џ џ џ (џ9џUџuџšџЭџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџooъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџicedtea-web-1.8/win-installer/PaxHeaders.7406/top_banner.bmp0000644000000000000000000000013213441742745020642 xustar0030 mtime=1552401893.169832552 30 atime=1552402157.289253364 30 ctime=1552410887.101183471 icedtea-web-1.8/win-installer/top_banner.bmp0000644000175000002070000033737613441742745021475 0ustar00jvanekmock00000000000000BMўО6(э: ШОз з џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџџФlџџФkџџУjџџУiџџУhџџТgџџТfџџТeџџСeџџСdџџСcџџРbџџРaџџП`џџП_џџП^џџО]џџО]џџО\џџН[џџНZџџНYџџМXџџМWџџМVџџЛUџџЛTџџКTџџКSџџКRџџЙQџџЙPџџЙOџџИNџџИMџџИLџџЗLџџЗKџџЖJџџЖIџ§ЕGџяЊCџыЇAџџЕEџџДDџіЎAџяЉ@џљЏ@џџГAџџГ@џџВ?џџВ>џџБ=џџБ<џџБ;џџА;џџА:џџА9џџЏ8џџЏ7џџЏ6џџЎ5џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџџФlџџФkџџУjџџУiџџУhџџТgџџТfџџТeџџСeџџСdџџСcџџРbџџРaџџП`џџП_џџП^џџО]џџО]џџО\џџН[џџНZџџНYџџМXџџМWџџМVџџЛUџџЛTџџКTџџКSџџКRџџЙQџџЙPџџЙOџџИNџџИMџкžBџ›p1џhL#џB1џџ џ џ\CџџЕEџџДDџ|Y$џ џ џ џџ8*џ^Dџ…^$џМƒ/џѕЊ9џџА;џџА:џџА9џџЏ8џџЏ7џџЏ6џџЎ5џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџџФlџџФkџџУjџџУiџ§СiџЧ—€џ{^ЂџQ>Еџ.#Хџ еџкџкџкџкџЭџ@0ЛџeKЉџ‰f—џМŒ}џіЖ`џџНZџџНYџџМXџџМWџџМVџџЛUџџЛTџџКTџџКSџџКRџџЙQџџЙPџжœDџ{Z)џ'џ џ џ џ џ џ џ џ\CџџЕEџџДDџgJџ џ џ џ џ џ џ џ џ џI5џЂq(џђЇ7џџЏ8џџЏ7џџЏ6џџЎ5џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџџФlџџФkџоЊxџjQЋџЯџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџB1Йџ…c–џЪ•sџџМWџџМVџџЛUџџЛTџџКTџџКSџџКRџКˆ=џD4џ џ џ џ џ џ џ џ џ џ џ[CџџЕEџџДDџ<-џ џ џ џ џ џ џ џ џ џ џ џ џoNџрš1џџЏ6џџЎ5џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџс­yџbKЏџиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџŒg’џџМVџџЛUџџЛTџџКTџЪ”Cџ>/џ џ џ џ џ џ џ џ џ џ џ џ џZBџџЕEџџДDџ_Eџ џ џ џ џ џ џ џ џ џ џ џ џ џ џkKџьЁ2џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџЅ”џ гџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџH5ЕџџМVџџЛUџђВPџlP(џ џ џ џ џ џ џ џ џ џ џ џ џ џ џYAџџЕEџџДDџwU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џŸn$џў­3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџљРpџ_IВџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ дџК‰zџџМVџа™Gџ-#џ џ џ џ џ џ џ џ џ џEEEџŽŽŽџУУУџыыыџКККџ џYAџџЕEџџДDџwU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џY?џ№Ѓ0џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџїРsџK:Кџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ3&Рџй kџџМWџЇ|;џ џ џ џ џ џ џ џ џ)))џœœœџэээџьььџ§§§џџџџџџџџџвввџ џX@џџЕEџџДDџwU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ+ џи“,џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџњТrџD5ОџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџV@ЎџіЖ^џџМXџ•o5џ џ џ џ џ џ џ џџžžžџёёёџћћћџџџџџџџџџџџџџџџџџџџџџдддџ џX@џџЕEџџДDџwU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЩˆ(џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџhQЏџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџeKЈџўМ[џџНYџŽj4џ џ џ џ џ џ џ џaaaџёёёџљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеееџ џW@џџЕEџџДDџwU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џШˆ'џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџ™w›џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџYBЎџ§М\џџНZџЈ~=џ џ џ џ џ џ џџžžžџђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжжжџ џV?џџЕEџџДDџwU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џи’)џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџнЌ€џ жџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ3&СџїИ`џџН[џЦ“Gџ џ џ џ џ џ џ џЖЖЖџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиииџ џU>џџЕEџџДDџwU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ*џ№Ё,џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџўЦtџB4РџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџгsџџО\џяБVџ)!џ џ џ џ џ џ џ џ777џ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйййџ џU>џџЕEџџДDџwU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џS:џўЊ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџЇ‚–џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ‚ašџџО]џџО\џ]G&џ џ џ џ џ џ џ џ џ џ888џ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџ џT>џџЕEџџДDџxV#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џžkџџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџљТvџ#ЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЮџјЙ`џџО]џНŽFџ џ џ џ џ џџ‰‰‰џџ џ џ џ:::џ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмммџ џS=џџЕEџџДDџxV#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џыž)џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџ•tŸџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ„cšџџО]џњК[џ/%џ џ џ џ џ џЈЈЈџљљљџЯЯЯџџ џ џ џAAAџёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ џR<џџЕEџџДDџxV#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џkJџџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџќЦwџ"ЬџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџаџюВgџџО]џЄ{>џ џ џ џ џ џ\\\џђђђџџџџџјјјџвввџџ џ џ џBBBџђђђџџџџџџџџџџџџџџџџџџџџџџџџџпппџ џR<џџЕEџџДDџxV#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џр–'џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџЊ…—џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ9+ОџлЄqџџП^џ§Н\џ3(џ џ џ џ џџэээџџџџџџџџџџџџџјјјџзззџџ џ џ џDDDџёёёџџџџџџџџџџџџџџџџџџџџџрррџ џQ<џџЕEџџДDџxV#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џoLџџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџA3РџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџŒi—џ§НaџџП_џџП^џМFџ џ џ џ џ џ‚‚‚џєєєџџџџџџџџџџџџџџџџџњњњџмммџџ џ џ џEEEџђђђџџџџџџџџџџџџџџџџџсссџ џQ<џџЕEџџДDџwU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џђЂ)џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџпЏ‚џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ@0Мџе vџџРaџџП`џџП_џџП^џbK(џ џ џ џ џџёёёџџџџџџџџџџџџџџџџџџџџџџџџџљљљџнннџџ џ џ џMMMџѓѓѓџџџџџџџџџџџџџтттџ џP;џџЕEџџДDџM9џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЂmџџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџeЈџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЮџІ~џўРdџџРbџџРaџџП`џџП_џѕИZџџ џ џ џ џ[[[џёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћћџуууџ###џ џ џ џNNNџѓѓѓџџџџџџџџџфффџ џO:џџЕEџџДDџ=-џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ===џ‘‘‘џцццџ џ џ џK4џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџўЧwџ#Ьџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџаџ‹jšџѕЙjџџСdџеЁwџxZЁџ’n•џ§НaџџП_џНŽHџ џ џ џ џ џНННџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћћћџфффџ%%%џ џ џ џPPPџђђђџџџџџхххџ џN9џџЕEџџДDџS=џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ:::џŽŽŽџчччџњњњџїїїџџџџџuuuџ џ џ џѕЃ(џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџС—Žџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ)Шџ“p—џєКkџјНhџІ~Žџ>/НџкџкџкџЃzŒџџП_џ~`2џ џ џ џ џџєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќџцццџ'''џ џ џ џYYYџіііџчччџ џN9џџЕEџџДDџЄu.џK7џ>.џџ џ џ џ џ џ џ џ џ џ џ џ џ333џ†††џтттџќќќџјјјџџџџџџџџџџџџџџџџџГГГџ џ џ џН"џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџjSАџкџкџкџкџкџкџкџкџкџкџкџкџаџjQЋџС”„џўТiџЭœ~џsWІџаџкџкџкџкџкџ•p“џџП_џG7џ џ џ џ џ???џюююџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џъъъџ,,,џ џ џ џ]]]џЯЯЯџ џM9џџЕEџџДDџџДCџџДCџџГBџџГAџв”6џ6)џ џ џ џ џ џ џ џ333џ†††џтттџќќќџјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓѓѓџџ џ џ„ZџџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџ§ЧxџбџкџкџкџкџкџкџкџкџкџгџfNЏџН‘ˆџѓЛpџМ‡џsXЇџ'ЩџкџкџкџкџкџкџкџкџЮšxџџП_џ џ џ џ џ џoooџїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џъъъџ...џ џ џ џ џ џL8џџЕEџџДDџюЈ?џо;џђЊ?џџГAџџГ@џџВ?џ‚\#џ џ џ џџ‚‚‚џпппџќќќџїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ333џ џ џ_BџџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџТ™џкџкџкџкџкџкџкџкџйџ:-СџrXЊџ_IВџ1&Хџиџкџкџкџкџкџкџкџкџкџкџ гџќНbџёЕZџ џ џ џ џ џЌЌЌџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўџюююџ444џ џ џ џ џL8џџЕEџџДDџ|Y$џ џ џ2%џЏ|.џџВ?џџВ>џgJџ џ џ џЈЈЈџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњџѕѕѕџіііџ§§§џџџџџ№№№џMMMџ џ џ8(џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџoWЏџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ>/НџџП`џзЂQџ џ џ џ џ џТТТџљљљџїїїџєєєџюююџєєєџіііџіііџіііџіііџіііџіііџіііџіііџіііџіііџіііџЛЛЛџ џ џ џ џK7џџЕEџџДDџ|Y$џ џ џ џ џ“h'џџВ>џѓЉ;џ џ џ џ^^^џљљљџіііџјјјџџџџџ§§§џэээџбббџАААџŠŠŠџlllџNNNџ000џџ џ џ џ џ џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџ'ЫџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџT?ВџџП`џЪ˜Mџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џJ7џџЕEџџДDџbGџ џ џ џ џ џшЂ9џџБ=џ[Aџ џ џџ„„„џeeeџGGGџ***џџ џ џ џ џ џ џ џ џ џ џ џ џ џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџK;НџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџeLЊџџП`џПIџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џI6џџЕEџџДDџgJџ џ џ џ џ џЏ{-џџБ=џ“g&џ џ џ џuuuџWWWџ999џџ џ џ џ џ џ џ џ џ џ џ џ џ џ џљЅ(џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџюМ~џџџБ=џ џ џ џCCCџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxxxџ џ џ!џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџК‘џЮџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџА„†џіИ\џ џ џ џ џ џŸŸŸџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљџйййџџ џ џ џ џL8џџЕEџџДDџ|Y$џ џ џ џU>џэІ;џџВ>џ{W!џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџTTTџ џ џ@.џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџёМyџlTЎџзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџˆf™џџП_џ'џ џ џ џ џeeeџєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјџвввџџ џ џ џ'''џ џM9џџЕEџџДDџТŠ4џe)џ›n+џЮ‘6џџГ@џџВ?џЖ€/џ џ џ џџщщщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ///џ џ џeEџџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџхВ{џsYЋџ еџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ%ШџоІpџџП_џP>"џ џ џ џ џ555џюююџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїїїџаааџџ џ џ џ”””џпппџ џN9џџЕEџџДDџџДCџџДCџџГBџџГAџџГ@џc&џ џ џ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьььџ џ џ џŽ`џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџёЛuџЉƒ“џ^IГџбџкџкџкџкџкџкџкџкџйџ* ЦџvYЃџФ”}џ§ОbџџП`џџП_џ‹i6џ џ џ џ џ џёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџЧЧЧџџ џ џ џŽŽŽџѕѕѕџцццџ џO:џџЕEџџДDџд–9џ­{0џЄt-џ[%џ!џ џ џ џ џ џŠŠŠџѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎЎЎџ џ џ џЪ‡#џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџ§ХoџѕПnџџХnџўУnџуЎxџР”‡џžy•џˆhžџ—s—џ™t•џІ~ŽџЮ|џїЛiџџСdџџСcџџРbџџРaџџП`џџП_џЩ—Kџ џ џ џ џ џЉЉЉџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџХХХџџ џ џ џ‹‹‹џѓѓѓџџџџџхххџ џP;џџЕEџџДDџ|Y$џ џ џ џ џ џ џ џ џ џ џyyyџіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџfffџ џ џ џћЇ)џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџіСpџŠ‚uџuuuџ‚}tџŸrџМpџвЊoџпБlџщЗkџтВjџеЊkџЛœnџ pџЏ•nџњОdџџСcџџРbџтАeџн­eџџП_џћМ]џџ џ џ џ џIIIџяяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііџНННџџ џ џ џџђђђџџџџџџџџџуууџ џP;џџЕEџџДDџgKџ џ џ џ џ џ џ џ џ џ џ џZZZџєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕџџ џ џ\@џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџжЎqџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџХЁkџџСcџХЁjџvvuџuuuџУŸhџџП^џuY.џ џ џ џ џ џшшшџџџџџџџџџџџџџџџџџџџџџџџџџєєєџЗЗЗџџ џ џ џ|||џѓѓѓџџџџџџџџџџџџџтттџ џQ<џџЕEџџДDџ>.џ џ џ џ џ џ џ џ џ џ џ џ џHHHџѓѓѓџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЁЁЁџ џ џ џЕz џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџпГqџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџвЈjџдЉiџwvuџuuuџuuuџ‡~rџўО^џЯ›Mџ џ џ џ џ џdddџёёёџџџџџџџџџџџџџџџџџєєєџЖЖЖџџ џ џ џzzzџѓѓѓџџџџџџџџџџџџџџџџџсссџ џR<џџЕEџџДDџvU#џ џ џ џ џ џ џ џ џ џ џ џ џ џ444џьььџќќќџџџџџџџџџџџџџџџџџџџџџџџџџ§§§џ000џ џ џ џњЇ)џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџюМpџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџЌ“oџсБhџzxtџuuuџuuuџuuuџuuuџн­cџџО]џG7џ џ џ џ џ џпппџџџџџџџџџџџџџѓѓѓџЊЊЊџ џ џ џ џpppџѓѓѓџџџџџџџџџџџџџџџџџџџџџпппџ џS=џџЕEџџДDџzX$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ)))џуууџљљљџџџџџџџџџџџџџџџџџџџџџЅЅЅџ џ џ џˆ\џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџќФpџvvuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџŸŒpџнЎhџ~ztџuuuџuuuџuuuџuuuџuuuџЊ‘lџџО]џМFџ џ џ џ џ џ:::џђђђџџџџџѓѓѓџЈЈЈџ џ џ џ џnnnџђђђџџџџџџџџџџџџџџџџџџџџџџџџџоооџ џT>џџЕEџџДDџzX$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџвввџїїїџџџџџџџџџџџџџѕѕѕџ&&&џ џ џ џя )џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџ‡€tџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџ“†qџдЊjџ{xtџuuuџuuuџuuuџuuuџuuuџuuuџzxtџєИ_џџО]џF6џ џ џ џ џ џ}}}џћћћџџ џ џ џ џlllџѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннџ џT>џџЕEџџДDџ{X$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџРРРџєєєџџџџџџџџџtttџ џ џ џˆ]џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџŸŽtџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџ…~sџЖ™nџxwtџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџЙ™iџџО]џж Nџ џ џ џ џ џ џRRRџ џ џ џ џiiiџѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџлллџ џV?џџЕEџџДDџzX$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЃЃЃџѓѓѓџРРРџ џ џ џ-!џїІ+џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџЖ›rџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџ~ztџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџ|ytџ№Ж`џџО\џ|]/џ џ џ џ џ џ џ џ џ џ___џёёёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкккџ џV?џџЕEџџДDџ{X$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ{{{џџ џ џ џР‚$џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџаЊqџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџž‹nџўО\џњЙYџA2џ џ џ џ џ џ џ џ```џђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйййџ џW@џџЕEџџДDџ{X$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џWџџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџэЛpџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџЕ—jџџН[џпІOџџ џ џ џ џ џ џ———џѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиииџ џX@џџЕEџџДDџ{X$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џF2џћЈ-џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџ|tџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџvuuџ№Е^џџНZџЪ–Hџџ џ џ џ џ џ џiiiџ№№№џўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзззџ џYAџџЕEџџДDџ{X$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ3%џяЂ-џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџžsџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџ}ysџїЙ]џџНZџџНYџИˆAџ џ џ џ џ џ џ џ444џоооџђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеееџ џZBџџЕEџџДDџ|Y$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ+ џфš,џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџЛqџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџ„qџцБaџџН[џџНZџџНYџџМXџСDџџ џ џ џ џ џ џ џcccџшшшџђђђџџџџџџџџџџџџџџџџџџџџџгггџ џ[CџџЕEџџДDџ{X$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ6'џчœ-џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџйЏpџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџztџПœhџќМ]џџО\џџН[џџНZџџНYџџМXџџМWџЭ˜Fџ%џ џ џ џ џ џ џ џџ```џТТТџєєєџ№№№џќќќџџџџџвввџ џ[CџџЕEџџДDџ|Y$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џO8џ№Ѓ0џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџ§Фnџ™Šsџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџuuuџ‰€rџОœjџїЛ_џџО]џџО]џџО\џџН[џџНZџџНYџџМXџџМWџџМVџэЎPџR> џ џ џ џ џ џ џ џ џ џџTTTџџИИИџŽŽŽџ џ\CџџЕEџџДDџ|Y$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ‹` џ§Ќ2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџюКnџЭЇoџЎ–qџ—ˆsџ„}tџvvuџuuuџuuuџuuuџxwuџ„}sџžŒpџМœkџсАeџџП`џџП_џџП^џџО]џџО]џџО\џџН[џџНZџџНYџџМXџџМWџџМVџџЛUџўКTџžt7џџ џ џ џ џ џ џ џ џ џ џ џ џ џ]DџџЕEџџДDџ}Y$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ>-џЮ,џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџџФlџџФkџџУjџџУiџќСiџіНhџіНgџєМgџџСeџџСdџџСcџџРbџџРaџџП`џџП_џџП^џџО]џџО]џџО\џџН[џџНZџџНYџџМXџџМWџџМVџџЛUџџЛTџџКTџыЌMџnR'џ џ џ џ џ џ џ џ џ џ џ џ џ^EџџЕEџџДDџX@џ џ џ џ џ џ џ џ џ џ џ џ џ џ)џžn%џ§­5џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџџФlџџФkџџУjџџУiџџУhџџТgџџТfџџТeџџСeџџСdџџСcџџРbџџРaџџП`џџП_џџП^џџО]џџО]џџО\џџН[џџНZџџНYџџМXџџМWџџМVџџЛUџџЛTџџКTџџКSџџКRџхІIџvW)џџ џ џ џ џ џ џ џ џ џ_EџџЕEџџДDџA0џ џ џ џ џ џ џ џ џ џ џ џ;+џЃq'џњЌ6џџЏ6џџЎ5џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџџФlџџФkџџУjџџУiџџУhџџТgџџТfџџТeџџСeџџСdџџСcџџРbџџРaџџП`џџП_џџП^џџО]џџО]џџО\џџН[џџНZџџНYџџМXџџМWџџМVџџЛUџџЛTџџКTџџКSџџКRџџЙQџџЙPџїГMџ­~7џYB џџ џ џ џ џ џ џ`FџџЕEџџДDџA1џ џ џ џ џ џ џ џ џ:+џ|W!џе”2џџА9џџЏ8џџЏ7џџЏ6џџЎ5џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџџФlџџФkџџУjџџУiџџУhџџТgџџТfџџТeџџСeџџСdџџСcџџРbџџРaџџП`џџП_џџП^џџО]џџО]џџО\џџН[џџНZџџНYџџМXџџМWџџМVџџЛUџџЛTџџКTџџКSџџКRџџЙQџџЙPџџЙOџџИNџџИMџќЖKџЭ”>џšp0џtU&џN:џ;,џ-#џqR#џџЕEџџДDџ|Y$џ1%џ;,џG4џR<џkLџ‘g'џЙ/џюІ9џџБ;џџА;џџА:џџА9џџЏ8џџЏ7џџЏ6џџЎ5џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџў§џџў§џџўќџџ§ћџџ§њџџ§љџџќјџџќїџџќіџџћѕџџћѕџџњєџџњѓџџњђџџљёџџљ№џџљяџџјюџџјэџџјьџџїьџџїыџџїъџџіщџџішџџѕчџџѕцџџѕхџџєфџџєфџџєуџџѓтџџѓсџџѓрџџђпџџђоџџђнџџёмџџёлџџ№лџџ№кџџ№йџџяиџџязџџяжџџюеџџюдџџюгџџэгџџэвџџэбџџьаџџьЯџџыЮџџыЭџџыЬџџъЫџџъЪџџъЪџџщЩџџщШџџщЧџџшЦџџшХџџчФџџчУџџчТџџцТџџцСџџцРџџхПџџхОџџхНџџфМџџфЛџџфКџџуКџџуЙџџтИџџтЗџџтЖџџсЕџџсДџџсГџџрВџџрБџџрБџџпАџџпЏџџпЎџџо­џџоЌџџнЋџџнЊџџнЉџџмЉџџмЈџџмЇџџлІџџлЅџџлЄџџкЃџџкЂџџкЁџџй џџй џџиŸџџиžџџиџџзœџџз›џџзšџџж™џџж˜џџж˜џџе—џџе–џџе•џџд”џџд“џџг’џџг‘џџгџџвџџвџџвŽџџбџџбŒџџб‹џџаŠџџа‰џџаˆџџЯ‡џџЯ‡џџЮ†џџЮ…џџЮ„џџЭƒџџЭ‚џџЭџџЬ€џџЬџџЬ~џџЫ~џџЫ}џџЫ|џџЪ{џџЪzџџЩyџџЩxџџЩwџџШvџџШvџџШuџџЧtџџЧsџџЧrџџЦqџџЦpџџЦoџџХnџџХnџџФmџџФlџџФkџџУjџџУiџџУhџџТgџџТfџџТeџџСeџџСdџџСcџџРbџџРaџџП`џџП_џџП^џџО]џџО]џџО\џџН[џџНZџџНYџџМXџџМWџџМVџџЛUџџЛTџџКTџџКSџџКRџџЙQџџЙPџџЙOџџИNџџИMџџИLџџЗLџџЗKџџЖJџџЖIџџЖHџџЕGџџЕFџџЕEџџДDџџДCџџДCџџГBџџГAџџГ@џџВ?џџВ>џџБ=џџБ<џџБ;џџА;џџА:џџА9џџЏ8џџЏ7џџЏ6џџЎ5џџЎ4џџЎ3џџ­2џџ­2џџЌ1џџЌ0џџЌ/џџЋ.џџЋ-џџЋ,џџЊ+џџЊ*џџЊ*џџЉ)џџЉ(џџЉ'џџЈ&џџЈ%џџЇ$џџЇ#џџЇ"џџІ"џџІ!џџІ џicedtea-web-1.8/win-installer/PaxHeaders.7406/icon.ico0000644000000000000000000000013213441742745017437 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.289253364 30 ctime=1552410887.101183471 icedtea-web-1.8/win-installer/icon.ico0000644000175000002070000034165313441742745020263 0ustar00jvanekmock00000000000000 hv ˆ о  Јf00 Ј%@@ (BЖD€€ (о† Ѕ4(  џ™(џ™ЇЭ{+жЋfGхЏjEхя‘ аџ™“џœџ–Уu3ы$Лџ Щџ Яџ Эџ Чџ`:ˆџ№ пџ›=н…й_оРsјqDyџФџ гџкџкџжџ)Зџытџœџ’џ™кЏjщ џ џ( џЌhџ[7Œџ Эџкџкџиџ:#Јџў˜Мѓ“™4#ўи‚ї џ џ џ џ’ZџE)Ÿџ Эџкџкџ ЭџЃbOюџœџ€‰Tы џzLі?)§ џ џ џ џШxўg=ƒіеў вџкџ.ВџџšџAE-ќ џ џОsј џ џ џ џO2џ)Зѕкџкџдџ8"ЊџџšАџœ]3"џ џ џkBћ>(§ џ џ џ џ†Ohюйџ ШџS2”џѓ“ лџ•џ˜Rd?џ џ џ џ“Z§ џ џ џ џОr(ёf>ƒќз"чџ™Зџ—џ›Э{ъ џ џ џ џ;'џ џ џ џэшџ˜Yџ›џ™ЗoEџ џ џ џ џ џ џ џћ—Ьџ—ў˜зsGџ џ џ џ џ џ:&џџ™Ѕџžџ™Мдю`<џ$ џ! џ џЏjђџ™2џ›.џšœџ˜Фџ™Эџ™Юџ˜Зџџј№р€€€€Р№?џџ(0 џ™џ˜Wџ™Šџ™Зџ™ЛџšАџ›џ›8џš+џ™Рї•ђ­hFіpCzџE)ŸџE)ŸџoC{џБjCќљ–юџ˜тџœMџŸў˜іŒSbў ЭџжџжџкџкџжџжџРџДl@џџ™ёџ™ џ€џ˜aџšoџ›Yђ‘ іПџкџеџкџкџкџкџкџйџзџd<…џ§˜єџ˜Љџ’њ–ѓiA§uIљ b§тˆџЦw1џY5џйџеџкџкџкџкџкџеџX5џ§˜ђџ™iџœHџ™ьњ–ї џ џ џ џB+џРtџкƒ џ+ЕџдџкџкџкџкџкџеџˆRfџџ™№џ™џ”№‘юЕnњџ™џ<'џ џ џ џ џ џlCџђ‘џE)ŸџдџкџкџкџкџкџзџЯ})љџš†џ™™b>ќ џл„ќ…R§ џ џ џ џ џ џY8џэŽџ ЬџгџкџкџкџкџеџH+œџџ™ьџЊџ’з‚ѕ џ џqFћй‚і џ џ џ џ џ џ џ”Zџс‡џ‰Reџ.Гџйџгџкџкџйџкƒ №џ—;џš]|Mљ џ џ џђ’њE,џ џ џ џ џ џ џ џё‘џ,Г§зћкџиџжџкџдџ“Y\§џ™‚џ™ЅD,џ џ џ џXќЙqљ џ џ џ џ џ џ џš^џI,›њк§кџкџкџиџдџТu4§џ˜Љџ™Ъ2!џ џ џ џ џыŽјA*ў џ џ џ џ џ џQ4џЉeJљзќкџкџдџ ЫџУu3џџšяџ— џ™дD,џ џ џ џ џ\:џЮ}§ џ џ џ џ џ џ(џе€$џкџдџиџV4џъњџ˜ьџš:џ™МzKџ џ џ џ џ џ™]ќrGў џ џ џ џ џ џѕ“џ=$ЇўuFvџе$њџšђџ˜Кџ—џ˜|Э|ћ џ џ џ џ џ џŸ`ў" џ џ џ џ џ џ§™ўџ™њџ™Эџ™…џœџ™(џ™ёO2џ џ џ џ џ џ џA*џ џ џ џ џ џџ™№џšNџ˜Нф‰ќ џ џ џ џ џ џ џ џ џ џ џ)џџ™№џ—џ•џ™яЬ{џ џ џ џ џ џ џ џ џ џ џf?џџ™№џ›=џ™ёл„џ9%џ џ џ џ џ џ џ џ џЉgўџ™Њџš0џ™фќ—ѓЇfџ7$џ џ џ џ џ џ џљ–яџš?џ’џ˜rџšъџ™яс‡ћ­iџWџNџXџЬ{џџ™ъџџџџџ™7џ™vџ˜Гџ™аџ™оџ˜нџšЯџ˜mџџџџ€ўќ№рР€€€€џРџрџ№џќџџџџ( @ џџџ— џ˜>џ™PџšQџ™<џ›џ™ џ˜Yџ™Зџ™єџ™џџ™ўџšљџ˜њџ™џџ™џџ™щџ™˜џ˜4џ™џ›zџ˜іў˜њТu4§oC{џ5 ­џ Яџкџдџ1АџmA}џУu3џџ™љџ˜џџ™Зџ™#џ˜Јў™љЎhEџ-Дџкџкџйџкџкџкџйџкџкџ8"ЊџХv2џџ™љџ™їџšNџšЂАiDўкџкџкџкџкџкџкџкџкџкџкџиџиџwGtџќ˜ўџ™§џš`џ˜cџ™ўџšяџ˜нџ˜йђ‘ ћ|Jpџ#МџкџйџкџкџкџкџкџкџкџкџйџкџP0–џљ•џџ˜ћџ›=џ™џ˜ІЮ|ў. џB+џg@џ˜]џр‡џџ™џЧw0џQ1•џиџйџкџкџкџкџкџкџкџкџкџS2“џў˜§џ˜ьџ’џš5џ™іџ™лЙoў џ џ џ џ џ=(џЏjџ§˜џг&џ6!Ќџкџкџкџкџкџкџкџкџкџкџ‹Scџџšљџšџ™џšуџšўџ™џюј џ џ џ џ џ џ џ>(џл„џњ–џ`:ˆџкџкџкџкџкџкџкџкџйџзџЪy-џџ™ќџœџ˜•Чxњ8%џз‚ўџ™§/ џ џ џ џ џ џ џ џ џНsџ§˜џL-™џкџкџкџкџкџкџкџкџйџ2Џџў˜јџšƒџ˜%ј•ќ/ џ џjBўџ™џ{Lџ џ џ џ џ џ џ џ џ џХwџч‹џ ЯџкџйџкџкџкџкџкџкџкџГkAџџ™ыџ€џ˜——\ћ џ џ џѓ’§а~љ џ џ џ џ џ џ џ џ џ$ џяџг&џrDyџРџкџкџйџкџкџкџйџ>%Ѕџџ™§џš?џŸџ™ѓ3"џ џ џ џ™]ўџ™џ6$џ џ џ џ џ џ џ џ џ џqFџџ™џУu3џvGuџA'ЃўкџкџкџкџкџкџиџюŽјџ˜џ—@ф‰§ џ џ џ џ( џћ—ћЅeћ џ џ џ џ џ џ џ џ џ џч‹џW3§кџкџкџиџкџкџкџкџкџБjCџџ˜Ыџ™vАkњ џ џ џ џ џЂcџњ–џ& џ џ џ џ џ џ џ џ џ џ‘Yџ­hFџкџкџкџкџкџкџкџкџ/Бџю§џ˜нџ™™Ѓcў џ џ џ џ џ! џѓ‘љЁcћ џ џ џ џ џ џ џ џ џE-џљ•џ Ыџкџкџкџкџйџкџ;$Јџяџџ™ўџšIџ™ЌЅeџ џ џ џ џ џ џxJџ§˜џ5#џ џ џ џ џ џ џ џ џ џќ—џO/–џйџкџкџйџиџyIsџљ•џџ™ћџ—€џ™ЈТuџ џ џ џ џ џ џ џРt§Тu§ џ џ џ џ џ џ џ џ џо†џnB|џкџкџкџH+œџЫz,џџšќџšўџšyџ™Œѓ‘љ џ џ џ џ џ џ џ! џсˆ§hAў џ џ џ џ џ џ џ џЩyџЉeJў*ЗўtFwџЬz,џџ™ћџ™§џ™гџš:џš]џšљR4џ џ џ џ џ џ џ џ1!џл„џ џ џ џ џ џ џ џ џЧxџџ™џџ™ўџ™џџ™ѕџšЉџšGџџџџ™ўРtџ џ џ џ џ џ џ џ џ.џŠUў џ џ џ џ џ џ џд€џџ™џџšmџš&џџџ˜Нџ˜ћS5џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џр‡џџšљџ€џš?џ™ўцŠџ  џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џі”џџ™вџ™Ђџ™љЮ|џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ?)џџ™љџšџ™џšйџ™ља~џ# џ џ џ џ џ џ џ џ џ џ џ џ џxJџџ™ћџ˜Mџ•џšоџ™љъџ^;џ џ џ џ џ џ џ џ џ џ џ џЦxџџ™їџŽ џ™џ™Џџ™ќџ™ўХwџR4џ џ џ џ џ џ џ џ џA*џџ™ћџ™Њџ˜Tџ˜нџ™ћџ™ћщŒџ`џhAџ=(џ+ џ џ* џ>(џУvџџ™§џ™FџЊџ˜Oџ™Ќџ™јџ™џџ™їџ™јџ™§џ™џџ™џџ™џџ™ќџ™уџ€џЊџ›3џ™dџ™‡џ™™џ™­џ˜Ўџ™›џ™џšLџџџџџќџџрџџ€?џ€џ€ј№рРР€€€џ€џРџРџрџ№џќџўџџРџџџџџ(0` џ’џ›џ–"џ–"џ”џ• џ™Pџ™ŠџšПџ™хџ™ўџ™џџ™џџ™џџ™џџ™љџ™лџšЁџ™fџџЊџšNџ™Вџ˜јџ™џџ™џџ™џџ™џыџкƒ џн…џо…џњ–џџ™џџ™џџ™џџ™џџ™ќџ˜Гџ˜Mџ˜Tџ™кџ™џџ™џџ˜џкƒ џ†Pgџ=%Іџ Ъџкџкџкџкџжџ-Дџh>џПs7џ§˜џџ™џџ™џџ™џџšПџ—,џ™Ђџ™џџ™џў˜џ­hFџ3ЎџкџкџкџкџкџкџкџкџкџкџкџкџРџ˜[Xџљ•џџ™џџ™џџ™ћџ™}џџџЂ џ™џџ™џЙo<џ/Вџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ#МџПs7џџ™џџšўџ™џџ™Ѕџ’џ™щј”џдџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџqDyџћ—џџ™џџ™џџšПџ’џ›=џ™Лџ™Џџ™˜џ™‚џ™kџ™гџ™џT2’џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџI,œџђ‘ џџ™џџ™џџ˜Ÿџ˜Ўџ™џ§˜џыџџ™џџ™џџ™џџ™џџ™џр†џŠSdџ3Ўџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ8"Њџђ‘ џџ˜џџ™џџštџ™оџ™џM1џ џ џ:&џ^;џŒVџд€џџ™џџ™џџ™џв~&џe=„џеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ@&Ѓџј•џџ™ўџ™ћџ™-џ™џ˜Ўџ˜•џ™чџ™џ џ џ џ џ џ џ џ) џuIџп†џџ™џџ™џр†џ\7‹џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџc;…џџ™џџ™џџ™Оџ™Šџ™џџ™џџ™їџ™џK0џ џ џ џ џ џ џ џ џ џd>џк„џџ™џџ™џВkBџ Ъџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ^Tџџ™џџ™џџ™Uџ˜Jџ™ўџ™џџ™џџ™џџ™џ€Oџ џ џ џ џ џ џ џ џ џ џ џ”Zџў˜џџ™џкƒ џ#МџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЮџр†џџ˜џџ™лџ€џ’џ™ъѓ‘џ€OџЊgџџ™џџ™џЕnџ џ џ џ џ џ џ џ џ џ џ џ џO2џё‘џџ™џо…џ ШџкџкџкџкџкџкџкџкџкџкџкџкџкџкџM.˜џџ™џџ™џџ™Fџ™…џ™џoEџ џ џм„џџ™џэџ џ џ џ џ џ џ џ џ џ џ џ џ џA*џѓ’џџ™џНq8џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџРs6џџ™џџ™Ќџ—џ˜іЧxў џ џ џ}Mџџ™џџ™џP3џ џ џ џ џ џ џ џ џ џ џ џ џ џE-џј•џџ™џ\7‹џкџкџкџкџкџкџкџкџкџкџкџкџкџкџA'Ђџџ™џџ™њџ•џ™Œџ™џ;'џ џ џ џ! џњ–џџ™џІeџ џ џ џ џ џ џ џ џ џ џ џ џ џ џzKџџ™џюџb;†џ ЫџкџкџкџкџкџкџкџкџкџкџкџкџкџЯ|)џџ™џџ˜mџ€џ™шШxў џ џ џ џ џБkџџ™џѓ’ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џТvџџ™џџ™џљ•џЗn>џd<…џ ЩџкџкџкџкџкџкџкџкџкџкџqDyџџ™џџšАџ˜Mџ™џc>џ џ џ џ џ џE-џџ™џџ™џf@џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ9%џў˜џџ™џЭ{+џ]8Šџc;…џ_9‰џ ЩўкџкџкџкџкџкџкџкџкџПџџ™џџ™яџЊџšœў˜џ џ џ џ џ џ џ џХwџџ™џе‚ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЕnџџ™џM.˜џкџкџкџкџкџкџкџкџкџкџкџкџкџкџуˆџџ™џџš5џ™гл„џ џ џ џ џ џ џ џQ3џџ™ўџ™џR4џ џ џ џ џ џ џ џ џ џ џ џ џ џ џG-џџ™џUaџкџкџкџкџкџкџкџкџкџкџкџкџкџиџм„џџ™џџ™vџ’џ™§­iџ џ џ џ џ џ џ џ џЩyџџ™џУvў џ џ џ џ џ џ џ џ џ џ џ џ џ џ џч‹џ№ џ бџкџкџкџкџкџкџкџкџкџкџкџзџž_Sџџ™џџ™џџ™dџ™2џ™џЁbџ џ џ џ џ џ џ џ џ?)џў™ўџ™џN2џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ™]џџ™џU3‘џкџйџкџкџкџкџкџкџкџкџеџЊfIџџ™џџ™џџ™ЫџЊџ›Bџ™џ—\џ џ џ џ џ џ џ џ џ џІeџџ™џг€ў џ џ џ џ џ џ џ џ џ џ џ џ џ џ`<џџ™џЁ`Pџкџкџкџкџкџкџкџкџкџ ЧџЙo<џџ™џџ™џџ™ѓџ—,џ˜Rџ™џЅeџ џ џ џ џ џ џ џ џ џ! џьŽџџ™џg@џ џ џ џ џ џ џ џ џ џ џ џ џ џ/џџ™џе€$џкџкџкџкџкџкџкџкџO/–џщŒџџ™џџ™џџ˜ћџ˜HџšQџ™џТuџ џ џ џ џ џ џ џ џ џ џU6џџ™џцŠџ џ џ џ џ џ џ џ џ џ џ џ џ џ џј•џѕ“ џкџкџкџкџкџкџ"НџЃbOџџ™џџ™џџ™џџ™ѓџšLџ›8џ™џшŒџ џ џ џ џ џ џ џ џ џ џ џš^џџ™џ™]џ џ џ џ џ џ џ џ џ џ џ џ џ џу‰џў˜џжџкџкџкџ$Лџ^Tџњ–џџ™џџšўџ™џџ™вџ™-џœџ™џџ™џ9%џ џ џ џ џ џ џ џ џ џ џ џРtџ§˜џA*џ џ џ џ џ џ џ џ џ џ џ џ џЭ|џџ™џuFvџ/ВџwGtџЪy-џў˜џџ™џџ™џџ™џџ˜юџ™vџ™џЊџ™эџšў‚Pџ џ џ џ џ џ џ џ џ џ џ џ џгџе€џ џ џ џ џ џ џ џ џ џ џ џ џХwџџ™џџ™џџ™џџ˜џџ™џџ™џџ™џџ™гџ™qџ• џšЋџ™џтˆџ џ џ џ џ џ џ џ џ џ џ џ џ" џа~џNџ џ џ џ џ џ џ џ џ џ џ џЧxџџ™џџ™џџ™џџ™ьџ™Вџ™uџš+џ™gџ™џџ™џf@џ џ џ џ џ џ џ џ џ џ џ џ џ џВlџ- џ џ џ џ џ џ џ џ џ џ џЮ|џџ™џџ™јџ•џ™џ˜ёџ™ўр‡џ џ џ џ џ џ џ џ џ џ џ џ џ џ џG.џ џ џ џ џ џ џ џ џ џ џф‰џџ™џџ™аџšџ™џџ™џ›_џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џњ–џџ™џџ˜Љџ›џ˜ѕџšўў˜џ[9џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ/џџ™џџ™џџ™sџšjџ™џџ™џї”џC+џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ^;џџ™џџ™џџš5џџџ™Лџ™џџ™џяџE-џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ–\џџ˜џџ™ѓџ€џ™џ™дџ™џџ™џј•џ`<џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џкƒџџ™џџšАџ—џ™жџ™џџ™џџ™џЃcџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ6$џџ™џџ™џџ˜^џџ™Сџ™џџ™ўџ™џцŠџf@џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ•[џџ™џџ™љџŸџЊџ™‚џ™§џ™џџ™џџ™џс‡џtHџ џ џ џ џ џ џ џ џ џ џ џ џ  џѓ’џџ™џџ™Дџš5џ™Йџ™џџ™џџ™џџ™џќ—џПtџtHџD,џ џ џ џ џ џ џ џ џЇfџџ™џџ™џџ™Pџš?џ˜Иџ™ќџ™џџ™џџ™џџ™џџ™џ§˜џтˆџд€џХwџОsџЮ|џр‡џі”џџ™џџ™џџ™хџ€џ›џ™lџ˜Тџ™љџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜џ™џ—1џ˜cџ™‘џ˜ЉџšКџ™Ьџ™нџ™мџ™Ьџ™Оџ™Бџ˜Єџ›џџџџџџџџџџџџџр?џџџџџўџџќџџјџќ?џ?џџјј№ррРР€€€€€џ€?џ€џРџРџрџрџ№џџјџџќџџўџџџ€џџџрџџџјџџџџџџџџџџџџџџџџџџџџџџџџ(@€ џџџ–'џ˜^џ™‡џ™Їџ˜Чџ™нџ™нџ™ыџ™ъџ™еџ˜Нџ˜Єџ˜|џ—@џЂ џ–џš]џ™­џ™эџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ћџ˜ЧџšjџŸџџџ™Aџ™Њџ™њџ™џџ™џџ™џџ™џџ™џџ™џюџЦw1џЊfIџЙo<џЛp:џПs7џф‰џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™іџ™Ђџ˜/џš?џ™Шџ™џџ™џџ™џџ™џџ™џтˆџV`џD) џ Чџкџкџкџкџкџкџкџ Ыџ@&ЃџŠSdџр†џџ™џџ™џџ™џџ™џџ™џџ™§џšЁџ›џŸџ™–џ™џџ™џџ™џџ™џї”џ•Y[џ8"Њџйџкџкџкџкџкџкџкџкџкџкџкџкџкџйџ9"ЉџЊfIџ§˜џџ™џџ™џџ™џџ™џџ™эџ™Zџ™‰џ™џџ™џџ™џј•џ“X\џУџкџкџкџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџ.ГџАjDџџ™џџ™џџ™џџ™џџ™џџ˜•џЊџ™–џ™џџ™џБjCџТџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџR1”џщŒџџ™џџ™џџ™џџ™џџ˜ИџЂ џ™qџ™џџ™џ Ыџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ ШџДl@џџ™џџ™џџ™џџ™џџšФџ™ џš+џ™{џ™kџšSџ›=џ–'џ™џšLџ™џџ™џ2Џџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџ‘W^џџ™џџ™џџ™џџ™џџ˜Гџ€џ™жџ™џџ™џџ™џџ™џџ™џџ™џџ™юџ™џџ™џьŽџ†Pgџ-ДџкџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџqDyџў˜џџ™џџ™џџ™џџ™Œџš&џ™џџ™џў˜џХwџТvџм„џј•џџ™џџ™џџ™џџ™џџ™џџ™џж€#џLmџ'ЙџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџsExџџ™џџ™џџ™џџ™ўџ™Pџ˜Mџ™џџ™џNџ џ џ џ џ. џ[9џXџЭ|џќ—џџ™џџ™џџ™џў˜џМq9џN/—џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџLmџџ™џџ™џџ™џџ™ъџ™џ˜mџ™‘џ™dџ™џџ™џ<'џ џ џ џ џ џ џ џ џ џmDџТuџџ™џџ™џџ™џџ™џг&џU3‘џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџЈeJџџ™џџ™џџ™џџšЁџ™Zџ™џџ™џџ™Ыџ™џџ™џ_<џ џ џ џ џ џ џ џ џ џ џ џ5#џЂcџћ—џџ™џџ™џџ™џЌgGџ Шџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ бџв~&џџ™џџ™џџ™ўџ—6џ˜%џ™ђџ™џџ™џџ™џџ™џџ™џ‹Uџ џ џ џ џ џ џ џ џ џ џ џ џ џ0 џЖnџџ™џџ™џџ™џъŒџ@&Ѓџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ)Зџї”џџ™џџ™џџ™ОџŸџ™Юџ™џџ™џџ™џџ™џџ™џџ™џМrџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ`<џяџџ™џџ™џљ•џ\7‹џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџwGtџџ™џџ™џџ™џџ˜>џ™Œџ™џў˜џСuџХwџџ™џџ™џџ™џє’џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ* џа~џџ™џџ™џ§˜џS2“џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџзџЮ|*џџ™џџ™џџ™Џџ™#џ™љџ™џ‡Sџ џ џ`џџ™џџ™џџ™џC+џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џРtџџ™џџ™џѕ“ џ3ЎџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџC(Ёџџ™џџ™џџ™ќџ–"џ˜Љџ™џз‚џ џ џ џ- џў˜џџ™џџ™џŽWџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џСuџџ™џџ™џд%џжџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЖm>џџ™џџ™џџ™€џ™7џ™ў§˜џD,џ џ џ џ џСuџџ™џџ™џу‰џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џжџџ™џџ™џvGuџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ<$Їџџ™џџ™џџ™мџџџšЕџ™џЃcџ џ џ џ џ џ`<џџ™џџ™џџ™џE-џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ7$џј•џџ™џѕ“ џL.™џиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЪy-џџ™џџ™џџ—6џџ™ќџ™џ6$џ џ џ џ џ џ џэџџ™џџ™џš^џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џyKџџ™џџ™џџ™џф‰џ”Y[џB(Ђџзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџc;…џџ™џџ™џџ˜џ˜wџ™џХwџ џ џ џ џ џ џ џ‘Yџџ™џџ™џьŽџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЦxџџ™џџ™џџ™џџ™џџ™џыџœ^UџK-šџдџкџкџкџкџкџкџкџкџкџкџкџкџ Ыџњ–џџ™џџ™Ьџ™зџ™џa=џ џ џ џ џ џ џ џ& џљ•џџ™џџ™џ`<џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џH.џџ™џџ™џџ™џ^Tџ6 Ќџ3Ўџ7!Ћџ8"ЊџХџкџкџкџкџкџкџкџкџкџкџкџкџкџОr8џџ™џџ™ўџ™џ›)џ™џў˜џ џ џ џ џ џ џ џ џ џЁbџџ™џџ™џа~џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џХwџџ™џѕ“ џзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ„Oiџџ™џџ™џџšNџ˜aџ™џк„џ џ џ џ џ џ џ џ џ џ/џ§˜џџ™џџ™џL0џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џN2џџ™џ§˜џХџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџZ6џџ™џџ™џџ™‡џ™˜џ™џЄdџ џ џ џ џ џ џ џ џ џ џ­iџџ™џџ™џОsџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џцŠџџ™џ‚NkџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџІdLџџ™џџ™џџ™Жџ™Яџ™џ|Lџ џ џ џ џ џ џ џ џ џ џ0 џњ–џџ™џџ™џ:&џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ–\џџ™џъŒџжџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџŒTbџџ™џџ™џџ™џџ™}џ™їџ™џqFџ џ џ џ џ џ џ џ џ џ џ џ“Zџџ™џџ™џЛqџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џF-џџ™џџ™џG+џкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџV`џџ™џџ™џџ™џџ™зџ’џŸџ™џџ™џg@џ џ џ џ џ џ џ џ џ џ џ џ џыџџ™џџ™џM1џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џѕ“џџ™џ™\Wџкџкџкџкџкџкџкџкџкџкџкџкџкџ вџЋgHџџ™џџ™џџ™џџ™§џ™<џ•џ™џџ™џa=џ џ џ џ џ џ џ џ џ џ џ џ џnDџџ™џџ™џвџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џШyџџ™џг&џкџкџкџкџкџкџкџкџкџкџкџкџ&Кџа}(џџ™џџ™џџ™џџ™џџ™nџ™(џ™џџ™џzKџ џ џ џ џ џ џ џ џ џ џ џ џ џПtџџ™џџ™џd>џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ˜]џџ™џќ—џ бџкџкџкџкџкџкџкџкџкџиџj@џѓ’ џџ™џџ™џџ™џџ™џџ™Œџš&џ™џџ™џ™]џ џ џ џ џ џ џ џ џ џ џ џ џ џ% џюџџ™џхŠџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џlCџџ™џџ™џ'Йџкџкџкџкџкџкџкџкџ9"ЉџФv2џџ™џџ™џџ™џџ™џџ™џџ˜†џџџ џ™џџ™џЙpџ џ џ џ џ џ џ џ џ џ џ џ џ џ џZ9џџ™џџ™џ‘Yџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џT5џџ™џџ™џ4Ўџкџкџкџкџкџкџ9"ЉџВkBџџ™џџ™џџ™џџ™џџ™џџ™јџ˜^џ™ѓџ™џяџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ˜]џџ™џћ—џ6$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ?)џџ™џџ™џP0–џкџкџкџеџP0–џКp;џџ™џџ™џџ™џџ™џџ™џџ™џџ™Рџ™(џ™йџ™џџ™џG-џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЕnџџ™џЧxџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ* џџ™џџ™џи‚!џP0–џ[7ŒџЁaPџьŽџџ™џџ™џџ™џџ™џџ™џџ™џџ™лџ˜^џџџ˜Ўџ™џџ™џ‘Yџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЩyџџ™џlCџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ$ џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ўџšФџ™Uџ€џ™uџ™џџ™џч‹џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џгџё‘џ$ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ' џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™јџ™Уџštџ™џ™-џ™џџ™џџ™џmDџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џНsџЕnџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ) џџ™џџ™џџ™џџ™ыџšЁџ™xџš?џŽ џ™лџ™џџ™џн…џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЃcџ`<џ џ џ џ џ џ џ џ џ џ џ џ џ џ4"џџ™џџ™џџ™џџštџ™zџ™џџ™џџ™џvIџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ[9џ џ џ џ џ џ џ џ џ џ џ џ џ џL0џџ™џџ™џџ™џџšNџ›џ™іџ™џџ™џѕ“џ. џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џd>џџ™џџ™џџ™џџ–'џšџ™џџ™џџ™џЦxџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ„Qџџ™џџ™џџ™єџ™џ™џ™ьџ™џџ™џџ™џ™]џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џБkџџ™џџ™џџ™Мџ˜cџ™џџ™џџ™џџ™џ}Mџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џп†џџ™џџ™џџš~џџџ˜Ўџ™џџ™џџ™џў˜џmDџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ  џў˜џџ™џџ™џџ—@џ–џ™кџ™џџ™џџ™џџ™џŒVџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џc>џџ™џџ™џџ™їџŽ џ™#џ™ъџ™џџ™џџ™џџ™џЋhџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЉgџџ™џџ™џџ™Бџ™-џ™чџ™џџ™џџ™џџ™џп†џI/џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џѓ’џџ™џџ™џџ˜^џš&џ™йџ™џџ™џџ™џџ™џў˜џ`џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џhAџџ™џџ™џџ™љџ–џŸџ˜Гџ™џџ™џџ™џџ™џџ™џѕ“џ“Zџ% џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЮ|џџ™џџ™џџ™Зџџџ™fџ™ђџ™џџ™џџ™џџ™џџ™џљ•џЇfџT5џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ[9џџ™џџ™џџ™џџ˜^џ™џ˜Ÿџ™§џ™џџ™џџ™џџ™џџ™џџ™џђ’џЈfџkCџ<'џ џ џ џ џ џ џ џ џ џ џ џл„џџ™џџ™џџ™эџŽ џš+џšЁџ™њџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џћ—џеџОsџЎjџ bџ‘Yџš^џЌhџПtџб~џє’џџ™џџ™џџ™џџ™џ•џ™vџ™жџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ўџ›)џ˜%џ™sџ˜Гџ™эџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Рџџџœ$џšNџ˜wџ˜•џšАџ˜Чџ™вџ™нџ™рџ™нџ™нџ™зџ™Уџ™Џџ™›џ™<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрџџџџџџџџџјџџџџ№?џџџРџџџРџџџРџџџРџџрџџрџџРџР?џ?ўќјј№№ррРРР€€€€€?€€џ€џ€џ€џџРџџРџџРџџрџџрџџ№џџ№џџјџџќ?џџў?џџџ?џџџ€џџџРџџџ№џџџќџџџџџџџџџџрџџџџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџ(€ џŸџ—6џš[џ™uџ˜џ™Јџ™Лџ˜Чџ™вџ™нџ™нџ™нџ™жџ™Цџ™Зџ™Їџ˜џ™pџšQџ—1џ’џ™џ™Fџš~џšЕџ™щџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™њџ™аџ˜Ÿџ˜hџœ$џ™ џšQџ™›џ™еџ™§џ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™пџ™›џ˜Hџ€џ”џ™_џ™Џџ™ѕџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ъџ™–џ›8џ€џšGџšАџ™ћџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџšЩџ™ZџЊџ”џštџ™лџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џяџХv2џЇdKџŠSdџmA}џd<…џU3‘џU3‘џR1”џ\7‹џg>‚џyIsџ•Y[џИn=џкƒ џќ—џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™фџ™iџ™џ џ˜џ™ѓџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џў˜џЯ|)џ‹ScџV4џ#Мџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ аџ@&ЃџwGtџЕm?џї”џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™кџšVџџџЊџ˜mџ™ъџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џљ•џАjDџb;†џФџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ бџO/–џ `Qџє’ џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜Тџ–'џ˜%џ™Юџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џЫz,џmA}џ Щџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ Яџc;…џЩy.џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™їџ™xџ€џš[џ™ђџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ§˜џВkBџ8"Њџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ;#ЈџВkBџў˜џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Ъџœџ˜Yџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џї”џ“X\џ"Нџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ6 ЌџРs6џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ьџ™Fџ™Дџ™џџ™џџ™џџ™џџ™џџ™џџ™џ§˜џ `QџСџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџM.˜џкƒ џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ќџ™{џџџ™Дџ™џџ™џџ™џџ™џџ™џџ™џИn=џ/Вџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ вџ†Pgџњ–џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜šџЊџ˜•џ™џџ™џџ™џџ™џџ™џwGtџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ/Вџд%џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџšЋџ’џ™vџ™џџ™џџ™џџ™џЮ|*џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџ вџ”Y[џў˜џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Лџ™ џ˜Tџ™џџ™џџ™џџ™џ•Y[џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџS2“џє’ џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Вџ€џ™(џ™џџ™џџ™џџ™џЏiDџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ.Гџп†џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Ђџџџ—;џ™аџ™яџ™хџ™дџ™Уџ™ВџšЁџ™Œџšoџ˜Tџš:џ›џ€џЊџ™їџ™џџ™џџ™џљ•џ-Дџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ ЧџЫz,џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™…џ™ џ™ыџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ћџ™йџ™яџ™џџ™џџ™џџ™џъŒџb;†џЮџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ аџЙo<џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Zџš]џ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џј•џЕm?џd<…џ ЧџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџеџВkBџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™єџ˜*џ™­џ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џќ—џОr8џb;†џ ЭџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџгџЛp:џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™еџЂ џ™чџ™џџ™џџ™џџ™џџ™џщŒџ‘Yџ|LџXџЉgџХwџс‡џњ–џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џї”џЊfIџM.˜џзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ бџУu3џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Ђџ™џ™џџ™џџ™џџ™џџ™џЮ|џ џ џ џ џ џ џ џ џ. џ[9џ‡SџВlџп†џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џх‰џLmџ ЪџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЮџЪy-џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜Mџ˜*џ™џџ™џџ™џџ™џџ™џ:&џ џ џ џ џ џ џ џ џ џ џ џ џ џ$ џc>џЃcџтˆџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џѕ“ џ™\Wџ(Иџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ Ыџж€#џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™хџŸџ’џ›=џš+џ™2џ™џџ™џџ™џџ™џяџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ/џ‚Pџеџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ§˜џЊfIџ"Нџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ&Кџ№ џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜•џ™џ™иџ™џџ™џџ˜џ—1џ™џџ™џџ™џџ™џї”џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ3"џˆTџшŒџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џј•џV_џ ШџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџN/—џ§˜џџ™џџ™џџ™џџ™џџ™џџ™џџ™§џš:џ’џ˜Чџ™џџ™џџ™џџ™џџ˜Wџ™џџ™џџ™џџ™џџ™џ, џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ\:џШyџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ№ џnB|џиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ‚Nkџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџšЩџџџ™™џ™џџ™џџ™џџ™џџ™џџ™Сџ™§џ™џџ™џџ™џџ™џY8џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џE-џТuџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џТt4џ ПџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџГkAџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜Tџšeџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ўџ™џџ™џџ™џџ™џ†Rџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џQ3џвџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ№ џX5џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ Ыџх‰џџ™џџ™џџ™џџ™џџ™џџ™џџ™иџ€џ˜/џ™јџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џВlџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џiAџ№џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џŒTbџзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџK-šџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™gџ’џ™бџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џп†џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ# џГmџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џДl@џ бџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ `Qџџ™џџ™џџ™џџ™џџ™џџ™џџ™фџЊџ™‰џ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ% џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ`<џѓ’џџ™џџ™џџ™џџ™џџ™џџ™џџ™џУu3џ Эџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ Ьџф‰џџ™џџ™џџ™џџ™џџ™џџ™џџš]џ™<џ™ќџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џb=џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ/ џеџџ™џџ™џџ™џџ™џџ™џџ™џџ™џФv2џ бџкџкџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџK-šџџ™џџ™џџ™џџ™џџ™џџ™џџ™Юџ™џ™жџ™џџ™џџ™џџ™џыџ‡Sџ^;џŠUџэџџ™џџ™џџ™џџ™џџ™џџ™џџ™џЂcџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ­iџџ™џџ™џџ™џџ™џџ™џџ™џџ™џДl@џзџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџВkBџџ™џџ™џџ™џџ™џџ™џџ™џџ—@џ™sџ™џџ™џџ™џџ™џм„џ" џ џ џ џ' џхŠџџ™џџ™џџ™џџ™џџ™џџ™џр‡џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ”Zџџ™џџ™џџ™џџ™џџ™џџ™џџ™џ‹Scџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ)Зџћ—џџ™џџ™џџ™џџ™џџ™џџšАџ™џ™ђџ™џџ™џџ™џћ—џ?)џ џ џ џ џ џe?џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ* џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ…Rџџ™џџ™џџ™џџ™џџ™џџ™џў˜џU3‘џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ˜[Xџџ™џџ™џџ™џџ™џџ™џџ™§џ— џ™Ђџ™џџ™џџ™џџ™џ‡Sџ џ џ џ џ џ џ џ№џџ™џџ™џџ™џџ™џџ™џџ™џrGџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џzKџџ™џџ™џџ™џџ™џџ™џџ™џэŽџХџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџХџѓ’ џџ™џџ™џџ™џџ™џџ™џџ™{џš+џ™§џ™џџ™џџ™џЯ}џ џ џ џ џ џ џ џ џ›_џџ™џџ™џџ™џџ™џџ™џџ™џРtџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џXџџ™џџ™џџ™џџ™џџ™џџ™џАjDџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџMlџџ™џџ™џџ™џџ™џџ™џџ™иџ™Њџ™џџ™џџ™џў˜џ>(џ џ џ џ џ џ џ џ џ?)џџ™џџ™џџ™џџ™џџ™џџ™џћ—џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џІeџџ™џџ™џџ™џџ™џџ™џџ™џG+џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ Щџѕ“ џџ™џџ™џџ™џџ™џџ™џџ—6џ™-џ™§џ™џџ™џџ™џЅeџ џ џ џ џ џ џ џ џ џ џз‚џџ™џџ™џџ™џџ™џџ™џџ™џhAџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џФvџџ™џџ™џџ™џџ™џџ™џб}'џиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ˜[Xџџ™џџ™џџ™џџ™џџ™џџš’џ˜Љџ™џџ™џџ™џє’џ$ џ џ џ џ џ џ џ џ џ џ џyKџџ™џџ™џџ™џџ™џџ™џџ™џЖnџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ# џъџџ™џџ™џџ™џџ™џџ™џlA~џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ(Иџў˜џџ™џџ™џџ™џџ™џџ™ъџ™џџ™њџ™џџ™џџ™џWџ џ џ џ џ џ џ џ џ џ џ џ џї”џџ™џџ™џџ™џџ™џџ™џљ•џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џK0џ§˜џџ™џџ™џџ™џџ™џћ—џ€Mmџ ЧџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџДl@џџ™џџ™џџ™џџ™џџ™џџš?џšƒџ™џџ™џџ™џї”џ! џ џ џ џ џ џ џ џ џ џ џ џ џЅeџџ™џџ™џџ™џџ™џџ™џџ™џuIџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џXџџ™џџ™џџ™џџ™џџ™џџ™џќ—џРs6џnB|џСџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџJ,›џџ™џџ™џџ™џџ™џџ™џџ™‰џЊџ™шџ™џџ™џџ™џ`џ џ џ џ џ џ џ џ џ џ џ џ џ џ@*џџ™џџ™џџ™џџ™џџ™џџ™џгџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џм„џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џд%џLmџ)ЗџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџэŽџџ™џџ™џџ™џџ™џџ™гџ˜Wџ™џџ™џџ™џџ™џ/џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЯ}џџ™џџ™џџ™џџ™џџ™џџ™џ;'џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џI/џў˜џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џг&џMlџ/Вџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџœ^Uџџ™џџ™џџ™џџ™џџ™џџ™џ˜Ўџ™џџ™џџ™џЩyџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џg@џџ™џџ™џџ™џџ™џџ™џџ™џ™]џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЉgџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џм„џŠSdџ8"ЊџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџG+џџ™џџ™џџ™џџ™џџ™џџ˜hџ џ™їџ™џџ™џџ™џqFџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џч‹џџ™џџ™џџ™џџ™џџ™џё‘џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ+ џљ•џџ™џџ™џџ™џџ™џџ™џџ™џў˜џВkBџzIrџwGtџxHsџˆRfџˆRfџˆRfџ†PgџtFwџG+џиџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџжџэŽџџ™џџ™џџ™џџ™џџ™Бџ™Zџ™џџ™џџ™џћ—џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ~Nџџ™џџ™џџ™џџ™џџ™џџ™џsGџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ—\џџ™џџ™џџ™џџ™џџ™џў˜џU3‘џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџГkAџџ™џџ™џџ™џџ™џџ™юџџџ™Ќџ™џџ™џџ™џЦxџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џє’џџ™џџ™џџ™џџ™џџ™џл„џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ! џї”џџ™џџ™џџ™џџ™џЎhEџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ|Jpџџ™џџ™џџ™џџ™џџ™џџ˜*џ€џ™эџ™џџ™џџ™џ…Rџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ•[џџ™џџ™џџ™џџ™џџ™џџ™џR4џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ bџџ™џџ™џџ™џџ™џwGtџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџD) џџ™џџ™џџ™џџ™џџ™џџ™dџ—1џ™џџ™џџ™џџ™џD,џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ& џј•џџ™џџ™џџ™џџ™џџ™џНsџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ3"џў˜џџ™џџ™џџ™џ“X\џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ Ьџџ™џџ™џџ™џџ™џџ™џџ™џ˜rџ™џџ™џџ™џњ–џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џš^џџ™џџ™џџ™џџ™џџ™џџ™џ;'џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џМrџџ™џџ™џџ™џъŒџ вџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџњ–џџ™џџ™џџ™џџ™џџ™зџ™Џџ™џџ™џџ™џжџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ' џљ•џџ™џџ™џџ™џџ™џџ™џВlџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ`<џџ™џџ™џџ™џџ™џe=„џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ;#Јџџ™џџ™џџ™џџ™џџ™џџ™ўџ™џ™нџ™џџ™џџ™џЊgџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ›_џџ™џџ™џџ™џџ™џџ™џў˜џ6$џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џё‘џџ™џџ™џџ™џе€$џйџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ Ьџв~&џџ™џџ™џџ™џџ™џџ™џџ™џџ˜9џ• џ™ўџ™џџ™џџ™џƒQџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ% џі”џџ™џџ™џџ™џџ™џџ™џЋhџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЂcџџ™џџ™џџ™џџ™џH+œџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџЮџШx/џџ™џџ™џџ™џџ™џџ™џџ™џџ™іџœџ›8џ™џџ™џџ™џџ™џlCџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ‹Uџџ™џџ™џџ™џџ™џџ™џќ—џ1!џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џS5џџ™џџ™џџ™џџ™џ­hFџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ ЯџХv2џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ˜aџ™џџ™џџ™џџ™џW7џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џьŽџџ™џџ™џџ™џџ™џџ™џЏjџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џі”џџ™џџ™џџ™џѕ“ џ бџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ аџТt4џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™оџŽ џ˜|џ™џџ™џџ™џџ™џB+џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џtHџџ™џџ™џџ™џџ™џџ™џў˜џ=(џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЗoџџ™џџ™џџ™џџ™џU3‘џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџХџЭ{+џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Kџ˜•џ™џџ™џџ™џџ™џ;'џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џз‚џџ™џџ™џџ™џџ™џџ™џОsџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џtHџџ™џџ™џџ™џџ™џЇdKџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ*Жџр†џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜šџ™Џџ™џџ™џџ™џџ™џ<'џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џH.џў˜џџ™џџ™џџ™џџ™џџ™џJ/џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ=(џџ™џџ™џџ™џџ™џѓ’ џеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџB(Ђџяџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™кџ• џšФџ™џџ™џџ™џџ™џ<'џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЈfџџ™џџ™џџ™џџ™џџ™џЮ|џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џѕ“џџ™џџ™џџ™џџ™џ8"ЊџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџиџyIsџћ—џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ѓџ™-џ™Ъџ™џџ™џџ™џџ™џD,џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ! џё‘џџ™џџ™џџ™џџ™џџ™џf@џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џФvџџ™џџ™џџ™џџ™џsExџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ ШџЗn>џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ўџšVџ™аџ™џџ™џџ™џџ™џX8џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џjBџџ™џџ™џџ™џџ™џџ™џч‹џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ™]џџ™џџ™џџ™џџ™џЂaPџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџB(Ђџф‰џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™qџ™жџ™џџ™џџ™џџ™џmDџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џКqџџ™џџ™џџ™џџ™џџ™џ‰Tџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џoEџџ™џџ™џџ™џџ™џЬz,џкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ Ыџœ^Uџў˜џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜|џ™еџ™џџ™џџ™џџ™џ„Qџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ% џ№џџ™џџ™џџ™џџ™џі”џ) џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џF-џџ™џџ™џџ™џџ™џьŽџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџU3‘џч‹џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜|џ˜Чџ™џџ™џџ™џџ™џЋhџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џc>џџ™џџ™џџ™џџ™џџ™џЖnџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ$ џџ™џџ™џџ™џџ™џў˜џеџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ2ЏџЛp:џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ќџ™dџ˜Иџ™џџ™џџ™џџ™џеџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЃcџџ™џџ™џџ™џџ™џџ™џW7џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џњ–џџ™џџ™џџ™џџ™џ Шџкџкџкџкџкџкџкџкџкџкџкџкџкџкџкџ!ОџЅcMџ§˜џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ьџ˜Hџ™Њџ™џџ™џџ™џџ™џљ•џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џжџџ™џџ™џџ™џџ™џтˆџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џс‡џџ™џџ™џџ™џџ™џХџкџкџкџкџкџкџкџкџкџкџкџкџкџ'Йџ™\Wџј•џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Ьџ— џ™”џ™џџ™џџ™џџ™џџ™џC+џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ1!џє’џџ™џџ™џџ™џџ™џXџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џШyџџ™џџ™џџ™џџ™џПџкџкџкџкџкџкџкџкџкџкџкџ=%ІџАjDџ§˜џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ћџšˆџ’џ™qџ™џџ™џџ™џџ™џџ™џOџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џY8џ§˜џџ™џџ™џџ™џњ–џ4"џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЙpџџ™џџ™џџ™џџ™џN/—џкџкџкџкџкџкџкџкџХџtFwџв~&џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Яџš5џ˜Mџ™џџ™џџ™џџ™џџ™џПtџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џNџџ™џџ™џџ™џџ™џХwџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЉgџџ™џџ™џџ™џџ™џв~&џ ЬџкџкџкџкџТџd<…џЖm>џќ—џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ъџ™gџЊџ™(џ™џџ™џџ™џџ™џџ™џј•џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џІeџџ™џџ™џџ™џџ™џg@џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џš^џџ™џџ™џџ™џџ™џџ™џо…џuFvџY5ŽџŠSdџв~&џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ђџšˆџŸџ™џ™ѕџ™џџ™џџ™џџ™џџ™џf@џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џНsџџ™џџ™џџ™џьŽџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ“Zџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™уџšyџ™џ˜Тџ™џџ™џџ™џџ™џџ™џКqџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЦxџџ™џџ™џџ™џЅeџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ‘Yџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ћџ™ЗџšVџ™џšˆџ™џџ™џџ™џџ™џџ™џћ—џ$ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џа~џџ™џџ™џџ™џP3џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џWџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ќџ™Мџšeџ”џ˜Oџ™џџ™џџ™џџ™џџ™џџ™џ‰Tџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЬ{џџ™џџ™џтˆџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џXџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™ыџ˜Ўџ™iџ›џ џ™јџ™џџ™џџ™џџ™џџ™џъџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џТvџџ™џџ™џš^џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ—\џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™фџ™Ѕџ˜hџ˜*џџџšЕџ™џџ™џџ™џџ™џџ™џџ™џlCџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЖnџџ™џў˜џG.џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џŸaџџ™џџ™џџ™џџ™џџ™џџ™џџ™ѓџ™“џ˜hџ—@џžџ™gџ™џџ™џџ™џџ™џџ™џџ™џу‰џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ‘Yџџ™џл„џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЋhџџ™џџ™џџ™џџ™џџ™џџ™џџ˜Гџ›џ™њџ™џџ™џџ™џџ™џџ™џџ™џuIџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џf@џј•џXџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џУvџџ™џџ™џџ™џџ™џџ™џџ™џџ™“џ™Ќџ™џџ™џџ™џџ™џџ™џџ™џыџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ?)џм„џ=(џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џл„џџ™џџ™џџ™џџ™џџ™џџ™џџ™pџ˜Eџ™џџ™џџ™џџ™џџ™џџ™џџ™џœ_џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ€Oџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џѓ’џџ™џџ™џџ™џџ™џџ™џџ™џџšDџџџ™йџ™џџ™џџ™џџ™џџ™џџ™џ§˜џ@*џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ›џ˜hџ™џџ™џџ™џџ™џџ™џџ™џџ™џжџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ/ џџ™џџ™џџ™џџ™џџ™џџ™џџ™ъџЊџ™пџ™џџ™џџ™џџ™џџ™џџ™џџ™џ›_џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џH.џџ™џџ™џџ™џџ™џџ™џџ™џџ˜Нџ˜cџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џX8џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џtHџџ™џџ™џџ™џџ™џџ™џџ™џџ™‡џ€џ™иџ™џџ™џџ™џџ™џџ™џџ™џџ™џё‘џ1!џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЂcџџ™џџ™џџ™џџ™џџ™џџ™џџ˜Oџ˜Cџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џм„џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џа~џџ™џџ™џџ™џџ™џџ™џџ™џџ›џ˜Єџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џСuџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џј•џџ™џџ™џџ™џџ™џџ™џџ™оџ›џ™юџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џВlџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ7$џџ™џџ™џџ™џџ™џџ™џџ™џџ™ џšSџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џЈfџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џhAџџ™џџ™џџ™џџ™џџ™џџ™џџ˜\џ˜•џ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џЉgџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЉgџџ™џџ™џџ™џџ™џџ™џџ™џџ—џŸџ™Юџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џИpџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џьŽџџ™џџ™џџ™џџ™џџ™џџ™еџ— џ™цџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џЧxџ  џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ>(џџ™џџ™џџ™џџ™џџ™џџ™џџ˜џ™-џ™№џ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џф‰џ>(џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џƒQџџ™џџ™џџ™џџ™џџ™џџ™џџ˜CџšGџ™њџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џї”џjBџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џШyџџ™џџ™џџ™џџ™џџ™џџ™яџ™џšSџ™љџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џЏjџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ( џ§˜џџ™џџ™џџ™џџ™џџ™џџ™Ѕџ˜Jџ™іџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џцŠџO2џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ…Rџџ™џџ™џџ™џџ™џџ™џџ™џџ˜Wџ™Aџ™ѓџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ­iџ% џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џтˆџџ™џџ™џџ™џџ™џџ™џџ™іџ џ™-џ™нџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џѓ’џ{Lџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џO2џџ™џџ™џџ™џџ™џџ™џџ™џџšЋџ”џ™Лџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џхŠџmDџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џЎjџџ™џџ™џџ™џџ™џџ™џџ™џџšSџ€џ™‰џ™§џ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џо†џqFџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ3"џќ—џџ™џџ™џџ™џџ™џџ™џџ™ёџŽ џ˜>џ™нџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џ№џŽWџ* џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џГmџџ™џџ™џџ™џџ™џџ™џџ™џџšЁџ• џ™™џ™ўџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џў˜џУvџhAџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џA*џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Aџš5џ™Хџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џі”џИpџoEџ( џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џТuџџ™џџ™џџ™џџ™џџ™џџ™џџ™оџ€џ€џ™_џ™хџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џз‚џŸaџg@џ0 џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џƒQџџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™}џ• џ™sџ™хџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џѓ’џЭ|џЇfџNџa=џH.џ2!џ џ џ џ џ џ џ џ џ џ" џ;'џT5џnDџŠUџЯ}џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™§џ™џ’џ™dџ™кџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џђ’џяџяџї”џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™Жџ€џ™Kџ˜Ўџ™њџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ˜Jџ—џštџ™вџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™лџ€џ™#џ™qџ™Оџ™ћџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™qџœџšSџ™џšЩџ™ћџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™єџŸџ™ џ—@џštџšœџ™Цџ™юџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™џџ™˜џ•џ›=џ˜Wџ™pџ™Šџ™Ђџ™Мџ™Ьџ™вџ™нџ™шџ™юџ™§џ™ђџ™юџ™юџ™ъџ™нџ™мџšЩџšЕџ™Ђџ™Žџ™{џ™fџšQџ—џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№џџџџџџџџџџџўџџџџџџџџџџџрџџџџџџџџџџџџџџџџџџџјџџџџџџџџџрџџџџџџџџџ€?џџџџџџџўџџџџџџџќџџџџџџџјџџџџџџџ№џџџџџџџ№џџџџџџ№?џџџџџџ№џџџџџџ№џџџџџџ№џџџџџџ№џџџџќџџџџјџџџџјџџџџјџџџјџџџ№?џџџ№џџџџџўџџќџџќџџјџџ№џџрџџрџџРџџ€џџ€џџџўў?ќ?ќјј№№№рррРРРРР€€€€€€€?€€џ€џ€џ€џ€џ€џ€?џ€џџ€џџ€џџ€џџРџџРџџџРџџџРџџџџрџџџџрџџџџџрџџџџџ№џџџџџ№џџџџџ№џџџџџјџџџџџјџџџџџќџџџџџќџџџџџўџџџџџџџџџџџџџџџџџџ€џџџџџџРџџџџџџРџџџџџџрџџџџџџ№џџџџџџјџџџџџџќџџџџџџўџџџџџџџџџџџџџџ€?џџџџџџџР?џџџџџџџр?џџџџџџџјџџџџџџџќџџџџџџџџџџџџџџџџ€џџџџџџџџџрџџџџџџџџџјџџџџџџџџџўџџџџџџџџџџРџџџџџџџџџџјџџџџџџџџџџџџџџџџџџџџџџ№џџџџџџџџџџџџРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‰PNG  IHDR\rЈf IDATxœэw˜Хж‡пъ™й@ZвK’ ˆ’$( Ј ""ŠфЪЎ ,\Џс3\цŒŠЛ€ˆˆ  € J2! HI’AXтІ™щњўX@ТюNwOїФzŸ‡‡0uЊŽыдЏЋЋN …BЁP( …BЁP( …BЁP( …BЁP( …BЁP( …BЁP(Ђ n0A–ф(ЅqQe№QюŸІ б єrŽŸ#Иёуч~rёs˜!тˆ“ю+B‡€h@JС8ваЉ‰ŸъЊ•J@*PёФя€В8џџU‡Nќ:FВНшьvћьУЧ.JАŸ;DЎУ>),  R˜"ШЂ’zъ#8I= P HГ‡СВъ+!ˆ,м›(lg”Ќ†‹&ш4AЃ)’Цdqр9%Щ2œ:B МєЦ‡лХпЈ€гŒЅps1‚цHšWЕУэV˜ј•tб,мN(ўF €нŒЅ№аш\Є%р ГW‘ƒфrŠХсvCQ€z–ЁвM­Ю@'рb$Ў0{Йю”Dj`…БВ<~К"ЙAG \И]Š"ђёqƒХžp;ЂP+уŒ’•аИ И?Wqњ†Т Ищ<nGjP<#d)\tGу_HЎЕДЗ‰@mв…7мŽФ;jp6CЅFЎAаИ(ƒGrсІ‚›)сv$оQp’q2/w€Ксv'ц‘ F @иQЏ™В0ИH Г7ё…FSњ‹Uсv#ž‰ЯРPЉQ•nРHк„лИХЯнЌИa"ОVёіwч‡л;yЧGvCюБ‚Пч*јР› оœџv4 ™Xм‰P™P\d‰В Й!Љ 29%TngUI‡C5 тLтc0\&’ШdёP3мю˜EdDьYЖoт№.Фб}ˆ#{Чіќ~dяЉIn юDdJВLВlUd™*Ш”jШ2UаSЊ"+жF–­nЧH%€^@І)Ьл+€ЁвMњ!јP#мюBк‰Ж{-boСdзіm@ьY8~ мЎƒL­‹ЗM:О+€+ЈHч%Є‹жvљЅ0Gь Рhy3’ ТэJЁјНh;WЁm]‚kыД-?!эЗWІбkЕ"ЏпTdЩ ж;4b€XkŸW ЃФžŒ‘­бyИ<мЎœп‹kѓhцукђкіхŸnЏlAЏе’м{О.иCА‚`ФіzЅ0Bь@A|ўSРн`(х•уˆcћq§6зoГбжƒШ;n—У{уѓxЏњЏUѓ}@uzЂ_ІHY Є Ж<ь—rДнkq­љзкYhўRЗK!A&–&їБUШв•Ќu шЮ1н^Џˆn%стнwюУ†ШЮТЕr:юe“аЖФяMW_ЋОфїiЭXђ%EW{=R": SzмрiТНчЭХЕf&юŸ'сZџ шОАИQмћПCЏ~БknЮу.БЫnЗE}qcdt&"hŽсЕНПуўnЎхS k#u<3‡’—>УŠЕ/З/ль•ЂЂg Ѕ`4§7( )кцёЬ†ыЗй еѕРтШНozЭK­˜Ў&]4БлEбD‡ŒUp1AЇŽыЫУНтSмѓпDл­ŽЉтox=y§ІZ3V1!%ђ_ЦШ+бљH е"яю…oуў>qlЈ†\ПЭBлЙНZS+цН€'lvIQq^^(R 2хшЬ'T“п›ƒgсp’žНЯьчдфЗŠ”xцНnб–^і:Ѓ(ŽШ|˜ K’Ыx$џЩx~/ю%№Ь} qXmBл‚ц&чЩuШ”Њцm%-(~Жп)ХйDо `”ЌFп†dђKї/“ќR3ІQ“пNtюХуЌй Е ‘ЕШM|NЎьj;W’№ЩбЖ.uzЈИE–ЎLЮ“ыСmКЌс.vSƒЁ">Т(УHфЌ2фѕ~РсЩ/r0эA’†]Љ&ПУˆЃ{q­њЬŠiUЊЉLMЁ 2`Дь`PвБ1ЄФ§ЫЧ$Нp1юяFюwl(ХпИzЯšЁ_Н„‚№ПdШћМцЄ/кўxІ СѕЧЗN Ё( Ё‘ѓфzdйjf-їА›jъ5РYТЛ-ŸD№:N~їЯ“HzНšќсBъИ—[Ъў]…jсНф„O2фУHžvЊ{ql?‰c{№aШ;юд0 И–}hЭаЯіzЂ8›№@ІŠр%ЇКw­™IвЫ—тZћ•SC(L эY‡ЖkЕyCЁРiB/ђaр)GњЮ;NТ”{H|З'ти_Ž ЁА†ызOЌ˜5$CжГлХп„V2ф]^tЂkq` IУЏЖ|Ђpзš™VMU’ dШn2p`УЯЕa~СЙўЎ5vw­А mЯ:Ф_›-*p’а@†МС$И}шY№‰™7!ВГьюZa3–V’+Щ”эїFЁ€QВ‚™иФ#?›„юРѓљџTPO”`ё5Р… ГнО( pV†Ы2h|XL[8тш^’оюhѕ|Y&\[[KЃ&щbП7 pRЄ$2hdgЗ›}аvЌАГ[E(а}hжВЎfЈŒŒАѕУЙj&aѓЎЖk IУ;XлLRD#2SЉž$АБŽ3!ЏA0дЮ.Е-‹I|ЇтШ;ЛU„mУBk†‚Ж:Ђœ€weU.ЛКt­›CRЦзМWD-коuVS­)p{@JБ€mЧ6Ўе_јю­1SH3ю‘mу"+–m.УS&†БWFs?иwdуњ}‰њ‚_еŒŒ%\›ДbV‚ZйэKМcŸŒ‘M€чэъNлќ#‰уz/ЯЎ.‚іЇХ|ŸjРvь€ЁвЮЛиTЇOлЙŠФБ=дВ?Fбv­Ж*ьзиэKМcЄq?`Љдйh{ж‘8ъЕсЫјђбvЎВbй’ вЙДqqH№Pp]shа§та3К"ŽАЃ;Ecё5РMЎ=EvЌо’ƒюХ›Cт{З!яо#EФЃ§љ‹5CЩeіzп'W|ƒ/и)%‰“XџR(ЂЫЁм‚жіzпX€їd‚av8с™ћЎгьшJ%hmВvМ+•и‰u№rP'X\+gр™cлщЁ"Z№хˆ€y*3R§НS`Mо‘<єрЛV“8yHlWŠ(DьYgЭаЅVvaM<< Є5r~6 яїQ)ЛуmЯzЋІj#а&Ь РYьР 3BлЗ!иnQŒЖзт ЕА ѓрт )˜A]Ћ>УНиbЭ8EЬ іZ~4aŠ4]rXq.ц SІ!И3˜ХЁ$|єBˆƒлЌš&ХvњЏ˜]<@0OЉ“0ё.•СW”jЙGЌK{SЭХ+Ц`Є,Є3˜gб;И6}LŠCќгЂЁ;0.nюJYHкgЖ:яЗŒ%w'Y•#аŒ РщBђŸ`J˜і ф І‹јDsуkбмAэЛF,"kЛUS%6`Lq#Pлъ ЎЕГp­ўТЊyм"+д"їю9“Ф›nwСђ+œЧpYЦN_тc ёюŸŸMТД,›Ч+ўf=Щ}p1кюЕVSiG„hhЇ/ёH`!k“ŠЩ3їЅ`Ž{тФRфїCоэяAю<Ÿ?nEdДnЌЉР` \ЌгM,ІјЖтYєЖгИDVЈM^П)шU. aЪDоб0{х,A%‘œoŸ'ёIё+)№oЋ{цМО|Ћцq…Пю•фоЗшдфwџ<зК9aіЪy‚Ьўdy_JQ@ё+€ Z YSYБo#ю_>ЖфTМсЛьNђo.ти_x>{$Ь^…ˆcc]Ы&/т–т@аУjЧ Гžнgе<>амxЛ<…їъћЯјч„OюE71Ђ‘{Є 1Ш ё3I-›н‰;Š~RXmчJ\+Ї[v*%Ъ“7ш‹s&ПkеgИVЮ“Wa@J„ѕјTFHЫСiŠтV™4Gpž•N=_=Ѓ’|ƒ,S…МA_œzп?‰Ш9\0oxs­лКYAІ\ l@ВЋаYGКPхЄ PДnАвЁЖs%Ўпf[v(ж‘Љч“;№ dљšч|ц™ёт№Ў0xf‚ rЊ{т@ ŸLЙX…`АŒ$~ІPйgЮЂ8шŒ…‡ИћлQAИлшU“7№sdщJч|цZџ юЅУрUјО<+_ЕтHšMOuœƒLЙЩb` ?1@Ф}FšТo˜Œ“ЉxйƒЩыТтј’ŸЎм’.Fбk6'/}ВDљs?Ь;NђЋ-Ж†мЏH їўябk\ŽЁїѓЬCђ щТr\rДRј РЧ5XШф^E09–Фрмeў8™ \hЖЃxŠ^Л5ywMOбїј=ГžEлћ{НŠLЄАЇHЕƒИ€v†{Ш”_“!ћ0L_3Ьœћ“ЯЇ5&%YнЋR}†^Еy§?…ФЂ+Yk;WтYєNНŠ`\яЄE. ‚ї)Щ2х;Œ–‡л)Ћœ+‚цf;q­˜Кп‡ЂНђф š‰L.[t#_> “XЋ‹K—M#ђР`$П’)2ZоТUџ1…­Нš™эФ§ы'6И§Шr5Ш0YЊbБэ< оDлЕ&D^EбЕ(ŠvH>!‹MdЪџcЌ,фМ7ђ(LL­ФЁh[—ифNє"KW"w№ЌB#ќNGьп„чыWBфU” Х„œф<рќlcД|щФžZФrцOО ЧZU3ИVLSqџž$ђюќY!№ѕє„Oюйќ~–БpАьё\ГђsьX‰ляeOЙ,­пŽUЕZр A)…фaМ fДфЕH<=8ѓ'х9SmІƒ_?ЕЭ™ЈDђ{BЏе*`Sї/скА NE2ЩxnOMъє›ћ*ƒg>Kr!…e%•ai§vќxa6юТŸЉІПвvSъD%э!№ё2џSчЬнўLй˜bи8;‹фЧkЦѕ9ЖїкG№v~"`;‘Eв‹—“3fЩ~i_Б'&Їѓќ„~єјс]У}oЌкљMК2Џi7Vжn… }…Пѓ‡‡cUPOІќŠ1Вz(ў[†ЫDLjПЫЇšЗЫг†vќФСmxОyЭaЂYВ‚ЁvI!8:­Еo#|/п>\ƒЧІќ—ЊB^аІ3:+-{‡jРП ™TLфpmYь„?Псѕxл1м>aЦУѓWЪƒB–5іњЪхyЉм#єїп`цгžйƒњЁ§ЮїЅ$‹Щ”Ž2ќ-.Œ­ХNю Љ*†—‡М>яžЮЋ0|љЊ ЊAŒ €+Œ—Э4ЉsнђOјќ™ІМ5К'Еі†lOЇ)АŒLйХЉN_ђОМ Žэ›Тљ7<‹^ЛЕсіžo іmtаЃиAІ{pGРЭIMъtўe*Г†6фЙ‰H=М;У–>'S>uЂTŸ­ќ-:ЦЂ1mOќ<§§nРзюnУэеЦŸ9tƒ{хFN•KїбѓЛ1|§D}}ѕ|(6(5`(cOІДTBЉИŽ 8д>бtїZ;}ˆXdЉTђoaјНдЦŸ)„0М XёШ^‡1O‰МcмїйуЬ~В7,›ŒpњTLвј”LixЎтt0Му/+€ќoМл:ЎusеЦŸ d™4№ћкU8yp’ЊџdиилxџkЈГ׸蘡)1‹сo‘Йђ\т!…ЕЏљ­ј›t3nрїт™ўsХ zкE ѕ№=Б‡жП/р‹g›rпg;ћZ i ,"S‹F+†г7 oГYг=т‘eЊрэўК)їїЃбіЋ?3Ш*ЦsЯжјkГƒžи‡Ч—Я ЏžчЫЇгjУB'‡КXРY9˜NN_ф5Gї3fФ“ЫШх ЗйYxцОф GБЩйХQ‹ЂtЮa*кщА7іRsџ&& ЛšЇ&пM ыеq:Г)YЯтє€сs–X^јZєЦпфFS6žйЯ!В:фQьЂ\œПћ7ч7и@HIя…#јђ™&ДўнБD0уbІе2щЇoZˆм#9•\lEІЄсНй\О>mяяИ4wG]AС €QинЇNеџкТј7:№рДGœŠgИ 7гOмч1…љW€:Е›ќУ‹Oч]žЋєохjY+ёl.иЙкaoœG“:цМЬЧЏДЁ–3AbHbДiПNћГЁoБ8›€ўF]№7Мо”kн\\ыПvШЃиFЏa<ћќ%›CёЬЉŽЦ[—1уЙft[т@)xI2хݘ˜пˆХЇ]B ђo~еœюУѓй#Юјј ^ЉNЮ;Ю…лW8ьЭЙ8™9АDо1^w;OMŒЧgxян(Џ’!;mЌіЇИЭUээјВќyІlм?ŒUu§‚@ЏeьnEг-K"т€є^8’IЏЕ%-kЛнК|L†ЌgЄёщ{ЦB­Ђp7Ж8єдzІюјˆМcxцОшGq€' НКБrzЭ7§рА3сЅщ–%LО9-6кš_Г‚FB†OЯАЫNЂoїW‹.п]юoХеmHЛбk6/Шl€жыч;ьMј)t?упьШ?~ggЗ! ј^ћЗИйЬКўДъісoжУЏK@A „{слyј .џSВГИєяі&2№јђyaТ]<ўёНіх> "C^W\“П ]xИyЌЩФRфпh~яљцUDоQ<ŠŒцTМbэ\КЯao"‹>ѓ‡ѓNFw’эЙQ*МЯ(YЉЈgч ˜с@Oбј:Pќэ IРhуЎfpYЉžщњ~bпFUуЯ&d™*xЏќ9!ИџЎIlЕГЯфz’YUЛЅqaVМL'@Э@_ГžІ3ь8…Зн=†nœчЛ‘ –DPРлщXвДнОВUщёШOЬhн„|Ÿ"uZ“oІЈфЛГџ)p™ 9AЇтš$ŽъŠkCx+ИШRЉф<Й<ЩІьDЮa’ŸЎ*MаШJѕШyhYа9#+кIыпPљаN рI—чIтhr ^WЧ“ЮЭ*ЌIв9‡IЪЯ&Щ›sъЯѕwЎсъU_Фd}СзКПФшN†ƒнv1€ъqF|‘МЉPМј[іЛјЎ`zђИ–МЏ&ПMфw~в–„Б{ЫVуГVџВl_ѕрŸtX1ƒ+зЬцв?ОГЏвN„1Ям1ыœГ'?iИIA>БBё5ъJBbЉ№M$O2О6,™КzпfgтНfsќMoлјѕv­ЅУŠt\1†.љЄ"[+зgSк…Ц $…nr€џˆ,2х| ш|Ю‰%ё5юŠћчЩЦВ_ГH3С'аЖ-CлЋbаƒFhфпєJH G )iВu)ЮЕ+ІSkя† ЬkjъщЏ“Р7…}`єџ#ŠРпЂwјРъгщ6{ŸјЎ`(ц?Xм~/­6,ЄУŠtXёйЉ=‚xфы‹M­Ж~хNБПАŒ РqІP’a@љЂšјыЕGЏжmgаЙЫMЁŸзТRВOМ9И~§Ф~‡т ™’†їњЇы?б›K›u_гiљЇ\НђsRTЈ6л+жсз:—7™жк˜м/rШ”яйF|э‡№a?уŽй€ЏMKvюUŸ!rльMќ‘пѓdR[ћLђцpљКoИю—Љ\ГђsJЋџOg0ЃѕэH3Џ[.Š,Вh<ŽзE~юЃ˜ип%џР3ы„й‘%ЪуЛИЛ%[з’ 6{ј›ѕ4\ъ+Щљй\Ж~з§2•Ž+fP2W•`/Š/ZZчГ(ў"…‹њаИє)чE—wqy№ЖЛ‡„щц“pZСзЊЅЃ?qpЎ?Ю‰‰P˜@–(OўЭСeёIЩЮтъ•ŸгiљЇДYї5‰Њђr@~­s[+з7c2ѓDНB1{“gХ рkеЯœйWvОЫюДdъ^:QEўIў?оДT!Њќб§tX1ƒNП~ЪeычЧd€Ž“LНТф+ЖрГт>6'Л™E›Ђгь&–Фwх@’Šо„@wЮfЈаŒ–0К{`IDAT@Э|mйО1tЮ7џ\|В=ŠXDЏйœќn/šВЉПs5Ÿ?{1н–LT“?>is'Йf^y%ѓш#ŽзФќЭ/у€b;•%ЪуыdЉ`!dйъ–7ŸдбŸudrYђњLPJч&sDW*нч gБ.4&Еdж,`ВEѓpЗ8ŒдЬ{Х@KiЙŒрkблк DПзЪb_‰E!љЗFVЈeЪlаWЯSэР6g|Š#5Оžэц мф‘HРвVц €WтЗlн фпшР>€јZZЛ(ткИаљЭЩХ{её7ъbЪІк­мОрэР {­Щ“5Сlю‡5Г&щb7№ПQлѓъuкX*ѕрZЁвO[СсЕxЛ 5mwџŒЧдбž ЌЌнŠeѕкš5ћШH#Ћ+аx˜@п{гЫЖ& ёЕМнšЁп‹kѕЖљ/ш5/%ЏяDгЙmћ….Ы }Шшќ?Г&йx1TзоКє[Œ дLOkhљМўKсkz“%SзцTЪo“шЉѕШ0ЭR†Ÿ‡І=„‚X‹иОє Њ6b~гiї>gА0t7пКžВ5ѓо№ В\ † Т~M$›<зš™AOШ2UШјВdгЖ]—NЂѕња$ˆ нф№йљQsqџ2№ыљI‚€‚Н€с§I*C~ЏQAпїЕАž%ЦЕіЋ ЦŽ'dRђвg ЫŸgкЖт‘Н<ё‘ЕЬЬŠ3йP­13[є2kЖƒђ…'џ(ŒрРЯ+@РхўњWсЛb хadj]є:Іr ŸBлНq`ЋхБу Oљ§І WmlЩќЉЩƒ){ќ€ЭNХ'ot{н|’лї‹‹§?›р  ~€Ё]ŠќЎЯЂW2u‘сОџВМ‚POƒ$” ЏпTќuЏДd~§ЯгiљЇ6;ŸЌЈгкl手ёf ‚€]М ќА'™ќоcЭWвмС?q­+6ZX’Мг№[Ќї˜–ЕЇ&[(ЩІ(”aнžЗbі§Фf ь€ЁBG2ИэЋзlnКrЏЏYOdйj–\yGбЖ.Еd/ШфrЬАќфO№хёNЦ-”;№MPa€ouцЇ„XŽа={` јŒ-?Мз>Œ~ОБ/›,_ЏЩЫ'ЇЃm\ъJ‘Ш”Њф љЦђў РS“яІёжe*тsyxЁЧ0+І{ЩХєEћ@чQ `ј!š›МЛІрП№ктЛЋrЙƒfZЪј{зяс­WЩш•{я|є*YюужяFгућ€с ƒLl?˜ЭжЊ%fˆШ3kdџ1j†Мјh)q­˜†ћЧБИЖ._h.єДFјZў пхw™КyVЩ/4Eь7ѕZјt ПЯћШфВ–ћhЙaуоъD‚ЯєїNQYЅ*rэГ8\ЂœYSЕщ/v˜5ДПЖwyF’Х]@рТхBрПф–‚фК‘w щIzвŸъўа5љ Сз~љ]Ÿ *Dћ‚Ћ9ъ&5љmфnЯY™ќг­L~Аћ8qy'ŠŠžы‰Лрidгфpm.2b|’P‚ќоc z1љkюпФИЗ:Q&;№лžТЋkЕ0ŸюыoŒ­И С~HЫKчvЂ)8…žZм{рЛдTFйsЈthупьHъ‘=6yІ№Й<МЬ–ЩпhлЯL~ѕJ5љmF СџњŒЕ:љ^ fђƒг0€уЗ“ьBлО<дCFВdђoM^џO‘eЊн_л5Гј`ие*ЪЯ&ЕФтзX5пJ9‚ЎЦыМ!м „4‡Ж§зP~NфJЬ§пŠ юMœNПЙЏ’9ЂЋ*гх[+зч•[^ЕофzŠ€Йa@aє;ШƒЦђ”йA<­єjMШПщУсеH№хёьФtn^l8Џ„Т~ЭЭџн1œ„VЛиШlЉm(>&CЖE№Ї‡‡w#тр˜JІЄсэќdA–dѓїЦ ЅЦ_›ykє­4кјrЇТ#ЏŒ•Е[Yя@№4C…-\B'љмO"-€Ќ%O-ДБНќ—Ie№ЕПoћ{-хы+Š›~њ€''пMЉм#ЖѕЉ8“•Е[1ВЫуСtёeэ[I‡V†ˆ-PїRвmЩ<:ѕuЖ"–жoЧ›нž ЎЩ л7ЗТ'љ $‘њ@Qщh$’{щ)ђЩ”†.Ў‹ƒл ?`Љ‚ˆC&—ХпВ7ОЫћYNœˆf›~ф‘OртЭ?9вПт\і•­Ъ}§&їоG‘ЕsXс€!"‘ђ4&#шtжЇЧ‘мsъG`Є Œv Š.ЊИ№_и _ѓ^јvЖѕ*єщдјk3N{„ы–‚Б^K'rШѕ$3№?ŸБ?%-иЎžbиi‡Og^€‚ДтpВ-$а˜JБїT;‰БsЯHZsy№зНг›№_мнжнќГI=В‡ўГ_ІїЂ‘x|A)L …рбОуXsоЅСvЕxЧ— %ќp’т[рл"?—јьиџn;‰%ё_p ўЦ7тoи9Ј4\F(t?w~§:З/x›ф(|ŠFtyТJUŸГбб@a.ЙŽ "Gcш‡ WП™X‘Ц•€шU›рoаНAќЕZƒ;СёaЋdэрŽoо зЗjт‡‘9Эnсэ†кбењ G7lЂGћ Еs'тЛь< -gI2цBЏжНNќu.GЏs9ВTjШ†oАc%НŽфІŸ&шЭ йИŠsYYЛ§ћ}ѓ=Яe' .нOће3щ;џ­UтUЯ†Њш7dV0їћO";ЙC8žt1z@ВУhў"™XŠмєЯHнmпыCІЄЁWn€ЌмНJƒ‚?Wk‚L*cЙЯ`Љxd/нчŸ‹2ЈІ žF ЛЫе џЏЌfѕ=›1Є‹дГ‹&иb&™ЌP›мћПЧГ№-м‹пCоuf—Y*™RYКВB-єђч!+дB–ЏU№{ˆŸъEсв§ДYї5н|Ž+fЈ§у`щTў}пзь.WУŽюЖ‘Чџйб‘œЭ h'CЅ›4цзWRGм†Ш>žФ‚‰ТwtЋ4кі 7.™H—eЉ,МЪбфњоїЧ}>tк3Hќ`GgFˆШ”ѓЋТэ†“ЄemчкхгшОx<n_nwХp49…;ямнў3yœtвtњбѓ PРФ ”=~€NЫ?Ѕл’‰4џу{­и>љ%ѓйƒѕ*И‰ЎРhйоZv‘–ЕЖkfqѕЊ/Иrэм~Чb=6уР“n.с.Б+pS{‰.Ш”kыхlУH=ыщИbзў:Fл~VOњ(ФЩяCаb‘]š!к^ ЎE ^ ЗFЉЗk-]—NЂуŠщднН.мю(‚`Jw ™eНŠOс<ЎЩбИ'SёВ (ТQs d0jhФ хјA†NЬѕ?Ќžє1РжЪѕЙsШlvTЌmgЗIЗлйЁYЂOFЫžH>ФžŒі;OќкьBВ;€-ьdC…NІœ,Е“’Х‡ЏЕЃўЮе6ИЇ7ЋjЕdРн_rАД­GЧK8ЮUм/rььд,бї 0@L!CюA№"pg й1 АВdЁŸјП$ћ‘ьРУЪАлD…ЦF=ўб5љc„ouцžSэя=ЭшмюЩбК8їdYr(рYЄ;tuђ=™D>ЧШДжОЬ~ВZз%Œ>l?˜ч{ОЯхБГлƒ@вED$ЎŒЮРщ\˜pќвЙ\ˆ8‹qће3ефrМю†ўsSЏшgwзЙHnf`dL~ˆТиђПЦўЭN{Ђp§eЊpЯРOX^Зн]ћќ‹tQtв›0 Р(ТиюП7‰?ЮАЎЦХ 4#им§…Ё#ЙtёЉн‹у:џљНšЁ…‚"‚B№aћСМ|ЫЋфy’lяФ@‘e—”Epž‘ЌФѓ›t%;Б%ђŽ9я“"h–Nхб>у‚-кQ:’С [}Хž’Вё€Є–‘f‡K–gD—'vFa?\и‘ЎOЌtjђћ‘єc ШpЂsЛ0Z›/О&“Iрy ›ЎЈ{UВvpбіиЎR­фЛyэц—zлHŽ'9PъCв‡т':З“ш#хИ0}tѓЦёРєGЉptŸ^),АЌ^[П}4[*_рдЧ‘єd јЪЉьD €FЫNHf[1-™{”ўs^сŽyoœwмnЯ9RЂ,Џt…ЉWєГ#coQьCpФ2ЇА%FШ”}ёСtQща.†|9”[~‡KЗ­МЛТГšїрЙ^Уйяlб˜@gв…ЉЈC €FЫ‘|fGWчяўЇ=ТеЋl-ѓЎ(„ еѓђ-Џђ]УГЫNкЮ\\ќ“~т гй#Œ•хёГАэИх†EќпД‡iКe‰]]*NАЗl5оКёІ_жПцј>їы”уazŠЈ\ж)0JІ|А§|Џљп3`ЮЫ\ЕъKЛЛŽ;rKђAћЛu§cNэюŸЮq$(&:=“(0ЪPЉ‘ЦрN'КoўЧї œѕ"mзЮR DLr,Љ “л d\Ч8PКR(†\ƒFOњ‹ЈOёЄР,™ђ>рUŠЁ8oпмОрmzќ№Ў:5Рв•˜дnЎЙзЎŠ<М‹dщ"&ЊЏ*АB†ьˆр} ЭЉ!RВГшўуxК/Я;V95LTВЕR=оНіAІ_ж—|wbЈ†нbЩ?-T†%V+ЫЃѓ’:=TН]kщігt_<žŠGі:=\D’яNd^гљЌѕэ,jдПТk,’щH2HФ\D—€`ЩнМTwz(—юЇея ИщЇ tZў)Щљ1Б -–?в.bЦe}˜кц.ВJU ѕ№{мЉ7љь@ €dЪHюA№8’ŠЂ)ЧrѕЊ/hЗfmж}MЪёЈ;‚.’ѕе›В Щ ЬМєV6„чzЕ&тх>юТс@ЈP`'cхyјyшEoZКt?n_СхыПсъ•_pёцХQ•–ЬЏЙYYЛѓ›veюХ7ГЕr§pКГИ—tJœ C^„рI Rˆ‡ќЪuХ#{ЙтЗЙ4йК”‹ў\Ю…лWDдыТбфVеjЩЪк­XYЛK.hOvјKБџ‰фвљ!тцV €“Œ– ‘ќ!А5ЕЌ\КŸ:{жг№Я_hД­рW=ы){мљеэоВеиžZ‡?в.:5с7Wi€."&Х_РЋчэHHгj”„‚1В:’Л‘ Bt`˜фќlЊиFZжvвВЖSхрvЊмFъснИt?eВГ(sMз)™w—пЧБф2d'–"'Ё$Ч’Ыp49…ьФRMNaGХкќ™Z—?SыВНb'RlйХ!$Џус-юGУэLИPJ&Ш’фвї„иZ`Na˜­F CК8ngТ€p1Z6nGвЈnwт€_ g“*|сv&RPn†ЩdJp ‚^@G@хЗ<#y‹tБ<мЮD"J"‰‘В7!ш \C7ЃСR$Ё1‰ў">C' Ђ RyGV ы€.H:хУэR„Гјј(кВђ„%бРщт­tAа‰‚ D•бЙ`вŽЮd‰5сv&QŒЅ№аЩ@рJ dзтТШ^р[р|ЬbАиn‡Ђ%БРY’уД@а As PŸш.ќ"MH–#ј˜)%Еc %БЪYŠ.AЇ p!PQЈIф ƒX‡рW`9:П’Я †ˆ#сv,жQo —‰xЈ‡ >5TвTCPЈЄи<ър А С6$[lУХ6tЖQŽэєљ6Љ0€ХЙdЪx(I.ЅЄ QAI$e”ВœL#аб9„‹CxЩ"CьрCEє\MT( …BЁP( …BЁP( …BЁP( …BЁP( …BЁP( …BЁˆ`ўЏRm…BЉЛIENDЎB`‚icedtea-web-1.8/win-installer/PaxHeaders.7406/LICENSE.rtf0000644000000000000000000000013213441742745017612 xustar0030 mtime=1552401893.145832603 30 atime=1552402157.289253364 30 ctime=1552410887.101183471 icedtea-web-1.8/win-installer/LICENSE.rtf0000644000175000002070000024442613441742745020436 0ustar00jvanekmock00000000000000{\rtf1\ansi\deff3\adeflang1025 {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Times New Roman;}{\f4\froman\fprq0\fcharset1 DejaVu Sans;}{\f5\fswiss\fprq2\fcharset1 DejaVu Sans;}{\f6\froman\fprq0\fcharset1 Times New Roman;}{\f7\fswiss\fprq0\fcharset1 Arial;}{\f8\fmodern\fprq0\fcharset1 DejaVu Sans Mono;}{\f9\fnil\fprq2\fcharset0 Droid Sans;}{\f10\fnil\fprq2\fcharset0 Arial;}{\f11\fmodern\fprq1\fcharset0 Droid Sans;}{\f12\fswiss\fprq0\fcharset1 FreeSans;}{\f13\fnil\fprq0\fcharset1 FreeSans;}{\f14\fmodern\fprq0\fcharset1 FreeSans;}} {\colortbl;\red0\green0\blue0;\red128\green128\blue128;} {\stylesheet{\s0\snext0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\kerning1\dbch\af10\langfe2052\dbch\af13\afs24\alang1081\cf0\loch\f6\fs24\lang1033 Normal;} {\s15\sbasedon0\snext16\ql\nowidctlpar\sb240\sa120\keepn\ltrpar\kerning1\dbch\af9\langfe2052\dbch\af13\afs28\alang1081\loch\f7\fs28\lang1033 Heading;} {\s16\sbasedon0\snext16\ql\nowidctlpar\sb0\sa120\ltrpar\kerning1\dbch\af10\langfe2052\dbch\af13\afs24\alang1081\loch\f6\fs24\lang1033 Text Body;} {\s17\sbasedon16\snext17\ql\nowidctlpar\sb0\sa120\ltrpar\kerning1\dbch\af10\langfe2052\dbch\af12\afs24\alang1081\loch\f6\fs24\lang1033 List;} {\s18\sbasedon0\snext18\ql\nowidctlpar\sb120\sa120\noline\ltrpar\i\kerning1\dbch\af10\langfe2052\dbch\af12\afs24\alang1081\ai\loch\f6\fs24\lang1033 Caption;} {\s19\sbasedon0\snext19\ql\nowidctlpar\noline\ltrpar\kerning1\dbch\af10\langfe2052\dbch\af12\afs24\alang1081\loch\f6\fs24\lang1033 Index;} {\s20\sbasedon0\snext20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033 Preformatted Text;} }{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67175426}}\deftab709 \viewscale110 {\*\pgdsctbl {\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Default Style;}} \formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc \pgndec\pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 \tab \tab GNU GENERAL PUBLIC LICENSE} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 \tab \tab Version 2, June 1991} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Copyright (C) 1989, 1991 Free Software Foundation, Inc.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Everyone is permitted to copy and distribute verbatim copies} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 of this license document, but changing it is not allowed.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 \tab \tab \tab Preamble} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 The licenses for most software are designed to take away your} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 freedom to share and change it. By contrast, the GNU General Public} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 License is intended to guarantee your freedom to share and change free} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 software--to make sure the software is free for all its users. This} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 General Public License applies to most of the Free Software} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Foundation's software and to any other program whose authors commit to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 using it. (Some other Free Software Foundation software is covered by} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 the GNU Library General Public License instead.) You can apply it to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 your programs, too.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 When we speak of free software, we are referring to freedom, not} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 price. Our General Public Licenses are designed to make sure that you} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 have the freedom to distribute copies of free software (and charge for} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 this service if you wish), that you receive source code or can get it} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 if you want it, that you can change the software or use pieces of it} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 in new free programs; and that you know you can do these things.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 To protect your rights, we need to make restrictions that forbid} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 anyone to deny you these rights or to ask you to surrender the rights.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 These restrictions translate to certain responsibilities for you if you} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 distribute copies of the software, or if you modify it.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 For example, if you distribute copies of such a program, whether} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 gratis or for a fee, you must give the recipients all the rights that} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 you have. You must make sure that they, too, receive or can get the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 source code. And you must show them these terms so they know their} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 rights.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 We protect your rights with two steps: (1) copyright the software, and} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 (2) offer you this license which gives you legal permission to copy,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 distribute and/or modify the software.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Also, for each author's protection and ours, we want to make certain} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 that everyone understands that there is no warranty for this free} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 software. If the software is modified by someone else and passed on, we} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 want its recipients to know that what they have is not the original, so} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 that any problems introduced by others will not reflect on the original} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 authors' reputations.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Finally, any free program is threatened constantly by software} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 patents. We wish to avoid the danger that redistributors of a free} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 program will individually obtain patent licenses, in effect making the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 program proprietary. To prevent this, we have made it clear that any} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 patent must be licensed for everyone's free use or not licensed at all.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 The precise terms and conditions for copying, distribution and} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 modification follow.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 \tab \tab GNU GENERAL PUBLIC LICENSE} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 0. This License applies to any program or other work which contains} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 a notice placed by the copyright holder saying it may be distributed} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 under the terms of this General Public License. The "Program", below,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 refers to any such program or work, and a "work based on the Program"} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 means either the Program or any derivative work under copyright law:} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 that is to say, a work containing the Program or a portion of it,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 either verbatim or with modifications and/or translated into another} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 language. (Hereinafter, translation is included without limitation in} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 the term "modification".) Each licensee is addressed as "you".} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Activities other than copying, distribution and modification are not} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 covered by this License; they are outside its scope. The act of} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 running the Program is not restricted, and the output from the Program} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 is covered only if its contents constitute a work based on the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Program (independent of having been made by running the Program).} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Whether that is true depends on what the Program does.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 1. You may copy and distribute verbatim copies of the Program's} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 source code as you receive it, in any medium, provided that you} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 conspicuously and appropriately publish on each copy an appropriate} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 copyright notice and disclaimer of warranty; keep intact all the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 notices that refer to this License and to the absence of any warranty;} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 and give any other recipients of the Program a copy of this License} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 along with the Program.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 You may charge a fee for the physical act of transferring a copy, and} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 you may at your option offer warranty protection in exchange for a fee.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 2. You may modify your copy or copies of the Program or any portion} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 of it, thus forming a work based on the Program, and copy and} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 distribute such modifications or work under the terms of Section 1} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 above, provided that you also meet all of these conditions:} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 a) You must cause the modified files to carry prominent notices} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 stating that you changed the files and the date of any change.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 b) You must cause any work that you distribute or publish, that in} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 whole or in part contains or is derived from the Program or any} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 part thereof, to be licensed as a whole at no charge to all third} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 parties under the terms of this License.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 c) If the modified program normally reads commands interactively} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 when run, you must cause it, when started running for such} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 interactive use in the most ordinary way, to print or display an} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 announcement including an appropriate copyright notice and a} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 notice that there is no warranty (or else, saying that you provide} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 a warranty) and that users may redistribute the program under} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 these conditions, and telling the user how to view a copy of this} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 License. (Exception: if the Program itself is interactive but} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 does not normally print such an announcement, your work based on} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 the Program is not required to print an announcement.)} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 These requirements apply to the modified work as a whole. If} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 identifiable sections of that work are not derived from the Program,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 and can be reasonably considered independent and separate works in} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 themselves, then this License, and its terms, do not apply to those} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 sections when you distribute them as separate works. But when you} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 distribute the same sections as part of a whole which is a work based} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 on the Program, the distribution of the whole must be on the terms of} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 this License, whose permissions for other licensees extend to the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 entire whole, and thus to each and every part regardless of who wrote it.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Thus, it is not the intent of this section to claim rights or contest} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 your rights to work written entirely by you; rather, the intent is to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 exercise the right to control the distribution of derivative or} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 collective works based on the Program.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 In addition, mere aggregation of another work not based on the Program} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 with the Program (or with a work based on the Program) on a volume of} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 a storage or distribution medium does not bring the other work under} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 the scope of this License.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 3. You may copy and distribute the Program (or a work based on it,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 under Section 2) in object code or executable form under the terms of} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Sections 1 and 2 above provided that you also do one of the following:} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 a) Accompany it with the complete corresponding machine-readable} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 source code, which must be distributed under the terms of Sections} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 1 and 2 above on a medium customarily used for software interchange; or,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 b) Accompany it with a written offer, valid for at least three} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 years, to give any third party, for a charge no more than your} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 cost of physically performing source distribution, a complete} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 machine-readable copy of the corresponding source code, to be} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 distributed under the terms of Sections 1 and 2 above on a medium} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 customarily used for software interchange; or,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 c) Accompany it with the information you received as to the offer} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 to distribute corresponding source code. (This alternative is} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 allowed only for noncommercial distribution and only if you} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 received the program in object code or executable form with such} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 an offer, in accord with Subsection b above.)} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 The source code for a work means the preferred form of the work for} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 making modifications to it. For an executable work, complete source} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 code means all the source code for all modules it contains, plus any} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 associated interface definition files, plus the scripts used to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 control compilation and installation of the executable. However, as a} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 special exception, the source code distributed need not include} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 anything that is normally distributed (in either source or binary} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 form) with the major components (compiler, kernel, and so on) of the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 operating system on which the executable runs, unless that component} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 itself accompanies the executable.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 If distribution of executable or object code is made by offering} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 access to copy from a designated place, then offering equivalent} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 access to copy the source code from the same place counts as} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 distribution of the source code, even though third parties are not} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 compelled to copy the source along with the object code.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 4. You may not copy, modify, sublicense, or distribute the Program} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 except as expressly provided under this License. Any attempt} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 otherwise to copy, modify, sublicense or distribute the Program is} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 void, and will automatically terminate your rights under this License.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 However, parties who have received copies, or rights, from you under} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 this License will not have their licenses terminated so long as such} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 parties remain in full compliance.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 5. You are not required to accept this License, since you have not} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 signed it. However, nothing else grants you permission to modify or} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 distribute the Program or its derivative works. These actions are} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 prohibited by law if you do not accept this License. Therefore, by} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 modifying or distributing the Program (or any work based on the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Program), you indicate your acceptance of this License to do so, and} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 all its terms and conditions for copying, distributing or modifying} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 the Program or works based on it.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 6. Each time you redistribute the Program (or any work based on the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Program), the recipient automatically receives a license from the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 original licensor to copy, distribute or modify the Program subject to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 these terms and conditions. You may not impose any further} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 restrictions on the recipients' exercise of the rights granted herein.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 You are not responsible for enforcing compliance by third parties to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 this License.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 7. If, as a consequence of a court judgment or allegation of patent} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 infringement or for any other reason (not limited to patent issues),} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 conditions are imposed on you (whether by court order, agreement or} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 otherwise) that contradict the conditions of this License, they do not} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 excuse you from the conditions of this License. If you cannot} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 distribute so as to satisfy simultaneously your obligations under this} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 License and any other pertinent obligations, then as a consequence you} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 may not distribute the Program at all. For example, if a patent} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 license would not permit royalty-free redistribution of the Program by} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 all those who receive copies directly or indirectly through you, then} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 the only way you could satisfy both it and this License would be to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 refrain entirely from distribution of the Program.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 If any portion of this section is held invalid or unenforceable under} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 any particular circumstance, the balance of the section is intended to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 apply and the section as a whole is intended to apply in other} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 circumstances.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 It is not the purpose of this section to induce you to infringe any} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 patents or other property right claims or to contest validity of any} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 such claims; this section has the sole purpose of protecting the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 integrity of the free software distribution system, which is} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 implemented by public license practices. Many people have made} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 generous contributions to the wide range of software distributed} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 through that system in reliance on consistent application of that} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 system; it is up to the author/donor to decide if he or she is willing} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 to distribute software through any other system and a licensee cannot} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 impose that choice.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 This section is intended to make thoroughly clear what is believed to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 be a consequence of the rest of this License.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 8. If the distribution and/or use of the Program is restricted in} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 certain countries either by patents or by copyrighted interfaces, the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 original copyright holder who places the Program under this License} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 may add an explicit geographical distribution limitation excluding} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 those countries, so that distribution is permitted only in or among} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 countries not thus excluded. In such case, this License incorporates} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 the limitation as if written in the body of this License.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 9. The Free Software Foundation may publish revised and/or new versions} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 of the General Public License from time to time. Such new versions will} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 be similar in spirit to the present version, but may differ in detail to} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 address new problems or concerns.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Each version is given a distinguishing version number. If the Program} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 specifies a version number of this License which applies to it and "any} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 later version", you have the option of following the terms and conditions} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 either of that version or of any later version published by the Free} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Software Foundation. If the Program does not specify a version number of} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 this License, you may choose any version ever published by the Free Software} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Foundation.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 10. If you wish to incorporate parts of the Program into other free} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 programs whose distribution conditions are different, write to the author} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 to ask for permission. For software which is copyrighted by the Free} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Software Foundation, write to the Free Software Foundation; we sometimes} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 make exceptions for this. Our decision will be guided by the two goals} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 of preserving the free status of all derivatives of our free software and} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 of promoting the sharing and reuse of software generally.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 \tab \tab \tab NO WARRANTY} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 REPAIR OR CORRECTION.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 POSSIBILITY OF SUCH DAMAGES.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 \tab \tab END OF TERMS AND CONDITIONS} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 \tab How to Apply These Terms to Your New Programs} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 If you develop a new program, and you want it to be of the greatest} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 possible use to the public, the best way to achieve this is to make it} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 free software which everyone can redistribute and change under these terms.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 To do so, attach the following notices to the program. It is safest} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 to attach them to the start of each source file to most effectively} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 convey the exclusion of warranty; and each file should have at least} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 the "copyright" line and a pointer to where the full notice is found.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 } \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Copyright (C) } \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 This program is free software; you can redistribute it and/or modify} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 it under the terms of the GNU General Public License as published by} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 the Free Software Foundation; either version 2 of the License, or} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 (at your option) any later version.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 This program is distributed in the hope that it will be useful,} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 but WITHOUT ANY WARRANTY; without even the implied warranty of} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 GNU General Public License for more details.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 You should have received a copy of the GNU General Public License} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 along with this program; if not, write to the Free Software} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Also add information on how to contact you by electronic and paper mail.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 If the program is interactive, make it output a short notice like this} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 when it starts in an interactive mode:} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Gnomovision version 69, Copyright (C) year name of author} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 This is free software, and you are welcome to redistribute it} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 under certain conditions; type `show c' for details.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 The hypothetical commands `show w' and `show c' should show the appropriate} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 parts of the General Public License. Of course, the commands you use may} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 be called something other than `show w' and `show c'; they could even be} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 mouse-clicks or menu items--whatever suits your program.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 You should also get your employer (if you work as a programmer) or your} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 school, if any, to sign a "copyright disclaimer" for the program, if} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 necessary. Here is a sample; alter the names:} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Yoyodyne, Inc., hereby disclaims all copyright interest in the program} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 `Gnomovision' (which makes passes at compilers) written by James Hacker.} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 , 1 April 1989} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\fs16\loch\f5 }{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Ty Coon, President of Vice} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033\rtlch \ltrch\loch\loch\f5 \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 This General Public License does not permit incorporating your program into} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 proprietary programs. If your program is a subroutine library, you may} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 consider it more useful to permit linking proprietary applications with the} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 library. If this is what you want to do, use the GNU Library General} \par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\kerning1\dbch\af11\langfe2052\dbch\af14\afs20\alang1081\loch\f8\fs20\lang1033{\afs16\alang1025\rtlch \ltrch\loch\fs16\loch\f5 Public License instead of this License.} \par }icedtea-web-1.8/win-installer/PaxHeaders.7406/installer.json.in0000644000000000000000000000013213441742745021310 xustar0030 mtime=1552401893.144832604 30 atime=1552402157.289253364 30 ctime=1552410887.101183471 icedtea-web-1.8/win-installer/installer.json.in0000644000175000002070000000301213441742745022114 0ustar00jvanekmock00000000000000{ "appName": "IcedTea-Web @PACKAGE_VERSION@", "versionMajor": "1", "versionMinor": "7", "versionMicro": "0", "versionPatch": "0", "vendor": "IcedTea-Web open-source project", "installDirName": "WebStart", "helpLink": "http://icedtea.classpath.org/wiki/IcedTea-Web", "productUuid": "03ae99a2-d9b6-46af-9841-c4b810289b1b", "updateUuid": "ff98de21-a283-40be-b0a5-74a6a4219de8", "vendorDirName": "IcedTeaWeb", "licenseFilePath": "../win-installer/LICENSE.rtf", "iconPath": "../win-installer/icon.ico", "topBannerBmpPath": "../win-installer/top_banner.bmp", "greetingsBannerBmpPath": "../win-installer/greetings_banner.bmp", "useFeatureTree": false, "featureId": "itw", "featureTitle": "IcedTea-Web", "featureDescription": "Free Software implementation of Java Web Start, originally based on the NetX project", "registryKeys": [ { "root": "HKCR", "key": "jnlp", "values": [ { "type": "string", "name": "", "value": "URL:jnlp Protocol" }, { "type": "string", "name": "URL Protocol", "value": "" } ] }, { "root": "HKCR", "key": "jnlp\\shell\\open\\command", "values": [ { "type": "string", "name": "", "value": "\"[INSTALLDIR]bin\\javaws.bat\" \"%1\"" } ] } ], "environmentVariables": [ { "name": "PATH", "action": "set", "part": "last", "value": "[INSTALLDIR]bin" } ] } icedtea-web-1.8/PaxHeaders.7406/metadata.in0000644000000000000000000000013213441742745015333 xustar0030 mtime=1552401893.025832852 30 atime=1552410887.104183464 30 ctime=1552410887.098183478 icedtea-web-1.8/metadata.in/0000755000175000002070000000000013441742745016220 5ustar00jvanekmock00000000000000icedtea-web-1.8/metadata.in/PaxHeaders.7406/icedtea-web.metainfo.xml0000644000000000000000000000013213441742745022104 xustar0030 mtime=1552401893.020832862 30 atime=1552402157.286253371 30 ctime=1552410887.098183478 icedtea-web-1.8/metadata.in/icedtea-web.metainfo.xml0000644000175000002070000000100413441742745022707 0ustar00jvanekmock00000000000000 %{name} epiphany.desktop firefox.desktop midori.desktop Java Browser plug-in implementation from OpenJDK. This plugin is running java applets http://icedtea.classpath.org/wiki/IcedTea-Web CC0-1.0 distro-pkg-dev@openjdk.java.net icedtea-web-1.8/metadata.in/PaxHeaders.7406/icedtea-web-plugin.pom0000644000000000000000000000013213441742745021572 xustar0030 mtime=1552401893.019832864 30 atime=1552402157.286253371 30 ctime=1552410887.098183478 icedtea-web-1.8/metadata.in/icedtea-web-plugin.pom0000644000175000002070000000061113441742745022400 0ustar00jvanekmock00000000000000 4.0.0 sun.applet %{name}-plugin %{version} icedtea-web-1.8/metadata.in/PaxHeaders.7406/icedtea-web-javaws.appdata.xml0000644000000000000000000000013213441742745023205 xustar0030 mtime=1552401893.020832862 30 atime=1552402157.286253371 30 ctime=1552410887.098183478 icedtea-web-1.8/metadata.in/icedtea-web-javaws.appdata.xml0000644000175000002070000000326213441742745024020 0ustar00jvanekmock00000000000000 javaws.desktop %{name} Java Javaws implementation from OpenJDK

Free java implementation of jnlp launching protocol.

Originally based on NetX,but now bringing many improvements compared to proprietary implementations.

Powerful debug console, internal appletviewer, safe run-in-sandbox option, extendable "remember me" options and custom policy editor.

It have also possibility to turn all security off and just enjoy legacy web (on your own risk). All via simple itweb-settings gui.

http://icedtea.classpath.org/wiki/IcedTea-Web CC0-1.0 distro-pkg-dev@openjdk.java.net т€‹ text/jnlp http://icedtea.classpath.org/wiki/images/Javaws_splash.png Itw self describing splash screen http://icedtea.classpath.org/wiki/images/Fullysigned.png Run in sandbox dialog http://icedtea.classpath.org/wiki/images/Policyeditor-in-use.png Simplified view of policy editor
icedtea-web-1.8/metadata.in/PaxHeaders.7406/icedtea-web.pom0000644000000000000000000000013213441742745020276 xustar0030 mtime=1552401893.025832852 30 atime=1552402157.286253371 30 ctime=1552410887.098183478 icedtea-web-1.8/metadata.in/icedtea-web.pom0000644000175000002070000000061413441742745021107 0ustar00jvanekmock00000000000000 4.0.0 net.sourceforge.jnlp %{name} %{version} icedtea-web-1.8/PaxHeaders.7406/NEW_LINE_IFS0000644000000000000000000000013213441742745015107 xustar0030 mtime=1552401893.018832866 30 atime=1552402157.283253378 30 ctime=1552410887.096183482 icedtea-web-1.8/NEW_LINE_IFS0000644000175000002070000000017113441742745015716 0ustar00jvanekmock00000000000000#!/bin/sh NEW_LINE_IFS=" " IFS_BACKUP="$IFS"; #echo "1xx""$IFS""xx" ; IFS="$NEW_LINE_IFS" ; #echo "2xx""$IFS""xx" ; icedtea-web-1.8/PaxHeaders.7406/html-gen.sh0000644000000000000000000000013113441742745015271 xustar0030 mtime=1552401893.019832864 29 atime=1552402157.28225338 30 ctime=1552410887.094183487 icedtea-web-1.8/html-gen.sh0000755000175000002070000001603213441742745016107 0ustar00jvanekmock00000000000000#!/bin/bash # html-gen.sh # Copyright (C) 2013 Red Hat # # This file is part of IcedTea. # # IcedTea is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # IcedTea is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with IcedTea; see the file COPYING. If not, write to the # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. # # Linking this library statically or dynamically with other modules is # making a combined work based on this library. Thus, the terms and # conditions of the GNU General Public License cover the whole # combination. # # As a special exception, the copyright holders of this library give you # permission to link this library with independent modules to produce an # executable, regardless of the license terms of these independent # modules, and to copy and distribute the resulting executable under # terms of your choice, provided that you also meet, for each linked # independent module, the terms and conditions of the license of that # module. An independent module is a module which is not derived from # or based on this library. If you modify this library, you may extend # this exception to your version of the library, but you are not # obligated to do so. If you do not wish to do so, delete this # exception statement from your version. ################################################################################ # This script is used by the stamps/html-gen target in Makefile.am. Its purpose # is to produce HTML-escaped and formatted documents from a set of plaintext # documents, namely AUTHORS, NEWS, ChangeLog, and COPYING, located in the # same directory as this script. These generated HTML documents are then used # in the netx About Dialog, which can be invoked with "javaws -about". # The only configuration option is the number of Changesets, and the files processed # are hardcoded. To run the script manually, create a directory "html-gen" in the # same directory as this script, containing files named AUTHORS, NEWS, ChangeLog, # and COPYING. Note that these files WILL be modified in-place during the HTML # "conversion" process. Setting the environment variable "HTML_GEN_DEBUG" to "true" # will enable some output from the script, which may be useful if you encounter # issues with this script's processing of an input file. # The number of Changesets to process into the ChangeLog can be set by setting the # environment variable HTML_GEN_CHANGESETS, or by passing an integer argument to # the script. The parameter will take priority over the environment variable. print_debug() { if [ "$HTML_GEN_DEBUG" ]; then echo "$1"; fi } CHANGESETS="$1" if [ -z "$CHANGESETS" ]; then CHANGESETS="$HTML_GEN_CHANGESETS"; fi if [ -z "$CHANGESETS" ] || [ "$CHANGESETS" -lt 0 ]; then CHANGESETS=10; fi NEWS_ITEMS=2 if [ -d .hg ]; then REPO_URL="$(hg paths default | sed -r 's/.*icedtea.classpath.org\/(.*)/\1/')" else unset REPO_URL fi start_time="$(date +%s.%N)" if [ ! -e html-gen ]; then echo "No html-gen directory, exiting. See Makefile.am for usage" exit 1 fi cd html-gen print_debug "Generating HTML content for javaws -about${REPO_URL:+ for }$REPO_URL. $CHANGESETS changesets, $NEWS_ITEMS news items" print_debug "Starting sed substitutions" for FILE in NEWS AUTHORS COPYING ChangeLog do print_debug "Processing $FILE..." sed -i -r 's/\t/ /g' "./$FILE" # Convert tabs into four spaces sed -i -r 's/\&/\&/g' "./$FILE" # "&" -> "&" sed -i -r 's/ /\ \ /g' "./$FILE" # Double-spaces into HTML whitespace for format preservation sed -i -r 's/ "<" sed -i -r 's/>/\>/g' "./$FILE" # ">" -> ">" sed -i -r 's_(\<)?(https?://[^ ]*)(\>| |$)_\1\2\3_i' "./$FILE" # Create hyperlinks from http(s) URLs sed -i -r 's/\<(.*@.*)\>/\<\1<\/a>\>/i' "./$FILE" # Create mailto links from email addresses formatted as sed -i -r 's/$/
/' "./$FILE" # "\n" -> "
" mv "$FILE" "$FILE.html" print_debug "$FILE.html finished." done print_debug "Done sed subs. Starting in-place additions" # Centre the column of author names in the Authors file sed -i '4i
' AUTHORS.html # Insert jamIcon above author names sed -i '5i
Jam Icon

' AUTHORS.html echo "
" >> AUTHORS.html if [ -n "${REPO_URL}" ]; then REVS=(`hg log -l"$CHANGESETS" | grep 'changeset:' | cut -d: -f3 | tr '\n' ' '`) fi print_debug "Done. Starting formatting (bolding, mailto and hyperlink creation)" for FILE in NEWS.html ChangeLog.html do print_debug "Processing $FILE..." mv "$FILE" "$FILE.old" COUNTER=0 while read LINE do BOLD=1 if [ "$FILE" = "NEWS.html" ] then if [[ "$LINE" =~ New\ in\ release* ]] then BOLD=0 COUNTER="$(( COUNTER + 1 ))" fi if [ "$COUNTER" -gt "$NEWS_ITEMS" ] # Cut to two releases then break fi else email_regex=".*\<.*\@.*\>" if [[ "$LINE" =~ $email_regex ]] # Matches eg , after HTML-escaping then BOLD=0 fi date_regex=[0-9]{4}-[0-9]{2}-[0-9]{2} cutLine=`echo $LINE | sed "s/&.*//"` # on some versions of windows, the & caused the [[ ]] command to fail if [[ "$cutLine" =~ $date_regex ]] # Matches line starting with eg 2013-07-01 then html_space="\ \ " if [ -n "${REPO_URL}" ]; then REV="${REVS["$COUNTER"]}" # Turn the date into a hyperlink for the revision this changelog entry describes LINE=$(echo "$LINE" | sed -r "s|($date_regex)($html_space.*$html_space.*)|
\1\2|") fi COUNTER="$(( COUNTER + 1 ))" fi if [ "$COUNTER" -gt "$CHANGESETS" ] # Cut to ten changesets then break fi fi if [ "$BOLD" -eq 0 ] # Highlight "New In Release" in News, and author name lines in ChangeLog then LINE="$LINE" fi echo "$LINE" >> "$FILE" done < "$FILE.old" rm "$FILE.old" print_debug "$FILE finished" done sed -i -r 's|(\*\ .*):|\1:|' ChangeLog.html # Underline changed files in ChangeLog, eg "* Makefile.am:" end_time="$(date +%s.%N)" print_debug "HTML generation complete" print_debug "Total elapsed time: $(echo "$end_time - $start_time" | bc )" icedtea-web-1.8/PaxHeaders.7406/tests0000644000000000000000000000013213441742745014310 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.104183464 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/0000755000175000002070000000000013441742745015175 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/PaxHeaders.7406/test-extensions0000644000000000000000000000013213441742745017464 xustar0030 mtime=1552401893.138832617 30 atime=1552410887.104183464 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/0000755000175000002070000000000013441742745020351 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/PaxHeaders.7406/net0000644000000000000000000000013213441742745020252 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.104183464 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/0000755000175000002070000000000013441742745021137 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/PaxHeaders.7406/sourceforge0000644000000000000000000000013213441742745022575 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.104183464 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/0000755000175000002070000000000013441742745023462 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/PaxHeaders.7406/jnlp0000644000000000000000000000013213441742745023540 xustar0030 mtime=1552401893.164832563 30 atime=1552410887.104183464 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/0000755000175000002070000000000013441742745024425 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/ServerAccess.java0000644000000000000000000000013213441742745027050 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.281253382 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java0000644000175000002070000011257413441742745027672 0ustar00jvanekmock00000000000000/* ServerAccess.java Copyright (C) 2011, 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ServerSocket; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.browsertesting.Browser; import net.sourceforge.jnlp.browsertesting.BrowserFactory; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.OutputController; /** * * This class provides access to virtual server and stuff around. * It can find unoccupied port, start server, provides its singleton instantiation, launch parallel instantiations, * read location of installed (tested javaws) see javaws.build.bin java property, * location of server www root on file system (see test.server.dir java property), * stubs for launching javaws and for locating resources and read resources. * * It can also execute processes with timeout (@see PROCESS_TIMEOUT) (used during launching javaws) * Some protected apis are exported because public classes in this package are put to be tested by makefile. * * There are included test cases which show some basic usages. * * */ public class ServerAccess { public static enum AutoClose { CLOSE_ON_EXCEPTION, CLOSE_ON_CORRECT_END, CLOSE_ON_BOTH } public static final long NANO_TIME_DELIMITER=1000000l; /** * java property which value containing path to default (makefile by) directory with deployed resources */ public static final String TEST_SERVER_DIR = "test.server.dir"; /** * java property which value containing path to installed (makefile by) javaws binary */ public static final String JAVAWS_BUILD_BIN = "javaws.build.bin"; /** property to set the different then default browser */ public static final String USED_BROWSERS = "used.browsers"; public static final String DEFAULT_LOCALHOST_NAME = "localhost"; public static final String DEFAULT_LOCALHOST_IP = "127.0.0.1"; public static final String DEFAULT_LOCALHOST_PROTOCOL = "http"; /** * server instance singleton */ private static ServerLauncher server; /** * inner version of engine */ private static final String version = "5"; /** * timeout to read 'remote' resources * This can be changed in runtime, but will affect all following tasks */ public static int READ_TIMEOUT = 1000; /** * timeout in ms to let process to finish, before assassin will kill it. * This can be changed in runtime, but will affect all following tasks */ public static long PROCESS_TIMEOUT = 10 * 1000;//ms /** * this flag is indicating whether output of executeProcess should be logged. By default true. */ public static boolean PROCESS_LOG = true; public static boolean LOGS_REPRINT = false; private Browser currentBrowser; public static final String UNSET_BROWSER="unset_browser"; /** * main method of this class prints out random free port * or runs server * param "port" prints out the port * nothing or number will run server on random(or on number specified) * port in -Dtest.server.dir * @param args params from commandline. recognized params are port and randomport * @throws java.lang.Exception if anything happens */ public static void main(String[] args) throws Exception { if (args.length > 0 && args[0].equalsIgnoreCase("port")) { int i = findFreePort(); System.out.println(i); System.exit(0); } else { int port = 44321; if (args.length > 0 && args[0].equalsIgnoreCase("randomport")) { port = findFreePort(); } else if (args.length > 0) { port = new Integer(args[0]); } getIndependentInstance(port); while (true) { Thread.sleep(1000); } } } /** * utility method to find random free port * * @return - found random free port * @throws IOException - if socket can't be opened or no free port exists */ public static int findFreePort() throws IOException { ServerSocket findPortTestingSocket = new ServerSocket(0); int port = findPortTestingSocket.getLocalPort(); findPortTestingSocket.close(); return port; } public static final String HEADLES_OPTION=OptionsDefinitions.OPTIONS.HEADLESS.option; public static final String VERBOSE_OPTION=OptionsDefinitions.OPTIONS.VERBOSE.option; /** * we would like to have an singleton instance ASAP */ public ServerAccess() { getInstance(); } /** * * @return cached instance. If none, then creates new */ public static ServerLauncher getInstance() { if (server == null) { server = getIndependentInstance(); } return server; } /** * * @return new not cached iserver instance on random port, * useful for testing application loading from different url then base */ public static ServerLauncher getIndependentInstance() { return getIndependentInstance(true); } public static ServerLauncher getIndependentInstance(boolean daemon) { String dir = (System.getProperty(TEST_SERVER_DIR)); try{ return getIndependentInstance(dir, findFreePort(),daemon); }catch (Exception ex){ throw new RuntimeException(ex); } } /** * * @param port specific port on which this server is accepting requests * @return new not cached iserver instance on random port, * useful for testing application loading from different url then base */ public static ServerLauncher getIndependentInstance(int port) { return getIndependentInstance(port, true); } public static ServerLauncher getIndependentInstance(int port,boolean daemon) { String dir = (System.getProperty(TEST_SERVER_DIR)); return getIndependentInstance(dir,port,daemon); } /** * * @param dir directory from which server returns resources * @param port specific port on which this server is accepting requests * @return new not cached iserver instance on random port upon custom www root directory, * useful for testing application loading from different url then base */ public static ServerLauncher getIndependentInstance(String dir, int port) { return getIndependentInstance(dir, port, true); } public static ServerLauncher getIndependentInstance(String dir) throws IOException { return getIndependentInstance(dir, findFreePort(), true); } public static ServerLauncher getIndependentInstanceOnTmpDir() throws IOException { File f = File.createTempFile("itwReproducers_", "_anotherDeployDir"); f.delete(); f.mkdir(); f.deleteOnExit(); return getIndependentInstance(f.getAbsolutePath(), findFreePort(), true); } public static ServerLauncher getIndependentInstance(String dir, int port, boolean daemon) { if (dir == null || dir.trim().length() == 0 || !new File(dir).exists() || !new File(dir).isDirectory()) { throw new RuntimeException("test.server.dir property must be set to valid directory!"); } try { ServerLauncher lServerLuncher = new ServerLauncher(port, new File(dir)); Thread r=new Thread(lServerLuncher); r.setDaemon(daemon); r.start(); return lServerLuncher; } catch (Exception ex) { throw new RuntimeException(ex); } } /** * * @return - value passed inside as javaws binary location. See JAVAWS_BUILD_BIN */ public String getJavawsLocation() { return System.getProperty(JAVAWS_BUILD_BIN); } /** * * @return - bianry from where to lunch current browser */ public String getBrowserLocation() { if (this.currentBrowser==null) return UNSET_BROWSER; return this.currentBrowser.getBin(); } public List getBrowserParams() { if (this.currentBrowser==null) return null; List l1=this.currentBrowser.getComaptibilitySwitches(); List l2=this.currentBrowser.getDefaultSwitches(); List l= new ArrayList<>(); if (l1!=null)l.addAll(l1); if (l2!=null)l.addAll(l2); return l; } public Browsers getCurrentBrowsers() { if (currentBrowser==null) return null; return currentBrowser.getID(); } public Browser getCurrentBrowser() { return currentBrowser; } public void setCurrentBrowser(Browsers currentBrowser) { this.currentBrowser = BrowserFactory.getFactory().getBrowser(currentBrowser); if (this.currentBrowser == null) { LoggingBottleneck.getDefaultLoggingBottleneck().setLoggedBrowser(UNSET_BROWSER); } else { LoggingBottleneck.getDefaultLoggingBottleneck().setLoggedBrowser(this.currentBrowser.getID().toString()); } } public void setCurrentBrowser(Browser currentBrowser) { this.currentBrowser = currentBrowser; if (this.currentBrowser == null) { LoggingBottleneck.getDefaultLoggingBottleneck().setLoggedBrowser(UNSET_BROWSER); } else { LoggingBottleneck.getDefaultLoggingBottleneck().setLoggedBrowser(this.currentBrowser.getID().toString()); } } /** * * @return - value passed inside as javaws binary location as file. See JAVAWS_BUILD_BIN */ public File getJavawsFile() { return new File(System.getProperty(JAVAWS_BUILD_BIN)); } /** * * @return - file pointing to itweb-settings deducted from passed inside * javaws binary location (JAVAWS_BUILD_BIN) */ public File getItwebSettingsFile() { String itwebSettings = "itweb-settings"; return getFileInJavawsDir(itwebSettings); } /** * * @return - file pointing to itweb-settings deducted from passed inside * javaws binary location (JAVAWS_BUILD_BIN) */ public File getIPolicyEditorFile() { String policyeditor = "policyeditor"; return getFileInJavawsDir(policyeditor); } private File getFileInJavawsDir(String file) { String javawsNameRoot = "javaws"; File dir = getJavawsFile().getParentFile(); String name = getJavawsFile().getName(); String nwName = name.replace(javawsNameRoot, file); return new File(dir, nwName); } /** * * @return port on which is running cached server. If non singleton instance is running, new is created. */ public int getPort() { if (server == null) { getInstance(); } //if (!server.isRunning()) throw new RuntimeException("Server mysteriously died"); return server.getPort(); } /** * * @return directory upon which is running cached server. If non singleton instance is running, new is created. */ public File getDir() { if (server == null) { getInstance(); } // if (!server.isRunning()) throw new RuntimeException("Server mysteriously died"); return server.getDir(); } /** * * @throws java.net.MalformedURLException if url for this resource can not be constructed * @return complete url for this resource on this server * @param resource relative path pointing to server resource. If non singleton instance is running, new is created. */ public URL getUrl(String resource) throws MalformedURLException { if (server == null) { getInstance(); } //if (!server.isRunning()) throw new RuntimeException("Server mysteriously died"); return server.getUrl(resource); } /** * * @return url pointing to cached server . If non singleton instance is running, new is created. * @throws java.net.MalformedURLException */ public URL getUrl() throws MalformedURLException { return getUrl(""); } /** * * @return whether cached server is alive. If non singleton instance is running, new is created. */ public boolean isRunning() { if (server == null) { getInstance(); } //if (!server.isRunning()) throw new RuntimeException("Server mysteriously died"); return server.isRunning(); } /** * Return resource from cached server * * @param resource to be located on cached server * @return individual bytes of resource * @throws IOException if connection can't be established or resource does not exist */ public ByteArrayOutputStream getResourceAsBytes(String resource) throws IOException { return getResourceAsBytes(getUrl(resource)); } /** * Return resource from cached server * * @param resource to be located on cached server * @return string constructed from resource * @throws IOException if connection can't be established or resource does not exist */ public String getResourceAsString(String resource) throws IOException { return getResourceAsString(getUrl(resource)); } /** * utility method which can read bytes of any stream * * @param is stream to be read * @return individual bytes of resource * @throws IOException if connection can't be established or resource does not exist */ public static ByteArrayOutputStream getBytesFromStream(InputStream is) throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int nRead; byte[] data = new byte[16384]; while ((nRead = is.read(data, 0, data.length)) != -1) { buffer.write(data, 0, nRead); } buffer.flush(); return buffer; } /** * utility method which can read from any stream as one long String * * @param is stream to be read * @param encoding encoding of this stream * @return stream as string * @throws IOException if connection can't be established or resource does not exist */ public static String getContentOfStream(InputStream is, String encoding) throws IOException { return FileUtils.getContentOfStream(is, encoding); } /** * utility method which can read from any stream as one long String * * @param is input stream to read from * @return stream as string * @throws IOException if connection can't be established or resource does not exist */ public static String getContentOfStream(InputStream is) throws IOException { return FileUtils.getContentOfStream(is); } /** * utility method which can read bytes of resource from any url * * @param u full url to read from * @return individual bytes of resource * @throws IOException if connection can't be established or resource does not exist */ public static ByteArrayOutputStream getResourceAsBytes(URL u) throws IOException { URLConnection connection = null; try { connection = u.openConnection(); if (connection instanceof HttpURLConnection) { ((HttpURLConnection) connection).setRequestMethod("GET"); } connection.setDoOutput(true); connection.setReadTimeout(READ_TIMEOUT); connection.connect(); return getBytesFromStream(connection.getInputStream()); } finally { if (connection != null && connection instanceof HttpURLConnection) { ((HttpURLConnection) connection).disconnect(); } } } /** * utility method which can read string of resource from any url * * @param u full url to read from * @return resource as string * @throws IOException if connection can't be established or resource does * not exist */ public static String getResourceAsString(URL u) throws IOException { URLConnection connection = null; try { connection = (HttpURLConnection) u.openConnection(); if (connection instanceof HttpURLConnection) { ((HttpURLConnection) connection).setRequestMethod("GET"); } connection.setDoOutput(true); connection.setReadTimeout(READ_TIMEOUT); connection.connect(); return getContentOfStream(connection.getInputStream()); } finally { if (connection != null && connection instanceof HttpURLConnection) { ((HttpURLConnection) connection).disconnect(); } } } /** * helping dummy method to save String as file in UTF-8 encoding. * * @param content which will be saved as it is saved in this String * @param f file to be saved. No warnings provided * @throws IOException */ public static void saveFile(String content, File f) throws IOException { FileUtils.saveFile(content, f); } /** * helping dummy method to save String as file in specified encoding/. * * @param content which will be saved as it is saved in this String * @param f file to be saved. No warnings provided * @param encoding of output byte representation * @throws IOException */ public static void saveFile(String content, File f,String encoding) throws IOException { FileUtils.saveFile(content, f, encoding); } /** * wrapping method to executeProcess (eg: javaws -headless http://localhost:port/resource) * will execute default javaws (@see JAVAWS_BUILD_BIN) upon default url upon cached server (@see SERVER_NAME @see getPort(), @see getInstance()) * with parameter -headless (no gui, no asking) * @param resource name of resource * @return result what left after running this process * @throws Exception */ public ProcessResult executeJavawsHeadless(String resource) throws Exception { return executeJavawsHeadless(null, resource); } public ProcessResult executeJavawsHeadless(String resource,ContentReaderListener stdoutl,ContentReaderListener stderrl) throws Exception { return executeJavawsHeadless(null, resource,stdoutl,stderrl,null); } public ProcessResult executeJavawsClearCache() throws Exception { return executeProcess(Arrays.asList(new String[]{getJavawsLocation(), OptionsDefinitions.OPTIONS.CLEARCACHE.option, ServerAccess.HEADLES_OPTION})); } /** * wrapping method to executeProcess (eg: javaws arg arg -headless http://localhost:port/resource) * will execute default javaws (@see JAVAWS_BUILD_BIN) upon default url upon cached server (@see SERVER_NAME @see getPort(), @see getInstance()) * with parameter -headless (no gui, no asking) * @param resource name of resource * @param otherargs other arguments to be added to headless one * @return result what left after running this process * @throws Exception */ public ProcessResult executeJavawsHeadless(List otherargs, String resource) throws Exception { return executeJavawsHeadless(otherargs, resource,null,null,null); } public ProcessResult executeJavawsHeadless(List otherargs, String resource, String[] vars) throws Exception { return executeJavawsHeadless(otherargs, resource,null,null,vars); } public ProcessResult executeJavawsHeadless(List otherargs, String resource,ContentReaderListener stdoutl,ContentReaderListener stderrl,String[] vars) throws Exception { if (otherargs == null) { otherargs = new ArrayList<>(1); } List headlesList = new ArrayList<>(otherargs); headlesList.add(0, HEADLES_OPTION); return executeJavaws(headlesList, resource,stdoutl,stderrl,vars); } /** * wrapping method to executeProcess (eg: javaws http://localhost:port/resource) * will execute default javaws (@see JAVAWS_BUILD_BIN) upon default url upon cached server (@see SERVER_NAME @see getPort(), @see getInstance()) * @param resource name of resource * @return result what left after running this process * @throws Exception */ public ProcessResult executeJavaws(String resource) throws Exception { return executeJavaws(null, resource); } public ProcessResult executeJavaws(String resource,ContentReaderListener stdoutl,ContentReaderListener stderrl) throws Exception { return executeJavaws(null, resource,stdoutl,stderrl); } public net.sourceforge.jnlp.ProcessResult executeBrowser(String string, AutoClose autoClose) throws Exception { ClosingListener errClosing = null; ClosingListener outClosing = null; if (autoClose == AutoClose.CLOSE_ON_BOTH || autoClose == AutoClose.CLOSE_ON_EXCEPTION){ errClosing=new AutoErrorClosingListener(); } if (autoClose == AutoClose.CLOSE_ON_BOTH || autoClose == AutoClose.CLOSE_ON_CORRECT_END){ outClosing=new AutoOkClosingListener(); } return executeBrowser(string, outClosing, errClosing); } /** * * @param resource relative resource to be opened in browser for current server instance. * @return result of browser run * */ public ProcessResult executeBrowser(String resource) throws Exception { return executeBrowser(getBrowserParams(), resource); } /** * * @param resource relative resource to be opened in browser for current server instance. * @param stdoutl listener for stdout * @param stderrl listener for stderr * @return result of browser run * */ public ProcessResult executeBrowser(String resource,ContentReaderListener stdoutl,ContentReaderListener stderrl) throws Exception { return executeBrowser(getBrowserParams(), resource, stdoutl, stderrl); } /** * * @param resource elative resource to be opened in browser for current server instance. * @param stdoutl listeners for stdout * @param stderrl listeners for stderr * @return result of browser run * */ public ProcessResult executeBrowser(String resource, List stdoutl, List stderrl) throws Exception { return executeBrowser(getBrowserParams(), resource, stdoutl, stderrl); } /** * wrapping method to executeProcess (eg: javaws arg arg http://localhost:port/resource) * will execute default javaws (@see JAVAWS_BUILD_BIN) upon default url upon cached server (@see SERVER_NAME @see getPort(), @see getInstance())) * @param resource name of resource * @param otherargs other arguments to be added * @return result what left after running this process * @throws Exception */ public ProcessResult executeJavaws(List otherargs, String resource) throws Exception { return executeProcessUponURL(getJavawsLocation(), otherargs, getUrlUponThisInstance(resource)); } public ProcessResult executeJavaws(List otherargs, String resource,ContentReaderListener stdoutl,ContentReaderListener stderrl) throws Exception { return executeProcessUponURL(getJavawsLocation(), otherargs, getUrlUponThisInstance(resource),stdoutl,stderrl); } public ProcessResult executeJavaws(List otherargs, String resource,ContentReaderListener stdoutl,ContentReaderListener stderrl,String[] vars) throws Exception { return executeProcessUponURL(getJavawsLocation(), otherargs, getUrlUponThisInstance(resource),stdoutl,stderrl,vars); } public ProcessResult executeBrowser(List otherargs, String resource) throws Exception { return executeBrowser(otherargs, getUrlUponThisInstance(resource)); } public ProcessResult executeBrowser(List otherargs, URL url) throws Exception { ProcessWrapper rpw = new ProcessWrapper(getBrowserLocation(), otherargs, url); rpw.setReactingProcess(getCurrentBrowser());//current browser may be null, but it does not metter return rpw.execute(); } public ProcessResult executeBrowser(List otherargs, String resource, ContentReaderListener stdoutl, ContentReaderListener stderrl) throws Exception { ProcessWrapper rpw = new ProcessWrapper(getBrowserLocation(), otherargs, getUrlUponThisInstance(resource), stdoutl, stderrl, null); rpw.setReactingProcess(getCurrentBrowser());//current browser may be null, but it does not metter return rpw.execute(); } public ProcessResult executeBrowser(List otherargs, URL url, ContentReaderListener stdoutl, ContentReaderListener stderrl) throws Exception { ProcessWrapper rpw = new ProcessWrapper(getBrowserLocation(), otherargs, url, stdoutl, stderrl, null); rpw.setReactingProcess(getCurrentBrowser());//current browser may be null, but it does not metter return rpw.execute(); } public ProcessResult executeBrowser(List otherargs, String resource, List stdoutl, List stderrl) throws Exception { ProcessWrapper rpw = new ProcessWrapper(getBrowserLocation(), otherargs, getUrlUponThisInstance(resource), stdoutl, stderrl, null); rpw.setReactingProcess(getCurrentBrowser());// current browser may be null, but it does not matter return rpw.execute(); } public ProcessResult executeBrowser(Browser b, List otherargs, String resource) throws Exception { ProcessWrapper rpw = new ProcessWrapper(b.getBin(), otherargs, getUrlUponThisInstance(resource)); rpw.setReactingProcess(b); return rpw.execute(); } public ProcessResult executeBrowser(Browser b, List otherargs, String resource, ContentReaderListener stdoutl, ContentReaderListener stderrl) throws Exception { ProcessWrapper rpw = new ProcessWrapper(b.getBin(), otherargs, getUrlUponThisInstance(resource), stdoutl, stderrl, null); rpw.setReactingProcess(b); return rpw.execute(); } public ProcessResult executeBrowser(Browser b, List otherargs, String resource, List stdoutl, List stderrl) throws Exception { ProcessWrapper rpw = new ProcessWrapper(b.getBin(), otherargs, getUrlUponThisInstance(resource), stdoutl, stderrl, null); rpw.setReactingProcess(b); return rpw.execute(); } /** * Create resource on http, on 'localhost' on port on which this cached instance is running * @param resource * @return * @throws MalformedURLException */ public URL getUrlUponThisInstance(String resource) throws MalformedURLException { getInstance(); return getUrlUponInstance(server, resource); } /** * Create resource on http, on 'localhost' on port on which this instance is running * @param instance of server to return the resource * @param resource relative path to resource to be loaded from specified instance * @return the absolute url * @throws MalformedURLException */ public static URL getUrlUponInstance(ServerLauncher instance,String resource) throws MalformedURLException { return instance.getUrl(resource); } /** * wrapping method to executeProcess (eg: javaws arg arg arg url) * will execute default javaws (@see JAVAWS_BUILD_BIN) upon any server * @param otherargs - commandline arguments for javaws process * @param u url of resource upon any server * @return result what left after running this process * @throws Exception */ public ProcessResult executeJavawsUponUrl(List otherargs, URL u) throws Exception { return executeProcessUponURL(getJavawsLocation(), otherargs, u); } public ProcessResult executeJavawsUponUrl(List otherargs, URL u,ContentReaderListener stdoutl,ContentReaderListener stderrl) throws Exception { return executeProcessUponURL(getJavawsLocation(), otherargs, u,stdoutl,stderrl); } /** * wrapping utility method to executeProcess (eg: any_binary arg arg arg url) * * will execute any process upon url upon any server * @param toBeExecuted - command to lunch javaws program * @param u url of resource upon any server * @param otherargs commandline arguments for new process * @return result what left after running this process * @throws Exception */ public static ProcessResult executeProcessUponURL(String toBeExecuted, List otherargs, URL u) throws Exception { return new ProcessWrapper(toBeExecuted, otherargs, u).execute(); } public static ProcessResult executeProcessUponURL(String toBeExecuted, List otherargs, URL u, ContentReaderListener stdoutl, ContentReaderListener stderrl) throws Exception { return new ProcessWrapper(toBeExecuted, otherargs, u, stdoutl, stderrl, null).execute(); } public static ProcessResult executeProcessUponURL(String toBeExecuted, List otherargs, URL u, ContentReaderListener stdoutl, ContentReaderListener stderrl, String[] vars) throws Exception { return new ProcessWrapper(toBeExecuted, otherargs, u, stdoutl, stderrl, vars).execute(); } public static ProcessResult executeProcess(final List args) throws Exception { return executeProcess(args, null); } public static ProcessResult executeProcess(final List args,ContentReaderListener stdoutl,ContentReaderListener stderrl) throws Exception { return executeProcess(args, null,stdoutl,stderrl); } public static ProcessResult executeProcess(final List args,ContentReaderListener stdoutl,ContentReaderListener stderrl,String[] vars) throws Exception { return executeProcess(args, null,stdoutl,stderrl,vars); } /** * utility method to lunch process, get its stdout/stderr, its return value and to kill it if running to long (@see PROCESS_TIMEOUT) * * * Small background: * This method creates thread inside which exec will be executed. Then creates assassin thread with given timeout to kill the previously created thread if necessary. * Starts assassin thread, starts process thread. Wait until process is running, then starts content readers. * Closes input of process. * Wait until process is running (no matter if it terminate itself (correctly or badly), or is terminated by its assassin. * Construct result from read stdout, stderr, process return value, assassin successfully * * @param args binary with args to be executed * @param dir optional, directory where this process will run * @return what left from process - process itself, its stdout, stderr and return value and whether it was terminated by assassin. * @throws Exception */ public static ProcessResult executeProcess(final List args,File dir) throws Exception { return executeProcess(args, dir, null, null); } /** * Proceed message s to logging with request to reprint to System.err * @param s */ public static void logErrorReprint(String s) { log(s, false, true); } /** * Proceed message s to logging with request to reprint to System.out * @param s */ public static void logOutputReprint(String s) { log(s, true, false); } /** * Proceed message s to logging withhout request to reprint * @param s */ public static void logNoReprint(String s) { log(s, false, false); } static void log(String message, boolean printToOut, boolean printToErr) { String idded; StackTraceElement ste = getTestMethod(); String fullId = LoggingBottleneck.getDefaultLoggingBottleneck().modifyMethodWithForBrowser(ste.getMethodName(), ste.getClassName()); if (message.contains("\n")) { idded = fullId + ": \n" + message + "\n" + fullId + " ---"; } else { idded = fullId + ": " + message; } if (LOGS_REPRINT) { if (printToOut) { System.out.println(idded); } if (printToErr) { System.err.println(idded); } } LoggingBottleneck.getDefaultLoggingBottleneck().logIntoPlaintextLog(idded, printToOut,printToErr); LoggingBottleneck.getDefaultLoggingBottleneck().addToXmlLog(message,printToOut,printToErr,ste); } public static void logException(Throwable t){ logException(t, true); } public static void logException(Throwable t, boolean print){ log(OutputController.exceptionToString(t), false, print); } private static StackTraceElement getTestMethod() { return getTestMethod(Thread.currentThread().getStackTrace()); } private static StackTraceElement getTestMethod(StackTraceElement[] stack) { //0 is always thread //1 is net.sourceforge.jnlp.* //we need to get out of all of classes from this package or pick last of it StackTraceElement result = stack[1]; String baseClass = stack[1].getClassName(); int i = 2; for (; i < stack.length; i++) { result = stack[i];//at least moving up if (stack[i].getClassName().contains("$")) { continue; } //probablky it is necessary to get out of net.sourceforge.jnlp. //package where are right now all test-extensions //for now keeping exactly the three classes helping you access the log try { Class clazz = Class.forName(stack[i].getClassName()); String path = null; try { path = clazz.getProtectionDomain().getCodeSource().getLocation().getPath(); } catch (NullPointerException ex) { //silently ignoring and continuing with null path } if (path != null && path.contains("/tests.build/")) { if (!path.contains("/test-extensions/")) { break; } } else { //running from ide if (!stack[i].getClassName().startsWith("net.sourceforge.jnlp.")) { break; } } } catch (ClassNotFoundException ex) { ///should not happen, searching only for already loaded class ex.printStackTrace(); } } //if nothing left in stack then we have been in ServerAccess already //so the target method is the highest form it and better to return it //rather then die to ArrayOutOfBounds if (i >= stack.length) { return result; } //now we are out of test-extensions //method we need (the test) is highest from following class baseClass = stack[i].getClassName(); for (; i < stack.length; i++) { if(stack[i].getClassName().contains("$")){ continue; } if (!baseClass.equals(stack[i].getClassName())) { break; } result = stack[i]; } return result; } public static ProcessResult executeProcess(final List args, File dir, ContentReaderListener stdoutl, ContentReaderListener stderrl) throws Exception { return executeProcess(args, dir, stdoutl, stderrl,null); } public static ProcessResult executeProcess(final List args, File dir, ContentReaderListener stdoutl, ContentReaderListener stderrl, String[] vars) throws Exception { return new ProcessWrapper(args, dir, stdoutl, stderrl, vars).execute(); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/ClosingListener.java0000644000000000000000000000013213441742745027564 xustar0030 mtime=1552401893.137832619 30 atime=1552402157.281253382 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/ClosingListener.java0000644000175000002070000000413413441742745030376 0ustar00jvanekmock00000000000000/* ClosingListener.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; public abstract class ClosingListener implements ContentReaderListener { private ThreadedProcess process; private ProcessAssasin assasin; void setProcess(ThreadedProcess p) { this.process = p; } void setAssasin(ProcessAssasin assasin) { this.assasin = assasin; } public ProcessAssasin getAssasin() { return assasin; } public void terminate() { assasin.setTimeout(Long.MIN_VALUE); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/TestsLogs.java0000644000000000000000000000013213441742745026407 xustar0030 mtime=1552401893.143832607 30 atime=1552402157.281253382 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/TestsLogs.java0000644000175000002070000000574013441742745027225 0ustar00jvanekmock00000000000000/* TestsLogs.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.util.LinkedList; import java.util.List; class TestsLogs { public final List outs = new LinkedList(); public final List errs = new LinkedList(); public final List all = new LinkedList(); private static final String LOG_ELEMENT = "log"; private static final String LOG_ID_ATTRIBUTE = "id"; synchronized void add(boolean err, boolean out, String text) { if (text == null) { text = "null"; } LogItem li = new LogItem(text); if (out) { outs.add(li); } if (err) { errs.add(li); } all.add(li); } @Override public String toString() { StringBuilder sb = listToStringBuilder(outs, "out"); sb.append(listToStringBuilder(errs, "err")); sb.append(listToStringBuilder(all, "all")); return sb.toString(); } private StringBuilder listToStringBuilder(List l, String id) { StringBuilder sb = new StringBuilder(); sb.append("<" + LOG_ELEMENT + " " + LOG_ID_ATTRIBUTE + "=\"").append(id).append("\">\n"); int i = 0; for (LogItem logItem : l) { i++; sb.append(logItem.toStringBuilder(i)); } sb.append("\n"); return sb; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/ContentReaderListener.jav0000644000000000000000000000013213441742745030562 xustar0030 mtime=1552401893.143832607 30 atime=1552402157.281253382 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/ContentReaderListener.java0000644000175000002070000000341513441742745031536 0ustar00jvanekmock00000000000000/* ContentReaderListener.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; public interface ContentReaderListener { public void charReaded(char ch); public void lineReaded(String s); } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/ProcessResult.java0000644000000000000000000000013213441742745027275 xustar0030 mtime=1552401893.148832596 30 atime=1552402157.281253382 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/ProcessResult.java0000644000175000002070000000510513441742745030106 0ustar00jvanekmock00000000000000/* ProcessResult.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; /** * artefacts what are left by finished process */ public class ProcessResult { public final String stdout; public final String notFilteredStdout; public final String stderr; public final Process process; public final Integer returnValue; public final boolean wasTerminated; /* * possible exception which caused Process not to be launched */ public final Throwable deadlyException; public ProcessResult(String stdout, String stderr, Process process, boolean wasTerminated, Integer r, Throwable deadlyException) { this.notFilteredStdout = stdout; if (stdout == null) { this.stdout = null; } else { this.stdout = stdout.replaceAll("EMMA:.*\n?", ""); } this.stderr = stderr; this.process = process; this.wasTerminated = wasTerminated; this.returnValue = r; this.deadlyException = deadlyException; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/AsyncCall.java0000644000000000000000000000013213441742745026331 xustar0030 mtime=1552401893.147832598 30 atime=1552402157.281253382 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/AsyncCall.java0000644000175000002070000000612113441742745027141 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp; import java.util.concurrent.Callable; /** * A call that runs on a separate thread, with an optional timeout. It takes a runnable and allows * joining. * * On join, throws any exceptions that occurred within the call, or a TimeOutException if * it did not finish. Returns the value from the call. */ public class AsyncCall { static public class TimeOutException extends RuntimeException { public TimeOutException() { super("Call did not finish within the allocated time."); } } private Thread handler; private Callable callable; private long timeout; private T callResult; /* Captures exception from async call */ private Exception asyncException = null; /* Create an AsyncCall with a given time-out */ public AsyncCall(Callable callable, long timeout) { this.callable = callable; this.timeout = timeout; this.handler = new HandlerThread(); } /* Create an AsyncCall with (effectively) no time-out */ public AsyncCall(Callable call) { this(call, Long.MAX_VALUE); } /* Chains construction + start for convenience */ public static AsyncCall startWithTimeOut(Callable callable, long timeout) { AsyncCall asyncCall = new AsyncCall(callable, timeout); asyncCall.start(); return asyncCall; } /* Chains construction + start for convenience */ public static AsyncCall startWithTimeOut(Callable callable) { return startWithTimeOut(callable, 1000); // Default timeout of 1 second } public void start() { this.handler.start(); } // Rethrows exceptions from handler thread, and throws TimeOutException in case of time-out. public T join() throws Exception { handler.join(); if (asyncException != null) { throw asyncException; } return callResult; } /* The handler thread is responsible for timing-out the Callable thread. * The resulting thread */ private class HandlerThread extends Thread { @Override public void run() { Thread thread = new Thread() { @Override public void run() { try { /* Capture result of the call */ callResult = callable.call(); } catch (Exception e) { /* In case of exception, capture for re-throw */ asyncException = e; } handler.interrupt(); // Finish early } }; thread.start(); try { Thread.sleep(timeout); } catch (InterruptedException e) { // Finish early return; } if (thread.isAlive()) { asyncException = new TimeOutException(); } // Make sure the thread is finished while (thread.isAlive()) { thread.interrupt(); } } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/ProcessAssasin.java0000644000000000000000000000013213441742745027420 xustar0030 mtime=1552401893.164832563 30 atime=1552402157.281253382 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java0000644000175000002070000002263713441742745030242 0ustar00jvanekmock00000000000000/* ProcessAssasin.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.browsertesting.ReactingProcess; /** * class which timeout any ThreadedProcess. This killing of 'thread with * process' replaced not working process.destroy(). */ public class ProcessAssasin extends Thread { long timeout; private final ThreadedProcess p; //false == is disabled:( private boolean canRun = true; private boolean wasTerminated = false; //signifies that assasin have been summoned private volatile boolean killing = false; //signifies that assasin have done its job private volatile boolean killed = false; private boolean useKill = false; /** * if this is true, then process is not destroyed after timeout, but just * left to its own destiny. Its stdout/err is no longer recorded, and it is * leaking system resources until it dies by itself The contorl is returned * to main thread with all informations recorded untill now. You will be * able to listen to std out from listeners still */ private boolean skipInstedOfDesroy = false; private ReactingProcess reactingProcess; public ProcessAssasin(ThreadedProcess p, long timeout) { this.p = (p); this.timeout = timeout; } public ProcessAssasin(ThreadedProcess p, long timeout, boolean skipInstedOfDesroy) { this.p = (p); this.timeout = timeout; this.skipInstedOfDesroy = skipInstedOfDesroy; } public void setCanRun(boolean canRun) { this.canRun = canRun; if (p != null) { if (p.getP() != null) { ServerAccess.logNoReprint("Stopping assassin for" + p.toString() + " " + p.getP().toString() + " " + p.getCommandLine() + ": "); } else { ServerAccess.logNoReprint("Stopping assassin for" + p.toString() + " " + p.getCommandLine() + ": "); } } else { ServerAccess.logNoReprint("Stopping assassin for null job: "); } } public boolean isCanRun() { return canRun; } public boolean wasTerminated() { return wasTerminated; } public void setSkipInstedOfDesroy(boolean skipInstedOfDesroy) { this.skipInstedOfDesroy = skipInstedOfDesroy; } public boolean isSkipInstedOfDesroy() { return skipInstedOfDesroy; } void setTimeout(long timeout) { this.timeout = timeout; } @Override public void run() { long startTime = System.nanoTime() / ServerAccess.NANO_TIME_DELIMITER; while (canRun) { try { long time = System.nanoTime() / ServerAccess.NANO_TIME_DELIMITER; //ServerAccess.logOutputReprint(time - startTime); //ServerAccess.logOutputReprint((time - startTime) > timeout); if ((time - startTime) > timeout) { try { if (p != null) { if (p.getP() != null) { ServerAccess.logErrorReprint("Timed out " + p.toString() + " " + p.getP().toString() + " .. killing " + p.getCommandLine() + ": "); } else { ServerAccess.logErrorReprint("Timed out " + p.toString() + " " + "null .. killing " + p.getCommandLine() + ": "); } wasTerminated = true; if (p.getP() != null) { try { if (!skipInstedOfDesroy) { destroyProcess(); } } catch (Throwable ex) { if (p.deadlyException == null) { p.deadlyException = ex; } ex.printStackTrace(); } } p.interrupt(); // while (!ServerAccess.terminated.contains(p)) { // Thread.sleep(100); // } if (p.getP() != null) { ServerAccess.logErrorReprint("Timed out " + p.toString() + " " + p.getP().toString() + " .. killed " + p.getCommandLine()); } else { ServerAccess.logErrorReprint("Timed out " + p.toString() + " null .. killed " + p.getCommandLine()); } } else { ServerAccess.logErrorReprint("Timed out null job"); } break; } finally { p.setDestoyed(true); } } Thread.sleep(100); } catch (Exception ex) { ex.printStackTrace(); } } if (p != null) { if (p.getP() != null) { ServerAccess.logNoReprint("assassin for" + p.toString() + " " + p.getP().toString() + " .. done " + p.getCommandLine() + " termination " + wasTerminated); } else { ServerAccess.logNoReprint("assassin for" + p.toString() + " null .. done " + p.getCommandLine() + " termination " + wasTerminated); } } else { ServerAccess.logNoReprint("assassin for non existing job termination " + wasTerminated); } } public void destroyProcess() { try { killing = true; destroyProcess(p, reactingProcess, isUseKill()); } finally { killed = true; } } public boolean haveKilled() { return killed; } public boolean isKilling() { return killing; } public void setUseKill(boolean useKill) { this.useKill = useKill; } public boolean isUseKill() { return useKill; } public static void destroyProcess(ThreadedProcess pp, ReactingProcess reactingProcess) { destroyProcess(pp, reactingProcess, false); } public static void destroyProcess(ThreadedProcess pp, ReactingProcess reactingProcess, boolean mercielessKill) { Process p = pp.getP(); try { Field f = p.getClass().getDeclaredField("pid"); f.setAccessible(true); String pid = (f.get(p)).toString(); if (reactingProcess != null) { reactingProcess.beforeKill(pid); } // sigInt(pid); if (!mercielessKill) { sigTerm(pid); } else { sigKill(pid); ServerAccess.log("Mercieless -9 kil was used!", true, true); } } catch (Exception ex) { ServerAccess.logException(ex); } finally { if (reactingProcess != null) { reactingProcess.afterKill(""); } } } public static void sigInt(String pid) throws Exception { kill(pid, "SIGINT"); } public static void sigKill(String pid) throws Exception { kill(pid, "SIGKILL"); } public static void sigTerm(String pid) throws Exception { kill(pid, "SIGTERM"); } public static void kill(String pid, String signal) throws InterruptedException, Exception { List ll = new ArrayList(4); ll.add("kill"); ll.add("-s"); ll.add(signal); ll.add(pid); ServerAccess.executeProcess(ll); //sync, but acctually release //before affected application close Thread.sleep(1000); } void setReactingProcess(ReactingProcess reactingProcess) { this.reactingProcess = reactingProcess; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/tools0000644000000000000000000000013213441742745024700 xustar0030 mtime=1552401893.150832592 30 atime=1552410887.104183464 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/0000755000175000002070000000000013441742745025565 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/PaxHeaders.7406/CodeSignerCreator.j0000644000000000000000000000013213441742745030472 xustar0030 mtime=1552401893.141832611 30 atime=1552402157.281253382 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/CodeSignerCreator.java0000644000175000002070000002361713441742745032003 0ustar00jvanekmock00000000000000/* * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package net.sourceforge.jnlp.tools; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.CodeSigner; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.SignatureException; import java.security.Timestamp; import java.security.cert.CertPath; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Date; import sun.security.x509.AlgorithmId; import sun.security.x509.CertificateAlgorithmId; import sun.security.x509.CertificateIssuerName; import sun.security.x509.CertificateSerialNumber; import sun.security.x509.CertificateSubjectName; import sun.security.x509.CertificateValidity; import sun.security.x509.CertificateVersion; import sun.security.x509.X500Name; import sun.security.x509.X509CertImpl; import sun.security.x509.X509CertInfo; public class CodeSignerCreator { /** * Create an X509 Certificate signed using SHA1withRSA with a 2048 bit key. * @param dname Domain Name to represent the certificate * @param notBefore The date by which the certificate starts being valid. Cannot be null. * @param validity The number of days the certificate is valid after notBefore. * @return An X509 certificate setup with properties using the specified parameters. * @throws Exception */ public static X509Certificate createCert(String dname, Date notBefore, int validity) throws Exception { int keysize = 2048; String keyAlgName = "RSA"; String sigAlgName = "SHA1withRSA"; if (dname == null) throw new Exception("Required DN is null. Please specify cert Domain Name via dname"); if (notBefore == null) throw new Exception("Required start date is null. Please specify the date at which the cert is valid via notBefore"); if (validity < 0) throw new Exception("Required validity is negative. Please specify the number of days for which the cert is valid after the start date."); // KeyTool#doGenKeyPair X500Name x500Name = new X500Name(dname); KeyPair keyPair = new KeyPair(keyAlgName, sigAlgName, keysize); PrivateKey privKey = keyPair.getPrivateKey(); X509Certificate oldCert = keyPair.getSelfCertificate(x500Name, notBefore, validity); // KeyTool#doSelfCert byte[] encoded = oldCert.getEncoded(); X509CertImpl certImpl = new X509CertImpl(encoded); X509CertInfo certInfo = (X509CertInfo) certImpl.get(X509CertImpl.NAME + "." + X509CertImpl.INFO); Date notAfter = new Date(notBefore.getTime() + validity*1000L*24L*60L*60L); CertificateValidity interval = new CertificateValidity(notBefore, notAfter); certInfo.set(X509CertInfo.VALIDITY, interval); certInfo.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber( new java.util.Random().nextInt() & 0x7fffffff)); certInfo.set(X509CertInfo.SUBJECT + "." + CertificateSubjectName.DN_NAME, x500Name); certInfo.set(X509CertInfo.ISSUER + "." + CertificateIssuerName.DN_NAME, x500Name); // The inner and outer signature algorithms have to match. // The way we achieve that is really ugly, but there seems to be no // other solution: We first sign the cert, then retrieve the // outer sigalg and use it to set the inner sigalg X509CertImpl newCert = new X509CertImpl(certInfo); newCert.sign(privKey, sigAlgName); AlgorithmId sigAlgid = (AlgorithmId)newCert.get(X509CertImpl.SIG_ALG); certInfo.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, sigAlgid); certInfo.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3)); // FIXME Figure out extensions // CertificateExtensions ext = createV3Extensions( // null, // (CertificateExtensions)certInfo.get(X509CertInfo.EXTENSIONS), // v3ext, // oldCert.getPublicKey(), // null); // certInfo.set(X509CertInfo.EXTENSIONS, ext); newCert = new X509CertImpl(certInfo); newCert.sign(privKey, sigAlgName); return newCert; } /** * Create a new code signer with the specified information. * @param domainName Domain Name to represent the certificate * @param notBefore The date by which the certificate starts being valid. Cannot be null. * @param validity The number of days the certificate is valid after notBefore. * @return A code signer with the properties passed through its parameters. */ public static CodeSigner getOneCodeSigner(String domainName, Date notBefore, int validity) throws Exception { X509Certificate jarEntryCert = createCert(domainName, notBefore, validity); ArrayList certs = new ArrayList(1); certs.add(jarEntryCert); CertificateFactory cf = CertificateFactory.getInstance("X.509"); CertPath certPath = cf.generateCertPath(certs); Timestamp certTimestamp = new Timestamp(jarEntryCert.getNotBefore(), certPath); return new CodeSigner(certPath, certTimestamp); } /** * A wrapper over JDK-internal CertAndKeyGen Class. *

* This is an internal class whose package changed between OpenJDK 7 and 8. * Use reflection to access the right thing. */ public static class KeyPair { private /* CertAndKeyGen */ Object keyPair; public KeyPair(String keyAlgName, String sigAlgName, int keySize) throws NoSuchAlgorithmException, InvalidKeyException { try { // keyPair = new CertAndKeyGen(keyAlgName, sigAlgName); Class certAndKeyGenClass = Class.forName(getCertAndKeyGenClass()); Constructor constructor = certAndKeyGenClass.getDeclaredConstructor(String.class, String.class); keyPair = constructor.newInstance(keyAlgName, sigAlgName); // keyPair.generate(keySize); Method generate = certAndKeyGenClass.getMethod("generate", int.class); generate.invoke(keyPair, keySize); } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException certAndKeyGenClassError) { throw new AssertionError("Unable to use CertAndKeyGen class", certAndKeyGenClassError); } } public PrivateKey getPrivateKey() { try { // return keyPair.getPrivateKey(); Class klass = keyPair.getClass(); Method method = klass.getMethod("getPrivateKey"); return (PrivateKey) method.invoke(keyPair); } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException error) { throw new AssertionError(error); } } public X509Certificate getSelfCertificate(X500Name name, Date notBefore, long validityInDays) throws InvalidKeyException, CertificateException, SignatureException, NoSuchAlgorithmException, NoSuchProviderException { try { // return keyPair.getSelfCertificate(name, notBefore, validityInDays * 24L * 60L * 60L); Class klass = keyPair.getClass(); Method method = klass.getMethod("getSelfCertificate", X500Name.class, Date.class, long.class); return (X509Certificate) method.invoke(keyPair, name, notBefore, validityInDays * 24L * 60L * 60L); } catch (InvocationTargetException ite) { throw new RuntimeException(ite.getCause()); } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException error) { throw new AssertionError(error); } } private String getCertAndKeyGenClass() { String javaVersion = System.getProperty("java.version"); String className = null; if (javaVersion.startsWith("1.7")) { className = "sun.security.x509.CertAndKeyGen"; } else if (javaVersion.startsWith("1.8") || javaVersion.startsWith("1.9")) { className = "sun.security.tools.keytool.CertAndKeyGen"; } else { throw new AssertionError("Unrecognized Java Version"); } return className; } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/PaxHeaders.7406/MessageProperties.j0000644000000000000000000000013213441742745030571 xustar0030 mtime=1552401893.145832603 30 atime=1552402157.281253382 30 ctime=1552410887.093183489 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/MessageProperties.java0000644000175000002070000000567413441742745032105 0ustar00jvanekmock00000000000000/* MessageProperties.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools; import java.util.Locale; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; import java.io.IOException; public class MessageProperties { public enum SupportedLanguage { en("en"), cs("cs"), de("de"), pl("pl"); private Locale locale; private SupportedLanguage(String lang) { this.locale = new Locale(lang); } public Locale getLocale() { return this.locale; } } private static final String resourcePath = "net/sourceforge/jnlp/resources/Messages"; /** * Same as {@link #getMessage(Locale, String)}, using the current default Locale */ public static String getMessage(String key) { return getMessage(Locale.getDefault(), key); } /** * Retrieve a localized message from resource file * @param locale the localization of Messages.properties to search * @param key * @return the message corresponding to the given key from the specified localization * * can throw wrapped IOException if the specified Messages localization is unavailable */ public static String getMessage(Locale locale, String key) { ResourceBundle bundle = PropertyResourceBundle.getBundle(resourcePath, locale); return bundle.getString(key); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/PaxHeaders.7406/AsyncJavaws.java0000644000000000000000000000013213441742745030051 xustar0030 mtime=1552401893.150832592 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/AsyncJavaws.java0000644000175000002070000000651013441742745030663 0ustar00jvanekmock00000000000000/* AsyncJavaws.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools; import java.util.List; import net.sourceforge.jnlp.ContentReaderListener; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; /** * You can see ClipboardContext reproducers as examples * */ public class AsyncJavaws implements Runnable { private final boolean headless; private final String url; private ProcessResult result; private ContentReaderListener contentReaderListener; private ContentReaderListener errorReaderListener; private final List argList; private final ServerAccess server; public AsyncJavaws(ServerAccess server, String url, List argList, boolean headless, ContentReaderListener contentReaderListener, ContentReaderListener errorReaderListener) { this.url = url; this.headless = headless; this.contentReaderListener = contentReaderListener; this.errorReaderListener = errorReaderListener; this.argList = argList; this.server = server; Assert.assertNotNull(server); } @Override public void run() { try { if (headless) { result = server.executeJavawsHeadless(argList, url, contentReaderListener, errorReaderListener, null); } else { result = server.executeJavaws(argList, url, contentReaderListener, errorReaderListener); } } catch (Exception ex) { if (result == null) { result = new ProcessResult("", ex.getMessage(), null, true, 1, ex); } throw new RuntimeException(ex); } } public ProcessResult getResult() { return result; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/PaxHeaders.7406/WaitingForStringPro0000644000000000000000000000013213441742745030621 xustar0030 mtime=1552401893.137832619 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/WaitingForStringProcess.java0000644000175000002070000000510013441742745033223 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.tools; import java.util.List; import net.sourceforge.jnlp.ContentReaderListener; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; /** * You can see ClipboardContext reproducers as examples * */ public class WaitingForStringProcess implements ContentReaderListener, Runnable { private final boolean headless; private final String url; private final StringBuilder output = new StringBuilder(); private StringBuilder err = new StringBuilder(); private AsyncJavaws aj; ContentReaderListener errListener = new ContentReaderListener() { @Override public void charReaded(char ch) { err.append(ch); } @Override public void lineReaded(String s) { } }; private final String waitingFor; private boolean canRun = true; private final ServerAccess server; private final List otherArgs; public WaitingForStringProcess(ServerAccess server, String url, List otherArgs, boolean headless, String waitingFor) { this.url = url; this.headless = headless; this.waitingFor = waitingFor; Assert.assertNotNull(waitingFor); Assert.assertNotNull(url); this.server = server; this.otherArgs = otherArgs; Assert.assertNotNull(server); } @Override public void charReaded(char ch) { output.append(ch); } @Override public void lineReaded(String s) { if (s.contains(waitingFor)) { canRun = false; } } @Override public void run() { aj = new AsyncJavaws(server, url, otherArgs, headless, this, errListener); ServerAccess.logOutputReprint("Starting thread with " + url + " and waiting for result or string " + waitingFor); new Thread(aj).start(); while (canRun && aj.getResult() == null) { try { Thread.sleep(100); } catch (InterruptedException ex) { ServerAccess.logErrorReprint("iteration interrupted"); throw new RuntimeException(ex); } } if (aj.getResult() != null) { ServerAccess.logOutputReprint("Waiting done. Result have been delivered"); } if (!canRun) { ServerAccess.logOutputReprint("Waiting done. String " + waitingFor + " delivered"); } } public String getErr() { return err.toString(); } public String getOutput() { return output.toString(); } public AsyncJavaws getAj() { return aj; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/PaxHeaders.7406/ClipboardHelpers.ja0000644000000000000000000000013213441742745030513 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/ClipboardHelpers.java0000644000175000002070000000521713441742745031657 0ustar00jvanekmock00000000000000/* ClipboardHelpers.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; public class ClipboardHelpers { public static void putToClipboard(String str) { Toolkit toolkit = Toolkit.getDefaultToolkit(); Clipboard clipboard = toolkit.getSystemClipboard(); StringSelection strSel = new StringSelection(str); clipboard.setContents(strSel, null); } public static String pasteFromClipboard() throws UnsupportedFlavorException, IOException { Toolkit toolkit = Toolkit.getDefaultToolkit(); Clipboard clipboard = toolkit.getSystemClipboard(); Transferable clipData = clipboard.getContents(clipboard); String s = (String) (clipData.getTransferData( DataFlavor.stringFlavor)); return s; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/PaxHeaders.7406/DeploymentPropertie0000644000000000000000000000013213441742745030712 xustar0030 mtime=1552401893.144832604 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/tools/DeploymentPropertiesModifier.java0000644000175000002070000001303113441742745034302 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools; import java.io.IOException; import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import net.sourceforge.jnlp.config.InfrastructureFileDescriptor; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.util.FileUtils; public class DeploymentPropertiesModifier { /** * for advanced users, less verbose, less fool-proof multi-impl */ public static class MultipleDeploymentPropertiesModifier { public final InfrastructureFileDescriptor src; private final AbstractMap.SimpleEntry[] keyValue; private List modifications; public MultipleDeploymentPropertiesModifier(AbstractMap.SimpleEntry... keyValue) { this(PathsAndFiles.USER_DEPLOYMENT_FILE, keyValue); } public MultipleDeploymentPropertiesModifier(InfrastructureFileDescriptor src, HashMap.SimpleEntry... keyValue) { this.src = src; this.keyValue = keyValue; } public void setProperties() throws IOException { modifications = new ArrayList<>(keyValue.length); for (AbstractMap.SimpleEntry keyValue1 : keyValue) { DeploymentPropertiesModifier dm = new DeploymentPropertiesModifier(src); dm.setProperties(keyValue1.getKey(), keyValue1.getValue()); //adding to beggining, soe restoring goes from last. Not necessary, but nice. modifications.add(0, dm); } } public void restoreProperties() throws IOException { for (DeploymentPropertiesModifier dm : modifications) { dm.restoreProperties(); } } } public final InfrastructureFileDescriptor src; private String savedValue; private String requestedProperty; private String requestedValue; private boolean isPropertiesSet; public DeploymentPropertiesModifier() { this(PathsAndFiles.USER_DEPLOYMENT_FILE); } public DeploymentPropertiesModifier(InfrastructureFileDescriptor src) { this.src = src; isPropertiesSet = false; } public void setProperties(String property, String value) throws IOException { if (isPropertiesSet) { throw new IllegalStateException("Properties can be set only once. Revert and use naother instance."); } isPropertiesSet = true; requestedProperty = property; requestedValue = value; setDeploymentProperties(requestedProperty, requestedValue); } public void restoreProperties() throws IOException { if (!isPropertiesSet) { throw new IllegalStateException("Prperties must be set before they can be reverted"); } isPropertiesSet = false; restoreDeploymentProperties(); } private void setDeploymentProperties(String property, String value) throws IOException { String properties = FileUtils.loadFileAsString(src.getFile()); for (String line : properties.split("\n")) { if (line.contains(property)) { savedValue = line; properties = properties.replace(line, property + "=" + value + "\n"); } } if (savedValue == null) { properties += property + "=" + value + "\n"; } FileUtils.saveFile(properties, src.getFile()); } private void restoreDeploymentProperties() throws IOException { String properties = FileUtils.loadFileAsString(src.getFile()); if (savedValue != null) { properties = properties.replace(requestedProperty + "=" + requestedValue + "\n", savedValue); } else { properties = properties.replace(requestedProperty + "=" + requestedValue + "\n", ""); } FileUtils.saveFile(properties, src.getFile()); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/mock0000644000000000000000000000013213441742745024471 xustar0030 mtime=1552401893.167832557 30 atime=1552410887.104183464 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/mock/0000755000175000002070000000000013441742745025356 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/mock/PaxHeaders.7406/MockJNLPFile.java0000644000000000000000000000013213441742745027566 xustar0030 mtime=1552401893.167832557 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/mock/MockJNLPFile.java0000644000175000002070000000375713441742745030412 0ustar00jvanekmock00000000000000/* MockJNLPFile.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.mock; import java.util.List; import java.util.Locale; import net.sourceforge.jnlp.InformationDesc; import net.sourceforge.jnlp.JNLPFile; public class MockJNLPFile extends JNLPFile { public MockJNLPFile(Locale locale) { defaultLocale = locale; } public void setInfo(List infoList) { info = infoList; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/mock/PaxHeaders.7406/DummyJNLPFile.java0000644000000000000000000000013213441742745027770 xustar0030 mtime=1552401893.137832619 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/mock/DummyJNLPFile.java0000644000175000002070000000502013441742745030575 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.mock; import java.net.URL; import java.util.Locale; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.ResourcesDesc; import net.sourceforge.jnlp.SecurityDesc; public class DummyJNLPFile extends JNLPFile { public static final URL JAR_URL; public static final URL CODEBASE_URL; static { try { JAR_URL = new URL("http://icedtea.classpath.org/netx/about.jar"); CODEBASE_URL = new URL("http://icedtea.classpath.org/netx/"); } catch (Exception ex) { throw new RuntimeException(ex); } } { this.security = new SecurityDesc(this, SecurityDesc.SANDBOX_PERMISSIONS, null); } @Override public ResourcesDesc getResources() { return new ResourcesDesc(null, new Locale[0], new String[0], new String[0]); } @Override public URL getCodeBase() { return CODEBASE_URL; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/mock/PaxHeaders.7406/DummyJNLPFileWithJar0000644000000000000000000000013213441742745030341 xustar0030 mtime=1552401893.144832604 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/mock/DummyJNLPFileWithJar.java0000644000175000002070000000576713441742745032110 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.mock; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Locale; import net.sourceforge.jnlp.InformationDesc; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.ResourcesDesc; import net.sourceforge.jnlp.SecurityDesc; import net.sourceforge.jnlp.Version; /* A mocked dummy JNLP file with a single JAR. */ public class DummyJNLPFileWithJar extends JNLPFile { /* Create a JARDesc for the given URL location */ static JARDesc makeJarDesc(URL jarLocation, boolean main) { return new JARDesc(jarLocation, new Version("1"), null, false,main, false,false); } private final JARDesc[] jarDescs; private final URL[] jarFiles; public DummyJNLPFileWithJar(File... jarFiles) throws MalformedURLException { this(-1, jarFiles); } public DummyJNLPFileWithJar(URL codebaseRewritter, URL... jarFiles) throws MalformedURLException { this(-1, codebaseRewritter, jarFiles); } public DummyJNLPFileWithJar(int main, File... jarFiles) throws MalformedURLException { this(main, jarFiles[0].getParentFile().toURI().toURL(), filesToUrls(jarFiles)); } private static URL[] filesToUrls(File[] f) throws MalformedURLException{ URL[] r = new URL[f.length]; for (int i = 0; i < f.length; i++) { r[i]=f[i].toURI().toURL(); } return r; } public DummyJNLPFileWithJar(int main, URL codebaseRewritter, URL... jarFiles) throws MalformedURLException { codeBase = codebaseRewritter; this.jarFiles = jarFiles; jarDescs = new JARDesc[jarFiles.length]; for (int i = 0; i < jarFiles.length; i++) { jarDescs[i] = makeJarDesc(jarFiles[i], i==main); } info = new ArrayList<>(); this.security = new SecurityDesc(this, SecurityDesc.SANDBOX_PERMISSIONS, null); } public URL getJarLocation() { return jarFiles[0]; } public URL getJarLocation(int i) { return jarFiles[i]; } public JARDesc[] getJarDescs() { return jarDescs; } public JARDesc getJarDesc() { return jarDescs[0]; } public JARDesc getJarDesc(int i) { return jarDescs[i]; } @Override public ResourcesDesc getResources() { ResourcesDesc localResources = new ResourcesDesc(null, new Locale[0], new String[0], new String[0]); for (JARDesc j : jarDescs) { localResources.addResource(j); } return localResources; } @Override public ResourcesDesc[] getResourcesDescs(final Locale locale, final String os, final String arch) { return new ResourcesDesc[] { getResources() }; } @Override public URL getCodeBase() { return codeBase; } public void setInfo(List info) { this.info = info; } }icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/closinglisteners0000644000000000000000000000013213441742745027127 xustar0030 mtime=1552401893.167832557 30 atime=1552410887.104183464 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/0000755000175000002070000000000013441742745030014 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/PaxHeaders.7406/StringBa0000644000000000000000000000031713441742745030645 xustar00117 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringBasedClosingListener.java 30 mtime=1552401893.140832613 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringBasedClosingListen0000644000175000002070000000425613441742745034651 0ustar00jvanekmock00000000000000/* StringBasedClosingListener.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.closinglisteners; import net.sourceforge.jnlp.ClosingListener; public class StringBasedClosingListener extends ClosingListener { protected final String condition; public StringBasedClosingListener(String condition) { this.condition = condition; } @Override public void charReaded(char ch) { } @Override public void lineReaded(String s) { if (s.contains(condition)){ terminate(); } } public String getCondition() { return condition; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/PaxHeaders.7406/StringRu0000644000000000000000000000013213441742745030704 xustar0030 mtime=1552401893.145832603 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringRule.java0000644000175000002070000000375113441742745032763 0ustar00jvanekmock00000000000000/* StringRule.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.closinglisteners; public abstract class StringRule implements Rule{ protected String rule; public StringRule(String rule) { setRule(rule); } public StringRule() { } @Override public void setRule(String rule){ this.rule=rule; } @Override public abstract boolean evaluate(T upon); } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/PaxHeaders.7406/AutoAllC0000644000000000000000000000031313441742745030574 xustar00113 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoAllClosingListener.java 30 mtime=1552401893.145832603 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoAllClosingListener.j0000644000175000002070000000410313441742745034553 0ustar00jvanekmock00000000000000/* CountingClosingListener.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.closinglisteners; import net.sourceforge.jnlp.ClosingListener; public class AutoAllClosingListener extends ClosingListener { @Override public void charReaded(char ch) { } @Override public void lineReaded(String s) { if (s.contains(AutoErrorClosingListener.MAGICAL_ERROR_CLOSING_STRING) || s.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)){ terminate(); } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/PaxHeaders.7406/Rule.jav0000644000000000000000000000013213441742745030615 xustar0030 mtime=1552401893.150832592 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/Rule.java0000644000175000002070000000350113441742745031565 0ustar00jvanekmock00000000000000/* Rule.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.closinglisteners; public interface Rule { public void setRule(S rule); public boolean evaluate(T upon); public String toPassingString(); public String toFailingString(); } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/PaxHeaders.7406/Counting0000644000000000000000000000031413441742745030717 xustar00114 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/CountingClosingListener.java 30 mtime=1552401893.167832557 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/CountingClosingListener.0000644000175000002070000000421613441742745034633 0ustar00jvanekmock00000000000000/* CountingClosingListener.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.closinglisteners; import net.sourceforge.jnlp.ClosingListener; public abstract class CountingClosingListener extends ClosingListener { protected StringBuilder sb = new StringBuilder(); @Override public void charReaded(char ch) { sb.append(ch); if (isAlowedToFinish(sb.toString())) { terminate(); } } @Override public void lineReaded(String s) { //nothing to do } protected abstract boolean isAlowedToFinish(String content); } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/PaxHeaders.7406/AutoErro0000644000000000000000000000031513441742745030672 xustar00115 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoErrorClosingListener.java 30 mtime=1552401893.136832621 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoErrorClosingListener0000644000175000002070000000424613441742745034714 0ustar00jvanekmock00000000000000/* AutoErrorClosingListener.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.closinglisteners; public class AutoErrorClosingListener extends StringBasedClosingListener { public static final String MAGICAL_ERROR_CLOSING_STRING = "xception"; public AutoErrorClosingListener() { super(MAGICAL_ERROR_CLOSING_STRING); } @Override public void lineReaded(String s) { if (s.contains("FAILED ASSERTION")) { //dont terminate if it is rhino's org.mozilla.javascript.Kit } else { super.lineReaded(s); } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/PaxHeaders.7406/RulesFol0000644000000000000000000000032113441742745030662 xustar00119 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/RulesFolowingClosingListener.java 30 mtime=1552401893.137832619 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/RulesFolowingClosingList0000644000175000002070000001502113441742745034710 0ustar00jvanekmock00000000000000/* RulesFolowingClosingListener.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.closinglisteners; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class RulesFolowingClosingListener extends CountingClosingListener { private List> rules = new ArrayList>(); public static class ContainsRule extends StringRule { public ContainsRule(String s) { super(s); } @Override public boolean evaluate(String upon) { return (upon.contains(rule)); } @Override public String toPassingString() { return "should contain `" + rule + "`"; } @Override public String toFailingString() { return "should NOT contain `" + rule + "`"; } } public static class NotContainsRule extends StringRule { public NotContainsRule(String s) { super(s); } @Override public boolean evaluate(String upon) { return !(upon.contains(rule)); } @Override public String toPassingString() { return "should NOT contain `" + rule + "`"; } @Override public String toFailingString() { return "should contain `" + rule + "`"; } } public static class MatchesRule extends StringRule { public MatchesRule(String s) { super(s); } @Override public boolean evaluate(String upon) { return (upon.matches(rule)); } @Override public String toPassingString() { return "should match `" + rule + "`"; } @Override public String toFailingString() { return "should NOT match `" + rule + "`"; } } public static class NotMatchesRule extends StringRule { public NotMatchesRule(String s) { super(s); } @Override public boolean evaluate(String upon) { return !(upon.matches(rule)); } @Override public String toPassingString() { return "should NOT match`" + rule + "`"; } @Override public String toFailingString() { return "should match`" + rule + "`"; } } /** * * @param rule * @return self, to alow chaing add(...).add(..)... */ public RulesFolowingClosingListener addMatchingRule(String rule) { this.rules.add(new MatchesRule(rule)); return this; } /** * * @param rule * @return self, to alow chaing add(...).add(..)... */ public RulesFolowingClosingListener addNotMatchingRule(String rule) { this.rules.add(new NotMatchesRule(rule)); return this; } /** * * @param rule * @return self, to alow chaing add(...).add(..)... */ public RulesFolowingClosingListener addContainsRule(String rule) { this.rules.add(new ContainsRule(rule)); return this; } /** * * @param rule * @return self, to alow chaing add(...).add(..)... */ public RulesFolowingClosingListener addNotContainsRule(String rule) { this.rules.add(new NotContainsRule(rule)); return this; } public RulesFolowingClosingListener() { } public RulesFolowingClosingListener(List> l) { addRules(l); } public RulesFolowingClosingListener(Rule... l) { addRules(l); } public List> getRules() { return rules; } public void setRules(List> rules) { if (rules == null) { throw new NullPointerException("rules cant be null"); } this.rules = rules; } /** * no more rules will be possible to add by doing this * @param rules */ public void setRules(Rule[] rules) { if (rules == null) { throw new NullPointerException("rules cant be null"); } this.rules = Arrays.asList(rules); } final public RulesFolowingClosingListener addRules(List> rules) { if (rules == null) { throw new NullPointerException("rules cant be null"); } this.rules.addAll(rules); return this; } final public RulesFolowingClosingListener addRules(Rule... rules) { if (rules == null) { throw new NullPointerException("rules cant be null"); } this.rules.addAll(Arrays.asList(rules)); return this; } @Override protected boolean isAlowedToFinish(String content) { if (rules == null || rules.size() < 1) { throw new IllegalStateException("No rules specified"); } for (Rule rule : rules) { if (!rule.evaluate(content)) { return false; } } return true; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/PaxHeaders.7406/StringMa0000644000000000000000000000031713441742745030660 xustar00117 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringMatchClosingListener.java 30 mtime=1552401893.143832607 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringMatchClosingListen0000644000175000002070000000402313441742745034657 0ustar00jvanekmock00000000000000/* StringMatchClosingListener.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.closinglisteners; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; public class StringMatchClosingListener extends StringBasedClosingListener { public StringMatchClosingListener(String s) { super(s); } @Override public void lineReaded(String s) { if (s.matches(getCondition())) { terminate(); } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/PaxHeaders.7406/AutoOkCl0000644000000000000000000000031213441742745030610 xustar00112 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoOkClosingListener.java 30 mtime=1552401893.144832604 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoOkClosingListener.ja0000644000175000002070000000364013441742745034562 0ustar00jvanekmock00000000000000/* CountingClosingListener.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.closinglisteners; public class AutoOkClosingListener extends StringBasedClosingListener { public static final String MAGICAL_OK_CLOSING_STRING = "*** APPLET FINISHED ***"; public AutoOkClosingListener() { super(MAGICAL_OK_CLOSING_STRING); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/browsertesting0000644000000000000000000000013213441742745026621 xustar0030 mtime=1552401893.166832559 30 atime=1552410887.104183464 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/0000755000175000002070000000000013441742745027506 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/PaxHeaders.7406/ReactingPr0000644000000000000000000000013213441742745030657 xustar0030 mtime=1552401893.139832615 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/ReactingProcess.java0000644000175000002070000000431713441742745033451 0ustar00jvanekmock00000000000000/* ReactingProcess.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting; /** * interface which represents process which can react to events during its lifetime. */ public interface ReactingProcess { /** * called before process is launched */ public void beforeProcess(String s); /** * called after process is finished or killed */ public void afterProcess(String s); /** * called after before process is timeouted and is going to be killed */ public void beforeKill(String s); /** * called after process have been killed */ public void afterKill(String s); } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/PaxHeaders.7406/BrowserTes0000644000000000000000000000013213441742745030720 xustar0030 mtime=1552401893.149832594 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/BrowserTestRunner.java0000644000175000002070000001766713441742745034047 0ustar00jvanekmock00000000000000/* BrowserTestRunner.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import net.sourceforge.jnlp.annotations.TestInBrowsers; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.Random; import net.sourceforge.jnlp.ServerAccess; import org.junit.Ignore; import org.junit.internal.AssumptionViolatedException; import org.junit.internal.runners.model.EachTestNotifier; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; import org.junit.runners.BlockJUnit4ClassRunner; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.InitializationError; import org.junit.runners.model.Statement; public class BrowserTestRunner extends BlockJUnit4ClassRunner { public BrowserTestRunner(java.lang.Class testClass) throws InitializationError { super(testClass); } @Override protected void runChild(FrameworkMethod method, RunNotifier notifier) { Method mm = method.getMethod(); TestInBrowsers tib = mm.getAnnotation(TestInBrowsers.class); injectBrowserCatched(method, Browsers.none); boolean browserIgnoration = false; if (tib != null) { try { List testableBrowsers = BrowserFactory.getFactory().getBrowsers(tib); String mbr = System.getProperty("modified.browsers.run"); if (mbr != null) { if (mbr.equalsIgnoreCase("all")) { if (!isBrowsersNoneSet(tib)) { testableBrowsers = BrowserFactory.getFactory().getBrowsers(new Browsers[]{Browsers.all}); } } else if (mbr.equalsIgnoreCase("one")) { //this complication here is for case like // namely enumerated concrete browsers, so we want to pick up // random one from those already enumerated if (isBrowsersNoneSet(tib)) { testableBrowsers = Arrays.asList(new Browsers[]{testableBrowsers.get(new Random().nextInt(testableBrowsers.size()))}); } } else if (mbr.equalsIgnoreCase("ignore")) { testableBrowsers = BrowserFactory.getFactory().getBrowsers(new Browsers[]{Browsers.none}); browserIgnoration = true; } else { ServerAccess.logErrorReprint("unrecognized value of modified.browsers.run - " + mbr); } } for (Browsers browser : testableBrowsers) { try { injcetBrowser(method, browser); runChildX(method, notifier, browser, browserIgnoration); } catch (Exception ex) { //throw new RuntimeException("unabled to inject browser", ex); ServerAccess.logException(ex, true); } } } finally { injectBrowserCatched(method, Browsers.none); } } else { runChildX(method, notifier, null, false); } } private boolean isBrowsersNoneSet(TestInBrowsers tib) { if (tib.testIn().length == 1 && tib.testIn()[0] == Browsers.none) { return true; } return false; } private void injectBrowserCatched(FrameworkMethod method, Browsers browser) { try { injcetBrowser(method, browser); } catch (Exception ex) { //throw new RuntimeException("unabled to inject browser", ex); ServerAccess.logException(ex, true); } } private void injcetBrowser(FrameworkMethod method, Browsers browser) throws IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { Method ff = method.getMethod().getDeclaringClass().getMethod("setBrowser", Browsers.class); ff.invoke(null, browser); } protected void runChildX(final FrameworkMethod method, RunNotifier notifier, Browsers browser, boolean browserIgnoration) { Description description = describeChild(method, browser); if (method.getAnnotation(Ignore.class) != null) { notifier.fireTestIgnored(description); } else { try { runLeaf(methodBlock(method), description, notifier, browserIgnoration); // ServerAccess.logOutputReprint("trying leaf"); // Method m = this.getClass().getMethod("runLeaf", Statement.class, Description.class, RunNotifier.class); // m.setAccessible(true); // m.invoke(this, methodBlock(method), description, notifier); // ServerAccess.logOutputReprint("leaf invoked"); } catch (Exception ex) { //throw new RuntimeException("unabled to lunch test on leaf", ex); ServerAccess.logException(ex, true); } } } /** * Runs a {@link Statement} that represents a leaf (aka atomic) test. */ protected final void runLeaf(Statement statement, Description description, RunNotifier notifier, boolean ignore) { EachTestNotifier eachNotifier = new EachTestNotifier(notifier, description); eachNotifier.fireTestStarted(); if (ignore) { eachNotifier.fireTestIgnored(); return; } try { statement.evaluate(); } catch (AssumptionViolatedException e) { eachNotifier.addFailedAssumption(e); } catch (Throwable e) { eachNotifier.addFailure(e); } finally { eachNotifier.fireTestFinished(); } } protected Description describeChild(FrameworkMethod method, Browsers browser) { if (browser == null) { return super.describeChild(method); } else { try { return Description.createTestDescription(getTestClass().getJavaClass(), testName(method) + " - " + browser.toString(), method.getAnnotations()); } catch (Exception ex) { ServerAccess.logException(ex, true); return super.describeChild(method); } } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/PaxHeaders.7406/BrowserTes0000644000000000000000000000013213441742745030720 xustar0030 mtime=1552401893.166832559 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/BrowserTest.java0000644000175000002070000000414213441742745032635 0ustar00jvanekmock00000000000000/* BrowserTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting; import net.sourceforge.jnlp.ServerAccess; import org.junit.runner.RunWith; @RunWith(value = BrowserTestRunner.class) public abstract class BrowserTest { public static Browsers browser=null; public static final ServerAccess server = new ServerAccess(); public static void setBrowser(Browsers b) { browser = b; server.setCurrentBrowser(browser); } public static Browsers getBrowser() { return browser; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/PaxHeaders.7406/browsers0000644000000000000000000000013213441742745030467 xustar0030 mtime=1552401893.166832559 30 atime=1552410887.104183464 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/0000755000175000002070000000000013441742745031354 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/PaxHeaders.7406/O0000644000000000000000000000013213441742745030665 xustar0030 mtime=1552401893.140832613 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Opera.java0000644000175000002070000000447413441742745033276 0ustar00jvanekmock00000000000000/* Opera.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting.browsers; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.browsertesting.Browsers; public class Opera extends LinuxBrowser { public Opera(String bin) { super(bin); fsdir="opera"; } @Override public Browsers getID() { return Browsers.opera; } @Override public String getUserDefaultPluginExpectedLocation() { return null; } String[] cs={"-nosession", "-nomail", "-nolirc", "-newtab"}; @Override public List getComaptibilitySwitches() { return Arrays.asList(cs); } @Override public List getDefaultSwitches() { return null; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/PaxHeaders.7406/C0000644000000000000000000000013213441742745030651 xustar0030 mtime=1552401893.144832604 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Chromium.java0000644000175000002070000000365013441742745034006 0ustar00jvanekmock00000000000000/* Chromium.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting.browsers; import net.sourceforge.jnlp.browsertesting.Browsers; public class Chromium extends MozillaFamilyLinuxBrowser { public Chromium(String bin) { super(bin); } @Override public Browsers getID() { return Browsers.chromiumBrowser; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/PaxHeaders.7406/M0000644000000000000000000000013213441742745030663 xustar0030 mtime=1552401893.149832594 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Midory.java0000644000175000002070000000364513441742745033472 0ustar00jvanekmock00000000000000/* Midory.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting.browsers; import net.sourceforge.jnlp.browsertesting.Browsers; public class Midory extends MozillaFamilyLinuxBrowser { public Midory(String bin) { super(bin); } @Override public Browsers getID() { return Browsers.midori; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/PaxHeaders.7406/L0000644000000000000000000000013213441742745030662 xustar0030 mtime=1552401893.166832559 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/LinuxBrowser.java0000644000175000002070000000627213441742745034671 0ustar00jvanekmock00000000000000/* LinuxBrowser.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting.browsers; import net.sourceforge.jnlp.browsertesting.Browser; public abstract class LinuxBrowser implements Browser{ public static final String DEFAULT_PLUGIN_NAME="libjavaplugin.so"; public static final String DEFAULT_BIN_PATH="/usr/bin/"; protected final String bin; protected String fsdir="unknown"; public LinuxBrowser(String bin) { this.bin = bin; } @Override public String getBin() { return bin; } // @Override // public void setBin(String bin) { // this.bin=bin; // } @Override public String getDefaultBin() { return DEFAULT_BIN_PATH+getID().toExec(); } @Override public boolean equals(Object obj) { if (!(obj instanceof Browser)) return false; Browser b=(Browser) obj; return b.getBin().equals(getBin()); } @Override public int hashCode() { int hash = 5; hash = 59 * hash + (this.bin != null ? this.bin.hashCode() : 0); return hash; } @Override public String getDefaultPluginExpectedLocation() { if (System.getProperty("os.arch").contains("64")) { return "/usr/lib64/"+fsdir+"/plugins"; } else { return "/usr/lib/"+fsdir+"/plugins"; } } @Override public void beforeProcess(String s) { } @Override public void afterProcess(String s) { } @Override public void beforeKill(String s) { } @Override public void afterKill(String s) { } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/PaxHeaders.7406/E0000644000000000000000000000013213441742745030653 xustar0030 mtime=1552401893.135832623 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Epiphany.java0000644000175000002070000000413013441742745033772 0ustar00jvanekmock00000000000000/* Epiphany.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting.browsers; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.browsertesting.Browsers; public class Epiphany extends MozillaFamilyLinuxBrowser { String[] cs = {}; public Epiphany(String bin) { super(bin); } @Override public List getComaptibilitySwitches() { return Arrays.asList(cs); } @Override public Browsers getID() { return Browsers.epiphany; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/PaxHeaders.7406/M0000644000000000000000000000032513441742745030667 xustar00123 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/MozillaFamilyLinuxBrowser.java 30 mtime=1552401893.137832619 30 atime=1552402157.281253382 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/MozillaFamilyLinu0000644000175000002070000000431413441742745034702 0ustar00jvanekmock00000000000000/* MozillaFamilyLinuxBrowser.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting.browsers; import java.util.List; public abstract class MozillaFamilyLinuxBrowser extends LinuxBrowser{ public MozillaFamilyLinuxBrowser(String bin) { super(bin); fsdir="mozilla"; } @Override public List getComaptibilitySwitches() { return null; } @Override public List getDefaultSwitches() { return null; } @Override public String getUserDefaultPluginExpectedLocation() { return System.getProperty("user.home")+"/.mozilla/plugins"; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/PaxHeaders.7406/f0000644000000000000000000000013213441742745030714 xustar0030 mtime=1552401893.143832607 30 atime=1552410887.104183464 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/firefox/0000755000175000002070000000000013441742745033016 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/firefox/PaxHeader0000644000000000000000000000033313441742745031352 xustar00129 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/firefox/FirefoxProfilesOperator.java 30 mtime=1552401893.143832607 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/firefox/FirefoxPr0000644000175000002070000001362413441742745034653 0ustar00jvanekmock00000000000000/* FirefoxProfilesOperator.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting.browsers.firefox; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.nio.channels.FileChannel; import net.sourceforge.jnlp.ServerAccess; /** * This class is able to backup and restore firefox profiles. * */ public class FirefoxProfilesOperator { private File backupDir; private File sourceDir; private boolean backuped = false; private FilenameFilter firefoxProfilesFilter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".default") || name.equals("profiles.ini"); } }; public void backupProfiles() throws IOException { if (backuped) { return; } sourceDir = new File(System.getProperty("user.home") + "/.mozilla/firefox/"); File f = File.createTempFile("backupedFirefox_", "_profiles.default"); f.delete(); f.mkdir(); backupDir = f; String message = "Backuping firefox profiles from " + sourceDir.getAbsolutePath() + " to " + backupDir.getAbsolutePath(); ServerAccess.logOutputReprint(message); copyDirs(sourceDir, backupDir, firefoxProfilesFilter); backuped = true; Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { try { restoreProfiles(); } catch (Exception ex) { ServerAccess.logException(ex); } } })); } public void restoreProfiles() throws IOException { if (!backuped) { return; } try { removeProfiles(); } catch (Exception ex) { ServerAccess.logException(ex); } String message = ("Restoring all firefox profiles in " + sourceDir.getAbsolutePath() + " from in " + backupDir.getAbsolutePath()); ServerAccess.logOutputReprint(message); copyDirs(backupDir, sourceDir, firefoxProfilesFilter); } public void removeProfiles() throws IOException { if (!backuped) { return; } String message = ("Removing all firefox profiles from " + sourceDir.getAbsolutePath() + " backup avaiable in " + backupDir.getAbsolutePath()); ServerAccess.logOutputReprint(message); File[] oldProfiles = sourceDir.listFiles(firefoxProfilesFilter); for (File file : oldProfiles) { deleteRecursively(file); } } private void copyDirs(File sourceDir, File backupDir, FilenameFilter firefoxProfilesFilter) throws IOException { File[] profiles = sourceDir.listFiles(firefoxProfilesFilter); for (File file : profiles) { copyRecursively(file, backupDir); } } public static void copyFile(File from, File to) throws IOException { FileInputStream is = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to); FileChannel f = is.getChannel(); try (FileChannel f2 = fos.getChannel()) { f.transferTo(0, f.size(), f2); } finally { f.close(); } } public static void deleteRecursively(File f) throws IOException { if (f.isDirectory()) { for (File c : f.listFiles()) { deleteRecursively(c); } } boolean d = true; d = f.delete(); if (!d) { throw new IOException("Failed to delete file: " + f); } } public static void copyRecursively(File srcFileDir, File destDir) throws IOException { if (srcFileDir.isDirectory()) { File nwDest = new File(destDir, srcFileDir.getName()); nwDest.mkdir(); for (File c : srcFileDir.listFiles()) { copyRecursively(c, nwDest); } } else { copyFile(srcFileDir, new File(destDir, srcFileDir.getName())); } } public static void main(String[] args) throws IOException { FirefoxProfilesOperator ff = new FirefoxProfilesOperator(); ff.restoreProfiles(); ff.backupProfiles(); ff.restoreProfiles(); ff.backupProfiles(); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/PaxHeaders.7406/C0000644000000000000000000000013213441742745030651 xustar0030 mtime=1552401893.142832609 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Chrome.java0000644000175000002070000000363713441742745033445 0ustar00jvanekmock00000000000000/* Chrome.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting.browsers; import net.sourceforge.jnlp.browsertesting.Browsers; public class Chrome extends MozillaFamilyLinuxBrowser { public Chrome(String bin) { super(bin); } @Override public Browsers getID() { return Browsers.googleChrome; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/PaxHeaders.7406/F0000644000000000000000000000013213441742745030654 xustar0030 mtime=1552401893.143832607 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java0000644000175000002070000000605313441742745033625 0ustar00jvanekmock00000000000000/* Firefox.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting.browsers; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.ProcessAssasin; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; public class Firefox extends MozillaFamilyLinuxBrowser { private static final FirefoxProfilesOperator firefoxProfilesOperatorSingleton = new FirefoxProfilesOperator(); public Firefox(String bin) { super(bin); } String[] cs = {"-new-tab"}; @Override public Browsers getID() { return Browsers.firefox; } @Override public List getComaptibilitySwitches() { return Arrays.asList(cs); } @Override public void beforeProcess(String s) { try { firefoxProfilesOperatorSingleton.backupProfiles(); //assuming firefox is not in safemode already } catch (Exception ex) { throw new RuntimeException("Firefox profile backup failed", ex); } } @Override public void afterProcess(String s) { } @Override public void beforeKill(String s) { } @Override public void afterKill(String s) { try { firefoxProfilesOperatorSingleton.restoreProfiles(); } catch (Exception ex) { throw new RuntimeException("Firefox profile restoration failed", ex); } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/PaxHeaders.7406/Browser.ja0000644000000000000000000000013213441742745030635 xustar0030 mtime=1552401893.134832625 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/Browser.java0000644000175000002070000000415613441742745032002 0ustar00jvanekmock00000000000000/* Browser.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting; import java.util.List; /** * interface which represents individual browsers */ public interface Browser extends ReactingProcess{ public String getDefaultBin(); public String getDefaultPluginExpectedLocation(); public String getBin(); //public void setBin(String bin); public String getUserDefaultPluginExpectedLocation(); public Browsers getID(); public List getComaptibilitySwitches(); public List getDefaultSwitches(); } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/PaxHeaders.7406/Browsers.j0000644000000000000000000000013213441742745030657 xustar0030 mtime=1552401893.136832621 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/Browsers.java0000644000175000002070000000615713441742745032170 0ustar00jvanekmock00000000000000/* Browsers.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting; import java.io.File; import net.sourceforge.jnlp.browsertesting.browsers.LinuxBrowser; /** * When all represent all configured browser, one represens one random * (the first found) configured browser. Each other represents inidivdual browsers * */ public enum Browsers { none, all, one, opera, googleChrome, chromiumBrowser, firefox, midori,epiphany; public static final String CHROMIUM; static { final String def = "chromium"; final String alt = "chromium-browser"; if (new File(LinuxBrowser.DEFAULT_BIN_PATH, alt).exists()) { CHROMIUM = alt; } else { CHROMIUM = def; } } public String toExec() { switch (this) { case opera: return "opera"; case googleChrome: return "google-chrome"; case chromiumBrowser: return CHROMIUM; case firefox: return "firefox"; case midori: return "midori"; case epiphany: return "epiphany"; default: return null; } } @Override public String toString() { if (toExec()!=null) return toExec(); switch (this) { case all: return "all"; case one: return "one"; case none: return "unset_browser"; default: return "unknown"; } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/PaxHeaders.7406/BrowserFac0000644000000000000000000000013213441742745030656 xustar0030 mtime=1552401893.143832607 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/browsertesting/BrowserFactory.java0000644000175000002070000001776313441742745033342 0ustar00jvanekmock00000000000000/* BrowserFactory.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browsertesting; import net.sourceforge.jnlp.annotations.TestInBrowsers; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.browsers.Chrome; import net.sourceforge.jnlp.browsertesting.browsers.Chromium; import net.sourceforge.jnlp.browsertesting.browsers.Epiphany; import net.sourceforge.jnlp.browsertesting.browsers.Firefox; import net.sourceforge.jnlp.browsertesting.browsers.Midory; import net.sourceforge.jnlp.browsertesting.browsers.Opera; public class BrowserFactory { private static final BrowserFactory factory = new BrowserFactory(System.getProperty(ServerAccess.USED_BROWSERS)); private List configuredBrowsers; Random oneGenerator = new Random(); public static BrowserFactory getFactory() { return factory; } /** * This is public just for testing purposes! */ public BrowserFactory(String browsers) { if (browsers == null) { configuredBrowsers = new ArrayList(0); } else { String[] s = browsers.split(File.pathSeparator); configuredBrowsers = new ArrayList(s.length); for (int i = 0; i < s.length; i++) { String string = s[i]; String[] p = string.split("/"); if (p.length > 1) { string = p[p.length - 1]; } if (string.equals(Browsers.chromiumBrowser.toString())) { configuredBrowsers.add(new Chromium(s[i])); } if (string.equals(Browsers.googleChrome.toString())) { configuredBrowsers.add(new Chrome(s[i])); } if (string.equals(Browsers.opera.toString())) { configuredBrowsers.add(new Opera(s[i])); } if (string.equals(Browsers.firefox.toString())) { configuredBrowsers.add(new Firefox(s[i])); } if (string.equals(Browsers.epiphany.toString())) { configuredBrowsers.add(new Epiphany(s[i])); } if (string.equals(Browsers.midori.toString())) { configuredBrowsers.add(new Midory(s[i])); } } } } public Browser getBrowser(Browsers id) { for (int i = 0; i < configuredBrowsers.size(); i++) { Browser browser = configuredBrowsers.get(i); if (browser.getID() == id) { return browser; } } return null; } public Browser getFirst() { for (int i = 0; i < configuredBrowsers.size(); i++) { Browser browser = configuredBrowsers.get(i); return browser; } return null; } public Browser getRandom() { if (configuredBrowsers.isEmpty()){ return null; } return configuredBrowsers.get(oneGenerator.nextInt(configuredBrowsers.size())); } public List getAllBrowsers() { return Collections.unmodifiableList(configuredBrowsers); } public List getBrowsers(TestInBrowsers tib) { return getBrowsers(tib.testIn()); } public List getBrowsers(Browsers[] testIn) { List q = translateAnnotationSilently(testIn); if (q==null || q.isEmpty()){ List qq = new ArrayList(0); qq.add(Browsers.none); return qq; } List qq = new ArrayList(q.size()); for (Browser browser : q) { qq.add(browser.getID()); } return qq; } /** * * @param testIn Bbrowsers which should be transformed to list of Browser * @return all matching browser, if browser do not exists, this is ignored and run is silently continued */ public List translateAnnotationSilently(Browsers[] testIn) { if (testIn==null) { return null; } List r = new ArrayList(configuredBrowsers.size()); for (Browsers b : testIn) { if (b == Browsers.all) { if (getAllBrowsers().isEmpty()) { ServerAccess.logErrorReprint("You try to add all browsers, but there is none"); } else { r.addAll(getAllBrowsers()); } } else if (b == Browsers.one) { Browser bb = getRandom(); if (bb == null) { ServerAccess.logErrorReprint("You try to add random browser, but there is none"); } else { r.add(bb); } } else { Browser bb = getBrowser(b); if (bb == null) { ServerAccess.logErrorReprint("You try to add " + b.toString() + " browser, but it do not exists"); } else { r.add(bb); } } } return r; } /** * * @param tib * @return all matching browser, if browser do not exists, exception is thrown */ public List translateAnnotationLaudly(TestInBrowsers tib) { return translateAnnotationLaudly(tib.testIn()); } public List translateAnnotationLaudly(Browsers[] testIn) { List r = new ArrayList(configuredBrowsers.size()); for (Browsers b :testIn) { if (b == Browsers.all) { if (getAllBrowsers().isEmpty()) { throw new IllegalStateException("You try to add all browsers, but there is none"); } r.addAll(getAllBrowsers()); } else if (b == Browsers.one) { Browser bb = getRandom(); if (bb == null) { throw new IllegalStateException("You try to add random browser, but there is none"); } r.add(bb); } else { Browser bb = getBrowser(b); if (bb == null) { throw new IllegalStateException("You try to add " + b.toString() + " browser, but it do not exists"); } r.add(bb); } } return r; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/awt0000644000000000000000000000013213441742745024333 xustar0030 mtime=1552401893.148832596 30 atime=1552410887.104183464 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/0000755000175000002070000000000013441742745025220 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/PaxHeaders.7406/awtactions0000644000000000000000000000013213441742745026507 xustar0030 mtime=1552401893.165832561 30 atime=1552410887.104183464 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/awtactions/0000755000175000002070000000000013441742745027374 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/awtactions/PaxHeaders.7406/MouseActio0000644000000000000000000000013213441742745030557 xustar0030 mtime=1552401893.148832596 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/awtactions/MouseActions.java0000644000175000002070000001624413441742745032657 0ustar00jvanekmock00000000000000/* MouseActions.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.awt.awtactions; import java.awt.Rectangle; import java.awt.Robot; import java.awt.event.InputEvent; /** * class MouseActions * * static methods for manipulating the mouse via AWT robot */ public class MouseActions { private static final int defaultDelay = 250; /** * method click presses and releases given mouse keys * with reasonable delay before the event * * @param mouseKeyMask * @param robot * @param delayMs */ public static void click(int mouseKeyMask, Robot robot, int delayMs){ robot.delay(delayMs); robot.mousePress(mouseKeyMask); robot.delay(delayMs); robot.mouseRelease(mouseKeyMask); } public static void click(int mouseKeyMask, Robot robot){ robot.delay(defaultDelay); robot.mousePress(mouseKeyMask); robot.delay(defaultDelay); robot.mouseRelease(mouseKeyMask); } /** * method doubleClick presses and releases given mouse keys * two times with reasonable delays * * @param mouseKeyMask * @param robot * @param delayMs */ public static void doubleClick(int mouseKeyMask, Robot robot, int delayMs){ click(mouseKeyMask, robot, delayMs); click(mouseKeyMask, robot, delayMs); } public static void doubleClick(int mouseKeyMask, Robot robot){ click(mouseKeyMask, robot, defaultDelay); click(mouseKeyMask, robot, defaultDelay); } /** * method drag presses the right mouse key, * drags the mouse to a point, and releases the mouse key * with reasonable delays * * @param xTo * @param yTo * @param robot * @param delayMs */ public static void drag(int xTo, int yTo, Robot robot, int delayMs){ robot.delay(delayMs); robot.mousePress(InputEvent.BUTTON1_MASK); robot.delay(delayMs); robot.mouseMove(xTo, yTo); } public static void drag(int xTo, int yTo, Robot robot){ robot.delay(defaultDelay); robot.mousePress(InputEvent.BUTTON1_MASK); robot.delay(defaultDelay); robot.mouseMove(xTo, yTo); } /** * method dragFromRectangle clicks in the middle * of the given rectangle and drags the mouse from the rectangle * with reasonable delays * * @param rectangle * @param robot * @param delayMs */ public static void dragFromRectangle(Rectangle rectangle, Robot robot, int delayMs){ int x1 = rectangle.x + rectangle.width/2; int y1 = rectangle.y + rectangle.height/2; int x2 = x1 + 2*rectangle.width; int y2 = y1 + 2*rectangle.height; robot.delay(delayMs); robot.mouseMove(x1, y1); drag(x2,y2, robot); } public static void dragFromRectangle(Rectangle rectangle, Robot robot){ dragFromRectangle(rectangle, robot, defaultDelay); } /** * method moveInsideRectangle places the mouse in the middle * of the given rectangle and moves the mouse inside the rectangle * with reasonable delays * * @param rectangle * @param robot * @param delayMs */ public static void moveInsideRectangle(Rectangle rectangle, Robot robot, int delayMs){ int x1 = rectangle.x + rectangle.width/2; int y1 = rectangle.y + rectangle.height/2; int x2 = x1 + rectangle.width/4; int y2 = y1 + rectangle.height/4; robot.delay(delayMs); robot.mouseMove(x1, y1); robot.delay(delayMs); robot.mouseMove(x2, y2); } public static void moveInsideRectangle(Rectangle rectangle, Robot robot){ moveInsideRectangle(rectangle, robot, defaultDelay); } /** * * @param rectangle * @param robot * @param delayMs */ public static void moveMouseToMiddle(Rectangle rectangle, Robot robot, int delayMs){ robot.delay(delayMs); int x = rectangle.x + (rectangle.width/2); int y = rectangle.y + (rectangle.height/2); robot.mouseMove(x,y); } public static void moveMouseToMiddle(Rectangle rectangle, Robot robot){ moveMouseToMiddle(rectangle, robot, defaultDelay); } /** * * @param rectangle * @param robot * @param delayMs */ public static void moveMouseOutside(Rectangle rectangle, Robot robot, int delayMs){ robot.delay(delayMs); int x = rectangle.x + 2*rectangle.width; int y = rectangle.y + 2*rectangle.height; robot.mouseMove(x,y); } public static void moveMouseOutside(Rectangle rectangle, Robot robot){ moveMouseOutside(rectangle, robot, defaultDelay); } /** * method clickInside moves the mouse in the middle point * of a given rectangle and clicks with reasonable delay * * @param rectangle * @param robot * @param delayMs */ public static void clickInside(int mouseKey, Rectangle rectangle, Robot robot, int delayMs){ moveMouseToMiddle(rectangle, robot, delayMs); robot.delay(delayMs); click(mouseKey, robot, delayMs); } public static void clickInside(int mouseKey, Rectangle rectangle, Robot robot){ clickInside(mouseKey, rectangle, robot, defaultDelay); } public static void clickInside(Rectangle rectangle, Robot robot, int delayMs){ clickInside(InputEvent.BUTTON1_MASK, rectangle, robot, delayMs); } public static void clickInside(Rectangle rectangle, Robot robot){ clickInside(rectangle, robot, defaultDelay); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/awtactions/PaxHeaders.7406/KeyboardAc0000644000000000000000000000013213441742745030513 xustar0030 mtime=1552401893.165832561 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/awtactions/KeyboardActions.java0000644000175000002070000000666513441742745033335 0ustar00jvanekmock00000000000000/* KeyboardActions.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.awt.awtactions; import java.awt.Robot; import java.awt.event.KeyEvent; public class KeyboardActions { private static final int defaultDelay = 250; /** * method writeText for simulating typing the * given String text by a user with delays * allowed characters in the text: 0-9, a-z, the space * between the keystrokes * * @param robot * @param text * @param delayMs */ public static void writeText(Robot robot, String text, int delayMs){ for (int i = 0; i < text.length(); i++){ char c = text.charAt(i); typeKey(robot, keyFromChar(c), delayMs); } } public static void writeText(Robot robot, String text){ writeText(robot,text, defaultDelay); } /** * method typeKey for pressing and releasing given key * with a reasonable delay * * @param robot * @param key * @param delayMs */ public static void typeKey(Robot robot, int key, int delayMs){ robot.delay(delayMs); robot.keyPress(key); robot.delay(delayMs); robot.keyRelease(key); } public static void typeKey(Robot robot, int key){ typeKey(robot, key, defaultDelay); } /** * method returning the KeyInput event int * if the character is not from a-b, 0-9, the returned value is * KeyEvent.VK_SPACE * * @param ch * @return */ public static int keyFromChar(char ch){ int key; if( ('0' <= ch) && ('9' >= ch) ){ key = (ch - '0') + KeyEvent.VK_0; }else if( ( 'a' <= ch) && ('z' >= ch) ){ key = (ch - 'a') + KeyEvent.VK_A; }else{ key = KeyEvent.VK_SPACE; } return key; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/PaxHeaders.7406/AWTFrameworkException0000644000000000000000000000013213441742745030523 xustar0030 mtime=1552401893.134832625 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/AWTFrameworkException.java0000644000175000002070000000453113441742745032256 0ustar00jvanekmock00000000000000/* AWTFrameworkException.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.awt; /** * Class AWTFrameworkException is thrown in the AWTFramework * whenever the framework encounters not enough data specified * to perform an action (for example it is impossible to ascertain * the position of an applet in the screenshot if the width or height * of the applet is not known. * */ public class AWTFrameworkException extends Exception { public AWTFrameworkException() { super(); } public AWTFrameworkException(String s) { super(s); } public AWTFrameworkException(String s, Throwable throwable) { super(s, throwable); } public AWTFrameworkException(Throwable throwable) { super(throwable); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/PaxHeaders.7406/imagesearch0000644000000000000000000000013213441742745026603 xustar0030 mtime=1552401893.144832604 30 atime=1552410887.104183464 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/0000755000175000002070000000000013441742745027470 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/PaxHeaders.7406/Component0000644000000000000000000000031613441742745030551 xustar00116 path=icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ComponentNotFoundException.java 30 mtime=1552401893.139832615 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ComponentNotFoundExceptio0000644000175000002070000000472713441742745034545 0ustar00jvanekmock00000000000000/* ComponentNotFoundException.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.awt.imagesearch; /** * Class ComponentNotFoundException is thrown in the AWTFramework * in such cases when a position of a component is needed for further * action and the component is not found in the screenshot (for example * a method should click on a button of given colour and the button * is not found, then the method cannot perform its action and * throws ComponentNotFoundException). * */ public class ComponentNotFoundException extends Exception { public ComponentNotFoundException() { super(); } public ComponentNotFoundException(String s) { super(s); } public ComponentNotFoundException(String s, Throwable throwable) { super(s, throwable); } public ComponentNotFoundException(Throwable throwable) { super(throwable); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/PaxHeaders.7406/marker.pn0000644000000000000000000000013213441742745030500 xustar0030 mtime=1552401893.144832604 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/marker.png0000644000175000002070000000026413441742745031461 0ustar00jvanekmock00000000000000‰PNG  IHDR DЄŠЦPLTE$$$џmmmЖЖЖџџџџџџџjЮАjTIDAT8Ых“1Р B]ўџт.ЉZЄГsѓХƒ#bŠц~šёgР •В™54=р 6lQй3šFЁeИОBЭq МBљCkгsу5м”i +RЕуIENDЎB`‚icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/PaxHeaders.7406/Component0000644000000000000000000000013213441742745030545 xustar0030 mtime=1552401893.135832623 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ComponentFinder.java0000644000175000002070000001222013441742745033422 0ustar00jvanekmock00000000000000/* ComponentFinder.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.awt.imagesearch; import java.awt.Color; import java.awt.Point; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; public class ComponentFinder { public static final BufferedImage defaultIcon; static{ try { defaultIcon = ImageIO.read(ClassLoader.getSystemClassLoader().getResource("net/sourceforge/jnlp/awt/imagesearch/marker.png")); } catch (IOException e) { throw new RuntimeException("ComponentFinder - problem initializing defaultIcon",e); } } /** * method findColoredRectangle determines coordinates of a rectangle colored * by rectangleColor surrounded by a neighbourhood of surroundingColor * * @param rectangleColor * @param surroundingColor * @param screenshot * @return */ public static Rectangle findColoredRectangle(Color rectangleColor, Color surroundingColor, BufferedImage screenshot) { Rectangle r = ImageSeeker.findColoredAreaGap(screenshot, rectangleColor, surroundingColor, 0, screenshot.getHeight(), 0); if( ImageSeeker.isRectangleValid(r)){ return r; }else{ return null; } } /** * method findColoredRectangle determines coordinates of a rectangle colored * by rectangleColor surrounded by a neighbourhood of surroundingColor with * possible gap of several pixels * * @param rectangleColor * @param surroundingColor * @param screenshot * @param gap * @return */ public static Rectangle findColoredRectangle(Color rectangleColor, Color surroundingColor, BufferedImage screenshot, int gap) { Rectangle r = ImageSeeker.findColoredAreaGap(screenshot, rectangleColor, surroundingColor, 0, screenshot.getHeight(), gap); if( ImageSeeker.isRectangleValid(r)){ return r; }else{ return null; } } /** * Method findWindowByIcon finds the application area assuming there is a * given icon in given position on the application window * the dimension of the window has to be given. * * @param icon * @param iconPosition * @param windowWidth * @param windowHeight * @param screenshot * @return Rectangle rectangle where the applet resides */ public static Rectangle findWindowByIcon(BufferedImage icon, Point iconPosition, int windowWidth, int windowHeight, BufferedImage screenshot) { Rectangle r = ImageSeeker.findExactImage(icon, screenshot); if( ImageSeeker.isRectangleValid(r)){ return windowPositionFromIconPosition(r.getLocation(), iconPosition, windowWidth, windowHeight); }else{ return null; } } public static Rectangle findWindowByIconBlurred(BufferedImage icon, Point iconPosition, int windowWidth, int windowHeight, BufferedImage screenshot, double minCorrelation) { Rectangle r = ImageSeeker.findBlurredImage(icon, screenshot, minCorrelation); if( ImageSeeker.isRectangleValid(r)){ return windowPositionFromIconPosition(r.getLocation(), iconPosition, windowWidth, windowHeight); }else{ return null; } } public static Rectangle windowPositionFromIconPosition(Point iconAbsolute, Point iconRelative, int windowWidth, int windowHeight){ return new Rectangle( iconAbsolute.x - iconRelative.x, iconAbsolute.y - iconRelative.y, windowWidth, windowHeight); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/PaxHeaders.7406/ImageSeek0000644000000000000000000000013213441742745030435 xustar0030 mtime=1552401893.142832609 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ImageSeeker.java0000644000175000002070000003364213441742745032524 0ustar00jvanekmock00000000000000/* ImageSeeker.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.awt.imagesearch; import java.awt.Color; import java.awt.Rectangle; import java.awt.image.BufferedImage; public class ImageSeeker { public static Rectangle findExactImage(BufferedImage marker, BufferedImage screen){ return findExactImage(marker, screen, new Rectangle(0,0,screen.getWidth(), screen.getHeight())); } public static Rectangle findExactImage(BufferedImage marker /*usually small*/, BufferedImage screen, Rectangle actionArea) { Rectangle result = new Rectangle(0, 0, 0, 0); boolean found = false; boolean ok = true; //to filter out values with alpha boolean[][] mask = getMask(marker); //accessing those too often, copying int[][] markerPixels = getPixels(marker); int mw = marker.getWidth(); int mh = marker.getHeight(); for (int y = actionArea.y; (y < (actionArea.y + actionArea.height - marker.getHeight())) && !found; y++) { for (int x = actionArea.x; (x < (actionArea.x + actionArea.width - marker.getWidth())) && !found; x++) { for (int my = 0; (my < mh) && ok; my++) { for (int mx = 0; (mx < mw) && ok; mx++) { //ignore masked (having alpha) values if (!mask[mx][my]) { continue; } if (markerPixels[mx][my] != screen.getRGB(x + mx, y + my)) { ok = false; } } } if( ok ){ found = true; result.x = x; result.y = y; result.height = marker.getHeight(); result.width = marker.getWidth(); }else{ ok = true; } } } if(found){ return result; }else{ return null; } } public static Rectangle findBlurredImage(BufferedImage marker, BufferedImage testImage, double minCorrelation){ return findBlurredImage(marker, testImage, minCorrelation, new Rectangle(0,0,testImage.getWidth(), testImage.getHeight())); } public static Rectangle findBlurredImage(BufferedImage marker, BufferedImage testImage, double minCorrelation, Rectangle actionArea) { int maxX = actionArea.width - marker.getWidth() - 1; int maxY = actionArea.height - marker.getHeight() - 1; int markerMaxX = marker.getWidth(); int markerMaxY = marker.getHeight(); // it is much faster to work directly with color components stored as float values float[][][] testImageArray = createArrayForOneColorComponent(actionArea); float[][][] markerImageArray = createArrayForOneColorComponent(marker); convertImageToFloatArray(testImage, testImageArray, actionArea); convertImageToFloatArray(marker, markerImageArray); int bestX = -1; int bestY = -1; double bestCorrelation = -1; for (int yoffset = 0; yoffset < maxY; yoffset++ ) { for (int xoffset = 0; xoffset < maxX; xoffset++) { double correlation = computeCorrelation(markerMaxX, markerMaxY, testImageArray, markerImageArray, yoffset, xoffset); if (correlation > bestCorrelation) { bestCorrelation = correlation; bestX = xoffset + actionArea.x; bestY = yoffset + actionArea.y; } } } if(bestCorrelation > minCorrelation){ return new Rectangle(bestX, bestY, marker.getWidth(), marker.getHeight()); }else{ return null; } } /** * Create three-dimensional array with the same size as tested image * dimensions (last dimension is used for storing RGB components). * * @param testImage tested image * @return newly created three-dimensional array */ private static float[][][] createArrayForOneColorComponent(BufferedImage testImage) { return new float[testImage.getHeight()][testImage.getWidth()][3]; } /** * Create three-dimensional array with the same size as the given area * dimensions (last dimension is used for storing RGB components). * * @param actionArea * @return newly created three-dimensional array */ private static float[][][] createArrayForOneColorComponent(Rectangle actionArea) { return new float[actionArea.height][actionArea.width][3]; } /** * Conversion from BufferedImage into three dimensional float arrays. * It's much faster to work with float arrays even if it's memory ineficient. * * @param testImage tested image * @param array array to fill */ private static void convertImageToFloatArray(BufferedImage testImage, float[][][] array) { for (int y = 0; y < testImage.getHeight(); y++) { for (int x = 0; x < testImage.getWidth(); x++) { int c = testImage.getRGB(x, y); // filter out alpha channel c = c & 0xffffff; array[y][x][0] = ((c >> 16) & 0xff) - 128f; array[y][x][1] = ((c >> 8) & 0xff) - 128f; array[y][x][2] = (c & 0xff) - 128f; } } } /** * Conversion from BufferedImage into three dimensional float arrays. * It's much faster to work with float arrays even if it's memory ineficient. * This method converts only a given part of the image (actionArea) * * @param testImage tested image * @param array array to fill * @param actionArea rectangle part of the image to convert */ private static void convertImageToFloatArray(BufferedImage testImage, float[][][] array, Rectangle actionArea) { for (int y = actionArea.y; y < (actionArea.height + actionArea.y); y++) { for (int x = actionArea.x; x < (actionArea.width + actionArea.x); x++) { int c = testImage.getRGB(x, y); // filter out alpha channel c = c & 0xffffff; array[y - actionArea.y][x - actionArea.x][0] = ((c >> 16) & 0xff) - 128f; array[y - actionArea.y][x - actionArea.x][1] = ((c >> 8) & 0xff) - 128f; array[y - actionArea.y][x - actionArea.x][2] = (c & 0xff) - 128f; } } } /** * Compute correlation for given two images and 2D offset. * * @param maxX * @param maxY * @param testImageArray * @param markerImageArray * @param yoffset * @param xoffset * @return */ private static double computeCorrelation(int maxX, int maxY, float[][][] testImageArray, float[][][] markerImageArray, int yoffset, int xoffset) { double correlation = 0; for (int y = 0; y < maxY; y++) { for (int x = 0; x < maxX; x++) { for (int rgbIndex = 0; rgbIndex < 3; rgbIndex++) { float colorComponent1 = markerImageArray[y][x][rgbIndex]; float colorComponent2 = testImageArray[yoffset + y][xoffset + x][rgbIndex]; correlation += colorComponent1 * colorComponent2; } } } return correlation; } public static int findHorizontalRule(BufferedImage screen, Color ruleColor, Color bgColor, boolean fromTop) { final int height = screen.getHeight(); int gap = 0; if (!fromTop) { return findHorizontalEdgeGap(screen, ruleColor, bgColor, 1, height - 1, gap); } else { return findHorizontalEdgeGap(screen, bgColor, ruleColor, 1, height - 1, gap); } } public static int findHorizontalEdgeGap(BufferedImage screen, Color area1Color, Color area2Color, int y1, int y2, int gap) { final int width = screen.getWidth(); final int area1RGB = area1Color.getRGB(); final int area2RGB = area2Color.getRGB(); int edgePosition = Integer.MIN_VALUE; int lastFound = Integer.MIN_VALUE; for (int y = y1+1; y < y2 - gap; y++) { int found = 0; for (int x = 0; x < width; x++) { int c1 = screen.getRGB(x, y - 1); int c2 = screen.getRGB(x, y + gap); if (c1 == area1RGB && c2 == area2RGB) { found++; } } if (found > lastFound) { lastFound = found; edgePosition = y; } } return edgePosition; } public static int findVerticalEdgeGap(BufferedImage screen, Color area1Color, Color area2Color, int y1, int y2, int gap) { final int width = screen.getWidth(); final int area1RGB = area1Color.getRGB(); final int area2RGB = area2Color.getRGB(); int edgePosition = Integer.MIN_VALUE; int lastFound = Integer.MIN_VALUE; for (int x = 1; x < width - 1 - gap; x++) { int found = 0; for (int y = y1; y < y2; y++) { int c1 = screen.getRGB(x - 1, y); int c2 = screen.getRGB(x + gap, y); if (c1 == area1RGB && c2 == area2RGB) { found++; } } if (found > lastFound) { lastFound = found; edgePosition = x; } } return edgePosition; } /** * method findColoredAreaGap finds a rectangle of given color surrounded by * area of the second color with a possible gap at the border * * @param screen * @param searchForColor * @param surroundWithColor * @param y1 * @param y2 * @param gap * @return */ public static Rectangle findColoredAreaGap(BufferedImage screen, Color searchForColor, Color surroundWithColor, int y1, int y2, int gap) { int ymin = findHorizontalEdgeGap(screen, surroundWithColor, searchForColor, y1, y2, gap); int ymax = findHorizontalEdgeGap(screen, searchForColor, surroundWithColor, y1, y2, gap); int xmin = findVerticalEdgeGap(screen, surroundWithColor, searchForColor, ymin, ymax, gap); int xmax = findVerticalEdgeGap(screen, searchForColor, surroundWithColor, ymin, ymax, gap); return new Rectangle(xmin, ymin, xmax - xmin, ymax - ymin); } public static boolean isRectangleValid(Rectangle r){ if (r == null) return false; return (r.width != 0)&&(r.height != 0)&&(r.x != Integer.MIN_VALUE)&&(r.y != Integer.MIN_VALUE); } public static BufferedImage getMaskImage(BufferedImage icon) { int w = icon.getWidth(); int h = icon.getHeight(); boolean[][] b = getMask(icon); BufferedImage mask = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY); for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { if (b[x][y]) { mask.setRGB(x, y, Color.white.getRGB()); } else { mask.setRGB(x, y, Color.black.getRGB()); } } } return mask; } public static boolean[][] getMask(BufferedImage icon) { int w = icon.getWidth(); int h = icon.getHeight(); boolean[][] r = new boolean[w][h]; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { int i = icon.getRGB(x, y); int alpha = (i >> 24) & 0xff; if (alpha == 255) { r[x][y] = true; } else { r[x][y] = false; } } } return r; } public static int[][] getPixels(BufferedImage icon) { int w = icon.getWidth(); int h = icon.getHeight(); int[][] r = new int[w][h]; for (int x = 0; x < w; x++) { for (int y = 0; y < h; y++) { int i = icon.getRGB(x, y); //remove mask? not yet... r[x][y] = i; } } return r; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/PaxHeaders.7406/AWTHelper.java0000644000000000000000000000013213441742745027046 xustar0030 mtime=1552401893.142832609 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/awt/AWTHelper.java0000644000175000002070000005053413441742745027665 0ustar00jvanekmock00000000000000/* AWTHelper.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.awt; import java.awt.AWTException; import java.awt.Color; import java.awt.Point; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import net.sourceforge.jnlp.awt.awtactions.KeyboardActions; import net.sourceforge.jnlp.awt.awtactions.MouseActions; import net.sourceforge.jnlp.awt.imagesearch.ComponentFinder; import net.sourceforge.jnlp.awt.imagesearch.ComponentNotFoundException; import net.sourceforge.jnlp.awt.imagesearch.ImageSeeker; import net.sourceforge.jnlp.closinglisteners.Rule; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; public abstract class AWTHelper extends RulesFolowingClosingListener implements Runnable{ //attributes possibly set by user private String initStr = null; private Color appletColor; private BufferedImage marker; private Point markerPosition; private int appletHeight; private int appletWidth; private int tryKTimes = DEFAULT_K; //other protected StringBuilder sb = new StringBuilder(); private boolean actionStarted = false; private Rectangle actionArea; private BufferedImage screenshot; private Robot robot; private boolean appletFound = false; private boolean appletColorGiven = false; //impossible to search for color difference if not given private boolean markerGiven = false; //impossible to find the applet if marker not given private boolean appletDimensionGiven = false; private boolean screenshotTaken = false; private int defaultWaitForApplet = 1000; //default number of times the screen is captured and the applet is searched for //in the screenshot public static final int DEFAULT_K = 3; //several constructors /** * the minimal constructor - use: * - if we do not want to find the bounds of applet area first * - searching for buttons and other components is then done in the whole * screen, confusion with other icons on display is then possible * - less effective, deprecated (better bound the area first) */ @Deprecated public AWTHelper() { try { this.robot = new Robot(); } catch (AWTException e) { throw new RuntimeException("AWTHelper could not create its Robot instance.",e); } } /** * the minimal constructor with initStr - use: * - we want to know from stdout that the applet (or sth else) is ready * - if we do not want to find the bounds of applet area first * - searching for buttons and other components is then done in the whole * screen, confusion with other icons on display is then possible * - less effective, deprecated (better bound the area first) */ @Deprecated public AWTHelper(String initStr){ this(); this.initStr = initStr; } /** * the constructor with icon and its position in applet of given dimension * use: * - we want to find and activate the applet first * - the search for applet will be done via searching for icon * of given position(x,y,w,h) inside applet of given width and height * * @param icon marker by which the applet will be found * @param iconPosition relatively to applet (including icon width and height) * @param appletWidth * @param appletHeight */ public AWTHelper(BufferedImage icon, Point iconPosition, int appletWidth, int appletHeight){ this(); this.marker = icon; this.markerPosition = iconPosition; this.markerGiven = true; this.appletWidth = appletWidth; this.appletHeight = appletHeight; this.appletDimensionGiven = true; } public AWTHelper(String initString, BufferedImage icon, Point iconPosition, int appletWidth, int appletHeight) throws AWTException{ this(icon, iconPosition, appletWidth, appletHeight); this.initStr = initString; } /** * the constructor with applet width and height only - use: * - we want to find the applet by finding the default icon * that is located in the upper left corner of applet * * @param appletWidth * @param appletHeight */ public AWTHelper(int appletWidth, int appletHeight){ this(); String test_server_dir_path = System.getProperty("test.server.dir"); this.marker = ComponentFinder.defaultIcon; this.markerPosition = new Point(0,0); this.markerGiven = true; this.appletWidth = appletWidth; this.appletHeight = appletHeight; this.appletDimensionGiven = true; } public AWTHelper(String initString, int appletWidth, int appletHeight){ this(appletWidth, appletHeight); this.initStr = initString; } /** * refers to AWTHelper functioning as RulesFolowingClosingListener * * @param strs array of strings to be added as contains rules */ public void addClosingRulesFromStringArray(String [] strs){ for(String s : strs){ this.addContainsRule(s); } } /** * override of method charReaded (from RulesFolowingClosingListener) * * waiting for the applet, when applet is ready run action thread * (if initStr==null, do not check and do not call run) * * when all the wanted strings are in the stdout, applet can be closed * * @param ch */ @Override public void charReaded(char ch) { sb.append(ch); //is applet ready to start clicking? //check and run applet only if initStr is not null if ((initStr != null) && !actionStarted && appletIsReady(sb.toString())) { try{ actionStarted = true; this.findAndActivateApplet(); this.run(); } catch (ComponentNotFoundException e1) { throw new RuntimeException("AWTHelper problems finding applet.",e1); } catch (AWTFrameworkException e2){ throw new RuntimeException("AWTHelper problems with unset attributes.",e2); } } //is all the wanted output in stdout? super.charReaded(ch); } /** * method runAWTHelper - we can call run and declared the action as started * without finding out if initStr is in the output, if this method is * called * */ public void runAWTHelper(){ actionStarted = true; this.run(); } /** * implementation of AWTHelper should implement the run method */ public abstract void run(); /** * method getInitStrAsRule returns the initStr in the form * of Contains rule that can be evaluated on a string * * @return */ public Rule getInitStrAsRule(){ if( initStr != null ){ return new ContainsRule(this.initStr); }else{ return new Rule(){ @Override public void setRule(String rule) { } @Override public boolean evaluate(String upon) { return true; } @Override public String toPassingString() { return "nothing to check, initStr is null"; } @Override public String toFailingString() { return "nothing to check, initStr is null"; } } ; } } //boolean controls getters protected boolean appletIsReady(String content) { return this.getInitStrAsRule().evaluate(content); } public boolean isActionStarted() { return actionStarted; } public boolean isAppletColorGiven(){ return appletColorGiven; } public boolean isAppletDimensionGiven(){ return appletDimensionGiven; } public boolean isMarkerGiven(){ return markerGiven; } //setters /** * method setDefaultWaitForApplet sets the time (in ms) for which the method * captureScreenAndFindApplet will wait (for the applet to load) before it * gets the screenshot the default time is 1000ms * * @param defaultWaitForApplet */ public void setDefaultWaitForApplet(int defaultWaitForApplet) { this.defaultWaitForApplet = defaultWaitForApplet; } public void setTryKTimes(int tryKTimes) { this.tryKTimes = tryKTimes; } public void setAppletColor(Color appletColor) { this.appletColor = appletColor; this.appletColorGiven = true; } public void setInitStr(String initStr) { this.initStr = initStr; } public void setMarker(BufferedImage marker, Point markerPosition) { this.marker = marker; this.markerPosition = markerPosition; this.markerGiven = true; } public void setAppletDimension(int width, int height){ this.appletWidth = width; this.appletHeight = height; this.appletDimensionGiven = true; } //creating screenshots, searching for applet /** * method captureScreenAndFindAppletByIcon * 1. checks that all needed attributes of AWTHelper are given * (marker, its position and applet width and height) * 2. captures screen, * 3. finds the rectangle where applet is and saves it to the attribute * actionArea * 4. sets screenCapture indicator to true (after tryKTimes unsuccessfull * tries an exception "ComponentNotFound" will be raised) * * @throws ComponentNotFoundException * @throws AWTFrameworkException * @throws AWTFrameworkException */ public void captureScreenAndFindAppletByIcon() throws ComponentNotFoundException, AWTFrameworkException { if(!appletDimensionGiven || !markerGiven){ throw new AWTFrameworkException("AWTFramework cannot find applet without dimension or marker!"); } captureScreenAndFindAppletByIconTryKTimes(marker, markerPosition, appletWidth, appletHeight, tryKTimes); } /** ** method captureScreenAndFindAppletByIcon * 1. captures screen, * 2. finds the rectangle where applet is and saves it to the attribute * actionArea * 3. sets screenCapture indicator to true (after tryKTimes unsuccessfull * tries an exception "ComponentNotFound" will be raised) * * @param icon * @param iconPosition * @param width * @param height * @param K * @throws ComponentNotFoundException */ public void captureScreenAndFindAppletByIconTryKTimes(BufferedImage icon, Point iconPosition, int width, int height, int K) throws ComponentNotFoundException { int count = 0; appletFound = false; while ((count < K) && !appletFound) { robot.delay(defaultWaitForApplet); try { screenshot = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); initialiseOnScreenshot(icon, iconPosition, width, height, screenshot); } catch (ComponentNotFoundException ex) { //keeping silent and try more-times } count++; } if (ImageSeeker.isRectangleValid(actionArea)) { appletFound = true; } else { throw new ComponentNotFoundException("Object not found in the screenshot!"); } } public void initialiseOnScreenshot(BufferedImage icon, Point iconPosition, int width, int height, BufferedImage screenshot) throws ComponentNotFoundException { Rectangle r = ComponentFinder.findWindowByIcon(icon, iconPosition, width, height, screenshot); initialiseOnScreenshotAndArea(screenshot, r); } public void initialiseOnScreenshotAndArea(BufferedImage screenshot, Rectangle actionArea) throws ComponentNotFoundException { this.screenshot = screenshot; screenshotTaken = true; this.actionArea = actionArea; if (ImageSeeker.isRectangleValid(actionArea)) { appletFound = true; } else { throw new ComponentNotFoundException("set invalid area!"); } } /** * auxiliary method writeAppletScreen for writing Buffered image into png * * @param appletScreen * @param filename * @throws IOException */ private void writeAppletScreen(BufferedImage appletScreen, String filename) throws IOException {// into png file ImageIO.write(appletScreen, "png", new File(filename+".png")); } /** * method findAndActivateApplet finds the applet by icon * and clicks in the middle of applet area * * @throws ComponentNotFoundException (applet not found) * @throws AWTFrameworkException */ public void findAndActivateApplet() throws ComponentNotFoundException, AWTFrameworkException { captureScreenAndFindAppletByIcon(); clickInTheMiddleOfApplet(); } //methods for clicking and typing /** * method clickInTheMiddleOfApplet focuses the applet by clicking in the * middle of its location rectangle */ public void clickInTheMiddleOfApplet() { MouseActions.clickInside(this.actionArea, this.robot); } /** * Method clickOnIconExact - click in the middle of a rectangle with * given pattern (icon) using specified mouse key. * If the applet has not been found yet, the search includes whole screen. * * @param icon * @param mouseKey * @throws ComponentNotFoundException */ public void clickOnIconExact(BufferedImage icon, int mouseKey) throws ComponentNotFoundException{ Rectangle areaOfSearch; if(!appletFound){//searching whole screen, less effective areaOfSearch = new Rectangle(0, 0, this.screenshot.getWidth(), this.screenshot.getHeight()); }else{ areaOfSearch = this.actionArea; } Rectangle iconRectangle = ImageSeeker.findExactImage(icon, this.screenshot, areaOfSearch); if (ImageSeeker.isRectangleValid(iconRectangle)) { MouseActions.clickInside(mouseKey, iconRectangle, this.robot); }else{ throw new ComponentNotFoundException("Exact icon not found!"); } } /** * Method clickOnIconBlurred - click in the middle of a rectangle with * given pattern (icon) using specified mouse key. * If the applet has not been found yet, the search includes whole screen. * * @param icon * @param mouseKey * @param precision tolerated minimal correlation (see ImageSeeker methods) * @throws ComponentNotFoundException */ public void clickOnIconBlurred(BufferedImage icon, int mouseKey, double precision) throws ComponentNotFoundException{ Rectangle areaOfSearch; if(!appletFound){//searching whole screen, less effective areaOfSearch = new Rectangle(0, 0, this.screenshot.getWidth(), this.screenshot.getHeight()); }else{ areaOfSearch = this.actionArea; } Rectangle iconRectangle = ImageSeeker.findBlurredImage(icon, this.screenshot, precision, areaOfSearch); if (ImageSeeker.isRectangleValid(iconRectangle)) { MouseActions.clickInside(mouseKey, iconRectangle, this.robot); }else{ throw new ComponentNotFoundException("Blurred icon not found!"); } } /** * Method clickOnColoredRectangle - click in the middle of a rectangle with * given color (appletColor must be specified as the background) using * specified mouse key. * * @param c * @param mouseKey * @throws ComponentNotFoundException * @throws AWTFrameworkException * */ public void clickOnColoredRectangle(Color c, int mouseKey) throws ComponentNotFoundException, AWTFrameworkException { Rectangle buttonRectangle = findColoredRectangle(c); if (ImageSeeker.isRectangleValid(buttonRectangle)) { MouseActions.clickInside(mouseKey, buttonRectangle, this.robot); }else{ throw new ComponentNotFoundException("Colored rectangle not found!"); } } public void moveToMiddleOfColoredRectangle(Color c) throws ComponentNotFoundException, AWTFrameworkException { Rectangle buttonRectangle = findColoredRectangle(c); if (ImageSeeker.isRectangleValid(buttonRectangle)) { MouseActions.moveMouseToMiddle(buttonRectangle, this.robot); }else{ throw new ComponentNotFoundException("Colored rectangle not found!"); } } public void moveOutsideColoredRectangle(Color c) throws ComponentNotFoundException, AWTFrameworkException { Rectangle buttonRectangle = findColoredRectangle(c); if (ImageSeeker.isRectangleValid(buttonRectangle)) { MouseActions.moveMouseOutside(buttonRectangle, this.robot); }else{ throw new ComponentNotFoundException("Colored rectangle not found!"); } } public void moveInsideColoredRectangle(Color c) throws ComponentNotFoundException, AWTFrameworkException { Rectangle buttonRectangle = findColoredRectangle(c); if (ImageSeeker.isRectangleValid(buttonRectangle)) { MouseActions.moveInsideRectangle(buttonRectangle, this.robot); }else{ throw new ComponentNotFoundException("Colored rectangle not found!"); } } public void dragFromColoredRectangle(Color c) throws ComponentNotFoundException, AWTFrameworkException { Rectangle buttonRectangle = findColoredRectangle(c); if (ImageSeeker.isRectangleValid(buttonRectangle)) { MouseActions.dragFromRectangle(buttonRectangle, this.robot); }else{ throw new ComponentNotFoundException("Colored rectangle not found!"); } } public Rectangle findColoredRectangle(Color c) throws AWTFrameworkException { if(!appletColorGiven || !appletFound){ throw new AWTFrameworkException("AWTHelper could not search for colored rectangle, needs appletColor and applet position."); } Rectangle result; int gap = 5; result = ImageSeeker.findColoredAreaGap(this.screenshot, c, appletColor, this.actionArea.y, this.actionArea.y + this.actionArea.height, gap); return result; } /** * method writeText writes string containing small letters and numbers and * spaces like the keyboard input (using KeyboardActions so delays are * inserted) * * @param text */ public void writeText(String text) { KeyboardActions.writeText(this.robot, text); } /** * method typeKey writes one key on the keyboard (again using * KeyboardActions) * * @param key */ public void typeKey(int key) { KeyboardActions.typeKey(this.robot, key); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/ThreadedProcess.java0000644000000000000000000000013213441742745027537 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java0000644000175000002070000001532213441742745030352 0ustar00jvanekmock00000000000000/* ThreadedProcess.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.List; import net.sourceforge.jnlp.util.StreamUtils; /** * * wrapper around Runtime.getRuntime().exec(...) which ensures that process is run inside its own, by us controlled, thread. * Process builder caused some unexpected and weird behavior :/ */ public class ThreadedProcess extends Thread { Process p = null; List args; Integer exitCode; Boolean running; String[] variables; File dir; Throwable deadlyException = null; /* * before removing this "useless" variable * check DeadLockTestTest.testDeadLockTestTerminated2 */ private boolean destoyed = false; private ProcessAssasin assasin; private InputStream writer; public boolean isDestoyed() { return destoyed; } public void setDestoyed(boolean destoyed) { this.destoyed = destoyed; } public Boolean isRunning() { return running; } public Integer getExitCode() { return exitCode; } public void setVariables(String[] variables) { this.variables = variables; } public String[] getVariables() { return variables; } public void setWriter(InputStream writer) { this.writer = writer; } public ThreadedProcess(List args) { this.args = args; } public ThreadedProcess(List args, File dir) { this(args); this.dir = dir; } public ThreadedProcess(List args,String[] vars) { this(args); this.variables = vars; } public ThreadedProcess(List args, File dir,String[] vars) { this(args,dir); this.variables = vars; } public String getCommandLine() { String commandLine = "unknown command"; try { if (args != null && args.size() > 0) { commandLine = ""; for (String string : args) { commandLine = commandLine + " " + string; } } } catch (Exception ex) { ex.printStackTrace(); } return commandLine; } public Process getP() { return p; } @Override public void run() { try { running = true; Runtime r = Runtime.getRuntime(); if (dir == null) { if (variables == null) { p = r.exec(args.toArray(new String[0])); } else { p = r.exec(args.toArray(new String[0]), variables); } } else { p = r.exec(args.toArray(new String[0]), variables, dir); } try { if (writer != null){ Thread t = new Thread(new Runnable() { @Override public void run() { try ( BufferedReader br = new BufferedReader(new InputStreamReader(writer, "utf-8")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream(), "utf-8"))) { while (true) { String s = br.readLine(); if (s == null) { break; } bw.write(s + System.lineSeparator()); bw.flush(); } } catch (Exception ex) { ServerAccess.logException(ex); } } }); t.start(); } StreamUtils.waitForSafely(p); exitCode = p.exitValue(); Thread.sleep(500); //this is giving to fast done proecesses's e/o readers time to read all. I would like to know better solution :-/ while(assasin.isKilling() && !assasin.haveKilled()){ Thread.sleep(100); }; } finally { destoyed = true; } } catch (Exception ex) { if (ex instanceof InterruptedException) { //add to the set of terminated threaded processes deadlyException = ex; ServerAccess.logException(deadlyException, false); //ServerAccess.terminated.add(this); } else { //happens when non-existing process is launched, is causing p null! //ServerAccess.terminated.add(this); deadlyException = ex; ServerAccess.logException(deadlyException, false); throw new RuntimeException(ex); } } finally { running = false; } } void setAssasin(ProcessAssasin pa) { this.assasin=pa; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/LogItem.java0000644000000000000000000000013213441742745026020 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/LogItem.java0000644000175000002070000000601013441742745026625 0ustar00jvanekmock00000000000000/* LogItem.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.util.Date; class LogItem { public final Date timeStamp = new Date(); public final StackTraceElement[] fullTrace = Thread.currentThread().getStackTrace(); public final String text; private static final String ITEM_ELEMENT = "item"; private static final String ITEM_ID_ATTRIBUTE = "id"; private static final String STAMP_ELEMENT = "stamp"; private static final String TEXT_ELEMENT = "text"; private static final String FULLTRACE_ELEMENT = "fulltrace"; public LogItem(String text) { this.text = text; } public StringBuilder toStringBuilder(int id) { StringBuilder sb = new StringBuilder(); sb.append(" <" + ITEM_ELEMENT + " " + ITEM_ID_ATTRIBUTE + "=\"").append(id).append("\">\n"); sb.append(" <" + STAMP_ELEMENT + ">\n"); sb.append(" <" + TEXT_ELEMENT + ">\n"); sb.append(" <" + FULLTRACE_ELEMENT + "> \n"); sb.append(" \n"); return sb; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/annotations0000644000000000000000000000013213441742745026075 xustar0030 mtime=1552401893.165832561 30 atime=1552410887.104183464 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/0000755000175000002070000000000013441742745026762 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/PaxHeaders.7406/Remote.java0000644000000000000000000000013213441742745030250 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/Remote.java0000644000175000002070000000373313441742745031066 0ustar00jvanekmock00000000000000/* Bug.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Mark for tests running content on remote servers */ @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Remote { } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/PaxHeaders.7406/WindowsIssue.0000644000000000000000000000013213441742745030616 xustar0030 mtime=1552401893.143832607 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/WindowsIssue.java0000644000175000002070000000474513441742745032302 0ustar00jvanekmock00000000000000/* Copyright (C) 2017 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** *

* This annotation marks a test as a known failure (as opposed to a * regression). A test that is a known failure will not hold of a release, * nor should developers hold off a fix if they run the unit tests and a * test marked as a known failure fails. *

* This annotation is meant for adding tests for bugs before the fix is * implemented. *

*

* The meaning of optional parameter failsIn is either a list of * browsers where the test fails, or a default value - an empty array {}, * default value means that the test fails always. *

*/ @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface WindowsIssue { } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/PaxHeaders.7406/KnownToFail.j0000644000000000000000000000013213441742745030520 xustar0030 mtime=1552401893.148832596 30 atime=1552402157.280253384 30 ctime=1552410887.092183492 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/KnownToFail.java0000644000175000002070000000512713441742745032025 0ustar00jvanekmock00000000000000/* KnownToFail.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import net.sourceforge.jnlp.browsertesting.Browsers; /** *

* This annotation marks a test as a known failure (as opposed to a * regression). A test that is a known failure will not hold of a release, * nor should developers hold off a fix if they run the unit tests and a * test marked as a known failure fails. *

* This annotation is meant for adding tests for bugs before the fix is * implemented. *

*

* The meaning of optional parameter failsIn is either a list of * browsers where the test fails, or a default value - an empty array {}, * default value means that the test fails always. *

*/ @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface KnownToFail { public Browsers[] failsIn() default {}; } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/PaxHeaders.7406/Bug.java0000644000000000000000000000013213441742745027532 xustar0030 mtime=1552401893.165832561 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/Bug.java0000644000175000002070000000560213441742745030345 0ustar00jvanekmock00000000000000/* Bug.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * When declare for suite class or for Test-marked method, * should be interpreted by report generating tool to links. * Known shortcuts are * SX - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=X * PRX - http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=X * RHX - https://bugzilla.redhat.com/show_bug.cgi?id=X * DX - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=X * GX - http://bugs.gentoo.org/show_bug.cgi?id=X * CAX - http://server.complang.tuwien.ac.at/cgi-bin/bugzilla/show_bug.cgi?id=X * LPX - https://bugs.launchpad.net/bugs/X * * http://mail.openjdk.java.net/pipermail/distro-pkg-dev/ * and http://mail.openjdk.java.net/pipermail/ are proceed differently * You just put eg @Bug(id="RH12345",id="http:/my.bukpage.com/terribleNew") * and RH12345 will be transalated as * 123456 or * similar, the url will be inclueded as is. Both added to proper tests or suites * */ @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Bug { public String[] id(); } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/PaxHeaders.7406/NeedsDisplay.0000644000000000000000000000013213441742745030537 xustar0030 mtime=1552401893.134832625 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/NeedsDisplay.java0000644000175000002070000000407013441742745032212 0ustar00jvanekmock00000000000000/* NeedsDisplay.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * This annotation should be declared for each test which requires DISPALY defined. * If no display is defined, then those test will not be run * */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NeedsDisplay { } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/PaxHeaders.7406/TestInBrowser0000644000000000000000000000013213441742745030647 xustar0030 mtime=1552401893.141832611 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/annotations/TestInBrowsers.java0000644000175000002070000000376313441742745032573 0ustar00jvanekmock00000000000000/* TestInBrowsers.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import net.sourceforge.jnlp.browsertesting.Browsers; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestInBrowsers { public Browsers[] testIn(); } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/ProcessWrapper.java0000644000000000000000000000013213441742745027437 xustar0030 mtime=1552401893.134832625 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/ProcessWrapper.java0000644000175000002070000002137113441742745030253 0ustar00jvanekmock00000000000000/* ProcessWrapper.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.browsertesting.ReactingProcess; import org.junit.Assert; /** * This class wraps execution of ThreadedProcess. * Add listeners and allows another setters, eg of ReactingProcess * */ public class ProcessWrapper { private List args; private File dir; private final List stdoutl = new ArrayList<>(1); private final List stderrl = new ArrayList<>(1); private String[] vars; private ReactingProcess reactingProcess; private InputStream writer; public ProcessWrapper() { } public ProcessWrapper(String toBeExecuted, List otherargs, URL u) { this(toBeExecuted, otherargs, u.toString()); } public ProcessWrapper(String toBeExecuted, List otherargs, String s) { Assert.assertNotNull(s); Assert.assertNotNull(toBeExecuted); Assert.assertTrue(toBeExecuted.trim().length() > 1); if (otherargs == null) { otherargs = new ArrayList<>(1); } List urledArgs = new ArrayList<>(otherargs); urledArgs.add(0, toBeExecuted); urledArgs.add(s); this.args = urledArgs; this.vars=null; } public ProcessWrapper(String toBeExecuted, List otherargs, URL u, ContentReaderListener stdoutl, ContentReaderListener stderrl, String[] vars) throws Exception { this(toBeExecuted, otherargs, u); this.addStdOutListener(stdoutl); this.addStdErrListener(stderrl); this.vars=vars; } public ProcessWrapper(String toBeExecuted, List otherargs, URL u, List stdoutl, List stderrl, String[] vars) throws Exception { this(toBeExecuted, otherargs, u); this.addStdOutListeners(stdoutl); this.addStdErrListeners(stderrl); this.vars=vars; } ProcessWrapper(final List args, File dir, ContentReaderListener stdoutl, ContentReaderListener stderrl, String[] vars) { this.args = args; this.dir = dir; this.addStdOutListener(stdoutl); this.addStdErrListener(stderrl); this.vars = vars; } public ProcessWrapper(final List args, File dir, List stdoutl, List stderrl, String[] vars) { this.args = args; this.dir = dir; this.addStdOutListeners(stdoutl); this.addStdErrListeners(stderrl); this.vars = vars; } public final void addStdOutListener(ContentReaderListener l) { if (l == null) { return; } stdoutl.add(l); } public final void addStdErrListener(ContentReaderListener l) { if (l == null) { return; } stderrl.add(l); } public final void addStdOutListeners(List l) { if (l == null) { return; } stdoutl.addAll(l); } public final void addStdErrListeners(List l) { if (l == null) { return; } stderrl.addAll(l); } /** * @return the args */ public List getArgs() { return args; } /** * @param args the args to set */ public void setArgs(List args) { this.args = args; } /** * @return the dir */ public File getDir() { return dir; } /** * @param dir the dir to set */ public void setDir(File dir) { this.dir = dir; } /** * @return the stdoutl */ public List getStdoutListeners() { return stdoutl; } /** * @return the stderrl */ public List getStderrListeners() { return stderrl; } /** * @return the vars */ public String[] getVars() { return vars; } /** * @param vars the vars to set */ public void setVars(String[] vars) { this.vars = vars; } public ProcessResult execute() throws Exception { if (reactingProcess !=null ){ reactingProcess.beforeProcess(""); } ThreadedProcess t = new ThreadedProcess(args, dir, vars); if (ServerAccess.PROCESS_LOG) { String connectionMesaage = createConnectionMessage(t); ServerAccess.log(connectionMesaage, true, true); } ProcessAssasin pa = new ProcessAssasin(t, ServerAccess.PROCESS_TIMEOUT); t.setAssasin(pa); pa.setReactingProcess(reactingProcess); setUpClosingListener(stdoutl, pa, t); setUpClosingListener(stderrl, pa, t); t.setWriter(writer); pa.start(); t.start(); while (t.getP() == null && t.deadlyException == null) { Thread.sleep(100); } if (t.deadlyException != null) { pa.setCanRun(false); return new ProcessResult("", "", null, true, Integer.MIN_VALUE, t.deadlyException); } ContentReader crs = new ContentReader(t.getP().getInputStream(), stdoutl); ContentReader cre = new ContentReader(t.getP().getErrorStream(), stderrl); OutputStream out = t.getP().getOutputStream(); if (out != null) { out.close(); } new Thread(crs).start(); new Thread(cre).start(); while (t.isRunning()) { Thread.sleep(100); } while (!t.isDestoyed()) { Thread.sleep(100); } pa.setCanRun(false); // ServerAccess.logOutputReprint(t.getP().exitValue()); when process is killed, this throws exception ProcessResult pr = new ProcessResult(crs.getContent(), cre.getContent(), t.getP(), pa.wasTerminated(), t.getExitCode(), null); if (ServerAccess.PROCESS_LOG) { ServerAccess.log(pr.stdout, true, false); ServerAccess.log(pr.stderr, false, true); } if (reactingProcess != null) { reactingProcess.afterProcess(""); } return pr; } private static void setUpClosingListener(List listeners, ProcessAssasin pa, ThreadedProcess t) { for (ContentReaderListener listener : listeners) { if (listener != null && (listener instanceof ClosingListener)) { ((ClosingListener) listener).setAssasin(pa); ((ClosingListener) listener).setProcess(t); } } } private static String createConnectionMessage(ThreadedProcess t) { return "Connecting " + t.getCommandLine(); } void setReactingProcess(ReactingProcess reactingProcess) { this.reactingProcess = reactingProcess; } public void setWriter(InputStream writer) { this.writer = writer; } public void setWriter(String writer) { setWriter(new ByteArrayInputStream(writer.getBytes(StandardCharsets.UTF_8))); } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/Authentication511Requeste0000644000000000000000000000013213441742745030464 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/Authentication511Requester.java0000644000175000002070000000166413441742745032405 0ustar00jvanekmock00000000000000/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package net.sourceforge.jnlp; import java.net.MalformedURLException; /** * * @author jvanek */ public interface Authentication511Requester { public void setNeedsAuthentication511(boolean needsAuthentication511); public void setWasuthenticated511(boolean wasuthenticated011); public boolean isNeedsAuthentication511(); public boolean isWasuthenticated011(); public String createReply1(String memory) throws MalformedURLException; public String createReply2(String memory) throws MalformedURLException; /** * When you put this to true, then , after correct login, the orginal url is returned * @return */ public boolean isRememberOrigianlUrl(); public void setRememberOrigianlUrl(boolean remberUrl); } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/ServerLauncher.java0000644000000000000000000000013213441742745027410 xustar0030 mtime=1552401893.140832613 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/ServerLauncher.java0000644000175000002070000002570113441742745030225 0ustar00jvanekmock00000000000000/* ServerLauncher.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.File; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.ServerSocket; import java.net.URL; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * wrapper around tiny http server to separate lunch configurations and servers. * to allow terminations and stuff around. */ public class ServerLauncher implements Runnable, Authentication511Requester { public static enum ServerNaming { LOCALHOST, LOCALHOST_IP, HOSTNAME } /** * default url name part. This can be changed in runtime, but will affect * all following tasks upon those server */ private String serverName = ServerAccess.DEFAULT_LOCALHOST_NAME; private final String protocol = ServerAccess.DEFAULT_LOCALHOST_PROTOCOL; private boolean running; private final Integer port; private final File dir; private ServerSocket serverSocket; private boolean supportingHeadRequest = true; private ServerNaming serverNaming = ServerNaming.LOCALHOST; public void setSupportingHeadRequest(boolean supportsHead) { this.supportingHeadRequest = supportsHead; } public boolean isSupportingHeadRequest() { return supportingHeadRequest; } public void setServerNaming(ServerNaming naming) { this.serverNaming = naming; } public String getServerName() { if (serverNaming == ServerNaming.HOSTNAME) { try { return InetAddress.getLocalHost().getHostName(); } catch (Exception ex) { ServerAccess.logException(ex); } } if (serverNaming == ServerNaming.LOCALHOST_IP) { return ServerAccess.DEFAULT_LOCALHOST_IP; } return serverName; } public void setServerName(String serverName) { this.serverName = serverName; } public ServerLauncher(Integer port, File dir) { this.port = port; this.dir = dir; System.err.println("port: " + port); System.err.println("dir: " + dir); } public boolean isRunning() { return running; } public Integer getPort() { return port; } public File getDir() { return dir; } public ServerLauncher(File dir) { this(8181, dir); } public ServerLauncher(Integer port) { this(port, new File(System.getProperty("user.dir"))); } public ServerLauncher() { this(8181, new File(System.getProperty("user.dir"))); } /** * When redirect is set, the requests to this server will just redirect to * the underlying ServerLauncher */ private ServerLauncher redirect = null; /** * one of: 301, 302,303, 307, 308, */ private int redirectCode = 302; public void setRedirect(ServerLauncher redirect) { this.redirect = redirect; } public void setRedirectCode(int redirectPort) { this.redirectCode = redirectPort; } //resoource -> request -> number of requests on of this rsource on this server // eg simpletest1.jnlp -> GET -> 3 private Map> requestsCounter; public void setRequestsCounter(Map> requestsCounter) { this.requestsCounter = requestsCounter; } @Override public void run() { running = true; try { serverSocket = new ServerSocket(port); while (running) { TinyHttpdImpl server = new TinyHttpdImpl(serverSocket.accept(), dir, false); server.setRedirect(redirect); server.setRedirectCode(redirectCode); server.setRequestsCounter(requestsCounter); server.setSupportingHeadRequest(isSupportingHeadRequest()); if (isNeedsAuthentication511()) { server.setAuthenticator(this); } server.start(); } } catch (Exception e) { ServerAccess.logException(e); } finally { running = false; } } private String sanitizeResource(String resource) { if (resource == null) { resource = ""; } if (resource.trim().length() > 0 && !resource.startsWith("/")) { resource = "/" + resource; } return resource; } public URL getUrl(String resource) throws MalformedURLException { return new URL(protocol, getServerName(), getPort(), sanitizeResource(resource)); } public URL getUrlLocalhost(String resource) throws MalformedURLException { return new URL(protocol, serverName, getPort(), sanitizeResource(resource)); } public URL getUrlLocalhostIp(String resource) throws MalformedURLException { return new URL(protocol, ServerAccess.DEFAULT_LOCALHOST_IP, getPort(), sanitizeResource(resource)); } public URL getUrlHostName(String resource) throws MalformedURLException, UnknownHostException { return new URL(protocol, InetAddress.getLocalHost().getHostName(), getPort(), sanitizeResource(resource)); } public List getUrlAliases(String resource) throws MalformedURLException, UnknownHostException { List l = new ArrayList<>(3); l.add(getUrlLocalhost(resource)); l.add(getUrlLocalhostIp(resource)); l.add(getUrlHostName(resource)); if (l.size() != ServerNaming.values().length) { throw new RuntimeException("Not all aliases returned! (returned " + l.size() + " expected " + ServerNaming.values().length + ")"); } return l; } public URL getUrl() throws MalformedURLException { return getUrl(""); } public void stop() { this.running = false; if (serverSocket != null) { try { serverSocket.close(); } catch (Exception ex) { ServerAccess.logException(ex); } } System.err.println("stopped : " + port); } @Override public String toString() { try { if (redirect != null) { return getUrl() + " - " + super.toString() + "; redirecting via: " + redirectCode + " to " + redirect.toString(); } else { return getUrl() + " - " + super.toString(); } } catch (Exception ex) { ServerAccess.logException(ex); } return super.toString(); } private boolean needsAuthentication511 = false; private boolean wasuthenticated511 = false; private boolean remberLastUrl = false; @Override public boolean isRememberOrigianlUrl() { return remberLastUrl; } @Override public void setRememberOrigianlUrl(boolean remberUrl) { remberLastUrl = remberUrl; } @Override public void setNeedsAuthentication511(boolean needsAuthentication511) { this.needsAuthentication511 = needsAuthentication511; } @Override public void setWasuthenticated511(boolean wasuthenticated011) { this.wasuthenticated511 = wasuthenticated011; } @Override public boolean isNeedsAuthentication511() { return needsAuthentication511; } @Override public boolean isWasuthenticated011() { return wasuthenticated511; } public static final String login501_1 = "login501_1"; public static final String login501_2 = "login501_2"; @Override public String createReply1(String memory) throws MalformedURLException { String hidden = ""; if (memory != null) { hidden = "?memory=" + memory; } return "\n" + "\n" + " Network Authentication Required\n" + " \n" + "\n" + "\n" + "

You need to \n" + " authenticate with the local network in order to gain\n" + " access.

\n" + "\n" + "\n"; } @Override public String createReply2(String memory) throws MalformedURLException { String s1 = "\n" + "\n" + " Network Authentication Required\n" + "\n" + "\n" + "

Itw 511 simulator use itw/itw for successful login

\n" //+ "

\n" //+TODO test on post " \n" + " \n" + " First name:
\n" + " password:
\n" + " \n"; String hidden = ""; if (memory != null) { hidden = "\n"; } return s1 + hidden + "
\n" + "

\n" + "\n" + "\n"; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/ContentReader.java0000644000000000000000000000013213441742745027215 xustar0030 mtime=1552401893.140832613 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/ContentReader.java0000644000175000002070000001260313441742745030027 0ustar00jvanekmock00000000000000/* ContentReader.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.List; /** * Class to read content of stdout/stderr of process, and to cooperate with its * running/terminated/finished statuses. */ class ContentReader implements Runnable { StringBuilder sb = new StringBuilder(); private final InputStream is; private boolean done; final List listeners = new ArrayList(1); public String getContent() { return sb.toString(); } public ContentReader(InputStream is) throws IOException { this.is = is; } public ContentReader(InputStream is, ContentReaderListener l) throws IOException { this.is = is; if (l != null) { this.listeners.add(l); } } public ContentReader(InputStream is, List l) throws IOException { this.is = is; if (l != null) { this.listeners.addAll(l); } } public void addListener(ContentReaderListener listener) { this.listeners.add(listener); } public List getListener() { return listeners; } /** * Blocks until the copy is complete, or until the thread is interrupted */ public synchronized void waitUntilDone() throws InterruptedException { boolean interrupted = false; // poll interrupted flag, while waiting for copy to complete while (!(interrupted = Thread.interrupted()) && !done) { wait(1000); } if (interrupted) { ServerAccess.logNoReprint("Stream copier: throwing InterruptedException"); //throw new InterruptedException(); } } @Override public void run() { try { Reader br = new InputStreamReader(is, "UTF-8"); StringBuilder line = new StringBuilder(); while (true) { int s = br.read(); if (s < 0) { if (line.length() > 0 && listeners != null) { for (ContentReaderListener listener : listeners) { if (listener != null) { listener.lineReaded(line.toString()); } } } break; } char ch = (char) s; sb.append(ch); line.append(ch); if (ch == '\n') { if (listeners != null) { for (ContentReaderListener listener : listeners) { if (listener != null) { listener.lineReaded(line.toString()); } } } line = new StringBuilder(); } if (listeners != null) { for (ContentReaderListener listener : listeners) { if (listener != null) { listener.charReaded(ch); } } } } } catch (NullPointerException ex) { ex.printStackTrace(); } //do not want to bother output with terminations //mostly compaling when assassin kill the process about StreamClosed catch (Exception ex) { // logException(ex); //ex.printStackTrace(); } finally { try { is.close(); } catch (Exception ex) { // ex.printStackTrace(); } finally { done = true; } } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/util0000644000000000000000000000013213441742745024515 xustar0030 mtime=1552401893.168832555 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/util/0000755000175000002070000000000013441742745025402 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/util/PaxHeaders.7406/logging0000644000000000000000000000013113441742745026142 xustar0029 mtime=1552401893.15183259 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/util/logging/0000755000175000002070000000000013441742745027030 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/NoStdOutErrT0000644000000000000000000000013113441742745030456 xustar0029 mtime=1552401893.15183259 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/util/logging/NoStdOutErrTest.java0000644000175000002070000001317513441742745032732 0ustar00jvanekmock00000000000000/* Copyright (C) 2011-2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.io.OutputStream; import java.io.PrintStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import net.sourceforge.jnlp.ServerAccess; import org.junit.AfterClass; import org.junit.BeforeClass; /** * It is crucial that BeforeClass inits logging subsystem. * If logging subsytem of itw is enabled from itw, then junit's classloader do not * see it. And so when is junit manipualting with logging, then it creates new (second!) * static instance. On opposite, if junit creates the instance, then itw see this one. * * Explanation is that junit classloader (fresh for each test-class) is creating * special classloader for itw (or better itw is creating its own one). The itw * classloader is then branch...or leaf of junit classloader. So any class loaded * by junit classloader is visible from itw, but not vice verse. */ public class NoStdOutErrTest { private static boolean origialStds; private static final String setLogToStreams = "setLogToStreams"; /* * "printed" exceptions are otherwise consumed via junit if thrown :-/ */ private static Object origOut; private static Object origErr; private static PrintStream dummy = new PrintStream(new OutputStream() { @Override public void write(int b) { //DO NOTHING } }); @BeforeClass public static synchronized void disableStds() { try { //init logger and log and flush message //it is crucial for junit to grip it OutputController.getLogger().log("initialising"); //one more times: if TESTED class is the first which creates instance of logger //then when junit can not access this class, and creates its own for its purposes //when junit creates this class, then also TESTED class have access to it and so it behaves as expected OutputController.getLogger().flush(); origialStds = LogConfig.getLogConfig().isLogToStreams(); invokeSetLogToStreams(false); removeStreams(); } catch (Exception ex) { ServerAccess.logException(ex); } } @AfterClass public static synchronized void restoreStds() { try { OutputController.getLogger().flush(); invokeSetLogToStreams(origialStds); resetStreams(); } catch (Exception ex) { ServerAccess.logException(ex); } } private static synchronized void invokeSetLogToStreams(boolean state) { try { Method lcs = LogConfig.class.getDeclaredMethod(setLogToStreams, boolean.class); lcs.setAccessible(true); lcs.invoke(LogConfig.getLogConfig(), state); } catch (Exception ex) { ServerAccess.logException(ex); } } private static synchronized void removeStreams() { try { Field lcs1 = OutputController.class.getDeclaredField("outLog"); lcs1.setAccessible(true); origOut = lcs1.get(OutputController.getLogger()); Field lcs2 = OutputController.class.getDeclaredField("errLog"); lcs2.setAccessible(true); origErr = lcs1.get(OutputController.getLogger()); lcs1.set(OutputController.getLogger(), new PrintStreamLogger(dummy)); lcs2.set(OutputController.getLogger(), new PrintStreamLogger(dummy)); } catch (Exception ex) { ServerAccess.logException(ex); } } private static synchronized void resetStreams() { try { Field lcs1 = OutputController.class.getDeclaredField("outLog"); lcs1.setAccessible(true); Field lcs2 = OutputController.class.getDeclaredField("errLog"); lcs2.setAccessible(true); lcs1.set(OutputController.getLogger(), origOut); lcs2.set(OutputController.getLogger(), origErr); } catch (Exception ex) { ServerAccess.logException(ex); } } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/util/PaxHeaders.7406/FileTestUtils.java0000644000000000000000000000013213441742745030175 xustar0030 mtime=1552401893.168832555 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/util/FileTestUtils.java0000644000175000002070000001345613441742745031016 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.lang.management.ManagementFactory; import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import javax.management.MBeanServer; import javax.management.ObjectName; import net.sourceforge.jnlp.ServerAccess; public class FileTestUtils { /* Get the open file-descriptor count for the process. Note that this is * specific to Unix-like operating systems. */ static public long getOpenFileDescriptorCount() { MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer(); try { return (Long) beanServer.getAttribute(new ObjectName( "java.lang:type=OperatingSystem"), "OpenFileDescriptorCount"); } catch (Exception e) { // Effectively disables leak tests ServerAccess.logErrorReprint("Warning: Cannot get file descriptors for this platform!"); return 0; } } /* Check the amount of file descriptors before and after a Runnable */ static public void assertNoFileLeak(Runnable runnable) throws InterruptedException { Thread.sleep(10); long filesOpenBefore = getOpenFileDescriptorCount(); runnable.run(); Thread.sleep(10); long filesLeaked = getOpenFileDescriptorCount() - filesOpenBefore; //how come? Appearently can... if (filesLeaked<0){ return; } assertEquals(0, filesLeaked); } /* Creates a file with the given contents */ static public void createFileWithContents(File file, String contents) throws IOException { PrintWriter out = new PrintWriter(file); out.write(contents); out.close(); } /* Creates a jar in a temporary directory, with the given name & file contents */ static public void createJarWithoutManifestContents(File jarFile, File... fileContents) throws Exception{ createJarWithContents(jarFile, null, fileContents); } /* Creates a jar in a temporary directory, with the given name & file contents */ static public void createJarWithContents(File jarFile, Manifest manifestContents, File... fileContents) throws Exception { /* Manifest quite evilly ignores all attributes if we don't specify a version! * Make sure it's set here. */ if (manifestContents != null){ manifestContents.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); } JarOutputStream jarWriter; if (manifestContents == null){ jarWriter = new JarOutputStream(new FileOutputStream(jarFile)); } else { jarWriter = new JarOutputStream(new FileOutputStream(jarFile), manifestContents); } for (File file : fileContents) { jarWriter.putNextEntry(new JarEntry(file.getName())); FileInputStream fileReader = new FileInputStream(file); StreamUtils.copyStream(fileReader, jarWriter); fileReader.close(); jarWriter.closeEntry(); } jarWriter.close(); } /* Creates a jar in a temporary directory, with the given name, manifest & file contents */ static public void createJarWithContents(File jarFile, File... fileContents) throws Exception { /* Note that we always specify a manifest, to avoid empty jars. * Empty jars are not allowed by icedtea-web during the zip-file header check. */ createJarWithContents(jarFile, new Manifest(), fileContents); } /* Creates a temporary directory. Note that Java 7 has a method for this, * but we want to remain 6-compatible. */ static public File createTempDirectory() throws IOException { File file = File.createTempFile("temp", Long.toString(System.nanoTime())); file.delete(); if (!file.mkdir()) { throw new IOException("Failed to create temporary directory '" + file + "' for test."); } return file; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/util/PaxHeaders.7406/CacheTestUtils.java0000644000000000000000000000013213441742745030321 xustar0030 mtime=1552401893.144832604 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/util/CacheTestUtils.java0000644000175000002070000000410313441742745031127 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; public class CacheTestUtils { //Check if input string contains only one instance of given substring public static boolean stringContainsOnlySingleInstance(String in, String substr) { int firstIndex = in.indexOf(substr); int lastIndex = in.lastIndexOf(substr); boolean containsString = firstIndex != -1; boolean onlyOneInstance = firstIndex == lastIndex; return containsString && onlyOneInstance; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/TinyHttpdImpl.java0000644000000000000000000000013213441742745027231 xustar0030 mtime=1552401893.142832609 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java0000644000175000002070000004002713441742745030044 0ustar00jvanekmock00000000000000/* TinyHttpdImpl.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.Socket; import java.net.SocketException; import java.net.URLDecoder; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import net.sourceforge.jnlp.cache.ResourceTracker; /** * based on http://www.mcwalter.org/technology/java/httpd/tiny/index.html Very * small implementation of http return headers for our served resources * Originally Licenced under GPLv2.0 * * When resource starts with XslowX prefix, then resouce (without XslowX) is * returned, but its delivery is delayed */ public class TinyHttpdImpl extends Thread { private static final String CRLF = "\r\n"; private static final String HTTP_NOT_IMPLEMENTED = "HTTP/1.0 " + HttpURLConnection.HTTP_NOT_IMPLEMENTED + " Not Implemented" + CRLF; private static final String HTTP_NOT_FOUND = "HTTP/1.0 " + HttpURLConnection.HTTP_NOT_FOUND + " Not Found" + CRLF; private static final String HTTP_OK = "HTTP/1.0 " + HttpURLConnection.HTTP_OK + " OK" + CRLF; private static final String XSX = "/XslowX"; private Socket socket; private final File testDir; private boolean canRun = true; private boolean supportingHeadRequest = true; private boolean supportLastModified = false; private Authentication511Requester authenticationRequester; public TinyHttpdImpl(Socket socket, File dir) { this(socket, dir, true); } public TinyHttpdImpl(Socket socket, File dir, boolean start) { this.socket = socket; this.testDir = dir; if (start) { start(); } } public void setCanRun(boolean canRun) { this.canRun = canRun; } public void setSupportingHeadRequest(boolean supportsHead) { this.supportingHeadRequest = supportsHead; } public boolean isSupportingHeadRequest() { return this.supportingHeadRequest; } public void setSupportLastModified(boolean supportLastModified) { this.supportLastModified = supportLastModified; } public boolean isSupportingLastModified() { return this.supportLastModified; } public int getPort() { return this.socket.getPort(); } private String extractMemory(String filePath) throws UnsupportedEncodingException { //the memory is last item in form, browsers generraly agree on this int i = filePath.lastIndexOf("="); filePath = filePath.substring(i); filePath = URLDecoder.decode(filePath, "utf-8"); return filePath; } @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); DataOutputStream writer = new DataOutputStream(this.socket.getOutputStream()); try { while (canRun) { String line = reader.readLine(); if (line.length() < 1) { break; } StringTokenizer t = new StringTokenizer(line, " "); String request = t.nextToken(); String filePath = t.nextToken(); boolean isHeadRequest = request.equals(ResourceTracker.RequestMethods.HEAD.toString()); boolean isGetRequest = request.equals(ResourceTracker.RequestMethods.GET.toString()); if (isHeadRequest && !isSupportingHeadRequest()) { ServerAccess.logOutputReprint("Received HEAD request but not supported"); writer.writeBytes(HTTP_NOT_IMPLEMENTED); continue; } if (!isHeadRequest && !isGetRequest) { ServerAccess.logOutputReprint("Received unknown request type " + request); continue; } if (authenticationRequester != null) { if (authenticationRequester.isNeedsAuthentication511()) { if (filePath.startsWith("/" + ServerLauncher.login501_1)) { //requeested login dialog writer.writeBytes(HTTP_OK + CRLF); if (authenticationRequester.isRememberOrigianlUrl()) { writer.writeBytes(authenticationRequester.createReply2(extractMemory(filePath))); } else { writer.writeBytes(authenticationRequester.createReply2(null)); } continue; } else if (filePath.startsWith("/" + ServerLauncher.login501_2) && filePath.contains("name=itw") && filePath.contains("passwd=itw")) { //verifying password authenticationRequester.setWasuthenticated511(true); if (authenticationRequester.isRememberOrigianlUrl()) { filePath = extractMemory(filePath); filePath = filePath.replaceAll("=", ""); } else { writer.writeBytes("HTTP/1.1 200 OK" + CRLF + "Content-Type: text/html" + CRLF + CRLF); writer.writeBytes("Authentication ok, get back to your resource"); continue; } } else if (!authenticationRequester.isWasuthenticated011()) { //request authentication - redirect to 501_1 writer.writeBytes("HTTP/1.1 511 Network Authentication Required" + CRLF + "Content-Type: text/html" + CRLF + CRLF); if (authenticationRequester.isRememberOrigianlUrl()) { writer.writeBytes(authenticationRequester.createReply1(filePath)); } else { writer.writeBytes(authenticationRequester.createReply1(null)); } continue; } } } boolean slowSend = filePath.startsWith(XSX); if (requestsCounter != null) { String resource = filePath.replace(XSX, "/"); resource = urlToFilePath(resource); Map reosurceRecord = requestsCounter.get(resource); if (reosurceRecord == null) { reosurceRecord = new HashMap<>(); requestsCounter.put(resource, reosurceRecord); } Integer i = reosurceRecord.get(request); if (i == null) { i = 0; } i++; reosurceRecord.put(request, i); } if (redirect != null) { String where = redirect.getUrl(filePath).toExternalForm(); ServerAccess.logOutputReprint("Redirecting " + request + "as " + redirectCode + " to " + where); writer.writeBytes("HTTP/1.0 " + redirectCode + " Moved" + CRLF); writer.writeBytes("Location: " + where + CRLF); writer.writeBytes(CRLF); } else { if (slowSend) { filePath = filePath.replace(XSX, "/"); } ServerAccess.logOutputReprint("Getting- " + request + ": " + filePath); filePath = urlToFilePath(filePath); File resource = new File(this.testDir, filePath); if (!(resource.isFile() && resource.canRead())) { ServerAccess.logOutputReprint("Could not open file " + filePath); writer.writeBytes(HTTP_NOT_FOUND); continue; } ServerAccess.logOutputReprint("Serving- " + request + ": " + filePath); int resourceLength = (int) resource.length(); byte[] buff = new byte[resourceLength]; FileInputStream fis = new FileInputStream(resource); fis.read(buff); fis.close(); String contentType = "Content-Type: "; if (filePath.toLowerCase().endsWith(".jnlp")) { contentType += "application/x-java-jnlp-file"; } else if (filePath.toLowerCase().endsWith(".jar")) { contentType += "application/x-jar"; } else { contentType += "text/html"; } String lastModified = ""; if (supportLastModified) { lastModified = "Last-Modified: " + new Date(resource.lastModified()) + CRLF; } writer.writeBytes(HTTP_OK + "Content-Length:" + resourceLength + CRLF + lastModified + contentType + CRLF + CRLF); if (isGetRequest) { if (slowSend) { byte[][] bb = splitArray(buff, 10); for (int j = 0; j < bb.length; j++) { Thread.sleep(2000); byte[] bs = bb[j]; writer.write(bs, 0, bs.length); } } else { writer.write(buff, 0, resourceLength); } } } } } catch (SocketException e) { ServerAccess.logException(e, false); } catch (Exception e) { writer.writeBytes(HTTP_NOT_FOUND); ServerAccess.logException(e, false); } finally { reader.close(); writer.close(); } } catch (Exception e) { ServerAccess.logException(e, false); } } /** * This function splits input array to severasl pieces from byte[length] * splitt to n pieces s is retrunrd byte[n][length/n], except last piece * which contains length%n * * @param input - array to be splitted * @param pieces - to how many pieces it should be broken * @return inidividual pices of original array, which concatet again givs * original array */ public static byte[][] splitArray(byte[] input, int pieces) { int rest = input.length; int rowLength = rest / pieces; if (rest % pieces > 0) { rowLength++; } if (pieces * rowLength >= rest + rowLength) { pieces--; } int i = 0, j = 0; byte[][] array = new byte[pieces][]; array[0] = new byte[rowLength]; for (byte b : input) { if (i >= rowLength) { i = 0; array[++j] = new byte[Math.min(rowLength, rest)]; } array[j][i++] = b; rest--; } return array; } /** * This function transforms a request URL into a path to a file which the * server will return to the requester. * * @param url - the request URL * @return a String representation of the local path to the file * @throws UnsupportedEncodingException */ public static String urlToFilePath(String url) throws UnsupportedEncodingException { url = URLDecoder.decode(url, "UTF-8"); // Decode URL encoded charaters, eg "%3B" becomes ';' if (url.startsWith(XSX)) { url = url.replace(XSX, "/"); } url = url.replaceAll("\\?.*", ""); // Remove query string from URL url = ".".concat(url); // Change path into relative path if (url.endsWith("/")) { url += "index.html"; } url = url.replace('/', File.separatorChar); // If running on Windows, replace '/' in path with "\\" url = stripHttpPathParams(url); return url; } /** * This function removes the HTTP Path Parameter from a given JAR URL, * assuming that the path param delimiter is a semicolon * * @param url - the URL from which to remove the path parameter * @return the URL with the path parameter removed */ public static String stripHttpPathParams(String url) { if (url == null) { return null; } // If JNLP specifies JAR URL with .JAR extension (as it should), then look for any semicolons // after this position. If one is found, remove it and any following characters. int fileExtension = url.toUpperCase().lastIndexOf(".JAR"); if (fileExtension != -1) { int firstSemiColon = url.indexOf(';', fileExtension); if (firstSemiColon != -1) { url = url.substring(0, firstSemiColon); } } return url; } /** * When redirect is set, the requests to this server will just redirect to * the underlying ServerLauncher */ private ServerLauncher redirect = null; void setRedirect(ServerLauncher redirect) { this.redirect = redirect; } /** * one of: 301, 302,303, 307, 308, */ private int redirectCode = 302; void setRedirectCode(int redirectPort) { this.redirectCode = redirectPort; } //resoource -> request -> number of requests on of this rsource on this server // eg simpletest1.jnlp -> GET -> 3 private Map> requestsCounter; public void setRequestsCounter(Map> requestsCounter) { this.requestsCounter = requestsCounter; } void setAuthenticator(Authentication511Requester ar) { this.authenticationRequester = ar; } } icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/PaxHeaders.7406/LoggingBottleneck.java0000644000000000000000000000013213441742745030061 xustar0030 mtime=1552401893.141832611 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/net/sourceforge/jnlp/LoggingBottleneck.java0000644000175000002070000002355713441742745030705 0ustar00jvanekmock00000000000000/* LoggingBottleneck.java Copyright (C) 2011,2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.lang.reflect.Method; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; public class LoggingBottleneck { /** * default singleton */ private static LoggingBottleneck loggingBottleneck; private static final File DEFAULT_LOG_FILE = new File("ServerAccess-logs.xml"); private static final File DEFAULT_STDERR_FILE = new File("stderr.log"); private static final File DEFAULT_STDOUT_FILE = new File("stdout.log"); private static final File DEFAULT_STDLOGS_FILE = new File("all.log"); private static final String LOGS_ELEMENT = "logs"; private static final String CLASSLOG_ELEMENT = "classlog"; private static final String CLASSNAME_ATTRIBUTE = "className"; private static final String TESTLOG_ELEMENT = "testLog"; private static final String TESTMETHOD_ATTRIBUTE = "testMethod"; private static final String FULLID_ATTRIBUTE = "fullId"; private BufferedWriter DEFAULT_STDERR_WRITER; private BufferedWriter DEFAULT_STDOUT_WRITER; private BufferedWriter DEFAULT_STDLOGS_WRITER; /** * This is static copy of name of id of currentBrowser for logging purposes */ private String loggedBrowser = Browsers.none.toString(); /** * map of classes, each have map of methods, each have errorlist, outLIst, and allList (allist contains also not std or err messages) * class.testMethod.logs */ final Map> processLogs = Collections.synchronizedMap(new HashMap>(1000)); private boolean added = false; synchronized public static LoggingBottleneck getDefaultLoggingBottleneck() { if (loggingBottleneck == null) { loggingBottleneck = new LoggingBottleneck(); } return loggingBottleneck; } private LoggingBottleneck() { try { DEFAULT_STDOUT_WRITER = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(DEFAULT_STDOUT_FILE))); DEFAULT_STDERR_WRITER = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(DEFAULT_STDERR_FILE))); DEFAULT_STDLOGS_WRITER = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(DEFAULT_STDLOGS_FILE))); } catch (Throwable t) { t.printStackTrace(); } } synchronized void writeXmlLog() throws FileNotFoundException, IOException { writeXmlLog(DEFAULT_LOG_FILE); } synchronized void writeXmlLog(File f) throws FileNotFoundException, IOException { writeXmlLog(f, Collections.unmodifiableMap(processLogs)); } synchronized static void writeXmlLog(File f, Map> processLogs) throws FileNotFoundException, IOException { Writer w = new OutputStreamWriter(new FileOutputStream(f)); Set>> classes = processLogs.entrySet(); w.write("<" + LOGS_ELEMENT + ">"); for (Entry> classLog : classes) { String className = classLog.getKey(); w.write("<" + CLASSLOG_ELEMENT + " " + CLASSNAME_ATTRIBUTE + "=\"" + className + "\">"); Set> testsLogs = classLog.getValue().entrySet(); for (Entry testLog : testsLogs) { String testName = testLog.getKey(); String testLogs = testLog.getValue().toString(); w.write("<" + TESTLOG_ELEMENT + " " + TESTMETHOD_ATTRIBUTE + "=\"" + testName + "\" " + FULLID_ATTRIBUTE + "=\"" + className + "." + testName + "\" >"); w.write(clearChars(testLogs)); w.write(""); } w.write(""); } w.write(""); w.flush(); w.close(); } synchronized void addToXmlLog(String message, boolean printToOut, boolean printToErr, StackTraceElement ste) { Map classLog = processLogs.get(ste.getClassName()); if (classLog == null) { classLog = new HashMap(50); processLogs.put(ste.getClassName(), classLog); } String methodBrowseredName = ste.getMethodName(); methodBrowseredName = modifyMethodWithForBrowser(methodBrowseredName, ste.getClassName()); TestsLogs methodLog = classLog.get(methodBrowseredName); if (methodLog == null) { methodLog = new TestsLogs(); classLog.put(methodBrowseredName, methodLog); } if (!added) { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { LoggingBottleneck.getDefaultLoggingBottleneck().writeXmlLog(); } catch (Exception ex) { ex.printStackTrace(); } } }); added = true; } methodLog.add(printToErr, printToOut, message); } synchronized public String modifyMethodWithForBrowser(String methodBrowseredName, String className) { try { Class clazz = Class.forName(className); /* * By using this isAssignable to ensure corect class before invocation, * then we lost possibility to track manualy set browsers, but it is correct, * as method description is set only when annotation is used */ if (clazz != null && BrowserTest.class.isAssignableFrom(clazz)) { Method testMethod = clazz.getMethod(methodBrowseredName); if (testMethod != null) { TestInBrowsers tib = testMethod.getAnnotation(TestInBrowsers.class); if (tib != null) { methodBrowseredName = methodBrowseredName + " - " + loggedBrowser; } } } } catch (Throwable ex) { ex.printStackTrace(); } return methodBrowseredName; } synchronized public void setLoggedBrowser(String loggedBrowser) { this.loggedBrowser = loggedBrowser; } synchronized public void logIntoPlaintextLog(String message, boolean printToOut, boolean printToErr) { try { if (printToOut) { LoggingBottleneck.getDefaultLoggingBottleneck().stdout(message); } if (printToErr) { LoggingBottleneck.getDefaultLoggingBottleneck().stderr(message); } LoggingBottleneck.getDefaultLoggingBottleneck().stdeall(message); } catch (Throwable t) { t.printStackTrace(); } } private void stdout(String idded) throws IOException { DEFAULT_STDOUT_WRITER.write(idded); DEFAULT_STDOUT_WRITER.newLine(); DEFAULT_STDOUT_WRITER.flush(); } private void stderr(String idded) throws IOException { DEFAULT_STDERR_WRITER.write(idded); DEFAULT_STDERR_WRITER.newLine(); DEFAULT_STDERR_WRITER.flush(); } private void stdeall(String idded) throws IOException { DEFAULT_STDLOGS_WRITER.write(idded); DEFAULT_STDLOGS_WRITER.newLine(); DEFAULT_STDLOGS_WRITER.flush(); } synchronized public static String clearChars(String ss) { StringBuilder s = new StringBuilder(ss); for (int i = 0; i < s.length(); i++) { char q = s.charAt(i); if (q == '\n') { continue; } if (q == '\t') { continue; } int iq = (int) q; if ((iq <= 31 || iq > 65533)||(iq >= 64976 && iq <= 65007)) { s.setCharAt(i, 'I'); s.insert(i + 1, "NVALID_CHAR_" + iq); i--; } } return s.toString(); } } icedtea-web-1.8/tests/test-extensions/PaxHeaders.7406/sun0000644000000000000000000000013213441742745020271 xustar0030 mtime=1552401893.138832617 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/sun/0000755000175000002070000000000013441742745021156 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/sun/PaxHeaders.7406/applet0000644000000000000000000000013213441742745021556 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/sun/applet/0000755000175000002070000000000013441742745022443 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/sun/applet/PaxHeaders.7406/mock0000644000000000000000000000013213441742745022507 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/sun/applet/mock/0000755000175000002070000000000013441742745023374 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions/sun/applet/mock/PaxHeaders.7406/PluginPipeMock.java0000644000000000000000000000013213441742745026315 xustar0030 mtime=1552401893.141832611 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/sun/applet/mock/PluginPipeMock.java0000644000175000002070000000724613441742745027136 0ustar00jvanekmock00000000000000package sun.applet.mock; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.StringReader; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * Helper for getting an input and output stream for use with PluginStreamHandler. * Provides a convenient way of reading the Java requests and sending mocked * plugin responses. * * The handling of these requests should be done on a different thread from the * tested method, as icedtea-web will block waiting for a reply after sending a * request. */ public class PluginPipeMock { private ResponseInputPipeMock responseInputStream = new ResponseInputPipeMock(); private RequestOutputPipeMock requestOutputStream = new RequestOutputPipeMock(); /* * A queue of mocked responses that are sent as replies to icedtea-web * Java-side requests. */ private BlockingQueue mockedResponseQueue = new LinkedBlockingQueue(); /* * A queue of actual (ie, not mocked) requests that come from methods * under test. */ private BlockingQueue requestQueue = new LinkedBlockingQueue(); public InputStream getResponseInputStream() { return responseInputStream; } public OutputStream getRequestOutputStream() { return requestOutputStream; } public String getNextRequest() { try { return requestQueue.take(); } catch (InterruptedException e) { // Nothing to do return null; } } public void sendResponse(String response) { try { mockedResponseQueue.put(response); } catch (InterruptedException e) { // Nothing to do } } /** * Queues mocked responses and sends them as replies to icedtea-web. A * synchronized message queue is read from. Blocks until it gets the next * message. */ private class ResponseInputPipeMock extends InputStream { private StringReader reader = null; @Override public int read() throws IOException { try { while (true) { if (reader == null) { reader = new StringReader(mockedResponseQueue.take() + '\n'); } int chr = reader.read(); if (chr == -1) { reader = null; continue; } return chr; } } catch (InterruptedException e) { // Nothing to do return -1; } } /* Necessary for correct behaviour with BufferedReader! */ @Override public int read(byte b[], int off, int len) throws IOException { if (len == 0) { return 0; } b[off] = (byte) read(); return 1; } } /** * Outputs requests from icedtea-web as a stream of lines. A synchronized * message queue is written to. */ private class RequestOutputPipeMock extends OutputStream { private StringBuilder lineBuffer = new StringBuilder(); @Override public synchronized void write(int b) throws IOException { try { char chr = (char) b; if (chr == '\0') { requestQueue.put(lineBuffer.toString()); lineBuffer.setLength(0); } else { lineBuffer.append((char) b); } } catch (InterruptedException e) { // Nothing to do } } } } icedtea-web-1.8/tests/test-extensions/sun/applet/PaxHeaders.7406/PluginPipeMockUtil.java0000644000000000000000000000013213441742745026222 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions/sun/applet/PluginPipeMockUtil.java0000644000175000002070000001320013441742745027026 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /* Must be in sun.applet to access PluginAppletSecurityContext's constructor and PluginObjectStore */ package sun.applet; import java.util.IdentityHashMap; import sun.applet.mock.PluginPipeMock; /* * Convenience class for PluginPipeMock. * Provides convenient methods for installing a custom pipe mock and cleaning it up. * * Provides PipeMessageHandler interface and accompany convenience methods which can * be used to define mocked pipes in a simple manner. * */ public class PluginPipeMockUtil { /************************************************************************** * Basic setup & teardown * **************************************************************************/ /* Maps PluginPipeMock instances to a ThreadGroup, allowing us to stop all the * message handling threads that we started when setting up the mock pipes. */ static private IdentityHashMap pipeToThreadGroup = new IdentityHashMap(); /* By providing custom implementations of the input stream & output stream used by PluginStreamHandler, * we are able to mock the C++-side of the plugin. We do this by sending the messages the Java-side expects * to receive. Additionally, we are able to test that the Java-side sends the correct requests. * See PluginPipeMock for more details. */ static private PluginPipeMock installPipeMock() { AppletSecurityContextManager.addContext(0, new PluginAppletSecurityContext(0, false /* no security manager */)); PluginPipeMock pipeMock = new PluginPipeMock(); PluginStreamHandler streamHandler = new PluginStreamHandler(pipeMock.getResponseInputStream(), pipeMock.getRequestOutputStream()); PluginAppletViewer.setStreamhandler(streamHandler); PluginAppletViewer.setPluginCallRequestFactory(new PluginCallRequestFactory()); streamHandler.startProcessing(); return pipeMock; } /* Set up the mocked plugin pipe environment. See installPipeMock for details. */ static public PluginPipeMock setupMockedMessageHandling() throws Exception { ThreadGroup pipeThreadGroup = new ThreadGroup("PluginAppletViewerTestThreadGroup") { public void uncaughtException(Thread t, Throwable e) { // Silent death for plugin message handler threads } }; final PluginPipeMock[] pipeMock = {null}; // Do set-up in a thread so we can pass along our thread-group, used for clean-up. Thread initThread = new Thread(pipeThreadGroup, "InstallPipeMockThread") { @Override public void run() { pipeMock[0] = installPipeMock(); } }; initThread.start(); initThread.join(); pipeToThreadGroup.put(pipeMock[0], pipeThreadGroup); return pipeMock[0]; } /* Kill any message handling threads started when setting up the mocked pipes */ @SuppressWarnings("deprecation") static public void cleanUpMockedMessageHandling(PluginPipeMock pipeMock) throws Exception { ThreadGroup pipeThreadGroup = pipeToThreadGroup.get(pipeMock); if (pipeThreadGroup != null) { pipeThreadGroup.stop(); } pipeToThreadGroup.remove(pipeMock); } /************************************************************************** * Object store utilities * **************************************************************************/ /* * Helpers for manipulating the object mapping using to refer to objects in * the plugin */ public static Object getPluginStoreObject(int id) { return PluginObjectStore.getInstance().getObject(id); } /* Stores the object if it is not yet stored */ public static int getPluginStoreId(Object obj) { PluginObjectStore.getInstance().reference(obj); return PluginObjectStore.getInstance().getIdentifier(obj); } } icedtea-web-1.8/tests/PaxHeaders.7406/test-extensions-tests0000644000000000000000000000013113441742745020623 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/0000755000175000002070000000000013441742745021511 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions-tests/PaxHeaders.7406/net0000644000000000000000000000013113441742745021411 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/0000755000175000002070000000000013441742745022277 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions-tests/net/PaxHeaders.7406/sourceforge0000644000000000000000000000013113441742745023734 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/0000755000175000002070000000000013441742745024622 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/PaxHeaders.7406/jnlp0000644000000000000000000000013213441742745024700 xustar0030 mtime=1552401893.164832563 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/0000755000175000002070000000000013441742745025565 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/PaxHeaders.7406/MessagePropertiesTe0000644000000000000000000000013213441742745030632 xustar0030 mtime=1552401893.136832621 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/MessagePropertiesTest.java0000644000175000002070000000773613441742745032746 0ustar00jvanekmock00000000000000/* MessagePropertiesTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools; import java.util.Locale; import net.sourceforge.jnlp.tools.MessageProperties; import org.junit.Test; import org.junit.Assert; public class MessagePropertiesTest { private static final Locale locale_en = MessageProperties.SupportedLanguage.en.getLocale(), locale_cs = MessageProperties.SupportedLanguage.cs.getLocale(), locale_de = MessageProperties.SupportedLanguage.de.getLocale(), locale_pl = MessageProperties.SupportedLanguage.pl.getLocale(); private void testMessageStringEquals(Locale locale, String key, String expected) { String message = MessageProperties.getMessage(locale, key); Assert.assertEquals(message, expected); } @Test public void testLocalization_en() throws Exception { testMessageStringEquals(locale_en, "Continue", "Do you want to continue?"); } @Test public void testLocalization_cs() throws Exception { testMessageStringEquals(locale_cs, "Continue", "Chcete pokra\u010dovat?"); } @Test public void testLocalization_de() throws Exception { testMessageStringEquals(locale_de, "Continue", "Soll fortgefahren werden?"); } @Test public void testLocalization_pl() throws Exception { testMessageStringEquals(locale_pl, "Continue", "Czy chcesz kontynuowa\u0107?"); } @Test public void testNonexistentLocalization() throws Exception { String message_en = MessageProperties.getMessage(locale_en, "Continue"); String message_abcd = MessageProperties.getMessage(new Locale("abcd"), "Continue"); Assert.assertEquals(message_en, message_abcd); // There is no abcd localization, should fall back to English } @Test public void testDefaultLocalization() throws Exception { String sysPropLang = System.getProperty("user.language"); Locale sysPropLocale = new Locale(sysPropLang); Locale defaultLocale = Locale.getDefault(); String sysPropMessage = MessageProperties.getMessage(sysPropLocale, "LThreadInterruptedInfo"); String defaultMessage = MessageProperties.getMessage(defaultLocale, "LThreadInterruptedInfo"); String implMessage = MessageProperties.getMessage("LThreadInterruptedInfo"); Assert.assertEquals(sysPropMessage, implMessage); Assert.assertEquals(defaultMessage, implMessage); } } icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/PaxHeaders.7406/ServerAccessTest.ja0000644000000000000000000000013213441742745030521 xustar0030 mtime=1552401893.142832609 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/ServerAccessTest.java0000644000175000002070000002474313441742745031672 0ustar00jvanekmock00000000000000/* ServerAccessTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.File; import java.io.FileInputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import org.junit.Assert; import org.junit.Test; /** * * This class provides access to virtual server and stuff around. * It can find unoccupied port, start server, provides its singleton instantiation, lunch parallel instantiations, * read location of installed (tested javaws) see javaws.build.bin java property, * location of server www root on file system (see test.server.dir java property), * stubs for lunching javaws and for locating resources and read resources. * * It can also execute processes with timeout (@see PROCESS_TIMEOUT) (used during lunching javaws) * Some protected apis are exported because public classes in this package are put to be tested by makefile. * * There are included test cases which show some basic usages. * * */ public class ServerAccessTest { ServerAccess serverAccess = new ServerAccess(); @Test public void testsProcessResultFiltering() throws Exception { ProcessResult pn = new ProcessResult(null, null, null, true, 0, null); Assert.assertNull(pn.notFilteredStdout); Assert.assertNull(pn.stdout); Assert.assertNull(pn.stderr); String fakeOut2 = "EMMA: processing instrumentation path ...\n" + "EMMA: package [net.sourceforge.filebrowser] contains classes [ArrayOfString] without full debug info\n" + "EMMA: instrumentation path processed in 1407 ms\n" + "test stage 1\n" + "test stage 2\n" + "EMMA: The intruder!\n" + "test stage 3\n" + "EMMA: [45 class(es) instrumented, 13 resource(s) copied]\n" + "EMMA: metadata merged into [icedtea-web/inc] {in 105 ms}\n" + "EMMA: processing instrumentation path ..."; String filteredOut2 = "test stage 1\n" + "test stage 2\n" + "test stage 3\n"; ProcessResult p2 = new ProcessResult(fakeOut2, fakeOut2, null, true, 0, null); Assert.assertEquals(p2.notFilteredStdout, fakeOut2); Assert.assertEquals(p2.stdout, filteredOut2); Assert.assertEquals(p2.stderr, fakeOut2); fakeOut2 += "\n"; p2 = new ProcessResult(fakeOut2, fakeOut2, null, true, 0, null); Assert.assertEquals(p2.notFilteredStdout, fakeOut2); Assert.assertEquals(p2.stdout, filteredOut2); Assert.assertEquals(p2.stderr, fakeOut2); String fakeOut = "test string\n" + "EMMA: processing instrumentation path ...\n" + "EMMA: package [net.sourceforge.filebrowser] contains classes [ArrayOfString] without full debug info\n" + "EMMA: instrumentation path processed in 1407 ms\n" + "test stage 1\n" + "test stage 2\n" + "test stage 3\n" + "EMMA: [45 class(es) instrumented, 13 resource(s) copied]\n" + "EMMA: metadata merged into [icedtea-web/inc] {in 105 ms}\n" + "EMMA: processing instrumentation path ...\n" + "test ends"; String filteredOut = "test string\n" + "test stage 1\n" + "test stage 2\n" + "test stage 3\n" + "test ends"; ProcessResult p = new ProcessResult(fakeOut, fakeOut, null, true, 0, null); Assert.assertEquals(p.notFilteredStdout, fakeOut); Assert.assertEquals(p.stdout, filteredOut); Assert.assertEquals(p.stderr, fakeOut); fakeOut += "\n"; filteredOut += "\n"; p = new ProcessResult(fakeOut, fakeOut, null, true, 0, null); Assert.assertEquals(p.notFilteredStdout, fakeOut); Assert.assertEquals(p.stdout, filteredOut); Assert.assertEquals(p.stderr, fakeOut); } @Test public void ensureJavaws() throws Exception { String javawsValue = serverAccess.getJavawsLocation(); Assert.assertNotNull(javawsValue); Assert.assertTrue(javawsValue.trim().length() > 2); File javawsFile = serverAccess.getJavawsFile(); Assert.assertTrue(javawsFile.exists()); Assert.assertFalse(javawsFile.isDirectory()); } @Test public void ensureServer() throws Exception { ServerLauncher server = ServerAccess.getInstance(); Assert.assertNotNull(server.getPort()); Assert.assertNotNull(server.getDir()); Assert.assertTrue(server.getPort() > 999); Assert.assertTrue(server.getDir().toString().trim().length() > 2); Assert.assertTrue(server.getDir().exists()); Assert.assertTrue(server.getDir().isDirectory()); File portFile = new File(server.getDir(), "server.port"); File dirFile = new File(server.getDir(), "server.dir"); ServerAccess.saveFile(server.getDir().getAbsolutePath(), dirFile); ServerAccess.saveFile(server.getPort().toString(), portFile); ServerAccess.saveFile(server.getPort().toString(), portFile); Assert.assertTrue(portFile.exists()); Assert.assertTrue(dirFile.exists()); Assert.assertTrue(server.getDir().listFiles().length > 1); String portFileContent = ServerAccess.getContentOfStream(new FileInputStream(portFile)); String dirFileContent = ServerAccess.getContentOfStream(new FileInputStream(dirFile)); URL portUrl = new URL("http", "localhost", server.getPort(), "/server.port"); HttpURLConnection portConn = (HttpURLConnection) portUrl.openConnection(); URL dirUrl = new URL("http", "localhost", server.getPort(), "/server.dir"); HttpURLConnection dirConn = (HttpURLConnection) dirUrl.openConnection(); String portUrlContent = ServerAccess.getContentOfStream(portConn.getInputStream()); String dirUrlContent = ServerAccess.getContentOfStream(dirConn.getInputStream()); Assert.assertEquals(portUrlContent.trim(), portFileContent.trim()); Assert.assertEquals(dirUrlContent.trim(), dirFileContent.trim()); Assert.assertEquals(new File(dirUrlContent.trim()), server.getDir()); Assert.assertEquals(new Integer(portUrlContent.trim()), server.getPort()); URL fastUrl = new URL("http", "localhost", server.getPort(), "/simpletest1.jnlp"); HttpURLConnection fastUrlConn = (HttpURLConnection) fastUrl.openConnection(); URL slowUrl = new URL("http", "localhost", server.getPort(), "/XslowXsimpletest1.jnlp"); HttpURLConnection slowUrlConn = (HttpURLConnection) slowUrl.openConnection(); String fastUrlcontent = ServerAccess.getContentOfStream(fastUrlConn.getInputStream()); String slowUrlContent = ServerAccess.getContentOfStream(slowUrlConn.getInputStream()); Assert.assertEquals(fastUrlcontent, slowUrlContent); portConn.disconnect(); dirConn.disconnect(); fastUrlConn.disconnect(); slowUrlConn.disconnect(); } @Test public void splitArrayTest0() throws Exception { byte[] b = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; byte[][] bb = TinyHttpdImpl.splitArray(b, 3); //printArrays(bb); byte[] b1 = {1, 2, 3, 4, 5}; byte[] b2 = {6, 7, 8, 9, 10}; byte[] b3 = {11, 12, 13, 14}; Assert.assertEquals(3, bb.length); Assert.assertArrayEquals(b1, bb[0]); Assert.assertArrayEquals(b2, bb[1]); Assert.assertArrayEquals(b3, bb[2]); } @Test public void splitArrayTest1() throws Exception { byte[] b = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; byte[][] bb = TinyHttpdImpl.splitArray(b, 3); //printArrays(bb); byte[] b1 = {1, 2, 3, 4, 5}; byte[] b2 = {6, 7, 8, 9, 10}; byte[] b3 = {11, 12, 13}; Assert.assertEquals(3, bb.length); Assert.assertArrayEquals(b1, bb[0]); Assert.assertArrayEquals(b2, bb[1]); Assert.assertArrayEquals(b3, bb[2]); } @Test public void splitArrayTest2() throws Exception { byte[] b = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; byte[][] bb = TinyHttpdImpl.splitArray(b, 3); //printArrays(bb); byte[] b1 = {1, 2, 3, 4}; byte[] b2 = {5, 6, 7, 8}; byte[] b3 = {9, 10, 11, 12}; Assert.assertEquals(3, bb.length); Assert.assertArrayEquals(b1, bb[0]); Assert.assertArrayEquals(b2, bb[1]); Assert.assertArrayEquals(b3, bb[2]); } private void printArrays(byte[][] bb) { System.out.println("[][] l=" + bb.length); for (int i = 0; i < bb.length; i++) { byte[] bs = bb[i]; System.out.println(i + ": l=" + bs.length); for (int j = 0; j < bs.length; j++) { byte c = bs[j]; System.out.print(" " + j + ":" + c + " "); } System.out.println(""); } } } icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/PaxHeaders.7406/tools0000644000000000000000000000013213441742745026040 xustar0030 mtime=1552401893.164832563 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/tools/0000755000175000002070000000000013441742745026725 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/tools/PaxHeaders.7406/DeploymentPro0000644000000000000000000000032013441742745030640 xustar00118 path=icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/tools/DeploymentPropertiesModifierTest.java 30 mtime=1552401893.164832563 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/tools/DeploymentPropertiesModifierT0000644000175000002070000002435113441742745034655 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.IOException; import java.util.AbstractMap; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.InfrastructureFileDescriptor; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.util.FileUtils; import org.junit.Assert; import org.junit.Test; public class DeploymentPropertiesModifierTest { private File deploymentFile; @Test public void testSetProperties() throws IOException { File tempUserFile = File.createTempFile("userDeploy", ""); tempUserFile.deleteOnExit(); deploymentFile = tempUserFile; DummyInfrastructureFileDescriptor deploymentInfrastructure = new DummyInfrastructureFileDescriptor(deploymentFile); String properties = FileUtils.loadFileAsString(deploymentFile); assertEquals(0, properties.length()); DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(deploymentInfrastructure); dpm.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars()); String setProperty = DeploymentConfiguration.KEY_SECURITY_LEVEL + "=" + AppletSecurityLevel.ALLOW_UNSIGNED.toChars() + "\n"; properties = FileUtils.loadFileAsString(deploymentFile); assertEquals(setProperty, properties); } @Test public void testRestoreProperties() throws IOException { File tempUserFile = File.createTempFile("userDeploy", ""); tempUserFile.deleteOnExit(); deploymentFile = tempUserFile; DummyInfrastructureFileDescriptor deploymentInfrastructure = new DummyInfrastructureFileDescriptor(deploymentFile); String properties = FileUtils.loadFileAsString(deploymentFile); assertEquals(0, properties.length()); DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(deploymentInfrastructure); dpm.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars()); String setProperty = DeploymentConfiguration.KEY_SECURITY_LEVEL + "=" + AppletSecurityLevel.ALLOW_UNSIGNED.toChars() + "\n"; properties = FileUtils.loadFileAsString(deploymentFile); assertEquals(setProperty, properties); dpm.restoreProperties(); properties = FileUtils.loadFileAsString(deploymentFile); assertEquals(0, properties.length()); } @Test(expected = IllegalStateException.class) public void testRestorePropertiesRequiresPropertiesSetFirst() throws IOException { File tempUserFile = File.createTempFile("userDeploy", ""); tempUserFile.deleteOnExit(); deploymentFile = tempUserFile; DummyInfrastructureFileDescriptor deploymentInfrastructure = new DummyInfrastructureFileDescriptor(deploymentFile); DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(deploymentInfrastructure); dpm.restoreProperties(); String properties = FileUtils.loadFileAsString(deploymentFile); assertEquals(0, properties.length()); } @Test (expected = IllegalStateException.class) public void testUsingSameDeploymentPropertiesModifierThrowsException() throws IOException { File tempUserFile = File.createTempFile("userDeploy", ""); tempUserFile.deleteOnExit(); deploymentFile = tempUserFile; DummyInfrastructureFileDescriptor deploymentInfrastructure = new DummyInfrastructureFileDescriptor(deploymentFile); DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(deploymentInfrastructure); dpm.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars()); try { dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); } catch (IllegalStateException ise) { dpm.restoreProperties(); throw new IllegalStateException(); } } @Test public void testUsingDifferentDeploymentPropertiesModifier() throws IOException { File tempUserFile = File.createTempFile("userDeploy", ""); tempUserFile.deleteOnExit(); deploymentFile = tempUserFile; DummyInfrastructureFileDescriptor deploymentInfrastructure = new DummyInfrastructureFileDescriptor(deploymentFile); DeploymentPropertiesModifier dpm1 = new DeploymentPropertiesModifier(deploymentInfrastructure); DeploymentPropertiesModifier dpm2 = new DeploymentPropertiesModifier(deploymentInfrastructure); dpm1.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars()); dpm2.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); String contents = DeploymentConfiguration.KEY_SECURITY_LEVEL + "=" + AppletSecurityLevel.ALLOW_UNSIGNED.toChars() + "\n" + DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK + "=" + ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString() + "\n"; String properties = FileUtils.loadFileAsString(deploymentFile); assertEquals(contents, properties); dpm2.restoreProperties(); dpm1.restoreProperties(); } @Test public void testMultipleDeploymentPropertiesModifier() throws IOException { File tempUserFile = File.createTempFile("userDeploy", ""); tempUserFile.deleteOnExit(); String content = "a.b=12\nc.d=34\ne.f=56\ng.h=78\ni.j=90"; FileUtils.saveFile(content, tempUserFile); deploymentFile = tempUserFile; DummyInfrastructureFileDescriptor deploymentInfrastructure = new DummyInfrastructureFileDescriptor(deploymentFile); DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier dpm1 = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier(deploymentInfrastructure, new AbstractMap.SimpleEntry<>("c.d", "22"), new AbstractMap.SimpleEntry<>("i.j", "44") ); dpm1.setProperties(); String propertiesChanged = FileUtils.loadFileAsString(deploymentFile); Assert.assertNotEquals(content, propertiesChanged); Assert.assertTrue(propertiesChanged.contains("12")); Assert.assertFalse(propertiesChanged.contains("34")); Assert.assertTrue(propertiesChanged.contains("22")); Assert.assertTrue(propertiesChanged.contains("56")); Assert.assertTrue(propertiesChanged.contains("78")); Assert.assertFalse(propertiesChanged.contains("90")); Assert.assertTrue(propertiesChanged.contains("44")); Assert.assertTrue(propertiesChanged.contains("a.b")); Assert.assertTrue(propertiesChanged.contains("c.d")); Assert.assertTrue(propertiesChanged.contains("e.f")); Assert.assertTrue(propertiesChanged.contains("g.h")); Assert.assertTrue(propertiesChanged.contains("i.j")); dpm1.restoreProperties(); String propertiesResored = FileUtils.loadFileAsString(deploymentFile); Assert.assertNotEquals(content, propertiesChanged); Assert.assertTrue(propertiesResored.contains("12")); Assert.assertTrue(propertiesResored.contains("34")); Assert.assertFalse(propertiesResored.contains("22")); Assert.assertTrue(propertiesResored.contains("56")); Assert.assertTrue(propertiesResored.contains("78")); Assert.assertTrue(propertiesResored.contains("90")); Assert.assertFalse(propertiesResored.contains("44")); Assert.assertTrue(propertiesResored.contains("a.b")); Assert.assertTrue(propertiesResored.contains("c.d")); Assert.assertTrue(propertiesResored.contains("e.f")); Assert.assertTrue(propertiesResored.contains("g.h")); Assert.assertTrue(propertiesResored.contains("i.j")); // /n at the end of last line may not matter assertEquals(content.trim(), propertiesResored.trim()); } private static class DummyInfrastructureFileDescriptor extends InfrastructureFileDescriptor { private final File file; private DummyInfrastructureFileDescriptor(File file) { super(); this.file = file; } @Override public File getFile() { return file; } @Override public String getFullPath() { return file.getAbsolutePath(); } } } icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/PaxHeaders.7406/TinyHttpdImplTest.j0000644000000000000000000000013113441742745030540 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/TinyHttpdImplTest.java0000644000175000002070000002361613441742745032051 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.net.URLDecoder; import java.nio.file.Files; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.Assert; import org.junit.Test; public class TinyHttpdImplTest { private static final String HTTP_OK = "HTTP/1.0 200 OK"; private static final String HTTP_404 = "HTTP/1.0 404 Not Found"; private static final String HTTP_501 = "HTTP/1.0 501 Not Implemented"; private static final String CONTENT_JNLP = "Content-Type: application/x-java-jnlp-file"; private static final String CONTENT_HTML = "Content-Type: text/html"; private static final String CONTENT_JAR = "Content-Type: application/x-jar"; private static final Pattern CONTENT_LENGTH = Pattern.compile("Content-Length:([0-9]+)"); private static final String[] FilePathTestUrls = { "/foo.html", "/foo/", "/foo/bar.jar", "/foo/bar.jar;path_param", "/foo/bar.jar%3Bpath_param", "/foo/bar?query=string&red=hat" }; private static BufferedReader mReader; private static DataOutputStream mWriter; private static TinyHttpdImpl mServer; static { try { ServerSocket sSocket = new ServerSocket(44322); sSocket.setReuseAddress(true); File dir = new File(System.getProperty("test.server.dir")); Socket extSock = new Socket("localhost", 44322); extSock.setReuseAddress(true); mServer = new TinyHttpdImpl(extSock, dir); Socket socket = sSocket.accept(); socket.setReuseAddress(true); mReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); mWriter = new DataOutputStream(socket.getOutputStream()); } catch (Exception ex) { ex.printStackTrace(); } } @Test public void urlToFilePathTest() throws Exception { for (String url : FilePathTestUrls) { String newUrl = TinyHttpdImpl.urlToFilePath(url); Assert.assertFalse("File path should not contain query string: " + newUrl, newUrl.contains("?")); Assert.assertTrue("File path should be relative: " + newUrl, newUrl.startsWith("./")); Assert.assertFalse("File path should not contain \"/XslowX\":" + newUrl, newUrl.toLowerCase().contains("/XslowX".toLowerCase())); if (url.endsWith("/")) { Assert.assertTrue(newUrl.endsWith("/index.html")); } } } @Test public void urlToFilePathUrlDecodeTest() throws Exception { // This test may fail with strange original URLs, eg those containing the substring "%253B", // which can be decoded into "%3B", then decoded again into ';'. for (String url : FilePathTestUrls) { String newUrl = TinyHttpdImpl.urlToFilePath(url); Assert.assertEquals(newUrl, URLDecoder.decode(newUrl, "UTF-8")); } } @Test public void stripHttpPathParamTest() { String[] testBaseUrls = { "http://foo.com/bar", "localhost:8080", "https://bar.co.uk/site;para/baz?u=param1&v=param2" }; String[] testJarNames = { "jar", "foo.jar", "bar;baz.jar", "nom.jar;", "rhat.jar.pack.gz;tag" }; for (String url : testBaseUrls) { for (String jar : testJarNames) { String newUrl = TinyHttpdImpl.stripHttpPathParams(url), newJar = TinyHttpdImpl.stripHttpPathParams(jar), path = newUrl + "/" + newJar; Assert.assertTrue("Base URL should not have been modified: " + url + " => " + newUrl, newUrl.equals(url)); Assert.assertTrue("JAR name should not be altered other than removing path param: " + jar + " => " + newJar, jar.startsWith(newJar)); Assert.assertTrue("New path should be a substring of old path: " + path + " => " + url + "/" + jar, (url + "/" + jar).startsWith(path)); } } } private void headTestHelper(String request, String contentType) { Matcher matcher = CONTENT_LENGTH.matcher(request); Assert.assertTrue("Status should have been " + HTTP_OK, request.contains(HTTP_OK)); Assert.assertTrue("Content type should have been " + contentType, request.contains(contentType)); Assert.assertTrue("Should have had a content length", matcher.find()); } @Test public void JnlpHeadTest() throws IOException, InterruptedException { String head = getTinyHttpdImplResponse("HEAD", "/simpletest1.jnlp"); headTestHelper(head, CONTENT_JNLP); } @Test public void HtmlHeadTest() throws Exception { String head = getTinyHttpdImplResponse("HEAD", "/StripHttpPathParams.html"); headTestHelper(head, CONTENT_HTML); } @Test public void JarHeadTest() throws Exception { String head = getTinyHttpdImplResponse("HEAD", "/StripHttpPathParams.jar"); headTestHelper(head, CONTENT_JAR); } @Test public void PngHeadTest() throws Exception { // TinyHttpdImpl doesn't recognize PNG type - default content type should be HTML String head = getTinyHttpdImplResponse("HEAD", "/netxPlugin.png"); headTestHelper(head, CONTENT_HTML); } @Test public void testLastModifiedHeader() throws IOException, InterruptedException { mServer.setSupportLastModified(true); String head = getTinyHttpdImplResponse("HEAD", "/simpletest1.jnlp"); headTestHelper(head, CONTENT_JNLP); Assert.assertTrue(head.contains("Last-Modified: ")); mServer.setSupportLastModified(false); } @Test public void testLastModifiedHeaderNotIncluded() throws IOException, InterruptedException { mServer.setSupportLastModified(false); String head = getTinyHttpdImplResponse("HEAD", "/simpletest1.jnlp"); headTestHelper(head, CONTENT_JNLP); Assert.assertTrue(!head.contains("Last-Modified: ")); } @Test public void SlowSendTest() throws Exception { // This test is VERY SLOW due to the extremely slow sending speed TinyHttpdImpl uses when XslowX is specified. // Running time will be over two minutes. long fastStartTime = System.nanoTime(); String req1 = getTinyHttpdImplResponse("GET", "/simpletest1.jnlp"); long fastElapsed = System.nanoTime() - fastStartTime; long slowStartTime = System.nanoTime(); String req2 = getTinyHttpdImplResponse("GET", "/XslowXsimpletest1.jnlp"); long slowElapsed = System.nanoTime() - slowStartTime; Assert.assertTrue("Slow request should have returned the same data as normal request", req1.equals(req2)); // This isn't a very good test since as it is, getTinyHttpdImpl is slowing down its receive rate to // deal with the reduced sending rate. It is hardcoded to be slower. Assert.assertTrue("Slow request should have taken longer than normal request", slowElapsed > fastElapsed); } @Test public void GetTest() throws Exception { String jnlpHead = getTinyHttpdImplResponse("HEAD", "/simpletest1.jnlp"); String jnlpGet = getTinyHttpdImplResponse("GET", "/simpletest1.jnlp"); Assert.assertTrue("GET status should be " + HTTP_OK, jnlpGet.contains(HTTP_OK)); Assert.assertTrue("GET content type should have been " + CONTENT_JNLP, jnlpGet.contains(CONTENT_JNLP)); Assert.assertTrue("GET response should contain HEAD response", jnlpGet.contains(jnlpHead)); Assert.assertTrue("GET response should have been longer than HEAD response", jnlpGet.length() > jnlpHead.length()); } @Test public void Error404DoesNotCauseShutdown() throws Exception { // Pre-refactoring, 404 errors were sent after catching an IOException when trying to open the requested // resource. However this was caught by a try/catch clause around the entire while loop, so a 404 would // shut down the server. String firstRequest = getTinyHttpdImplResponse("HEAD", "/no_such_file"); String secondRequest = getTinyHttpdImplResponse("HEAD", "/simpletest1.jnlp"); Assert.assertTrue("First request should have been " + HTTP_404, firstRequest.trim().equals(HTTP_404)); Assert.assertTrue("Second request should have been " + HTTP_OK, secondRequest.contains(HTTP_OK)); } @Test public void NotSupportingHeadRequest() throws Exception { boolean headRequestSupport = mServer.isSupportingHeadRequest(); mServer.setSupportingHeadRequest(false); String head = getTinyHttpdImplResponse("HEAD", "/simpletest1.jnlp"); Assert.assertTrue("Status should have been " + HTTP_501, head.trim().equals(HTTP_501)); mServer.setSupportingHeadRequest(headRequestSupport); } private String getTinyHttpdImplResponse(String requestType, String filePath) throws IOException, InterruptedException { if (!filePath.startsWith("/")) { filePath = "/" + filePath; } mWriter.writeBytes(requestType + " " + filePath + " HTTP/1.1\r\n"); Thread.sleep(250); // Wait a while for server to be able to respond to request StringBuilder builder = new StringBuilder(); while (mReader.ready()) { // TODO: come up with a better way to deal with slow sending - this works but is hackish if (filePath.startsWith("/XslowX")) { Thread.sleep(2100); // Wait for next chunk to have been sent, otherwise it'll appear as if the response // has finished being sent prematurely } builder.append(mReader.readLine()); builder.append("\n"); } return builder.toString(); } } icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/PaxHeaders.7406/ResourcesTest.java0000644000000000000000000000013213441742745030432 xustar0030 mtime=1552401893.139832615 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/ResourcesTest.java0000644000175000002070000004222513441742745031247 0ustar00jvanekmock00000000000000/* ResourcesTest.java Copyright (C) 2011-2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.browsertesting.Browser; import net.sourceforge.jnlp.browsertesting.BrowserFactory; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.browsers.LinuxBrowser; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class ResourcesTest extends BrowserTest{ @Test @NeedsDisplay public void testNonExisitngBrowserWillNotDeadlock() throws Exception { server.setCurrentBrowser(Browsers.none); ProcessResult pr = server.executeBrowser("not_existing_url.html"); Assert.assertNull(pr.process); Assert.assertEquals(pr.stderr, ""); Assert.assertEquals(pr.stdout, ""); Assert.assertTrue(pr.wasTerminated); Assert.assertTrue(pr.returnValue < 0); Assert.assertNotNull(pr.deadlyException); } @Test public void testUnexistingProcessWillFailRecognizedly() throws Exception { server.setCurrentBrowser(Browsers.none); List al=Arrays.asList(new String[] {"definietly_not_Existing_process"}); ProcessResult pr = server.executeProcess(al); Assert.assertNull(pr.process); Assert.assertEquals(pr.stderr, ""); Assert.assertEquals(pr.stdout, ""); Assert.assertTrue(pr.wasTerminated); Assert.assertTrue(pr.returnValue < 0); Assert.assertNotNull(pr.deadlyException); } @Test public void testGetUrlUponThisInstance() throws MalformedURLException{ URL u1=server.getUrlUponThisInstance("simple.jsp"); URL u2=server.getUrlUponThisInstance("/simple.jsp"); Assert.assertEquals(u1, u2); } @Test @TestInBrowsers(testIn=Browsers.none) public void testNonExisitngBrowserWillNotCauseMess() throws Exception { ProcessResult pr = server.executeBrowser("not_existing_url.html"); Assert.assertNull(pr.process); Assert.assertEquals(pr.stderr, ""); Assert.assertEquals(pr.stdout, ""); Assert.assertTrue(pr.wasTerminated); Assert.assertTrue(pr.returnValue < 0); Assert.assertNotNull(pr.deadlyException); } @Test public void testBrowsers2() throws Exception { List a = BrowserFactory.getFactory().getAllBrowsers(); Assert.assertNotNull("returned browsers array must not be null", a); Assert.assertTrue("at least one browser must be configured", a.size() > 0); for (Browser b : a) { testBrowser(b); } } @Test @TestInBrowsers(testIn = Browsers.all) public void testBrowser3() throws Exception { testBrowser(server.getCurrentBrowser()); } @Test public void testBrowsers1() throws Exception { BrowserFactory bf = new BrowserFactory(null); int expected = 0; Assert.assertTrue("Created from null there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); bf = new BrowserFactory(""); expected = 0; Assert.assertTrue("Created from empty there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); String s = "dsgrdg"; bf = new BrowserFactory(s); expected = 0; Assert.assertTrue("Created from nonsense " + s + " there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = "sgrg/jkik"; bf = new BrowserFactory(s); expected = 0; Assert.assertTrue("Created from nonsense " + s + " there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = Browsers.firefox + "/jkik"; bf = new BrowserFactory(s); expected = 0; Assert.assertTrue("Created from nonsense " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = "sgrg/jkik:sege"; bf = new BrowserFactory(s); expected = 0; Assert.assertTrue("Created from two nonsenses " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = Browsers.firefox.toExec() + ":" + Browsers.firefox; bf = new BrowserFactory(s); expected = 2; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = Browsers.firefox.toExec(); bf = new BrowserFactory(s); expected = 1; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = "something/somewhere/" + Browsers.firefox.toExec(); bf = new BrowserFactory(s); expected = 1; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = "something/somewhere/" + Browsers.firefox.toExec() + ":" + "something/somewhere/" + Browsers.opera.toExec(); bf = new BrowserFactory(s); expected = 2; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = "something/somewhere/" + Browsers.firefox.toExec() + ":" + "something/somewhere/" + Browsers.opera.toExec() + ":" + Browsers.chromiumBrowser; bf = new BrowserFactory(s); expected = 3; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = Browsers.firefox.toExec() + ":" + "vfdgf" + ":" + Browsers.googleChrome.toExec(); bf = new BrowserFactory(s); expected = 2; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = Browsers.firefox.toExec() + ":" + Browsers.chromiumBrowser + ":" + Browsers.googleChrome.toExec() + ":" + Browsers.opera + ":" + Browsers.epiphany + ":" + Browsers.midori; bf = new BrowserFactory(s); expected = 6; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); testFullFactory(bf); s = "fgfd/" + Browsers.firefox.toExec() + ":" + "/fgfd/" + Browsers.chromiumBrowser + ":" + "fgfd/dfsdf/" + Browsers.googleChrome.toExec() + ":" + "/g/fgfd/" + Browsers.opera + ":" + Browsers.epiphany + ":" + Browsers.midori; bf = new BrowserFactory(s); expected = 6; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); testFullFactory(bf); s = Browsers.firefox.toExec() + ":" + ":" + Browsers.googleChrome.toExec() + ":" + Browsers.opera; bf = new BrowserFactory(s); expected = 3; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = Browsers.firefox.toExec() + ":" + ":" + ":" + Browsers.opera; bf = new BrowserFactory(s); expected = 2; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = ":" + ":" + Browsers.googleChrome.toExec() + ":"; bf = new BrowserFactory(s); expected = 1; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); s = ":" + Browsers.firefox.toExec() + ":bfgbfg/fddf/" + Browsers.googleChrome.toExec() + ":"; bf = new BrowserFactory(s); expected = 2; Assert.assertTrue("Created from " + s + "there must be " + expected + " browsers in factory. Is" + bf.getAllBrowsers().size(), bf.getAllBrowsers().size() == expected); } @Test public void testResourcesExists() throws Exception { File[] simpleContent = server.getDir().listFiles(new FileFilter() { public boolean accept(File file) { if (!file.isDirectory()) { return true; } else { return false; } } }); Assert.assertNotNull(simpleContent); Assert.assertTrue(simpleContent.length > 5); for (int i = 0; i < simpleContent.length; i++) { File file = simpleContent[i]; ServerAccess.logOutputReprint(file.getName()); //server port have in fact no usage in converting filename to uri-like-filename. //But if there is null, instead if some number, then nullpointer exception is thrown (Integer->int). //So I'm using "real" currently used port, instead of some random value. URI u = new URI((String) null, (String) null, (String) null, server.getPort(), file.getName(), (String) null, null); ServerAccess.logOutputReprint(" ("+u.toString()+")"); String fname = u.toString(); if (file.getName().toLowerCase().endsWith(".jnlp")) { String c = server.getResourceAsString("/" + fname); Assert.assertTrue(c.contains("<")); Assert.assertTrue(c.contains(">")); Assert.assertTrue(c.contains("jnlp")); Assert.assertTrue(c.contains("resources")); Assert.assertTrue(c.replaceAll("\\s*", "").contains("")); } else { byte[] c = server.getResourceAsBytes("/" + fname).toByteArray(); Assert.assertEquals(c.length, file.length()); } } } @Test @NeedsDisplay @TestInBrowsers(testIn = Browsers.one) public void testListeners() throws Exception { final StringBuilder o1 = new StringBuilder(); final StringBuilder e1 = new StringBuilder(); final StringBuilder o2 = new StringBuilder(); final StringBuilder e2 = new StringBuilder(); final ContentReaderListener lo = new ContentReaderListener() { @Override public void charReaded(char ch) { o1.append(ch); } @Override public void lineReaded(String s) { o2.append(s).append("\n"); } }; ContentReaderListener le = new ContentReaderListener() { @Override public void charReaded(char ch) { e1.append(ch); } @Override public void lineReaded(String s) { e2.append(s).append("\n"); } }; ProcessResult pr = server.executeBrowser("not_existing_url.html",lo,le); server.setCurrentBrowser(BrowserFactory.getFactory().getFirst().getID()); Assert.assertNotNull(server.getCurrentBrowsers()); Assert.assertNotNull(server.getCurrentBrowser()); Assert.assertEquals(pr.stdout, o1.toString()); Assert.assertEquals(pr.stderr, e1.toString()); //the last \n is mandatory as las tline is flushed also when proces dies Assert.assertEquals(pr.stdout.replace("\n", ""), o2.toString().replace("\n", "")); Assert.assertEquals(pr.stderr.replace("\n", ""), e2.toString().replace("\n", "")); } private void testFullFactory(BrowserFactory bf) { Assert.assertEquals(bf.getBrowser(Browsers.chromiumBrowser).getID(), Browsers.chromiumBrowser); Assert.assertEquals(bf.getBrowser(Browsers.googleChrome).getID(), Browsers.googleChrome); Assert.assertEquals(bf.getBrowser(Browsers.firefox).getID(), Browsers.firefox); Assert.assertEquals(bf.getBrowser(Browsers.opera).getID(), Browsers.opera); Assert.assertEquals(bf.getBrowser(Browsers.epiphany).getID(), Browsers.epiphany); Assert.assertEquals(bf.getBrowser(Browsers.midori).getID(), Browsers.midori); } private void testBrowser(Browser browser) throws IOException { File defaultPluginDir = null; if (browser.getDefaultPluginExpectedLocation() != null) { defaultPluginDir = new File(browser.getDefaultPluginExpectedLocation()); } if (defaultPluginDir != null) { Assert.assertTrue("browser's plugins location should exist " + defaultPluginDir.toString() + " for " + browser.getID().toString(), defaultPluginDir.exists()); } File userPluginDir = null; if (browser.getUserDefaultPluginExpectedLocation() != null) { userPluginDir = new File(browser.getUserDefaultPluginExpectedLocation()); } // userPluginDir (~/.mozilla/plugins/) may not exist if user has not installed any Firefox plugins. File[] defaultPlugins = new File[0]; if (defaultPluginDir != null && defaultPluginDir.isDirectory()) { defaultPlugins = defaultPluginDir.listFiles(); } File[] userPlugins = new File[0]; if (userPluginDir != null && userPluginDir.isDirectory()) { userPlugins = userPluginDir.listFiles(); } Assert.assertTrue("at least one of browser's plugins directory should contains at least one file didn't. For " + browser.getID().toString(), defaultPlugins.length + userPlugins.length > 0); defaultPlugins = new File[0]; if (defaultPluginDir != null && defaultPluginDir.isDirectory()) { defaultPlugins = defaultPluginDir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return (pathname.getName().equals(LinuxBrowser.DEFAULT_PLUGIN_NAME)); } }); } userPlugins = new File[0]; if (userPluginDir != null && userPluginDir.isDirectory()) { userPlugins = userPluginDir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return (pathname.getName().equals(LinuxBrowser.DEFAULT_PLUGIN_NAME)); } }); } Assert.assertTrue("browser's plugins directories should contains exactly one " + LinuxBrowser.DEFAULT_PLUGIN_NAME + ", but didnt for " + browser.getID().toString(), defaultPlugins.length + userPlugins.length == 1); String currentPath = server.getJavawsFile().getParentFile().getParentFile().getAbsolutePath(); File[] plugins; if (defaultPlugins.length == 1) { plugins = defaultPlugins; } else { plugins = userPlugins; } String s = ServerAccess.getContentOfStream(new FileInputStream(plugins[0]), "ASCII"); Assert.assertTrue("browser's plugins shoud points to" + currentPath + ", but didnt", s.contains(s)); } } icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/PaxHeaders.7406/awt0000644000000000000000000000013213441742745025473 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/awt/0000755000175000002070000000000013441742745026360 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/awt/PaxHeaders.7406/imagesearch0000644000000000000000000000013213441742745027743 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/awt/imagesearch/0000755000175000002070000000000013441742745030630 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/awt/imagesearch/PaxHeaders.7406/Com0000644000000000000000000000031513441742745030464 xustar00115 path=icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/awt/imagesearch/ComponentFinderTest.java 30 mtime=1552401893.141832611 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/test-extensions-tests/net/sourceforge/jnlp/awt/imagesearch/ComponentFinderTest0000644000175000002070000000412413441742745034506 0ustar00jvanekmock00000000000000/* ComponentFinderTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.awt.imagesearch; import java.awt.image.BufferedImage; import org.junit.Assert; import org.junit.Test; /** * * This class is a part of AWTFramework, contains component finding * by searching for icons. * */ public class ComponentFinderTest { @Test public void initialiseDefaultIcon() { BufferedImage icon = ComponentFinder.defaultIcon; Assert.assertNotNull("The default icon marker.png was not initialized.", icon); } } icedtea-web-1.8/tests/PaxHeaders.7406/reproducers0000644000000000000000000000013113441742745016644 xustar0029 mtime=1552401893.10383269 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/0000755000175000002070000000000013441742745017532 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/PaxHeaders.7406/simple0000644000000000000000000000013213441742745020136 xustar0030 mtime=1552401893.160832571 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/0000755000175000002070000000000013441742745021023 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/CountingApplet20000644000000000000000000000013213441742745023154 xustar0030 mtime=1552401893.128832638 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/CountingApplet2/0000755000175000002070000000000013441742745024041 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CountingApplet2/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024126 xustar0030 mtime=1552401893.128832638 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/CountingApplet2/srcs/0000755000175000002070000000000013441742745025013 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CountingApplet2/srcs/PaxHeaders.7406/CountingApplet2.java0000644000000000000000000000013213441742745030064 xustar0030 mtime=1552401893.128832638 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/CountingApplet2/srcs/CountingApplet2.java0000644000175000002070000000664313441742745030705 0ustar00jvanekmock00000000000000 import java.applet.Applet; import java.awt.BorderLayout; import javax.swing.JLabel; import javax.swing.SwingUtilities; /* CountingApplet1.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class CountingApplet2 extends Applet { public static void main(String[] args) throws InterruptedException { Integer counter = null; if (args.length > 0) { counter = new Integer(args[0]); } int i = 0; while (true) { System.out.println("counting... " + i); if (counter != null && i == counter.intValue()) { System.exit(-i); } i++; Thread.sleep(1000); } } @Override public void init() { System.out.println("applet was initialised"); final CountingApplet2 self = this; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { self.setLayout(new BorderLayout()); self.add(new JLabel("C2")); self.validateTree(); self.repaint(); } }); } @Override public void start() { System.out.println("applet was started"); String s = getParameter("kill"); final String[] params; if (s != null) { params = new String[]{s}; } else { params = new String[0]; } new Thread(new Runnable() { @Override public void run() { try { main(params); } catch (Exception ex) { ex.printStackTrace(); } } }).start(); } @Override public void stop() { System.out.println("applet was stopped"); } @Override public void destroy() { System.out.println("applet will be destroyed"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AWTCommonResourcesOnly0000644000000000000000000000013213441742745024477 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/AWTCommonResourcesOnly/0000755000175000002070000000000013441742745025364 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AWTCommonResourcesOnly/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026511 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/AWTCommonResourcesOnly/resources/0000755000175000002070000000000013441742745027376 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AWTCommonResourcesOnly/resources/PaxHeaders.7406/marker.png0000644000000000000000000000013213441742745030555 xustar0030 mtime=1552401893.120832654 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/AWTCommonResourcesOnly/resources/marker.png0000644000175000002070000000026413441742745031367 0ustar00jvanekmock00000000000000‰PNG  IHDR DЄŠЦPLTE$$$џmmmЖЖЖџџџџџџџjЮАjTIDAT8Ых“1Р B]ўџт.ЉZЄГsѓХƒ#bŠц~šёgР •В™54=р 6lQй3šFЁeИОBЭq МBљCkгsу5м”i +RЕуIENDЎB`‚icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/SimpleApplet0000644000000000000000000000013213441742745022535 xustar0030 mtime=1552401893.160832571 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/SimpleApplet/0000755000175000002070000000000013441742745023422 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SimpleApplet/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023507 xustar0030 mtime=1552401893.160832571 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/SimpleApplet/srcs/0000755000175000002070000000000013441742745024374 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SimpleApplet/srcs/PaxHeaders.7406/SimpleApplet.java0000644000000000000000000000013213441742745027026 xustar0030 mtime=1552401893.160832571 30 atime=1552402157.280253384 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/SimpleApplet/srcs/SimpleApplet.java0000644000175000002070000000346513441742745027646 0ustar00jvanekmock00000000000000/* SimpleApplet.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; @SuppressWarnings("serial") public class SimpleApplet extends Applet { @Override public void start() { System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/simpletest10000644000000000000000000000013213441742745022410 xustar0030 mtime=1552401893.135832623 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/simpletest1/0000755000175000002070000000000013441742745023275 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/simpletest1/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023362 xustar0030 mtime=1552401893.135832623 30 atime=1552410887.104183464 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/simpletest1/srcs/0000755000175000002070000000000013441742745024247 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/simpletest1/srcs/PaxHeaders.7406/SimpleTest1.java0000644000000000000000000000013213441742745026454 xustar0030 mtime=1552401893.135832623 30 atime=1552402157.279253386 30 ctime=1552410887.091183494 icedtea-web-1.8/tests/reproducers/simple/simpletest1/srcs/SimpleTest1.java0000644000175000002070000000357213441742745027273 0ustar00jvanekmock00000000000000/* SimpleTest1.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SimpleTest1{ public static void main(String[] args){ System.out.println("Good simple javaws exapmle"); for (int i = 0; i < args.length; i++) { String string = args[i]; System.out.println(string); } } } icedtea-web-1.8/tests/reproducers/simple/simpletest1/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024406 xustar0030 mtime=1552401893.142832609 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/testcases/0000755000175000002070000000000013441742745025273 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/simpletest1/testcases/PaxHeaders.7406/SimpleTest1Test.java0000644000000000000000000000013213441742745030340 xustar0030 mtime=1552401893.142832609 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/testcases/SimpleTest1Test.java0000644000175000002070000001444613441742745031161 0ustar00jvanekmock00000000000000/* SimpleTest1Test.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.optionparser.ParsedOption; import org.junit.Assert; import org.junit.Test; public class SimpleTest1Test { private static final ServerAccess server = new ServerAccess(); private static final List strict = Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.STRICT.option, ServerAccess.VERBOSE_OPTION}); static void checkLaunched(ProcessResult pr) { checkLaunched(pr, false); } static void checkLaunched(ProcessResult pr, boolean negate) { checkLaunched(pr, negate, true); } static void checkLaunched(ProcessResult pr, boolean negate, boolean checkTermination) { String s = "Good simple javaws exapmle"; if (negate) { Assert.assertFalse("testSimpletest1lunchOk stdout should NOT contains " + s + " bud did", pr.stdout.contains(s)); } else { Assert.assertTrue("testSimpletest1lunchOk stdout should contains " + s + " bud didn't", pr.stdout.contains(s)); } String ss = "xception"; if (negate) { Assert.assertTrue("testSimpletest1lunchOk stderr should contains " + ss + " but didn't", pr.stderr.contains(ss)); } else { //disabled, unnecessary exceptions may occure //Assert.assertFalse("testSimpletest1lunchOk stderr should not contains " + ss + " but did", pr.stderr.contains(ss)); } if (checkTermination) { Assert.assertFalse(pr.wasTerminated); if (negate) { Assert.assertEquals((Integer) 1, pr.returnValue); } else { Assert.assertEquals((Integer) 0, pr.returnValue); } } } @Test public void testSimpletest1lunchOk() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/simpletest1.jnlp"); checkLaunched(pr); } @Test public void testSimpletestJnlpProtocolMainArgument() throws Exception { ProcessResult pr = ServerAccess.executeProcess(Arrays.asList(new String[]{server.getJavawsLocation(), "jnlp://localhost:"+server.getPort()+"/simpletest1.jnlp"}), new StringBasedClosingListener("Good simple javaws exapmle"), null); checkLaunched(pr, false, false); } @Test public void testSimpletestJnlpProtocolJnlpArgument() throws Exception { ProcessResult pr = ServerAccess.executeProcess(Arrays.asList(new String[]{server.getJavawsLocation(), OptionsDefinitions.OPTIONS.JNLP.option , "jnlp://localhost:"+server.getPort()+"/simpletest1.jnlp"}), new StringBasedClosingListener("Good simple javaws exapmle"), null); checkLaunched(pr, false, false); } @Test public void testSimpletest1lunchNotOkJnlpStrict() throws Exception { ProcessResult pr = server.executeJavawsHeadless(strict, "/simpletest1.jnlp"); checkLaunched(pr, true); } @Test public void testSimpletest1lunchOkStrictJnlp() throws Exception { String originalResourceName = "simpletest1.jnlp"; String newResourceName = "simpletest1_strict.jnlp"; createStrictFile(originalResourceName, newResourceName, server.getUrl("")); ProcessResult pr = server.executeJavawsHeadless(null, "/" + newResourceName); checkLaunched(pr); } @Test public void testSimpletest1lunchOkStrictJnlpStrict() throws Exception { String originalResourceName = "simpletest1.jnlp"; String newResourceName = "simpletest1_strict.jnlp"; createStrictFile(originalResourceName, newResourceName, server.getUrl("")); ProcessResult pr = server.executeJavawsHeadless(strict, "/" + newResourceName); checkLaunched(pr); } private void createStrictFile(String originalResourceName, String newResourceName, URL codebase) throws MalformedURLException, IOException { String originalContent = FileUtils.loadFileAsString(new File(server.getDir(), originalResourceName)); String nwContent1 = originalContent.replaceAll("href=\"" + originalResourceName + "\"", "href=\"" + newResourceName + "\""); String nwContent = nwContent1.replaceAll("codebase=\".\"", "codebase=\"" + codebase + "\""); nwContent = nwContent.replace("simpletest2", ""); ServerAccess.saveFile(nwContent, new File(server.getDir(), newResourceName)); } } icedtea-web-1.8/tests/reproducers/simple/simpletest1/testcases/PaxHeaders.7406/SimpleTestDefaultRedi0000644000000000000000000000013213441742745030610 xustar0030 mtime=1552401893.131832631 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/testcases/SimpleTestDefaultRedirects.java0000644000175000002070000002533513441742745033411 0ustar00jvanekmock00000000000000/* SimpleTest1Test.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.net.MalformedURLException; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import org.junit.Assert; import org.junit.Test; public class SimpleTestDefaultRedirects { private static final ServerAccess server = new ServerAccess(); private static final String D = "-J-Dhttp.maxRedirects=20"; //default - https://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html , but... //unluckily, setting http.maxRedirects to eg 1 do not have testing benefit //as httpconnection then jsut throws exception instead of returning header to app's investigations //I doubt it is worthy to struggle with setInstanceFollowRedirects in production code private static final List hr = Arrays.asList(new String[]{D, ServerAccess.HEADLES_OPTION, OptionsDefinitions.OPTIONS.REDIRECT.option}); private static final List hrv = Arrays.asList(new String[]{D, ServerAccess.VERBOSE_OPTION, ServerAccess.HEADLES_OPTION, OptionsDefinitions.OPTIONS.REDIRECT.option}); private static final List hv = Arrays.asList(new String[]{D, ServerAccess.VERBOSE_OPTION, ServerAccess.HEADLES_OPTION}); /* creates redirecting instances so oe can debug itw against it */ // public static void main(String[] args) throws InterruptedException, MalformedURLException { // ServerLauncher[] servers = new ServerLauncher[3]; // // ServerLauncher server0 = ServerAccess.getIndependentInstance(); // server0.setRedirect(ServerAccess.getInstance()); //redirecting to normal server singleton // server0.setRedirectCode(301); // servers[0] = server0; // // ServerLauncher server1 = ServerAccess.getIndependentInstance(); // server1.setRedirect(server0); // server1.setRedirectCode(301); // servers[1] = server1; // // ServerLauncher server2 = ServerAccess.getIndependentInstance(); // server2.setRedirect(server1); // server2.setRedirectCode(301); // servers[2] = server2; // // System.out.println(server0); // System.out.println(server1); // System.out.println(server2); // // try { // System.out.println(server0.getUrl("/" + "simpletest1.jnlp")); // System.out.println(server1.getUrl("/" + "simpletest1.jnlp")); // System.out.println(server2.getUrl("/" + "simpletest1.jnlp")); // while (true) { // Thread.sleep(100); // } // } finally { // for (ServerLauncher server : servers) { // server.stop(); // } // } // } public void testbody(List args, boolean pass, int... redirectCodes) throws Exception { testbody(args, pass, -1, redirectCodes); } public void testbody(List args, boolean pass, int breakChain, int... redirectCodes) throws Exception { if (redirectCodes.length < 1) { throw new RuntimeException("At least one redrection server pelase"); } ServerLauncher[] servers = new ServerLauncher[redirectCodes.length]; ServerLauncher server0 = ServerAccess.getIndependentInstance(); server0.setRedirect(ServerAccess.getInstance()); //redirecting to normal server singleton server0.setRedirectCode(redirectCodes[0]); //redirecting by first code servers[0] = server0; //create redirect chain for (int i = 1; i < redirectCodes.length; i++) { ServerLauncher serverI = ServerAccess.getIndependentInstance(); serverI.setRedirect(servers[i - 1]); //redirecting to pevious in chain serverI.setRedirectCode(redirectCodes[i]); //by given code servers[i] = serverI; } testbody(args, pass, breakChain, servers); } public void testbody(List args, boolean pass, int breakChain, ServerLauncher[] servers) throws Exception { if (breakChain >= 0) { servers[breakChain].setRedirect(null); servers[breakChain].stop(); } ServerLauncher server3012378 = servers[servers.length - 1]; try { //now connect to last in chain and we should always get reposnse from ServerAccess.getInstance() ProcessResult pr = ServerAccess.executeProcessUponURL(server.getJavawsLocation(), args, server3012378.getUrl("/" + "simpletest1.jnlp"), null, null ); SimpleTest1Test.checkLaunched(pr, !pass, false); if (pass) { Assert.assertTrue(0 == pr.returnValue); } else { Assert.assertFalse(0 == pr.returnValue); } } finally { for (int i = 0; i < servers.length; i++) { if (i != breakChain) { ServerLauncher serverI = servers[i]; try { serverI.setRedirect(null); serverI.stop(); } catch (Exception ex) { ServerAccess.logException(ex); } } } } } // note, tonly 308 needs help form ITW,others are redirected autmatically in http connection // https://docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection.html#setInstanceFollowRedirects%28boolean%29 public void testbody308(boolean pass, int... redirectCodes) throws Exception { if (pass) { testbody(hr, pass, redirectCodes); } else { testbody(hv, pass, redirectCodes); } } public void testbodyOthers(boolean pass, int... redirectCodes) throws Exception { if (pass) { testbody(hr, true, redirectCodes); } else { testbody(hv, true, redirectCodes); } } //some chains tests @Test public void testSimpletest1RedirectChain1AllowedOk() throws Exception { testbodyOthers(true, 301, 302, 303, 307); } @Test public void testSimpletest1RedirectChain1NotAllowedOk() throws Exception { testbodyOthers(false, 301, 302, 303, 307); } @Test public void testSimpletest1RedirectChain2AllowedOk() throws Exception { testbody308(true, 301, 308, 302, 303, 307); } @Test public void testSimpletest1RedirectChain2NotAllowedOk() throws Exception { server.executeJavawsClearCache(); testbody308(false, 301, 308, 302, 303, 307); } @Test public void testSimpletest1RedirectChain3AllowedBroken() throws Exception { server.executeJavawsClearCache(); testbody(hrv, false, 1, new int[]{301, 302, 302, 303, 307}); } @Test public void testSimpletest1RedirectChain3NotAllowedBroken() throws Exception { server.executeJavawsClearCache(); testbody(hv, false, 1, new int[]{301, 302, 302, 303, 307}); } @Test public void testSimpletest1RedirectChain3AlowedCycle() throws Exception { server.executeJavawsClearCache(); ServerLauncher[] servers = new ServerLauncher[3]; ServerLauncher server0 = ServerAccess.getIndependentInstance(); server0.setRedirect(ServerAccess.getInstance()); //redirecting to normal server singleton server0.setRedirectCode(301); servers[0] = server0; ServerLauncher server1 = ServerAccess.getIndependentInstance(); server1.setRedirectCode(301); servers[1] = server1; ServerLauncher server2 = ServerAccess.getIndependentInstance(); server2.setRedirectCode(301); servers[2] = server2; server1.setRedirect(server2); server2.setRedirect(server1); testbody(hrv, false, -1, servers); } //end chains // basic tests @Test public void testSimpletest1Redirect301AllowedOk() throws Exception { testbodyOthers(true, 301); } @Test public void testSimpletest1Redirect301NotAllowedOk() throws Exception { testbodyOthers(false, 301); } @Test public void testSimpletest1Redirect302AllowedOk() throws Exception { testbodyOthers(true, 302); } @Test public void testSimpletest1Redirect302NotAllowedOk() throws Exception { testbodyOthers(false, 302); } @Test public void testSimpletest1Redirect303AllowedOk() throws Exception { testbodyOthers(true, 303); } @Test public void testSimpletest1Redirect331NotAllowedOk() throws Exception { testbodyOthers(false, 303); } @Test public void testSimpletest1Redirect307AllowedOk() throws Exception { testbodyOthers(true, 307); } @Test public void testSimpletest1Redirect307NotAllowedOk() throws Exception { testbodyOthers(false, 307); } @Test public void testSimpletest1Redirect308AllowedOk() throws Exception { testbody308(true, 308); } @Test public void testSimpletest1Redirect308NotAllowedOk() throws Exception { server.executeJavawsClearCache(); testbody308(false, 308); } // end basic tests } icedtea-web-1.8/tests/reproducers/simple/simpletest1/testcases/PaxHeaders.7406/SimpleTest1CountReque0000644000000000000000000000013213441742745030573 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/testcases/SimpleTest1CountRequests.java0000644000175000002070000001040013441742745033050 0ustar00jvanekmock00000000000000/* SimpleTest1Test.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @Bug(id = "PR2591") public class SimpleTest1CountRequests { private static final ServerAccess server = new ServerAccess(); private static ServerLauncher server0; private static final Map> counter = new HashMap<>(); private static final List hv = Arrays.asList(new String[]{ServerAccess.VERBOSE_OPTION, ServerAccess.HEADLES_OPTION}); @BeforeClass public static void createCountingServer() { server0 = ServerAccess.getIndependentInstance(); server0.setRequestsCounter(counter); } @AfterClass public static void stopCountingServer() { server0.stop(); } @Bug(id = "PR2591") @Test public void testSimpletest1EachResourceOnePerRun() throws Exception { server0.setSupportingHeadRequest(true); counter.clear(); ProcessResult pr = ServerAccess.executeProcessUponURL(server.getJavawsLocation(), hv, server0.getUrl("/simpletest1.jnlp"), null, null ); SimpleTest1Test.checkLaunched(pr); Assert.assertTrue(counter.get("./simpletest1.jnlp").get("GET").equals(1)); //2 without bugfix Assert.assertTrue(counter.get("./simpletest1.jnlp").get("HEAD").equals(1)); Assert.assertTrue(counter.get("./simpletest1.jar").get("GET").equals(1));//2 without bugfix Assert.assertTrue(counter.get("./simpletest1.jar").get("HEAD").equals(1)); } @Bug(id = "PR2591") @Test public void testSimpletest1EachResourceOnePerRunHeadsOff() throws Exception { server0.setSupportingHeadRequest(false); counter.clear(); ProcessResult pr = ServerAccess.executeProcessUponURL(server.getJavawsLocation(), hv, server0.getUrl("/simpletest1.jnlp"), null, null ); SimpleTest1Test.checkLaunched(pr); Assert.assertTrue(counter.get("./simpletest1.jnlp").get("GET").equals(2)); //3 without bugfix Assert.assertTrue(counter.get("./simpletest1.jnlp").get("HEAD") == null); Assert.assertTrue(counter.get("./simpletest1.jar").get("GET").equals(2));//3 without bugfix Assert.assertTrue(counter.get("./simpletest1.jar").get("HEAD") == (null)); } } icedtea-web-1.8/tests/reproducers/simple/simpletest1/testcases/PaxHeaders.7406/XDGspecificationTests0000644000000000000000000000013213441742745030614 xustar0030 mtime=1552401893.140832613 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/testcases/XDGspecificationTests.java0000644000175000002070000016437413441742745032363 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import net.sourceforge.jnlp.ContentReaderListener; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import org.junit.Assert; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @Bug(id = "RH947647") public class XDGspecificationTests extends BrowserTest { private static File backupMainDir; private static class Backup { public final File from; public final File to; public Backup(File from, File to) { this.from = from; this.to = to; } } //intentionaly not using constants from itw to check itw private static final File oldRoot = new File(System.getProperty("user.home"), ".icedtea"); private static final File realCache; private static final File realConfig; private static final File homeCache = new File(System.getProperty("user.home") + File.separator + ".cache" + File.separator + "icedtea-web"); private static final File homeConfig = new File(System.getProperty("user.home") + File.separator + ".config" + File.separator + "icedtea-web"); private static List hollyBackup; static { String configHome = System.getProperty("user.home") + File.separator + ".config"; String cacheHome = System.getProperty("user.home") + File.separator + ".cache"; String XDG_CONFIG_HOME_value = System.getenv(PathsAndFiles.XDG_CONFIG_HOME_VAR); String XDG_CACHE_HOME_value = System.getenv(PathsAndFiles.XDG_CACHE_HOME_VAR); if (XDG_CONFIG_HOME_value != null) { configHome = XDG_CONFIG_HOME_value; } if (XDG_CACHE_HOME_value != null) { cacheHome = XDG_CACHE_HOME_value; } realConfig = new File(configHome + File.separator + "icedtea-web"); realCache = new File(cacheHome + File.separator + "icedtea-web"); } // When current root is backuped, // also new files, which legacy impl is not aware about // cold be copied. Remove them in fake root // if they are not, then firstrun cleanup fails, and so second prints unexpected warnings public static void removeUnsupportedLegacyFiles() { File gjp = new File(oldRoot, "generated_jnlps"); File icons = new File(oldRoot, "icons"); if (gjp.exists()) { deleteRecursively(gjp); } if (icons.exists()) { deleteRecursively(icons); } Assert.assertFalse(gjp.exists()); Assert.assertFalse(icons.exists()); } @BeforeClass public static void backup() throws IOException { File base = tmpDir(); backupMainDir = base; hollyBackup = backupRealSettingsAndClear(base); } @AfterClass public static void restore() throws IOException { cleanRealSettings(); restoreSettings(hollyBackup); deleteRecursively(backupMainDir); } private static void mv(File oldRoot, File base, List l) { if (oldRoot.exists()) { ServerAccess.logOutputReprint("moving of " + oldRoot + " to " + base); File dest = new File(base, oldRoot.getName()); boolean a = oldRoot.renameTo(dest); if (!a) { ServerAccess.logErrorReprint("moving of " + oldRoot + " to " + base + " failed"); } else { ServerAccess.logOutputReprint("sucess"); } if (l != null) { l.add(new Backup(oldRoot, dest)); } } else { ServerAccess.logOutputReprint("Can not move " + oldRoot + " to " + base + " the source (the first) is misisng"); } } public static File tmpDir() throws IOException { //creating in home, not in tmp, as we need to be sure the backup is on same device File f = File.createTempFile("itwConfigCache", "tmpDir", new File(System.getProperty("user.home"))); f.delete(); f.mkdir(); return f; } private static List backupRealSettingsAndClear(File base) throws IOException { File config = new File(base, "config"); config.mkdirs(); File cache = new File(base, "cache"); cache.mkdirs(); List l = new ArrayList<>(); mv(oldRoot, base, l); mv(realCache, cache, l); mv(realConfig, config, l); return l; } private static void restoreSettings(List col) throws IOException { for (Backup l : col) { mv(l.to, l.from.getParentFile(), null); } } public static void deleteRecursively(File f) { if (f.exists()) { ServerAccess.logOutputReprint("removing " + f); try { FirefoxProfilesOperator.deleteRecursively(f); } catch (IOException ex) { ServerAccess.logException(ex); } } else { ServerAccess.logOutputReprint("removal of " + f + " failed, do not exists"); } } private static void cleanRealSettings() { deleteRecursively(oldRoot); deleteRecursively(realCache); deleteRecursively(realConfig); } private static void cleanHomeSettings() { deleteRecursively(oldRoot); deleteRecursively(homeCache); deleteRecursively(homeConfig); } private String[] removeXdgVAlues() { Map p = System.getenv(); Set> r = p.entrySet(); List> rr = new ArrayList<>(r); Collections.sort(rr, new Comparator>() { @Override public int compare(Entry o1, Entry o2) { return o1.getKey().compareTo(o2.getKey()); } }); List l = new ArrayList<>(p.size()); int i = 0; int c = 0; for (Iterator> it = rr.iterator(); it.hasNext(); i++) { Entry entry = it.next(); String v = entry.getValue(); String s = entry.getKey() + "=" + v; if (entry.getKey().equals(PathsAndFiles.XDG_CACHE_HOME_VAR) || entry.getKey().equals(PathsAndFiles.XDG_CONFIG_HOME_VAR)) { ServerAccess.logOutputReprint("ignoring " + s); c++; } else { l.add(s); } } if (c == 0) { ServerAccess.logOutputReprint("no XDG defined, no change in variables "); } return l.toArray(new String[l.size()]); } private static String[] setXdgVAlues(File fakeRoot) { return setXdgVAlues(new File(fakeRoot.getAbsolutePath() + File.separator + "customCache"), new File(fakeRoot.getAbsolutePath() + File.separator + "customConfig")); } private static String[] setXdgVAlues(File cacheF, File configF) { boolean cache = false; boolean config = false; Map p = System.getenv(); Set> r = p.entrySet(); List> rr = new ArrayList<>(r); Collections.sort(rr, new Comparator>() { @Override public int compare(Entry o1, Entry o2) { return o1.getKey().compareTo(o2.getKey()); } }); List l = new ArrayList<>(p.size() + 2); int i = 0; for (Iterator> it = rr.iterator(); it.hasNext(); i++) { Entry entry = it.next(); String v = entry.getValue(); String s = entry.getKey() + "=" + v; switch (entry.getKey()) { case PathsAndFiles.XDG_CACHE_HOME_VAR: ServerAccess.logOutputReprint(entry.getKey() + " was " + v); v = cacheF.getAbsolutePath(); ServerAccess.logOutputReprint("set " + v); cache = true; break; case PathsAndFiles.XDG_CONFIG_HOME_VAR: ServerAccess.logOutputReprint(entry.getKey() + " was " + v); v = configF.getAbsolutePath(); ServerAccess.logOutputReprint("set " + v); config = true; break; } s = entry.getKey() + "=" + v; l.add(s); } if (!cache) { ServerAccess.logOutputReprint("was no cache"); String v = cacheF.getAbsolutePath(); ServerAccess.logOutputReprint("set " + v); String s = PathsAndFiles.XDG_CACHE_HOME_VAR + "=" + v; l.add(s); } if (!config) { ServerAccess.logOutputReprint("was no config"); String v = configF.getAbsolutePath(); ServerAccess.logOutputReprint("set " + v); String s = PathsAndFiles.XDG_CONFIG_HOME_VAR + "=" + v; l.add(s); } return l.toArray(new String[l.size()]); } private static void createFakeOldHomeCache() throws Exception { File tmp = tmpDir(); fakeExtendedSecurity(new File(tmp, PathsAndFiles.DEPLOYMENT_SUBDIR_DIR)); try { ProcessWrapper pw = new ProcessWrapper( server.getJavawsLocation(), Arrays.asList(new String[]{ServerAccess.HEADLES_OPTION}), server.getUrl("simpletest2.jnlp"), (ContentReaderListener) null, null, setXdgVAlues(tmp, tmp)); ProcessResult pr = pw.execute(); Assert.assertTrue(simpletests2Run.toPassingString(), simpletests2Run.evaluate(pr.stderr)); File currentConfigCache = new File(tmp, PathsAndFiles.DEPLOYMENT_SUBDIR_DIR); File oldIcedTea = new File(new File(System.getProperty("user.home")) + File.separator + ".icedtea"); boolean a = currentConfigCache.renameTo(oldIcedTea); Assert.assertTrue("creation of old cache by renaming " + currentConfigCache + " to " + oldIcedTea + " failed", a); assertOldMainFilesInHome(false, true, false); assertNotMainFilesInHome(true, true, true); } finally { deleteRecursively(tmp); } } private static void createFakeOldHomeConfig() throws Exception { File tmp = tmpDir(); long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { ProcessWrapper pw1 = new ProcessWrapper(); pw1.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath() })); pw1.setVars(setXdgVAlues(tmp, tmp)); ProcessResult pr1 = pw1.execute(); ProcessWrapper pw2 = new ProcessWrapper(); pw2.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath(), //one impl of new parser was unable to handle duplicates "set", "oldBaf", "differentOldBaf" })); pw2.setVars(setXdgVAlues(tmp, tmp)); ProcessResult pr2 = pw2.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr1.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr2.stdout)); Assert.assertTrue(unknownProperty.toPassingString(), unknownProperty.evaluate(pr2.stdout)); File currentConfigCache = new File(tmp, PathsAndFiles.DEPLOYMENT_SUBDIR_DIR); File oldIcedTea = new File(new File(System.getProperty("user.home")) + File.separator + ".icedtea"); boolean a = currentConfigCache.renameTo(oldIcedTea); Assert.assertTrue("creation of old config by renaming " + currentConfigCache + " to " + oldIcedTea + " failed", a); assertOldConfigFilesInHome(true, true, true); assertNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; deleteRecursively(tmp); } } @After @Before public void cleanHome() { cleanHomeSettings(); } @After @Before public void cleanReal() { cleanRealSettings(); } private static List getContentOfDirectory(File f) { List result = new ArrayList<>(); if (f == null || !f.exists() || !f.isDirectory()) { return result; } File[] files = f.listFiles(); for (File file : files) { if (file.isDirectory()) { result.addAll(getContentOfDirectory(file)); } else { result.add(file); } } return result; } private static String listToString(List... l) { StringBuilder sb = new StringBuilder(); for (List list : l) { for (File s : list) { sb.append(s.getAbsolutePath()).append('\n'); } } return sb.toString(); } private static void assertConfigFiles(String s, boolean certs, boolean trust, boolean props) { if (certs) { Assert.assertTrue(trustedCertsInside.toPassingString(), trustedCertsInside.evaluate(s)); } if (trust) { Assert.assertTrue(appletTrustInside.toPassingString(), appletTrustInside.evaluate(s)); } if (props) { Assert.assertTrue(propsInside.toPassingString(), propsInside.evaluate(s)); } Assert.assertTrue(icedteaHostInside.toPassingString(), icedteaHostInside.evaluate(s)); } private static void assertMainFiles(String s, boolean s1, boolean s2, boolean a1) { if (a1) { Assert.assertTrue(appletJarInside.toPassingString(), appletJarInside.evaluate(s)); } if (s1) { Assert.assertTrue(jnlpInside1.toPassingString(), jnlpInside1.evaluate(s)); Assert.assertTrue(jarInside1.toPassingString(), jarInside1.evaluate(s)); } if (s2) { Assert.assertTrue(jnlpInside2.toPassingString(), jnlpInside2.evaluate(s)); Assert.assertTrue(jarInside2.toPassingString(), jarInside2.evaluate(s)); } Assert.assertTrue(localHostInside.toPassingString(), localHostInside.evaluate(s)); Assert.assertTrue(cacheHostInside.toPassingString(), cacheHostInside.evaluate(s)); Assert.assertTrue(icedteaHostInside.toPassingString(), icedteaHostInside.evaluate(s)); Assert.assertTrue(securityHostInside.toPassingString(), securityHostInside.evaluate(s)); Assert.assertTrue(trustedHostInside.toPassingString(), trustedHostInside.evaluate(s)); } private static void assertNotConfigFiles(String s, boolean certs, boolean trust, boolean props) { if (certs) { Assert.assertFalse(trustedCertsInside.toFailingString(), trustedCertsInside.evaluate(s)); } if (trust) { Assert.assertFalse(appletTrustInside.toFailingString(), appletTrustInside.evaluate(s)); } if (props) { Assert.assertFalse(propsInside.toFailingString(), propsInside.evaluate(s)); } Assert.assertFalse(icedteaHostInside.toFailingString(), icedteaHostInside.evaluate(s)); } private static void assertNotMainFiles(String s, boolean s1, boolean s2, boolean a1) { if (a1) { Assert.assertFalse(appletJarInside.toFailingString(), appletJarInside.evaluate(s)); } if (s1) { Assert.assertFalse(jnlpInside1.toFailingString(), jnlpInside1.evaluate(s)); Assert.assertFalse(jarInside1.toFailingString(), jarInside1.evaluate(s)); } if (s2) { Assert.assertFalse(jnlpInside2.toFailingString(), jnlpInside2.evaluate(s)); Assert.assertFalse(jarInside2.toFailingString(), jarInside2.evaluate(s)); } Assert.assertFalse(localHostInside.toFailingString(), localHostInside.evaluate(s)); Assert.assertFalse(cacheHostInside.toFailingString(), cacheHostInside.evaluate(s)); Assert.assertFalse(icedteaHostInside.toFailingString(), icedteaHostInside.evaluate(s)); Assert.assertFalse(securityHostInside.toFailingString(), securityHostInside.evaluate(s)); Assert.assertFalse(trustedHostInside.toFailingString(), trustedHostInside.evaluate(s)); } private static void assertMainFilesInHome(boolean s1, boolean s2, boolean a1) { String configHome = System.getProperty("user.home") + File.separator + ".config" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR; String cacheHome = System.getProperty("user.home") + File.separator + ".cache" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR; assertMainFiles( listToString(getContentOfDirectory(new File(configHome))) + "\n" + listToString(getContentOfDirectory(new File(cacheHome))), s1, s2, a1); } private static void assertConfigFilesInHome(boolean certs, boolean trust, boolean props) { String configHome = System.getProperty("user.home") + File.separator + ".config" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR; String cacheHome = System.getProperty("user.home") + File.separator + ".cache" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR; assertConfigFiles( listToString(getContentOfDirectory(new File(configHome))) + "\n" + listToString(getContentOfDirectory(new File(cacheHome))), certs, trust, props); } private static void assertNotMainFilesInHome(boolean s1, boolean s2, boolean a1) { String configHome = System.getProperty("user.home") + File.separator + ".config" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR; String cacheHome = System.getProperty("user.home") + File.separator + ".cache" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR; assertNotMainFiles( listToString(getContentOfDirectory(new File(configHome))) + "\n" + listToString(getContentOfDirectory(new File(cacheHome))), s1, s2, a1); } private static void assertNotConfigFilesInHome(boolean certs, boolean trust, boolean props) { String configHome = System.getProperty("user.home") + File.separator + ".config" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR; String cacheHome = System.getProperty("user.home") + File.separator + ".cache" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR; assertNotConfigFiles( listToString(getContentOfDirectory(new File(configHome))) + "\n" + listToString(getContentOfDirectory(new File(cacheHome))), certs, trust, props); } //runs private static final RulesFolowingClosingListener.ContainsRule simpletests1Run = new RulesFolowingClosingListener.ContainsRule("Good simple javaws exapmle"); private static final RulesFolowingClosingListener.ContainsRule simpletests2Run = new RulesFolowingClosingListener.ContainsRule("Correct exception"); private static final RulesFolowingClosingListener.ContainsRule moving = new RulesFolowingClosingListener.ContainsRule(DeploymentConfiguration.TRANSFER_TITLE); private static final RulesFolowingClosingListener.NotContainsRule notMoving = new RulesFolowingClosingListener.NotContainsRule(DeploymentConfiguration.TRANSFER_TITLE); private static final RulesFolowingClosingListener.ContainsRule unknownProperty = new RulesFolowingClosingListener.ContainsRule("WARNING: Unknown property name"); private static final RulesFolowingClosingListener.ContainsRule applet1Run = new RulesFolowingClosingListener.ContainsRule("applet was started"); //javaws/plugin files private static final RulesFolowingClosingListener.ContainsRule jnlpInside1 = new RulesFolowingClosingListener.ContainsRule("/simpletest1.jnlp"); private static final RulesFolowingClosingListener.ContainsRule jarInside1 = new RulesFolowingClosingListener.ContainsRule("/simpletest1.jar"); private static final RulesFolowingClosingListener.ContainsRule jnlpInside2 = new RulesFolowingClosingListener.ContainsRule("/simpletest2.jnlp"); private static final RulesFolowingClosingListener.ContainsRule jarInside2 = new RulesFolowingClosingListener.ContainsRule("/simpletest2.jar"); private static final RulesFolowingClosingListener.ContainsRule appletJarInside = new RulesFolowingClosingListener.ContainsRule("AppletTest.jar"); //private static final RulesFolowingClosingListener.ContainsRule appletHtmlInside = new RulesFolowingClosingListener.ContainsRule("appletAutoTests2.html"); not caching htmls //common files private static final RulesFolowingClosingListener.ContainsRule localHostInside = new RulesFolowingClosingListener.ContainsRule("/localhost/"); private static final RulesFolowingClosingListener.ContainsRule cacheHostInside = new RulesFolowingClosingListener.ContainsRule("/cache/"); private static final RulesFolowingClosingListener.ContainsRule icedteaHostInside = new RulesFolowingClosingListener.ContainsRule("/icedtea-web/"); private static final RulesFolowingClosingListener.ContainsRule oldIcedteaHostInside = new RulesFolowingClosingListener.ContainsRule("/.icedtea/"); private static final RulesFolowingClosingListener.ContainsRule securityHostInside = new RulesFolowingClosingListener.ContainsRule("/security/"); private static final RulesFolowingClosingListener.ContainsRule trustedHostInside = new RulesFolowingClosingListener.ContainsRule("/trusted"); //config files private static final RulesFolowingClosingListener.ContainsRule trustedCertsInside = new RulesFolowingClosingListener.ContainsRule("trusted.cacerts"); private static final RulesFolowingClosingListener.ContainsRule appletTrustInside = new RulesFolowingClosingListener.ContainsRule(".appletTrustSettings"); private static final RulesFolowingClosingListener.ContainsRule propsInside = new RulesFolowingClosingListener.ContainsRule("deployment.properties"); /* *JAVAWS - NO OLD CONFIG */ @Test public void runJavawsInCleanSystemWithNoXdg() throws Exception { assertNotMainFilesInHome(true, true, true); assertOldNotMainFilesInHome(true, true, true); //we need fake security and manifests File ff = new File(PathsAndFiles.USER_CONFIG_HOME); try { fakeExtendedSecurity(ff); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), null, server.getUrl("simpletest1.jnlp"), (ContentReaderListener) null, null, removeXdgVAlues()); ProcessResult pr = pw.execute(); Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); itwDoesNotComplainAboutOldConfig(pr); //no old config assertMainFilesInHome(true, false, false); assertOldNotMainFilesInHome(true, true, true); ProcessResult pr2 = pw.execute(); itwDoesNotComplainAboutOldConfig(pr2); assertMainFilesInHome(true, false, false); assertOldNotMainFilesInHome(true, true, true); } finally { deleteRecursively(ff); } } @Test public void runJavawsInCleanSystemWithXdg() throws Exception { File f = tmpDir(); try { assertNotMainFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotMainFilesInHome(true, true, true); //we need fake security and manifests File ff = new File(f, "customConfig/" + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR); fakeExtendedSecurity(ff); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), null, server.getUrl("simpletest1.jnlp"), (ContentReaderListener) null, null, setXdgVAlues(f)); ProcessResult pr = pw.execute(); itwDoesNotComplainAboutOldConfig(pr); //no old config Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), true, false, false); assertOldNotMainFilesInHome(true, true, true); ProcessResult pr2 = pw.execute(); itwDoesNotComplainAboutOldConfig(pr2); //no old config Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr2.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr2.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), true, false, false); assertOldNotMainFilesInHome(true, true, true); } finally { deleteRecursively(f); } } @Test public void runJavawsInCleanSystemWithXdgAndNoParent() throws Exception { File f = tmpDir(); try { assertNotMainFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotMainFilesInHome(true, true, true); f.delete(); //we need fake security and manifests File ff = new File(f, "customConfig/" + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR); fakeExtendedSecurity(ff); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), null, server.getUrl("simpletest1.jnlp"), (ContentReaderListener) null, null, setXdgVAlues(f)); ProcessResult pr = pw.execute(); itwDoesNotComplainAboutOldConfig(pr); Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), true, false, false); assertOldNotMainFilesInHome(true, true, true); ProcessResult pr3 = pw.execute(); itwDoesNotComplainAboutOldConfig(pr3); Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr3.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr3.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), true, false, false); assertOldNotMainFilesInHome(true, true, true); } finally { deleteRecursively(f); } } private static void itwDoesNotComplainAboutOldConfig(ProcessResult pr) { itwDoesNotComplainAboutOldConfig(pr.stdout); } private static void itwDoesNotComplainAboutOldConfig(String stdout) { Assert.assertFalse(stdout.contains(DeploymentConfiguration.TRANSFER_TITLE)); } private static void itwDoesComplainAboutOldConfig(ProcessResult pr) { itwDoesComplainAboutOldConfig(pr.stdout); } private static void itwDoesComplainAboutOldConfig(String stdout) { Assert.assertTrue(stdout.contains(DeploymentConfiguration.TRANSFER_TITLE)); } private static void assertOldMainFiles(String s, boolean s1, boolean s2, boolean a1) { if (a1) { Assert.assertTrue(appletJarInside.toPassingString(), appletJarInside.evaluate(s)); } if (s1) { Assert.assertTrue(jnlpInside1.toPassingString(), jnlpInside1.evaluate(s)); Assert.assertTrue(jarInside1.toPassingString(), jarInside1.evaluate(s)); } if (s2) { Assert.assertTrue(jnlpInside2.toPassingString(), jnlpInside2.evaluate(s)); Assert.assertTrue(jarInside2.toPassingString(), jarInside2.evaluate(s)); } Assert.assertTrue(localHostInside.toPassingString(), localHostInside.evaluate(s)); Assert.assertTrue(cacheHostInside.toPassingString(), cacheHostInside.evaluate(s)); Assert.assertTrue(oldIcedteaHostInside.toPassingString(), oldIcedteaHostInside.evaluate(s)); Assert.assertTrue(securityHostInside.toPassingString(), securityHostInside.evaluate(s)); Assert.assertTrue(trustedHostInside.toPassingString(), trustedHostInside.evaluate(s)); } private static void assertOldConfigFiles(String s, boolean certs, boolean trust, boolean props) { if (certs) { Assert.assertTrue(trustedCertsInside.toPassingString(), trustedCertsInside.evaluate(s)); } if (trust) { Assert.assertTrue(appletTrustInside.toPassingString(), appletTrustInside.evaluate(s)); } if (props) { Assert.assertTrue(propsInside.toPassingString(), propsInside.evaluate(s)); } Assert.assertTrue(oldIcedteaHostInside.toPassingString(), oldIcedteaHostInside.evaluate(s)); } private static void assertOldNotMainFiles(String s, boolean s1, boolean s2, boolean a1) { if (a1) { Assert.assertFalse(appletJarInside.toFailingString(), appletJarInside.evaluate(s)); } if (s1) { Assert.assertFalse(jnlpInside1.toFailingString(), jnlpInside1.evaluate(s)); Assert.assertFalse(jarInside1.toFailingString(), jarInside1.evaluate(s)); } if (s2) { Assert.assertFalse(jnlpInside2.toFailingString(), jnlpInside2.evaluate(s)); Assert.assertFalse(jarInside2.toFailingString(), jarInside2.evaluate(s)); } Assert.assertFalse(localHostInside.toFailingString(), localHostInside.evaluate(s)); Assert.assertFalse(cacheHostInside.toFailingString(), cacheHostInside.evaluate(s)); Assert.assertFalse(oldIcedteaHostInside.toFailingString(), oldIcedteaHostInside.evaluate(s)); Assert.assertFalse(securityHostInside.toFailingString(), securityHostInside.evaluate(s)); Assert.assertFalse(trustedHostInside.toFailingString(), trustedHostInside.evaluate(s)); } private static void assertOldNotConfigFiles(String s, boolean certs, boolean trust, boolean props) { if (certs) { Assert.assertFalse(trustedCertsInside.toFailingString(), trustedCertsInside.evaluate(s)); } if (trust) { Assert.assertFalse(appletTrustInside.toFailingString(), appletTrustInside.evaluate(s)); } if (props) { Assert.assertFalse(propsInside.toFailingString(), propsInside.evaluate(s)); } Assert.assertFalse(oldIcedteaHostInside.toFailingString(), oldIcedteaHostInside.evaluate(s)); } private static void assertOldMainFilesInHome(boolean s1, boolean s2, boolean a1) { String oldHome = System.getProperty("user.home") + File.separator + ".icedtea"; assertOldMainFiles(listToString(getContentOfDirectory(new File(oldHome))), s1, s2, a1); } private static void assertOldNotMainFilesInHome(boolean s1, boolean s2, boolean a1) { String oldHome = System.getProperty("user.home") + File.separator + ".icedtea"; assertOldNotMainFiles(listToString(getContentOfDirectory(new File(oldHome))), s1, s2, a1); } private static void assertOldConfigFilesInHome(boolean certs, boolean trust, boolean props) { String oldHome = System.getProperty("user.home") + File.separator + ".icedtea"; assertOldConfigFiles(listToString(getContentOfDirectory(new File(oldHome))), certs, trust, props); } private static void assertOldNotConfigFilesInHome(boolean certs, boolean trust, boolean props) { String oldHome = System.getProperty("user.home") + File.separator + ".icedtea"; assertOldNotConfigFiles(listToString(getContentOfDirectory(new File(oldHome))), certs, trust, props); } /* *JAVAWS - OLD CONFIG EXISTS */ @Test public void runJavawsWithNoXdg_oldIcedTeaConfigExisted() throws Exception { File ff = new File(PathsAndFiles.USER_CONFIG_HOME); try { assertNotMainFilesInHome(true, true, true); assertOldNotMainFilesInHome(true, true, true); createFakeOldHomeCache(); removeUnsupportedLegacyFiles(); ProcessWrapper pw1 = new ProcessWrapper(server.getJavawsLocation(), null, server.getUrl("simpletest1.jnlp"), (ContentReaderListener) null, null, removeXdgVAlues()); ProcessResult pr1 = pw1.execute(); Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr1.stdout)); Assert.assertTrue(moving.toPassingString(), moving.evaluate(pr1.stdout)); assertMainFilesInHome(true, true, false); assertOldNotMainFilesInHome(true, true, true); fakeExtendedSecurity(ff); ProcessWrapper pw2 = new ProcessWrapper(server.getJavawsLocation(), null, server.getUrl("simpletest1.jnlp"), (ContentReaderListener) null, null, removeXdgVAlues()); ProcessResult pr2 = pw2.execute(); Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr2.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr2.stdout)); assertMainFilesInHome(true, true, false); assertOldNotMainFilesInHome(true, true, true); } finally { deleteRecursively(ff); } } @Test public void runJavawsWithXdg_oldIcedTeaConfigExisted() throws Exception { File f = tmpDir(); File ff = new File(PathsAndFiles.USER_CONFIG_HOME); try { assertNotMainFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotMainFilesInHome(true, true, true); createFakeOldHomeCache(); removeUnsupportedLegacyFiles(); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), null, server.getUrl("simpletest1.jnlp"), (ContentReaderListener) null, null, setXdgVAlues(f)); ProcessResult pr = pw.execute(); Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr.stdout)); Assert.assertTrue(moving.toPassingString(), moving.evaluate(pr.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), true, true, false); assertOldNotMainFilesInHome(true, true, true); fakeExtendedSecurity(ff); ProcessWrapper pw2 = new ProcessWrapper(server.getJavawsLocation(), null, server.getUrl("simpletest1.jnlp"), (ContentReaderListener) null, null, removeXdgVAlues()); ProcessResult pr2 = pw2.execute(); Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr2.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr2.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), true, true, false); assertOldNotMainFilesInHome(true, true, true); } finally { deleteRecursively(f); deleteRecursively(ff); } } @Test public void runJavawsWithXdgAndNoParent_oldIcedTeaConfigExisted() throws Exception { File f = tmpDir(); File ff = new File(PathsAndFiles.USER_CONFIG_HOME); try { assertNotMainFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotMainFilesInHome(true, true, true); createFakeOldHomeCache(); f.delete(); removeUnsupportedLegacyFiles(); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), null, server.getUrl("simpletest1.jnlp"), (ContentReaderListener) null, null, setXdgVAlues(f)); ProcessResult pr = pw.execute(); Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr.stdout)); Assert.assertTrue(moving.toPassingString(), moving.evaluate(pr.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), true, true, false); assertOldNotMainFilesInHome(true, true, true); fakeExtendedSecurity(ff); ProcessWrapper pw2 = new ProcessWrapper(server.getJavawsLocation(), null, server.getUrl("simpletest1.jnlp"), (ContentReaderListener) null, null, removeXdgVAlues()); ProcessResult pr2 = pw2.execute(); Assert.assertTrue(simpletests1Run.toPassingString(), simpletests1Run.evaluate(pr2.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr2.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), true, true, false); assertOldNotMainFilesInHome(true, true, true); } finally { deleteRecursively(f); deleteRecursively(ff); } } /* *ITW-SETTINGS gui - NO OLD CONFIG */ @Test public void runItwGuiInCleanSystemWithNoXdg() throws Exception { long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { assertNotConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); ProcessWrapper pw = new ProcessWrapper(); pw.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath() })); pw.setVars(removeXdgVAlues()); ProcessResult pr = pw.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); assertConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; } } @Test public void runItwGuiInCleanSystemWithXdg() throws Exception { File f = tmpDir(); long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { assertNotConfigFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotConfigFilesInHome(true, true, true); ProcessWrapper pw = new ProcessWrapper(); pw.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath() })); pw.setVars(setXdgVAlues(f)); ProcessResult pr = pw.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); assertConfigFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; deleteRecursively(f); } } /* *ITW-SETTINGS gui- OLD CONFIG EXISTS */ @Test public void runItwGuiWithNoXdg_oldIcedTeaConfigExisted() throws Exception { long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { assertNotConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); createFakeOldHomeConfig(); ProcessWrapper pw1 = new ProcessWrapper(); pw1.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath() })); pw1.setVars(removeXdgVAlues()); ProcessResult pr1 = pw1.execute(); Assert.assertTrue(moving.toPassingString(), moving.evaluate(pr1.stdout)); assertConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); ProcessWrapper pw2 = new ProcessWrapper(); pw2.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath() })); pw2.setVars(removeXdgVAlues()); ProcessResult pr2 = pw2.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr2.stdout)); assertConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; } } @Test public void runItwGuiWithXdg_oldIcedTeaConfigExisted() throws Exception { File f = tmpDir(); long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { assertNotConfigFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotConfigFilesInHome(true, true, true); createFakeOldHomeConfig(); ProcessWrapper pw1 = new ProcessWrapper(); pw1.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath() })); pw1.setVars(setXdgVAlues(f)); ProcessResult pr = pw1.execute(); Assert.assertTrue(moving.toPassingString(), moving.evaluate(pr.stdout)); assertConfigFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotConfigFilesInHome(true, true, true); ProcessWrapper pw2 = new ProcessWrapper(); pw2.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath() })); pw2.setVars(removeXdgVAlues()); ProcessResult pr2 = pw2.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr2.stdout)); assertConfigFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; deleteRecursively(f); } } /* *ITW-SETTINGS commandline - NO OLD CONFIG */ @Test public void runItwCmdInCleanSystemWithNoXdg() throws Exception { long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { assertNotConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); ProcessWrapper pw = new ProcessWrapper(); pw.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath(), //one impl of new parser was unable to handle duplicates "set", "blah", "differentBlah" })); pw.setVars(removeXdgVAlues()); ProcessResult pr = pw.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); Assert.assertTrue(unknownProperty.toPassingString(), unknownProperty.evaluate(pr.stdout)); assertConfigFilesInHome(false, false, true); assertOldNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; } } @Test public void runItwCmdInCleanSystemWithXdg() throws Exception { File f = tmpDir(); long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { assertNotConfigFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotConfigFilesInHome(true, true, true); ProcessWrapper pw = new ProcessWrapper(); pw.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath(), //one impl of new parser was unable to handle duplicates "set", "blah", "differentBlah" })); pw.setVars(setXdgVAlues(f)); ProcessResult pr = pw.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); Assert.assertTrue(unknownProperty.toPassingString(), unknownProperty.evaluate(pr.stdout)); assertConfigFiles(listToString(getContentOfDirectory(f)), false, false, true); assertOldNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; deleteRecursively(f); } } /* *ITW-SETTINGS commandline- OLD CONFIG EXISTS */ @Test public void runItwCmdWithNoXdg_oldIcedTeaConfigExisted() throws Exception { long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { assertNotConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); createFakeOldHomeConfig(); ProcessWrapper pw1 = new ProcessWrapper(); pw1.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath(), //one impl of new parser was unable to handle duplicates "set", "blah", "differentBlah" })); pw1.setVars(removeXdgVAlues()); ProcessResult pr1 = pw1.execute(); Assert.assertTrue(moving.toPassingString(), moving.evaluate(pr1.stdout)); Assert.assertTrue(unknownProperty.toPassingString(), unknownProperty.evaluate(pr1.stdout)); assertConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); ProcessWrapper pw2 = new ProcessWrapper(); pw2.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath(), //one impl of new parser was unable to handle duplicates "set", "baf", "differentBaf" })); pw2.setVars(removeXdgVAlues()); ProcessResult pr2 = pw2.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr2.stdout)); Assert.assertTrue(unknownProperty.toPassingString(), unknownProperty.evaluate(pr2.stdout)); assertConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; } } @Test public void runItwCmdWithXdg_oldIcedTeaConfigExisted() throws Exception { File f = tmpDir(); long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { assertNotConfigFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotConfigFilesInHome(true, true, true); createFakeOldHomeConfig(); ProcessWrapper pw1 = new ProcessWrapper(); pw1.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath(), //one impl of new parser was unable to handle duplicates "set", "blah", "differentBlah" })); pw1.setVars(setXdgVAlues(f)); ProcessResult pr = pw1.execute(); Assert.assertTrue(moving.toPassingString(), moving.evaluate(pr.stdout)); Assert.assertTrue(unknownProperty.toPassingString(), unknownProperty.evaluate(pr.stdout)); assertConfigFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotConfigFilesInHome(true, true, true); ProcessWrapper pw2 = new ProcessWrapper(); pw2.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath(), //one impl of new parser was unable to handle duplicates "set", "baf", "differentBaf" })); pw2.setVars(removeXdgVAlues()); ProcessResult pr2 = pw2.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr2.stdout)); Assert.assertTrue(unknownProperty.toPassingString(), unknownProperty.evaluate(pr2.stdout)); assertConfigFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; deleteRecursively(f); } } private static void fakeExtendedSecurity(File file) throws IOException { if (!file.exists()) { boolean a = file.mkdirs(); Assert.assertTrue("creation of directories for " + file + " failed", a); } File f = new File(file, PathsAndFiles.USER_DEPLOYMENT_FILE.getDefaultFile().getName()); ServerAccess.saveFile("deployment.security.level=ALLOW_UNSIGNED\ndeployment.manifest.attributes.check=NONE", f); } /* *PLUGIN - NO OLD CONFIG */ @Test @TestInBrowsers(testIn = Browsers.one) public void runAppletInCleanSystemWithNoXdg() throws Exception { assertNotMainFilesInHome(true, true, true); assertOldNotMainFilesInHome(true, true, true); //intentionally hardoced default fakeExtendedSecurity(new File(System.getProperty("user.home") + File.separator + ".config" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR)); ProcessWrapper pw = new ProcessWrapper(); pw.setArgs(Arrays.asList( new String[]{ server.getCurrentBrowser().getBin(), server.getUrl("appletAutoTests2.html").toString() })); pw.addStdOutListener(new RulesFolowingClosingListener(applet1Run)); pw.setVars(removeXdgVAlues()); ProcessResult pr = pw.execute(); Assert.assertTrue(applet1Run.toPassingString(), applet1Run.evaluate(pr.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); assertMainFilesInHome(false, false, true); assertOldNotMainFilesInHome(true, true, true); } @Test @TestInBrowsers(testIn = Browsers.one) public void runAppletsInCleanSystemWithXdg() throws Exception { File f = tmpDir(); try { assertNotMainFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotMainFilesInHome(true, true, true); fakeExtendedSecurity(new File(f.getAbsolutePath() + File.separator + "customConfig" + File.separator + PathsAndFiles.DEPLOYMENT_SUBDIR_DIR)); ProcessWrapper pw = new ProcessWrapper(); pw.setArgs(Arrays.asList( new String[]{ server.getCurrentBrowser().getBin(), server.getUrl("appletAutoTests2.html").toString() })); pw.addStdOutListener(new RulesFolowingClosingListener(applet1Run)); pw.setVars(setXdgVAlues(f)); ProcessResult pr = pw.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), false, false, true); assertOldNotMainFilesInHome(true, true, true); /*do alst, we need to check the migration, not applet lunching itself*/ Assert.assertTrue(applet1Run.toPassingString(), applet1Run.evaluate(pr.stdout)); } finally { deleteRecursively(f); } } /* *PLUGIN - OLD CONFIG EXISTS */ @Test @TestInBrowsers(testIn = Browsers.one) public void runAppletInCleanSystemWithNoXdg_oldIcedTeaConfigExisted() throws Exception { assertNotMainFilesInHome(true, true, true); assertOldNotMainFilesInHome(true, true, true); fakeExtendedSecurity(new File(System.getProperty("user.home") + File.separator + ".icedtea")); ProcessWrapper pw1 = new ProcessWrapper(); pw1.setArgs(Arrays.asList( new String[]{ server.getCurrentBrowser().getBin(), server.getUrl("appletAutoTests2.html").toString() })); pw1.addStdOutListener(new RulesFolowingClosingListener(applet1Run)); pw1.setVars(removeXdgVAlues()); ProcessResult pr1 = pw1.execute(); Assert.assertTrue(applet1Run.toPassingString(), applet1Run.evaluate(pr1.stdout)); Assert.assertTrue(moving.toPassingString(), moving.evaluate(pr1.stdout)); assertMainFilesInHome(false, false, true); assertOldNotMainFilesInHome(true, true, true); ProcessWrapper pw = new ProcessWrapper(); pw.setArgs(Arrays.asList( new String[]{ server.getCurrentBrowser().getBin(), server.getUrl("appletAutoTests2.html").toString() })); pw.addStdOutListener(new RulesFolowingClosingListener(applet1Run)); pw.setVars(removeXdgVAlues()); ProcessResult pr = pw.execute(); Assert.assertTrue(applet1Run.toPassingString(), applet1Run.evaluate(pr.stdout)); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); assertMainFilesInHome(false, false, true); assertOldNotMainFilesInHome(true, true, true); } @Test @TestInBrowsers(testIn = Browsers.one) public void runAppletsInCleanSystemWithXdg_oldIcedTeaConfigExisted() throws Exception { File f = tmpDir(); try { assertNotMainFiles(listToString(getContentOfDirectory(f)), true, true, true); assertOldNotMainFilesInHome(true, true, true); fakeExtendedSecurity(new File(System.getProperty("user.home") + File.separator + ".icedtea")); ProcessWrapper pw1 = new ProcessWrapper(); pw1.setArgs(Arrays.asList( new String[]{ server.getCurrentBrowser().getBin(), server.getUrl("appletAutoTests2.html").toString() })); pw1.addStdOutListener(new RulesFolowingClosingListener(applet1Run)); pw1.setVars(setXdgVAlues(f)); ProcessResult pr1 = pw1.execute(); Assert.assertTrue(applet1Run.toPassingString(), applet1Run.evaluate(pr1.stdout)); Assert.assertTrue(moving.toPassingString(), moving.evaluate(pr1.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), false, false, true); assertOldNotMainFilesInHome(true, true, true); ProcessWrapper pw = new ProcessWrapper(); pw.setArgs(Arrays.asList( new String[]{ server.getCurrentBrowser().getBin(), server.getUrl("appletAutoTests2.html").toString() })); pw.addStdOutListener(new RulesFolowingClosingListener(applet1Run)); pw.setVars(setXdgVAlues(f)); ProcessResult pr = pw.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); assertMainFiles(listToString(getContentOfDirectory(f)), false, false, true); assertOldNotMainFilesInHome(true, true, true); /*do last, we need to check the migration, not applet lunching itself*/ Assert.assertTrue(applet1Run.toPassingString(), applet1Run.evaluate(pr.stdout)); } finally { deleteRecursively(f); } } @Test //this test is unrelated to XDG, bus it testing issue in new option parser. //when this test was under fixing, it was found, that parser is unable to handle two same params in set //this is reproducing it. @Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2015-March/031049.html") public void runItwCmdInCleanSystemWithNoXdgAndWithTwoSameValuesInCMD() throws Exception { long t = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 5000; try { assertNotConfigFilesInHome(true, true, true); assertOldNotConfigFilesInHome(true, true, true); ProcessWrapper pw = new ProcessWrapper(); pw.setArgs(Arrays.asList( new String[]{ server.getItwebSettingsFile().getAbsolutePath(), //one impl of new parser was unable to handle duplicates "set", "blah", "blah" })); pw.setVars(removeXdgVAlues()); ProcessResult pr = pw.execute(); Assert.assertTrue(notMoving.toPassingString(), notMoving.evaluate(pr.stdout)); Assert.assertTrue(unknownProperty.toPassingString(), unknownProperty.evaluate(pr.stdout)); assertConfigFilesInHome(false, false, true); assertOldNotConfigFilesInHome(true, true, true); } finally { ServerAccess.PROCESS_TIMEOUT = t; } } } icedtea-web-1.8/tests/reproducers/simple/simpletest1/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024422 xustar0030 mtime=1552401893.163832565 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/0000755000175000002070000000000013441742745025307 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/PaxHeaders.7406/favicon.ico0000644000000000000000000000013213441742745026620 xustar0030 mtime=1552401893.134832625 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/favicon.ico0000644000175000002070000000257613441742745027442 0ustar00jvanekmock00000000000000h(   & % % & ' % & '&&'!'"(""*((()(=()>()> E? E E?@? VFGGHG W!H#H T%I #S "Z)J+K )f&|'| -s-~'Ÿ&Є 7{/•-І0 1Ї #ж,М9—6Ђ&з>'з1И.Т=”0Н;Ÿ)и8Љ*и*и<Ѕ-й/д>Ѕ6П.й8К0г.к@Ѓ7П7Р9К2дAЅ1й1к;ЛDЁ2к<ЛAЏCЊ4к;Ц7е?М6лAЛ@С;б8лBНIЈAС9м;зDЛKЋEО<м>з=мHНPЄGУJХLПEйOРXІKаJгPЦRРRСMгRЦLлRЪKрVРMоUЧWСWТXРVЧSвNтWЧYФWЬQу\УRуXзVоUфUфVфXо]Я_Щ\дaХ`ЩaЪYфYхdХ\сdЫ\х\ц^сgХ]цcм`ц`чjШeкcсcуjЭbцmШdшeчfчhтqЩiуpЮhшhщjуiшiщtЪkщlщlъmъwаoъpъpыpыzвtц{бsьtыtьwьwэ{э~юэ‚ъ‚яэHNV]_Pq‚pˆ”ЃЈАLTYZB-EvG3U’ЁЇБЕWYgI%F%'…ІБЙМ`heA > [ЅЖМФkoR" =  @+ЛФЫswO D JХЬб{€\()K'*f.0žЫгж|b^luŒX6nЄŽy™Щйнc&)z–‹ma“З›24Џосd tS9 simpletest1 IcedTea simpletest1 simpletest2 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/PaxHeaders.7406/simpletestSlowBrokenC0000644000000000000000000000013213441742745030724 xustar0030 mtime=1552401893.147832598 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/simpletestSlowBrokenCustomSplash.jnlp0000644000175000002070000000425213441742745034744 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/PaxHeaders.7406/simpletestSlow.jnlp0000644000000000000000000000013213441742745030422 xustar0030 mtime=1552401893.163832565 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/simpletestSlow.jnlp0000644000175000002070000000414513441742745031236 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/PaxHeaders.7406/simpletestCustomSplas0000644000000000000000000000013213441742745031011 xustar0030 mtime=1552401893.131832631 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/simpletestCustomSplash.jnlp0000644000175000002070000000431413441742745032735 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/PaxHeaders.7406/simpletestSlowSlowCus0000644000000000000000000000013113441742745030777 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/simpletestSlowSlowCustomSplash.jnlp0000644000175000002070000000425313441742745034451 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/PaxHeaders.7406/netxPlugin.png0000644000000000000000000000013213441742745027342 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/netxPlugin.png0000644000175000002070000013531213441742745030157 0ustar00jvanekmock00000000000000‰PNG  IHDR@Ш™8ЋsRGBЎЮщbKGDџџџ НЇ“ pHYs  šœtIMEм  $cЬ^tEXtCommentCreated with GIMPW IDATxк„Н}№vkYv­ЭУi8Pˆ„"MRХI4jMfR“ŒѕЋŽN§#b"&ƒчР b ЂЃb#h*’дФи(ЋжiІ*M“:ЦІIܘд$Z3ˆё(јЌўёьНяЕжu='Ьшћžї§НЯЧоћОяыZзњ@UБтРV…*  ћop§‹ѓЯЎ^`џ7XПпџЎŽŸEjлџL^kџuлџ|џ—з?л]ЏБоЇŽзДї.ћїчПБїЌкж;~zџЙѓ[Um(ЏзсќhАŸ_зc§>Плёнэ§єћФѕЕїСљnыЛХwО^ЛИцђž@˜зaЏMюuэпwлoкљqОŽўЮ‹‰хsЧgбћЂЯШѕчИюхѕЦШkWUmђ\”]Џѕ А=Ÿг3jїl[я y6ќљяГџžUыЙ,ЮчфИnЧŸ ЉPшп#юЉо[œ{}зѓЛхчМumPvŸЎПnўпћšФy‰фžеѕ9n}fНОыьY]яƒі\іЯлkжоБжаz6єк {OЌщѓѓђњ{Ъz=^їЎo~ыЫДПг_1ќХё{ъУэџRž…uГ U\VџЩёqэч‘Џш›пёG<K§нўŠєŸѕяt]еч_zƒїзѕЂ]џŽqуЮuЁпrЉdСУ/"ф3A„Ќѓ§ЃвПњМОНОўљ §+Жџ9їO?пtЯчH6рѕ™з5+LOь~ггXђ­т=я-eсысrќацї*\?џqл/я{.№§j№[jп‡ђ,Щ&„ъЯj=Гqыc}Ўˆў<Ё&uоїИgy?у™ЛО~МklЄzлgЄюђ}хњЃэEч›Ыц*Х|ZTќЛыіВЏeПЯwЙљщ&р'ŠnNШmСз іe#'Ÿ~a{aжўpкоРЃ:ѓЊёЄйцfŸЁќЯlS;ћц[P>KRб2 xљѕ‡фZ XЗч2œ|Џ8є>ьЋтјKˆтСbTGзKGБWUЯк7Jœеb}уBйx8–WКе6yФY€ycŒ…WіИїŒrЏ|Ё S•dеY-TTчІЙљїЏ•№ъЃжfT“,Ъ!Ј‡lcёOЛ(ќеMјxŽ е(ю{yщ=‚нGдt&!жЎ›IœJэР–)Њ<&8WИ­5лЄ2ЊИЂ‹l›fќйкбќљЙГЭяЈbЖ8QЌ4­hsх„м*ъ-Дu@ЎЖЭ$нАиO^љ‹ћfa$G<укyЅЃ>хфiоЖVЙyе‡ЕСя› ђсf­MP/У&ŸYЋ—ЁX‚?ЉіФзНf—gЎbcѕћb/VEDiЁžu]яNр‡}­Уі8\{Сц‹(Є>'ˆЎU=лжЊd]/%-fБтрY?tV3эœкЌ рБrЅpРйpA^эрЯwщЁЄUЉnФеКДшљVQо64_vмa*§ŽЪQzПJФ~KIПундкТ*-ЏЯcD/WХ‚Ё'okтxŸ!Š›TBш'ћљ`?/ЏЗэ.O,@л_k!Ѓ7ъZЊž_ЊoыыпйгкNЏЕYвЗ­c=pЂЁМ~пЌћт@n(кІкЮлhНz‹ХЃp†a5vы`DДNљїњlВAЌB ђœЌ6ММйwŠmП6м+9 ЎWtь“…VЁTЖи -yмЃДЊpл(зNVt›^ГЃRSL:7bhЙ~ъм<№j]ёhнДцшUйёЋ–Кh %b\\;”В.у3„ —>ZЭѓ№№Aз:xЗxq.ј-WО=­о*+ZЁ› u#:ј‚ УЊ1ЊBŠhДЬ€у;n[MGВa‹Й>аp^}Д:ДDњкjЯъО_џu‡А†ЁC?ˆj'Ъ‹lз‰zN'эаjјbћњH€<лCнœЖпЊе6яЕU>=ZМЖЉjM x^ާ `K>ЋeАС˜pЃeƒЮhИцКWНђ‰; ŸžыУ~ Ѓ†їЛQ)(fќШИМЊOKзЄзСўu W5f5=†…–аOƒЯ ИŒ6хїлё,рTр\ДЉt2,ДЯC%&:WRйС+94xЎ—Ѓ5mг)–›jf‡0ћ`˜†РюiGЖІlЕˆ&qЏйбдуgю@Ѓ?ЃcЕгПк$MшФ0ѕЉ­•Ф SFя!ж†ZлОє)ebbњ mСyСdb}~VЦx_ъ/шЂхЭk‰уМdт:rrЧFКХFо][,:ЙQ-&}žhдxћџє€‹J5Ь@#jгЦИъгї>[ iB ЧЎTЎ*9^sm4ZLўеЇвНRъэєкkœоЧйpV*X•Ё.;\щсЅ‚JУ"Љ,жянDi…Њp#ф YdЊ2[л…“ЏmшАmг5Нр\ћГН`S ѓИPw­LŒё2їHlyЂњ„ІXR† cˆjХ7ХiБ%юНЂW/\…Муг”*Nt`ТsfLбOs ˆPo }"щэ˜QgaвъjЫЉЂХєївk‹ŽНЊfђЮjx=іУЯy—ŒЂк& +йTк.p`^r…яЯƒKjјЩШ:yx:…ЋЊO хпљГЩЪјCFЇŠaKєа+кsюСq@Ÿ‡ЗрГ”jі\kp“зJlбІЅIъkЕr#jƒ’N~ЋqТя-iƒАИШЊgЇ…-Њђ~#лAI‚ww­ШЂ“~Rs-`йˆВd-јQН”WlŒН†тgYмЏ>hmвiэЇпPza4ДЅСТ|“Ч*ЙQ?rТЮ†3ž?Ї”ž‰b|IчљбЏНb№11Ce 0ЊѓУ‚Ѕ@;:ш8еи•UЩЖРnа7hэuи ЦЅЌN\ŸќЌЂNХiАoLААЂw˜VбйЏвњf—P“nС4тЕє{ )x›>Hƒ98,З9ТеІйA ЗЧ„'сњжЂ”2=ЬІБFcЌЛКв`тM•a_““Ъ@ЄІцcMзXє•LёЏ“Žв*Q!}ЖьhЈ €с~ \[юГ—ђСъЖгьФю”^";dфоюВЙЇтЦеЉє`Sм@?W@mZ9№ыВяд?ЉTbЁ Бв пKЕONŠ•ЖSy9№QЋЕЌ gя8(0fцњ'k?ЅЯ;Ё„шЭi[V4 №ХЛiЛ>TP(_;­З€ѓG|л 1чoРe‘œA™т2T^ьJЊf”7сю 6iь„…Вc№їЙ[e2№[ЊОєУї†q{‹ˆ“ЅfzkЛЈЋђтРŸыšcКЪ”Де0 „oX…Ў˜PКЯuЃ‘ЉƒŽё[ЩFWигцъ‘b7эі!De­8йоЊ8…?WСыэxДѓЮ†wŒнR˜(FVM?*N-CЁЌ ЋZKg23Ёq4uŠ№сжsqWcшАўЉlhDУХŠ„Ž3„  W@­PЉ ’ ‰ЮŸд‰q5dRа№адн‡ЅŽ%#йшѓ] [5 б‘u.­^З6А;ZрыЙ5нЉjW'euš‹@ MŠжoŒŸ6hІ§aqРœ‰ІœќA§Њ•Рќє]ЩЄWFx†бUO gюЈзc‹†е™ћ“J{lИеЬєїЎŽГiХUк3ВОkРыS!*PЬA~ІсY™6‘6бЇЖиIжn“ІЁѕ ˆdsмi§й0U>hеОё œСJZв "|Uчщ•‹:Q]–&ЋцЌsž†›єеў9'Ќzвд"їVŒь†vћЧIђ‰^1]sDеўпХЬиЉиЪЄ<_ŸУdW&LЈd“јƒгЏє dЗB(“№bР…`ЋТ15гОЂс†ЮвЋ›ЪV‚4qМnBCnєУєХХS 9W~/›–ЇDJ(TЊ њфђиф[]‰ZЃЛЄiЧз€d•”ЊžиЮZ^iЩФ“2(иˆnШсsE“|SSч6lšХЁJАбШ’Ї—}Ѓ>ИЗь‡w#nГW^„уqЁaі№)•ЛšlvяlўQMV™\Ъ-ж<ъЦš–*qiRrhжёиЄЩм5Zџ|яфхjФщЦ .gEГ} –Л=TЈŒSЈЭ7Žк*!LtмŠ6кgWЃДVRQ0ЊХъЎ9qѓ§"qаШЂm6 ѓIǘфwе­a‚,СА6б0oцА2WIЪaS!mUjмXj˜JЎОmNhжTс†ѓPlЬNЕuъвД{У(*‰“Уiq1-з­zKŽ`t(ю,Ф‘-БNЇlQ;ЋTЛЄвM+ІюnPIU‡XцXУ‰ЉЖЇp˜ЦдЇ,ЏŽыТж0эЪpAЗ\чџ\ ŒA:й€кљс§z!Oљv6%œєˆ›dФcчw­™yTЯ7Nк ВnиTѕMФnƒšOП›Zi ЕšжЖ‡ЈуŸ:(1шЃ”~=„ЌpЉі`.YNљ‡`м:ЬЇЅЧож‘жH5б\†ЁjВ“т<™ШЫло>jћ9T ? .Ж[?/SLУlўЈž&Ь–ъцgЪO“Ш‰Naн'mˆеЋЌёa*ЖъНOн§ыXXкѕIurЊцса8-oŽ0О ˜|-'аzаБc—ЗѕГqˆ&'œюбёs(r‹SšјМd ’Н“]Р&АяsЖЄћц/…бчнVЏЯрюeжЕИї€CЊнv€W­Ищ(›ї]ОЫ‡Ї В‚ТШђGš˜-UАЗJ’СЫЏŸR2Ѕ–ДI§š›P•oV`Kf6“ нXвПWЪŠ™9ЄдaЪ#Tч_6х:м‚Ёrхр“[" LрПmМЋ?Тd‹­!%м†AyТ ДН ЫUЭыoкQI—ЩДfє§ъ2уŠ%З[}^e#o ƒи_JчЪaYюd­O1_\пol`˜ШЦЭ—-ЋxЁscom› y%Ђf'V(qЙр­Щ;ІУ‹<пнWŒЯгћю(б=ЛkLyNіO\ьІЋs7ЖБJњъnцШС`а•%н;1сnЎ(ЂїMcЯŒRЪй|юf/G_/#›у4фСРTKYeJhЬA3УЭтJ*#мтмL:й[пuв>–™!”и uЎN=;ц‡T—Е‡ЂІs7Вz_Ё[†7І$3ТcЊ†BПpќ§Тi9јщ3ЪбџМёLG7дЌz$>Z№ ЇftбЁи?НЈUџоDP6тNяМЩjЙ(і]6‡@0,2І*Г‚иЮžе AЇƒVРCц‰-h‡щр-йyœ—ДzFЉШsС,лр„н ЅC †~˜шYŽЗщIœЧц!E<пe0ЖIњ­aвцmЫтЛьЁ%ОБk>йоšиYБПНДmxдv|šќэi+EХ e8…Ък=JАIч%bЧJ 4•гсО_†ѕ˜эcšDџеrьpА>јPАWŒХІNОе‰%й5BV0іMАБ<ёqгрЭёЄЌežсшFВZЏШ+Г]иЂ0ЩDЊЉ_IиЕTLFщBнŠЪ”Э^р›bјW`uуйВФ—MЇWЄ GЛ^Мщ–~rЙю ЃЬ%юY$0YЪ›E8ЛШЋq*  І2єKlqЧ—‰ѕZкљ@$–„OЬWЦ@“b)ѓ˜яЇЁGlnм UСm~—у7РъƒєќB$кHМЭвЊІУдOѓ2Pa?PйЇёт­9Сф:СŒ 5;( jš†З<ѕNбIЫ`ŸШcЈXjtщайnвuКмqHЦ†ДYх5бWаIДrh•х~lUƒърњLc|§Њ‰Оsc Pе@ЇЬШТф!Ўжtсхlƒ:ѕж4?рTn _ЧrЋ7ыОі~:ŒфРЊРР3Eѕ}ЬЭ‹•‡а‘ZŽGшžІŽ ЉgoЈzмhCЉI§!Д(43И=ZрvЊsёi*ŒЙulелЊ(еэЁЈZ­уУo[žјXœЬcюž!8пКXQOщKFМ,Š7лaДю@pЩjhiА@ўюJ0N”ЏсEkSBм*{O„kf”ЁotщщG6L-)fL6ž5JцiWЏ\ЯS8ДЪЅ‡f8ІЗѕк$}p“л.е™ЏxЇ&sЮФЬT”1nтєМ9&…Jч; }ўd†‰Щ{n,Бн@€rsВu(УЎаЬ)зІ -v’JЅј­Ÿrxrг‚=СjяГхCШNˆ6;u5AHЋ ЫУPЃaІбќ €;щаh(zeŽ0юtй{ šŽ7NRКлœBRзоžG ыУa”Ѕ?]@9Вzž6ˆє.ф@ХqŽŠпЋ4+VgэСЛъVЕ_SЛ~ЛЩnJ‹Щ‰к ƒГc"mЌЖо&ѕGЖЙУ”25еўAfЄ ЪсЫАЄ`хoFж1фo&{УшЂRС B„Ч`HВKV_КЕTийщTœ”}ш0ІФNв#Р "1э“л_cРSђA&Зš 0ЏlЮHжфШ<д7•F˜9Љ6‘‹M 1%lWЏхХ Ц МF~Вn<{j^›UFвw†ћ€1ъ4ЭFxЎkd‘SmСЁ–цB+%kwш]иРМQЩnлБчрfЈЅ~мм1Чwl0ЏН„ŒюЈТТ - =К…‘VƒБVfLo6М*>э˜ јЊби€;Ooч@MэЉъtЯПц,6Ш ЭN”уцдЖІ!™В•ђ)Яjv­0"tEetЂш„…Nu(šињѕwвдЖ$­}Ÿ @fbй д&ЪЋ•SќШ5ЫЗSфN& Сме™єLКе№:(ЏBВЧ[ŸSл@6\TпдГњnіњX­jкd5!@+cЫАZиіkщеjPХj-Ж68+&’И§ГАЯ “ЎMw‹ДЉ^UгйН†‹ZT!ћ Ž­4ЬцюЈс™.ѓ„QšqѕK…#Q•цW <Тј^'Ћ~1З}Cш4QYaкрjnл!ZЫnы_§02ŒGeЧ0W<ёAЛpщЭИ2w;•ЙѓгфД!dˆеЅ}й.dѕSƒ6ђ аЏзІ &5й­ДюЊд†Ьi9noшjАC—А8 ПnF`Ѓџ0іЧ *ЗЪ,UЩГ…›у6иЅЮ `є,ƒ|†)QЫxnЂ]d|о|Ц1 Iю…р‘lСщŽIцл1СyдЬHYбP f‹a№кљНZ˜TЗ­‰šі3‚Ђлƒ Š в$ЇbШnCІъз~ШkщЯ•гjВ]‡IЧ&@ž-@ЪїЌ‚ХgйpNгЦН'-б Ыћ$‘7ъ—ЦІцЈАк0•]I<›sгкaяЅЦЃ „УЬ>œ’I#”зЈЌ‰…chtNV™FЖшQ FЩJ…K…пeL Э7`‰'Х\MФˆ[<г9 5 ‡іKФслv?Р;cЄGп5Ь­†W”КСDЪ•ЕNгЙeПэXЄЦwџС у˜ЈОQ6ќ6@n †-ŒjЌb5(:'YЌPImƒЁc­JФB™д Оуyњsр…ѓA„ю [DYX%Ъ;Г)ЊЁJ3ЫеNЗIфXaЫ‘['ЮbыщtSY_СL0x˜ŸrРyЧєИЩTx2=њМ]ƒЊ†xЉ‘рќrUj]1qlгњšѕW‰ЉнФTƒNrЉ2ѓс5иHые,јs@ЊxІИ †ЪнЅfЫВ<ЏюЎхtЖЪѓІ…Š3@@ŒоЏ!Z+З№0qfбpІ­к†ї_еЃУn'6Н$ЋJќА Їlg’Yяœ2tžТЃ э{Ї“y\0аL4wмЊN[*щŽOО­‰yУ$Жœ„ГyD*юдGЁѓ$9Г­ZЬѕЯ )L kѓЪБ=hє}јАiБ?@*У—ь афžm+›\НЭЫ“є7ЎM7@ШSњ4УPтСFпœб_ƒƒѕ8W2EухИљlу.ё6нMйДw!35ЕШзЪ4K9ЅpDпу№a/Џ8%ДЉc№&ыfГZJoЉpŒR~фF„4яа,™СЈч1D№ят]у‰tTW+ЧЕѕЁBReщ0нK-ђ˜йŠiСŸ1лvžгФБSc  з‘Мs Уj9ДVk•TЊj‘Й`jР™0а;*=˜™qe<ЯT†0щІя*мВІhIФедN“eПў7Й ИњиХ œнf~*›Іхж@RЖАhЃAJ№ВЦaЇAїP9ЉЯЂAˆа[Lїм* o IDATФcаMŒˆкn[:мбhюf›u'0c0JmљЇх Мq”ЖЭ8JнTy ШQ˜dnЎR"ЌЯpУ8ЭВ0LŸtт—&лыЦУpЉAќm†СйЃсJ}ЌпЮ€Ўв)вУpЏЮРёФD9ЉiВН:}ЎпnрŒЇ?Уžtътиh(HЯœˆКЃЉlРиеЂ@ІВRгg€ЪуnD"И%кЂяаpжZвнЫOŸЬ N\eйВвuцЃ ™aЉ?šѕAŸ ђ™ІЈN'2[)Ш+кœрьC—Sœsэ€юђДЈ!d'‹ЬоЕdаьгЄР3аЋхšєIкцЛЏ…x@єрfмfIЈ@ЯЩ'nђ—шvВBp ‹˜œ‰х'юXnŽP™‚‡фIхn|ип_п;Счm"ЈЇЙцџzѕоюYcѕчeBуА‘ЂaDћЭYч”0Ь/+Ќs ЌЅCˆЫYjšІIЩФФTјѓц!єЋƒ˜]ЦЯgaлЦ =5ВѓœьоІІиГ€Фьшїћж31*|zŽx:Иx q7aHцGу†Іа‰|›‡ЊЌџмеd3…рМOјCА ўŸжѕ.ЯRldТ,nрЭaKFе ЭœpЙЁ Ÿ8k”ж`>ј^u+v=ЌСУ6ђ ‘eшўаn5ѓЯŽсF>LSkыа§ATOщ?Z[všQЋКіџи\Я›ьчˆчЁ7иЉ;еC;,л<7ж_ŒДP2пЄъœLAЊKБ„^тэWЊ5 ^nˆ‡РP…Rž“$C`ЂЕ “WDW„4žэЄC+BёЬCYš<Чw8№S DP3tm)пvЕУЪоЙ6&“л† ьКkуя›с VЭнpk‘† $tСg…(›šŒjШ†!œ1ƒнмќ2Ійh%ЯpдIр’ЙQ= yЂ,8E-ЬЧЌuC1PБ‘.-шъKжzЪЧœл­х)Wp(щъ–ЁЙVDŒ–’7нћiщФф3iѓЌ›рБЂ,­šЁТDапь%б'л&šД˜UH–Э<е6StУжцо09Y ”vЭЇ$žtGTш'3СеЬœiRŸљЧ5 kа›ј &О ЪB рqƒi 8KаЯэѕМЄ[Ќv30M(G#jQ‰ЙАУе+‹‘DЗкќСiwЕ8ЪDxїАјІД-w’‘ЪШžз€•fЉ”оŒ,#‡шдд@ЋD+з T'$џ8рT~ r˜jІвЇКЋыуъVеSЭИЁF7Ђ‰Ђ3Ј}0)ф§АtмПЛЦtzQЊ-В)GŒЬq%Aъ­’kЩ Юf3Р)­aC47цБ*ТOХ@Ыrє6ЪОDЫ•wЁ[f›œдЮ§0ЁPЫ0ђђАyLŽэд„WљєЅК лC3mЦЁЮ'эiнžыF”@a$ўќ}уl!M@jЯN‹ћФXI42xL{i$ѕъЎ&sZ*{ЊŠ$ѓnдВу`џў,Зj™ВbEmцWh‡A8ŠЯ™оІїЁг wГ?ѓџŽjпdˆIOђјЕNџє= Š2PЃˆ(-ъŒb• 2O­c–СP_ЯАNT’Оь#џ§ї|ЯџJyі?{Щз~эаЪЛВ‰шЫЉ YЊБУЪб?ЩЕHџќЈЖ@тЫ2N‚ЖiВZžnЯѕVX3]c3ŸЋЫРцІNЖa}YI­І?*кПСO‡иZmbћУЃљк7Пв0Э ›8ЫѕMРЋaфЄN` CŠШrA:ИШ”ИаЁVѓFжH;ЫТˆУцI\•бj†:cA†4ЭU8-” чŠ\ бŸNfЏ“Ь зЃбЈрЬЏёюuЏCЇœЈ=ќЗ0ЧЌћЖЕAЪ“Wq)…лНQЃ–ОФьЕцkC^“—у?ŽьsEА…„Пžh|kBп‡Ил‰xмїЏp“B’вN9YЇПб&Я<ƒ0dz4б1ЦIœЛil-Qiв~Ѓ…>чgщEo5ВЗ›.лЃXЋu=ЯmO6Х ]г˜ŽьыюИ&5'[_?щfм;жЁч6а|ZДОЙ;Ы„Mp љљ“[z•MQЧlˆ!hBOрš-мf сMcЖArј\С`еzц­Іа-kљЭooXtaЖ;*džх›dйЬНўЫ_ёЧ~Y,юџ~п<ЉЏwЉ*дхТѓѕh­іоrШпq}ˆ§ЕqVЃ?ѓ3o*циА˜г{uќюеŸТШЄЖІCѕ ‘унЪ12b$аіVБцъžВБnУ&uП§аoЏЃ‹<лИ:яMегžіДЎfIЇяЊњ—ПєK;rмœыюxЭOќФO"AбRъўўџљїхs\ящEр–ЯњЌџвK-T“TЉМmrежŒXŽМЪFUЯkЇи!Ўˆ5кj!#а)Wuš#—/8›!luчЦ›№ЬVЎrєј=e^6ЕЊ-Ч#zNЦшЄєpчqЧЯCЋѕІт”­fПЗоцwщрЕЭ|7кЕ"§їиј–ѓ!fЃZ+Ъцy>ьr’RZ ЪсuўZьC~ГZqіW>ЕТo[UТ6ВKšКеЎ]7užЬtЋхЖИјc‘cЋцр‡2бi>Žю/(І y Б­&н‡jц Тeh У=])eйвжАФЭžвЦР…Ї{РОб„ F< !ю.ИбХH|nЬД'˜UѓpO›oЅЛpыn6 ]wз\.VЦžє ЌZИе$YЛmg їN)р6ИrLЦ NQ|mЁд з|-OЌкnDЁ)nжкtaЭJˆа_д‹œ/ў јиПє‰њO#OкSТоXPК!…YxЂ,Y§ЩІ|ќЗnZ’ћє‚ѓZАЊ6ЃЗцaг„бeMГ,Ю@ХF0Ÿ`šѕQЙ7Z8Ц /eWэЕѕ2ЫІBЛ?ыЪSдluŽї€Д%‡§?РefЪЪ6t ъ—џJлќjWюю7Œ‘”WТеФЌ^J(щ,4Є™†w ћŽlТqpŠЎЙ%;ФPсHuKrGЩ^Soкє№МЙбЂнeŠн+ŸАJEГaЈ’S<Б46ЊЬьZЇmп:ЩјќњАEиа`yФUl-ю:R6ѓжE\mжЁxš9B ћЈўNЬфиPН a,„у‰ЊКРЋzYxчkьŸk“Т6љ~ ЄЧтw.?:З@Ћ‰ж XБ„fŸ‡MdЌ–h­:_Дeйт#)›`'(-EвI!a5iуБSо!-8ЃЬtaЭXym ЙЖeыК†*6ѓ&…Ÿ•”bžvx-‡i ЂзŽУhMч\V‹мЮ–ЄЉѓ™+‡tPСИи7r—дwУXжр§HШЙхЯъUK$•Љ—ѕ”Њ#1>њI”Д є’NА­ЦыKv †зъ-ЫёYмpaЖPrЩЬДЁ"СjЂИ!<б)>˜Ў“5­ЖЈ-*™$“uOЈєeaK†Eљ{@^“хэіJят}’w‘W‹zЄУFъSv|ЌBЙUлд8&VЙ…W`8F: b‘+ърВ5№jЋЎ:јйИQъТд_эЫа№АГт:D› +–ЊюЬ2`cБx‰ FАMЌ‹ЉЌ–щ=:CUЗoSѓ •юMаЂ9д›S‹•mЇ…Й ЙBцЭШ7мyУМУp1э—ЃM’Ъ":єUіn')ЖŽ.—щГ IПЅ{"бВqoNКР ЊЬM]ч#LY•†XЄ˜vємЃYЮЎ"мСcФ‡˜ХЃŠƒAт… лгПгMБdТ†•z.—goуƒпУЋ:ёx ЂoђХ^њt}gоЃ[ї1lбВZ њMCнaTЂuP€4,U&N5$˜:џUПј‹џ"6žC••цIБzкнаїџxлЯЌa F˜2ч4Œ.6ц(з‘i7k6@ЇЮž‘<>ЫEŸУЫѕэ.}ЖlнVЋ~ю:а–У™jњz@XћgЙУhѓъЇšы |hЎˆј=оfѕ3хŸк„’у‹Ѓz$ˆb~Ÿloц6Wtь`­”•`Ш:ZЄтЅrHЁ€А.Ячнw*9эоwвЯжVKЩуžЂє3ЉNЊБ`dдЩMgŒн`эйї, ”F…žШЋ›CС‚ 3)vJ2КEфЊЏSytљ‰ЖіОUоŒці“Еr ШЮ‹1 йЊЗEŠЙ0Iв”L~kQŒ›4тЖIBRНlъœjmW15Jаё9 ЮQNKM~ž5[dн8]РДГ“Ъ~џЛ;ТУЛ­-фбЧя›Дн(a;Ui eзЯнЊI_НљВЛЊŒ(Qз9… mxвЋ†’ю**ˆЬdF*Z3]Аi^ RegоЊфŸ,ЫТŒŽzЮ‘w u$™ƒЉьЌO[_œ!ЋjšˆЋЅдж7ЪИЫL H'„ n<ЄбЕТмuД0—ч[ ж%wd(>RRбъ1тX )Њ ЉЕЮЎ.ёч^ 6IІђ=k.‹dbПљњ0,дЌй—ЬЂ~рЛŽБЄеЈe}ЂЯkёtTБ—>ю&ГЂ6B‰|шйвЈц<оNCjУ;HUдэc;'ЄЩћv•ЖТŒу8#!kC{}јцžЪйыл56МwWG Xя05(=†JМчAЈ^DД G ЬrsžЌВIщц)œ/œ<Ошzѕџ ­nй‹œSGgˆлsK9г–А›1a6ј›„W$–c;ЄvAЅAЛЉ†,~ПlИ<ўћйXУзЩ“?ђ)Vљ-"‡ќŸтъсR>­ЄM˜е%еГQЋ+WOЙˆJžЯŽz!кМaЗ„šй1qpеb&У`ЈтшЭˆтв:хоКSxы*ЮѕGЫ97ЋЎ ;ьА Ш†8yœ,FЃ%L[I…лCЇ„0ВSU'hБ€Šo˜IS7УЕ“ ^ЦёiSЎЪjрї:ЖЈh5ѕ ->#?kХ:(Ўэ"ОЎ6'АDжMКХIœЕѓ“RUяxв…О™r(d‚I%Ж2шхСFcьeЙ]~MŠЃСдізu&Ч֘Ь1.ѕXt: ьЈИkх­ѕ˜;k*6hЖvVыРю ”ЎD:м VсЂpКьWћr‹cUљр\эstYƒ“/Ћч@›ЫzЄмH х€-^ЂцЙ^)МG'АС#Л%_™C“kїФf’ЗH‹sЌђ–"йж`†TtЉг˜ъ)iCЬЉ zыщm…ЭњЉRТ­ОЮзO4пег7аљl4Ћ-‘nKЪP#Ео уj›ƒаЖ!T™_%sг#$Wи1?кjэЊ2BЂРb§“ђO*7]ыZ_ЌљЭCђWўП_рЌЖжљkыK’#оЎБ9 С‰Ьшv§KЦи; Ч2šс3ЉљхйАFй—‰,дющпш.FюЬ}№Ћ„a #l:+ЗšЦБr3*ЕЌЪdxѓъ9ФЖoKHшVŽWєсŒD)ЮГд FHЉ ЈГнЫљЧQ1ЉвcтdхєQU#ИС„ЁЕ;к4ТbЃЙ•ЭѓRЪбІЩT9лХІo‹… џДuдЎї4D"nЖJˆЊЇa*:Y­ПЭ)г.8[ѕ0ЋшІЂAанФђњ}{ьІmVь‡k№gD?ёЌС$Сœ”WI­ђŠ*M4`іX+A!\гy g‡&Ѓ†ІцЄN2 ЬrNƒб:ЖхAуьrBcЩы\?w[ўS+JkП, XљQсДжйьС#х {m1ƒНЯжЌ Е.ЏцPбe2Š ТНм=`;”гi>N cШ‰ИtР\œшBxцЙ!_ЮŠъ"$‚І>лВ‹bэзweвbhФд-ЭфКiћ„ “Лё4ЗXя’GK@Zq Žл"(ЋnnФ[,ј)ЋЂ‰ ’O)…‚qьє!йŽЭЋ§;! œC*0†БIіФю Хз-ўSџХŸђkЫxО [`їilFЦbЁ•Vь%Q ­l*Y NdжЉ!@–[YЕъC`Š(щfnE2и ƒсь_М8ЂЋКk‹СMb№ЩршмцхœVv„iXдHЌЃћЎВла’UejR4о’Ф­g„lпЙxЫл,ЈтСЬК1Ќ(m™h­Н‹ЃД•ы†2œ<Ќ˜„ yˆеєя™mаHУqЊ,:D4'vNdfvдФУќ ЗлBЉ%›B•ДУСхэќLSЁe5cйЕЮя:qpНБй)Uy~cB–ИkrkžќћВtЫ„xюvЫw3.W#шjПцёЎ/егeaя'Н5йe1ЧcАКAЏš{Kšˆ<ШlŠЮю/ю8ф-лфH wѕN:LїcCpuшЌќ”Ћ‘;§ˆеце{iOЪŠ89 W.Г“ƒЄе-ЃлŒг2Ю} ДATЩ4Д0‡ ѕ{—п3…ЂVљ< 3hАTзk\ъž{ю uQh”Y#u SЊм!е —Яы9]З&кj”Љ‹w*t> o}І)DѕЭp vч™ œ>›м\'+И‚SZЇм†ШёН‘оф;ГšЉІЕxX+)+†.…YялK­Фњ\ёjј“Їˆ< ѓНZlшўX&//ЙЮЛbЏєЮ6 ­Мюe—бx€.6:Еr:!gŒЦк1Jв0ДKбjЂ›ГЌЊЗ`DDŠІƒ:hMУэPF4џЦ…Sп>~˜oСqќgП№ЯЂт /ЧЋДчlІЭ ю љь-УOќЯ?аХ y%иRѕЖК1”œyuжБыМеФЖТETR ;Mlэ8М1ф=їИЧРоРѕBrЧЉЂйЏл…C‘П[щ0O‹рZЙН>dВ–6VгTKђ‡eкыфoГŸS™>–ѓа%ч•яЁ ™в*їИ?ЃцьеС%Œ{ЮПМщMoiDфUЉnV%}Юч~ю@‰^ЖЗНэmц˜1С ўпљx€Веof”œ‡Yi]П ^'ЭќzВx†іuC‡О}ЂFџЮ–”ˆсНй+fKOŽЛ Сў9Сє .Ь_’ZЅ XЕAEзЭ6‡уњг #6 r ;pQZ–pІа™j/ Є1Ќ|З!ќЎі{Й^жm-šqRqЙЮ“юœqиœ26pMй›щ$ІМ‹aѓЫг?пŠ ›qшЈŸт@;lЄ[еР2ь –'l^хТ/v]MЎЫdё.q+ШмЫšVAiИMƒ™ЮЩ"кУбю_NХˆH /РиeŠЁ! 5Ny!30 є›j@:›m–šfznь'§+лэуQм’хА>иНїо+TGШ5†KЖКj1 5X№ДJЃЇќерqI1H€пїXДŸKгЃ}rp„ЮЄЧƒ"†`L0эЛ ‘ŸЅ>€Ё„iFь}еQКL3†зAьфtЭJ–>/+*ќоз+8bFŒLpнaЁ•уlЋОдUЂШЗнСХ T CV ^˜jTГЖ AIвtœ"PЗ€ІХДЩ­ъtmФSRL›GЗъ:—аtWйTе-УД`нRcЂMГђJЩ`h‹ РКAЧР„ы •ЈP1`а„омАS>ŒWБеyшc*Э ѕ”Ї<ѕЌ^.Z$ˆŠІЗ)RЭцкЃVћЉу…\,ˆІњК№0З(К„ѕдяŸdsШH“ямx;БaVпdn;t3EЋЖЛмиpэСЭ(h*/DТ#np‚ЋЊюJ]uц;Эю9‡ОнРЫщ*•ЈМ~хПє—ОМŠЌіЯЁўщџѓO‡ &A—V55‡TЈџёЌ>іc?ЖўС?ј‡ѕюwПЋ ЄвЭк яЕУјІсЧ5јУїqѕџРЈџэя§=гŒ.ж$VшP“ЊбЄNТщ-АWmГэЕБ€ \іp‹ бXOџЈЊЧ?ўёѕŽwМЃоѓоїtьT№мэJ‚ѓ„Жђ ЌL-ЛђGЏњИЧпWOxќ|эДЕе{пћоzпћоWhю‰љ™6Ьс­№Њ | “Ёі0Н`"ы6ІY—с Šaй($P–ЭЪ§-хЖŠ xК‡ЧD:8e_T"ШГішGпеoўцoж§їп_ў№‡ЃшЉJЗ›!JbЦцЏ8tеь­ЙЏб_§ЗПZOњгыююQ чГ<ёФŽ3§tJ‘ аЊ]м}№жЮ<юАЊфюЩŽН|в'}R}Уз§Yў“ЌЯўœЯ)’ѕu_їuѕЎwОЋљЩѕžїМЇўрУѕыя~З}?ѕш{юЉшCђ~ю\ иЈ0ЯШ оjyЬ- 1L*в‹БРњ…_јчѕёџЧŒ2Е…УOV|Fn—нсЇ~ъЇъ3>у3„ТhЇY!ї…qЊ Й2\.Љ(жојсЊЎЁк _ј`}јУПg\Nф!:Lж5"жеТtрЅ&ЇЋŸћЙT?њІ1ˆрЛПћЛmXК%z‹кŸm][”Ј\ЃxJfУ$ ьє;o­Yзяяў _џѕЛV•эF}ћЗ{шNз Т”Ж3)­™ŽжU/zб‹zї&­ЌiИХм5УjёТ>(ѓѕZ=љЩO^ѕ˜{ЦЬktо94Гge‹рЊеqЊЛєЅW–"‹[‹€1јєдЄ№–ќаТf…љФпџDѓ Ф#ъc•ЊЄiяyя{ЋnP(ЋX№ƒ…rьqТ зГуX”‹ю“J!xХйЇЪ чЁzZюЮˆ\ŒШ"S,а‰aЇрVј”ѕ[Й![| Ђ‚`”PўnђDї{ўкяњ.љyЖ9<<+f?ŒгжюŸДЛ?њІ]я§y~№СЅЊХY-ьж;вуzнyЏ4 $‹‚eЮ)ЫЩWƒ„:mUѕжЗОE’Џ.ц7ЧР~№№œ §хЏјЪšЬ[Езц5пљкsЂІ‹SЙ dе7џЕo.VећŠWDєа›о™ IDATŸgЂВz р4‹>јByшžїмчЋъoxУY+ЎЪazwр4n‹юš\Ћѕ™{|fл8”\TељTšЙёЌ?ђЌѕžT.o‹UрщџiБXoћлУ­9тLƒcyмwп}bРA‡dйѕ#ї"‹a_?еXJБѓsz{i†“d}г7Н2КЂѓпф)ЂP/zс .IЧP Fъ|Ма 蘣“фyъЬ.5ВbPЯмФРlкZƒŒЯ нМ†ƒ7[J›ТC§ЋъБї=ЮЋJ”ч`ЏœСNљ№pяp‹Aй`d’аi,hs)††tЄФ•ЁѓІ(Cоr]b#Ѕ[б+&zшa•ЖПрџЙ/މћjsЏцУ2МqOЯЛ ЯŽyэk_ЖxUЭ*њй#фд/‡љƒ2:Ьў-Й’ћЏ/xС_YE=&ийзp3yœ\KВТ•XЦ2‡6=ˆMQБ§7;оЧфТЩу„QeУ_{е7Џ‡-мh–ьэњћз|чkіъUu”ўŒжрlрР!‡Я$ъPЫcї†gЉАЊ>хO|Šœ 4:Шšн-œ І[BJЛЪА%‹,Ј1…HьС\—lЦЅ†Оѓ"›šc9Ј*ЁЊќŒa]žЈЧUљ~­ўd8ЈNуr&О™нA%%мВЎД;ƒOЋЩХу{пћо'Ч)m†KђЄ“бщў ,юДmŠХ6Жѕє,/—б|р&Ѓсh}џЧЗжЇќчŸт' }їfT™'Ћ~пЬj ХŽjш5ЏyM?Н^7 А цЏОтŽљ.X џЛЎжењЎй€œ§ћќб?њG#TН‹еmгощaДtŽ ѓr ›Мэ]чlK:“!zцГžyŠдчвЪрTЄ(ўŠЊЇ<хЉс ]ƒS‡h-d№†pч=Y ТЃЌ• ўюяОПQG ђС Žу!|;3_O:сX*ЕЈ(чbwpfУ%М#Zе`LTEm%ЮŽq(­ЪДmщVњјС.‘Ь™§ћЎGд&aWтhgШДЫюђЪWОвœСlhќЊОъЋž?Аjд@oІsЕщЙ>xb?ЭН‰VmcЃ/ ЊФТJШ›[X$Й'иТ\ЙbЉSжЗ6еќс‚JЉ ‘!дSЋнШЊЯџ‚Я_ емЫЎmGD”ѓ0Н$)eъƒWл+mWћf$„рf˜| щg•›=|c$ +уКыСѕ: {yа”fЄ™fчf|‘ХЊ0Ћ˜фpkRa:=ѓšЮЎд‚дxјГ?ћГђlШїŠЦѓiуёПџ‰ŸX•гБщюшV]9клПщG<ё#lrШ‚Чr‚я­Ўкп3mЫАдg]йY}Ј$шџЬg>гCеdaѕЉv9В>ђ#яwbВЖ–›–ЎД5tЉXИнЈЪХDИћ=Иџў'3 eNяЛ2BМж­шn(@~yZАк9Š1ЋЛ}3­ЋД'‚’ХлјŠ0ЄурШƒ/ПЧQт~џїџРы~ аrї№ЊЊяxѕwx>t`Љ–НЌ…§`шЊzг›~дю3#L;Љcн>їЙЯmђНц›Г*РLI ТO~›&AuM]ЂdлЉчЂФ n^ЈKхaЩ_ŒВ“8ŽЕ2=zв6Шѕн>ѕS?ЕmЩkB;С\6HztЅV?<ЁЬХPFљєЏљ+)zЪЁj'Ui ЯбРэГ2‚“:˜y$%!мЅдЦ/3іїПџƒшvюЉSHЋбб!„eЪ3—A‡лќћГћЫПќoм-R< н:FЁЬ6ьC‡г(]Дс‰A†‰Ї>§г>н`({%0РDIq(WТpUЏЮhђ€d [‡* ›PzП#‡в>№ЗIєщР Љ*л8ƒю„LЩУТ†ЕЋЛP*QмnЈЊІz0ЇфmщuwЅSѓZС-wѕyŸїљзI29,Ѕ­nN™щ‚’сюkОѓ5v"и4юсСЬa ыј?§Їџєиі™?aДР-лƒЙн–хRў…/}Ne*5[–—ШЎ0!pЉЬ+QђвNиц>ВйMФBВv3жg>ѓ™aDП6rХŒЭкџсћў§ћV…`š ФdшAe#ЭЅф‘A.ї4"G‡@Гїш3*R‚”Ў#РЌэzжГž% ‰Мтqm6ѓ?ьюL.8@тšЅико†Чa 1Sќ(“еЪшб5ј  HŠˆЊ№hY+&OЛШ +™•Sе­и чeез~эз†ЛЮ Дш^х6в4)NкW8 гцq•д•ЅЅ9?№дЩ}ХW|yn‚!2ТZx†№p:rьЂ\<нZЯ*ЪЉчЭН0WqД Œj ƒD‹ѕРƒžAЩрчdrЊц@ЬFL8SqЂТrD•kTS:DУсŽсˆАе эSМЈtЯ§Ž§)ЮЇ ЊYrиlM5ЄМ7v–е€  ДeСK‘Ј'=щўu}˜S~u9С­Ф2б7']1`Ъ:%ъ•Б(.сw‘uЙ№,:6гФW@IН‡cˆ ИXVЭHъ Їi2'Xh$b е-ghН&­%Y!)lМюЫšОлlЂX_ўх_.8:MЊw\еЭр}шŽ тEOšgYzоmg ццкФуtЛА:Е:‚ђѓЈ™ЋЌœ•ЃщkНЩ4,лt•b-љPqR4МH0впaf7Ућ0`A~еjё]K*‰OhѕГž­ю…:ˆѕЯN^сcЅwсЄŽ^ѕъp‡1m‡YЈъy.Nw7f`Œf>: Э2ќјЭПўзџjШЂF“Т™o`>sсяљѓKЅVž‹‹ЪЊћћXЃr!rNзŽЎ6gЈыŸ§Gїол0{ZЈPfO#mG|Сi7ђ9љLаAbещпvaUѕИЎЊIъИU˜LŠž”†УuИЁN)‹Р\pP[K]кM 3%jl"А№є™~ѓ›пlТЃ +›эЯѕF_˜4œ.ЋЉB}чwўu™(УЅHЖА8FйЙЦЩів—~]s-9MJ7ЩŠ ‡1žЖ3р&7E‘,Б…iгЄn*Mѓ$Д—5Ъ0цВ з‚йЌGJTdээ/u‚K—jщggŒ u$OлŸ№„Г}šЕ…EiB'šA+ъМЙРEХЩmDе)ш†А`ИšЃќК2ЂЊъЇњЇeb/•žёужwйіD3к„јњVoyЫ›ЛЉІv3`п$J%žД{џ†7О!(Xl˜тт^Ўы п)дѕ-пђ->љedz#ј›жЪvїЂЕF.Ђ’ЁЉ]ˆDжUlЋ€К3З"ќХ(=~uМЌjK!ѕA21ŠЩ]b`Э™ил3ъDЕвНфЂш UnЁЮИ-<%—уf Ѕ‡Р_;}Ь<‡ƒС_гЪяƒ&ЉO‚+‡8юЧfCA9Ч;nl17ЋрѕDЌj‘ˆNЅёЊ‹K5 ˆЌЗЩКШPЖD4Т™З+mUƒ‡тˆ§q"ј[;›‘'Аъ•€•‘ХбюшЊ= ЏьAŽ:sё–Б–Лq`Йжвсј.t]/хh™3‹`х`бŠЄКlЙnУhс2pWs„ЙpпФс sпнˆElyЖцйжVаjAЭ~Нbј1Ы) NC‰^ГИmrн&IŒHH4.šЗсТп^‘;УL U/xС Ќ:E#/ ’ЈbГ8bKШDЈ*AGќ MJƒYt­Ќ“XЉЊ`Ђ  ]‚lєAНВШTЦЉ zђkР15GŒЁШb™*KxнŒЮC(}{НрSe•yh!bў|УѓЩ пЁуїъ3?ѓ3g#1ХрŽЬИ!6SнK`ИЫЏqY™2UЂ[§ч8Гc?>4нЏлfо™uzZоИЃcpВY%ж†Ў<кrvлsžѓЅДГюЯ6х5и •Žцьїe*Лв†œ CЖCЖ~§вNЌЄЈ s‚,QўњыЇ}њЇЅf%•лшrШP3вуc~ЭK^ьуъёDшмРc?ŽG“ЫЊЫЩзЂIвЪ€ю#Яa;&–ЉUS™оМ‚Mѓk7АZ+кWж3žё ‡ЅУbЩЌфe)яrvЧ§ИћзKЂШошмИŠ !ž<†\MЙdЄњŒRpт4npЇ9ŸцЅбeЫzЁн“Sн"&геEћ{ДiСPЋХОоћч|й—…Ž~?№/бЋSОЫ0Јœ0kV,|Ј^љЊWЦЋPђЙBnЌhУФ}'rЖ…ўˆ`ЎŠљ!ѓЮn˜Ѕ?Zњp‚!%‹„Е§ оєІ7u7“рЖиь8VEw ‘MсПњМЯ“Љ{4&/Й`>‡>б6ЖДћrоЂžоК-xhQљD˜­ы…ЬЊ@W"ЬœђAfœЎ‚ФVFkyn№j№*пф™ Z Kѓ3crЧjƒhЋТЕ пsџфXЂбeи>VўJмхbќЦoќ†џК03љO xРУНJuЫЅ*$вzMœ}ѓ<н˜Ъх}%Я™w%№m~Ъ†6uаZЛoxуLkНиџыА’EЇ э№ь–sbп•ЏЭ€,яlЉ*ФўЪш8a:іЛWяwЏ6 йƒлЉ_ъˆzNBшњRCјX›tд…“&сŽг­ь=1: WЊ†ѓ•qЇМХ•`c yg{ŸŠр ЃїJ0 TУИ\elV[ЈЙћд/s’‡іЈROьЮ@Нƒ2д )Ѓі •!КГпл„Жšg”˜Р–ы€ЩѓоrвиRом№и0чШ—д)KлSš%;Й”Јйсh z’CQYЬ)oЎіR•ЦЫ­Ц(ЈШ^††СkЗNч–кPŽssМIzQѓ ьЖjіTŒ2/Ž0‚ guˆfт!žеœ kˆv=†!—aЈZCVЕтw•1wъ,;„2“бђ*ŽТЄ6”a JФL‚'ЋъљЯ{~ЁЊОїѕплN–Ж|ŠсИфШL\mscНъЏНЊдK_њuuЯЃнe.10ЉЈМ,аЩBsй§ћўсПSъKОфй'2А*†й‹Гн•`WцЏЧ!ПVqGЎ|YЅњЭК#pІуНтyMКHж;пѕЎЊžідЇе‡>ќЁІ‰ЖŠ?y+'яЈžуКчžG—К §юяќЎЯ\™жњ,€žю‰ž6Іт!ˆМшїу$6GrЉеJ2ЋЩЊzлЯМmЈX—чršІЃgЕ(Fo~Ы›ЫьЃuxHК/о&ЦЁtюЄАУYњњП—Мф%…ЊzУпX§цCГ}л(сеѓ /Ff9а8жЫыПїѕT=яyЯ;џ=‚6фdЋEё;S#Ѕнш{Y˜“QV;О‘H E™ц•цчFoЧШЊч?яЙч†њW^№‚uRГІб‰р\™xеэ„ŠUoyѓ[ЯЯћџнwtв(d }ю™Иiue7`Пиџђџ§—чТњЅ_њW‹ˆ|а:ВЉ НЇІю!4” ЈїM№œЌŒїУdЙ—ЊCЎПlkу“k{Q-ѕY=ЌX…wМѓvpк0 N=ЩаŒДЖ6ВЙ^чурвƒіБ}l=ц19Џн… ­tЅ›”EJі коіђЌКe‘ЅсF$нRŒWІЎŒNр˜ѕЖЧћї8­LJœEЏ \Q”F#Цb88yъК@ДЦ cБ^њв—žЏємЏќJoЯГ:гЭkrЫœ™СURzгђ"e}лЗ~ыIЬны^з№чT%Œ€ѕ Gš- Ок#xZ`;fЦ$NО${їЧ>^юW>Зžџќч‰B=№Рѕе~u§иџєcВоU> ХЁмV\ю•Џ|e§тПјХ:дЈЊo§жo=лp›Zб‡5їпџВцо†чеW5V.иyh?єC?\?џѓ?^Ќќџq§ш›~TФЊYƒYћнhzн_ўŒXФVвU0Ж!@#)˜–id58kсњїя|ч;ыяzЇ`Јїя~ггЭ*ЌЮіgуq{МQBфОЂл†zдіЈzдЃU~є3љХВьбїмSќуEЏъОŒ1‡jЎт4:ŒЎ№У)‘c8ž7qПЧG8 Ъb9t/БNізћ3цЯƒ†хХдœНщЄJЊс›8`Dбѓ}™trVНфХ_S—ЫХЂОсО~UmтjаЋЖmЋШЋм?;ГUэ ŽјНпћНѕФ'<сФФ}Я=ѕЦ7О1ђ—ЅњщфГŸ§l•и.МЙ†4lr+œbк—дупќнљЛžSš+G0ЄхfлYл(дO§дџю29Е_§эЏ6|Шё)–ИІЈбдЗ}ћЋ[Ќ"rЂъй_ќь5Xи"[ф_—цЧ№^ѓ€5†ЅёX\›г6V|pСЖ№ж:щ.šY дЧ|є3Њ‰ˆ/м+иj:ФдC=4№Ь|Иј№‡іˆдS[юёЌ€њTzЖ !\Tньёьh+*˜н`Аa4Ђ–xРii’њфOўфŽUй`K6хюQ ЄэЧ03фEКїЬ }iа8Нў9xПЏ§ы‹fsес-ђ"Q/{й7њЯѕ‚щНьe/3И0”ыГ7ГіСeЈ‘tJяЄъЇ`v:€J Д­Ѕ!$*j %S;Т)х8OL`ЕкyюsŸn0‚?tДQvAšКd ^ѕЊWvY™A8ЇhЫ.X 4Э;,пOf…8КДєиФ[є{!ЩHB10ЃrIЯA*їLZAŒеD8ŸŒsлољЮw­ŠАЯ‰Ё8їNтZЃТиѕаAcЋ&7Та"Ыњ‰O|BПЊa}цЯšO~+YшѓŸэŽ$*ZјO[Œеdk`rєЪмЩuPB›lТБgUР%—D†РDV6œdސšщ%/љч‰Š• ƒFЖ”(pž-Ь^Ї+vLНХ3Яz%К-l№s ТЛG!XЉ}яЊКCњ(;‡J­мЛx(Єй|ёœ”ыyБ'щWЬ^ќт‘‰”IW–оe˜K UнЖHЇZeNЗъЭBsЅ LГРЊўсџAr&TSЬzы[пZ_єE_T™А'фpъ% 7МнЮ)АKю*CyАЇлL›ј†ЂХ› Ћ†єpHІ;}ХiŠф$яы"КяОћъž{s YŠjХšmЦ EлiКкР_љх_ёXF†iџёOјућbп,p36эџпї;џОџИћJ“жќўГЁUsЯНїм[|јс†яN4/Fк„sŽо*7и[WJ0CZƒ‰cL(nކIzЇМПљњПЙЎ.6{>№џV§ЅПјgJŒth-є Ї#4‚]–)aЮЛt€mzІŒ`Г2&љAБCЇ ПЕm-I2Œ …#xFЩq’=ќ№‡#Ÿ3KŒ†r‰ЖYIЄŽ#ЫA•В‘е€й„Ёmšћѓї€ s–œn2u‹s5Ѕ‡EѓhcзyНj:1ЈКЛЛыJЁ61ђ-*єЯJњР>PПёПQПіko˜ —t0лLЪ‘ў?FЎ/НЛЉZЦ‰uftlјФtЋўяŸџyiџhзeэmЎђ`˜ƒ;и§ŠЁ§.8H§4=§Б..лfšj•ЮЊžјћџ4эёъƒи˜]к-Zb^КЮ›(SnLXяqw~шNЖђђ Ѓ] ЖP$ЕŠo5)]˜іМч?Џ)rУѓдЎЁEG|ђ™q™ЇЅС>yќюяўЎJW_єlr?•b)yй€у4- œ••№pŒxK‚€ypOЏ2‰яќsкІb›hNъШˆiŒЏЪ’ьжИЮћ{шЗъX0CN…9€Ia~№ƒ}Ш•ищ…]3*'ЖEImŠБКХлiМPЈљъF&’Ѕы6Ј уN ЅкёoОшПўЂEV7ьƒ$BяЩ,`М1"ъ””B‡Wb|{X†%oњpRГˆЦC%ъЏўъЦЧ-ГюЇYШ&L\kœn7„tй9ЭЦ@y\C]jйИ­фЊмјp_ Йв=џЯрRЮ & FрL;$ч!ш@NЧЇ“œАCv5Er ПёПбљI:™<Є‹‡Эs< qЖЙнм5—:kћ\D^д2ИЖєAъžЊ3дhƒ_h&C=ЯAюDq Еdh ї ш#Ÿ|г>ŸY­Џђ‘•GˆTЯž~—еЦшиќ,G™]e$(+d—BZЇ[ŸmP6Цњ|Ј№щ;ІЉ{~objЭмЭ"ŒЂзЌщ†G ъƒ?|еЧlЁ# фgђNІ'Ё?_†ЋЬю|Э‹AWЧ+ПњепQ#САЧjTЙrn.ђTУrRђ Жњ4hвФЩАƒ{Ьz‹Ѓ–оЎЖ}%Сшщ–a+I{0OРFнVѓI_Ъ=уСЬ‰M/C”!ЎИС:з`qо`­7~@АШ-S•с”ЭыƒЬйЋ*3U[5ЄƒЧ1„іўr:эЎ69‚Œ†<нлєйŽЈdZйŠ;q­dѓo‹l†š"ŸV=ќ№‡l(saPц^\A_jд—ђў—@mD8)ыцВF— ф+БxКfђін нЕF;н!„тєfл‚/Й„Xќ•GFFKЛг! кПN‹z†eОў]Њ†tЪ=FГЁ‚;‰*\Ц|р}ЂY#ЭŽОšp.яёмп…ТЇ%7UДšпq.ЬЭ_œMЪж”ёвAc 7їpъšZ=“ЙЅЙЛ˜6Т/Љ”уe6л2ОєIцAњF5їпˆUьэћNŠОФРыдtђhdїYћхјЦТё˜H„`ŒƒPI+=MзЅp`ъEy\žеDЏhІЌ]щsЖ’—Љ•vњСВ•КX+ИТЁtЕ6Л  Н­Aф х8œдх8;ŸЌ†ЭЁgWю@ЏхeЄ\PіPЬ іXЯѓEлPћМAЅ’•}ж“UмA~ЧP}6ŸЖг~яR}єъѕоvjХ7;O‘JЫоі§х*…›ъЏ§^„йиBМLB‡ЁЊzЌŸЙCiД L№ [М›UЂKЕжТ“@h9=.хљ ^Ў>u ЗЪ6 [ЕОТU5к&Ич03-Гєbс”ЎЩ оєz›жƒДgЧ•сR9бжЋК очГ•‰–Y4ЖњŒ…ћйр=о4'їз?онgŽv\­ЙLкІиОЩŒ‹ @ŒвkŽъюиББ•жcюНЗв‘({ j%>рИФѕћЕЗП=ш.eц лќ•]ЋЏ&'FЕзЊ™P@Yя„c{ъКEШ€0с˜цЖљ_І;ѓxєЉ€„‡Lш;ш``Ђ;RННxšв<і;ˆЭА1ЊЌыєfЌЬїац52ЏvzЕjГ›_ЌŸAfW3n$н<р\Q[UŒŒVXћЅ5зБaї№эфЧq0_DзЉŠмŒ0ь2Ж2~ГRVjJ<˜Љу†Ф(ВM8бb8ZTMi}}е[$:ВжИъ/>Wш{kѓCЂХђі …™п[сzš U`"вы}Щ$ИјЊ~тЧм№KhKoж (% \вБP?§3?ЙŽЧёœћHGіdgС тЪdЎсКВoЪIЉXetо yF­mЇgѕ”Gj‡б\ЄЊљNŠ)+\)yŠ-с1[pъ:ŠN,)U[™ъJ‡h-ЪЭ&KЋ†GЈсjHЭzR…л}™E›шU w3I“ЮпЛќо˜цІзЗ%– Б’…U=Х<ѕˆС“L]ЈU ӘEмŒbbVMžг‚бё8іMЕI"р§їп/3L;БŒЩlпwМѕіLи­­}rѓя^З9ЯM(Г№@wyЙЦpXЌ,жŸџ оўВ!КZk8ЬNЭRщ}žЁd ўЁКpŸ%™Hg€S@MАаеE№^Ц!~h{п§OКПwPcbЃ<рА9У™82AрД…œ.СИ’Gо(‚П…Ў"зppzЎ§;оёk50Ј\Ÿ',ЪЬЈЃ…OЄтєъЁIеШšсЯ…№€ЃгoNїъ§Чпђ–Зк4ГЬqћњљџсЯў_ж&TЋ˜eVЭADxЬЁт•l™Ÿд–bŸQLОr-yMŒDXNpКrs%œ­ЊѕњылпўvKЄyа‰S1ЊЩИмƒ58e…ЌЪA{6{-7—eЇKАаc{Ÿ Юу‘>љОФЎіђЁТ ~јCЭ+ђмkлЮ К V IDATbЭ2IЗІ‹}я2IgђAЪЎЯМ`х0jЕТєpА|}П‹VЎЌњЖoћЖ0OH‡ЄЊљ‘Бндщг(3BЌЏЊ‘ЏЁЬdf*•…`УYрКRх)\„Ь§ППљ›ПХЙ‡R˜S аFDC+•(ЉFЊ 5№МЮАKі”­pfn <‹лъЊъЁ‡Š*дwюи*šТ"хкnзe‹›>Э;д6™“аŸ У 2ѕUpИє:F`zLHфpc5„~'сg85žПa1‘\щ№УІ89ЭWeЁАс) ­€j–Ты“>ёЫЭУN ѕВїВШOš~6ЙБ‹tЬиzGѓ\вэ4WYq0.Œ5(ХB]l§ќегцЎъKОшB99€@#рƒ‘ќ&ђA $‚cpWŒMЙ!ЎЮ*cЯ.xщRg†Ы‚98Џ†–Кzz/Уы‘јаFfЕЧ LŠ0НiЭ‹/цL2vu#Ÿр{…ŸЪ`'Ž1“шwŒhЋ ЃaШы(fЁЋ2:љjш6юКУЂм uЕu>чрUЄюТ7ЌЅШЃЊЊ"Ѕ;рТ")if {•сm]N‚ЋПnнv 2ѕR€œjuц>Ÿ`яd\Ў,jЊ‹цЂ7KЉОXŒ'„Й…‡yaТ(ЫЛ6хžVФЊКUчŠ-Р™"ИІр`О лfнo.Š ЂЯэі?PмQH˜#-яlрAcnGж–•rЇДД$ТŽubфкpТCFЈх7єЎ0 №ФјQb%ЇРЖщ{$aŠЫОЪuЗaєjDm}рРЭ4У€XюЃ„л њ…jIЯдѓzбиr}BF3h }`ƒ4W‘тЖЋVV5к“w§qMLњ№MЅ†яџРћ—|•|еяus'wЮyqє ЋN.k#;/5SP­Љђ1єљ_~ђ'НJBE"Zkшv|ЛПѕЗџvMRSЧ„JАш3ŠhыЋƒ'ПЮЇвˆ=ЛЇМt@pU#ŸчrжЖ—pŠ˜aкИ{vеЮŠ53Šі "4kцay™K`ю”VРZб‰W…tпиЮdДs-і^ЇЬЈфS ƒЦ)ЖЏ†мииюf{Ђ+№{щFzљЖUr[)VzсrС=" OzHOсSƒЯM6еЮн+qYFуXzkІќ5TyЪ‰пт/*–CЃFp`ЖCЯІѕзWƒол“&ДМш.г”эˆе љТ}–ѓ\‘‘кѕ8Ан@…ХУНp04зАZЕю…^œŒ<†_ћєАљ о Ъa]іuАЏыK™›PUc5уЦf%эˆБžЎ›­š];л/L Х` id‡Ке62*Ж†„CŸž{чЪйКSIM“Дыџ}Цg|F4омЉ!ŠХp—ѓш>Жq/гGV‹НЫ™˜АGT{ЋУ%Њ`чЕaMjYйЉЗ:a#ИˆЉucC@aёЃ^~-Р>r‰МaИтœјfњŒ6ŒN•2[}А&­‚йгgХ^e0yœPКЌ€мьФ^Јлr|†УL MЕЄД$пCЊ6i4…єŠЫr"аЭaѕь/љ’pЧЩXа !чHљIк*%їАЎ)[Јг^=œЧМэQ3ф Œ№JЖs˜:Є§6"Жх †x u&LД{І0ї„:л†ЁAz§[ЉкUUŸњЉŸКВ{AЋjрё?ћgџьШŸ*Bk Pщl[Eށ iгXvЯAŸЇвCКŠ'kTŠ*яД/Г—E$^єŠIЇВZ˜‘ž™k›‹кZЉ9r?І‡ЂOH/%–OЪ&ЁУЮ!DGš†_UѕЁ‡vgœB уЭРЁˆЁи?уѓПъЋ"m%џћАыв?лENвдсзФд!Œ<[GcSшрю7њwRU„Р_џ№'ђ­TvAГwХ]Ч|Yчz:_ЕЌС0Wc„hСˆ‰”ЛizЙЛЧУ„ЌП^Œ-GІRбХŽСŒ“†i\<в’+m>ѕЮˆXтќЄ“Уцx„‰~яccИ‹Нз'шŸЗФс™?йUnБш:ј81NJ n‡ ZфЇZ 9O,ёЭДRswмnRЛмЇ]-FВd=х)OЉЇў'O­Ї=эiѕQѕQѕQOzl-4Jж‰+m%юФIm‰i6rЬѓњбё‹%pYœйгš=бЬё#ЧЊ f„’3 €/Љ6]АФннЬ{pкЋYМkЇz…Э‹ž4Ч8a’ВбaшВ2Ww sуХ/ўšdB_ŸoЩД~Уо`•(#БЕЭН…3Лщ†ркшŽŽ|есRгOчЪU mˆ }кКуg:-Жпoе#%/С@—VЃх^Xoфl™гnСю8ДњY–M‘ЧЉ›Ѕ5КšЅбQтЇУK…МдL^йПЎпЛ­"OXq1hзЗІ€:Qž\jˆWœZпГ’А JЬ‰р–њЏ>њ?ћhЁќш„“{t#ЪоЈW*=№ЦsуКФВbš9,гЖ`Ř4_иœ„дБкЕЂеsДoиИx"Ыqф]’‘ŒPђІ№с`dq 7є@c ,Œ0МРZкЉлЕ"‹BaˆЇDс'нs…ЦКА§žIЦБбm%Tf,ѕYжnXdшr@О šђt2ъƒEе• šЃ]™+’чBЙ8‹JR™ЧLЫЊ0,СИrВqa№э‚—ќ;ИТ]ЈWhЌЕhqksО_<дQH%Х‡бHOѕcUкLУмшЉ‰GEhšъiШСОhћ  \=є“ы}њИ?ќqѕ;яџсYКЩfв_д%Кc^žкЪe‹ eфС8šЊP"и;>Œ№$ЅЈ\зк€FМЇ'фDь€/'&&9егЭšнЋ+MqF[Э@„r1гўŽkдТkтZм•ŽѕЩKу„љЗ~e)aŽnьюHлЪmВЯ”А–6ьЌy5енd œyЇєОЇMЋ*c !m%;eQЎЇтk^ѓ‘ž‰+tт—ЊD€O›  Ч23эрqP<Й}ЙбЇIiЇŽ ЃP ЉифЉЈ-Ќqуш^rЪ‰;Љ гVBѓUEџЮПџгЂ+ƒТЕВФyЈm={Wo^zLЕмŒUЩџіoџжШЯќЗПњЋM„™N.€^Uѕ Ÿ№ } ДЉл ТЕК†iќъ$hњЗU "В}йд9щ:ћœФаC‹ЭEљXJ`/|/*•JxƒЌoњІoВч_?пf!ё№сŸъ­…‹(ђ:Й$c2 ,Я*šЉR•ыŠ2З–ЋD+Š-HŠ—ZFюэц‰ЕћЙйТ –VE„рў­q9ФѕЖ$Пе .SњSї H5†ЈКё"šьnјN {ђљŽDЭ<еЦ~HBMКž,H Џ8ђд.Hžеэџ_иЗХl›Vх­ыž/)XE-žЋŒPSL cЉ‰Иы‘Д•(ИЉ­n **4тІТЖ&6ŽŠФ-hЊm‰Z‚t0бhф jѕ„F{d@FЫЗz№НЯsЏkѓќŽ ШЬ?пїОЯsoжКжЕyюsŸыэФСXDГ~‚*в 74Х\ZRš™]JЈЙ2‰{гЈHЦ~4$}Ж‰)F…yM Ў~Iў›cЕжƒј~ѕ”ŒэЕѓ5_ѓ5в1€6FЙšцЅуТ2юЃЎлqЋџ§Яџ|ЦЬŒ 9XšC-НЗџMэчЄ )ЄpfїДШЏѓ<,㘹 Mжбюћ;VХк”X5DЫ‰fгKvsДѕПџћПO є–бмs0RW§р[~ШYоЗхЫОќхѕЦ7Оq”бlўљдO§дсХ2вл™пќЭпЬ›FкЖBе+^ёŠњчџьŸ3нчHД“8џјџ˜™ђmkІКЊОф‹П„дhдЫ^њR›рБ ЧgвЈ•‘ШеMg:sЈёjw кІ xpe–с}ЋнNU=іиcE–към>пЧўъcдf‰­юЖтŸЂqАЊ†vЎПOќФOЌъЄP СŽђЌyИЩ•Fѕвк№ƒѓ% ‚ƒO>швgЉPЭщ^?ьЖШЂ‡™ш0$˜єы^їэч—˜—ЦёПє)UЌ%—фaаёњзПžс#т{>№;пќІ7зПќж%ѕСк™№Fш`“3YrUџ“ЏўjŠVеЫПьЫЪЋ‘bЗёюzїЯ§мhyot/lъп^KZ(JUкжPм…bМ MА<^ьДЇю™П;ЂЧ’ќОяџОњМЯ{Би§$Аh'ў2nкoњІoЊoxѕ7XWёЪWОВ^љЕ_[w=fеCIеxќЋПћЛП+Dл2ћєcЁўЃ/ўтГм~й/ЛНр{т}ЭžћС?~ў &кЁE)п„нkЈ•ѓл@€jл$љќ˜K.ЗУфЏџцoъЏŸyІ>іЬЧ@…ћтCN(8+е[u?dСуR§пњgчя{ц™ея§ояі­$ŽR$№ ЏО­LіКІЋ1АŠ =ѓФэH:ІэьЩя#я!ымЂКЅT!йЯ@:Кћ$Iш1ѓlљЎ§]ѕпљ]&zЭЗ}[}ыЗ~k§љŸџy˜&п™Xщ8ўglƒ§ѓОъ+Пъќw_ўђ/ЇЎІЭ”wc­Ÿљ™ŸЙ9ш‘Ќ]uЧ‹НbPQSЉzѓы˜Fё`“Ь<ЄPmКз7ПљЭѕыПўыѕIŸєIѕ’—МЄњОЯчусЪ<€с_ш=?ЯЋ^ѕЊzъЉЇъыОюыXЮSгїWd&ЫAѓ6IY“Kш™ЈжUO<ё2š“/НцKЎЇSпžАzPУЊˆH|ѓШыжDMЇпѓўфо‹Эд”І(ЦюZ@§Эџћx ПїaG ц;%щ›ЯNzЮŸќЩŸдч|Ючд§Џ?jHл\@+ЧэS 3• ”ј6Бœ{Cе <›УNl?ЌњТБ9’Ъ14ШЄ—ЇЬь#Й[юMчœ‘ЙЎ‰нqЏ]CлГ§іяјŽzђ­o­зМюЕr—ЂюяUЧ=…]Р2hPё?:ЦˆКдѕпјѕйŸ§9EбЋGPW‹­зˆХ1 nTЏнeнБр`r„@rš'j•ѓ1Ѕ[‰]JІn“Н<ёEOь[\­œ!>аЭЈбЎ'‰Yез§з?Ta4!U'Œ55ЎАшС-G67z1­•^4 9Ђj !ШTюY€Яце†šТТq}­Б Ќї= ?ОЧЧ?ўё‘Ъ†бІ2!птЭ/•C{ЊъўС№Свmј'ЛдєШџz Т’zCШО8Ѕœ2Вж_ь|дs–ЌЃдX‘“­ыЇ-~рм)Ж’ш>Ѓn[`cŽГх- KwШЭЅВжoCІ#œEњќФsВН ч}є№G>ќ>\ў№‡EaVЅцѓ”q,†„ъ’ЕнguœПьНhzgCк6``ПЎЖ|„ЁXi ‡IrІб<6kлрЗУХя6JM|0v,aЇŒx"№љ™ОвЇYBлІвUх › nžšmцI žЊS™єоўст›D+ЉV…ы ГŸР_” %УьJ9ЉlњdФ*‚§F™•}\3Е віё,98|~М@Ž$LW1lyHњаŽFVs1СЕ]yBr ^§ЊWUЭu53žOчцІVј00f[пI[*.":фїЬIэФўЇŸzП ц|pУсt6KДžA<I)%2ијуЖ>Mы?ЂA甇(ьеЊu0)‹УguіэЏ{>ьуC‘‡Ђ”ƒ‹+FП§эoЛœмžЪ!:к56гtПРуд!)нAЃ™ТtHЋs,Мћ ™=66$pМ)sИЩ%AОX Іt PѓR‡щШm=4˜]H§dм6љТh‰žХHГЙn9–о#ЧљЧ~ьЧЮіЛЋƒNšЧp]9>з}’mО§ЄЌ€"-/0ЏžЊЮьХDД\'-К[ЪіОЩfe4Ц=ѓ}Ћ>DО­юŒ€^ђУ_Пё›Пqо/=УЉл)=[Жn‡Ќ ERUKxQ‘Omсh=ЯƒџЬO’TИ#g[л}|УћRу‰т\хљя№…ы @u™F7БКѕъ$иВHDщСІЇb{TЧk:є…{ШIЉщr В Wњи3Я8ž7cƒЛuOUјE…BпБЅтъњДМ@ы99(‚іZ4Ю“lпЭ™ЕsbывЦ“<­ШДтО-ЦuК§Q79XŒДЕiHyд­ксО8ПѓЄрТ‚!CеTДћСѓЛmъd9ж*7pc–ИХ”е8šЅЪБQ5r6uЯh qA f g№ŒNr%qjm"0-6Ѕ„ H˜#ё!ППU†-ЮП˜к9˜Sл„Kнv7ѕcL„%лєaФ š iЦЌЦЄœ‹| ZЫikЮRœCgvQЏ9Џвl‡ЃJЧ№6а8KцžOƒL)P–лл gR@Ц‚LBЅrНН‡ћrydЉяш9I)gHVUp‘wЛЋЙ–РЇЂсЪє(ыЉfsYuБwО-эЅCEхиM–С‚XtdџЪV+Ќ™&8T?DљPЂЛ‡ZкЂЖЧ­“vrŽ(‚4а>мcўlт ЅКSІРЊ&€:^ЗMWзdЬjм(Ѓx›fKGжW„``‘ЙАhчqwqв\™DjюљwЂxт –<™Х§ј§‡ ю§§aлxgЃйњЩёЛ~эHЃŒ™EлХdьэТФЏ:pOOƒ ’МЁЊ˜Ю=Ш*FпJdS-`pёАЅ#ЛаЦудpbŸно’G“YЁАХX з‰N2ЊBДКŒЇяr blЕ‡0Ѓf‚Ю&+7%"ŠI*npЙ(AFйћЙ|бOШ;мf=`НЌ;kV`yžЭ”“nј!N`Т6vИŠсk‡–|Џ{q+"FKёЂЗж’гrV:ЅVз>№й‹Э‚‡щЗчISDЧo} С69oxУЈВk-O+ьŒр™‰w@œ™ЇKєќ…_ ŒК+ЯЈ/И}tП/ЮSr1N%WнƒƒT  EЭ=‡nwMЧfuЪЖ{рЖАж;MХLK—’Т!миюёŸѓœчŽTazђтJЁXЊа^‘@=єМB6cбё_єЙ/к@њПŒ.Г!РiщХР§Жљыa№Ъ,LтЙ!PEoНe›CЯУŸ{с ?‹дUd^ цЪьбщ•іфaT—Щ2mVњ?ђЃ?2ж2Š7aѓФЙФъЋ|zyњЂ‡ЕтОы>шv№=Ќ“іб—EЂђsнзШіiФШ:раaАЈЛ}Њ ДuхЋfEBЂ2мкOЙнlА0ё ЎеэЯ§пПј‹k.бi!цчэ•.D‹‹xТ;зХNх4zјO?§tYWчA.n"4уЕ'Ы~œ[jNHK‹ЊaюЙQ]љ—iЯЁђ›И ]@`Ÿ{tшЮЭввЌvб‰oљf‘ŽїЌЌQTнсц ٘іш:m !дITœѓщИ2IЋ’šЖЭBAx/,uKзqЋ1/ЊОћЛПч"cчX=‹жћ{ЩVО GŽbЈ;ЈУкДьЇЄ‡Д#-цї!чševеЏќЪЏИ>МFjeЭHZyЎ˜V§ gœу‹/j—DЕрT}ov=Njgn?ь{Пї{ ?rІyГ‡џэснЯЩЁlњ}@§фOўƘJœƒBеЈijчя\|uећўлћдœ—к0ЕC:7ъЄЂU/и5ZГ>рŠ!ш†XгЃ >~гdьЮ>дЈш}3­ъяљПŸф0lЭg=к~ФjИ›ъ^јТПwк'F[nЦАе&ї7‰”Дћ№Љѕ,е({ysЩ|‚HЯ-$“Xи$ъ а+NGSjАгpй IDATП”АM`^dnш00'WnŠx`ˆЇ ѕoєG7MŠьх; zv ]лнh`к“{<‰т‡Ž§$q{„ЭЪГЇєe™дј­пкY<Чя^K„˜*W˜WšН Ъ“оdcJрАцUTHAЃƒъ~м–џ7оџ н,хЭ!ы§'‰л‚Ѕ%гЃфžќ/Egњd˜7oВг9кžЇŸў „!Е9п$ofђjіN!”š‡e‰оєЛ`ю"маHYгчА‰iZdвLžрФvgV†С$хэo?іиcяЉI'@0›Dїsѓ0ѓр(Ы'й‹ Чƒ‹JЙšzЩNВ/Xs/іQЧтЌыvиfќo,ЉАOюЛ*еdI`{‹Rb.)Фh’y‰ЉHYуTƒ №FCђWѕ?п†mАЮjЊК8€jXбFєФ Y5ВjI‹ˆбРtk=6чbBш‰E1˜^UѕЬ3ЯИXŽњ>ЊЫ>$xrЫM}$ФЛ‹œ[XA”ьQКœ7ъэoНїНП\ъЙ<3E–Г;fpа4dђ}ЖЄW“і~… '@Р{Ж W€ЙЪSyžэš‡€XKCъ%АA‡ЖшЄg”S7цЁџiŸњЉЕ=y!4дГŸ§lŸьNx€кІyxVДУw_sЩPсЎ–АЃ)s›иœШFІш чт\н‘Q*$нљzЗИРэєэЎЇя}Z< Ћо.?Љ'5Gu&š˜lПяwПћнмЗ­ЁTKntDwИ(Ud’ŒЫ, {{ЎХЩVpNНi˜іpЇG™ЊlЕ№[ођ–њ7}?“ƒkьœіЉˆј,БлЌњАUU=ѕдSѕгO=%RЃпЫ+hVПч?НЇоћо_2Јƒ8+:iLRt]‡TŠ№ƒO&žžє5+ЗђVlraэюnљR‡†хдym5џ"зU­ѕX=vЗ‚Г Ћ0юeУcHдžџќчзѓ?ѕSїЛ[k8NяЕє‚|“ЌЩWo;Dww=ўјуg~д~Ѓїж"Zd*x@`a(ЧхІБ-ЪІЗ,%н-žЭЛš-Щ{гs^ѓšзl<§žzыrІwкВKНbНэйЗНѕmѕф“ocЎЖиhQь№pт]яzWНћ]?'4сsЩ`Š1ъІЫъзўы!ІЧєЁzч;оa`№YЦK,ЦёG~і]?[њg*r­0ќИ§ОпќЁђ{Я{ь5нX‡ш‡ПоџўїзG?њQЦ›$ИѕСпљ*ŠѓЋaЁцŽЭэ7F Ч0иK>{qZb7ЩК_ЌЗoМу?ыYЯЊ~жgктjц‘M ѕ Ÿ№ЌzўѓžWŸђќчѕD“+ яџуйЯyNНјХ/о„јсr<ЌЧœЇтЧ†„шСяЫ]WЂ+ЖфЋ”‚”Ѕ–™VѕŸўщe›уЅпя‡ѕъoxЕНSHЈјŽЄ\lћqьЊя{уЗО{мо}fyм†gPiюv}}ч;оQЏ}эkй•gЮэD|№)Яћ”њйŸ§™zзЯНKђkјSUнз—d’ѓОїНЯMKN#Ў'піж‡ъЬЫсžЊ№тЯ{qŸ8š‚”T*у&Ф6’TОвŒгHТщŽлfUНсѕп-­5+6оўф“„Еh`гОб‡ƒЯŒ  ўщ+^!J{:щ—~I€lp†Р1m‘~п5+У/ќТ/ЄVОoДЦ0!‘›ЈѕH<Е”П Е!ѓ‚ЦіxэЭ:LъІ§7рЯkеfЦCёЎ%:oярGўъЃьn2т3ЛЋ>љyW\_B– АПw1ІvМ—?ќа’DВЛъёЧ_4оNиЗяxВ y†ђЙєі˜ФЯ=BП›$šВvЬ2п†Ў‰‡Н3Zы%] @k,ЎŽwVМ^c!Q\-AB…њ–oљu?;ИnђПќ™Ÿљ™ё9!н’~цЛђ]Г"Џху;<ёФём]ј­G˜BЌўСЩd;сœlХ€;b^jᆔсЂэBИE§№џаYм˜>љф“ƒ\ х‹€sА ќљŸџљђ Ÿ‡П~ё‘qСrцсз}Мм§Нš…=єtW=§єџ ЏНЊEJ*d№Я=L‰Ы40–P-j€ lmб‡HчžтѕмПѓ\гB^ ЯћфO&P QK"6зИЕk"W|б‹>wЏГ™ЇiпГO—–Ћ˜RВН6ъ(f8hkБ(KО“˜ЪЌєАhнNоL|?Ÿыt>‘Ј>мРŒВ ѓIђЙ0Ч?њї?ёлЈD&Б?}~e!Ц—I№Hй5G˜и-ˆПљ›ПA‡пС1j'vТ ДEQxЩ‹_вzлђ Љ!c 5o)ЙБKnСЃыЧZFЂжMШЗњрЊyqŒIʘTефf0ўе8РзщŠЂЗ;ћШ]Пїjq( 8–Rл0­nШє§чя^уynЮf BЌVMрЊ^п­оцPU Н/­&_vѓy4›6UAaЉ‡єЌж2‰mк‹j‰tя]‡Н?пZ})УпЃуx‡ЕМU‰H{€УЉќЯ€c Э>ІC#^К# ’nE“%1оEы‚GяC}ѓНѕи UUwЧЮ[Cj*;л'Gъ)cРr™їЬlЁиo‘PЪЗњxљ#9ŒђM ГсђЛфA™пля­ёпu„ЈјCEѕп™doFŸ%Fд2gЧЉuНЩ"†YСќфъШгеЊ5?<4цМŒ+VirHkbSpјЯ/Ўа‹ёЁ)YТx[Ќ9@§I z№PлљtЕM-žЙ™іYŸ"’SŒŽt`˜зсНH‡я [-г9n._ЮNнёv­Œ3ZaBMћj<„XhX{ …ЭIЕ”(­pDhшwы3Є ЏqШšД,›ЙoŒo8ЋЗЎя7˜С5ь№–*юж-йlHЫВN`‹hЏялLДЉq\п70цЪЋЧ)Š=]”пЕ№и HœjДzш2oьШ<ІMД„ч№бEY†Ї5нЦ>jOул*`†•SѓД+TкнЗЫтVAЎ’!Xms5Л„&Ќ!—j—Э›”Zz:kvѓjшtнТm$єhtKwїЄ&|nO`uZ‡0Ч­ОФge|šVЫ–‘oЙCЬЙЛ{aшaтщ}(rUк\Ѕ)wпpп3OeCT,СНAr7ИЮЊ /b4˜;:љЛ}иB№A&UІ—–lКѕgCЉr­HпEх=ЊuhмИ™*н*Ÿ“*П6m‹ ЪБяАCTџ)P*gАшА„Њ˜3” 2КУlQЖшЮŸн0 Zgšю9Рp‘З~'Л†мP Б]ЉkЋXЃ›тPib іХLЂKЌ очMOЛS%­tЦЬ­нфИЅќEЬ/БЖ‡№5НQхp‹эA=*0љЂл˜™ d2щGZе§оšБM\qжЮ5жцзnh&VT-#иЦк›ЃwЋ6+т.šьІЋž’НhЎ48TњџњЌи4Gnз+Ј`ЅіuV{А уVѓ“!UрљдxUм03чwU™IяжТ9)ЦМ`ТqєЅ•lў”=ѓ€]\ќGя*'2зіЭ‡a{0ПЩЋj1Ю—c‹ЅЌТU&чXх ќ^чи–HДBI%œ ЙЁКХЗгыЂŒCк?cV[+Y6›lћ!6ѕ>—‰-lЖkт›]БAтЈ/r`-ц, тщ-УЎuў…0~ЈbK(ŸўДhФътn"Дѕ4ьa!“<ОПюкИьLgУРK•Саx—Š=юЪ 5 )ђР bаVьюН@v[zр3рtОйИžQGЕЪЛ*`ы'тd ЪLЁ…2AnІ ‚Ђ0RWzём‘ЊђМф‡џОkН‰рUŒЗНр9ыАg_ЦHœ>olОнІB ЌПзE„„yAэCћœ Љ;Ф:дœў .h-ЊнКЬ}Ыx М•M›*E+iaхТ*бŒКзŸуƒњ[1ЃYc“xgнќI™f z•”Юe'ЕWЂ(ОЬGЖГR`:zAЮЉяў9г­$ћfЗѕмЧд`Ÿh’4Х.\Ѕo{~ЎR]ї“IG*3–ы- ‰mг{˜  НUхa“њЋі{?ЯОА +у4+ь№№чюPmC‹+ZРо„Тіш охu‹бцХН@<Т8œ”ЦiЇЬУZЪlяSћ`‰mъоЬ+bYЎRpр™…Фт*–ж‘8Œ@­—Ф5:wЊ<ЫDŽОh§‰юqђє2ў.l‚) Иќ•A9ј™f5yоЋэX v MEь ОŸž€kжЅk; K[_P0>9"є3.?ЫІеR г>@оkэ „еaнB;мbХI‹5˜b—SЭ1кP'–пъИ/zФБšЫд$ЕkЇgoXјUБ сnЊ`є эх}E VjФ‡‡КюО Tdт7шSsв0™HKЎkО!‘p‹Kљyp^—Њ4&e„SХ–ьvЇ ЉZžЇ!а  a\ ‡|ФУAzV7Ы'…№0фізвY/DJќІ0-т%*Ц†*йœхŒG’vЗчc_\ШKбLЪС­ЋŽQ/…Р^х ўrТ%5“OюлЪиv•ЧmВ/hОИ+\x>e‚ЌНыjlКМђLпеdHœ07”52u Њ3Ќ*тa™3L­'G+ХЎGmqѓфВМe<œRŽJЕдaBi "зяŸ$ўДMC&-Џo‡ђдЗ­м sз ЅFжЎŒАѕ56нdZYK0зжƒ 4ІІАб­ОщЫьЎ—ƒвъвэX№ѕ[‰ћШVG\ЙЫ”>ѓША—(ќљ чђdD\‘‹Y3 ЬLЊюf+йеЕдхY~[\…›О`7фї8ЕWH•:аHЯ%Жlх'o‹ЦѓлžvSy(P{T„K—ЈђЭфр2S‡Эџpл)3ъJR31_л˜уРжЌЖ8ІЁх’АЙ–%^ŠrЦzДь]ЎПВєw^зД9г Ц_Зu}N MЁœk2пA“YЏЕеTљД2'bЧTtюfІE%’єyеcD0xHR4•ч dVсГ‚.­(†9J№Ьsd(єЬ?CcЊB9Д^Œ_] D­Љ\A›Xћ3Я*М€КSЬЇЧљ г*оЬf•AE€ Зrk*FДtjœHЅђЯ’Nˆ'е –Црз<\з˜jЩD{є”c„|v!tоёрСЂЗŠBjщбІ’=\2ŒР>Jdd>иа9WuІTEqŽQыЁYXD!*јы ЙY ФVSyо0Vй4P3}'K‰kQ“ EL t8Р/ъгШИ;дюЉюЋ ’Ъж_†T1ЪR ЁЋgˆ^XV”l Іѓжz†›Юэ0QI(QuзZ "–ЇМОйœ*ЕiъЋX›n Y(mm‹ЫК]LџX8ЇuЋыРM-я§:uR]т ‡аvщ№я(ч—Д­pЃXVWˆ>8Ч ?@w€к]*4,„Z Ќ4hх5*GьbИЖ'ЂЫ‡U&яЂ(*И…ХЄo‚ѓяйвv%У‚Рі“ШбУ -UWь‚2зUg'дїЙ‹њВ ХИЄ+Б56вr•œBэиЃКДааm2E”ДN'A {ЂфЉŠƒPI7цЬЯ^…ˆ ДЛƒ—{7ъС СNнrUК‡#Kп C;Œ ‰гЦwЭ0š„яš<юЎnWВ)Rнуќя“;"њP6Х-СnNƒЫ@r.\Ыџшbiney‚№–yˆСАЂ2+-сƒ/$§ŽmсI8RuА} #|6иucŠLО‘ЖИugэ[o"б'•ЉсЖPЁP …ё<Шгє—єРCєOђMСK€M’w5zћvцГa†’4ЎЙš<Ћы_F~`Йћ"дAжўєmUœA›№‹зgБ;гAŒсА€‘њ§ y ъЅEŽЛ”дчерлђЯFфЕЧ5каYкю%‡пLѓV;Ї Ix5­и+Vщ№M\gЪЋЩхBЕ tи0Bu vіSс@U‘„zS5Ÿо›Ѕ;y“OU%ШPЉЕl RЇ Ђ/i'ТЅaрnХР;ƒ˜т6Ћ‹ŒJФхaMб—72Эƒ”",vodJ Р вЌˆS;pЦeюŸЈP— $ЪLБ ЋЉу0*ЏёrKАEЩ!У[№^ХрЯчнци= ь'чкЩї3smWЂЙВюR‰^Фф^-c:ЈВ`О<zLEѕ•KЩю0&&HМ†C­С UЊXIсB)€T˜'‹щ{Rm’„HЉC2‰U%ВБИAю *ГђУэЁМмоnЬЅ…и=ќ„10U*+*”§ ˜In•LXЧ:яfй]YЕў=Є5цJ6oЋМм TlА"FІьhихЁЄ‰oŸ Ї*№;1 B,6uџь†ЎТћЭЪnЗюL”†шtб$.й) —ля§.м%ƒWДТТ Š[Э ђ*‹бљ Jt’)ё:сœ$.Ј (`ѕCУ@`1$нgФ!1s)–лC%Ђpј|оrёЦїмpXIЖB#Ž tУtzПmм,щєўФКN9жIѓnkЇЅяš9ЈѕМэ“Ше“HH`Ђ)#ˆƒ9НЛ‚ѓPйŠ †=LЋІжKџ№\%^“x%фP1!;ƒЃJ`fчШІ#В5Йк˜_чX™3ІќЂ[[шш“нцCЯˆњ“Z}2­€Б–ю,„gо"ГOГFгхіт<ї€ЊЫуАщЂ<бJItA=!5zMЕ8‹ўЫм„ЃY­…іАф hеђPЦˆу–„Уh}r˜QПЈщŽK8цЖJХЊ7JЇЭ6„UG ъ"ƒnЉ*JШ&‰ИŸ%}T]Hu“lД5&WяХ\Oѓ\8нњtЗb‡ъЧ№ъДяР+К‡ьc1=еmЭ.pл1ДрєЧдz*ЬјЌT@Hвцй]P•†Л4OдьРФ;#:Т‹ „!н]!щi•$™|еЎmj` є}:_РmЂяlЁ%˜сЕ{ЕˆяF>-вW'ž'1yƒаК(н1cOO5лФцЎрмˆ ;Р}ц[Я>9›rРыv7oџаРxHГПWКƒaЛAчJД•щбs‘ЯQ‰NХ“oя.@$ъИQЪЯЙ„Нж›мP* 0Y7ЏАЭdЬŒ ’Й(.:Ќ‘HGЬ’*Ь1тѓIаZЊХгPАxд)WDyŽTFЪ>съ%ЏшВ]вЊм~zЮS№@Z*=PŠдШЭ#ќба 9ЌšGв0ЌEr/4:ЙHЯ[CT'S>ƒ-“†uЫmрЕгМГљя-d*С>фSўУ~І%XeO‹єyгує(aŠGЪЏѕk„ЦЅћœU4™Яaи„u†YлHZ<ЂІыi\е3%ыBOлх№чХa Ї&ЌZК€•ХЙ&5:ў@ї)Ёэh0ШЎІuPиУ‘‰п(qЂkКрsиЊ6RјQl‹1ьМ”ŒЪdœЊзщ,3 nqav йИ є:žЭ_мр6gёœ7;к‡5nЈ;јwйЉUELv‹ы7—|žЙщš а—'*з№њЦХэщі?mj“›ŸкЮюŒUPЈвaК зl<џ5K4Ѕ`тoу3ійZog'pтzЬe;\TРЮ6q Zы%‘8уT+FОяјЪM)}уТŽў‘œ? "(_С-Wa_т?‚ъ3"Ш|#•—qW­ЮЪ ++О˜Б zГ БЌ“Р1ЙЋa€šТ›dШ8eygcБ‚хQnCИPЕ€Š” =ёН7жЙV ЄM№iƒМ&ЏЋRЬѓ№”ю`ииЖvШЄеbOТЭыSrЉdк‘,еkиЊ;‹ЁK';У’ˆРŒ 7‰р}rЖ@Иѓ3*Л Еаu†М‚qЈ „Г—ьћ' P2!]ЪЋ,ЕДкxуINŽЩ‚UœиOнёІ@8ъЂ‘ uџТ;‡Њu€%й‹Ћ‹+CƒYё—С!!V$$ЎсАm6ƒŒЉaз|ЧW+х ЬBЙc;]‹xЁ2qfšЉ_КXwTь)КB3‹IИгјн<ХерQщ mI џЊЬНTў"хяiЄpЮ™5ЏеіЈK-{}еэ"аQ&3НzZk2 х*‹Nv6šШP œФlЃTры 'ю№мЭъ† •ьЙ2ЅШ ши"pЙ’щФШŒ9эИвw(VБЙC˜єšLL’љєђЖж }ЌаІ–\(žїЁ†вз4†]Xг„! vЕ— zYс#Й'тШрxЮ&л_‰јЂЪ\хuТпЯБš—Б]T&pYŸŽд#3КмЌE­§ŸyGF•]цrсk9Z5Ÿ „U оІл+HЮ’#,ZЫусcFe5|UIД`eJ{Ms(k,Д4сІъоbБ—9ЙBас.$ИроNыѓ~гXNUi ’$…љŸцк)Щjњ4ХЄ:Ќˆж0}щРіeWJF_J5лOuѓЖs_Bœ"Ÿ—У­lЁŽпДќPPв­:Г#M‡oЯYЪH ,ŠЈтXУwSхTБiік{ŸМ*П.Ћјдi)ЊбКgNP‚дЯќCo<РЌejЛщвмЎ,Га–Rдќ‘ щЕJДКЊ—БџЯўФ+ЦрумЩэAаBрF8€yС1fУf‹ъз{P"ј™,оdS‰дЖ”GOт”џ Ъ‹hФ—ž9d]H С;:‘^2ЭЋђИhuTхеJ˜JЮѕeC•Х†ЪРœn68&мt) ЉGв†NW–`Т ЭВ8 ЃЖѕдЄOщGжй№оc-—шСhї`ёeИЧTšY1Бў Ч№Š`!qЖEёФhпšю7нB@есШФaБT2yQ™§гЄЫhОhф*YУ"tЉ<ФTpŽФЩђєЇ§c‰ ‹РwШƒЬй'цcД]Н*gаVща мЊщIDATЬэ:Œ#4ЇыКт,-ЕтAј IЙо$g™а Хю2тКVдќЎ:ѓб”–‚Єд–ѕе3DcO=Sц у@.Ќ8]„2д…SЅ!KˆМб]sк60 ЕЦ…ЈUVЯŒ$2J‚ЂЙД€Ч.x+  ЏP•жdgLаЇїСŠ„щП2[<фујМwFџzуИWШ8EпМоd‚<Ї:`]&tŸВ}hŽ( ;|ѓ_ bЃ}Ё-Џ#ј –”є>ЊS‘Рч$Џ3е"Зy;4аЊХmE5г`ЯЁ wжЗ"ЖУpќOП_ИФє@VЮЦЇ\щ‘лYи…ы$њ9фƒЛц*l%г7]Јѓљ5Є*ПЄгH\@_БюgвSСbТд7Yу—h™dB•Qы)un/Жг[zxЖ`пЉ-Tt т3 /еWБдpOТuщЛмъHqxzrŽheЯWЬ'}шMЁD!™ !–№ƒ`Ж#цYиA3ѕ­УIтXDFЯэMMсЦЂФ ѓ0ЄiУЂТ †–ю|ZŽŠ iB|; ‡ez-€ЊКц4yбšвюЪB[J.в кЖ"ЭБTњЋv§!WФwќЎжеЭ‰x“8h0ћ–юСЋ2ЗŽђ—{5.№d–ї1?Ы Lљ‹миЬж… 6 шGЋФЃŽ-š`­ЄGW†ян‰ЖЉHm•|ЖѓѕБgшљƒжt…I^pгнК…9ё/б”—мЈчФЙсо’sЪ8nФV иIЭQ§a ˜ЁW.П.šCгцђHJ•їxš?[Е Ь/ЊLГ„xЏ/Ѕ&ІЎ'чгЅ6И€GЃРЕС%еhВ.5HJѕљ>žЎщ?ˆ0•ЅйЈ`B­Ъ У0йЏаi@l№U“ŸёКK‡bАь€dќїєe?y—еЮuCp.f…ˆ_Єl[ХаŠЋјГ/ЅОLŠ ЕjЊŠAQt”t2IТ ˜xd0Œ”VS6Щй{[g]H/(ƒРeчќйДЙnfЪё 5<§XyvLмЕ;§ЈX–7yœХ‘‚Ь›ѓ:^]Ц}хmYи№ЩOo ~Va†A UщG6аЈˆI\žјт˜\Єp№ ‚ћДNj[œœщсwь&NшZ™ž€чрj­šШјŸЌлCAЂd‘§jtьЖ<птY]ТЎПеЄЉВ'Ј™ јЁHЗГNХ‡&чєКiuD’А›б*J†a^-i{XФ4>^д=ѓяghг~u018ТDњ€НюцВ`ƒ?-љЛлfОПV>`Px%y`•z*†дIŠD˜—фzџqiB$†%иЊ”Џ<п]#9MџmQЗЖIФZ/qmij#зEE`|7‡У`TBЭ4­NnЯhЃœАэќЎи"rf№+F•М§:Tœ“f:I8ˆЉИЮyЛ5ыА ФЎmw*EаLŸ?7Д<‹ ц•I Jэ№л*МБ*,jvёn Qt0€(ЮvžD|КИzKЉЧЦджњEќ“ч#БLdm˜п~иЋ #ѓšЇР=0яIhжѕŠж №žpЊIЩ.§3Ѓ@ЩсHЭ RˆрвїšœбаFˆлŠž1З*NХ›јуќїrЉ\<4‚:Ч?ј™Nѓ‚Вўшёћ~Чm‚t)ДЗ•Ї іMрŸ˜кТ ЛЦjзh‰Oa^… AіQrwrq ZW5 $„цжe&ŸБ„Vb†ЙGwнЋ[ѓЁEР‚lгI(КŸсЩвŸЦ˜-mг ˆѓж*оWr,фPЯFљТgXлœ* СН*˜ЕЈ…Z,Ё…[Ѕ]ЄЬ†ЌgќAЁЊ:ЄQGэAN]З‡šщFЈ№0ЏI"#/ё~LАд# ЎМBe)/и19=/Аq,4Т hђŒ ЮёЯРx<&ВЪ 3І|ѕјgwЦ5ЋєDєC˜їЩПS_X‘pq‹ъ—Cз…ЁЊZnykbЊˆv RШŽКЉ–gоLWВ^UŠлŒ IЖ—Лa—4DЈ6ћ.žиюCsсoЁ*LJGUpќрƒ‰N“\`д:,8н#DORŒAP;БЕ ыЪ|7фиNTрjjЂЁ˜n(Ÿ’r%Ф|bМЇSw;.АТ!oTЌзsHR~tпZђMDжСиЊЬЮŒж‰„ЙjuN&ЧВЮ–&bЙГбАіUrmФwgЂ‹‘њљЏ‡ЗxwС|рbŸ!;ьПƒтєw#HИ9HќТqишrHYІЊЯЭIs…ЃнWQŽ1аNn‘Ље2u!ЁЎ1oьc”(T“А8ЂЃ e5/ujчяЏИpСCPЬ Lьќ#†ЖU ‘=fNaU‚л&Цk‹rHˆfB1!Сo<“иоl‹v•ŠK}cЮb1Š ЭяЈШТpМДмФa№-щЯwŸbЭZЎПЌЊtр)–\ns7‡Ц{7ЅJUшццХ8;ЧNм>1GNњŒlP№‰ пEРXC’лЫ‘Е“]ЁJ VђЊiVпєЙж”Л­ћІбДѕ4(—lYќEVеХ’gЈC YЙž+‚и{iШЙ‘ПУЯМ ЛЋЄ6™ВъЧM/§тA]dㆉ8ѓнš•!}ХьoвЯj!Х‡Жd!‹3ЮЎ’GnZW/юT‚Жšˆђ3ЅЏ.’ќB4‚Х( рЮ# Ћ.ž‘З[™O•`п#Lыn)=ЂЫЉRЩЬ /н/ЫZ#ЎдЙ›ДHБY1в1dеБгŽ’Н§ёgюЪdуPbњy3M‹ѓ4§хњЋ­е 1ЈbUЭœ9кK&Як‚­w0‰жЭmоCЙ.ХccШŸЂ?…ђsЦZж†,~ЉЊœЏЇиbЮ:6‚5N:ЙgЙœiN]Ѕ4ЉUр€&@<7ђёЇэ‹ЛѕљеЬvP|Šк1m-Л)ЛЁЉ‡Ѕ№8mкЕ’h#—.;'щa/@f@№gЁ Eт$цѓ, ыJF IONWfRа’Хэ-cД^`Т9!–[—Z{(‰Zf№Ђм_MQŽOxЇ$У”Лъ’ЈPю[‰+ю,K^rEUDdn1ев[л”М€Kœ*іЫjС›ЇSЈйQYьфu=ІCЬcŠс?UœЌ'4‘d$rЫ!ˆ"чЪVt!СЬ1Ыћ.єђ‹Ў|}X†`ZЏЎ ‹‚mЗВЌш„ЖЈЅОмŽCIХQ)Ш.ј0аЧЊтЕ`t „–юzxГWэЋCŠГ_G!tUШ“ц3jСї[>їдє–ј‚т"‘Pc2.ŒмсH2A.Aю™>vћ‚Wё‰^jЮЖѓ;fšн–эе55хL))еЄZйъ_лИ;{”jјyъиsьž:Iлpb_гŒ@@~Лљ,хK<з4Ћb&ўнv\ЏqќћKˆШЕТзNп ЖЃI<Ч]BO]ˆеУ™Јx—ТsЕ]БXyŠє4єHZ`›`лAЁRН1j9œс ЫТ•HTѓїЋd+7ХЉк… VSs(€№VaŒJнЦFsѓ5я™6Їqa(Hї{ˆ`ЖF •__|кNbјQ (уbнr‡„|JХЬ0Э_.ДШНJDмтa84‰І {,Žті%!9ƒЫJ>1TејЊ–яpНЇHБ›N’&ŸбФ9‹jуеQрœ6"Ин"V`ІyzXB™тРЁ<ЭнмЪ>q$"Л*DlRфŠ0'#іЊЭYћўЈ#ZI4ёэ0LDшa žž•ѓy ЬЁЋ=јZ \] lšД.ˆМ.Јяoq'š„iT2^]єIЁWxЋТe‚cTЂIїvzž?dyхЈЎя ›ИШђ›Vy_.‰Ъя !нT§-UBыЂою1“%јЙе*fuŒП"-`œch3sY- љ|ѓRr…* ОslP HZbMЎ7=dТOМUтЈHщ+m-ПЫН=*ЁG!8ЕЕч#Яќ^e3т‚;Jь4ma/ЈL4|а‰­CUŽ]–KƘK‰PUІЬiАыКРMmPC]єЯЁЪ.&­#TЫЉ ‹ВЙѓ;"7Ѓш(фЅ!ъД]ЁЖШШђќš+ЗлLТШО/,Ѓ„пЃ–ђŸžТcТ{љ'џP ЯŸ{о‚g 8빇9>СЁdvHC HXKБю ГѕzЄiЩк„ƒњцЮ=T—ю&С!Ч;’‘'ырс‡Љ ж’ WakЁВеPЇ›ђ ‹/ЇцWо1Tn`%rѓцlž„уfƒSЎ€;p#'мЏюx+kdИ\ДЙQЁ{иц p‘цf,iЉ•ш1щэ‘уЮ:сr†І!‚ш4“oЫ‡_ ‘ IcŠ`-1`hQн9 vH`Нлйь—ж~&ЅˆёeƒЪ`Ј8енœ6І.V6ХЃaxчСД*лQЕпPA8ЂmўУщ0$9’JНс-йФ‡›™&eЩеEш4иkГIlKЮ.Ьw1&t™{LIBѓєŸШрсsЩ^UЂJ*Ћ K[ЎТSГ б1он$J‡Л"MН­ЅГoо.Ф\ QzЪвЏL$˜уэћ&Бг”И[G‹=Ћ˜$1BoЪmВ i’Zg@jврB]и}Дц™wёey!—Ю•тў€vŒ"ПГ Рm–Щ42Ж@?‹ѕ3*аНн%1ыSДЙJŒ|2ЩM’r єЂ „гvH2FDЙv—vЩюёMщhжп]№еkЯŒTm")ѕЂЌ@ˆFдѕА‡„)Ѕ‘OЂ3w—t!ЌTf‹:ЃsЎяvС9Й5М7ЙЂ(ж80tD*дEо.\ёaЯЫЌЪxИзъх(?ю*АЛ`VУ.ФСфЙkжЪИЇ!Šс –aРњЂžЖuЇЭж ОŸlЖщf=œxhWЮc]іЦг=Ÿ"Y0s g*X[‡Е •ќIƒ‘Є…ЫrLlCDzђvГќлэaА†к‘—'P‚љ$$›!O;K^„[ЊгпeФmy&эЖCж:ЌКlС|шPBпqG„[Щz‰Мѓ&ХєŠ$U|d† чЫЊЏDKŠ„ЂJВЌёЅ„kDс“”J“)?4ХћЎытЙЏц%QТЈ<н@тљЭџ}Peц|с" сbtп>ŒhЖKБ ЉLXЅиЎяFZО`T/№фJЕП@ф=ф]ьл9ИDИвыУEеGp9ЅcnWP"NaVЬк9X—“p *ЭD9Ј?Э}аЗИ–љKыЭЎa $?b‚wfQ|NLšs7/№IZWЗinWѓE№/‚2›,d*E`Ю:[Ѕ9Р@ЧЭйAЦi”С‹6K>`оЄйвяИЖ>?]МЃгмп9љVШc*АX]у0‹о0д"Иƒ“Ц˜О‚Ф&щКЪšАF_Pœь’^ќЎŽŸwcЂФДДmК:dC:зЖeš ИќЮ<гЈmѕQyТёшe­2и99†[^РXˆлIvY+€˜ї€XТn[їщ;7h%•ˆУmŠQ4ъ:L7й‰%Че+шъ”у§wР\m€бхSгщЮгвE4"Э‡ІњЅfЂkшчѕ9eF"ЯjsЅKЎB ф-–` љ›:‰ысOL Љp5^ Bб3ч !„ТCg9?ОДРЭ‡C0­т[ЁТ­]|+ŠSeАйЇVd]q”†ЊЁ\Йa-Ъ Ћ№рп{ў^R>И†!Ъ5\ЈNмhrfŽЬ.уŒUU 9ЇSpЊ##bЈdя8Sœ5@O7^т€aОe2Шцž‰WУАцZфќmФq=ˆ§ћЈ§kЗэ@еДAˆМ ”Гp>…5|Sчв›k\$aьЩЩбЋ”4h{РЇЦіўрќ;jЙЛЬV gLeSрбљьVUш4e%wЪ+ ‘д8ƒОwЦи…w1@ŒyХ4Џъџ#”]ђ—IENDЎB`‚icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/PaxHeaders.7406/simpletestMegaSlow.jn0000644000000000000000000000013213441742745030660 xustar0030 mtime=1552401893.139832615 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/simpletest1/resources/simpletestMegaSlow.jnlp0000644000175000002070000000415713441742745032033 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/jsengine0000644000000000000000000000013013441742745021736 xustar0028 mtime=1552401893.1468326 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/0000755000175000002070000000000013441742745022625 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/jsengine/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745022712 xustar0030 mtime=1552401893.163832565 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/srcs/0000755000175000002070000000000013441742745023577 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/jsengine/srcs/PaxHeaders.7406/jsengineApplet.java0000644000000000000000000000013013441742745026600 xustar0028 mtime=1552401893.1468326 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/srcs/jsengineApplet.java0000644000175000002070000000457213441742745027422 0ustar00jvanekmock00000000000000/* jsengineApplet.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class jsengineApplet extends Applet{ private static final ScriptEngine engine1 = new ScriptEngineManager().getEngineByName("JavaScript"); private static final ScriptEngine engine2 = new ScriptEngineManager(jsengineApplet.class.getClassLoader()).getEngineByName("JavaScript"); private static final ScriptEngine engine3 = new ScriptEngineManager(null).getEngineByName("JavaScript"); @Override public void start(){ System.out.println("starting"); System.out.println("A-"+engine1+"-Z"); System.out.println("B-"+engine2+"-Y"); System.out.println("C-"+engine3+"-X"); System.out.println("finished"); } } icedtea-web-1.8/tests/reproducers/simple/jsengine/srcs/PaxHeaders.7406/jsengine.java0000644000000000000000000000013213441742745025434 xustar0030 mtime=1552401893.163832565 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/srcs/jsengine.java0000644000175000002070000000450313441742745026246 0ustar00jvanekmock00000000000000/* jsengine.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class jsengine{ private static final ScriptEngine engine1 = new ScriptEngineManager().getEngineByName("JavaScript"); private static final ScriptEngine engine2 = new ScriptEngineManager(jsengine.class.getClassLoader()).getEngineByName("JavaScript"); private static final ScriptEngine engine3 = new ScriptEngineManager(null).getEngineByName("JavaScript"); public static void main(String[] args){ System.out.println("starting"); System.out.println("A-"+engine1+"-Z"); System.out.println("B-"+engine2+"-Y"); System.out.println("C-"+engine3+"-X"); System.out.println("finished"); } } icedtea-web-1.8/tests/reproducers/simple/jsengine/PaxHeaders.7406/resources0000644000000000000000000000013213441742745023752 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/resources/0000755000175000002070000000000013441742745024637 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/jsengine/resources/PaxHeaders.7406/jsengine.jnlp0000644000000000000000000000013213441742745026516 xustar0030 mtime=1552401893.141832611 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/resources/jsengine.jnlp0000644000175000002070000000411513441742745027327 0ustar00jvanekmock00000000000000 jsengine IcedTea jsengine icedtea-web-1.8/tests/reproducers/simple/jsengine/resources/PaxHeaders.7406/jsengineApplet.html0000644000000000000000000000013213441742745027665 xustar0030 mtime=1552401893.130832634 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/resources/jsengineApplet.html0000644000175000002070000000342013441742745030474 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/jsengine/resources/PaxHeaders.7406/jsengineApplet.jnlp0000644000000000000000000000013213441742745027664 xustar0030 mtime=1552401893.139832615 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/resources/jsengineApplet.jnlp0000644000175000002070000000433613441742745030502 0ustar00jvanekmock00000000000000 jsengine IcedTea jsengine icedtea-web-1.8/tests/reproducers/simple/jsengine/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745023735 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/testcases/0000755000175000002070000000000013441742745024623 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/jsengine/testcases/PaxHeaders.7406/jsengineTest.java0000644000000000000000000000013113441742745027317 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/jsengine/testcases/jsengineTest.java0000644000175000002070000001126313441742745030133 0ustar00jvanekmock00000000000000/* jsengineTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import org.junit.Assert; import org.junit.Test; public class jsengineTest extends BrowserTest { @Test @Bug(id = "PR3263") public void jsengineTestcase1() throws Exception { String originalResourceName = "jsengine.jnlp"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + originalResourceName); //ServerAccess.logOutputReprint(pr.stderr); //ServerAccess.logOutputReprint(pr.stdout); Assert.assertTrue(pr.stdout.matches("(?s).*starting.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*A-.*nashorn.*-Z.*") || pr.stdout.matches("(?s)(?i).*A-.*rhino.*-Z.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*B-.*nashorn.*-Y.*") || pr.stdout.matches("(?s)(?i).*B-.*rhino.*-Y.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*C-.*nashorn.*-X.*") || pr.stdout.matches("(?s)(?i).*C-.*rhino.*-X.*")); Assert.assertTrue(pr.stdout.matches("(?s).*finished.*")); } @Test public void jsengineAppletTestcase1() throws Exception { String originalResourceName = "jsengineApplet.jnlp"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + originalResourceName, new StringBasedClosingListener("finished"), null, null); //ServerAccess.logOutputReprint(pr.stderr); //ServerAccess.logOutputReprint(pr.stdout); Assert.assertTrue(pr.stdout.matches("(?s).*starting.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*A-.*nashorn.*-Z.*") || pr.stdout.matches("(?s)(?i).*A-.*rhino.*-Z.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*B-.*nashorn.*-Y.*") || pr.stdout.matches("(?s)(?i).*B-.*rhino.*-Y.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*C-.*nashorn.*-X.*") || pr.stdout.matches("(?s)(?i).*C-.*rhino.*-X.*")); Assert.assertTrue(pr.stdout.matches("(?s).*finished.*")); } @Test @TestInBrowsers(testIn = {Browsers.all}) public void jsengineAppletTestcase2() throws Exception { String originalResourceName = "jsengineApplet.html"; ProcessResult pr = server.executeBrowser("/" + originalResourceName, new StringBasedClosingListener("finished"), null); //ServerAccess.logOutputReprint(pr.stderr); //ServerAccess.logOutputReprint(pr.stdout); Assert.assertTrue(pr.stdout.matches("(?s).*starting.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*A-.*nashorn.*-Z.*") || pr.stdout.matches("(?s)(?i).*A-.*rhino.*-Z.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*B-.*nashorn.*-Y.*") || pr.stdout.matches("(?s)(?i).*B-.*rhino.*-Y.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*C-.*nashorn.*-X.*") || pr.stdout.matches("(?s)(?i).*C-.*rhino.*-X.*")); Assert.assertTrue(pr.stdout.matches("(?s).*finished.*")); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУš0000644000000000000000000000031313441742745035107 xustar00113 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/ 30 mtime=1552401893.137832619 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000755000175000002070000000000013441742745043340 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000032013441742745040106 xustar00118 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/srcs/ 30 mtime=1552401893.134832625 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000755000175000002070000000000013441742745043340 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000034113441742745040111 xustar00135 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/srcs/EncodingTest.java 30 mtime=1552401893.134832625 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000552613441742745043352 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* EncodingTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EncodingTest extends Applet { public static void main(String[] args){ System.out.println("Encoded jar decoded correctly"); for (int i = 0; i < args.length; i++) { String string = args[i]; System.out.println(string); } } private class Killer extends Thread { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Aplet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { System.out.println("applet was initialised"); killer = new Killer(); } @Override public void start() { System.out.println("applet was started"); System.out.println(getParameter("key1")); killer.start(); System.out.println("killer was started"); } @Override public void stop() { System.out.println("applet was stopped"); } @Override public void destroy() { System.out.println("applet will be destroyed"); } } icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000032513441742745040113 xustar00123 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/ 30 mtime=1552401893.162832567 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000755000175000002070000000000013441742745043340 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000044013441742745040111 xustar00198 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest2ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡-ISO88592.jnlp 30 mtime=1552401893.133832627 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000450613441742745043347 0ustar00jvanekmock00000000000000 encodingTest2ЬЉШиЎнСЭЩЬЩиЋнкйЭгСЉЯЎЌв IcedTea ьЙшјО§сэщ=!@#$%^*()_+њ)љЇ.-?:_"!'(/ьщјЛнњэѓсЙяМОшђ;+ЬЉШиЎнСЭЩЬЩиЋнкйЭгСЉЯЎЌв ьЙшјО§сэщ=!@#$%^*()_+њ)љЇ.-?:_"!'(/ьщјЛнњэѓсЙяМОшђ;+ЬЉШиЎнСЭЩЬЩиЋнкйЭгСЉЯЎЌв1 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000036013441742745040112 xustar00150 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest3-ISO88592.jnlp 30 mtime=1552401893.140832613 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000446113441742745043347 0ustar00jvanekmock00000000000000 encodingTest3 IcedTea ьЙшјО§сэщ=!@#$%^*()_+њ)љЇ.-?:_"!'(/ьщјЛнњэѓсЙяМОшђ;+ЬЉШиЎнСЭЩЬЩиЋнкйЭгСЉЯЎЌв ьЙшјО§сэщ=!@#$%^*()_+њ)љЇ.-?:_"!'(/ьщјЛнњэѓсЙяМОшђ;+ЬЉШиЎнСЭЩЬЩиЋнкйЭгСЉЯЎЌв1 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000035613441742745040117 xustar00150 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest5-ISO88592.jnlp 28 mtime=1552401893.1468326 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000472513441742745043352 0ustar00jvanekmock00000000000000 encodingTest IcedTea ьЙшјО§сэщ=!@#$%^*()_+њ)љЇ.-?:_\"!'(/ьщјЛнњэѓсЙяМОшђ;+ЬЉШиЎнСЭЩЬЩиЋнкйЭгСЉЯЎЌв1 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000035613441742745040117 xustar00150 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest1-ISO88592.jnlp 28 mtime=1552401893.1468326 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000442613441742745043350 0ustar00jvanekmock00000000000000 encodingTest1 IcedTea ьЙшјО§сэщ=!@#$%^*()_+њ)љЇ.-?:_"!'(/ьщјЛнњэѓсЙяМОшђ;+ЬЉШиЎнСЭЩЬЩиЋнкйЭгСЉЯЎЌв ьЙшјО§сэщ=!@#$%^*()_+њ)љЇ.-?:_"!'(/ьщјЛнњэѓсЙяМОшђ;+ЬЉШиЎнСЭЩЬЩиЋнкйЭгСЉЯЎЌв1 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000035413441742745040115 xustar00146 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest4-UTF8.html 30 mtime=1552401893.162832567 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000405713441742745043350 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000035413441742745040115 xustar00146 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest3-UTF8.jnlp 30 mtime=1552401893.130832634 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000464613441742745043354 0ustar00jvanekmock00000000000000 encodingTest3 IcedTea Ф›ХЁФХ™ХОУНУЁУ­УЉ=!@#$%^*()_+УК)ХЏТЇ.-?:_"!'(/Ф›УЉХ™ХЅУУКУ­УГУЁХЁФХКХОФХˆ;+ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡ Ф›ХЁФХ™ХОУНУЁУ­УЉ=!@#$%^*()_+УК)ХЏТЇ.-?:_"!'(/Ф›УЉХ™ХЅУУКУ­УГУЁХЁФХКХОФХˆ;+ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡1 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000035413441742745040115 xustar00146 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest5-UTF8.jnlp 30 mtime=1552401893.131832631 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000511213441742745043341 0ustar00jvanekmock00000000000000 encodingTest IcedTea Ф›ХЁФХ™ХОУНУЁУ­УЉ=!@#$%^*()_+УК)ХЏТЇ.-?:_\"!'(/Ф›УЉХ™ХЅУУКУ­УГУЁХЁФХКХОФХˆ;+ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡1 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000035413441742745040115 xustar00146 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest1-UTF8.jnlp 30 mtime=1552401893.131832631 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000456313441742745043352 0ustar00jvanekmock00000000000000 encodingTest1 IcedTea Ф›ХЁФХ™ХОУНУЁУ­УЉ=!@#$%^*()_+УК)ХЏТЇ.-?:_"!'(/Ф›УЉХ™ХЅУУКУ­УГУЁХЁФХКХОФХˆ;+ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡ Ф›ХЁФХ™ХОУНУЁУ­УЉ=!@#$%^*()_+УК)ХЏТЇ.-?:_"!'(/Ф›УЉХ™ХЅУУКУ­УГУЁХЁФХКХОФХˆ;+ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡1 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000043413441742745040114 xustar00194 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest2ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡-UTF8.jnlp 30 mtime=1552401893.136832621 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000472313441742745043350 0ustar00jvanekmock00000000000000 encodingTest2ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡ IcedTea Ф›ХЁФХ™ХОУНУЁУ­УЉ=!@#$%^*()_+УК)ХЏТЇ.-?:_"!'(/Ф›УЉХ™ХЅУУКУ­УГУЁХЁФХКХОФХˆ;+ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡ Ф›ХЁФХ™ХОУНУЁУ­УЉ=!@#$%^*()_+УК)ХЏТЇ.-?:_"!'(/Ф›УЉХ™ХЅУУКУ­УГУЁХЁФХКХОФХˆ;+ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡1 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000036013441742745040112 xustar00150 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources/encodingTest4-ISO88592.html 30 mtime=1552401893.138832617 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000000375113441742745043350 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000032513441742745040113 xustar00123 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/testcases/ 30 mtime=1552401893.137832619 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000755000175000002070000000000013441742745043340 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000000000000000000000035213441742745040113 xustar00144 path=icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/testcases/EncodingTestTest.java 30 mtime=1552401893.137832619 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙ0000644000175000002070000002602513441742745043347 0ustar00jvanekmock00000000000000/* EncodingTestTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.FileInputStream; import java.io.FilenameFilter; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; public class EncodingTestTest extends BrowserTest { List verboseArg = Arrays.asList(new String[]{ServerAccess.VERBOSE_OPTION}); private static final String arg = "Ф›ХЁФХ™ХОУНУЁУ­УЉ=!@#$%^*()_+УК)ХЏТЇ.-?:_\"!'(/Ф›УЉХ™ХЅУУКУ­УГУЁХЁФХКХОФХˆ;+ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡1"; private static final String argEscaped = arg.replace("\"", """); private static final String utf = "UTF8"; private static final String iso88592 = "ISO88592"; private FileInputStream is; File[] utf8Files = server.getDir().listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.contains(utf); } }); File[] iso88592Files = server.getDir().listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.contains(iso88592); } }); @Test public void iso88592FileCanBeDecodedCorrectly() throws Exception { Assert.assertTrue("there must be more then 1 iso file in server's directory", iso88592Files.length > 0); for (int i = 0; i < iso88592Files.length; i++) { File f = iso88592Files[i]; is = new FileInputStream(f); String ff = ServerAccess.getContentOfStream(is, "ISO-8859-2"); ServerAccess.logOutputReprint(f.getName()); ServerAccess.logOutputReprint(ff); Assert.assertTrue("file " + f.getName() + " should contain " + arg + " bud didn't", ff.contains(arg) || ff.contains(argEscaped)); } } @Test public void iso88592FileCanBeDecodedWrongly() throws Exception { Assert.assertTrue("there must be more then 1 iso file in server's directory", iso88592Files.length > 0); for (int i = 0; i < iso88592Files.length; i++) { File f = iso88592Files[i]; is = new FileInputStream(f); String ff = ServerAccess.getContentOfStream(is, "UTF-8"); ServerAccess.logOutputReprint(f.getName()); ServerAccess.logOutputReprint(ff); Assert.assertFalse("file " + f.getName() + " should NOT contain " + arg + " bud did", ff.contains(arg) || ff.contains(argEscaped)); } } @Test public void utf8FileCanBeDecodedCorrectly() throws Exception { Assert.assertTrue("there must be more then 1 utf file in server's directory", utf8Files.length > 0); for (int i = 0; i < utf8Files.length; i++) { File f = utf8Files[i]; is = new FileInputStream(f); String ff = ServerAccess.getContentOfStream(is, "UTF-8"); ServerAccess.logOutputReprint(f.getName()); ServerAccess.logOutputReprint(ff); Assert.assertTrue("file " + f.getName() + " should contain " + arg + " bud didn't", ff.contains(arg) || ff.contains(argEscaped)); } } @Test public void utf8FileCanBeDecodedWrongly() throws Exception { Assert.assertTrue("there must be more then 1 utf file in server's directory", utf8Files.length > 0); for (int i = 0; i < utf8Files.length; i++) { File f = utf8Files[i]; is = new FileInputStream(f); String ff = ServerAccess.getContentOfStream(is, "ISO-8859-2"); ServerAccess.logOutputReprint(f.getName()); ServerAccess.logOutputReprint(ff); Assert.assertFalse("file " + f.getName() + " should NOT contain " + arg + " bud did", ff.contains(arg) || ff.contains(argEscaped)); } } @Test public void testEncodingTest1Utf8() throws Exception { testEncodingTest1(utf); } @Test @KnownToFail @Bug(id = "PR1108") public void testEncodingTest1Iso88592() throws Exception { testEncodingTest1(iso88592); } @Test public void testEncodingTest2Utf8() throws Exception { testEncodingTest2(utf); } @Test @KnownToFail @Bug(id = "PR1108") public void testEncodingTest2Iso88592() throws Exception { testEncodingTest2(iso88592); } @Test public void testEncodingTest3Utf8() throws Exception { testEncodingTest3(utf); } @Test @KnownToFail @Bug(id = "PR1108") public void testEncodingTest3Iso88592() throws Exception { testEncodingTest3(iso88592); } @Test @NeedsDisplay @TestInBrowsers(testIn = Browsers.one) public void testEncodingTest4Utf8() throws Exception { testEncodingTest4(utf); } @Test @NeedsDisplay @TestInBrowsers(testIn = Browsers.one) public void testEncodingTest4Iso88592() throws Exception { testEncodingTest4(iso88592); } @Test public void testEncodingTest5Utf8() throws Exception { testEncodingTest5(utf); } @Test @Bug(id = "PR1108") @KnownToFail public void testEncodingTest5Iso88592() throws Exception { testEncodingTest5(iso88592); } /** * launching simpletest1.jar from encoding encoded jnlp */ public void testEncodingTest1(String encoding) throws Exception { ProcessResult pr = server.executeJavawsHeadless(verboseArg, "/encodingTest1-" + encoding + ".jnlp"); String s = "Good simple javaws exapmle"; Assert.assertTrue("encodingTest1 (in " + encoding + ") stdout should contain " + s + " bud didn't", pr.stdout.contains(s)); //javaws in verbose mode is printing out readed jnlp. I'm no sure if the following test is relevant Assert.assertTrue("encodingTest1 (in " + encoding + ") stdout should contain " + arg + " bud didn't", pr.stdout.contains(arg)); } /** * launching simpletest1.jar fromencoding file with utf8/ISO-8859-2 uncompatible characters */ public void testEncodingTest2(String encoding) throws Exception { ProcessResult pr = server.executeJavawsHeadless(verboseArg, "/encodingTest2ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡-" + encoding + ".jnlp"); String s = "Good simple javaws exapmle"; Assert.assertTrue("encodingTest2ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡ (in " + encoding + ") stdout should contain " + s + " bud didn't", pr.stdout.contains(s)); //javaws in verbose mode is printing out readed jnlp. I'm no sure if the following test is relevant Assert.assertTrue("encodingTest2ФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡ (in " + encoding + ") stdout should contain " + arg + " bud didn't", pr.stdout.contains(arg)); } /** * launching encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡.jar from encoding file with utf8/ISO-8859-2 uncompatible characters included also in args and jar filename */ public void testEncodingTest3(String encoding) throws Exception { //not verbose in this case, this class is printing it's argument out ProcessResult pr = server.executeJavawsHeadless("/encodingTest3-" + encoding + ".jnlp"); String s = "Encoded jar decoded correctly"; Assert.assertTrue("encodingTest3 (in " + encoding + ") stdout should contain " + s + " bud didn't", pr.stdout.contains(s)); Assert.assertTrue("encodingTest3 (in " + encoding + ") stdout should contain " + arg + " bud didn't", pr.stdout.contains(arg)); } /** * launching encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡.jar from encoding file with utf8/ISO-8859-2 uncompatible characters included also in args and jar filename in browser */ public void testEncodingTest4(String encoding) throws Exception { ProcessResult pr = server.executeBrowser("/encodingTest4-" + encoding + ".html"); String s3 = "applet was initialised"; Assert.assertTrue("encodingTest4 stdout should contains " + s3 + " bud didn't", pr.stdout.contains(s3)); String s0 = "applet was started"; Assert.assertTrue("encodingTest4 stdout should contains " + s0 + " bud didn't", pr.stdout.contains(s3)); Assert.assertTrue("encodingTest4 (in " + encoding + ") stdout should contain " + arg + " bud didn't", pr.stdout.contains(arg)); } /** * launching encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡.jar from encoding file with utf8/ISO-8859-2 uncompatible characters included also in args and jar filename as applet by jnlp */ public void testEncodingTest5(String encoding) throws Exception { //not verbose in this case, this class is printing it's argument out ProcessResult pr = server.executeJavawsHeadless("/encodingTest5-" + encoding + ".jnlp"); String s3 = "applet was initialised"; Assert.assertTrue("encodingTest5 stdout should contains " + s3 + " bud didn't", pr.stdout.contains(s3)); String s0 = "applet was started"; Assert.assertTrue("encodingTest5 stdout should contains " + s0 + " bud didn't", pr.stdout.contains(s3)); Assert.assertTrue("encodingTest5 (in " + encoding + ") stdout should contain " + arg + " bud didn't", pr.stdout.contains(arg)); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/deadlocktest0000644000000000000000000000013213441742745022604 xustar0030 mtime=1552401893.162832567 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/0000755000175000002070000000000013441742745023471 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/deadlocktest/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024602 xustar0030 mtime=1552401893.162832567 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/testcases/0000755000175000002070000000000013441742745025467 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/deadlocktest/testcases/PaxHeaders.7406/DeadLockTestTest.jav0000644000000000000000000000013213441742745030527 xustar0030 mtime=1552401893.162832567 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/testcases/DeadLockTestTest.java0000644000175000002070000002603113441742745031502 0ustar00jvanekmock00000000000000/* DeadLockTestTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.ArrayList; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.BeforeClass; import org.junit.Test; public class DeadLockTestTest { private static ServerAccess server = new ServerAccess(); private static String deadlocktest_1 = "/deadlocktest_1.jnlp"; private static String deadlocktest = "/deadlocktest.jnlp"; @BeforeClass public static void printJavas() throws Exception { ServerAccess.logOutputReprint("Currently runnng javas1 " + countJavaInstances()); } @Test public void testDeadLockTestTerminated() throws Exception { testDeadLockTestTerminatedBody(deadlocktest); testDeadLockTestTerminatedBody(deadlocktest); ServerAccess.logOutputReprint("Currently running javas12 " + countJavaInstances()); } @Test public void testDeadLockTestTerminated2() throws Exception { testDeadLockTestTerminatedBody(deadlocktest_1); testDeadLockTestTerminatedBody(deadlocktest_1); /** * this happens, when p.p.destroy is called before p.interrupt. and destroyed variable is removedI have no idea why, but it is incorrect. Assert.assertNotNull("return can not be null in no fork process. Was ",pr.returnValue);//in this case forking is forbiden, and sojava throws an exception after destroy */ ServerAccess.logOutputReprint("Currently running javas13 " + countJavaInstances()); } public void testDeadLockTestTerminatedBody(String jnlp) throws Exception { List before = countJavaInstances(); ServerAccess.logOutputReprint("java1 " + jnlp + " : " + before.size()); ProcessResult pr = server.executeJavawsHeadless(null, jnlp); assertDeadlockTestLaunched(pr); List after = countJavaInstances(); ServerAccess.logOutputReprint("java2 " + jnlp + " : " + after.size()); killDiff(before, after); String ss = "This process is hanging more than 30s. Should be killed"; Assert.assertFalse("stdout should not contains: " + ss + ", but did", pr.stdout.contains(ss)); // as we are tryng to terminate process as harmless as possible those two are no longer valid in all cases // Assert.assertTrue("testDeadLockTestTerminated should be terminated, but wasn't", pr.wasTerminated); // Assert.assertNull("Killed process must have null return value. Have not - ", pr.returnValue); List afterKill = countJavaInstances(); ServerAccess.logOutputReprint("java3 " + jnlp + " : " + afterKill.size()); Assert.assertEquals("assert that just old javas remians", 0, (before.size() - afterKill.size())); } @Test public void ensureAtLeasOneJavaIsRunning() throws Exception { Assert.assertTrue("at least one java should be running, but isn't! Javas are probably counted badly", countJavaInstances().size() > 0); } @Test public void testSimpletest1lunchFork() throws Exception { List before = countJavaInstances(); ServerAccess.logOutputReprint("java4: " + before.size()); BackgroundDeadlock bd = new BackgroundDeadlock(deadlocktest_1, null); bd.start(); Thread.sleep(ServerAccess.PROCESS_TIMEOUT * 2 / 3); List during = countJavaInstances(); ServerAccess.logOutputReprint("java5: " + during.size()); waitForBackgroundDeadlock(bd); List after = countJavaInstances(); ServerAccess.logOutputReprint("java6: " + after.size()); Assert.assertNotNull("proces inside background deadlock cant be null. It was.", bd.getPr()); assertDeadlockTestLaunched(bd.getPr()); killDiff(before, during); List afterKill = countJavaInstances(); ServerAccess.logOutputReprint("java66: " + afterKill.size()); Assert.assertEquals("assert that just old javas remians", 0, (before.size() - afterKill.size())); // div by two is caused by jav in java process hierarchy Assert.assertEquals("launched JVMs must be exactly 2, was " + (during.size() - before.size()), 2, (during.size() - before.size())); } @Test public void testSimpletest1lunchNoFork() throws Exception { List before = countJavaInstances(); ServerAccess.logOutputReprint("java7: " + before.size()); BackgroundDeadlock bd = new BackgroundDeadlock(deadlocktest_1, Arrays.asList(new String[]{"-Xnofork"})); bd.start(); Thread.sleep(ServerAccess.PROCESS_TIMEOUT * 2 / 3); List during = countJavaInstances(); ServerAccess.logOutputReprint("java8: " + during.size()); waitForBackgroundDeadlock(bd); List after = countJavaInstances(); ServerAccess.logOutputReprint("java9: " + after.size()); Assert.assertNotNull("proces inside background deadlock cant be null. It was.", bd.getPr()); assertDeadlockTestLaunched(bd.getPr()); killDiff(before, during); List afterKill = countJavaInstances(); ServerAccess.logOutputReprint("java99: " + afterKill.size()); Assert.assertEquals("assert that just old javas remians", 0, (before.size() - afterKill.size())); // div by two is caused by jav in java process hierarchy Assert.assertEquals("launched JVMs must be exactly 1, was " + (during.size() - before.size()), 1, (during.size() - before.size())); } /** * by process assasin destroyed processes are hanging random amount of time as zombies. * Kill -9 is handling zombies pretty well. * * This function kills or processes which are in nw but are not in old * (eq.to killing new zombies:) ) * * @param old * @param nw * @return * @throws Exception */ private static List killDiff(List old, List nw) throws Exception { ensureLinux(); List result = new ArrayList(); for (String string : nw) { if (old.contains(string)) { continue; } ServerAccess.logOutputReprint("Killing " + string); ServerAccess.PROCESS_LOG = false; try { ProcessResult pr = ServerAccess.executeProcess(Arrays.asList(new String[]{"kill", "-9", string})); } finally { ServerAccess.PROCESS_LOG = true; } result.add(string); ServerAccess.logOutputReprint("Killed " + string); } return result; } private static List countJavaInstances() throws Exception { ensureLinux(); List result = new ArrayList(); ServerAccess.PROCESS_LOG = false; try { ProcessResult pr = ServerAccess.executeProcess(Arrays.asList(new String[]{"ps", "-eo", "pid,ppid,stat,fname"})); Matcher m = Pattern.compile("\\s*\\d+\\s+\\d+ .+ java\\s*").matcher(pr.stdout); int i = 0; while (m.find()) { i++; String ss = m.group(); //ServerAccess.logOutputReprint(i+": "+ss); result.add(ss.trim().split("\\s+")[0]); } } finally { ServerAccess.PROCESS_LOG = true; } return result; } public static void main(String[] args) throws Exception { ServerAccess.logOutputReprint("" + countJavaInstances()); } private void assertDeadlockTestLaunched(ProcessResult pr) { String s = "Deadlock test started"; Assert.assertTrue("Deadlock test should print out " + s + ", but did not", pr.stdout.contains(s)); //each 3500 seconds deadlock test stdout something //timeout is 20s //so it should write out FIVE sentences, but is mostly just three or four. Last is nearly always consumed by termination for (int i = 1; i <= 3; i++) { String sentence = i + " Deadlock sleeping"; Assert.assertTrue( "stdout should contains: " + sentence + ", didn't, so framework have consumed to much during termination", pr.stdout.contains(sentence)); } } private void waitForBackgroundDeadlock(final BackgroundDeadlock bd) throws InterruptedException { while (!bd.isFinished()) { Thread.sleep(500); } } private static class BackgroundDeadlock extends Thread { private boolean finished = false; private ProcessResult pr = null; String jnlp; List args; public BackgroundDeadlock(String jnlp, List args) { this.jnlp = jnlp; this.args = args; } @Override public void run() { try { pr = server.executeJavawsHeadless(args, jnlp); } catch (Exception ex) { ServerAccess.logException(ex); } finally { finished = true; } } public ProcessResult getPr() { return pr; } public boolean isFinished() { return finished; } } private static void ensureLinux() { String os = System.getProperty("os.name").toLowerCase(); if (!(os.contains("linux") || os.contains("unix"))) { throw new IllegalStateException("This test can be procesed only on linux like machines"); } } } icedtea-web-1.8/tests/reproducers/simple/deadlocktest/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024616 xustar0030 mtime=1552401893.140832613 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/resources/0000755000175000002070000000000013441742745025503 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/deadlocktest/resources/PaxHeaders.7406/deadlocktest.jnlp0000644000000000000000000000013213441742745030226 xustar0030 mtime=1552401893.140832613 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/resources/deadlocktest.jnlp0000644000175000002070000000413713441742745031043 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/resources/PaxHeaders.7406/deadlocktest_1.jnlp0000644000000000000000000000013213441742745030446 xustar0030 mtime=1552401893.129832636 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/resources/deadlocktest_1.jnlp0000644000175000002070000000426613441742745031266 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023556 xustar0030 mtime=1552401893.138832617 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/srcs/0000755000175000002070000000000013441742745024443 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/deadlocktest/srcs/PaxHeaders.7406/DeadlockTest.java0000644000000000000000000000013213441742745027044 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/deadlocktest/srcs/DeadlockTest.java0000644000175000002070000000453313441742745027661 0ustar00jvanekmock00000000000000/* DeadlockTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class DeadlockTest { private static final int DEADLOCK_TEST_TIME_OF_LIFE=30000; public static void main(String[] args) throws Exception { long startTime = System.nanoTime() / 1000000l; System.out.println("Deadlock test started"); int i=0; while (true) { long now = System.nanoTime() / 1000000l; Thread.sleep(3500); i++; System.out.println(i+" Deadlock sleeping"); if (now - startTime > DEADLOCK_TEST_TIME_OF_LIFE) { System.out.println("This process is hanging more then "+DEADLOCK_TEST_TIME_OF_LIFE/1000+"s. Should be killed"); System.out.flush(); System.exit(5); } } } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/UnsignedJnlpTemplate0000644000000000000000000000013213441742745024232 xustar0030 mtime=1552401893.162832567 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/0000755000175000002070000000000013441742745025117 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026244 xustar0030 mtime=1552401893.139832615 30 atime=1552410887.104183464 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/resources/0000755000175000002070000000000013441742745027131 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/resources/PaxHeaders.7406/UnsignedJnlp0000644000000000000000000000013113441742745030643 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/resources/UnsignedJnlpTemplate1.jnlp0000644000175000002070000000421313441742745034173 0ustar00jvanekmock00000000000000 UnsignedJnlpTemplate IcedTea UnsignedJnlpTemplate icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/resources/PaxHeaders.7406/UnsignedJnlp0000644000000000000000000000013213441742745030644 xustar0030 mtime=1552401893.139832615 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/resources/UnsignedJnlpTemplate3.jnlp0000644000175000002070000000455613441742745034207 0ustar00jvanekmock00000000000000 DIFFERENTJnlpTemplateNAME IcedTea UnsignedJnlpTemplate icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/resources/PaxHeaders.7406/UnsignedJnlp0000644000000000000000000000013213441742745030644 xustar0030 mtime=1552401893.135832623 30 atime=1552402157.279253386 30 ctime=1552410887.090183497 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/resources/UnsignedJnlpTemplate2.jnlp0000644000175000002070000000434613441742745034203 0ustar00jvanekmock00000000000000 UnsignedJnlpTemplate IcedTea icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026230 xustar0030 mtime=1552401893.162832567 30 atime=1552410887.104183464 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/testcases/0000755000175000002070000000000013441742745027115 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/testcases/PaxHeaders.7406/UnsignedJnlp0000644000000000000000000000031113441742745030627 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/testcases/UnsignedJnlpTemplateTest.java 30 mtime=1552401893.162832567 30 atime=1552402157.279253386 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/testcases/UnsignedJnlpTemplateTest.jav0000644000175000002070000000572713441742745034566 0ustar00jvanekmock00000000000000/* UnsignedJnlpTemplateTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class UnsignedJnlpTemplateTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); private final String outputString = "Running unsigned application in main"; @Test public void jnlpTemplateIsUnchecked1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UnsignedJnlpTemplate1.jnlp"); Assert.assertTrue("Stdout should contains " + outputString + " but did not", pr.stdout.contains(outputString)); } @Test public void jnlpTemplateIsUnchecked2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UnsignedJnlpTemplate2.jnlp"); Assert.assertTrue("Stdout should contains " + outputString + " but did not", pr.stdout.contains(outputString)); } @Test public void jnlpTemplateIsUnchecked3() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UnsignedJnlpTemplate3.jnlp"); Assert.assertTrue("Stdout should contains " + outputString + " but did not", pr.stdout.contains(outputString)); } } icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025204 xustar0030 mtime=1552401893.137832619 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/srcs/0000755000175000002070000000000013441742745026071 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/srcs/PaxHeaders.7406/JNLP-INF0000644000000000000000000000013213441742745026361 xustar0030 mtime=1552401893.129832636 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/srcs/JNLP-INF/0000755000175000002070000000000013441742745027246 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/srcs/JNLP-INF/PaxHeaders.7406/APPLICAT0000644000000000000000000000031113441742745027555 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/srcs/JNLP-INF/APPLICATION_TEMPLATE.jnlp 30 mtime=1552401893.129832636 30 atime=1552402157.279253386 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/srcs/JNLP-INF/APPLICATION_TEMPLATE.jnl0000644000175000002070000000443413441742745033016 0ustar00jvanekmock00000000000000 UnsignedJnlpTemplate IcedTea UnsignedJnlpTemplate icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/srcs/PaxHeaders.7406/UnsignedJnlpTempl0000644000000000000000000000013213441742745030606 xustar0030 mtime=1552401893.137832619 30 atime=1552402157.279253386 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpTemplate/srcs/UnsignedJnlpTemplate.java0000644000175000002070000000342013441742745033027 0ustar00jvanekmock00000000000000/* UnsignedJnlpTemplate.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class UnsignedJnlpTemplate { public static void main(String[] args) { System.out.println("Running unsigned application in main"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/UnsignedJnlpApplication0000644000000000000000000000013213441742745024722 xustar0030 mtime=1552401893.145832603 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/0000755000175000002070000000000013441742745025607 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025674 xustar0030 mtime=1552401893.161832569 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/srcs/0000755000175000002070000000000013441742745026561 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/srcs/PaxHeaders.7406/UnsignedJnlpAp0000644000000000000000000000013213441742745030555 xustar0030 mtime=1552401893.145832603 30 atime=1552402157.279253386 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/srcs/UnsignedJnlpApplication.java0000644000175000002070000000342613441742745034215 0ustar00jvanekmock00000000000000/* UnsignedJnlpApplication.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class UnsignedJnlpApplication { public static void main(String[] args) { System.out.println("Running unsigned application in main"); } } icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/srcs/PaxHeaders.7406/JNLP-INF0000644000000000000000000000013213441742745027051 xustar0030 mtime=1552401893.161832569 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/srcs/JNLP-INF/0000755000175000002070000000000013441742745027736 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/srcs/JNLP-INF/PaxHeaders.7406/APPLI0000644000000000000000000000013213441742745027716 xustar0030 mtime=1552401893.161832569 30 atime=1552402157.279253386 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/srcs/JNLP-INF/APPLICATION.jnlp0000644000175000002070000000445313441742745032374 0ustar00jvanekmock00000000000000 UnsignedJnlpApplication IcedTea UnsignedJnlpApplication icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026734 xustar0030 mtime=1552401893.139832615 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/0000755000175000002070000000000013441742745027621 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/PaxHeaders.7406/UnsignedJ0000644000000000000000000000031413441742745030624 xustar00114 path=icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/UnsignedJnlpApplication1.jnlp 30 mtime=1552401893.139832615 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/UnsignedJnlpApplication1.0000644000175000002070000000423213441742745034470 0ustar00jvanekmock00000000000000 UnsignedJnlpApplication IcedTea UnsignedJnlpApplication icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/PaxHeaders.7406/UnsignedJ0000644000000000000000000000031413441742745030624 xustar00114 path=icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/UnsignedJnlpApplication2.jnlp 30 mtime=1552401893.128832638 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/UnsignedJnlpApplication2.0000644000175000002070000000436213441742745034475 0ustar00jvanekmock00000000000000 UnsignedJnlpApplication IcedTea icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/PaxHeaders.7406/UnsignedJ0000644000000000000000000000031413441742745030624 xustar00114 path=icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/UnsignedJnlpApplication3.jnlp 30 mtime=1552401893.137832619 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/resources/UnsignedJnlpApplication3.0000644000175000002070000000457513441742745034504 0ustar00jvanekmock00000000000000 DIFFERENTJnlpApplicationNAME IcedTea UnsignedJnlpApplication icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026720 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/testcases/0000755000175000002070000000000013441742745027605 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/testcases/PaxHeaders.7406/UnsignedJ0000644000000000000000000000031713441742745030613 xustar00117 path=icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/testcases/UnsignedJnlpApplicationTest.java 30 mtime=1552401893.130832634 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/UnsignedJnlpApplication/testcases/UnsignedJnlpApplicationTe0000644000175000002070000000573213441742745034614 0ustar00jvanekmock00000000000000/* UnsignedJnlpApplicationTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class UnsignedJnlpApplicationTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); private final String outputString = "Running unsigned application in main"; @Test public void jnlpFileIsUnchecked1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UnsignedJnlpApplication1.jnlp"); Assert.assertTrue("Stdout should contains " + outputString + " but did not", pr.stdout.contains(outputString)); } @Test public void jnlpFileIsUnchecked2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UnsignedJnlpApplication2.jnlp"); Assert.assertTrue("Stdout should contains " + outputString + " but did not", pr.stdout.contains(outputString)); } @Test public void jnlpFileIsUnchecked3() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UnsignedJnlpApplication3.jnlp"); Assert.assertTrue("Stdout should contains " + outputString + " but did not", pr.stdout.contains(outputString)); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/StripHttpPathParams0000644000000000000000000000013213441742745024060 xustar0030 mtime=1552401893.161832569 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/0000755000175000002070000000000013441742745024745 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026056 xustar0030 mtime=1552401893.144832604 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/testcases/0000755000175000002070000000000013441742745026743 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/testcases/PaxHeaders.7406/StripHttpPath0000644000000000000000000000013213441742745030634 xustar0030 mtime=1552401893.144832604 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/testcases/StripHttpPathParamsTest.java0000644000175000002070000000553513441742745034400 0ustar00jvanekmock00000000000000/* StripHttpPathParamsTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Assert; import org.junit.Test; public class StripHttpPathParamsTest extends BrowserTest { private static final String appletCloseString = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; @Test public void testStripHttpPathParamsLaunch() throws Exception { ProcessResult pr = server.executeJavawsHeadless("/StripHttpPathParams.jnlp"); Assert.assertTrue("stdout should contain \"running\" but did not", pr.stdout.contains("running")); } @NeedsDisplay @Test @TestInBrowsers(testIn={Browsers.one}) public void testStripHttpPathParamsApplet() throws Exception { ProcessResult pr = server.executeBrowser("/StripHttpPathParams.html", AutoClose.CLOSE_ON_BOTH); Assert.assertTrue("stdout should contain " + appletCloseString + " but did not", pr.stdout.contains(appletCloseString)); } } icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025032 xustar0030 mtime=1552401893.161832569 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/srcs/0000755000175000002070000000000013441742745025717 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/srcs/PaxHeaders.7406/StripHttpPathParam0000644000000000000000000000013213441742745030571 xustar0030 mtime=1552401893.161832569 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/srcs/StripHttpPathParams.java0000644000175000002070000000365413441742745032514 0ustar00jvanekmock00000000000000/* StripHttpPathParams.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class StripHttpPathParams extends Applet { private static final String appletCloseString = "*** APPLET FINISHED ***"; public static void main(String[] args) { System.out.println("running"); } @Override public void init() { System.out.println(appletCloseString); } } icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026072 xustar0030 mtime=1552401893.136832621 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/resources/0000755000175000002070000000000013441742745026757 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/resources/PaxHeaders.7406/StripHttpPath0000644000000000000000000000013113441742745030647 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/resources/StripHttpPathParams.html0000644000175000002070000000352613441742745033575 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/resources/PaxHeaders.7406/StripHttpPath0000644000000000000000000000013213441742745030650 xustar0030 mtime=1552401893.136832621 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/StripHttpPathParams/resources/StripHttpPathParams.jnlp0000644000175000002070000000424213441742745033570 0ustar00jvanekmock00000000000000 StripHttpPathParams IcedTea Remove HTTP Path Parameters from JAR URLs icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/SingleInstanceServiceTest0000644000000000000000000000013213441742745025225 xustar0030 mtime=1552401893.137832619 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/0000755000175000002070000000000013441742745026112 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026177 xustar0030 mtime=1552401893.137832619 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/srcs/0000755000175000002070000000000013441742745027064 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/srcs/PaxHeaders.7406/SingleInstan0000644000000000000000000000013213441742745030575 xustar0030 mtime=1552401893.137832619 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/srcs/SingleInstanceChecker.java0000644000175000002070000001213113441742745034120 0ustar00jvanekmock00000000000000/* SingleInstanceChecker.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import javax.jnlp.SingleInstanceListener; import javax.jnlp.SingleInstanceService; import javax.jnlp.ServiceManager; import javax.jnlp.UnavailableServiceException; public class SingleInstanceChecker extends Applet implements SingleInstanceListener { private SingleInstanceChecker self; Killer killer; private static class Killer extends Thread { private int timeout; private String timeoutText; public Killer() { timeout = 5000; timeoutText = Integer.toString(timeout); } public Killer(int n) { timeout = n; timeoutText = Integer.toString(timeout); } public Killer(int n, String s) { timeout = n; timeoutText = s; } @Override public void run() { try { Thread.sleep(timeout); System.out.println("Applet killing itself after " + timeoutText + " ms of life"); System.exit(0); } catch (Exception ex) { } } } public SingleInstanceChecker() { self = this; } private void proceed() { try { SingleInstanceService testService = (SingleInstanceService) ServiceManager.lookup("javax.jnlp.SingleInstanceService"); System.out.println("SingleInstanceChecker: Adding listener to service."); testService.addSingleInstanceListener(this); System.out.println("SingleInstanceChecker: Listener added."); } catch (UnavailableServiceException use) { System.err.println("SingleInstanceChecker: Service lookup failed."); use.printStackTrace(); } finally { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(5000); } catch (Exception ex) { ex.printStackTrace(); } finally { startKiller(2); } } }).start(); } } //killer is started when params are received, or when application is running to long private void startKiller(int a) { synchronized (self) { if (killer == null) { if (a == 2) { killer = new Killer(5000, "10000"); killer.start(); } else { killer = new Killer(5000); killer.start(); } } } } @Override public void newActivation(String[] params) { String paramsString = ""; for (String param : params) { paramsString += " "+param; } System.out.println("Parameters received by SingleInstanceChecker:" + paramsString); startKiller(1); } @Override public void start() { System.out.print("Parameters received by during launch:"); for (int i=1; i<10; i++ ) { String s=getParameter("p"+i); if (s!=null){ System.out.print(" "+s); } } System.out.println(); proceed(); } public static void main(String[] args) { System.out.print("Parameters received by during launch:"); for (String string : args) { System.out.print(" "+string); } System.out.println(); new SingleInstanceChecker().proceed(); } } icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745027222 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/testcases/0000755000175000002070000000000013441742745030110 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/testcases/PaxHeaders.7406/SingleI0000644000000000000000000000013113441742745030554 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/testcases/SingleInstanceTest.java0000644000175000002070000003163013441742745034524 0ustar00jvanekmock00000000000000/* SingleInstanceTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ContentReaderListener; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserFactory; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; public class SingleInstanceTest extends BrowserTest { private static boolean isJnlp(String launchFile) { return launchFile.toLowerCase().endsWith(".jnlp"); } private static boolean isHtml(String launchFile) { return launchFile.toLowerCase().endsWith(".html"); } private static void checkNulls(String testName, ProcessResult prSecondInst, String var) { Assert.assertNotNull(var + " SingleInstanceTest." + testName + "result was null ", prSecondInst); Assert.assertNotNull(var + " SingleInstanceTest." + testName + "result was null ", prSecondInst.stdout); Assert.assertNotNull(var + " SingleInstanceTest." + testName + "result was null ", prSecondInst.stderr); } private static void evaluateFirstInstance(ProcessResult prFirstInst, String testName) { checkNulls(testName, prFirstInst, "First"); // First Instance's result should run without exceptions. String s0 = "SingleInstanceChecker: Adding listener to service."; String s1 = "Parameters received by SingleInstanceChecker"; String ss = "SingleInstanceChecker: Service lookup failed."; Assert.assertTrue("SingleInstanceTest." + testName + "'s first PR stdout should contain " + s0 + " but didn't", prFirstInst.stdout.contains(s0)); Assert.assertTrue("SingleInstanceTest." + testName + "'s first PR stdout should contain " + s1 + " but didn't", prFirstInst.stdout.contains(s1)); Assert.assertFalse("SingleInstanceTest." + testName + "'s first PR stderr should not contain " + ss + " but did", prFirstInst.stderr.contains(ss)); } private static void evaluateSecondInstance(ProcessResult prSecondInst, String testName) { checkNulls(testName, prSecondInst, "Second"); // Second Instance's result should throw a LaunchException. String s2 = "net.sourceforge.jnlp.LaunchException"; Assert.assertTrue("SingleInstanceTest." + testName + "'s second PR stderr should contain " + s2 + " but didn't", prSecondInst.stderr.contains(s2)); } private static boolean bothHtml(String app1, String app2) { return isHtml(app1) && isHtml(app2); } private static class AsyncProcess extends Thread { private ProcessResult pr = null; private String launchFile; public AsyncProcess(String launchFile) { this.launchFile = launchFile; } @Override public void run() { try { boolean isJavawsTest = isJnlp(launchFile); pr = isJavawsTest ? server.executeJavawsHeadless(launchFile, null, null) : server.executeBrowser(launchFile); } catch (Exception ex) { ServerAccess.logException(ex); } finally { if (pr == null) { pr = new ProcessResult("", "", null, true, null, null); } } } public ProcessResult getPr() { return pr; } } private ProcessResult[] executeSingleInstanceCheck(String app1, String app2) throws Exception { final AsyncProcess ap = new AsyncProcess(app2); ContentReaderListener clr = new ContentReaderListener() { @Override public void charReaded(char ch) { //nothing to do } @Override public void lineReaded(String s) { if (s.contains(listenerConfirmed)) { ap.start(); } } }; boolean isJavawsTest = isJnlp(app1); final ProcessResult pr = isJavawsTest ? server.executeJavawsHeadless(app1, clr, null) : server.executeBrowser(app1, clr, null); int timeout = 0; while (ap.pr == null) { timeout++; Thread.sleep(500); if (timeout > 20) { break; } } return new ProcessResult[]{pr, ap.getPr()}; } //files private static final String jnlpApplet = "/SingleInstanceTest.jnlp"; private static final String jnlpApplication = "/SingleInstanceTestWS.jnlp"; private static final String htmlpApplet = "/SingleInstanceTest_clasical.html"; private static final String htmlJnlpHrefApplet = "/SingleInstanceTest_jnlpHref.html"; //constants private static final String listenerConfirmed = "SingleInstanceChecker: Listener added."; @Test @NeedsDisplay @TestInBrowsers(testIn = Browsers.one) //known to not work in midori and epihany public void htmlpAppletXhtmlpApplet() throws Exception { //others really do if ((server.getBrowserLocation().endsWith("midori") || server.getBrowserLocation().endsWith("epiphany"))) { return; } if (server.getBrowserLocation().endsWith(ServerAccess.UNSET_BROWSER)) { return; } ProcessResult[] results = executeSingleInstanceCheck(htmlpApplet, htmlpApplet); String id = "htmlpAppletXhtmlpApplet"; evaluateFirstInstance(results[0], id); //the first browser is consuming all the output evaluateSecondInstance(results[0], id); } @Test @NeedsDisplay @TestInBrowsers(testIn = Browsers.one) //known to not work in midori and epihany public void htmlJnlpHrefAppletXhtmlJnlpHrefApplet() throws Exception { //others really do if ((server.getBrowserLocation().endsWith("midori") || server.getBrowserLocation().endsWith("epiphany"))) { return; } if (server.getBrowserLocation().endsWith(ServerAccess.UNSET_BROWSER)) { return; } ProcessResult[] results = executeSingleInstanceCheck(htmlJnlpHrefApplet, htmlJnlpHrefApplet); String id = "htmlJnlpHrefAppletXhtmlJnlpHrefApplet"; evaluateFirstInstance(results[0], id); //the first browser is consuming all the output evaluateSecondInstance(results[0], id); } @Test public void jnlpApplicationXjnlpApplication() throws Exception { ProcessResult[] results = executeSingleInstanceCheck(jnlpApplication, jnlpApplication); String id = "jnlpApplicationXjnlpApplication"; evaluateFirstInstance(results[0], id); evaluateSecondInstance(results[1], id); } @Test @NeedsDisplay public void jnlpAppleXjnlpApplet() throws Exception { ProcessResult[] results = executeSingleInstanceCheck(jnlpApplet, jnlpApplet); String id = "jnlpAppleXjnlpApplet"; evaluateFirstInstance(results[0], id); evaluateSecondInstance(results[1], id); } public static void main(String[] args) throws Exception { new SingleInstanceTest().main(); } /** * This "test" is testing all possible variations of launches. * However html x jnlp (or vice versa) tests are failing * I do not suppose this should ever happen in real life, so I'm not including this as @KnownToFail * See the list of results on below for couriosity ;) * *Passed /SingleInstanceTest.jnlp x /SingleInstanceTest.jnlp *Passed /SingleInstanceTest.jnlp x /SingleInstanceTestWS.jnlp *FAILED /SingleInstanceTest.jnlp x /SingleInstanceTest_jnlpHref.html - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *FAILED /SingleInstanceTest.jnlp x /SingleInstanceTest_clasical.html - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *Passed /SingleInstanceTestWS.jnlp x /SingleInstanceTest.jnlp *Passed /SingleInstanceTestWS.jnlp x /SingleInstanceTestWS.jnlp *java.lang.NoSuchMethodException: SingleInstanceTest.access$000() *FAILED /SingleInstanceTestWS.jnlp x /SingleInstanceTest_jnlpHref.html - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *FAILED /SingleInstanceTestWS.jnlp x /SingleInstanceTest_clasical.html - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *FAILED /SingleInstanceTest_jnlpHref.html x /SingleInstanceTest.jnlp - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *FAILED /SingleInstanceTest_jnlpHref.html x /SingleInstanceTestWS.jnlp - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *Passed /SingleInstanceTest_jnlpHref.html x /SingleInstanceTest_jnlpHref.html *FAILED /SingleInstanceTest_jnlpHref.html x /SingleInstanceTest_clasical.html - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *FAILED /SingleInstanceTest_clasical.html x /SingleInstanceTest.jnlp - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *FAILED /SingleInstanceTest_clasical.html x /SingleInstanceTestWS.jnlp - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *FAILED /SingleInstanceTest_clasical.html x /SingleInstanceTest_jnlpHref.html - java.lang.AssertionError: SingleInstanceTest.main's first PR stdout should contain Parameters received by SingleInstanceChecker but didn't *Passed /SingleInstanceTest_clasical.html x /SingleInstanceTest_clasical.html */ public void main() throws Exception { //just for fun try all not so probable cominations String[] args = new String[]{jnlpApplet, jnlpApplication, htmlJnlpHrefApplet, htmlpApplet}; //normally handled by annotation server.setCurrentBrowser(BrowserFactory.getFactory().getRandom()); for (int i = 0; i < args.length; i++) { String app1 = args[i]; for (int j = 0; j < args.length; j++) { String app2 = args[j]; try { ProcessResult[] results = executeSingleInstanceCheck(app1, app2); evaluateFirstInstance(results[0], "main"); if (bothHtml(app1, app2)) { evaluateSecondInstance(results[0], "main"); } else { evaluateSecondInstance(results[1], "main"); } System.out.println("Passed " + app1 + " x " + app2); } catch (Error ex) { System.out.println("FAILED " + app1 + " x " + app2 + " - " + ex.toString()); //ex.printStackTrace(); } } } } } icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027237 xustar0030 mtime=1552401893.144832604 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/0000755000175000002070000000000013441742745030124 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/PaxHeaders.7406/SingleI0000644000000000000000000000032113441742745030571 xustar00119 path=icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTest_clasical.html 30 mtime=1552401893.131832631 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTest_clas0000644000175000002070000000370713441742745034626 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/PaxHeaders.7406/SingleI0000644000000000000000000000013213441742745030571 xustar0030 mtime=1552401893.144832604 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTest.jnlp0000644000175000002070000000454113441742745034563 0ustar00jvanekmock00000000000000 SingleInstanceApplet IcedTea SingleInstanceApplet icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/PaxHeaders.7406/SingleI0000644000000000000000000000031213441742745030571 xustar00112 path=icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTestWS.jnlp 30 mtime=1552401893.128832638 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTestWS.jn0000644000175000002070000000437613441742745034507 0ustar00jvanekmock00000000000000 SingleInstanceAppletWS IcedTea SingleInstanceAppletWS v7 v8 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/PaxHeaders.7406/SingleI0000644000000000000000000000032113441742745030571 xustar00119 path=icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTest_jnlpHref.html 30 mtime=1552401893.134832625 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTest_jnlp0000644000175000002070000000362713441742745034650 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/SetContextClassLoader0000644000000000000000000000013213441742745024353 xustar0030 mtime=1552401893.137832619 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/0000755000175000002070000000000013441742745025240 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026365 xustar0030 mtime=1552401893.137832619 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/resources/0000755000175000002070000000000013441742745027252 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/resources/PaxHeaders.7406/SetContextC0000644000000000000000000000013213441742745030570 xustar0030 mtime=1552401893.137832619 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/resources/SetContextClassLoader.jnlp0000644000175000002070000000400613441742745034354 0ustar00jvanekmock00000000000000 set context classloader IcedTea icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025325 xustar0030 mtime=1552401893.126832642 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/srcs/0000755000175000002070000000000013441742745026212 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/srcs/PaxHeaders.7406/SetContextClassL0000644000000000000000000000013213441742745030527 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/srcs/SetContextClassLoader.java0000644000175000002070000000344513441742745033300 0ustar00jvanekmock00000000000000/* SetContextClassLoader.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SetContextClassLoader { public static void main(String[] args) throws Exception{ Thread.currentThread().setContextClassLoader(null); } } icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026351 xustar0030 mtime=1552401893.135832623 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/testcases/0000755000175000002070000000000013441742745027236 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/testcases/PaxHeaders.7406/SetContextC0000644000000000000000000000031313441742745030555 xustar00113 path=icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/testcases/SetContextClassLoaderTest.java 30 mtime=1552401893.135832623 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SetContextClassLoader/testcases/SetContextClassLoaderTest.j0000644000175000002070000000506713441742745034476 0ustar00jvanekmock00000000000000/* SetContextClassLoaderTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class SetContextClassLoaderTest { private static ServerAccess server = new ServerAccess(); @Test public void SetContextClassLoader1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/SetContextClassLoader.jnlp"); String s = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.lang.RuntimePermission.{0,5}" + "setContextClassLoader" + ".*"; Assert.assertTrue("stderr should match "+s+" but didn't",pr.stderr.matches(s)); String cc="ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `"+cc+"`, but did",pr.stderr.contains(cc)); Assert.assertFalse("SetContextClassLoader1 should not be terminated, but was",pr.wasTerminated); Assert.assertEquals((Integer) 1, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/SandboxUnsignedSandbox0000644000000000000000000000013213441742745024550 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/0000755000175000002070000000000013441742745025435 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026562 xustar0030 mtime=1552401893.160832571 30 atime=1552410887.105183461 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/0000755000175000002070000000000013441742745027447 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000031113441742745030645 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox.html 30 mtime=1552401893.136832621 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox.htm0000644000175000002070000000345113441742745034576 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000032213441742745030647 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox_security.jnlp 30 mtime=1552401893.143832607 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox_sec0000644000175000002070000000436213441742745034643 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxUnsignedSandbox icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000033113441742745030647 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox_applet_security.jnlp 30 mtime=1552401893.160832571 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox_app0000644000175000002070000000454113441742745034650 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxUnsignedSandbox icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000031113441742745030645 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox.jnlp 30 mtime=1552401893.126832642 30 atime=1552402157.278253389 30 ctime=1552410887.089183499 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox.jnl0000644000175000002070000000426613441742745034576 0ustar00jvanekmock00000000000000 SandboxUnsignedSandbox IcedTea SandboxUnsignedSandbox icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000032013441742745030645 xustar00118 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox_applet.jnlp 30 mtime=1552401893.134832625 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox_app0000644000175000002070000000444613441742745034654 0ustar00jvanekmock00000000000000 SandboxUnsignedSandbox IcedTea SandboxUnsignedSandbox icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025522 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/srcs/0000755000175000002070000000000013441742745026407 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/srcs/PaxHeaders.7406/SandboxUnsigned0000644000000000000000000000013213441742745030615 xustar0030 mtime=1552401893.130832634 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/srcs/SandboxUnsignedSandbox.java0000644000175000002070000000406313441742745033667 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxUnsignedSandbox extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013113441742745026661 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/srcs/META-INF/0000755000175000002070000000000013441742745027547 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/srcs/META-INF/PaxHeaders.7406/MANIFE0000644000000000000000000000013213441742745027621 xustar0030 mtime=1552401893.128832638 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/srcs/META-INF/MANIFEST.MF0000644000175000002070000000005413441742745031200 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Permissions: sandbox icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026546 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/testcases/0000755000175000002070000000000013441742745027433 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/testcases/PaxHeaders.7406/SandboxUns0000644000000000000000000000031513441742745030635 xustar00115 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/testcases/SandboxUnsignedSandboxTest.java 30 mtime=1552401893.133832627 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedSandbox/testcases/SandboxUnsignedSandboxTest0000644000175000002070000001412513441742745034633 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxUnsignedSandboxTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedSandbox.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedSandbox_security.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}),"SandboxUnsignedSandbox_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition()));//applets have exception flused only in verbose mode? strange... } @Test public void javawsAppletAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedSandbox_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxUnsignedSandbox.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "SandboxUnsignedSandbox.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/SandboxUnsignedMissing0000644000000000000000000000013213441742745024563 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/0000755000175000002070000000000013441742745025450 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026561 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/testcases/0000755000175000002070000000000013441742745027446 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/testcases/PaxHeaders.7406/SandboxUns0000644000000000000000000000031513441742745030650 xustar00115 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/testcases/SandboxUnsignedMissingTest.java 30 mtime=1552401893.130832634 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/testcases/SandboxUnsignedMissingTest0000644000175000002070000001470513441742745034665 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxUnsignedMissingTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm1 = new DeploymentPropertiesModifier(); private static final DeploymentPropertiesModifier dpm2 = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm1.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); dpm2.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm2.restoreProperties(); dpm1.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedMissing.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedMissing_security.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}),"SandboxUnsignedMissing_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition()));//applets have exception flused only in verbose mode? strange... } @Test public void javawsAppletAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedMissing_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxUnsignedMissing.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[] {OptionsDefinitions.OPTIONS.HTML.option}), "SandboxUnsignedMissing.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/testcases/PaxHeaders.7406/SandboxUns0000644000000000000000000000033113441742745030646 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/testcases/SandboxUnsignedMissingTestHighSecurity.java 30 mtime=1552401893.133832627 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/testcases/SandboxUnsignedMissingTest0000644000175000002070000002530113441742745034657 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxUnsignedMissingTestHighSecurity extends BrowserTest { private static final DeploymentPropertiesModifier dpm1 = new DeploymentPropertiesModifier(); private static final DeploymentPropertiesModifier dpm2 = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm1.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); dpm2.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ASK_UNSIGNED.toChars()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm2.restoreProperties(); dpm1.restoreProperties(); } @Test public void javawsAllPermNoSecurityYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxUnsignedMissing.jnlp")); pw.setWriter("YES\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermNoSecurityNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxUnsignedMissing.jnlp")); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurityYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxUnsignedMissing_security.jnlp")); pw.setWriter("YES\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurityNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxUnsignedMissing_security.jnlp")); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurityYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless", "-verbose"), server.getUrl("SandboxUnsignedMissing_applet.jnlp")); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("YES\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition()));//applets have exception flused only in verbose mode? strange... } @Test public void javawsAppletAllPermNoSecurityNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless", "-verbose"), server.getUrl("SandboxUnsignedMissing_applet.jnlp")); pw.addStdErrListener(new AutoErrorClosingListener()); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition()));//applets have exception flused only in verbose mode? strange... } @Test public void javawsAppletAllPermAllSecurityYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxUnsignedMissing_applet_security.jnlp")); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("YES\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermAllSecurityNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxUnsignedMissing_applet_security.jnlp")); pw.addStdErrListener(new AutoErrorClosingListener()); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } //browser do not support headless dialogues //@Test //@TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxUnsignedMissing.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtmlYesYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless", "-html"), server.getUrl("SandboxUnsignedMissing.html")); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("YES\nYES\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtmlYesNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless", "-html"), server.getUrl("SandboxUnsignedMissing.html")); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("YES\nNO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtmlNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless", "-html"), server.getUrl("SandboxUnsignedMissing.html")); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026575 xustar0030 mtime=1552401893.159832573 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/0000755000175000002070000000000013441742745027462 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000031113441742745030660 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing.jnlp 30 mtime=1552401893.136832621 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing.jnl0000644000175000002070000000426613441742745034624 0ustar00jvanekmock00000000000000 SandboxUnsignedMissing IcedTea SandboxUnsignedMissing icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000032213441742745030662 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing_security.jnlp 30 mtime=1552401893.160832571 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing_sec0000644000175000002070000000436413441742745034673 0ustar00jvanekmock00000000000000 SandboxUnsignedMissing IcedTea SandboxUnsignedMissing icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000032013441742745030660 xustar00118 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing_applet.jnlp 30 mtime=1552401893.125832644 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing_app0000644000175000002070000000445113441742745034676 0ustar00jvanekmock00000000000000 SandboxUnsignedMissing IcedTea SandboxUnsignedMissing icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000031013441742745030657 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing.html 29 mtime=1552401893.13283263 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing.htm0000644000175000002070000000345113441742745034624 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000033113441742745030662 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing_applet_security.jnlp 30 mtime=1552401893.134832625 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/resources/SandboxUnsignedMissing_app0000644000175000002070000000454713441742745034704 0ustar00jvanekmock00000000000000 SandboxUnsignedMissing IcedTea SandboxUnsignedMissing icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025535 xustar0030 mtime=1552401893.143832607 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/srcs/0000755000175000002070000000000013441742745026422 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013213441742745026675 xustar0030 mtime=1552401893.143832607 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/srcs/META-INF/0000755000175000002070000000000013441742745027562 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/srcs/META-INF/PaxHeaders.7406/MANIFE0000644000000000000000000000013213441742745027634 xustar0030 mtime=1552401893.143832607 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/srcs/META-INF/MANIFEST.MF0000644000175000002070000000002713441742745031213 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/srcs/PaxHeaders.7406/SandboxUnsigned0000644000000000000000000000013113441742745030627 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedMissing/srcs/SandboxUnsignedMissing.java0000644000175000002070000000406313441742745033715 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxUnsignedMissing extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/SandboxUnsignedInvalid0000644000000000000000000000013213441742745024540 xustar0030 mtime=1552401893.129832636 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/0000755000175000002070000000000013441742745025425 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026552 xustar0030 mtime=1552401893.159832573 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/0000755000175000002070000000000013441742745027437 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000031113441742745030635 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid.jnlp 30 mtime=1552401893.135832623 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid.jnl0000644000175000002070000000426613441742745034556 0ustar00jvanekmock00000000000000 SandboxUnsignedInvalid IcedTea SandboxUnsignedInvalid icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000032213441742745030637 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid_security.jnlp 30 mtime=1552401893.159832573 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid_sec0000644000175000002070000000436213441742745034623 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxUnsignedInvalid icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000032013441742745030635 xustar00118 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid_applet.jnlp 30 mtime=1552401893.125832644 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid_app0000644000175000002070000000444713441742745034635 0ustar00jvanekmock00000000000000 SandboxUnsignedInvalid IcedTea SandboxUnsignedInvalid icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000031013441742745030634 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid.html 29 mtime=1552401893.13283263 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid.htm0000644000175000002070000000345013441742745034555 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000033113441742745030637 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid_applet_security.jnlp 30 mtime=1552401893.133832627 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid_app0000644000175000002070000000454313441742745034632 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxUnsignedInvalid icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025512 xustar0030 mtime=1552401893.143832607 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/srcs/0000755000175000002070000000000013441742745026377 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013213441742745026652 xustar0030 mtime=1552401893.143832607 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/srcs/META-INF/0000755000175000002070000000000013441742745027537 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/srcs/META-INF/PaxHeaders.7406/MANIFE0000644000000000000000000000013213441742745027611 xustar0030 mtime=1552401893.143832607 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/srcs/META-INF/MANIFEST.MF0000644000175000002070000000006113441742745031166 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Permissions: invalidValue icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/srcs/PaxHeaders.7406/SandboxUnsigned0000644000000000000000000000013113441742745030604 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/srcs/SandboxUnsignedInvalid.java0000644000175000002070000000406313441742745033647 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxUnsignedInvalid extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026536 xustar0030 mtime=1552401893.129832636 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/testcases/0000755000175000002070000000000013441742745027423 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/testcases/PaxHeaders.7406/SandboxUns0000644000000000000000000000031513441742745030625 xustar00115 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/testcases/SandboxUnsignedInvalidTest.java 30 mtime=1552401893.129832636 30 atime=1552402157.278253389 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedInvalid/testcases/SandboxUnsignedInvalidTest0000644000175000002070000001375413441742745034622 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxUnsignedInvalidTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedInvalid.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedInvalid_security.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedInvalid_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedInvalid_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxUnsignedInvalid.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "SandboxUnsignedInvalid.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/SandboxUnsignedAllPerm0000644000000000000000000000013213441742745024506 xustar0030 mtime=1552401893.128832638 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/0000755000175000002070000000000013441742745025373 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026520 xustar0030 mtime=1552401893.159832573 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/0000755000175000002070000000000013441742745027405 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000031113441742745030603 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm.jnlp 30 mtime=1552401893.135832623 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm.jnl0000644000175000002070000000426613441742745034472 0ustar00jvanekmock00000000000000 SandboxUnsignedAllPerm IcedTea SandboxUnsignedAllPerm icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000032213441742745030605 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm_security.jnlp 30 mtime=1552401893.159832573 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm_sec0000644000175000002070000000436413441742745034541 0ustar00jvanekmock00000000000000 SandboxUnsignedAllPerm IcedTea SandboxUnsignedAllPerm icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000032013441742745030603 xustar00118 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm_applet.jnlp 30 mtime=1552401893.124832646 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm_app0000644000175000002070000000443313441742745034544 0ustar00jvanekmock00000000000000 SandboxUnsignedAllPerm IcedTea SandboxUnsignedAllPerm icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000031113441742745030603 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm.html 30 mtime=1552401893.131832631 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm.htm0000644000175000002070000000345113441742745034472 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/PaxHeaders.7406/SandboxUns0000644000000000000000000000033113441742745030605 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm_applet_security.jnlp 30 mtime=1552401893.133832627 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm_app0000644000175000002070000000455113441742745034545 0ustar00jvanekmock00000000000000 SandboxUnsignedAllPerm IcedTea SandboxUnsignedAllPerm icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025460 xustar0030 mtime=1552401893.142832609 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/srcs/0000755000175000002070000000000013441742745026345 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013213441742745026620 xustar0030 mtime=1552401893.142832609 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/srcs/META-INF/0000755000175000002070000000000013441742745027505 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/srcs/META-INF/PaxHeaders.7406/MANIFE0000644000000000000000000000013213441742745027557 xustar0030 mtime=1552401893.142832609 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/srcs/META-INF/MANIFEST.MF0000644000175000002070000000006413441742745031137 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Permissions: all-permissions icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/srcs/PaxHeaders.7406/SandboxUnsigned0000644000000000000000000000013213441742745030553 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/srcs/SandboxUnsignedAllPerm.java0000644000175000002070000000406313441742745033563 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxUnsignedAllPerm extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026504 xustar0030 mtime=1552401893.128832638 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/testcases/0000755000175000002070000000000013441742745027371 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/testcases/PaxHeaders.7406/SandboxUns0000644000000000000000000000031513441742745030573 xustar00115 path=icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/testcases/SandboxUnsignedAllPermTest.java 30 mtime=1552401893.128832638 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SandboxUnsignedAllPerm/testcases/SandboxUnsignedAllPermTest0000644000175000002070000001366213441742745034534 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxUnsignedAllPermTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException { dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException { dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedAllPerm.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedAllPerm_security.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "SandboxUnsignedAllPerm_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); //applets have exception flused only in verbose mode? strange... } @Test public void javawsAppletAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("SandboxUnsignedAllPerm_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception { server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxUnsignedAllPerm.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "SandboxUnsignedAllPerm.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/SOPBypass0000644000000000000000000000013113441742745021760 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/0000755000175000002070000000000013441742745022646 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SOPBypass/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745023757 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/0000755000175000002070000000000013441742745024644 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/PaxHeaders.7406/sopbypasstests0000644000000000000000000000013213441742745027065 xustar0030 mtime=1552401893.158832575 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/0000755000175000002070000000000013441742745027752 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/PaxHeaders.7406/SOPBypas0000644000000000000000000000031413441742745030527 xustar00114 path=icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassHtmlAppletTest.java 30 mtime=1552401893.134832625 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassHtmlAppletTest.0000644000175000002070000002741213441742745034437 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sopbypasstests; import org.junit.Test; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import static sopbypasstests.SOPBypassUtil.*; public class SOPBypassHtmlAppletTest extends SOPBypassBeforeAndAfterChunks { @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalAbsoluteArchiveLocalPathCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", server.getUrl("SOPBypass.jar"), server.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalAbsoluteArchiveUnrelatedRemoteCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", server.getUrl("SOPBypass.jar"), serverC.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveSameRemoteCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverC.getUrl("SOPBypass.jar"), serverC.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverC); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverC); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveUnrelatedRemoteCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverB.getUrl("SOPBypass.jar"), serverC.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveLocalPathCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverB.getUrl("SOPBypass.jar"), server.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveLocalDotCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverB.getUrl("SOPBypass.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveNoCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverB.getUrl("SOPBypass.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalAbsoluteArchiveNoCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", server.getUrl("SOPBypass.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalRelativeArchiveNoCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalRelativeArchiveUnrelatedRemoteCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", serverC.getUrl(), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalAbsoluteArchiveLocalDotCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", server.getUrl("SOPBypass.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalRelativeArchiveLocalPathCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", server.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalRelativeArchiveLocalDotCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteRelativeArchiveSameRemoteCodebase_HAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", serverC.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } public ProcessResult performTest(TemplatedHtmlDoc templatedDoc) throws Exception { ProcessResult pr = server.executeBrowser(templatedDoc.getFileName(), ServerAccess.AutoClose.CLOSE_ON_CORRECT_END); assertStart(pr); assertEnd(pr); assertUnprivileged(pr); return pr; } } icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/PaxHeaders.7406/SOPBypas0000644000000000000000000000032213441742745030526 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpAppletTest.java 30 mtime=1552401893.142832609 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpApple0000644000175000002070000002414413441742745034465 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sopbypasstests; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import java.io.File; import java.net.MalformedURLException; import static sopbypasstests.SOPBypassUtil.*; public class SOPBypassSignedJnlpAppletTest extends SOPBypassBeforeAndAfterChunks { @Test @NeedsDisplay public void testLocalAbsoluteArchiveLocalPathCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", server.getUrl("SOPBypassSigned.jar"), server.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveUnrelatedRemoteCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", server.getUrl("SOPBypassSigned.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveSameRemoteCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", serverC.getUrl("SOPBypassSigned.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveUnrelatedRemoteCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", serverB.getUrl("SOPBypassSigned.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveLocalPathCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", serverB.getUrl("SOPBypassSigned.jar"), server.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveLocalDotCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", serverB.getUrl("SOPBypassSigned.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveNoCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", serverB.getUrl("SOPBypassSigned.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveNoCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", server.getUrl("SOPBypassSigned.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveNoCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", "SOPBypassSigned.jar", (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveUnrelatedRemoteCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", "SOPBypassSigned.jar", serverC.getUrl(), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveLocalDotCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", server.getUrl("SOPBypassSigned.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveLocalPathCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", "SOPBypassSigned.jar", server.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveLocalDotCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", "SOPBypassSigned.jar", ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testRemoteRelativeArchiveSameRemoteCodebase_SJAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypassSigned.jnlp", "SOPBypassSigned.jar", serverC.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } public ProcessResult performTest(TemplatedJnlpDoc templatedDoc) throws Exception { ProcessResult pr = server.executeJavawsHeadless(templatedDoc.getFileName(), getClosingListener(), null); assertStart(pr); assertEnd(pr); assertPrivileged(pr); return pr; } } icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/PaxHeaders.7406/SOPBypas0000644000000000000000000000032213441742745030526 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedHtmlAppletTest.java 30 mtime=1552401893.158832575 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedHtmlApple0000644000175000002070000002523013441742745034463 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sopbypasstests; import org.junit.Test; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.ProcessResult; import static sopbypasstests.SOPBypassUtil.*; public class SOPBypassSignedHtmlAppletTest extends SOPBypassBeforeAndAfterChunks { @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalAbsoluteArchiveLocalPathCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", server.getUrl("SOPBypassSigned.jar"), server.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalAbsoluteArchiveUnrelatedRemoteCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", server.getUrl("SOPBypassSigned.jar"), serverC.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveSameRemoteCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverC.getUrl("SOPBypassSigned.jar"), serverC.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveUnrelatedRemoteCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverB.getUrl("SOPBypassSigned.jar"), serverC.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveLocalPathCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverB.getUrl("SOPBypassSigned.jar"), server.getUrl("codebase"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveLocalDotCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverB.getUrl("SOPBypassSigned.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteAbsoluteArchiveNoCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverB.getUrl("SOPBypassSigned.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalAbsoluteArchiveNoCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", server.getUrl("SOPBypassSigned.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalRelativeArchiveNoCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalRelativeArchiveUnrelatedRemoteCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", serverC.getUrl(), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalAbsoluteArchiveLocalDotCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", server.getUrl("SOPBypassSigned.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalRelativeArchiveLocalPathCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", server.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testLocalRelativeArchiveLocalDotCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void testRemoteRelativeArchiveSameRemoteCodebase_SHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", serverC.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } public ProcessResult performTest(TemplatedHtmlDoc templatedDoc) throws Exception { ProcessResult pr = server.executeBrowser(templatedDoc.getFileName(), getClosingListener(), null); assertStart(pr); assertEnd(pr); assertPrivileged(pr); return pr; } } icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/PaxHeaders.7406/SOPBypas0000644000000000000000000000031413441742745030527 xustar00114 path=icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTest.java 30 mtime=1552401893.124832646 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTest.0000644000175000002070000002532213441742745034434 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sopbypasstests; import org.junit.Test; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.ProcessResult; import static sopbypasstests.SOPBypassUtil.*; public class SOPBypassJnlpAppletTest extends SOPBypassBeforeAndAfterChunks { @Test @NeedsDisplay public void testLocalAbsoluteArchiveLocalPathCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", server.getUrl("SOPBypass.jar"), server.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveUnrelatedRemoteCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", server.getUrl("SOPBypass.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveSameRemoteCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", serverC.getUrl("SOPBypass.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverC); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverC); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveUnrelatedRemoteCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", serverB.getUrl("SOPBypass.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveLocalPathCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", serverB.getUrl("SOPBypass.jar"), server.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveLocalDotCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", serverB.getUrl("SOPBypass.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveNoCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", serverB.getUrl("SOPBypass.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveNoCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", server.getUrl("SOPBypass.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveNoCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", "SOPBypass.jar", (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveUnrelatedRemoteCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", "SOPBypass.jar", serverC.getUrl(), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveLocalDotCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", server.getUrl("SOPBypass.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveLocalPathCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", "SOPBypass.jar", server.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveLocalDotCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", "SOPBypass.jar", ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testRemoteRelativeArchiveSameRemoteCodebase_JAT() throws Exception { TemplatedJnlpDoc templatedDoc = filterJnlp("SOPBypass.jnlp", "SOPBypass.jar", serverC.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } public ProcessResult performTest(TemplatedJnlpDoc templatedDoc) throws Exception { ProcessResult pr = server.executeJavawsHeadless(templatedDoc.getFileName(), getClosingListener(), null); assertStart(pr); assertEnd(pr); assertUnprivileged(pr); return pr; } } icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/PaxHeaders.7406/SOPBypas0000644000000000000000000000034013441742745030526 xustar00134 path=icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpAppletTestWithHtmlSwitch.java 30 mtime=1552401893.126832642 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpApple0000644000175000002070000002377213441742745034473 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sopbypasstests; import org.junit.Test; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.ProcessResult; import java.util.Collections; import static sopbypasstests.SOPBypassUtil.*; public class SOPBypassSignedJnlpAppletTestWithHtmlSwitch extends SOPBypassBeforeAndAfterChunks { @Test @NeedsDisplay public void testLocalAbsoluteArchiveLocalPathCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", server.getUrl("SOPBypassSigned.jar"), server.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveUnrelatedRemoteCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", server.getUrl("SOPBypassSigned.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveSameRemoteCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverC.getUrl("SOPBypassSigned.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveUnrelatedRemoteCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverB.getUrl("SOPBypassSigned.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveLocalPathCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverB.getUrl("SOPBypassSigned.jar"), server.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveLocalDotCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverB.getUrl("SOPBypassSigned.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveNoCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", serverB.getUrl("SOPBypassSigned.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverB); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveNoCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", server.getUrl("SOPBypassSigned.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveNoCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveUnrelatedRemoteCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", serverC.getUrl(), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveLocalDotCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", server.getUrl("SOPBypassSigned.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveLocalPathCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", server.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveLocalDotCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testRemoteRelativeArchiveSameRemoteCodebase_SJHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypassSigned.html", "SOPBypassSigned", "SOPBypassSigned.jar", serverC.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } public ProcessResult performTest(TemplatedHtmlDoc templatedDoc) throws Exception { ProcessResult pr = server.executeJavawsHeadless(Collections.singletonList("-html"), templatedDoc.getFileName(), getClosingListener(), null, null); assertStart(pr); assertEnd(pr); assertPrivileged(pr); return pr; } } icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/PaxHeaders.7406/SOPBypas0000644000000000000000000000032213441742745030526 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassBeforeAndAfterChunks.java 30 mtime=1552401893.131832631 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassBeforeAndAfterC0000644000175000002070000001115413441742745034355 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sopbypasstests; import org.junit.AfterClass; import org.junit.BeforeClass; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import java.io.File; import java.net.MalformedURLException; import java.util.AbstractMap; import org.junit.Test; public class SOPBypassBeforeAndAfterChunks extends BrowserTest { public static ServerLauncher serverA; public static ServerLauncher serverB; public static ServerLauncher serverC; private static final DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier mod = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier( new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.NONE.name()), new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.name()), //we need verbose output to catch PermissionDenied itw is printing new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_ENABLE_LOGGING, "true") ); private static final DeploymentPropertiesModifier mod2 = new DeploymentPropertiesModifier(); @Test public void SOPBypassBeforeAndAfterChunks(){ //each testcase class must have test } @BeforeClass public static void setup() throws Exception { serverA = ServerAccess.getIndependentInstance(); serverB = ServerAccess.getIndependentInstance(); serverC = ServerAccess.getIndependentInstance(); serverA.setServerNaming(ServerLauncher.ServerNaming.HOSTNAME); serverB.setServerNaming(ServerLauncher.ServerNaming.HOSTNAME); serverC.setServerNaming(ServerLauncher.ServerNaming.HOSTNAME); ServerAccess.getInstance().setServerNaming(ServerLauncher.ServerNaming.HOSTNAME); File file = mod.src.getFile(); if (!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } mod.setProperties(); } @AfterClass public static void teardown() throws Exception { ServerAccess.getInstance().setServerNaming(ServerLauncher.ServerNaming.LOCALHOST); //must always! mod.restoreProperties(); serverA.stop(); serverB.stop(); serverC.stop(); } public static String getUnrelatedServer() throws MalformedURLException { return unrelatedInstance().getUrl().toExternalForm(); } static ServerLauncher unrelatedInstance() { return serverA; } static ServerLauncher serverInstance() { //should be same as server from BrowserTest return ServerAccess.getInstance(); } } icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/PaxHeaders.7406/SOPBypas0000644000000000000000000000013213441742745030525 xustar0030 mtime=1552401893.128832638 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassUtil.java0000644000175000002070000011561413441742745033306 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sopbypasstests; import org.junit.Test; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.ClosingListener; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import java.net.URL; import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.UnknownHostException; import java.util.List; import java.util.regex.Pattern; import net.sourceforge.jnlp.ServerLauncher; import org.junit.Assert; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; /** * To workaround ignorance of AccessDenied exception from calls from localhost * to localhost the check on pass fail is done in different way. If connection * is not expected, then no security exception is allowed to appear nor "Denying * permissions ..." string is allowed to appear. If connection is expected, then * appearance of security exception or "Denying permissions ..." string is * considered as failure. * */ public class SOPBypassUtil extends BrowserTest { public static final String APPLET_START_STRING = "Applet Started"; public static final String APPLET_CLOSE_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; public static final String URL_CONNECTION_PREFIX = "URLConnection"; public static final String SOCKET_CONNECTION_PREFIX = "SocketConnection"; public static final String CONNECTION_DELIMITER = ":"; public static final String CODEBASE = "codeBase"; public static final String DOCUMENTBASE = "documentBase"; public static final String UNRELATED = "unrelated"; public static final String RESOURCES = "resource's"; public static final String SUCCESS = " true"; public static final String FAILURE = " false"; public static final String URL_CODEBASE = URL_CONNECTION_PREFIX + CONNECTION_DELIMITER + CODEBASE; public static final String URL_CODEBASE_SUCCESS = URL_CODEBASE + SUCCESS; public static final String URL_CODEBASE_FAILURE = URL_CODEBASE + FAILURE; public static final String URL_DOCUMENTBASE = URL_CONNECTION_PREFIX + CONNECTION_DELIMITER + DOCUMENTBASE; public static final String URL_DOCUMENTBASE_SUCCESS = URL_DOCUMENTBASE + SUCCESS; public static final String URL_DOCUMENTBASE_FAILURE = URL_DOCUMENTBASE + FAILURE; public static final String SOCKET_CODEBASE = SOCKET_CONNECTION_PREFIX + CONNECTION_DELIMITER + CODEBASE; public static final String SOCKET_CODEBASE_SUCCESS = SOCKET_CODEBASE + SUCCESS; public static final String SOCKET_CODEBASE_FAILURE = SOCKET_CODEBASE + FAILURE; public static final String SOCKET_DOCUMENTBASE = SOCKET_CONNECTION_PREFIX + CONNECTION_DELIMITER + DOCUMENTBASE; public static final String SOCKET_DOCUMENTBASE_SUCCESS = SOCKET_DOCUMENTBASE + SUCCESS; public static final String SOCKET_DOCUMENTBASE_FAILURE = SOCKET_DOCUMENTBASE + FAILURE; public static final String URL_UNRELATED = URL_CONNECTION_PREFIX + CONNECTION_DELIMITER + UNRELATED; public static final String URL_UNRELATED_SUCCESS = URL_UNRELATED + SUCCESS; public static final String URL_UNRELATED_FAILURE = URL_UNRELATED + FAILURE; public static final String SOCKET_UNRELATED = SOCKET_CONNECTION_PREFIX + CONNECTION_DELIMITER + UNRELATED; public static final String SOCKET_UNRELATED_SUCCESS = SOCKET_UNRELATED + SUCCESS; public static final String SOCKET_UNRELATED_FAILURE = SOCKET_UNRELATED + FAILURE; public static final String URL_RESOURCES = URL_CONNECTION_PREFIX + CONNECTION_DELIMITER + RESOURCES; public static final String URL_RESOURCES_SUCCESS = URL_RESOURCES + SUCCESS; public static final String URL_RESOURCES_FAILURE = URL_RESOURCES + FAILURE; public static final String SOCKET_RESOURCES = SOCKET_CONNECTION_PREFIX + CONNECTION_DELIMITER + RESOURCES; public static final String SOCKET_RESOURCES_SUCCESS = SOCKET_RESOURCES + SUCCESS; public static final String SOCKET_RESOURCES_FAILURE = SOCKET_RESOURCES + FAILURE; public static TemplatedHtmlDoc filterHtml(String doc, String code, String archive, String codebase, String unrelatedServer) throws IOException { printDevMessage("html: code: " + code + ", archive: " + archive + ", codebase: " + codebase + ", unrelated: " + unrelatedServer); TemplatedHtmlDoc templatedDoc = new TemplatedHtmlDoc(server, doc); templatedDoc.setCode(code); templatedDoc.setArchive(archive); templatedDoc.setCodeBase(codebase); String s = templatedDoc.setAppletParams(unrelatedServer, templatedDoc.getFileName(), archive); printDevMessage(s); assertFalse(templatedDoc.toString(), templatedDoc.toString().contains("TOKEN")); templatedDoc.save(); String content = server.getResourceAsString(templatedDoc.getFileName()); assertFalse(content, content.contains("TOKEN")); return templatedDoc; } public static TemplatedHtmlDoc filterHtml(String doc, String code, URL archive, URL codebase, String unrelatedServer) throws IOException { return filterHtml(doc, code, archive == null ? "" : archive.toString(), codebase == null ? "" : codebase.toString(), unrelatedServer); } public static TemplatedHtmlDoc filterHtml(String doc, String code, URL archive, String codebase, String unrelatedServer) throws IOException { return filterHtml(doc, code, archive == null ? "" : archive.toString(), codebase, unrelatedServer); } public static TemplatedHtmlDoc filterHtml(String doc, String code, String archive, URL codebase, String unrelatedServer) throws IOException { return filterHtml(doc, code, archive, codebase == null ? "" : codebase.toString(), unrelatedServer); } public static TemplatedJnlpDoc filterJnlp(String doc, String jarHref, String codebase, String unrelatedServer) throws IOException { printDevMessage("jnlp: doc: " + doc + ", archive: " + jarHref + ", codebase: " + codebase + ", unrelated: " + unrelatedServer); TemplatedJnlpDoc templatedDoc = new TemplatedJnlpDoc(server, doc); templatedDoc.setJarHref(jarHref); templatedDoc.setCodeBase(codebase); String s = templatedDoc.setAppletParams(unrelatedServer, templatedDoc.getFileName(), jarHref); printDevMessage(s); templatedDoc.setDocumentBase(server.getUrl("SOPBypass.jnlp").toString()); assertFalse(templatedDoc.toString(), templatedDoc.toString().contains("TOKEN")); templatedDoc.save(); String content = server.getResourceAsString(templatedDoc.getFileName()); assertFalse(content, content.contains("TOKEN")); return templatedDoc; } public static TemplatedJnlpDoc filterJnlp(String doc, URL archive, URL codebase, String unrelatedServer) throws IOException { return filterJnlp(doc, archive == null ? "" : archive.toString(), codebase == null ? "" : codebase.toString(), unrelatedServer); } public static TemplatedJnlpDoc filterJnlp(String doc, URL archive, String codebase, String unrelatedServer) throws IOException { return filterJnlp(doc, archive == null ? "" : archive.toString(), codebase, unrelatedServer); } public static TemplatedJnlpDoc filterJnlp(String doc, String archive, URL codebase, String unrelatedServer) throws IOException { return filterJnlp(doc, archive, codebase == null ? "" : codebase.toString(), unrelatedServer); } public static ClosingListener getClosingListener() { RulesFolowingClosingListener listener = new RulesFolowingClosingListener(); listener.addContainsRule(APPLET_START_STRING); listener.addContainsRule(APPLET_CLOSE_STRING); return listener; } public static void assertStart(ProcessResult pr) { assertTrue("Applet did not start", pr.stdout.contains(APPLET_START_STRING)); } public static void assertEnd(ProcessResult pr) { assertTrue("Applet did not close correctly", pr.stdout.contains(APPLET_CLOSE_STRING)); } public static void assertPrivileged(ProcessResult pr) { assertTrue("Applet should have had privileges to read system properties", pr.stdout.contains("Elevated privileges: true")); } public static void assertUnprivileged(ProcessResult pr) { assertTrue("Applet should have had privileges to read system properties", pr.stdout.contains("Elevated privileges: false")); } public static void assertCodebaseConnection(ProcessResult pr, ServerLauncher codebaseLocalhost) throws MalformedURLException, UnknownHostException { codebaseImpl(true, true, true, pr, codebaseLocalhost); } public static void codebaseImpl(boolean url, boolean socket, boolean b, ProcessResult pr, ServerLauncher codebaseLocalhost) throws UnknownHostException, MalformedURLException { printDevMessage("Codebase " + b); if (url) { printDevMessage("Url"); assertUrlCodebase(pr, b, codebaseLocalhost); } if (socket) { printDevMessage("Socket"); assertSocketCodebase(pr, b, codebaseLocalhost); } } public static void assertNoCodebaseConnection(ProcessResult pr, ServerLauncher codebaseLocalhost) throws MalformedURLException, UnknownHostException { codebaseImpl(true, true, false, pr, codebaseLocalhost); } public static void assertUrlCodebase(ProcessResult pr, boolean b, ServerLauncher codebaseLocalhost) throws MalformedURLException, UnknownHostException { assertTrue(URL_CODEBASE, pr.stdout.contains(URL_CODEBASE)); int i = countStrings(pr.stdout, SOCKET_RESOURCES, URL_CODEBASE, denyingUrlPermissions(codebaseLocalhost)); String expected; if (b) { expected = URL_CODEBASE_SUCCESS; } else { expected = URL_CODEBASE_FAILURE; } evaluate(codebaseLocalhost, b, i, expected, pr); } public static void assertSocketCodebase(ProcessResult pr, boolean b, ServerLauncher codebaseLocalhost) throws MalformedURLException, UnknownHostException { assertTrue(SOCKET_CODEBASE, pr.stdout.contains(SOCKET_CODEBASE)); int i = countStrings(pr.stdout, null, SOCKET_CODEBASE, denyingSocketPermissions(codebaseLocalhost)); String expected; if (b) { expected = SOCKET_CODEBASE_SUCCESS; } else { expected = SOCKET_CODEBASE_FAILURE; } evaluate(codebaseLocalhost, b, i, expected, pr); } public static void assertDocumentBaseConnection(ProcessResult pr, ServerLauncher documentBaseLocalhost) throws MalformedURLException, UnknownHostException { docbaseImpl(true, true, true, pr, documentBaseLocalhost); } public static void docbaseImpl(boolean url, boolean socket, boolean b, ProcessResult pr, ServerLauncher documentBaseLocalhost) throws MalformedURLException, UnknownHostException { printDevMessage("Docbase " + b); if (url) { printDevMessage("Url"); assertUrlDocumentBase(pr, b, documentBaseLocalhost); } if (socket) { printDevMessage("Socket"); assertSocketDocumentBase(pr, b, documentBaseLocalhost); } } public static void assertNoDocumentBaseConnection(ProcessResult pr, ServerLauncher documentBaseLocalhost) throws MalformedURLException, UnknownHostException { docbaseImpl(true, true, false, pr, documentBaseLocalhost); } public static void assertUrlDocumentBase(ProcessResult pr, boolean b, ServerLauncher documentBaseLocalhost) throws MalformedURLException, UnknownHostException { assertTrue(URL_DOCUMENTBASE, pr.stdout.contains(URL_DOCUMENTBASE)); int i = countStrings(pr.stdout, URL_CODEBASE, URL_DOCUMENTBASE, denyingUrlPermissions(documentBaseLocalhost)); String expected; if (b) { expected = URL_DOCUMENTBASE_SUCCESS; } else { expected = URL_DOCUMENTBASE_FAILURE; } evaluate(documentBaseLocalhost, b, i, expected, pr); } public static void assertSocketDocumentBase(ProcessResult pr, boolean b, ServerLauncher documentBaseLocalhost) throws MalformedURLException, UnknownHostException { assertTrue(SOCKET_DOCUMENTBASE, pr.stdout.contains(SOCKET_DOCUMENTBASE)); int i = countStrings(pr.stdout, SOCKET_CODEBASE, SOCKET_DOCUMENTBASE, denyingSocketPermissions(documentBaseLocalhost)); String expected; if (b) { expected = SOCKET_DOCUMENTBASE_SUCCESS; } else { expected = SOCKET_DOCUMENTBASE_FAILURE; } evaluate(documentBaseLocalhost, b, i, expected, pr); } public static void assertUnrelatedConnection(ProcessResult pr, ServerLauncher unrelatedLocalhost) throws MalformedURLException, UnknownHostException { unrelatedImpl(true, true, true, pr, unrelatedLocalhost); } public static void unrelatedImpl(boolean url, boolean socket, boolean b, ProcessResult pr, ServerLauncher unrelatedLocalhost) throws MalformedURLException, UnknownHostException { printDevMessage("Unrelated " + b); if (url) { printDevMessage("Url"); assertUnrelatedUrlConnection(pr, b, unrelatedLocalhost); } if (socket) { printDevMessage("Socket"); assertUnrelatedSocketConnection(pr, b, unrelatedLocalhost); } } public static void assertNoUnrelatedConnection(ProcessResult pr, ServerLauncher unrelatedLocalhost) throws MalformedURLException, UnknownHostException { unrelatedImpl(true, true, false, pr, unrelatedLocalhost); } public static void assertUnrelatedUrlConnection(ProcessResult pr, boolean b, ServerLauncher unrelatedLocalhost) throws MalformedURLException, UnknownHostException { assertTrue(URL_UNRELATED, pr.stdout.contains(URL_UNRELATED)); int i = countStrings(pr.stdout, URL_DOCUMENTBASE, URL_UNRELATED, denyingUrlPermissions(unrelatedLocalhost)); String expected; if (b) { expected = URL_UNRELATED_SUCCESS; } else { expected = URL_UNRELATED_FAILURE; } evaluate(unrelatedLocalhost, b, i, expected, pr); } public static void assertUnrelatedSocketConnection(ProcessResult pr, boolean b, ServerLauncher unrelatedLocalhost) throws MalformedURLException, UnknownHostException { assertTrue(SOCKET_UNRELATED, pr.stdout.contains(SOCKET_UNRELATED)); int i = countStrings(pr.stdout, SOCKET_DOCUMENTBASE, SOCKET_UNRELATED, denyingSocketPermissions(unrelatedLocalhost)); String expected; if (b) { expected = SOCKET_UNRELATED_SUCCESS; } else { expected = SOCKET_UNRELATED_FAILURE; } evaluate(unrelatedLocalhost, b, i, expected, pr); } public static void assertResourcesConnection(ProcessResult pr, ServerLauncher resourcesLocalhost) throws MalformedURLException, UnknownHostException { resourcesImpl(true, true, true, pr, resourcesLocalhost); } public static void resourcesImpl(boolean url, boolean socket, boolean b, ProcessResult pr, ServerLauncher resourcesLocalhost) throws MalformedURLException, UnknownHostException { printDevMessage("Resource's " + b); if (url) { printDevMessage("Url"); assertResourcesUrlConnection(pr, b, resourcesLocalhost); } if (socket) { printDevMessage("Socket"); assertResourcesSocketConnection(pr, b, resourcesLocalhost); } } public static void assertNoResourcesConnection(ProcessResult pr, ServerLauncher resourcesLocalhost) throws MalformedURLException, UnknownHostException { resourcesImpl(true, true, false, pr, resourcesLocalhost); } public static void assertResourcesUrlConnection(ProcessResult pr, boolean b, ServerLauncher resourcesLocalhost) throws MalformedURLException, UnknownHostException { assertTrue(URL_RESOURCES, pr.stdout.contains(URL_UNRELATED)); int i = countStrings(pr.stdout, URL_UNRELATED, URL_RESOURCES, denyingUrlPermissions(resourcesLocalhost)); String expected; if (b) { expected = URL_RESOURCES_SUCCESS; } else { expected = URL_RESOURCES_FAILURE; } evaluate(resourcesLocalhost, b, i, expected, pr); } public static void assertResourcesSocketConnection(ProcessResult pr, boolean b, ServerLauncher resourcesLocalhost) throws MalformedURLException, UnknownHostException { assertTrue(SOCKET_UNRELATED, pr.stdout.contains(SOCKET_UNRELATED)); int i = countStrings(pr.stdout, SOCKET_UNRELATED, SOCKET_RESOURCES, denyingSocketPermissions(resourcesLocalhost)); String expected; if (b) { expected = SOCKET_RESOURCES_SUCCESS; } else { expected = SOCKET_RESOURCES_FAILURE; } evaluate(resourcesLocalhost, b, i, expected, pr); } /** * This is tricky nasty method. Issue with testing this reproducer on * localhost rise, when jdk built shortcut for localhost connections. So the * itw's checkPermission of jnlpclasslaoder is called, but jdk happily * consume this. So for some connections the exception is thrown, and resutl * is in assertAchieved, some just report, and result is in assertCounts * Thats also why somtetimes it OR and sometimes AND between connections. * When connection is expected (b == true) then only one failure is enough * to make the test fail. When connection is expected to be denied,(b == * false) then only both check must fail to result into test failure. * * @param usedServer - if null then none, if not null, then the one used for * this particular test (eg docbase, or codebase, or resoures base...) * @param b - true - should be connected, false should not be connected * @param i - hoe many occurences were counted * @param expected - expected string in app output * @param pr - processresult where to searh */ private static void evaluate(ServerLauncher usedServer, boolean b, int i, String expected, ProcessResult pr) { AssertionError f1 = null; if (usedServer != null) { f1 = assertCounts(b, i); } AssertionError f2 = assertAchieved(expected, pr); AssertionError throwme = null; if (!b) { //considering the test as failed, both conditions must fail //of course when usedServer is in play if (usedServer == null) { //otherwise the only one is enough if (f2 != null) { printDevMessage("FAILED 1!"); throwme = f2; } } else { if (f2 != null && f1 != null) { printDevMessage("FAILED 2!"); throwme = f2; } } if (throwme != null) { throw throwme; } printDevMessage("Passed 1."); } else { //considering the test as failed, one condition is enough to fail if (f1 == null && f2 != null) { printDevMessage("FAILED 3!"); throwme = f2; } if (f2 == null && f1 != null) { printDevMessage("FAILED 4!"); throwme = f1; } if (f2 != null || f1 != null) { printDevMessage("FAILED 5!"); if (f2 != null) { throwme = f2; //better one } else { throwme = f1; } } if (throwme != null) { throw throwme; } printDevMessage("Passed. 2"); } } private static AssertionError assertAchieved(String expected, ProcessResult pr) { try { assertAchievedImpl(expected, pr); } catch (AssertionError e) { return e; } return null; } private static AssertionError assertCounts(boolean b, int i) { try { assertCountsImpl(b, i); } catch (AssertionError e) { return e; } return null; } private static void assertAchievedImpl(String expected, ProcessResult pr) { assertTrue("Expected " + expected, pr.stdout.contains(expected)); } private static void assertCountsImpl(boolean b, int i) { if (b) { Assert.assertEquals("`Denying permission: (` was not expected, but occured (on subsegment) " + i + " times", 0, i); } else { Assert.assertTrue("`Denying permission: (` was expected, but did not occured (on subsegment)", i >= 1); //test and impl depndentt } } private static void printDevMessage(String string) { //System.out.println(string); } @Test public void testHtmlSetCode() throws Exception { TemplatedHtmlDoc doc = new TemplatedHtmlDoc(server, "SOPBypass.html"); assertFalse("Doc should not contain \"code=\"", doc.toString().contains("code=")); doc.setCode("foo"); assertTrue("Doc should contain \"code=\"foo\"\"", doc.toString().contains("code=\"foo\"")); } @Test public void testHtmlSetCodeEmpty() throws Exception { TemplatedHtmlDoc doc = new TemplatedHtmlDoc(server, "SOPBypass.html"); assertFalse("Doc should not contain \"code=\"", doc.toString().contains("code=")); doc.setCode(""); assertFalse("Doc should not contain \"code=\"", doc.toString().contains("code=")); } @Test public void testHtmlSetArchive() throws Exception { TemplatedHtmlDoc doc = new TemplatedHtmlDoc(server, "SOPBypass.html"); assertFalse("Doc should not contain \"archive=\"", doc.toString().contains("archive=")); doc.setArchive("foo"); assertTrue("Doc should contain \"archive=\"foo\"\"", doc.toString().contains("archive=\"foo\"")); } @Test public void testHtmlSetArchiveEmpty() throws Exception { TemplatedHtmlDoc doc = new TemplatedHtmlDoc(server, "SOPBypass.html"); assertFalse("Doc should not contain \"archive=\"", doc.toString().contains("archive=")); doc.setArchive(""); assertFalse("Doc should not contain \"archive=\"", doc.toString().contains("archive=")); } @Test public void testHtmlSetCodebase() throws Exception { TemplatedHtmlDoc doc = new TemplatedHtmlDoc(server, "SOPBypass.html"); assertFalse("Doc should not contain \"codebase=\"", doc.toString().contains("codebase=")); doc.setCodeBase("foo"); assertTrue("Doc should contain \"codebase=\"foo\"\"", doc.toString().contains("codebase=\"foo\"")); } @Test public void testHtmlSetCodebaseEmpty() throws Exception { TemplatedHtmlDoc doc = new TemplatedHtmlDoc(server, "SOPBypass.html"); assertFalse("Doc should not contain \"codebase=\"", doc.toString().contains("codebase=")); doc.setCodeBase(""); assertFalse("Doc should not contain \"codebase=\"", doc.toString().contains("codebase=")); } @Test public void testAppletParamRepalcement2() throws Exception { AppletTemplate doc = new AppletTemplate(server, "SOPBypass.html") { }; assertFalse("Doc should not contain param1", doc.toString().contains("param1")); assertFalse("Doc should not contain param2", doc.toString().contains("param2")); assertFalse("Doc should not contain param3", doc.toString().contains("param3")); doc.setAppletParams("param1", null, null); assertTrue("Doc should contain param1", doc.toString().contains("param1")); assertFalse("Doc should not contain param2", doc.toString().contains("param2")); assertFalse("Doc should not contain param3", doc.toString().contains("param3")); } @Test public void testAppletParamRepalcement1() throws Exception { AppletTemplate doc = new AppletTemplate(server, "SOPBypass.jnlp") { }; assertFalse("Doc should not contain param1", doc.toString().contains("param1")); assertFalse("Doc should not contain param2", doc.toString().contains("param2")); assertFalse("Doc should not contain param3", doc.toString().contains("param3")); doc.setAppletParams(null, "param2", null); assertFalse("Doc should not contain param1", doc.toString().contains("param1")); assertFalse("Doc should not contain param3", doc.toString().contains("param3")); assertTrue("Doc should contain param2", doc.toString().contains("param2")); } @Test public void testAppletParamRepalcement3() throws Exception { AppletTemplate doc = new AppletTemplate(server, "SOPBypass.html") { }; assertFalse("Doc should not contain param1", doc.toString().contains("param1")); assertFalse("Doc should not contain param2", doc.toString().contains("param2")); assertFalse("Doc should not contain param3", doc.toString().contains("param3")); doc.setAppletParams(null, null, null); assertFalse("Doc should not contain \"codebase=\"", doc.toString().contains("codebase=")); assertFalse("Doc should not contain param1", doc.toString().contains("param1")); assertFalse("Doc should not contain param2", doc.toString().contains("param2")); assertFalse("Doc should not contain param3", doc.toString().contains("param3")); } @Test public void testAppletParamRepalcement4() throws Exception { AppletTemplate doc = new AppletTemplate(server, "SOPBypass.jnlp") { }; assertFalse("Doc should not contain param1", doc.toString().contains("param1")); assertFalse("Doc should not contain param2", doc.toString().contains("param2")); assertFalse("Doc should not contain param3", doc.toString().contains("param3")); doc.setAppletParams("param1", "param2", "nonUrlParam"); assertTrue("Doc should contain param1", doc.toString().contains("param1")); assertTrue("Doc should contain param2", doc.toString().contains("param2")); assertFalse("Doc should not contain nonUrlParam", doc.toString().contains("nonUrlParam")); } @Test public void testAppletParamRepalcement5() throws Exception { AppletTemplate doc = new AppletTemplate(server, "SOPBypass.jnlp") { }; assertFalse("Doc should not contain param1", doc.toString().contains("param1")); assertFalse("Doc should not contain param2", doc.toString().contains("param2")); assertFalse("Doc should not contain param3", doc.toString().contains("param3")); doc.setAppletParams("param1", "param2", "http://some.url:123/somePath"); assertTrue("Doc should contain param1", doc.toString().contains("param1")); assertTrue("Doc should contain param2", doc.toString().contains("param2")); assertTrue("Doc should contain http://some.url:123", doc.toString().contains("http://some.url:123")); } public static abstract class BasicTempalte { protected final String docName; protected final ServerAccess access; protected String content = null; public BasicTempalte(ServerAccess access, String docName) throws IOException { this.docName = docName; this.access = access; content = access.getResourceAsString(docName); } @Override public String toString() { return content; } public String getFileName() { String[] parts = docName.split(Pattern.quote(".")); String name = parts[0]; String extension = parts[1]; return name + "-filtered." + extension; } public File getLocation() { return new File(access.getDir(), getFileName()); } public void save() throws IOException { //This can help with socket permissions, but is making test unstable ServerAccess.saveFile(content.replace("localhost", InetAddress.getLocalHost().getHostName()), getLocation()); printDevMessage("Replaced all localhost by " + InetAddress.getLocalHost().getHostName() + " in " + getLocation()); //ServerAccess.saveFile(content, getLocation()); } } public static abstract class AppletTemplate extends BasicTempalte { static final String CODEBASE_TOKEN = "CODEBASE_REPLACEMENT_TOKEN"; static final String APPLET_PARAMS_TOKEN = "APPLET_PARAMS_TOKEN"; public AppletTemplate(ServerAccess access, String docName) throws IOException { super(access, docName); } public String setAppletParams(String unrelatedUrl, String reachableResource, String resource) { String debug = ""; String urlParam = ""; if (unrelatedUrl != null) { urlParam = ""; debug += " passed unrelated: " + unrelatedUrl; } String resourceParam = ""; if (reachableResource != null) { resourceParam = ""; debug += " passed reachable-resource: " + reachableResource; } String resourceUrlParam = ""; String resourcesUrl = resourceToResourcesUrl(resource); if (resourcesUrl != null) { resourceUrlParam = ""; debug += " passed jar's-url: " + resourcesUrl; } String params = urlParam + "\n" + resourceParam + "\n" + resourceUrlParam + "\n"; content = content.replaceAll(APPLET_PARAMS_TOKEN, params); return debug; } private String resourceToResourcesUrl(String resource) { if (resource == null) { return null; } try { URL u = new URL(resource); String pr = u.getProtocol(); String h = u.getHost(); int po = u.getPort(); if (po == -1) { po = 80; } return pr + "://" + h + ":" + po; } catch (MalformedURLException ex) { // . name.jar or similar on-codebase-resources return null; } } } public static class TemplatedHtmlDoc extends AppletTemplate { private static final String CODE_TOKEN = "CODE_REPLACEMENT_TOKEN"; private static final String ARCHIVE_TOKEN = "ARCHIVE_REPLACEMENT_TOKEN"; private static final String NEWLINE = System.lineSeparator(); public TemplatedHtmlDoc(ServerAccess access, String resourceLocation) throws IOException { super(access, resourceLocation); } public void setCode(String code) { if (code == null || code.isEmpty()) { content = content.replaceAll(CODE_TOKEN, NEWLINE); } else { content = content.replaceAll(CODE_TOKEN, "code=\"" + code + "\"" + NEWLINE); } } public void setArchive(String archive) { if (archive == null || archive.isEmpty()) { content = content.replaceAll(ARCHIVE_TOKEN, NEWLINE); } else { content = content.replaceAll(ARCHIVE_TOKEN, "archive=\"" + archive + "\"" + NEWLINE); } } public void setCodeBase(String codeBase) { if (codeBase == null || codeBase.isEmpty()) { content = content.replaceAll(CODEBASE_TOKEN, NEWLINE); } else { content = content.replaceAll(CODEBASE_TOKEN, "codebase=\"" + codeBase + "\"" + NEWLINE); } } } public static class TemplatedJnlpDoc extends AppletTemplate { private static final String DOCUMENTBASE_TOKEN = "DOCUMENTBASE_REPLACEMENT_TOKEN"; private static final String JAR_TOKEN = "JAR_HREF_REPLACEMENT_TOKEN"; public TemplatedJnlpDoc(ServerAccess access, String resourceLocation) throws IOException { super(access, resourceLocation); } public void setDocumentBase(String documentBase) { String replacement; if (documentBase == null || documentBase.isEmpty()) { replacement = "."; } else { replacement = documentBase; } content = content.replaceAll(DOCUMENTBASE_TOKEN, replacement); } public void setCodeBase(String codeBase) { String replacement; if (codeBase == null || codeBase.isEmpty()) { replacement = "."; } else { replacement = codeBase; } content = content.replaceAll(CODEBASE_TOKEN, replacement); } public void setJarHref(String jarHref) { content = content.replaceAll(JAR_TOKEN, jarHref); } } @Test public void countStringsTests() { int c = countString("hello bayby", "Hello bayby!\n" + "How hello bayby are you. hello bayby is my word!\n" + "So hello bayby. please promiss hell\n" + "best regards, hello bayby"); Assert.assertEquals(4, c); } @Test public void countStringsAnchorsTests() { int c1 = countString("1", "1231567190"); Assert.assertEquals(3, c1); int c2 = countString("1", "1231567190", 2, 6); Assert.assertEquals(1, c2); int c3 = countString("1", "1231567190", "2", "0"); Assert.assertEquals(2, c3); c3 = countString("1", "1231567190", "3", "9"); Assert.assertEquals(2, c3); c3 = countString("1", "1231567190", "3", "7"); Assert.assertEquals(1, c3); c3 = countString("1", "1231567190", "5", "7"); Assert.assertEquals(0, c3); c3 = countString("1", "1231567190", "6", "7"); Assert.assertEquals(0, c3); c3 = countString("1", "1231567190", null, "7"); Assert.assertEquals(2, c3); c3 = countString("1", "1231567190", "3", null); Assert.assertEquals(2, c3); c3 = countString("1", "1231567190", null, null); Assert.assertEquals(3, c3); c3 = countStrings("1231567190", null, null, "2", "3", "4", "5", "8", "0"); Assert.assertEquals(3, c3); } public static int countStrings(String where, String fromAnchor, String toAnchor, String... what) { int count = 0; for (String string : what) { count += countString(string, where, fromAnchor, toAnchor); } return count; } public static int countString(String what, String where, String fromAnchor, String toAnchor) { int i1 = 0; if (fromAnchor != null) { i1 = where.indexOf(fromAnchor); } if (i1 < 0) { i1 = 0; } int i2 = 0; if (toAnchor != null) { if (fromAnchor != null) { i2 = where.indexOf(toAnchor, i1 + fromAnchor.length() - 1); } else { i2 = where.indexOf(toAnchor); } } if (i2 <= i1) { i2 = where.length() - 1; } return countString(what, where, i1, i2); } public static int countString(String what, String where, int from, int to) { return countString(what, where.substring(from, to)); } public static int countString(String what, String where) { int lastIndex = 0; int count = 0; while (lastIndex != -1) { lastIndex = where.indexOf(what, lastIndex); if (lastIndex != -1) { count++; lastIndex += what.length(); } } return count; } public static String[] denyingUrlPermissions(ServerLauncher s) throws MalformedURLException, UnknownHostException { if (s == null) { return new String[0]; } List l = s.getUrlAliases(""); //we never know which will be evaulated against permissiion String[] r = new String[l.size()]; for (int i = 0; i < l.size(); i++) { URL url = l.get(i); r[i] = denyingUrlPermission(url.toExternalForm()); } return r; } public static String[] denyingSocketPermissions(ServerLauncher s) throws MalformedURLException, UnknownHostException { if (s == null) { return new String[0]; } List l = s.getUrlAliases(""); //we never know which will be evaulated against permissiion String[] r = new String[l.size()]; for (int i = 0; i < l.size(); i++) { URL url = l.get(i); r[i] = denyingSocektPermission(url.toExternalForm()); } return r; } public static String denyingPermission(String permission, String url) { //Denying permission: ("java.net.URLPermission" "http://localhost:37271/codebase/" "GET:") //Denying permission: ("java.net.SocketPermission" "127.0.0.1:60036" "connect,resolve") return "Denying permission: (\"" + permission + "\" \"" + url; } public static String denyingUrlPermission(String address) { //Denying permission: ("java.net.URLPermission" "http://localhost:37271/codebase/" "GET:") return denyingPermission("java.net.URLPermission", address.replaceAll("/$", "")); } public static String denyingSocektPermission(String address) { //Denying permission: ("java.net.SocketPermission" "127.0.0.1:60036" "connect,resolve") return denyingPermission("java.net.SocketPermission", address.replaceAll("http.*://", "").replaceAll("/$", "")); } } icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/PaxHeaders.7406/SOPBypas0000644000000000000000000000033113441742745030526 xustar00128 path=icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTestWithHtmlSwitch.java 29 mtime=1552401893.13283263 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTestW0000644000175000002070000002565513441742745034516 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sopbypasstests; import org.junit.Test; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.ProcessResult; import java.util.Collections; import static sopbypasstests.SOPBypassUtil.*; public class SOPBypassJnlpAppletTestWithHtmlSwitch extends SOPBypassBeforeAndAfterChunks { @Test @NeedsDisplay public void testLocalAbsoluteArchiveLocalPathCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", server.getUrl("SOPBypass.jar"), server.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveUnrelatedRemoteCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", server.getUrl("SOPBypass.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveSameRemoteCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverC.getUrl("SOPBypass.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverC); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverC); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveUnrelatedRemoteCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverB.getUrl("SOPBypass.jar"), serverC.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveLocalPathCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverB.getUrl("SOPBypass.jar"), server.getUrl("."), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveLocalDotCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverB.getUrl("SOPBypass.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay public void testRemoteAbsoluteArchiveNoCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", serverB.getUrl("SOPBypass.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverB); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverB); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveNoCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", server.getUrl("SOPBypass.jar"), (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveNoCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", (String) null, getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveUnrelatedRemoteCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", serverC.getUrl(), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } @Test @NeedsDisplay public void testLocalAbsoluteArchiveLocalDotCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", server.getUrl("SOPBypass.jar"), ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); //assertResourcesConnection(pr, serverInstance()); //for some reason, url connection is heving permission denied resourcesImpl(false, true, true, pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveLocalPathCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", server.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testLocalRelativeArchiveLocalDotCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", ".", getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverInstance()); assertDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverInstance()); } @Test @NeedsDisplay public void testRemoteRelativeArchiveSameRemoteCodebase_JHAT() throws Exception { TemplatedHtmlDoc templatedDoc = filterHtml("SOPBypass.html", "SOPBypass", "SOPBypass.jar", serverC.getUrl("/"), getUnrelatedServer()); ProcessResult pr = performTest(templatedDoc); assertCodebaseConnection(pr, serverC); assertNoDocumentBaseConnection(pr, serverInstance()); assertNoUnrelatedConnection(pr, unrelatedInstance()); assertResourcesConnection(pr, serverC); } public ProcessResult performTest(TemplatedHtmlDoc templatedDoc) throws Exception { ProcessResult pr = server.executeJavawsHeadless(Collections.singletonList("-html"), templatedDoc.getFileName(), getClosingListener(), null, null); assertStart(pr); assertEnd(pr); assertUnprivileged(pr); return pr; } } icedtea-web-1.8/tests/reproducers/simple/SOPBypass/PaxHeaders.7406/resources0000644000000000000000000000013213441742745023773 xustar0030 mtime=1552401893.158832575 30 atime=1552410887.105183461 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/resources/0000755000175000002070000000000013441742745024660 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SOPBypass/resources/PaxHeaders.7406/SOPBypassSigned.html0000644000000000000000000000013213441742745027713 xustar0030 mtime=1552401893.142832609 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/resources/SOPBypassSigned.html0000644000175000002070000000356013441742745030527 0ustar00jvanekmock00000000000000 APPLET_PARAMS_TOKEN icedtea-web-1.8/tests/reproducers/simple/SOPBypass/resources/PaxHeaders.7406/SOPBypass.jnlp0000644000000000000000000000013213441742745026560 xustar0030 mtime=1552401893.158832575 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/resources/SOPBypass.jnlp0000644000175000002070000000460513441742745027375 0ustar00jvanekmock00000000000000 SOPBypass IcedTea Test applets' abilities to make URLConnections and create Sockets in various documentBase/codebase/etc. combinations APPLET_PARAMS_TOKEN icedtea-web-1.8/tests/reproducers/simple/SOPBypass/resources/PaxHeaders.7406/SOPBypassSigned.jnlp0000644000000000000000000000013213441742745027712 xustar0030 mtime=1552401893.125832644 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/resources/SOPBypassSigned.jnlp0000644000175000002070000000471113441742745030525 0ustar00jvanekmock00000000000000 SOPBypass IcedTea Test applets' abilities to make URLConnections and create Sockets in various documentBase/codebase/etc. combinations APPLET_PARAMS_TOKEN icedtea-web-1.8/tests/reproducers/simple/SOPBypass/resources/PaxHeaders.7406/SOPBypass.html0000644000000000000000000000013113441742745026560 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.277253391 30 ctime=1552410887.088183501 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/resources/SOPBypass.html0000644000175000002070000000356013441742745027375 0ustar00jvanekmock00000000000000 APPLET_PARAMS_TOKEN icedtea-web-1.8/tests/reproducers/simple/SOPBypass/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745022732 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/srcs/0000755000175000002070000000000013441742745023620 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/SOPBypass/srcs/PaxHeaders.7406/SOPBypass.java0000644000000000000000000000013113441742745025475 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/SOPBypass/srcs/SOPBypass.java0000644000175000002070000002706313441742745026316 0ustar00jvanekmock00000000000000/* SOPBypass.java Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.MalformedURLException; import java.net.Socket; import java.net.URL; import java.net.URLConnection; import java.security.AccessController; import java.security.AccessControlException; import java.security.PrivilegedAction; public class SOPBypass extends Applet { private String unrelatedUrl; private String reachableResource; private String resourcesUrl; @Override public void init(){ setUnrelatedUrl(this.getParameter("unrelatedUrl")); setReachableResource(this.getParameter("reachableResource")); setResourcesUrl(this.getParameter("resourceUrl")); } @Override public void start() { System.out.println("Applet Started"); System.out.println("Codebase URL: " + getCodeBase()); System.out.println("DocumentBase URL: " + getDocumentBase()); System.out.println("unrelatedUrl: " + unrelatedUrl); System.out.println("reachableResource: " + reachableResource); System.out.println("resourcesUrl: " + resourcesUrl); AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { checkPrivilege(); attemptSocketConnectionToCodebase(); attemptSocketConnectionToDocumentBase(); attemptSocketConnectionToUnrelated(); attemptSocketConnectionToResourcesLoc(); attemptUrlConnectionToCodebase(); attemptUrlConnectionToDocumentBase(); attemptUrlConnectionToUnrelated(); attemptUrlConnectionToResourcesLoc(); return true; } }); System.out.println("*** APPLET FINISHED ***"); } void checkPrivilege() { boolean canRead = false; try { System.getProperty("user.home"); canRead = true; } catch (AccessControlException ace) { ace.printStackTrace(); canRead = false; } System.out.println("Elevated privileges: " + canRead); } void attemptSocketConnectionToCodebase() { String host = getCodeBase().getHost(); int port = getCodeBase().getPort(); attemptSocketConnection(host, port, reachableResource, "codeBase", true); } void attemptSocketConnectionToDocumentBase() { String host = getDocumentBase().getHost(); int port = getDocumentBase().getPort(); attemptSocketConnection(host, port, reachableResource, "documentBase", true); } void attemptSocketConnectionToUnrelated() { String host = "example.com"; int port = 80; if (unrelatedUrl != null){ host=extractHost(unrelatedUrl); port=extractPort(unrelatedUrl); } attemptSocketConnection(host, port, reachableResource, "unrelated", true); } void attemptSocketConnectionToResourcesLoc() { String host = getCodeBase().getHost(); int port = getCodeBase().getPort(); //if resources url was null, then it was probably from codebase if (resourcesUrl != null){ host=extractHost(resourcesUrl); port=extractPort(resourcesUrl); } attemptSocketConnection(host, port, reachableResource, "resource's", true); } void attemptSocketConnection(String host, int port, String resource, String id, boolean sendData) { boolean connected = true; try { final Socket local = new Socket(); local.bind(null); local.connect(new InetSocketAddress(host, port)); final BufferedReader br = new BufferedReader(new InputStreamReader(local.getInputStream())); final PrintWriter writer = new PrintWriter(local.getOutputStream(), true); if (sendData) { writer.println("GET /" + reachableResource + " HTTP/1.1"); writer.println("Host: " + "itwTest"); writer.println("Accept: */*"); writer.println("User-Agent: Java"); //used to it to much writer.println(""); // Important, else the server will expect that there's more into the request. writer.flush(); String s = getText(br); System.out.println("" + s); if (s == null || s.trim().isEmpty()) { connected = false; } local.close(); } } catch (Exception e) { connected = false; e.printStackTrace(); } System.out.println("SocketConnection:" + id + " " + connected); } void attemptUrlConnectionToCodebase() { attemptUrlConnection(getCodeBase(), reachableResource, "codeBase"); } void attemptUrlConnectionToDocumentBase() { attemptUrlConnection(getDocumentBase(), reachableResource, "documentBase"); } void attemptUrlConnectionToUnrelated() { try { if (unrelatedUrl == null) { attemptUrlConnection(new URL("http://example.com:80"), reachableResource, "unrelated"); } else { attemptUrlConnection(new URL(unrelatedUrl), reachableResource, "unrelated"); } } catch (MalformedURLException e) { e.printStackTrace(); System.out.println("Unrelated URL test failed due to MalformedURLException"); System.out.println("URLConnection:unrelated false"); } } void attemptUrlConnectionToResourcesLoc() { try { if (resourcesUrl == null) { //if resources url was null, then it was probably from codebase attemptUrlConnection(getCodeBase(), reachableResource, "resource's"); } else { attemptUrlConnection(new URL(resourcesUrl), reachableResource, "resource's"); } } catch (MalformedURLException e) { e.printStackTrace(); System.out.println("resource's URL test failed due to MalformedURLException"); System.out.println("URLConnection:resource's false"); } } void attemptUrlConnection(URL url, String resource, String id) { boolean connected = true; try { URLConnection conn = url.openConnection(); conn.connect(); conn.getContentEncoding(); conn.getContentLength(); conn.getContentType(); if (resource != null) { URLConnection connn = concateUrlAndResource(url, resource).openConnection(); connn.connect(); connn.getContentEncoding(); connn.getContentLength(); connn.getContentType(); String s = getText(connn.getInputStream()); System.out.println("" + s); if (s == null || s.trim().isEmpty()) { connected = false; } } } catch (Exception e) { connected = false; e.printStackTrace(); } System.out.println("URLConnection:" + id + " " + connected); } public static void main(String[] args) { //args = new String[]{"SOPBypass-filtered.html", "http://localhost:44321"}; SOPBypass sop = new SOPBypass(); if (args.length > 0) { sop.setReachableResource(args[0]); } if (args.length > 1) { sop.setUnrelatedUrl(args[1]); } if (args.length > 2) { sop.setResourcesUrl(args[2]); } sop.start(); } private void setUnrelatedUrl(String s) { unrelatedUrl = s; } private void setReachableResource(String s) { reachableResource = s; } public void setResourcesUrl(String resourcesUrl) { this.resourcesUrl = resourcesUrl; } static private String extractHost(String unrelatedUrl) { String s[] = unrelatedUrl.split(":"); while (s[1].startsWith("/")) { s[1] = s[1].substring(1); } return s[1]; } static private int extractPort(String unrelatedUrl) { String s[] = unrelatedUrl.split(":"); if (s.length < 3) { return 80; } //protocol:host:port or //protocol:i:p:...:v:6:port int i = s.length - 1; try { return new Integer(s[i]); } catch (NumberFormatException ex) { //nope } return 80; } private URL concateUrlAndResource(URL url, String resource) { String s = url.toExternalForm(); String badResource1 = resource.replace("-filtered", ""); String badResource2 = badResource1.replace("Signed", ""); //see testcases for usages s = s.replace("/codebase/", "/"); s = s.replace("/"+badResource1, "/"); s = s.replace("/"+badResource2, "/"); try { //docbase may have it if (s.endsWith(resource)) { return new URL(s); } if (s.endsWith("/")) { s = s + resource; } else { s = s + "/" + resource; } return new URL(s); } catch (MalformedURLException ex) { //jsut adding resource to vlaisd url. //should not happen, if so, die later return null; } } public static String getText(InputStream is) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(is)); try { return getText(in); } finally { in.close(); } } public static String getText(BufferedReader in) throws Exception { StringBuilder response = new StringBuilder(); String inputLine; while ((inputLine = in.readLine()) != null) { response.append(inputLine); } return response.toString(); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/ResizeApplet0000644000000000000000000000013213441742745022545 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/0000755000175000002070000000000013441742745023432 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023517 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/srcs/0000755000175000002070000000000013441742745024404 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/srcs/PaxHeaders.7406/ResizeApplet.java0000644000000000000000000000013213441742745027046 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/srcs/ResizeApplet.java0000644000175000002070000000475013441742745027664 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class ResizeApplet extends Applet { /* Make sures the process is exited if we stall */ private static class StallTimeoutThread extends Thread { private static final int MILLISECONDS_TO_SLEEP = 5000; @Override public void run() { try { Thread.sleep(MILLISECONDS_TO_SLEEP); System.out.println("*** APPLET FINISHED ***"); } catch (InterruptedException ie) { } } } @Override public void init() { new StallTimeoutThread().start(); } /* Utility for Javascript-side */ public void print(String str) { System.out.println(str); } /* Utility for Javascript-side */ public synchronized void sleep(int time) { try { wait(time); } catch (InterruptedException e) { } } } icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024543 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/testcases/0000755000175000002070000000000013441742745025430 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/testcases/PaxHeaders.7406/ResizeAppletTests.ja0000644000000000000000000000013213441742745030566 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/testcases/ResizeAppletTests.java0000644000175000002070000000531113441742745031725 0ustar00jvanekmock00000000000000/* AppletTestTests.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import static org.junit.Assert.assertTrue; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Test; public class ResizeAppletTests extends BrowserTest { void assertContains(String source, String message, String substring) { assertTrue(source + " should contain '" + substring + "' but did not!", message.contains(substring)); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void testResizing() throws Exception { ProcessResult pr = server.executeBrowser("/ResizeApplet.html", AutoClose.CLOSE_ON_CORRECT_END); assertContains("stdout", pr.stdout, AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING); assertContains("stdout", pr.stdout, "Resizing to 500 by 500"); } } icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024557 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/resources/0000755000175000002070000000000013441742745025444 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/resources/PaxHeaders.7406/ResizeApplet.html0000644000000000000000000000013213441742745030131 xustar0030 mtime=1552401893.130832634 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ResizeApplet/resources/ResizeApplet.html0000644000175000002070000000425013441742745030742 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/RedirectStreams0000644000000000000000000000013213441742745023236 xustar0030 mtime=1552401893.158832575 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/0000755000175000002070000000000013441742745024123 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025234 xustar0030 mtime=1552401893.158832575 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/testcases/0000755000175000002070000000000013441742745026121 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/testcases/PaxHeaders.7406/RedirectStreamsTe0000644000000000000000000000013213441742745030625 xustar0030 mtime=1552401893.158832575 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/testcases/RedirectStreamsTest.java0000644000175000002070000000501413441742745032724 0ustar00jvanekmock00000000000000/* RedirectStreamsTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class RedirectStreamsTest { private static ServerAccess server = new ServerAccess(); @Test public void RedirectStreamsTest1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/RedirectStreams.jnlp"); String s = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.lang.RuntimePermission.{0,5}" + "setIO" + ".*"; Assert.assertTrue("Stderr should match "+s+" but didn't",pr.stderr.matches(s)); String cc="ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `"+cc+"`, but did",pr.stderr.contains(cc)); Assert.assertFalse("RedirectStreams should not be terminated, but was",pr.wasTerminated); Assert.assertEquals((Integer) 1, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025250 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/resources/0000755000175000002070000000000013441742745026135 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/resources/PaxHeaders.7406/RedirectStreams.j0000644000000000000000000000013213441742745030600 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/resources/RedirectStreams.jnlp0000644000175000002070000000375113441742745032130 0ustar00jvanekmock00000000000000 redirect stdin/stdout streams IcedTea icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024210 xustar0030 mtime=1552401893.131832631 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/srcs/0000755000175000002070000000000013441742745025075 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/srcs/PaxHeaders.7406/RedirectStreams.java0000644000000000000000000000013213441742745030230 xustar0030 mtime=1552401893.131832631 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/RedirectStreams/srcs/RedirectStreams.java0000644000175000002070000000345113441742745031043 0ustar00jvanekmock00000000000000/* RedirectStreams.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.StringBufferInputStream; public class RedirectStreams { public static void main(String[] args) { System.setIn(new StringBufferInputStream("TEST")); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/ParametrizedJarUrl0000644000000000000000000000013113441742745023704 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/0000755000175000002070000000000013441742745024572 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745025702 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/testcases/0000755000175000002070000000000013441742745026570 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/testcases/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000013113441742745030604 xustar0029 mtime=1552401893.12283265 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/testcases/ParametrizedJarUrlTests.java0000644000175000002070000002340113441742745034225 0ustar00jvanekmock00000000000000/* SimpleTest1Test.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; public class ParametrizedJarUrlTests extends BrowserTest{ private final List l = Collections.unmodifiableList(Arrays.asList(new String[]{"-Xtrustall"})); @Test @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR905") public void parametrizedAppletTestSignedBrowserTest_hardcodedDifferentCodeBase() throws Exception { ServerLauncher server2 = ServerAccess.getIndependentInstance(); String originalResourceName = "ParametrizedJarUrlSigned.html"; String newResourceName = "ParametrizedJarUrlSigned_COPY2.html"; createCodeBase(originalResourceName, newResourceName, server2.getUrl("")); //set codebase to second server ProcessResult pr = server.executeBrowser(newResourceName); server2.stop(); evaluateSignedApplet(pr); } @Test @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR905") public void parametrizedAppletTestSignedBrowserTest_hardcodedCodeBase() throws Exception { String originalResourceName = "ParametrizedJarUrlSigned.html"; String newResourceName = "ParametrizedJarUrlSigned_COPY1.html"; createCodeBase(originalResourceName, newResourceName, server.getUrl("")); ProcessResult pr = server.executeBrowser(newResourceName); evaluateSignedApplet(pr); } private void createCodeBase(String originalResourceName, String newResourceName, URL codebase) throws MalformedURLException, IOException { String originalContent = ServerAccess.getContentOfStream(new FileInputStream(new File(server.getDir(), originalResourceName))); String nwContent = originalContent.replaceAll("codebase=\".\"", "codebase=\"" + codebase + "\""); ServerAccess.saveFile(nwContent, new File(server.getDir(), newResourceName)); } @Test @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR905") public void parametrizedAppletTestSignedBrowserTest() throws Exception { ProcessResult pr = server.executeBrowser("/ParametrizedJarUrlSigned.html"); evaluateSignedApplet(pr); } @Test @TestInBrowsers(testIn=Browsers.one) public void parametrizedAppletInBrowserWithParamTest() throws Exception { ProcessResult pr = server.executeBrowser("/ParametrizedJarUrl.html?giveMeMore?orNot"); evaluateApplet(pr); } @Test public void parametrizedAppletJavawsTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/ParametrizedJarAppletUrl2.jnlp"); evaluateApplet(pr); } @Test public void parametrizedAppletJavawsTest2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/ParametrizedJarAppletUrl2.jnlp?test=123456"); evaluateApplet(pr); } @Test public void parametrizedAppletJavawsTest3() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/ParametrizedJarAppletUrl.jnlp"); evaluateApplet(pr); } @Test public void parametrizedAppletJavawsTestSignedTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/ParametrizedJarAppletUrlSigned2.jnlp"); evaluateSignedApplet(pr); } @Test public void parametrizedAppletJavawsTestSigned2Test() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/ParametrizedJarAppletUrlSigned2.jnlp?test=123456"); evaluateSignedApplet(pr); } @Test public void parametrizedAppletJavawsTestSignedTest4() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/ParametrizedJarAppletUrlSigned.jnlp"); evaluateSignedApplet(pr); } private void evaluateSignedApplet(ProcessResult pr) { String s3 = "AppletTestSigned was initialised"; Assert.assertTrue("AppletTestSigned stdout should contain " + s3 + " but didn't", pr.stdout.contains(s3)); String s0 = "AppletTestSigned was started"; Assert.assertTrue("AppletTestSigned stdout should contain " + s0 + " but didn't", pr.stdout.contains(s0)); String s1 = "value1"; Assert.assertTrue("AppletTestSigned stdout should contain " + s1 + " but didn't", pr.stdout.contains(s1)); String s2 = "value2"; Assert.assertTrue("AppletTestSigned stdout should contain " + s2 + " but didn't", pr.stdout.contains(s2)); String s7 = "AppletTestSigned killing himself after 2000 ms of life"; Assert.assertTrue("AppletTestSigned stdout should contain " + s7 + " but didn't", pr.stdout.contains(s7)); } @Test public void testParametrizedJarUrlSigned1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/ParametrizedJarUrlSigned1.jnlp"); String s = "Good simple javaws exapmle"; Assert.assertTrue("ParametrizedJarUrlSigned1 stdout should contain " + s + " but didn't", pr.stdout.contains(s)); } @Test public void testParametrizedJarUrlSigned2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/ParametrizedJarUrlSigned2.jnlp"); String s = "Good simple javaws exapmle"; Assert.assertTrue("ParametrizedJarUrlSigned2 stdout should contain " + s + " but didn't", pr.stdout.contains(s)); } @Test public void testParametrizedJarUrlSigned3() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/ParametrizedJarUrlSigned2.jnlp?test=123456"); String s = "Good simple javaws exapmle"; Assert.assertTrue("ParametrizedJarUrlSigned2 stdout should contain " + s + " but didn't", pr.stdout.contains(s)); } @Test public void testParametrizedJarUrl1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/ParametrizedJarUrl1.jnlp"); String s = "Good simple javaws exapmle"; Assert.assertTrue("ParametrizedJarUrl1 stdout should contain " + s + " but didn't", pr.stdout.contains(s)); } @Test public void testParametrizedJarUrl2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/ParametrizedJarUrl2.jnlp"); String s = "Good simple javaws exapmle"; Assert.assertTrue("ParametrizedJarUrl2 stdout should contain " + s + " but didn't", pr.stdout.contains(s)); } @Test public void testParametrizedJarUrl3() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/ParametrizedJarUrl2.jnlp?test=123456"); String s = "Good simple javaws exapmle"; Assert.assertTrue("ParametrizedJarUrl2 stdout should contain " + s + " but didn't", pr.stdout.contains(s)); ; } private void evaluateApplet(ProcessResult pr) { String s3 = "applet was initialised"; Assert.assertTrue("AppletTest stdout should contain " + s3 + " but didn't", pr.stdout.contains(s3)); String s0 = "applet was started"; Assert.assertTrue("AppletTest stdout should contain " + s0 + " but didn't", pr.stdout.contains(s0)); String s1 = "value1"; Assert.assertTrue("AppletTest stdout should contain " + s1 + " but didn't", pr.stdout.contains(s1)); String s2 = "value2"; Assert.assertTrue("AppletTest stdout should contain " + s2 + " but didn't", pr.stdout.contains(s2)); String s7 = "Aplet killing himself after 2000 ms of life"; Assert.assertTrue("AppletTest stdout should contain " + s7 + " but didn't", pr.stdout.contains(s7)); } @Test @TestInBrowsers(testIn=Browsers.one) public void parametrizedAppletInBrowserTest() throws Exception { ProcessResult pr = server.executeBrowser("/ParametrizedJarUrl.html"); pr.process.destroy(); evaluateApplet(pr); } } icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025717 xustar0030 mtime=1552401893.157832577 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/0000755000175000002070000000000013441742745026604 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000013113441742745030620 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrlSigned2.jnlp0000644000175000002070000000425213441742745034457 0ustar00jvanekmock00000000000000 ParametrizedJarUrlSigned2 IcedTea ParametrizedJarUrlSigned2 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000013213441742745030621 xustar0030 mtime=1552401893.131832631 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrl2.jnlp0000644000175000002070000000450413441742745034473 0ustar00jvanekmock00000000000000 AppletTest IcedTea AppletTest icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000013213441742745030621 xustar0030 mtime=1552401893.140832613 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrl1.jnlp0000644000175000002070000000420013441742745033315 0ustar00jvanekmock00000000000000 ParametrizedJarUrl1 IcedTea ParametrizedJarUrl1 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000013213441742745030621 xustar0030 mtime=1552401893.157832577 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrl.html0000644000175000002070000000355113441742745033245 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000031413441742745030623 xustar00115 path=icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrlSigned.jnlp 29 mtime=1552401893.12283265 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrlSigned0000644000175000002070000000461413441742745034603 0ustar00jvanekmock00000000000000 ParametrizedJarAppletUrlSigned IcedTea ParametrizedJarAppletUrlSigned icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000013213441742745030621 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrl2.jnlp0000644000175000002070000000420013441742745033316 0ustar00jvanekmock00000000000000 ParametrizedJarUrl2 IcedTea ParametrizedJarUrl2 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000013213441742745030621 xustar0030 mtime=1552401893.129832636 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrlSigned1.jnlp0000644000175000002070000000423613441742745034460 0ustar00jvanekmock00000000000000 ParametrizedJarUrlSigned1 IcedTea ParametrizedJarUrlSigned1 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000013213441742745030621 xustar0030 mtime=1552401893.129832636 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrl.jnlp0000644000175000002070000000455613441742745034420 0ustar00jvanekmock00000000000000 ParametrizedJarAppletUrl IcedTea ParametrizedJarAppletUrl icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000013213441742745030621 xustar0030 mtime=1552401893.125832644 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrlSigned.html0000644000175000002070000000356513441742745034404 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/PaxHeaders.7406/ParametrizedJa0000644000000000000000000000031613441742745030625 xustar00116 path=icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrlSigned2.jnlp 30 mtime=1552401893.130832634 30 atime=1552402157.277253391 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrlSigned0000644000175000002070000000452613441742745034605 0ustar00jvanekmock00000000000000 AppletTest IcedTea AppletTest icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/ManifestedJar10000644000000000000000000000013213441742745022733 xustar0030 mtime=1552401893.139832615 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/0000755000175000002070000000000013441742745023620 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024731 xustar0030 mtime=1552401893.139832615 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/testcases/0000755000175000002070000000000013441742745025616 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/testcases/PaxHeaders.7406/ManifestedJar1Test0000644000000000000000000000013213441742745030366 xustar0030 mtime=1552401893.139832615 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/testcases/ManifestedJar1Test.java0000644000175000002070000002201513441742745032116 0ustar00jvanekmock00000000000000/* ManifestedJar1Test.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.runtime.Translator; import org.junit.Assert; import org.junit.Test; @Bug(id="http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-February/017435.html") public class ManifestedJar1Test { private static ServerAccess server = new ServerAccess(); private static final String nonLunchableMessage = "net.sourceforge.jnlp.LaunchException: Fatal: Application Error: Not a launchable JNLP file. File must be a JNLP application, applet, or installer type."; //actually this on eis never printed as stderr will not recieve this message in headless mode :( private static final String twoMainException = "net.sourceforge.jnlp.ParseException: Invalid XML document syntax"; private void assertManifestedJar1(String id, ProcessResult q) { String s = "Hello from ManifestedJar1"; Assert.assertTrue(id + " stdout should contains `" + s + "`, but didn't ", q.stdout.contains(s)); } private void assertManifestedJar2(String id, ProcessResult q) { String s = "Hello from ManifestedJar2"; Assert.assertTrue(id + " stdout should contains `" + s + "`, but didn't ", q.stdout.contains(s)); } private void assertNotManifestedJar1(String id, ProcessResult q) { String s = "Hello from ManifestedJar1"; Assert.assertFalse(id + " stdout should NOT contains `" + s + "`, but didn ", q.stdout.contains(s)); } private void assertAppError(String id, ProcessResult q) { Assert.assertTrue(id + " stderr should contains `" + nonLunchableMessage + "`, but didnn't ", q.stderr.contains(nonLunchableMessage)); } private void assertNotManifestedJar2(String id, ProcessResult q) { String s = "Hello from ManifestedJar2"; Assert.assertFalse(id + " stdout should NOT contains `" + s + "`, but didn ", q.stdout.contains(s)); } private void assertNotDead(String id, ProcessResult pr) { assertNearlyNotDead(id, pr, 0); } private void assertNearlyNotDead(String id, ProcessResult pr, int i) { String cc = "ClassNotFoundException"; Assert.assertFalse(id + " stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse(id + " should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) i, pr.returnValue); } @Test /** * if two jars with manifest specified, none is main and no main class, then first one is loaded */ public void manifestedJar1nothing2nothingNoAppDesc() throws Exception { String id = "ManifestedJar-1nothing2nothingNoAppDesc"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertManifestedJar1(id, pr); assertNotDead(id, pr); } /** *if one jar with manifest, is not main, and no main class then is lunched * */ @Test public void manifestedJar1noAppDesc() throws Exception { String id = "ManifestedJar-1noAppDesc"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertManifestedJar1(id, pr); assertNotDead(id, pr); } /** *if one jar with manifest, but not marked as main and no main class then is lunched * */ @Test public void manifestedJar1mainNoAppDesc() throws Exception { String id = "ManifestedJar-1mainNoAppDesc"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertManifestedJar1(id, pr); assertNotDead(id, pr); } /** *if one jar with manifest, marked as main and no main class then is lunched * */ @Test public void ManifestedJar1mainHaveAppDesc() throws Exception { String id = "ManifestedJar-1mainHaveAppDesc"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertManifestedJar2(id, pr); assertNotDead(id, pr); } /** * * Two jars, both with manifest, First is main, but specified mainclass belongs to second one, then second one should be lunched */ @Test public void ManifestedJar1main2nothingNoAppDesc() throws Exception { String id = "ManifestedJar-1main2nothingNoAppDesc"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertManifestedJar2(id, pr); assertNotDead(id, pr); } /** * * Two jars, both with manifest, seconds is main, no mainclass, then the one marked as main is lunched */ @Test public void manifestedJar1main2nothingNoAppDesc() throws Exception { String id = "ManifestedJar-1main2nothingNoAppDesc"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertManifestedJar2(id, pr); assertNotDead(id, pr); } /** * * Two jars, both with manifest, sboth with main tag, no app desc * first jar is taken * */ @Test public void manifestedJar1main2mainNoAppDesc() throws Exception { String id = "ManifestedJar-1main2mainNoAppDesc"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertManifestedJar1(id, pr); assertNotManifestedJar2(id, pr); assertNotDead(id, pr); } /** * * Two jars, both with manifest, sboth with main tag, no app desc * two main jars reported * */ @Test public void manifestedJar1main2mainNoAppDescStrict() throws Exception { String id = "ManifestedJar-1main2mainNoAppDesc"; ProcessResult pr = server.executeJavawsHeadless(Arrays.asList(new String[]{"-strict"}), "/" + id + ".jnlp"); assertNotManifestedJar1(id, pr); assertNotManifestedJar2(id, pr); assertNearlyNotDead(id, pr, 1); Assert.assertTrue(pr.stderr.contains(Translator.R("PTwoMains")) || pr.stdout.contains(Translator.R("PTwoMains"))); } /** * * Two jars, both with manifest, sboth with main tag, have app desc * * launching first */ @Test public void manifestedJar1main2mainAppDesc() throws Exception { String id = "ManifestedJar-1main2mainAppDesc"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertManifestedJar1(id, pr); assertNotManifestedJar2(id, pr); assertNotDead(id, pr); } /** * * Two jars, both with manifest, sboth with main tag, have app desc * * corectly failing */ @Test public void manifestedJar1noAppDescAtAll() throws Exception { String id = "ManifestedJar-1noAppDescAtAll"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertNotManifestedJar1(id, pr); assertNotManifestedJar2(id, pr); assertAppError(id, pr); assertNearlyNotDead(id, pr, 1); } /** * * Two jars, both with manifest, non with main tag, have app desc * * this jnlp is NOT lunched, twoMainException thrown - ok * */ @Test public void manifestedJar1nothing2nothingAppDesc() throws Exception { String id = "ManifestedJar-1nothing2nothingAppDesc"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + id + ".jnlp"); assertManifestedJar2(id, pr); assertNotManifestedJar1(id, pr); assertNotDead(id, pr); } } icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/PaxHeaders.7406/resources0000644000000000000000000000013113441742745024744 xustar0029 mtime=1552401893.15683258 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/0000755000175000002070000000000013441742745025632 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/PaxHeaders.7406/ManifestedJar-1not0000644000000000000000000000032013441742745030337 xustar00118 path=icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1nothing2nothingAppDesc.jnlp 30 mtime=1552401893.131832631 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1nothing2nothingAppD0000644000175000002070000000435213441742745034240 0ustar00jvanekmock00000000000000 ManifestedJar-1nothing2nothingAppDesc IcedTea testing jar with manin class in manifest. Hello from manifestedjar2 should be printed icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/PaxHeaders.7406/ManifestedJar-1mai0000644000000000000000000000031113441742745030305 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1mainHaveAppDesc.jnlp 30 mtime=1552401893.139832615 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1mainHaveAppDesc.jnl0000644000175000002070000000440213441742745034122 0ustar00jvanekmock00000000000000 "ManifestedJar-1mainHaveAppDesc.jnlp IcedTea testing jar with manin class in manifest, hello from manifestedjar2 should be printed icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/PaxHeaders.7406/ManifestedJar-1mai0000644000000000000000000000031613441742745030312 xustar00117 path=icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1main2nothingNoAppDesc.jnlp 29 mtime=1552401893.15683258 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1main2nothingNoAppDe0000644000175000002070000000433113441742745034155 0ustar00jvanekmock00000000000000 ManifestedJar-1main2nothingNoAppDesc IcedTea testing jar with manin class in manifest, hello from manifestedjar2 should be printed icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/PaxHeaders.7406/ManifestedJar-1not0000644000000000000000000000032213441742745030341 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1nothing2nothingNoAppDesc.jnlp 30 mtime=1552401893.121832652 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1nothing2nothingNoAp0000644000175000002070000000432413441742745034250 0ustar00jvanekmock00000000000000 ManifestedJar-1nothing2nothingNoAppDesc IcedTea testing jar with manin class in manifest. Hello from manifestedjar1 should be printed icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/PaxHeaders.7406/ManifestedJar-1mai0000644000000000000000000000031213441742745030306 xustar00112 path=icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1main2mainAppDesc.jnlp 30 mtime=1552401893.121832652 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1main2mainAppDesc.jn0000644000175000002070000000435313441742745034076 0ustar00jvanekmock00000000000000 Test Thread.getAllStackTraces IcedTea testing jar with manin class in manifest. Invalid xml exception should go out icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/PaxHeaders.7406/ManifestedJar-1mai0000644000000000000000000000013113441742745030305 xustar0029 mtime=1552401893.12283265 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1mainNoAppDesc.jnlp0000644000175000002070000000424513441742745034000 0ustar00jvanekmock00000000000000 ManifestedJar-1mainNoAppDesc.jnlp IcedTea testing jar with manin class in manifest, hello from manifestedjar should be printed icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/PaxHeaders.7406/ManifestedJar-1noA0000644000000000000000000000013213441742745030255 xustar0030 mtime=1552401893.128832638 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1noAppDescAtAll.jnlp0000644000175000002070000000417613441742745034114 0ustar00jvanekmock00000000000000 ManifestedJar-1noAppDescAtAll IcedTea testing jar with manin class in manifest, exception during launching, no application specified icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/PaxHeaders.7406/ManifestedJar-1noA0000644000000000000000000000013213441742745030255 xustar0030 mtime=1552401893.124832646 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1noAppDesc.jnlp0000644000175000002070000000421313441742745033166 0ustar00jvanekmock00000000000000 ManifestedJar-1noAppDesc IcedTea testing jar with manin class in manifest, hello from manifestedjar1 shold be printed icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/PaxHeaders.7406/ManifestedJar-1mai0000644000000000000000000000031413441742745030310 xustar00114 path=icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1main2mainNoAppDesc.jnlp 30 mtime=1552401893.129832636 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/resources/ManifestedJar-1main2mainNoAppDesc.0000644000175000002070000000434013441742745034037 0ustar00jvanekmock00000000000000 ManifestedJar-1main2mainNoAppDesc.jnlp IcedTea testing jar with manin class in manifest, hello from manifestedjar1 should go out icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023705 xustar0030 mtime=1552401893.157832577 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/srcs/0000755000175000002070000000000013441742745024572 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/srcs/PaxHeaders.7406/ManifestedJar1.java0000644000000000000000000000013213441742745027422 xustar0030 mtime=1552401893.157832577 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/srcs/ManifestedJar1.java0000644000175000002070000000350413441742745030234 0ustar00jvanekmock00000000000000/* AllStackTraces.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class ManifestedJar1 { public static void main(String[] args) { hello1(); } public static void hello1() { System.out.println("Hello from ManifestedJar1"); } } icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013213441742745025045 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/srcs/META-INF/0000755000175000002070000000000013441742745025732 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/srcs/META-INF/PaxHeaders.7406/MANIFEST.MF0000644000000000000000000000013213441742745026554 xustar0030 mtime=1552401893.130832634 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar1/srcs/META-INF/MANIFEST.MF0000644000175000002070000000012313441742745027360 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Main-Class: ManifestedJar1 Application-Name: ManifestedJar1 icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/LocalesTest0000644000000000000000000000013213441742745022360 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/LocalesTest/0000755000175000002070000000000013441742745023245 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/LocalesTest/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024356 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/LocalesTest/testcases/0000755000175000002070000000000013441742745025243 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/LocalesTest/testcases/PaxHeaders.7406/LocalesTestTest.java0000644000000000000000000000013213441742745030360 xustar0030 mtime=1552401893.120832654 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/LocalesTest/testcases/LocalesTestTest.java0000644000175000002070000003652313441742745031201 0ustar00jvanekmock00000000000000/* LocalisedInformationElementTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; import java.util.Set; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class LocalesTestTest { private static final ServerAccess server = new ServerAccess(); String[] keys = { "BOUsage", "BOUsage2", "BOArg", "BOParam", "BOProperty", "BOLicense", "BOVerbose", "BOAbout", "BONosecurity", "BONoupdate", "BOHeadless", "BOStrict", "BOViewer", "BXnofork", "BXclearcache", "BOHelp1"}; /** * this will prepare new set of variables with wanted locale, which can be * then passed to subprocess * * @param locale - locale to be set to LANG variable, eg cs_CZ.UTF-8 */ public static String[] getChangeLocalesForSubproces(String locale) { ServerAccess.logOutputReprint("Setting locales"); Map p = System.getenv(); Set> r = p.entrySet(); List> rr = new ArrayList>(r); Collections.sort(rr, new Comparator>() { @Override public int compare(Entry o1, Entry o2) { return o1.getKey().compareTo(o2.getKey()); } }); String[] l = new String[rr.size()]; int i = 0; for (Iterator> it = rr.iterator(); it.hasNext(); i++) { Entry entry = it.next(); String v = entry.getValue(); String s = entry.getKey() + "=" + v; //System.out.println(s); if (entry.getKey().equals("LANG")) { ServerAccess.logOutputReprint("was " + v); v = locale; ServerAccess.logOutputReprint("set " + v); } s = entry.getKey() + "=" + v; l[i] = s; } return l; } private ResourceBundle getPropertiesDe() throws IOException { return getProperties("_de"); } public ResourceBundle getPropertiesCz() throws IOException { return getProperties("_cs"); } public ResourceBundle getPropertiesPl() throws IOException { return getProperties("_pl"); } public ResourceBundle getPropertiesEn() throws IOException { return getProperties(""); } public ResourceBundle getProperties(String s) throws IOException { ClassLoader cl = this.getClass().getClassLoader(); ServerAccess.logOutputReprint(cl==null?"null":cl.toString()); if (cl == null) { cl = ClassLoader.getSystemClassLoader(); ServerAccess.logOutputReprint(cl==null?"null":cl.toString()); } InputStream q = cl.getResourceAsStream("net/sourceforge/jnlp/resources/Messages" + s + ".properties"); return new PropertyResourceBundle(q); } //just launching javaws -about to see if messages are corectly localised List javaws = Arrays.asList(new String[]{server.getJavawsLocation(), "-help", ServerAccess.HEADLES_OPTION}); @Test public void testLocalesEnUsUtf() throws Exception { String[] l = getChangeLocalesForSubproces("en_US.UTF-8"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertEnglish(pr.stdout); assertNotCz(pr.stdout); assertNotDe(pr.stdout); assertNotPl(pr.stdout); } @Test public void testLocalesCsCz() throws Exception { String[] l = getChangeLocalesForSubproces("cs_CZ"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertNotEnglish(pr.stdout); assertNotCz(pr.stdout); assertNotDe(pr.stdout); assertNotPl(pr.stdout); iteratePropertiesForAproxCzCs(pr.stdout); } @Test public void testLocalesCsCzUtf() throws Exception { String[] l = getChangeLocalesForSubproces("cs_CZ.UTF-8"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertNotEnglish(pr.stdout); assertNotDe(pr.stdout); assertCz(pr.stdout); assertNotPl(pr.stdout); iteratePropertiesForAproxCzCs(pr.stdout); } @Test public void testLocalesPlPL() throws Exception { String[] l = getChangeLocalesForSubproces("pl_PL"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertNotEnglish(pr.stdout); assertNotCz(pr.stdout); assertNotDe(pr.stdout); iteratePropertiesForAproxPl(pr.stdout); } @Test public void testLocalesPlPLUtf() throws Exception { String[] l = getChangeLocalesForSubproces("pl_PL.UTF-8"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertNotEnglish(pr.stdout); assertNotDe(pr.stdout); assertNotCz(pr.stdout); assertPl(pr.stdout); iteratePropertiesForAproxPl(pr.stdout); } @Test public void testLocalesDeDe() throws Exception { String[] l = getChangeLocalesForSubproces("de_DE"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertNotEnglish(pr.stdout); assertNotCz(pr.stdout); assertNotPl(pr.stdout); iteratePropertiesForAproxDe(pr.stdout); } @Test public void testLocalesDeDeUtf() throws Exception { String[] l = getChangeLocalesForSubproces("de_DE.UTF-8"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertNotEnglish(pr.stdout); assertNotCz(pr.stdout); assertDe(pr.stdout); assertNotPl(pr.stdout); iteratePropertiesForAproxDe(pr.stdout); } @Test public void testLocalesDe_unknowButValidDeLocale() throws Exception { String[] l = getChangeLocalesForSubproces("de_LU"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertNotEnglish(pr.stdout); assertNotCz(pr.stdout); assertNotPl(pr.stdout); iteratePropertiesForAproxDe(pr.stdout); } @Test public void testLocalesDeUtf_unknowButValidDeLocale() throws Exception { String[] l = getChangeLocalesForSubproces("de_LU.UTF-8"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertNotEnglish(pr.stdout); assertNotCz(pr.stdout); assertDe(pr.stdout); assertNotPl(pr.stdout); iteratePropertiesForAproxDe(pr.stdout); } @Test public void testLocalesDe_globalDe() throws Exception { String[] l = getChangeLocalesForSubproces("deutsch"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertNotEnglish(pr.stdout); assertNotCz(pr.stdout); assertNotPl(pr.stdout); iteratePropertiesForAproxDe(pr.stdout); } @Test public void testLocalesInvalid() throws Exception { String[] l = getChangeLocalesForSubproces("ax_BU"); ProcessResult pr = ServerAccess.executeProcess(javaws, null, null, l); assertEnglish(pr.stdout); assertNotCz(pr.stdout); assertNotDe(pr.stdout); assertNotPl(pr.stdout); } private void assertEnglish(String s) throws IOException { ResourceBundle props = getPropertiesEn(); iteratePropertiesFor(props, s, true, "english"); } private void assertNotEnglish(String s) throws IOException { ResourceBundle props = getPropertiesEn(); iteratePropertiesFor(props, s, false, "english"); } private void assertCz(String s) throws IOException { ResourceBundle props = getPropertiesCz(); iteratePropertiesFor(props, s, true, "czech"); } private void assertPl(String s) throws IOException { ResourceBundle props = getPropertiesPl(); iteratePropertiesFor(props, s, true, "polish"); } private void assertDe(String s) throws IOException { ResourceBundle props = getPropertiesDe(); iteratePropertiesFor(props, s, true, "de"); } private void assertNotCz(String s) throws IOException { ResourceBundle props = getPropertiesCz(); iteratePropertiesFor(props, s, false, "czech"); } private void assertNotPl(String s) throws IOException { ResourceBundle props = getPropertiesPl(); iteratePropertiesFor(props, s, false, "polish"); } private void assertNotDe(String s) throws IOException { ResourceBundle props = getPropertiesDe(); iteratePropertiesFor(props, s, false, "de"); } /** * This method is iterating all keys defined in this class, geting their value in given * properties, and then checking if given output have/have not (depends on value of assertTrue) * this string contained. * * @param props * @param outputToExamine * @param assertTrue * @param languageId */ private void iteratePropertiesFor(ResourceBundle props, String outputToExamine, boolean assertTrue, String languageId) { int keysFound = 0; for (int i = 0; i < keys.length; i++) { String string = keys[i]; String value = props.getString(string); if (value == null) { continue; } keysFound++; if (assertTrue) { Assert.assertTrue("Output must contains " + languageId + " text, failed on " + string, outputToExamine.contains(value)); } else { Assert.assertFalse("Output must NOT contains " + languageId + " text, failed on " + string, outputToExamine.contains(value)); } } Assert.assertTrue("At least one key must be found, was not", keysFound > 0); } /** * This method is iterating all keys defined in this class, geting their value in given * properties, transforming this to asci-ionly regex and then checking if * given output match/matchnot (depends on value of assertTrue) this string, * * @param outputToBeChecked * @param props bundle with strings * @param reg regexter with rules how to handle national characters * @throws IOException */ private void iteratePropertiesForAprox(String outputToBeChecked, ResourceBundle props, Regexer reg) throws IOException { int keysFound = 0; for (int i = 0; i < keys.length; i++) { String string = keys[i]; String value = props.getString(string); if (value == null) { continue; } value = reg.regexIt(value); keysFound++; { Assert.assertTrue("Output must match "+reg.getId() +" text, failed on " + string, outputToBeChecked.matches(value)); } } Assert.assertTrue("At least one key must be found, was not", keysFound > 0); } private void iteratePropertiesForAproxCzCs(String stdout) throws IOException { iteratePropertiesForAprox(stdout, getPropertiesCz(), Regexer.cz); } private void iteratePropertiesForAproxDe(String stdout) throws IOException { iteratePropertiesForAprox(stdout, getPropertiesDe(), Regexer.de); } private void iteratePropertiesForAproxPl(String stdout) throws IOException { iteratePropertiesForAprox(stdout, getPropertiesPl(), Regexer.pl); } private static final class Regexer { private static final String[] czEvil = { "УЁ", "Ф", "Ф", "Ф›", "УЉ", "У­", "Хˆ", "УГ", "Х™", "ХЁ", "ХЅ", "УК", "ХЏ", "УН", "ХО", "[", "]", "(", ")"}; private static final String[] deEvil = { "УЄ", "УЖ", "УŸ", "УМ", "[", "]", "(", ")"}; private static final String[] plEvil = { "УГ", "Ф…", "Ф™", "УГ", "Х‚", "Ф‡", "Х›", "ХК", "ХМ", "Х„", "[", "]", "(", ")"}; private static final Regexer cz = new Regexer(czEvil,"cz"); private static final Regexer de = new Regexer(deEvil,"de"); private static final Regexer pl = new Regexer(plEvil,"pl"); private final String[] map; private final String id; public Regexer(String[] map, String id) { this.map = map; this.id = id; } public String getId() { return id; } /** * This method transforms given string to asci-only regex, replacing * groups of national characters (defined by array variable) by .+ * * @param value * @return */ public String regexIt(String value) { for (int i = 0; i < map.length; i++) { String string = map[i]; value = value.replace(string, "."); value = value.replace(string.toUpperCase(), "."); } value = value.replaceAll("\\.+", ".+"); value = "(?s).*" + value + ".*"; return value; } } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JavawsAWTRobotUsageSample0000644000000000000000000000013213441742745025102 xustar0030 mtime=1552401893.138832617 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/0000755000175000002070000000000013441742745025767 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745027077 xustar0029 mtime=1552401893.15683258 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/testcases/0000755000175000002070000000000013441742745027765 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/testcases/PaxHeaders.7406/JavawsA0000644000000000000000000000032313441742745030436 xustar00121 path=icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/testcases/JavawsAWTRobotUsageSampleTest.java 30 mtime=1552401893.138832617 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/testcases/JavawsAWTRobotUsageSamp0000644000175000002070000002301213441742745034331 0ustar00jvanekmock00000000000000/* JavawsAWTRobotUsageSampleTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.awt.Color; import java.awt.event.InputEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.awt.AWTFrameworkException; import net.sourceforge.jnlp.awt.AWTHelper; import net.sourceforge.jnlp.awt.imagesearch.ComponentNotFoundException; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.closinglisteners.Rule; import org.junit.Assert; import org.junit.Test; public class JavawsAWTRobotUsageSampleTest { public static final ServerAccess server = new ServerAccess(); private final String initStr = "JavawsAWTRobotUsageSample is ready for awt tests!"; private static final Color APPLET_COLOR = new Color(230, 230, 250); // lavender private static final Color BUTTON_COLOR1 = new Color(32, 178, 170); // light sea green private abstract class AWTHelperImpl extends AWTHelper{ public AWTHelperImpl() { super(initStr, 400, 400); this.setAppletColor(APPLET_COLOR); } } private class AWTHelperImpl_EnterExit extends AWTHelperImpl { @Override public void run() { // move mouse into the button area and out try { moveToMiddleOfColoredRectangle(BUTTON_COLOR1); moveOutsideColoredRectangle(BUTTON_COLOR1); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseClick1 extends AWTHelperImpl{ @Override public void run() { // click in the middle of the button try { clickOnColoredRectangle(BUTTON_COLOR1, InputEvent.BUTTON1_MASK); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseClick2 extends AWTHelperImpl{ @Override public void run() { // move mouse in the middle of the button and click 2nd // button try { clickOnColoredRectangle(BUTTON_COLOR1, InputEvent.BUTTON2_MASK); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseClick3 extends AWTHelperImpl{ @Override public void run() { // move mouse in the middle of the button and click 3rd // button try { clickOnColoredRectangle(BUTTON_COLOR1, InputEvent.BUTTON3_MASK); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseDrag extends AWTHelperImpl{ @Override public void run() { // move into the rectangle, press 1st button, drag out try { dragFromColoredRectangle(BUTTON_COLOR1); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseMove extends AWTHelperImpl{ @Override public void run() { clickInTheMiddleOfApplet(); try { moveInsideColoredRectangle(BUTTON_COLOR1); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private void evaluateStdoutContents(ProcessResult pr, AWTHelper helper) { // Assert that the applet was initialized. Rule i = helper.getInitStrAsRule(); Assert.assertTrue(i.toPassingString(), i.evaluate(initStr)); // Assert there are all the test messages from applet for (Rule r : helper.getRules() ) { Assert.assertTrue(r.toPassingString(), r.evaluate(pr.stdout)); } } private void appletAWTMouseTest(String url, AWTHelper helper) throws Exception { String strURL = "/" + url; try { ServerAccess.PROCESS_TIMEOUT = 40 * 1000;// ms ProcessResult pr = server.executeJavaws(strURL, helper, helper); evaluateStdoutContents(pr, helper); } finally { ServerAccess.PROCESS_TIMEOUT = 20 * 1000;// ms } } @Test @NeedsDisplay public void AppletAWTMouse_EnterAndExit_Test() throws Exception { // display the page, activate applet, move over the button AWTHelper helper = new AWTHelperImpl_EnterExit(); helper.addClosingRulesFromStringArray(new String[] { "mouseEntered", "mouseExited"}); appletAWTMouseTest("javaws-awtrobot-usage-sample.jnlp", helper); } @Test @NeedsDisplay public void AppletAWTMouse_ClickButton1_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseClick1(); helper.addClosingRulesFromStringArray(new String[] { "mousePressedButton1", "mouseReleasedButton1", "mouseClickedButton1" }); appletAWTMouseTest("javaws-awtrobot-usage-sample.jnlp", helper); } @Test @NeedsDisplay public void AppletAWTMouse_ClickButton2_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseClick2(); helper.addClosingRulesFromStringArray(new String[] { "mousePressedButton2", "mouseReleasedButton2", "mouseClickedButton2" }); appletAWTMouseTest("javaws-awtrobot-usage-sample.jnlp", helper); } @Test @NeedsDisplay public void AppletAWTMouse_ClickButton3_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseClick3(); helper.addClosingRulesFromStringArray(new String[] { "mousePressedButton3", "mouseReleasedButton3", "mouseClickedButton3" }); appletAWTMouseTest("javaws-awtrobot-usage-sample.jnlp", helper); } @Test @NeedsDisplay public void AppletAWTMouse_Drag_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseDrag(); helper.addClosingRulesFromStringArray(new String[] { "mouseDragged" }); appletAWTMouseTest("javaws-awtrobot-usage-sample.jnlp", helper); } @Test @NeedsDisplay public void AppletAWTMouse_Move_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseMove(); helper.addClosingRulesFromStringArray(new String[] { "mouseMoved" }); appletAWTMouseTest("javaws-awtrobot-usage-sample.jnlp", helper); } } icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/testcases/PaxHeaders.7406/AppletA0000644000000000000000000000032213441742745030427 xustar00121 path=icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/testcases/AppletAWTRobotUsageSampleTest.java 29 mtime=1552401893.15683258 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/testcases/AppletAWTRobotUsageSamp0000644000175000002070000002325513441742745034334 0ustar00jvanekmock00000000000000/* AppletAWTRobotUsageSampleTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.awt.AWTException; import java.awt.Color; import java.awt.event.InputEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.awt.AWTFrameworkException; import net.sourceforge.jnlp.awt.AWTHelper; import net.sourceforge.jnlp.awt.imagesearch.ComponentNotFoundException; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.Rule; import org.junit.Assert; import org.junit.Test; public class AppletAWTRobotUsageSampleTest extends BrowserTest { private final String initStr = "JavawsAWTRobotUsageSample is ready for awt tests!"; private static final Color APPLET_COLOR = new Color(230, 230, 250); // lavender private static final Color BUTTON_COLOR1 = new Color(32, 178, 170); // light sea green private abstract class AWTHelperImpl extends AWTHelper{ public AWTHelperImpl() { super(initStr, 400, 400); this.setAppletColor(APPLET_COLOR); } } private class AWTHelperImpl_EnterExit extends AWTHelperImpl { @Override public void run() { // move mouse into the button area and out try { moveToMiddleOfColoredRectangle(BUTTON_COLOR1); moveOutsideColoredRectangle(BUTTON_COLOR1); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseClick1 extends AWTHelperImpl{ @Override public void run() { // click in the middle of the button try { clickOnColoredRectangle(BUTTON_COLOR1, InputEvent.BUTTON1_MASK); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseClick2 extends AWTHelperImpl{ @Override public void run() { // move mouse in the middle of the button and click 2nd // button try { clickOnColoredRectangle(BUTTON_COLOR1, InputEvent.BUTTON2_MASK); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseClick3 extends AWTHelperImpl{ @Override public void run() { // move mouse in the middle of the button and click 3rd // button try { clickOnColoredRectangle(BUTTON_COLOR1, InputEvent.BUTTON3_MASK); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseDrag extends AWTHelperImpl{ @Override public void run() { // move into the rectangle, press 1st button, drag out try { dragFromColoredRectangle(BUTTON_COLOR1); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private class AWTHelperImpl_MouseMove extends AWTHelperImpl{ @Override public void run() { clickInTheMiddleOfApplet(); try { moveInsideColoredRectangle(BUTTON_COLOR1); } catch (ComponentNotFoundException e) { Assert.fail("Button not found: "+e.getMessage()); } catch (AWTFrameworkException e2){ Assert.fail("AWTFrameworkException: "+e2.getMessage()); } } } private void evaluateStdoutContents(ProcessResult pr, AWTHelper helper) { // Assert that the applet was initialized. Rule i = helper.getInitStrAsRule(); Assert.assertTrue(i.toPassingString(), i.evaluate(initStr)); // Assert there are all the test messages from applet for (Rule r : helper.getRules() ) { Assert.assertTrue(r.toPassingString(), r.evaluate(pr.stdout)); } } private void appletAWTMouseTest(String url, AWTHelper helper) throws Exception { String strURL = "/" + url; ProcessResult pr = server.executeBrowser(strURL, helper, helper); evaluateStdoutContents(pr, helper); } @Test @TestInBrowsers(testIn = { Browsers.one }) @NeedsDisplay public void AppletAWTMouse_EnterAndExit_Test() throws Exception { // display the page, activate applet, move over the button AWTHelper helper = new AWTHelperImpl_EnterExit(); helper.addClosingRulesFromStringArray(new String[] { "mouseEntered", "mouseExited"}); appletAWTMouseTest("AppletAWTRobotUsageSample.html", helper); } @Test @TestInBrowsers(testIn = { Browsers.one }) @NeedsDisplay public void AppletAWTMouse_ClickButton1_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseClick1(); helper.addClosingRulesFromStringArray(new String[] { "mousePressedButton1", "mouseReleasedButton1", "mouseClickedButton1" }); appletAWTMouseTest("AppletAWTRobotUsageSample.html", helper); } @Test @TestInBrowsers(testIn = { Browsers.one }) @NeedsDisplay public void AppletAWTMouse_ClickButton2_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseClick2(); helper.addClosingRulesFromStringArray(new String[] { "mousePressedButton2", "mouseReleasedButton2", "mouseClickedButton2" }); appletAWTMouseTest("AppletAWTRobotUsageSample.html", helper); } @Test @TestInBrowsers(testIn = { Browsers.one }) @NeedsDisplay public void AppletAWTMouse_ClickButton3_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseClick3(); helper.addClosingRulesFromStringArray(new String[] { "mousePressedButton3", "mouseReleasedButton3", "mouseClickedButton3" }); appletAWTMouseTest("AppletAWTRobotUsageSample.html", helper); } @Test @TestInBrowsers(testIn = { Browsers.one }) @NeedsDisplay public void AppletAWTMouse_Drag_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseDrag(); helper.addClosingRulesFromStringArray(new String[] { "mouseDragged" }); appletAWTMouseTest("AppletAWTRobotUsageSample.html", helper); } @Test @TestInBrowsers(testIn = { Browsers.one }) @NeedsDisplay public void AppletAWTMouse_Move_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_MouseMove(); helper.addClosingRulesFromStringArray(new String[] { "mouseMoved" }); appletAWTMouseTest("AppletAWTRobotUsageSample.html", helper); } } icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027114 xustar0030 mtime=1552401893.129832636 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/0000755000175000002070000000000013441742745030001 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/PaxHeaders.7406/AppletA0000644000000000000000000000031713441742745030447 xustar00117 path=icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/AppletAWTRobotUsageSample.html 30 mtime=1552401893.129832636 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/AppletAWTRobotUsageSamp0000644000175000002070000000464013441742745034345 0ustar00jvanekmock00000000000000 AWTRobot usage sample page with an applet










icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/PaxHeaders.7406/javaws-0000644000000000000000000000032213441742745030465 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/javaws-awtrobot-usage-sample.jnlp 30 mtime=1552401893.120832654 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/javaws-awtrobot-usage-s0000644000175000002070000000447213441742745034427 0ustar00jvanekmock00000000000000 AWTRobot usage sample IcedTea AWTRobot usage sample icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026054 xustar0030 mtime=1552401893.128832638 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/srcs/0000755000175000002070000000000013441742745026741 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/srcs/PaxHeaders.7406/JavawsAWTRob0000644000000000000000000000031213441742745030326 xustar00112 path=icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/srcs/JavawsAWTRobotUsageSample.java 30 mtime=1552401893.128832638 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotUsageSample/srcs/JavawsAWTRobotUsageSample.ja0000644000175000002070000001355413441742745034231 0ustar00jvanekmock00000000000000/* JavawsAWTRobotUsageSample.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Image; import java.awt.Panel; import java.awt.Button; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; public class JavawsAWTRobotUsageSample extends Applet { private static final String initStr = "JavawsAWTRobotUsageSample is ready for awt tests!"; public static final String iconFile = "marker.png"; public static final Color APPLET_COLOR = new Color(230, 230, 250); // lavender public static final Color BUTTON_COLOR1 = new Color(32, 178, 170); // light sea green public Image img; public Panel panel; public void init(){ img = getImage(getCodeBase(), iconFile); createGUI(); writeAppletInitialized(); } //this method should be called by the extending applet //when the whole gui is ready public void writeAppletInitialized(){ System.out.println(initStr); } //paint the icon in upper left corner @Override public void paint(Graphics g){ int width = 32; int height = 32; int x = 0; int y = 0; g.drawImage(img, x, y, width, height, this); super.paint(g); } private Button createButton(String label, Color color) { Button b = new Button(label); b.setBackground(color); b.setPreferredSize(new Dimension(100, 50)); return b; } // sets background of the applet and adds the panel with one button private void createGUI() { setBackground(APPLET_COLOR); panel = new Panel(); panel.setBounds(33,33,267,267); Button b = createButton("", BUTTON_COLOR1); b.addMouseMotionListener(new MouseMotionListener() { public void mouseDragged(MouseEvent e) { System.out.println("mouseDragged"); } public void mouseMoved(MouseEvent e) { System.out.println("mouseMoved"); } }); b.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent e) { // figure out which mouse button is pressed switch (e.getButton()) { case MouseEvent.BUTTON1: System.out.println("mouseClickedButton1"); break; case MouseEvent.BUTTON2: System.out.println("mouseClickedButton2"); break; case MouseEvent.BUTTON3: System.out.println("mouseClickedButton3"); break; default: break; } } public void mouseEntered(MouseEvent e) { System.out.println("mouseEntered"); } public void mouseExited(MouseEvent e) { System.out.println("mouseExited"); } public void mousePressed(MouseEvent e) { // figure out which mouse button is pressed switch (e.getButton()) { case MouseEvent.BUTTON1: System.out.println("mousePressedButton1"); break; case MouseEvent.BUTTON2: System.out.println("mousePressedButton2"); break; case MouseEvent.BUTTON3: System.out.println("mousePressedButton3"); break; default: break; } } public void mouseReleased(MouseEvent e) { // figure out which mouse button was pressed switch (e.getButton()) { case MouseEvent.BUTTON1: System.out.println("mouseReleasedButton1"); break; case MouseEvent.BUTTON2: System.out.println("mouseReleasedButton2"); break; case MouseEvent.BUTTON3: System.out.println("mouseReleasedButton3"); break; default: break; } } }); panel.add(b); this.add(panel); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JavascriptURLProtocol0000644000000000000000000000013213441742745024351 xustar0030 mtime=1552401893.155832582 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/0000755000175000002070000000000013441742745025236 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026347 xustar0030 mtime=1552401893.155832582 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/testcases/0000755000175000002070000000000013441742745027234 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/testcases/PaxHeaders.7406/JavascriptP0000644000000000000000000000013213441742745030575 xustar0030 mtime=1552401893.155832582 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/testcases/JavascriptProtocolTest.java0000644000175000002070000000637513441742745034602 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Test; public class JavascriptProtocolTest extends BrowserTest { private static final String END_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; private static void assertContains(String source, String message, String substring) { assertTrue(source + " should contain '" + substring + "' but did not!", message.contains(substring)); } private static void assertNotContains(String source, String message, String substring) { assertFalse(source + " should not contain '" + substring + "' but did!", message.contains(substring)); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @Bug(id = { "PR1271" }) public void testJavascriptProtocolFollowed() throws Exception { ProcessResult pr = server.executeBrowser("/JavascriptProtocol.html", AutoClose.CLOSE_ON_BOTH); assertNotContains("stdout", pr.stdout, "HasntRun"); assertContains("stdout", pr.stdout, "Javascript URL string was evaluated."); assertContains("stdout", pr.stdout, "HasRun"); assertContains("stdout", pr.stdout, END_STRING); } } icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026363 xustar0030 mtime=1552401893.129832636 30 atime=1552410887.105183461 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/resources/0000755000175000002070000000000013441742745027250 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/resources/PaxHeaders.7406/JavascriptP0000644000000000000000000000013213441742745030611 xustar0030 mtime=1552401893.129832636 30 atime=1552402157.276253393 30 ctime=1552410887.087183504 icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/resources/JavascriptProtocol.html0000644000175000002070000000351513441742745033772 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/resources/PaxHeaders.7406/JavascriptP0000644000000000000000000000013213441742745030611 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/resources/JavascriptProtocol.js0000644000175000002070000000016013441742745033433 0ustar00jvanekmock00000000000000function runSomeJS() { applet.print("Javascript URL string was evaluated.") applet.state = "HasRun"; } icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025322 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.105183461 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/srcs/0000755000175000002070000000000013441742745026210 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/srcs/PaxHeaders.7406/JavascriptProtoc0000644000000000000000000000013113441742745030617 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptURLProtocol/srcs/JavascriptProtocol.java0000644000175000002070000000115113441742745032701 0ustar00jvanekmock00000000000000import java.applet.Applet; import java.net.URL; import netscape.javascript.JSObject; public class JavascriptProtocol extends Applet { public String state = "HasntRun"; @Override public void start() { try { getAppletContext().showDocument(new URL("javascript:runSomeJS()")); System.out.println("State after showDocument was " + state); } catch (Exception e) { e.printStackTrace(); } System.out.println("*** APPLET FINISHED ***"); } // Utility for JS side public void print(String s) { System.out.println(s); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JavascriptGet0000644000000000000000000000013113441742745022703 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.105183461 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/0000755000175000002070000000000013441742745023571 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023656 xustar0030 mtime=1552401893.119832657 30 atime=1552410887.105183461 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/srcs/0000755000175000002070000000000013441742745024543 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/srcs/PaxHeaders.7406/JavascriptGet.java0000644000000000000000000000013213441742745027344 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/srcs/JavascriptGet.java0000644000175000002070000000645313441742745030164 0ustar00jvanekmock00000000000000import java.applet.Applet; import java.util.Arrays; import netscape.javascript.JSObject; public class JavascriptGet extends Applet { public DummyObject dummyObject = new DummyObject("DummyObject1"); public Object value; private JSObject window; private final String jsvar = "jsvar"; public void init() { window = JSObject.getWindow(this); String initStr = "JToJSGet applet initialized."; System.out.println(initStr); } // methods for testing read from JavaScript variables public void jjsReadInt() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } // value = new Integer(window.getMember(jsvar).toString()); int num = ((Number) window.getMember(jsvar)).intValue(); System.out.println(value); } public void jjsReadDouble() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } value = new Double(window.getMember(jsvar).toString()); System.out.println(value); } public void jjsReadBoolean() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } value = new Boolean(window.getMember(jsvar).toString()); System.out.println(value); } public void jjsReadString() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } value = window.getMember(jsvar).toString(); System.out.println(value); } public void jjsReadObject() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } value = window.getMember(jsvar).toString(); System.out.println(value); } public void jjsRead1DArray() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } Object[] arrayvalue = (Object[]) window.getMember(jsvar); System.out.println(Arrays.toString(arrayvalue)); } public void jjsRead2DArray() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } Object[][] arrayvalue = (Object[][]) window.getMember(jsvar); System.out.println(Arrays.deepToString(arrayvalue)); } public void jjsReadJSObject() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } JSObject jsobjectvalue = (JSObject) window.getMember(jsvar); System.out.println(jsobjectvalue); } // auxiliary class DummyObject public class DummyObject { private String str; public DummyObject(String s) { this.str = s; } public void setStr(String s) { this.str = s; } public String toString() { return str; } } // auxiliary methods: public DummyObject getNewDummyObject(String s) { return new DummyObject(s); } public void writeAfterTests() { System.out.println("afterTests"); } } icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024716 xustar0030 mtime=1552401893.128832638 30 atime=1552410887.105183461 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/resources/0000755000175000002070000000000013441742745025603 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/resources/PaxHeaders.7406/javascript-get.jnlp0000644000000000000000000000013213441742745030603 xustar0030 mtime=1552401893.128832638 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/resources/javascript-get.jnlp0000644000175000002070000000133313441742745031413 0ustar00jvanekmock00000000000000 Java to JavaScript LiveConnect - Get IcedTea LiveConnect - tests for reading JavaScript values from Java. icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/resources/PaxHeaders.7406/Javascript_Get.js0000644000000000000000000000013213441742745030236 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/resources/Javascript_Get.js0000644000175000002070000000052313441742745031046 0ustar00jvanekmock00000000000000function doJToJSGetTests() { var urlArgs = document.URL.split("?"); var testParams = urlArgs[1].split(";"); var func = testParams[0]; var value = decodeURIComponent(testParams[1]); eval('jsvar=' + value); eval('applet.' + func + '()'); applet.writeAfterTests(); } var jsvar; doTest(doJToJSGetTests, applet);icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/resources/PaxHeaders.7406/JavascriptGet.html0000644000000000000000000000013113441742745030426 xustar0029 mtime=1552401893.12283265 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/resources/JavascriptGet.html0000644000175000002070000000111713441742745031237 0ustar00jvanekmock00000000000000 Java JavaScript LiveConnect - Get values from applet

The JToJSGet html page

icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745024701 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.105183461 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/testcases/0000755000175000002070000000000013441742745025567 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/testcases/PaxHeaders.7406/JavascriptGetTest.j0000644000000000000000000000013113441742745030537 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptGet/testcases/JavascriptGetTest.java0000644000175000002070000001241013441742745032036 0ustar00jvanekmock00000000000000/* JToJSGetTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.annotations.KnownToFail; import org.junit.Assert; import org.junit.Test; public class JavascriptGetTest extends BrowserTest { public final boolean doNotRunInOpera = false; private final String initStr = "JToJSGet applet initialized."; private final String afterStr = "afterTests"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(String expectedStdout, ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JToJSGetTest stdout should contain " + initStr + " but it didnt.", pr.stdout.contains(initStr)); // Assert that the values get from JavaScript are ok Assert.assertTrue("JToJSGet: the output should include: "+expectedStdout+", but it didnt.", pr.stdout.contains(expectedStdout)); } private void javaToJSGetTest(String funcStr, String paramStr, String expectedVal) throws Exception { if( doNotRunInOpera){ Browsers b = server.getCurrentBrowser().getID(); if(b == Browsers.opera){ return; } } String strURL = "/JavascriptGet.html?" + funcStr + ";" + paramStr; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateStdoutContents(expectedVal, pr); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSGet_double_Test() throws Exception { javaToJSGetTest("jjsReadDouble", "1.1", "1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSGet_boolean_Test() throws Exception { javaToJSGetTest("jjsReadBoolean", "true", "true"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSGet_string_Test() throws Exception { javaToJSGetTest("jjsReadString", "\"teststring\"", "teststring"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSGet_object_Test() throws Exception { javaToJSGetTest("jjsReadObject", "applet.getNewDummyObject(\"dummy1\")", "dummy1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail(failsIn={Browsers.midori, Browsers.epiphany, Browsers.googleChrome, Browsers.chromiumBrowser}) public void AppletJToJSGet_1DArray_Test() throws Exception { javaToJSGetTest("jjsRead1DArray", "[1,2,3]", "[1, 2, 3]"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail(failsIn={Browsers.midori, Browsers.epiphany, Browsers.googleChrome, Browsers.chromiumBrowser}) public void AppletJToJSGet_2DArray_Test() throws Exception { javaToJSGetTest("jjsRead2DArray", "[[1,2],[3,4]]","[[1, 2], [3, 4]]"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSGet_JSObject_Test() throws Exception { javaToJSGetTest("jjsReadJSObject", "window","Window]");//[object Window], [object DOMWindow] } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JavascriptFuncReturn0000644000000000000000000000013213441742745024260 xustar0030 mtime=1552401893.136832621 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/0000755000175000002070000000000013441742745025145 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025232 xustar0030 mtime=1552401893.136832621 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/srcs/0000755000175000002070000000000013441742745026117 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/srcs/PaxHeaders.7406/JavascriptFuncRet0000644000000000000000000000013213441742745030627 xustar0030 mtime=1552401893.136832621 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/srcs/JavascriptFuncReturn.java0000644000175000002070000000234013441742745033103 0ustar00jvanekmock00000000000000import java.applet.Applet; import netscape.javascript.JSObject; public class JavascriptFuncReturn extends Applet { private JSObject window; public void init() { window = JSObject.getWindow(this); String initStr = "JToJSFuncReturn applet initialized."; System.out.println(initStr); } // method for testing return types of JavaScript function public void jCallJSFunction() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window."); } String returnTypeTestFuncName = "jsReturningFunction"; Object ret = window.call(returnTypeTestFuncName, new Object[]{}); System.out.println(ret.toString()); } // auxiliary class and methods public void writeAfterTests() { System.out.print("afterTests"); } public class DummyObject { private String str; public DummyObject(String s) { this.str = s; } public void setStr(String s) { this.str = s; } public String toString() { return str; } } public DummyObject getNewDummyObject(String s){ return new DummyObject(s); } } icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026272 xustar0030 mtime=1552401893.154832584 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/resources/0000755000175000002070000000000013441742745027157 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/resources/PaxHeaders.7406/JavascriptFu0000644000000000000000000000013213441742745030673 xustar0030 mtime=1552401893.154832584 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/resources/JavascriptFuncReturn.js0000644000175000002070000000045113441742745033637 0ustar00jvanekmock00000000000000function doJToJSFuncReturnTests(){ var urlArgs = document.URL.split("?"); value = eval(decodeURIComponent(urlArgs[1])); applet.jCallJSFunction(); applet.writeAfterTests(); } function jsReturningFunction(){ return value; } var value; doTest(doJToJSFuncReturnTests, applet);icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/resources/PaxHeaders.7406/JavascriptFu0000644000000000000000000000013213441742745030673 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/resources/JavascriptFuncReturn.html0000644000175000002070000000116113441742745034166 0ustar00jvanekmock00000000000000 Java JavaScript LiveConnect - Function Return types

The JToJSFuncReturn html page

icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/resources/PaxHeaders.7406/JavascriptFu0000644000000000000000000000013213441742745030673 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/resources/JavascriptFuncReturn.jnlp0000644000175000002070000000143713441742745034173 0ustar00jvanekmock00000000000000 Java to JavaScript LiveConnect - FuncReturn IcedTea LiveConnect - tests for returning different types of values when calling JS function from Java. icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026256 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/testcases/0000755000175000002070000000000013441742745027143 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/testcases/PaxHeaders.7406/JavascriptFu0000644000000000000000000000031113441742745030656 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/testcases/JavascriptFuncReturnTest.java 30 mtime=1552401893.120832654 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncReturn/testcases/JavascriptFuncReturnTest.jav0000644000175000002070000001141513441742745034631 0ustar00jvanekmock00000000000000/* JToJSFuncReturnTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class JavascriptFuncReturnTest extends BrowserTest { public final boolean doNotRunInOpera = false; private final String initStr = "JToJSFuncReturn applet initialized."; private final String afterStr = "afterTests"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(String[] expectedStdoutsOR, ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JToJSFuncReturnTest stdout should contain " + initStr + " but it didnt.", pr.stdout.contains(initStr)); // Assert that the values set from JavaScript are ok boolean atLeastOne = false; for(String s : expectedStdoutsOR){ if(pr.stdout.contains(s)) atLeastOne = true; } Assert.assertTrue("JToJSFuncReturn: the output should include at least one of expected Stdouts, but it didnt.", atLeastOne); } private void javaToJSFuncReturnTest(String urlEnd, String[] expectedValsOR) throws Exception { if( doNotRunInOpera){ Browsers b = server.getCurrentBrowser().getID(); if(b == Browsers.opera){ return; } } String strURL = "/JavascriptFuncReturn.html?" + urlEnd; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateStdoutContents(expectedValsOR, pr); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncReturn_number_Test() throws Exception { javaToJSFuncReturnTest("123", new String[] {"123"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncReturn_boolean_Test() throws Exception { javaToJSFuncReturnTest("true", new String[] {"true"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncReturn_String_Test() throws Exception { javaToJSFuncReturnTest("\"№ Žу€’ТЃ$ЧЃт‚Ќ№–\"", new String[] {"№ Žу€’ТЃ$ЧЃт‚Ќ№–"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncReturn_Object_Test() throws Exception { javaToJSFuncReturnTest("applet.getNewDummyObject(\"dummy1\")", new String[] {"dummy1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncReturn_JSObject_Test() throws Exception { javaToJSFuncReturnTest("window", new String[] {"[object Window]", "[object DOMWindow]"}); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JToJSString0000644000000000000000000000013213441742745022256 xustar0030 mtime=1552401893.154832584 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/0000755000175000002070000000000013441742745023143 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JToJSString/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024254 xustar0030 mtime=1552401893.154832584 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/testcases/0000755000175000002070000000000013441742745025141 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JToJSString/testcases/PaxHeaders.7406/JToJSStringTest.java0000644000000000000000000000013213441742745030154 xustar0030 mtime=1552401893.154832584 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/testcases/JToJSStringTest.java0000644000175000002070000001036713441742745030773 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import org.junit.Assert; import org.junit.Test; public class JToJSStringTest extends BrowserTest { // the JS<->J tests tend to make Opera unusable private static final boolean doNotRunInOpera = false; private static final String initStr = "init"; private static final String afterStr = "afterTests"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private static void evaluateStdoutContents(String expectedStdout, ProcessResult pr) { Assert.assertTrue("JSToJSet: the stdout should contain " + initStr + ", but it didnt.", pr.stdout.contains(initStr)); Assert.assertTrue("JSToJSet: the output should include: " + expectedStdout + ", but it didnt.", pr.stdout.contains(expectedStdout)); } private void javaToJSTest(String url, String expectedStdout) throws Exception { if (doNotRunInOpera) { if (server.getCurrentBrowser().getID() == Browsers.opera) { return; } ProcessResult pr = server.executeBrowser(url, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateStdoutContents(expectedStdout, pr); } } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @Bug(id = { "PR1794" }) public void StringArrayTest() throws Exception { javaToJSTest("/JToJSString.html", "abc"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void StringTest() throws Exception { javaToJSTest("/JToJSString.html", "notarrayitem"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @Bug(id = { "PR1794" }) public void jnlpStringArrayAppletTest() throws Exception { javaToJSTest("/JToJSStringJnlpApplet.html", "abc"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @Bug(id = { "PR1794" }) public void jnlpStringAppletTest() throws Exception { javaToJSTest("/JToJSStringJnlpApplet.html", "notarrayitem"); } } icedtea-web-1.8/tests/reproducers/simple/JToJSString/PaxHeaders.7406/resources0000644000000000000000000000013113441742745024267 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/0000755000175000002070000000000013441742745025155 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/PaxHeaders.7406/JToJSStringApplet.jnl0000644000000000000000000000013113441742745030337 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/JToJSStringApplet.jnlp0000644000175000002070000000417313441742745031335 0ustar00jvanekmock00000000000000 JavaToJS IcedTea LiveConnect - Output Strings from Array from Java to JS icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/PaxHeaders.7406/JToJSStringJnlpApplet0000644000000000000000000000013213441742745030402 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/JToJSStringJnlpApplet.html0000644000175000002070000000426213441742745032161 0ustar00jvanekmock00000000000000


------------


icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/PaxHeaders.7406/JSTest.js0000644000000000000000000000013213441742745026057 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/JSTest.js0000644000175000002070000000024213441742745026665 0ustar00jvanekmock00000000000000function doTest(funcCallback, applet) { if (applet.init != null) { funcCallback(); } else { setTimeout(function(){doTest(funcCallback, applet)}, 100); } } icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/PaxHeaders.7406/JToJSString.js0000644000000000000000000000013213441742745027023 xustar0030 mtime=1552401893.125832644 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/JToJSString.js0000644000175000002070000000253513441742745027640 0ustar00jvanekmock00000000000000function writeToJS(myStringArray) { var tojs = document.getElementById("writetojs"); tojs.innerHTML = "" + myStringArray[0] + myStringArray[1] + myStringArray[2]; } function writeToJSs(myString) { var tojss = document.getElementById("writetojss"); tojss.innerHTML = myString; } function getDOMElementByID(id) { return document.getElementById(id).innerHTML; } function attemptJToJSStringTest() { notice.innerHTML = "1"; applet.printFromJS("Stage 1 reached"); var byids = document.getElementById("byids"); notice.innerHTML = "2"; applet.printFromJS("Stage 2 reached"); byids.innerHTML = "String by Id: " + applet.myString; notice.innerHTML = "3"; applet.printFromJS("Stage 3 reached"); var byid = document.getElementById("byid"); notice.innerHTML = "4"; applet.printFromJS("Stage 4 reached"); byid.innerHTML = "StringArray by Id: " + applet.myStringArray[0] + ", " + applet.myStringArray[1] + ", " + applet.myStringArray[2]; notice.innerHTML = "5"; applet.printFromJS("Stage 5 reached"); applet.readStringAndFinish(); notice.innerHTML = "6"; applet.printFromJS("Stage 6 reached"); } try { doTest(attemptJToJSStringTest, applet); } catch (err) { alert(err); }icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/PaxHeaders.7406/JToJSString.html0000644000000000000000000000013213441742745027353 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/resources/JToJSString.html0000644000175000002070000000422213441742745030163 0ustar00jvanekmock00000000000000


------------


icedtea-web-1.8/tests/reproducers/simple/JToJSString/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023230 xustar0030 mtime=1552401893.126832642 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/srcs/0000755000175000002070000000000013441742745024115 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JToJSString/srcs/PaxHeaders.7406/JToJSString.java0000644000000000000000000000013213441742745026270 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JToJSString/srcs/JToJSString.java0000644000175000002070000000617013441742745027104 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import netscape.javascript.JSObject; public class JToJSString extends Applet { public String[] myStringArray = { "a", "b", "c" }; public String myString = "notarrayitem"; private final String writetojs = "writetojs"; private final String writetojss = "writetojss"; private JSObject window; @Override public void init() { System.out.println("init"); window = JSObject.getWindow(this); if (window == null) { System.out.println("init stage: window is null"); } else { window.call("writeToJS", new Object[] { myStringArray }); window.call("writeToJSs", new Object[] { myString }); System.out.println("init stage: complete"); } } public void jjsReadString(String element) { System.out.println("jjsReadString " + element); if (window == null) { window = JSObject.getWindow(this); System.out.println("jjsReadString stage: window is null"); } Object value = window.call("getDOMElementByID", new Object[] { element }); System.out.println(value); } public void readStringAndFinish() { System.out.println("readStringAndFinish"); jjsReadString("writetojs"); jjsReadString("writetojss"); System.out.println("afterTests"); } public void printFromJS(String message) { System.out.println(message); } @Override public void destroy() { System.out.println("destroy"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JSToJTypeConv0000644000000000000000000000013213441742745022557 xustar0030 mtime=1552401893.154832584 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/0000755000175000002070000000000013441742745023444 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024555 xustar0030 mtime=1552401893.134832625 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/testcases/0000755000175000002070000000000013441742745025442 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/testcases/PaxHeaders.7406/JSToJTypeConvTest.j0000644000000000000000000000013213441742745030266 xustar0030 mtime=1552401893.134832625 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/testcases/JSToJTypeConvTest.java0000644000175000002070000004171513441742745031576 0ustar00jvanekmock00000000000000/* JSToJTypeConvTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class JSToJTypeConvTest extends BrowserTest { //the JS<->J tests tend to make Opera unusable public final boolean doNotRunInOpera = false; private final String initStr = "JSToJTypeConv applet initialized."; private final String afterStr = "afterTests"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(String[] expectedStdouts, ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JSToJTypeConv: the stdout should contain " + initStr + ", but it didnt.", pr.stdout.contains(initStr)); // Assert that the values set by JavaScript are ok for(String str : expectedStdouts){ String xmlStr = "new value"; if(str.contains("nonXML char")) { str = str.substring(12); }else{ xmlStr = str; } Assert.assertTrue("JSToJTypeConv: the output should include "+xmlStr+", but it didnt.", pr.stdout.contains(str)); } } private void jsToJavaTypeConvTest(String fieldStr, String valueStr, String[] expectedValueAndOutputs) throws Exception { if( doNotRunInOpera){ if(server.getCurrentBrowser().getID() == Browsers.opera){ return; } } String strURL = "/JSToJTypeConv.html?" + fieldStr + ";" + valueStr; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); String[] expectedStdouts = expectedValueAndOutputs; evaluateStdoutContents(expectedStdouts, pr); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_NumToJavaStringInteger_Test() throws Exception { jsToJavaTypeConvTest("_String", "1", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_NumToJavaStringDouble_Test() throws Exception { jsToJavaTypeConvTest("_String", "1.1", new String[] {"1.1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_NumToJavaObjectInteger_Test() throws Exception { jsToJavaTypeConvTest("_Object", "1.0", new String[] {"1","superclass is java.lang.Number"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_NumToJavaObjectDouble_Test() throws Exception { jsToJavaTypeConvTest("_Object", "1.1", new String[] {"1.1","superclass is java.lang.Number"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_NumToboolean0_Test() throws Exception { jsToJavaTypeConvTest("_boolean", "0", new String[] {"false"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_NumToboolean1dot1_Test() throws Exception { jsToJavaTypeConvTest("_boolean", "1.1", new String[] {"true"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolToJavaBoolTrue_Test() throws Exception { jsToJavaTypeConvTest("_Boolean", "true", new String[] {"true"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolToJavaBoolFalse_Test() throws Exception { jsToJavaTypeConvTest("_Boolean", "false", new String[] {"false"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolToJavaObject_Test() throws Exception { jsToJavaTypeConvTest("_Object", "true", new String[] {"true", "class is java.lang.Boolean"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolToJavaString_Test() throws Exception { jsToJavaTypeConvTest("_String", "true", new String[] {"true"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTobyteTrue_Test() throws Exception { jsToJavaTypeConvTest("_byte", "true", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTocharTrue_Test() throws Exception { jsToJavaTypeConvTest("_char", "true", new String[] { "nonXML char "+((char)1) }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolToshortTrue_Test() throws Exception { jsToJavaTypeConvTest("_short", "true", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTointTrue_Test() throws Exception { jsToJavaTypeConvTest("_int", "true", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTolongTrue_Test() throws Exception { jsToJavaTypeConvTest("_long", "true", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTofloatTrue_Test() throws Exception { jsToJavaTypeConvTest("_float", "true", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTodoubleTrue_Test() throws Exception { jsToJavaTypeConvTest("_double", "true", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTobyteFalse_Test() throws Exception { jsToJavaTypeConvTest("_byte", "false", new String[] {"0"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTocharFalse_Test() throws Exception { jsToJavaTypeConvTest("_char", "false", new String[] { "nonXML char "+((char)0) }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolToshortFalse_Test() throws Exception { jsToJavaTypeConvTest("_short", "false", new String[] {"0"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTointFalse_Test() throws Exception { jsToJavaTypeConvTest("_int", "false", new String[] {"0"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTolongFalse_Test() throws Exception { jsToJavaTypeConvTest("_long", "false", new String[] {"0"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTofloatFalse_Test() throws Exception { jsToJavaTypeConvTest("_float", "false", new String[] {"0"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_BoolTodoubleFalse_Test() throws Exception { jsToJavaTypeConvTest("_double", "false", new String[] {"0"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringToObject_Test() throws Exception { jsToJavaTypeConvTest("_Object", "\"№ Žу€’ТЃ$ЧЃт‚Ќ№–\"", new String[] {"№ Žу€’ТЃ$ЧЃт‚Ќ№–"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringTobyte_Test() throws Exception { jsToJavaTypeConvTest("_byte", "\'1\'", new String[] {"1"}); //JS string 'str' or "str" both ok } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringToshort_Test() throws Exception { jsToJavaTypeConvTest("_short", "\"1\"", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringToint_Test() throws Exception { jsToJavaTypeConvTest("_int", "\"1\"", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringTolong_Test() throws Exception { jsToJavaTypeConvTest("_long", "\"1\"", new String[] {"1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringTofloat_Test() throws Exception { jsToJavaTypeConvTest("_float", "\"1.1\"", new String[] {"1.1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringTodouble_Test() throws Exception { jsToJavaTypeConvTest("_double", "\"1.1\"", new String[] {"1.1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringTochar_Test() throws Exception { jsToJavaTypeConvTest("_char", "\"1\"", new String[] { "nonXML char "+((char)1) }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringTobooleanEmptyFalse_Test() throws Exception { jsToJavaTypeConvTest("_boolean", "\"\"", new String[] {"false"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringTobooleanNonemptyTrue_Test() throws Exception { jsToJavaTypeConvTest("_boolean", "\"a nonempty string\"", new String[] {"true"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayTobyteArr_Test() throws Exception { jsToJavaTypeConvTest("_byteArray", "[1,null,2]", new String[] {"[1,0,2]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayTocharArr_Test() throws Exception { jsToJavaTypeConvTest("_charArray", "[97,null,98]", new String[] {"nonXML char [a,"+((char)0) +",b]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayToshortArr_Test() throws Exception { jsToJavaTypeConvTest("_shortArray", "[1,null,2]", new String[] {"[1,0,2]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayTointArr_Test() throws Exception { jsToJavaTypeConvTest("_intArray", "[1,null,2]", new String[] {"[1,0,2]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayTolongArr_Test() throws Exception { jsToJavaTypeConvTest("_longArray", "[1,null,2]", new String[] {"[1,0,2]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayTofloatArr_Test() throws Exception { jsToJavaTypeConvTest("_floatArray", "[1,null,2]", new String[] {"[1.0,0.0,2.0]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayTodoubleArr_Test() throws Exception { jsToJavaTypeConvTest("_doubleArray", "[1,null,2]", new String[] {"[1.0,0.0,2.0]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayToStringArr_Test() throws Exception { jsToJavaTypeConvTest("_StringArray", "[1,null,2]", new String[] {"[1,null,2]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayTocharArrArr_Test() throws Exception { jsToJavaTypeConvTest("_charArray2D", "[[\"97\",null,\"98\"],[],[\"99\",\"100\",null,\"101\"]]", new String[] {"nonXML char [[a,"+((char)0)+",b],[],[c,d,"+((char)0)+",e]]"}); //Error on Java side: array element type mismatch } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayToStringArrArr_Test() throws Exception { jsToJavaTypeConvTest("_StringArray2D", "[[\"00\",null,\"02\"],[],[\"20\",\"21\",null,\"23\"]]", new String[] {"[[00,null,02],[],[20,21,null,23]]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_ArrayToString_Test() throws Exception { jsToJavaTypeConvTest("_String", "[[\"00\",null,\"02\"],[],[\"20\",\"21\",null,\"23\"]]", new String[] {"00,,02,,20,21,,23"}); //Error on Java side: array element type mismatch } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_JSObjectToJSObject_Test() throws Exception { jsToJavaTypeConvTest("_JSObject", "window", new String[] {"[object Window]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_JSObjectToString_Test() throws Exception { jsToJavaTypeConvTest("_String", "window", new String[] {"[object Window]"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_JavaObjectToJavaObject_Test() throws Exception { jsToJavaTypeConvTest("_Object", "new applet.Packages.java.lang.Float(1.1)", new String[] {"1.1","class is java.lang.Float"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_JavaObjectToString_Test() throws Exception { jsToJavaTypeConvTest("_String", "applet.getNewDummyObject(\"dummy1\")", new String[] {"dummy1"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_nullToJavaObjectString_Test() throws Exception { jsToJavaTypeConvTest("_String", "null", new String[] {"null"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringTobooleanFalseStr_Test() throws Exception { jsToJavaTypeConvTest("_boolean", "\"false\"", new String[] {"true"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringTobooleanTrueStr_Test() throws Exception { jsToJavaTypeConvTest("_boolean", "\"true\"", new String[] {"true"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringToBooleanFalseStr_Test() throws Exception { jsToJavaTypeConvTest("_Boolean", "\"false\"", new String[] {"true"}); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJTypeConv_StringToBooleanTrueStr_Test() throws Exception { jsToJavaTypeConvTest("_Boolean", "\"true\"", new String[] {"true"}); } } icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023531 xustar0030 mtime=1552401893.154832584 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/srcs/0000755000175000002070000000000013441742745024416 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/srcs/PaxHeaders.7406/JSToJTypeConv.java0000644000000000000000000000013213441742745027072 xustar0030 mtime=1552401893.154832584 30 atime=1552402157.276253393 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/srcs/JSToJTypeConv.java0000644000175000002070000000712713441742745027711 0ustar00jvanekmock00000000000000import java.applet.Applet; import java.lang.reflect.Array; import java.lang.reflect.Field; import netscape.javascript.JSObject; public class JSToJTypeConv extends Applet { public byte _byte = 0; public char _char = 'A'; public short _short = 0; public int _int = 0; public long _long = 0L; public float _float = 0F; public double _double = 0.0; public boolean _boolean = false; public byte[] _byteArray = null; public char[] _charArray = null; public short[] _shortArray = null; public int[] _intArray = null; public long[] _longArray = null; public float[] _floatArray = null; public double[] _doubleArray = null; public char[][] _charArray2D = null; public Byte _Byte = null; public Character _Character = 'A'; public Short _Short = 0; public Integer _Integer = 0; public Long _Long = 0L; public Float _Float = 0F; public Double _Double = 0.0; public String _String = ""; public Boolean _Boolean = false; public JSObject _JSObject = null; public Byte[] _ByteArray = null; public Character[] _CharacterArray = null; public Short[] _ShortArray = null; public Integer[] _IntegerArray = null; public Long[] _LongArray = null; public Float[] _FloatArray = null; public Double[] _DoubleArray = null; public String[] _StringArray = null; public String[][] _StringArray2D = null; public Object _Object = null; public String getArrayAsStr(Object array) { if( array == null){ return "null"; }else{ int size = Array.getLength(array); String ret = ""; for (int i=0; i < size; i++) { ret += ((Array.get(array, i) == null) ? "null" : Array.get(array, i).toString()); ret += ","; } if (ret.length() > 0) { ret = ret.substring(0, ret.length()-1); } return "["+ret+"]"; } } public void init() { String initStr = "JSToJTypeConv applet initialized."; System.out.println(initStr); } public class DummyObject { private String str; public DummyObject(String s) { this.str = s; } public void setStr(String s) { this.str = s; } public String toString() { return str; } } public DummyObject getNewDummyObject(String s){ return new DummyObject(s); } public void printNewValueAndFinish(String fieldname) throws Exception { if( fieldname.equals("_Object")){ System.out.println( "New value is: " + _Object + " class is " + _Object.getClass().getName() + " superclass is " + _Object.getClass().getSuperclass().getName() ); }else{ Field field = getClass().getDeclaredField(fieldname); Object value = field.get(this); //2D arrays if( fieldname.contains("2D") ){ Object row1 = Array.get(value,0); Object row2 = Array.get(value,1); Object row3 = Array.get(value,2); System.out.println( "New value is: [" + getArrayAsStr(row1) + "," + getArrayAsStr(row2) + "," + getArrayAsStr(row3) + "]"); //arrays }else if (value != null && value.getClass().isArray()) { System.out.println("New value is: " + getArrayAsStr(value)); //classic fields } else { System.out.println("New value is: " + value); } } System.out.println("afterTests"); } } icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024571 xustar0030 mtime=1552401893.126832642 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/resources/0000755000175000002070000000000013441742745025456 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/resources/PaxHeaders.7406/JSToJTypeConv.html0000644000000000000000000000013213441742745030155 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/resources/JSToJTypeConv.html0000644000175000002070000000113313441742745030763 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - Types Conversion

The JSToJTypeConv html page

icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/resources/PaxHeaders.7406/JSToJava_TypeConv.j0000644000000000000000000000013213441742745030271 xustar0030 mtime=1552401893.117832661 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/resources/JSToJava_TypeConv.js0000644000175000002070000000051513441742745031265 0ustar00jvanekmock00000000000000function attemptTypeConvTests() { var urlArgs = document.URL.split("?"); var testParams = urlArgs[1].split(";"); var field = testParams[0]; var value = decodeURIComponent(testParams[1]); eval('applet.' + field + '=' + value); applet.printNewValueAndFinish(field); } doTest(attemptTypeConvTests, applet); icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/resources/PaxHeaders.7406/jstoj-typeconv.jnlp0000644000000000000000000000013213441742745030531 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJTypeConv/resources/jstoj-typeconv.jnlp0000644000175000002070000000135713441742745031347 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - TypeConv IcedTea LiveConnect - tests for data type conversion from JS to Java variables. icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JSToJGet0000644000000000000000000000013213441742745021527 xustar0030 mtime=1552401893.125832644 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/0000755000175000002070000000000013441742745022414 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJGet/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745022501 xustar0030 mtime=1552401893.116832663 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/srcs/0000755000175000002070000000000013441742745023366 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJGet/srcs/PaxHeaders.7406/JSToJGet.java0000644000000000000000000000013213441742745025012 xustar0030 mtime=1552401893.116832663 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/srcs/JSToJGet.java0000644000175000002070000000466713441742745025637 0ustar00jvanekmock00000000000000import java.applet.Applet; import java.awt.Label; import java.awt.BorderLayout; import netscape.javascript.JSObject; public class JSToJGet extends Applet { public static final int i = 42; public static final double d = 42.42; public static final float f = 42.1F; public static final long l = 4294967296L; public static final boolean b = true; public static final char c = '\u2323'; public static final byte by = 43; public static final String rs = "I'm a string!"; public static final String ss = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; public static final Object n = null; public int[] ia = new int[5]; public static final Integer I = 24; public static final Double D = 24.24; public static final Float F = 24.124F; public static final Long L = 6927694924L; public static final Boolean B = false; public static final Character C = '\u1526'; public static final Byte By = 34; public Double[] Da1 = new Double[10]; public Double[] Da2 = null; public char[] ca = new char[3]; public Character[] Ca = new Character[3]; public JSObject jso; private boolean objectReady = false; private Label statusLabel; public void start() { JSObject win = JSObject.getWindow(this); jso = (JSObject) win.getMember("document"); System.out.println("Document JSObject: " + jso.toString()); jso.setMember("key1", "value1"); ia[4] = 1024; Da1[9] = D; String setupStr = "JSToJGet applet set up for GET tests."; System.out.println(setupStr); statusLabel.setText(setupStr); objectReady = true; } public void init() { setLayout(new BorderLayout()); statusLabel = new Label(); add(statusLabel); String initStr = "JSToJGet applet initialized."; System.out.println(initStr); statusLabel.setText(initStr); } // auxiliary method for setting the statusLabel text: public void setStatusLabel(String s) { statusLabel.setText(s); } public boolean Ready() { return objectReady; } // auxiliary methods for writing to stdout and stderr: public void stdOutWrite(String s) { System.out.print(s); } public void stdErrWrite(String s) { System.err.print(s); } public void stdOutWriteln(String s) { System.out.println(s); } public void stdErrWriteln(String s) { System.err.println(s); } } icedtea-web-1.8/tests/reproducers/simple/JSToJGet/PaxHeaders.7406/resources0000644000000000000000000000013213441742745023541 xustar0030 mtime=1552401893.126832642 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/resources/0000755000175000002070000000000013441742745024426 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJGet/resources/PaxHeaders.7406/jstoj-get.jnlp0000644000000000000000000000013213441742745026411 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/resources/jstoj-get.jnlp0000644000175000002070000000130413441742745027217 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - Get RedHat LiveConnect - tests for getting members from Java side. icedtea-web-1.8/tests/reproducers/simple/JSToJGet/resources/PaxHeaders.7406/JSToJGet.html0000644000000000000000000000013213441742745026075 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/resources/JSToJGet.html0000644000175000002070000000124613441742745026710 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - Get values from applet

The JSToJGet html page

icedtea-web-1.8/tests/reproducers/simple/JSToJGet/resources/PaxHeaders.7406/JSToJava_Get.js0000644000000000000000000000013213441742745026374 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/resources/JSToJava_Get.js0000644000175000002070000002061213441742745027205 0ustar00jvanekmock00000000000000function test_get_int() { try { var i = document.getElementById("applet").i; check(i, 42, "number", " 1 - (int)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_double() { try { var d = document.getElementById("applet").d; check(d, 42.42, "number", " 2 - (double)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_float() { try { var f = document.getElementById("applet").f; check(f, 42.099998474121094, "number", " 3 - (float)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_long() { try { var l = document.getElementById("applet").l; check(l, 4294967296, "number", " 4 - (long)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_boolean() { try { var b = document.getElementById("applet").b; check(b, true, "boolean", " 5 - (boolean)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_char() { try { var c = document.getElementById("applet").c; check(c, 8995, "number", " 6 - (char)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_byte() { try { var by = document.getElementById("applet").by; check(by, 43, "number", " 7 - (byte)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_intArrayElement() { try { var ia = document.getElementById("applet").ia[4]; check(ia, 1024, "number", " 8 - (int[] - element access)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_intArrayBeyond() { try { var ia2 = document.getElementById("applet").ia[30]; check(ia2, null, "undefined", " 9 - (int[] - beyond length)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_regularString() { try { var rs = document.getElementById("applet").rs; check(rs, "I'm a string!", "string", "10 - (regular string)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_specialCharsString() { try { var ss = document.getElementById("applet").ss; check(ss, "№ Žу€’ТЃ$ЧЃт‚Ќ№–", "string", "11 - (string with special characters)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_null() { try { var n = document.getElementById("applet").n; check(n, null, "object", "12 - (null)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_Integer() { try { var I = document.getElementById("applet").I; check(I, 24, "object", "13 - (Integer)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_Double() { try { var D = document.getElementById("applet").D; check(D, 24.24, "object", "14 - (Double)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_Float() { try { var F = document.getElementById("applet").F; check(F, 24.124, "object", "15 - (Float)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_Long() { try { var L = document.getElementById("applet").L; check(L, 6927694924, "object", "16 - (Long)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_Boolean() { try { var B = document.getElementById("applet").B; check(B, false, "object", "17 - (Boolean)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_Character() { try { var C = document.getElementById("applet").C; check(C, 'с”І', "object", "18 - (Character)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_Byte() { try { var By = document.getElementById("applet").By; check(By, 34, "object", "19 - (Byte)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_DoubleArrayElement() { try { var DaE = document.getElementById("applet").Da1[9]; check(DaE, 24.24, "object", "20 - (Double[] - element access)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_DoubleFullArray() { try { var DaStr = applet.Da1.toString().substr(0, 20); var Da = applet.Da1; var testid = "21 - (Double[] - full array)"; var expected = "[Ljava.lang.Double;@"; var expectedtype = "object"; if (DaStr == expected) { // the same value if (typeof (Da) == expectedtype) { // the same type passTest(testid, applet); } else { failTypeTest(testid, applet, typeof (Da), expectedtype); } } else { failValTest(testid, applet, DaStr, expected); } } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function test_get_JSObject() { try { var javao = new Object(applet.jso); check(javao.key1, "value1", "string", "22 - (JSObject)", applet); } catch (e) { appletStdOut(applet, e); appendMessageDiv(e); } } function attemptGetTests() { if (applet.Ready()) { var urlArgs = document.URL.split("?"); var testid = urlArgs[1]; if (testid != null) { applet.setStatusLabel(testid); appendMessageDiv(testid + "... "); } else { applet.setStatusLabel("url without ?"); appendMessageDiv("no url arguments..."); } switch (testid) { case "int": test_get_int(); break; case "double": test_get_double(); break; case "float": test_get_float(); break; case "long": test_get_long(); break; case "boolean": test_get_boolean(); break; case "char": test_get_char(); break; case "byte": test_get_byte(); break; case "intArrayElement": test_get_intArrayElement(); break; case "intArrayBeyond": test_get_intArrayBeyond(); break; case "regularString": test_get_regularString(); break; case "specialCharsString": test_get_specialCharsString(); break; case "null": test_get_null(); break; case "Integer": test_get_Integer(); break; case "Double": test_get_Double(); break; case "Float": test_get_Float(); break; case "Long": test_get_Long(); break; case "Boolean": test_get_Boolean(); break; case "Character": test_get_Character(); break; case "Byte": test_get_Byte(); break; case "DoubleArrayElement": test_get_DoubleArrayElement(); break; case "DoubleFullArray": test_get_DoubleFullArray(); break; case "JSObject": test_get_JSObject(); break; default: appletStdOutLn('applet', "No argument in URL! Should be e.g. JSToJGet.html?int"); document .getElementById('applet') .setStatusLabel( "Not a valid argument in URL! Should be e.g. JSToJGet.html?int"); break; } afterTestsMessage('applet'); } else { setTimeout(attemptGetTests, 100); } } doTest(attemptGetTests, applet); icedtea-web-1.8/tests/reproducers/simple/JSToJGet/resources/PaxHeaders.7406/JSToJ_auxiliary.js0000644000000000000000000000013213441742745027174 xustar0030 mtime=1552401893.120832654 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/resources/JSToJ_auxiliary.js0000644000175000002070000000337213441742745030011 0ustar00jvanekmock00000000000000/* JSToJ_auxiliary.js This file contains auxiliary JavaScript functions for LiveConnect tests output it is used by JSToJGet reproducer. */ function check(actual, expected, expectedtype, testid, appletName ) { if (actual == expected) { //the same value if (typeof(actual) == expectedtype) { //the same type passTest( testid, appletName ); } else { failTypeTest( testid, appletName, actual, expectedtype ); } } else { failValTest( testid, appletName, actual, expected ); } } function passTest( testid, appletName ){ var passStr = "Test no."+testid+" - passed."; //applet stdout appletStdOut( appletName, passStr); //html page appendMessageDiv(passStr); } function failValTest( testid, appletName, actual, expected ){ var failValStr = "Test no."+testid+" - failed, value mismatch. expected:["+expected+"] found:["+actual+"]."; //applet stdout appletStdOut( appletName, failValStr); //html page appendMessageDiv(failValStr); } function failTypeTest( testid, appletName, actual, expectedtype ){ var failTypeStr = "Test no."+testid+" - failed, type mismatch. expected:["+expectedtype+"] found:["+typeof(actual)+"]."; //applet stdout appletStdOutLn( appletName, failTypeStr); //html page appendMessageDiv(failTypeStr); } function appletStdOut( appletName, str ){ appletName.stdOutWrite( str ); } function appletStdOutLn( appletName, str ){ appletName.stdOutWriteln( str ); } function afterTestsMessage( appletName ){ appletName.stdOutWriteln("afterTests"); } function appendMessageDiv( message ){ var messageDiv = document.getElementById( 'messageDiv' ); messageDiv.appendChild( document.createTextNode(message) ); } icedtea-web-1.8/tests/reproducers/simple/JSToJGet/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745023525 xustar0030 mtime=1552401893.125832644 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/testcases/0000755000175000002070000000000013441742745024412 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJGet/testcases/PaxHeaders.7406/JSToJGetTest.java0000644000000000000000000000013213441742745026676 xustar0030 mtime=1552401893.125832644 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJGet/testcases/JSToJGetTest.java0000644000175000002070000002360213441742745027511 0ustar00jvanekmock00000000000000/* JSToJGetTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.annotations.KnownToFail; import org.junit.Assert; import org.junit.Test; public class JSToJGetTest extends BrowserTest { // the JS<->J tests tend to make Opera unusable public final boolean doNotRunInOpera = false; public String passStr = " - passed."; public String failValStr = " - failed, value mismatch."; public String failTypeStr = " - failed, type mismatch."; public String expStr = "expected:["; public String foundStr = "] found:["; public String endStr = "]."; private final String initStr = "JSToJGet applet initialized."; private final String setupStr = "JSToJGet applet set up for GET tests."; private final String afterStr = "afterTests"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(setupStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(String testStr, ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JSToJGetTest stdout should contain " + initStr + " but it didnt.", pr.stdout.contains(initStr)); // Assert that the applet was set up for the GM tests. Assert.assertTrue("JSToJGetTest stdout should contain " + setupStr + " but it didnt.", pr.stdout.contains(setupStr)); // Assert that the tests have passed. String s0 = testStr + passStr; String s1 = testStr + failValStr; String s2 = testStr + failTypeStr; int ind0 = pr.stdout.indexOf(s0); int ind1 = pr.stdout.indexOf(s1); int ind2 = pr.stdout.indexOf(s2); int indBegin = pr.stdout.indexOf(setupStr); if (indBegin != -1) { indBegin += setupStr.length(); } else { indBegin = 0; } String failStr = "JSToJGet " + testStr + ": passed not found in the applet stdout."; if (ind1 != -1) { // int inde = pr.stdout.indexOf(expStr); // int indf = pr.stdout.indexOf(foundStr); // int indend = pr.stdout.indexOf(endStr); failStr = "JSToJGet: value mismatch in " + testStr; } if (ind2 != -1) { // int inde = pr.stdout.indexOf(expStr); // int indf = pr.stdout.indexOf(foundStr); // int indend = pr.stdout.indexOf(endStr); failStr = "JSToJGet: type mismatch in " + testStr; } Assert.assertTrue(failStr, (ind1 == -1));// no value mismatch Assert.assertTrue(failStr, (ind2 == -1));// no type mismatch Assert.assertTrue(failStr, (ind0 != -1));// test passed } private void jsToJavaGetTest(String urlEnd, String testStr) throws Exception { if (doNotRunInOpera) { if (server.getCurrentBrowser().getID() == Browsers.opera) { return; } } String strURL = "/JSToJGet.html?" + urlEnd; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateStdoutContents(testStr, pr); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_int_Test() throws Exception { jsToJavaGetTest("int", "Test no. 1 - (int)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_double_Test() throws Exception { jsToJavaGetTest("double", "Test no. 2 - (double)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_float_Test() throws Exception { jsToJavaGetTest("float", "Test no. 3 - (float)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_long_Test() throws Exception { jsToJavaGetTest("long", "Test no. 4 - (long)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_boolean_Test() throws Exception { jsToJavaGetTest("boolean", "Test no. 5 - (boolean)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_char_Test() throws Exception { jsToJavaGetTest("char", "Test no. 6 - (char)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_byte_Test() throws Exception { jsToJavaGetTest("byte", "Test no. 7 - (byte)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_intArrayElement_Test() throws Exception { jsToJavaGetTest("intArrayElement", "Test no. 8 - (int[] - element access)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_intArrayBeyond_Test() throws Exception { jsToJavaGetTest("intArrayBeyond", "Test no. 9 - (int[] - beyond length)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_regularString_Test() throws Exception { jsToJavaGetTest("regularString", "Test no.10 - (regular string)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_specialCharsString_Test() throws Exception { jsToJavaGetTest("specialCharsString", "Test no.11 - (string with special characters)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_null_Test() throws Exception { jsToJavaGetTest("null", "Test no.12 - (null)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_Integer_Test() throws Exception { jsToJavaGetTest("Integer", "Test no.13 - (Integer)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_Double_Test() throws Exception { jsToJavaGetTest("Double", "Test no.14 - (Double)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_Float_Test() throws Exception { jsToJavaGetTest("Float", "Test no.15 - (Float)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_Long_Test() throws Exception { jsToJavaGetTest("Long", "Test no.16 - (Long)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_Boolean_Test() throws Exception { jsToJavaGetTest("Boolean", "Test no.17 - (Boolean)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_Character_Test() throws Exception { jsToJavaGetTest("Character", "Test no.18 - (Character)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_Byte_Test() throws Exception { jsToJavaGetTest("Byte", "Test no.19 - (Byte)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_DoubleArrayElement_Test() throws Exception { jsToJavaGetTest("DoubleArrayElement", "Test no.20 - (Double[] - element access)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJGet_DoubleFullArray_Test() throws Exception { jsToJavaGetTest("DoubleFullArray", "Test no.21 - (Double[] - full array)"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJGet_JSObject_Test() throws Exception { jsToJavaGetTest("JSObject", "Test no.22 - (JSObject)"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JSToJFuncReturn0000644000000000000000000000013213441742745023103 xustar0030 mtime=1552401893.153832586 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/0000755000175000002070000000000013441742745023770 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025101 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/testcases/0000755000175000002070000000000013441742745025766 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/testcases/PaxHeaders.7406/JSToJFuncReturnTe0000644000000000000000000000013213441742745030337 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/testcases/JSToJFuncReturnTest.java0000644000175000002070000002031213441742745032434 0ustar00jvanekmock00000000000000/* JSToJFuncReturnTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class JSToJFuncReturnTest extends BrowserTest { private final String initStr = "JSToJFuncReturn applet initialized."; private final String afterStr = "afterTests"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(String expectedStdout, ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JSToJFuncReturnTest stdout should contain " + initStr + " but it didnt.", pr.stdout.contains(initStr)); // Assert that the tests have passed. Assert.assertTrue("JSToJFuncReturnTest stdout should contain " + expectedStdout + " but it didnt.", pr.stdout.contains(expectedStdout)); } private void jsToJavaFuncReturnNormalTest(String methodStr, String expectedStdout) throws Exception { String strURL = "/JSToJFuncReturn.html?" + methodStr; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateStdoutContents(expectedStdout, pr); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_int_Test() throws Exception { jsToJavaFuncReturnNormalTest("_int", "number 1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_double_Test() throws Exception { jsToJavaFuncReturnNormalTest("_double", "number 1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_float_Test() throws Exception { jsToJavaFuncReturnNormalTest("_float", "number 1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_long_Test() throws Exception { jsToJavaFuncReturnNormalTest("_long", "number 10000"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_boolean_Test() throws Exception { jsToJavaFuncReturnNormalTest("_boolean", "boolean true"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_char_Test() throws Exception { jsToJavaFuncReturnNormalTest("_char", "number 97"); // 'a' } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_byte_Test() throws Exception { jsToJavaFuncReturnNormalTest("_byte", "number 10"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_charArrayElement_Test() throws Exception { jsToJavaFuncReturnNormalTest("_charArrayElement", "number 97"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_void_Test() throws Exception { jsToJavaFuncReturnNormalTest("_void", "undefined undefined"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_regularString_Test() throws Exception { jsToJavaFuncReturnNormalTest("_regularString", "string test"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_specialCharsString_Test() throws Exception { jsToJavaFuncReturnNormalTest("_specialString", "string № Žу€’ТЃ$ЧЃт‚Ќ№–"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_null_Test() throws Exception { jsToJavaFuncReturnNormalTest("_null", "object null"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncReturn_Integer_Test() throws Exception { jsToJavaFuncReturnNormalTest("_Integer", "object 1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncReturn_Double_Test() throws Exception { jsToJavaFuncReturnNormalTest("_Double", "object 1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncReturn_Float_Test() throws Exception { jsToJavaFuncReturnNormalTest("_Float", "object 1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncReturn_Long_Test() throws Exception { jsToJavaFuncReturnNormalTest("_Long", "object 10000"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncReturn_Boolean_Test() throws Exception { jsToJavaFuncReturnNormalTest("_Boolean", "object true"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncReturn_Character_Test() throws Exception { jsToJavaFuncReturnNormalTest("_Character", "object A"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncReturn_Byte_Test() throws Exception { jsToJavaFuncReturnNormalTest("_Byte", "object 10"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncReturn_CharArrayElement_Test() throws Exception { jsToJavaFuncReturnNormalTest("_CharacterArrayElement", "object A"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncReturn_CharFullArray_Test() throws Exception { jsToJavaFuncReturnNormalTest("_CharacterArray", "object [Ljava.lang.Character;@"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncReturn_JSObject_Test() throws Exception { jsToJavaFuncReturnNormalTest("_JSObject", "object value1"); } } icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024055 xustar0030 mtime=1552401893.153832586 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/srcs/0000755000175000002070000000000013441742745024742 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/srcs/PaxHeaders.7406/JSToJFuncReturn.java0000644000000000000000000000013213441742745027742 xustar0030 mtime=1552401893.153832586 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/srcs/JSToJFuncReturn.java0000644000175000002070000000517413441742745030561 0ustar00jvanekmock00000000000000import java.applet.Applet; import java.awt.Label; import java.awt.BorderLayout; import netscape.javascript.JSObject; public class JSToJFuncReturn extends Applet { private Label statusLabel; public int _int() { int i = 1; return i; } public double _double() { double d = 1.1; return d; } public float _float() { float f = 1.1F; return f; } public long _long() { long l = 10000L; return l; } public boolean _boolean() { boolean b = true; return b; } public char _char() { char c = 'a'; return c; } public byte _byte() { byte by = 10; return by; } public char _charArrayElement() { char[] ca = new char[] { 'a', 'b', 'c' }; return ca[0]; } public char[] _charArray() { char[] ca = new char[] { 'a', 'b', 'c' }; return ca; } public String _regularString() { String rs = "test"; return rs; } public String _specialString() { String ss = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; return ss; } public void _void() { } public Object _null() { return null; } public Integer _Integer() { Integer I = 1; return I; } public Double _Double() { Double D = 1.1; return D; } public Float _Float() { Float F = 1.1F; return F; } public Long _Long() { Long L = 10000L; return L; } public Boolean _Boolean() { Boolean B = true; return B; } public Character _CharacterArrayElement() { Character[] Ca = new Character[] { 'A', 'B', 'C' }; return Ca[0]; } public Character _Character() { Character C = 'A'; return C; } public Byte _Byte() { Byte By = 10; return By; } public Character[] _CharacterArray() { Character[] Ca = new Character[] { 'A', 'B', 'C' }; return Ca; } public JSObject _JSObject() { JSObject win = JSObject.getWindow(this); JSObject jso = (JSObject) win.getMember("document"); jso.setMember("key1", "value1"); return jso; } public void init() { setLayout(new BorderLayout()); statusLabel = new Label(); add(statusLabel); String initStr = "JSToJFuncReturn applet initialized."; System.out.println(initStr); statusLabel.setText(initStr); } public void printStringAndFinish(String str) { System.out.println(str); System.out.println("afterTests"); } } icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025115 xustar0030 mtime=1552401893.125832644 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/resources/0000755000175000002070000000000013441742745026002 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/resources/PaxHeaders.7406/JSToJFuncReturn.h0000644000000000000000000000013213441742745030310 xustar0030 mtime=1552401893.125832644 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/resources/JSToJFuncReturn.html0000644000175000002070000000122113441742745031631 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - Function return values from applet

The JSToJFuncReturn html page

icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/resources/PaxHeaders.7406/JSToJava_FuncRetu0000644000000000000000000000013213441742745030351 xustar0030 mtime=1552401893.116832663 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/resources/JSToJava_FuncReturn.js0000644000175000002070000000070713441742745032140 0ustar00jvanekmock00000000000000function attemptFuncReturnTests() { var urlArgs = document.URL.split("?"); var method = urlArgs[1]; eval('var value = applet.' + method + '()'); var checked_string = typeof (value) + ' '; if (method === '_JSObject') { checked_string = checked_string + value.key1; } else { checked_string = checked_string + value; } applet.printStringAndFinish(checked_string); } doTest(attemptFuncReturnTests, applet);icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/resources/PaxHeaders.7406/jstoj-funcreturn.0000644000000000000000000000013213441742745030515 xustar0030 mtime=1552401893.124832646 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncReturn/resources/jstoj-funcreturn.jnlp0000644000175000002070000000140413441742745032210 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - FuncReturn RedHat LiveConnect - tests to process various return types from Java side function calls. icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JSToJFuncParam0000644000000000000000000000013213441742745022664 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/0000755000175000002070000000000013441742745023551 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023636 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/srcs/0000755000175000002070000000000013441742745024523 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/srcs/PaxHeaders.7406/JSToJFuncParam.java0000644000000000000000000000013213441742745027304 xustar0030 mtime=1552401893.115832665 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/srcs/JSToJFuncParam.java0000644000175000002070000000544113441742745030120 0ustar00jvanekmock00000000000000import java.applet.Applet; import java.util.Arrays; import netscape.javascript.JSObject; public class JSToJFuncParam extends Applet { public void init() { String initStr = "JSToJFuncParam applet initialized."; System.out.println(initStr); } public void intParam(int i) { System.out.println("intParam " + i); } public void doubleParam(double d) { System.out.println("doubleParam " + d); } public void floatParam(float f) { System.out.println("floatParam " + f); } public void longParam(long l) { System.out.println("longParam " + l); } public void booleanParam(boolean b) { System.out.println("booleanParam " + b); } public void charParam(char c) { System.out.println("charParam " + c); } public void byteParam(byte b) { System.out.println("byteParam " + b); } public void charArrayParam(char[] ca) { System.out.println("charArrayParam " + Arrays.toString(ca)); } public void StringParam(String s) { System.out.println("StringParam " + s); } public void IntegerParam(Integer p) { System.out.println("IntegerParam " + p); } public void DoubleParam(Double p) { System.out.println("DoubleParam " + p); } public void FloatParam(Float p) { System.out.println("FloatParam " + p); } public void LongParam(Long p) { System.out.println("LongParam " + p); } public void BooleanParam(Boolean p) { System.out.println("BooleanParam " + p); } public void CharacterParam(Character p) { System.out.println("CharacterParam " + p); } public void ByteParam(Byte p) { System.out.println("ByteParam " + p); } public void StringIntMixedParam(String[] s) { System.out.println("StringIntMixedParam " + Arrays.toString(s)); } public void DummyObjectArrayParam(DummyObject[] ca) { System.out.println("DummyObjectArrayParam " + Arrays.toString(ca)); } public void JSObjectParam(JSObject car) { Integer mph = (Integer) car.getMember("mph"); String color = (String) car.getMember("color"); System.out.println("JSObjectParam " + mph + ", " + color); } public void writeAfterTest() { System.out.println("afterTests"); } public void readFromJS(String message) { System.out.println(message); } public class DummyObject { private String str; public DummyObject(String s) { this.str = s; } public void setStr(String s) { this.str = s; } public String toString() { return str; } } public DummyObject getNewDummyObject(String str) { return new DummyObject(str); } } icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024676 xustar0030 mtime=1552401893.125832644 30 atime=1552410887.106183459 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/resources/0000755000175000002070000000000013441742745025563 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/resources/PaxHeaders.7406/jstoj-funcparam.jn0000644000000000000000000000013213441742745030407 xustar0030 mtime=1552401893.125832644 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/resources/jstoj-funcparam.jnlp0000644000175000002070000000137513441742745031561 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - FuncParam IcedTea LiveConnect - tests for function parameter conversion when calling Java from JS. icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/resources/PaxHeaders.7406/JSToJava_FuncParam0000644000000000000000000000013113441742745030252 xustar0029 mtime=1552401893.12283265 30 atime=1552402157.275253395 30 ctime=1552410887.086183506 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/resources/JSToJava_FuncParam.js0000644000175000002070000000110013441742745031466 0ustar00jvanekmock00000000000000//dummy javascript class whose instance is passed as JSObject parameter: function JSCar(mph, color) { this.mph = mph; this.color = color; } // the main routine used for all tests: function attemptFuncParamTests() { var urlArgs = document.URL.split("?"); var testParams = urlArgs[1].split(";"); var func = testParams[0]; var value = decodeURIComponent(testParams[1]); notice.innerHTML = notice.innerHTML + func + " " + value; eval('applet.' + func + '(' + value + ')'); applet.writeAfterTest(); } doTest(attemptFuncParamTests, applet); icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/resources/PaxHeaders.7406/JSToJFuncParam.htm0000644000000000000000000000013213441742745030213 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/resources/JSToJFuncParam.html0000644000175000002070000000127213441742745031201 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - function parameter conversion

The JSToJFuncParam html page

icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024662 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/testcases/0000755000175000002070000000000013441742745025547 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/testcases/PaxHeaders.7406/JSToJFuncParamTest0000644000000000000000000000013213441742745030250 xustar0030 mtime=1552401893.124832646 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncParam/testcases/JSToJFuncParamTest.java0000644000175000002070000002042513441742745032003 0ustar00jvanekmock00000000000000/* JSToJFuncParamTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class JSToJFuncParamTest extends BrowserTest { // the JS<->J tests tend to make Opera unusable public final boolean doNotRunInOpera = false; private final String initStr = "JSToJFuncParam applet initialized."; private final String afterStr = "afterTests"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(String expectedStdout, ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JSToJFuncParam: the stdout should contain " + initStr + ", but it didnt.", pr.stdout.contains(initStr)); // Assert that the values set by JavaScript are ok Assert.assertTrue("JSToJFuncParam: the output should include: " + expectedStdout + ", but it didnt.", pr.stdout.contains(expectedStdout)); } private void jsToJavaFuncParamTest(String funcStr, String paramStr, String expectedVal) throws Exception { if (doNotRunInOpera) { if (server.getCurrentBrowser().getID() == Browsers.opera) { return; } } String strURL = "/JSToJFuncParam.html?" + funcStr + ";" + paramStr; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); String expectedStdout = funcStr + " " + expectedVal; evaluateStdoutContents(expectedStdout, pr); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_int_Test() throws Exception { jsToJavaFuncParamTest("intParam", "1", "1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_double_Test() throws Exception { jsToJavaFuncParamTest("doubleParam", "1.1", "1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_float_Test() throws Exception { jsToJavaFuncParamTest("floatParam", "1.1", "1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_long_Test() throws Exception { jsToJavaFuncParamTest("longParam", "10000", "10000"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_boolean_Test() throws Exception { jsToJavaFuncParamTest("booleanParam", "true", "true"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_char_Test() throws Exception { jsToJavaFuncParamTest("charParam", "97", "a"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_byte_Test() throws Exception { jsToJavaFuncParamTest("byteParam", "10", "10"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_charArray_Test() throws Exception { jsToJavaFuncParamTest("charArrayParam", "[97,98,99]", "[a, b, c]"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_String_Test() throws Exception { jsToJavaFuncParamTest("StringParam", "\"test\"", "test"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_Integer_Test() throws Exception { jsToJavaFuncParamTest("IntegerParam", "1", "1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_Double_Test() throws Exception { jsToJavaFuncParamTest("DoubleParam", "1.1", "1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncParam_Float_Test() throws Exception { jsToJavaFuncParamTest("FloatParam", "1.1", "1.1"); } // @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncParam_Long_Test() throws Exception { jsToJavaFuncParamTest("LongParam", "10000", "10000"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_Boolean_Test() throws Exception { jsToJavaFuncParamTest("BooleanParam", "true", "true"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_Character_Test() throws Exception { jsToJavaFuncParamTest("CharacterParam", "new applet.Packages.java.lang.Character(65)", "A"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJFuncParam_Byte_Test() throws Exception { jsToJavaFuncParamTest("ByteParam", "10", "10"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_StringIntMixed_Test() throws Exception { jsToJavaFuncParamTest("StringIntMixedParam", "[\"test\",123]", "[test, 123]"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_DummyObjectArray_Test() throws Exception { jsToJavaFuncParamTest("DummyObjectArrayParam", "[applet.getNewDummyObject(\"Dummy1\"),applet.getNewDummyObject(\"Dummy2\")]", "[Dummy1, Dummy2]"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_JSObject_Test() throws Exception { jsToJavaFuncParamTest("JSObjectParam", "new JSCar(100,\"red\")", "100, red"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_booleanFalseStr_Test() throws Exception { jsToJavaFuncParamTest("booleanParam", "false", "false"); } // @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncParam_BooleanFalseStr_Test() throws Exception { jsToJavaFuncParamTest("BooleanParam", "false", "false"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JSObjectFromEval0000644000000000000000000000013213441742745023235 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/0000755000175000002070000000000013441742745024122 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024207 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/srcs/0000755000175000002070000000000013441742745025074 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/srcs/PaxHeaders.7406/JSObjectFromEval.java0000644000000000000000000000013213441742745030226 xustar0030 mtime=1552401893.124832646 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/srcs/JSObjectFromEval.java0000644000175000002070000000411213441742745031034 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import netscape.javascript.JSObject; public class JSObjectFromEval extends Applet { @Override public void start() { System.out.println(getClass().getSimpleName() + " started."); } public void output(String s) { System.out.println(s); } public JSObject newJSObject() { JSObject win = JSObject.getWindow(this); return (JSObject) win.eval("new Object()"); } public void setJSMember(JSObject js, String memb, Object val) { js.setMember(memb, val); } }icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025233 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/testcases/0000755000175000002070000000000013441742745026120 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/testcases/PaxHeaders.7406/JSObjectFromEval0000644000000000000000000000013213441742745030332 xustar0030 mtime=1552401893.115832665 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/testcases/JSObjectFromEvalTest.java0000644000175000002070000000703413441742745032726 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import static org.junit.Assert.assertTrue; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Test; public class JSObjectFromEvalTest extends BrowserTest { private static final String END_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; private static final String JAVA_CREATE = "Java create\n"; private static final String JS_CREATE = "JS create\n"; private static final String JAVA_SET = "Java set\n"; private static final String CORRECT_VALUE = "obj.test = 0"; @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @Bug(id = { "PR1198" }) public void testJSObjectSetMemberIsSet() throws Exception { ProcessResult pr = server.executeBrowser("/JSObjectFromEval.html", AutoClose.CLOSE_ON_BOTH); String expectedJSCreateOutput = JS_CREATE + JAVA_SET + CORRECT_VALUE; String expectedJavaCreateOutput = JAVA_CREATE + JAVA_SET + CORRECT_VALUE; // No reason JS create should fail, this is mostly a sanity check: assertTrue("stdout should contain 'JS create [...] " + CORRECT_VALUE + "' but did not.", pr.stdout.contains(expectedJSCreateOutput)); // Demonstrates PR1198: assertTrue("stdout should contain 'Java create [...] " + CORRECT_VALUE + "' but did not.", pr.stdout.contains(expectedJavaCreateOutput)); // Make sure we got to the end of the script assertTrue("stdout should contain '" + END_STRING + "' but did not.", pr.stdout.contains(END_STRING)); } } icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/PaxHeaders.7406/resources0000644000000000000000000000013113441742745025246 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/resources/0000755000175000002070000000000013441742745026134 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/resources/PaxHeaders.7406/JSObjectFromEval0000644000000000000000000000013113441742745030345 xustar0029 mtime=1552401893.12283265 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/resources/JSObjectFromEval.js0000644000175000002070000000116713441742745031576 0ustar00jvanekmock00000000000000function attemptJSObjectFromEvalTest() { var obj; applet.output("*** Test JSObject from JS ***"); applet.output("JS create"); obj = new Object(); applet.output("Java set"); applet.setJSMember(obj, "test", 0); applet.output("obj.test = " + obj.test); applet.output("*** Test JSObject from Java ***"); applet.output("Java create"); obj = applet.newJSObject(); applet.output("Java set"); applet.setJSMember(obj, "test", 0); applet.output("obj.test = " + obj.test); applet.output("*** APPLET FINISHED ***"); // We're done here } doTest(attemptJSObjectFromEvalTest, applet);icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/resources/PaxHeaders.7406/JSObjectFromEval0000644000000000000000000000013213441742745030346 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/JSObjectFromEval/resources/JSObjectFromEval.html0000644000175000002070000000356713441742745032134 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/InformationTitleVendorParser0000644000000000000000000000013213441742745025760 xustar0030 mtime=1552401893.116832663 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/0000755000175000002070000000000013441742745026645 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027772 xustar0030 mtime=1552401893.152832588 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/0000755000175000002070000000000013441742745030657 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/PaxHeaders.7406/Vend0000644000000000000000000000013113441742745030665 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/VendorParser.jnlp0000644000175000002070000000411613441742745034160 0ustar00jvanekmock00000000000000 VendorParser Vendor tag missing icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/PaxHeaders.7406/Titl0000644000000000000000000000031213441742745030706 xustar00112 path=icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/TitleVendorParser.jnlp 30 mtime=1552401893.152832588 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/TitleVendorParser.jn0000644000175000002070000000407213441742745034627 0ustar00jvanekmock00000000000000 Title/Vendor tags missing icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/PaxHeaders.7406/Info0000644000000000000000000000031213441742745030665 xustar00112 path=icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/InformationParser.jnlp 30 mtime=1552401893.114832667 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/InformationParser.jn0000644000175000002070000000363313441742745034657 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/PaxHeaders.7406/Titl0000644000000000000000000000013213441742745030706 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/resources/TitleParser.jnlp0000644000175000002070000000411113441742745033777 0ustar00jvanekmock00000000000000 IcedTea Title tag missing icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745027756 xustar0030 mtime=1552401893.116832663 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/testcases/0000755000175000002070000000000013441742745030643 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/testcases/PaxHeaders.7406/Info0000644000000000000000000000033113441742745030652 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/testcases/InformationTitleVendorParserTest.java 30 mtime=1552401893.116832663 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/InformationTitleVendorParser/testcases/InformationTitleVend0000644000175000002070000000641013441742745034673 0ustar00jvanekmock00000000000000/* InformationTitleVendorParserTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class InformationTitleVendorParserTest { private static ServerAccess server = new ServerAccess(); public void runTest(String jnlpName, String exception) throws Exception { List verbosed = Arrays.asList(new String[] { "-verbose" }); ProcessResult pr=server.executeJavawsHeadless(verbosed, "/" + jnlpName + ".jnlp"); String s1 = "Good simple javaws exapmle"; Assert.assertFalse("test" + jnlpName + " stdout should not contain " + s1 + " but did.", pr.stdout.contains(s1)); Assert.assertTrue("testForTitle stderr should contain " + exception + " but did not.", pr.stderr.contains(exception)); Assert.assertFalse(pr.wasTerminated); Assert.assertEquals((Integer)1, pr.returnValue); } @Test public void testInformationeParser() throws Exception { runTest("InformationParser", "net.sourceforge.jnlp.MissingInformationException"); } @Test public void testTitleParser() throws Exception { runTest("TitleParser", "net.sourceforge.jnlp.MissingTitleException"); } @Test public void testVendorParser() throws Exception { runTest("VendorParser", "net.sourceforge.jnlp.MissingVendorException"); } @Test public void testTitleVendorParser() throws Exception { // Note that the title message missing causes an immediate exception, regardless of Vendor. runTest("TitleVendorParser", "net.sourceforge.jnlp.MissingTitleException"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/Http5110000644000000000000000000000013113441742745021303 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/0000755000175000002070000000000013441742745022171 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/Http511/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745022256 xustar0030 mtime=1552401893.114832667 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/srcs/0000755000175000002070000000000013441742745023143 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/Http511/srcs/PaxHeaders.7406/Http511.java0000644000000000000000000000013213441742745024344 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/srcs/Http511.java0000644000175000002070000000420313441742745025153 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class Http511 extends Applet { @Override public void start() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println("http 511 reprodcuer executed"); System.out.println("*** APPLET FINISHED ***"); System.err.println("flushing garbage"); System.out.println("flushing garbage"); } } icedtea-web-1.8/tests/reproducers/simple/Http511/PaxHeaders.7406/resources0000644000000000000000000000013213441742745023316 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/resources/0000755000175000002070000000000013441742745024203 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/Http511/resources/PaxHeaders.7406/Http511_href.html0000644000000000000000000000013213441742745026433 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/resources/Http511_href.html0000644000175000002070000000343613441742745027251 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/Http511/resources/PaxHeaders.7406/Http511.html0000644000000000000000000000013213441742745025427 xustar0030 mtime=1552401893.115832665 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/resources/Http511.html0000644000175000002070000000341313441742745026240 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/Http511/resources/PaxHeaders.7406/Http511_applet.jnlp0000644000000000000000000000013213441742745026773 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/resources/Http511_applet.jnlp0000644000175000002070000000431413441742745027605 0ustar00jvanekmock00000000000000 Http511 IcedTea Http511 icedtea-web-1.8/tests/reproducers/simple/Http511/resources/PaxHeaders.7406/Http511.jnlp0000644000000000000000000000013213441742745025426 xustar0030 mtime=1552401893.117832661 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/resources/Http511.jnlp0000644000175000002070000000415313441742745026241 0ustar00jvanekmock00000000000000 Http511 IcedTea Http511 icedtea-web-1.8/tests/reproducers/simple/Http511/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745023301 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/testcases/0000755000175000002070000000000013441742745024167 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/Http511/testcases/PaxHeaders.7406/Http511Test.java0000644000000000000000000000013113441742745026227 xustar0029 mtime=1552401893.12283265 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/Http511/testcases/Http511Test.java0000644000175000002070000010640113441742745027042 0ustar00jvanekmock00000000000000 import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Arrays; import net.sourceforge.jnlp.ContentReaderListener; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.UrlUtils; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class Http511Test extends BrowserTest { private static final StringBasedClosingListener AOK = new AutoOkClosingListener(); private static final StringBasedClosingListener AER = new AutoErrorClosingListener(); //private static final String confirmation = "*** applet running ***"; private static final String CONFIRMATION = "http 511 reprodcuer executed"; private static ServerLauncher server511_returnsLast; private static ServerLauncher server511_notreturns; private static final long TIMEOUT_BACKUP = ServerAccess.PROCESS_TIMEOUT; private static final String HTTP511JNLP = "Http511.jnlp"; private static final String HTTP511JNLP_APPLET = "Http511_applet.jnlp"; private static final String HTTP511HTML = "Http511.html"; private static final String HTTP511HTML_HREF = "Http511_href.html"; private static final String HTTP511JAR = "Http511.jar"; @BeforeClass public static void start511limitedServer1() throws IOException { server511_returnsLast = ServerAccess.getIndependentInstance(); server511_returnsLast.setNeedsAuthentication511(true); server511_returnsLast.setRememberOrigianlUrl(true); } @BeforeClass public static void start511limitedServer2() throws IOException { server511_notreturns = ServerAccess.getIndependentInstance(); server511_notreturns.setNeedsAuthentication511(true); server511_notreturns.setRememberOrigianlUrl(false); } @BeforeClass public static void clearCache2() throws Exception { server.executeJavawsClearCache(); } @After public void resetTimeout() throws IOException { ServerAccess.PROCESS_TIMEOUT = TIMEOUT_BACKUP; } @AfterClass public static void stop511limitedServers1() throws IOException { server511_notreturns.stop(); } @AfterClass public static void stop511limitedServers2() throws IOException { server511_returnsLast.stop(); } @Before /** * When http511 fails, then record from cache is taken. And that is false * pass. So before each tes.. clear cache */ public void clearCache() throws Exception { clearCache2(); } @Before public void resetAuthTokens() { server511_notreturns.setWasuthenticated511(false); server511_returnsLast.setWasuthenticated511(false); } private static String LOGIN_SENTENCE() { return ServerLauncher.login501_2 + "?name=itw&passwd=itw"; } @Test public void http511noAuthRequired_authDeauth1_works() throws Exception { URL u = server511_returnsLast.getUrl(HTTP511JNLP); String s = UrlUtils.loadUrl(u); //see ServerLauncher createReply1 Assert.assertTrue(s.contains("Network Authentication Required")); Assert.assertFalse(s.contains(HTTP511JAR)); URL u00 = server511_returnsLast.getUrl(ServerLauncher.login501_2 + "?name=wrong&passwd=wrong"); String s00 = UrlUtils.loadUrl(u00); Assert.assertTrue(s00.contains("Network Authentication Required")); Assert.assertFalse(s00.contains(HTTP511JAR)); URL u0 = server511_returnsLast.getUrl(LOGIN_SENTENCE()); String s0 = UrlUtils.loadUrl(u0); //? empty is probably ok :) As it have no resoure to rember String s1 = UrlUtils.loadUrl(u); //see ServerLauncher createReply1 Assert.assertFalse(s1.contains("Network Authentication Required")); Assert.assertTrue(s1.contains(HTTP511JAR)); server511_returnsLast.setWasuthenticated511(false); String s2 = UrlUtils.loadUrl(u); //see ServerLauncher createReply1 Assert.assertTrue(s2.contains("Network Authentication Required")); Assert.assertFalse(s2.contains(HTTP511JAR)); } @Test public void http511noAuthRequired_authDeauth2_works() throws Exception { URL u = server511_notreturns.getUrl(HTTP511JNLP); String s = UrlUtils.loadUrl(u); //see ServerLauncher createReply1 Assert.assertTrue(s.contains("Network Authentication Required")); Assert.assertFalse(s.contains(HTTP511JAR)); URL u00 = server511_notreturns.getUrl(ServerLauncher.login501_2 + "?name=wrong&passwd=wrong"); String s00 = UrlUtils.loadUrl(u00); Assert.assertTrue(s00.contains("Network Authentication Required")); Assert.assertFalse(s00.contains(HTTP511JAR)); String s01 = UrlUtils.loadUrl(u); //see ServerLauncher createReply1 Assert.assertTrue(s01.contains("Network Authentication Required")); Assert.assertFalse(s01.contains(HTTP511JAR)); URL u0 = server511_notreturns.getUrl(LOGIN_SENTENCE()); String s0 = UrlUtils.loadUrl(u0); // see TinnyHttpdImpl Assert.assertTrue(s0.contains("Authentication ok, get back to your resource")); String s1 = UrlUtils.loadUrl(u); //see ServerLauncher createReply1 Assert.assertFalse(s1.contains("Network Authentication Required")); Assert.assertTrue(s1.contains(HTTP511JAR)); server511_notreturns.setWasuthenticated511(false); String s2 = UrlUtils.loadUrl(u); //see ServerLauncher createReply1 Assert.assertTrue(s2.contains("Network Authentication Required")); Assert.assertFalse(s2.contains(HTTP511JAR)); } //all on same host @Test public void http511noAuthRequired_jnlp_testcaseJustWorks() throws Exception { ProcessResult p = server.executeJavawsHeadless(HTTP511JNLP); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511noAuthRequired_jnlpApplet_testcaseJustWorks() throws Exception { ProcessResult p = server.executeJavawsHeadless(HTTP511JNLP_APPLET, AOK, null); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } //@Test public void http511AuthRequiredXfull1_jnlp_notAutomatted() throws Exception { //gui test ServerAccess.PROCESS_TIMEOUT = 1000 * 60; URL u = server511_returnsLast.getUrl(HTTP511JNLP); ProcessResult p = ServerAccess.executeProcessUponURL(server.getJavawsLocation(), null, u); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } //@Test public void http511AuthRequiredXfull2_jnlp_notAutomatted() throws Exception { //gui test ServerAccess.PROCESS_TIMEOUT = 1000 * 60; URL u = server511_notreturns.getUrl(HTTP511JNLP); ProcessResult p = ServerAccess.executeProcessUponURL(server.getJavawsLocation(), null, u); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } //@Test public void http511AuthRequiredXfull1_jnlpApplet_notAutomatted() throws Exception { //gui test ServerAccess.PROCESS_TIMEOUT = 1000 * 60; URL u = server511_returnsLast.getUrl(HTTP511JNLP_APPLET); ProcessResult p = ServerAccess.executeProcessUponURL(server.getJavawsLocation(), null, u); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } //@Test public void http511AuthRequiredXfull2_jnlpApplet_notAutomatted() throws Exception { //gui test ServerAccess.PROCESS_TIMEOUT = 1000 * 60; URL u = server511_notreturns.getUrl(HTTP511JNLP_APPLET); ProcessResult p = ServerAccess.executeProcessUponURL(server.getJavawsLocation(), null, u); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void http511noAuthRequired_browser_testcaseJustWorks() throws Exception { ProcessResult p = server.executeBrowser(HTTP511HTML, ServerAccess.AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void http511noAuthRequired_browser_jnlpHref_testcaseJustWorks() throws Exception { ProcessResult p = server.executeBrowser(HTTP511HTML, ServerAccess.AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } //@Test @TestInBrowsers(testIn = Browsers.one) public void http511AuthRequiredXfull1_browser_notAutomated() throws Exception { //gui test ServerAccess.PROCESS_TIMEOUT = 1000 * 60; try { URL u = server511_returnsLast.getUrl(HTTP511HTML); ProcessResult p = server.executeBrowser(null, u, AOK, null); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } finally { //browser tests canbe run in loop, so @before/@after are not enoug resetAuthTokens(); clearCache(); } } //@Test @TestInBrowsers(testIn = Browsers.one) public void http511AuthRequiredXfull2_browser_notAutomated() throws Exception { //gui test ServerAccess.PROCESS_TIMEOUT = 1000 * 60; try { URL u = server511_notreturns.getUrl(HTTP511HTML); ProcessResult p = server.executeBrowser(null, u, AOK, null); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } finally { //browser tests canbe run in loop, so @before/@after are not enoug resetAuthTokens(); clearCache(); } } //@Test @TestInBrowsers(testIn = Browsers.one) public void http511AuthRequiredXfull1_jnlpHref_notAutomated() throws Exception { //gui test ServerAccess.PROCESS_TIMEOUT = 1000 * 60; try { URL u = server511_returnsLast.getUrl(HTTP511HTML_HREF); ProcessResult p = server.executeBrowser(null, u, AOK, null); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } finally { //browser tests canbe run in loop, so @before/@after are not enoug resetAuthTokens(); clearCache(); } } //@Test @TestInBrowsers(testIn = Browsers.one) public void http511AuthRequiredXfull2_jnlpHref_notAutomated() throws Exception { //gui test ServerAccess.PROCESS_TIMEOUT = 1000 * 60; try { URL u = server511_notreturns.getUrl(HTTP511HTML_HREF); ProcessResult p = server.executeBrowser(null, u, AOK, null); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } finally { //browser tests canbe run in loop, so @before/@after are not enoug resetAuthTokens(); clearCache(); } } @Test @TestInBrowsers(testIn = Browsers.one) public void http511AuthRequiredXfull1_browser_autheticateFirst() throws Exception { try { URL u0 = server511_returnsLast.getUrl(LOGIN_SENTENCE()); String s = UrlUtils.loadUrl(u0); URL u = server511_returnsLast.getUrl(HTTP511HTML); ProcessResult p = server.executeBrowser(null, u, AOK, null); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } finally { //browser tests canbe run in loop, so @before/@after are not enoug resetAuthTokens(); clearCache(); } } @Test @TestInBrowsers(testIn = Browsers.one) public void http511AuthRequiredXfull2_browser_autheticateFirst() throws Exception { try { URL u0 = server511_notreturns.getUrl(LOGIN_SENTENCE()); String s = UrlUtils.loadUrl(u0); URL u = server511_notreturns.getUrl(HTTP511HTML); ProcessResult p = server.executeBrowser(null, u, AOK, null); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } finally { //browser tests canbe run in loop, so @before/@after are not enoug resetAuthTokens(); clearCache(); } } //real warhorses - stdout/in based logins //jnlp application @Test public void http511AuthRequired_jnlp_fails_noRemoteLogin() throws Exception { URL u = server511_returnsLast.getUrl(HTTP511JNLP); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), u, Arrays.asList(new ContentReaderListener[]{AOK}), null, null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(CONFIRMATION)); Assert.assertFalse(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired_jnlp() throws Exception { URL u = server511_returnsLast.getUrl(HTTP511JNLP); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), u, Arrays.asList(new ContentReaderListener[]{new ExternalLogin(server511_returnsLast), AOK}), null, null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired2_jnlp_fails_noRemoteLogin() throws Exception { URL u = server511_notreturns.getUrl(HTTP511JNLP); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), u, Arrays.asList(new ContentReaderListener[]{AOK}), null, null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(CONFIRMATION)); Assert.assertFalse(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired2_jnlp() throws Exception { URL u = server511_notreturns.getUrl(HTTP511JNLP); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), u, Arrays.asList(new ContentReaderListener[]{new ExternalLogin(server511_notreturns), AOK}), null, null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } //jnlp applet @Test public void http511AuthRequired_jnlp_applet_fails_noRemoteLogin() throws Exception { URL u = server511_returnsLast.getUrl(HTTP511JNLP_APPLET); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), u, Arrays.asList(new ContentReaderListener[]{AOK}), null, null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(CONFIRMATION)); Assert.assertFalse(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired_applet_jnlp() throws Exception { URL u = server511_returnsLast.getUrl(HTTP511JNLP_APPLET); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), u, Arrays.asList(new ContentReaderListener[]{new ExternalLogin(server511_returnsLast), AOK}), null, null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired2_jnlp_applet_fails_noRemoteLogin() throws Exception { URL u = server511_notreturns.getUrl(HTTP511JNLP_APPLET); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), u, Arrays.asList(new ContentReaderListener[]{AOK}), null, null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(CONFIRMATION)); Assert.assertFalse(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired2_jnlp_applet() throws Exception { URL u = server511_notreturns.getUrl(HTTP511JNLP_APPLET); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), u, Arrays.asList(new ContentReaderListener[]{new ExternalLogin(server511_notreturns), AOK}), null, null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } //resources on different ports - html/jnlp(hreff)/jar @Test public void http511AuthRequired_jnlpOkServerResource511Server_fails_noRemoteLogin() throws Exception { URL remoteJar = server511_returnsLast.getUrl(HTTP511JAR); String original = FileUtils.loadFileAsString(new File(server.getDir(), HTTP511JNLP)); original = original.replace(HTTP511JAR, remoteJar.toExternalForm()); original = original.replace("href=\"Http511.jnlp\"", ""); String nwFile = "2_" + HTTP511JNLP; FileUtils.saveFile(original, new File(server.getDir(), nwFile)); URL nwJnlp = server.getUrl(nwFile); final StringBasedClosingListener sbc = new StringBasedClosingListener("Initialization Error"); //there is bug somewhere, this do not exit in headless mode ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), nwJnlp, Arrays.asList(new ContentReaderListener[]{AOK}), Arrays.asList(new ContentReaderListener[]{sbc}), null); pw.setWriter("SKIP\n"); new Thread() { @Override public void run() { while (sbc.getAssasin() == null) { //this happens during pw.execute(); } sbc.getAssasin().setUseKill(true);//for some reason this one do not repond on sigTerm } }.start(); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(CONFIRMATION)); Assert.assertFalse(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired_jnlpOkServerResource511Server() throws Exception { URL remoteJar = server511_returnsLast.getUrl(HTTP511JAR); String original = FileUtils.loadFileAsString(new File(server.getDir(), HTTP511JNLP)); original = original.replace(HTTP511JAR, remoteJar.toExternalForm()); original = original.replace("href=\"Http511.jnlp\"", ""); String nwFile = "2_" + HTTP511JNLP; FileUtils.saveFile(original, new File(server.getDir(), nwFile)); URL nwJnlp = server.getUrl(nwFile); StringBasedClosingListener sbc = new StringBasedClosingListener("Initialization Error"); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), nwJnlp, Arrays.asList(new ContentReaderListener[]{new ExternalLogin(server511_returnsLast), AOK}), Arrays.asList(new ContentReaderListener[]{sbc}), null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired_jnlpOneFirstAuthorisedServerServerResourceAnother511Server() throws Exception { URL remoteJar = server511_returnsLast.getUrl(HTTP511JAR); String original = FileUtils.loadFileAsString(new File(server.getDir(), HTTP511JNLP)); original = original.replace(HTTP511JAR, remoteJar.toExternalForm()); original = original.replace("href=\"Http511.jnlp\"", ""); String nwFile = "2_" + HTTP511JNLP; FileUtils.saveFile(original, new File(server.getDir(), nwFile)); URL nwJnlp = server511_notreturns.getUrl(nwFile); StringBasedClosingListener sbc = new StringBasedClosingListener("Initialization Error"); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), nwJnlp, Arrays.asList(new ContentReaderListener[]{new ExternalLogin(server511_returnsLast), new ExternalLogin(server511_notreturns), AOK}), Arrays.asList(new ContentReaderListener[]{sbc}), null); // although ExternlLoging is launched correctly after app is started and before prompt is requested, // sometimes the skip goes before ExternlLoging completesd // those empty lines seems to be causing enough delay pw.setWriter("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nSKIP\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } //@Test public void http511AuthRequired_jnlpOneFirstAuthorisedServerServerResourceAnother511Server_notAutomatted_xFull() throws Exception { ServerAccess.PROCESS_TIMEOUT = 1000 * 60; URL remoteJar = server511_returnsLast.getUrl(HTTP511JAR); String original = FileUtils.loadFileAsString(new File(server.getDir(), HTTP511JNLP)); original = original.replace(HTTP511JAR, remoteJar.toExternalForm()); original = original.replace("href=\"Http511.jnlp\"", ""); String nwFile = "2_" + HTTP511JNLP; FileUtils.saveFile(original, new File(server.getDir(), nwFile)); URL nwJnlp = server511_notreturns.getUrl(nwFile); StringBasedClosingListener sbc = new StringBasedClosingListener("Initialization Error"); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), null, nwJnlp, Arrays.asList(new ContentReaderListener[]{new ExternalLogin(server511_returnsLast), new ExternalLogin(server511_notreturns), AOK}), Arrays.asList(new ContentReaderListener[]{sbc}), null); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired_jnlpOneFirstAuthorisedServerServerResourceAnother511Server_fail1_oneLoginNotEnough() throws Exception { URL remoteJar = server511_returnsLast.getUrl(HTTP511JAR); String original = FileUtils.loadFileAsString(new File(server.getDir(), HTTP511JNLP)); original = original.replace(HTTP511JAR, remoteJar.toExternalForm()); original = original.replace("href=\"Http511.jnlp\"", ""); String nwFile = "2_" + HTTP511JNLP; FileUtils.saveFile(original, new File(server.getDir(), nwFile)); URL nwJnlp = server511_notreturns.getUrl(nwFile); final StringBasedClosingListener sbc = new StringBasedClosingListener("Initialization Error"); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), nwJnlp, Arrays.asList(new ContentReaderListener[]{new ExternalLogin(server511_notreturns), AOK}), Arrays.asList(new ContentReaderListener[]{sbc}), null); pw.setWriter("SKIP\n"); new Thread() { @Override public void run() { while (sbc.getAssasin() == null) { //this happens during pw.execute(); } sbc.getAssasin().setUseKill(true);//for some reason this one do not repond on sigTerm } }.start(); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(CONFIRMATION)); Assert.assertFalse(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void http511AuthRequired_jnlpOneFirstAuthorisedServerServerResourceAnother511Server_fail2_oneLoginNotEnough() throws Exception { URL remoteJar = server511_returnsLast.getUrl(HTTP511JAR); String original = FileUtils.loadFileAsString(new File(server.getDir(), HTTP511JNLP)); original = original.replace(HTTP511JAR, remoteJar.toExternalForm()); original = original.replace("href=\"Http511.jnlp\"", ""); String nwFile = "2_" + HTTP511JNLP; FileUtils.saveFile(original, new File(server.getDir(), nwFile)); URL nwJnlp = server511_notreturns.getUrl(nwFile); StringBasedClosingListener sbc = new StringBasedClosingListener("Initialization Error"); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), nwJnlp, Arrays.asList(new ContentReaderListener[]{new ExternalLogin(server511_returnsLast), AOK}), Arrays.asList(new ContentReaderListener[]{sbc}), null); pw.setWriter("SKIP\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(CONFIRMATION)); Assert.assertFalse(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } //brutal xfull killer - everthing from its separate 511server //@Test @TestInBrowsers(testIn = Browsers.one) public void http511AuthRequiredXfull1_jnlpHref_notAutomated_allFromDifferent() throws Exception { //gui test ServerAccess.PROCESS_TIMEOUT = 1000 * 60; ServerLauncher special511 = ServerAccess.getIndependentInstance(); special511.setNeedsAuthentication511(true); special511.setRememberOrigianlUrl(true); try { URL remoteJar = server511_notreturns.getUrl(HTTP511JAR); String originalJnlp = FileUtils.loadFileAsString(new File(server.getDir(), HTTP511JNLP_APPLET)); originalJnlp = originalJnlp.replace(HTTP511JAR, remoteJar.toExternalForm()); originalJnlp = originalJnlp.replace("href=\"Http511_applet.jnlp\"", ""); String nwJnlp = "2_" + HTTP511JNLP_APPLET; FileUtils.saveFile(originalJnlp, new File(server.getDir(), nwJnlp)); URL remoteJnlp = server511_returnsLast.getUrl(nwJnlp); String originalHtml = FileUtils.loadFileAsString(new File(server.getDir(), HTTP511HTML_HREF)); originalHtml = originalHtml.replace(HTTP511JNLP_APPLET, remoteJnlp.toExternalForm()); String nwHtml = "2_" + HTTP511HTML_HREF; FileUtils.saveFile(originalHtml, new File(server.getDir(), nwHtml)); URL u = special511.getUrl(nwHtml); ProcessResult p = server.executeBrowser(null, u, AOK, null); Assert.assertTrue(p.stdout.contains(CONFIRMATION)); Assert.assertTrue(p.stdout.contains(AOK.getCondition())); //Assert.assertFalse(p.stderr.contains(aer.getCondition())); } finally { special511.stop(); //browser tests canbe run in loop, so @before/@after are not enoug resetAuthTokens(); clearCache(); } } //squid @Test public void squidReminder() throws Exception { //the patch was tested against two follwwing configs (to acces outter resources): //none of them was perfect:( /** * Config 1, you need to know secret url where to log, see the root.cz * see it in the regex. */ /* # Set up the session helper in active mode. Mind the wrap - this is one line: external_acl_type session concurrency=100 ttl=3 %SRC /usr/lib64/squid/ext_session_acl -a -T 10800 -b /var/lib/squid/session/ # Pass the LOGIN command to the session helper with this ACL acl session_login external session LOGIN # Normal session ACL as per simple example acl session_is_active external session # ACL to match URL acl clicked_login_url url_regex -i a-url-that-must-match$ acl clicked_login_url url_regex -i .*root.cz.* # First check for the login URL. If present, login session http_access allow clicked_login_url session_login # Deny page to display deny_info 511:../splash.html existing_users # If we get here, URL not present, so renew session or deny request. http_access deny !session_is_active */ /** * This is better and is really checking 511 in real world. Unluckily, * have bug. It have "pass" timeout. If you wait with logging attempt * long enough, it will log you in. */ /* # See ttl - thats the time how long ou need to wait for login # mind the wrap. this is one line: external_acl_type splash_page ttl=60 concurrency=100 %SRC /usr/lib64/squid/ext_session_acl -t 7200 -b /var/lib/squid/session.db acl existing_users external splash_page http_access deny !existing_users # Deny page to display deny_info 511:../splash.html existing_users */ } private static class ExternalLogin implements ContentReaderListener { private final ServerLauncher lServer; private boolean was511 = false; private ExternalLogin(ServerLauncher llServer) { lServer = llServer; } public void login() throws IOException { URL u = lServer.getUrl(LOGIN_SENTENCE()); String s0 = UrlUtils.loadUrl(u); } @Override public void charReaded(char ch) { //no op } @Override public void lineReaded(String s) { if (s.contains("511")) { was511 = true; } if (was511) { if (s.contains("YES") && s.contains("CANCEL") && s.contains("SKIP")) { try { login(); } catch (IOException e) { throw new RuntimeException(e); } } } } } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/FakeCodebase0000644000000000000000000000013213441742745022432 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/0000755000175000002070000000000013441742745023317 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023404 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/srcs/0000755000175000002070000000000013441742745024271 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/srcs/PaxHeaders.7406/FakeCodebase.java0000644000000000000000000000013213441742745026620 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/srcs/FakeCodebase.java0000644000175000002070000000366613441742745027443 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class FakeCodebase extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024430 xustar0030 mtime=1552401893.113832669 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/testcases/0000755000175000002070000000000013441742745025315 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/testcases/PaxHeaders.7406/FakeCodebaseTests.ja0000644000000000000000000000013213441742745030340 xustar0030 mtime=1552401893.113832669 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/testcases/FakeCodebaseTests.java0000644000175000002070000002706513441742745031511 0ustar00jvanekmock00000000000000/* AppletTestTests.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import static org.junit.Assert.assertTrue; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.security.appletextendedsecurity.impl.UnsignedAppletActionStorageImpl; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.util.FileUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class FakeCodebaseTests extends BrowserTest { private static DeploymentPropertiesModifier dp; private static File backup; private static final String HTMLIN = "FakeCodebase.html"; private static final String ORIG_BASE = "OriginalCodebase.html"; private static final String JHTMLIN = "FakeCodebase.jnlp"; private static final String JORIG_BASE = "OriginalCodebase.jnlp"; private static final ServerLauncher evilServer1 = ServerAccess.getIndependentInstance(); private static final ServerLauncher evilServer2 = ServerAccess.getIndependentInstance(); @AfterClass public static void killServer1() throws IOException { evilServer1.stop(); } @AfterClass public static void killServer2() throws IOException { evilServer2.stop(); } @BeforeClass public static void setSecurity() throws IOException { dp = new DeploymentPropertiesModifier(); dp.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ASK_UNSIGNED.name()); } @BeforeClass public static void backupAppTrust() throws IOException { backup = File.createTempFile("fakeCodebase", "itwReproducers"); backup.deleteOnExit(); FirefoxProfilesOperator.copyFile(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile(), backup); } @AfterClass public static void restoreAppTrust() throws IOException { FirefoxProfilesOperator.copyFile(backup, PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); } @AfterClass public static void resetSecurity() throws IOException { dp.restoreProperties(); } //headless dialogues now works only for javaws. //@Test @TestInBrowsers(testIn = {Browsers.all}) @NeedsDisplay public void FakeCodebaseTest() throws Exception { DeploymentPropertiesModifier dp = new DeploymentPropertiesModifier(); dp.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.NONE.name()); try { String ob1 = FileUtils.loadFileAsString(new File(server.getDir(), ORIG_BASE)); assertTrue(ob1.contains("id=\"FakeCodebase0\"")); //check orig.html is correct one PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file is an must //run normal applet on normal codebase with standard server //answer YES + rember for ever + for codebase ProcessResult pr1 = server.executeBrowser("/" + ORIG_BASE, AutoClose.CLOSE_ON_CORRECT_END); assertTrue(pr1.stdout.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)); //the record was added to .appletSecuritySettings assertRecordsCountInAppletTrustSettings(1); //create atacker String htmlin = FileUtils.loadFileAsString(new File(server.getDir(), HTMLIN + ".in")); //now change codebase to be same as ^ but launch applet from evilServer1 htmlin = htmlin.replaceAll("EVILURL2", server.getUrl().toExternalForm()); //and as bonus get resources from evilServer2 htmlin = htmlin.replaceAll("EVILURL1", evilServer2.getUrl().toExternalForm()); FileUtils.saveFile(htmlin, new File(server.getDir(), HTMLIN)); String ob2 = FileUtils.loadFileAsString(new File(server.getDir(), HTMLIN)); assertTrue(ob2.contains("id=\"FakeCodebase1\"")); ProcessResult pr2 = ServerAccess.executeProcessUponURL( server.getBrowserLocation(), null, evilServer1.getUrl("/" + HTMLIN), new AutoOkClosingListener(), null ); //this MUST ask for permissions to run, otherwise fail assertTrue(pr2.stdout.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)); assertRecordsCountInAppletTrustSettings(2); } finally { dp.restoreProperties(); } } @Test @NeedsDisplay public void FakeCodebaseTestJavawsRemberCodebaseAndPassBoth() throws Exception { testJavaws(true); } @Test @NeedsDisplay public void FakeCodebaseTestJavawsRemberCodebaseAndFailSecond() throws Exception { testJavaws(true, true); } @Test @NeedsDisplay public void FakeCodebaseTestJavawsRemeberFileAndPassSecond() throws Exception { testJavaws(false); } @Test @NeedsDisplay public void FakeCodebaseTestJavawsRemeberFileAndFailSecond() throws Exception { testJavaws(false, true); } public void testJavaws(boolean codebase) throws Exception { testJavaws(codebase, false); } public void testJavaws(boolean codebase, boolean stopSecond) throws Exception { DeploymentPropertiesModifier dp = new DeploymentPropertiesModifier(); dp.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.name()); try { String ob1 = FileUtils.loadFileAsString(new File(server.getDir(), JORIG_BASE)); assertTrue(ob1.contains("FakeCodebase0")); //check orig.html is correct one PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file is an must ProcessWrapper pw1 = new ProcessWrapper( server.getJavawsLocation(), Arrays.asList(OptionsDefinitions.OPTIONS.HEADLESS.option), server.getUrl("/" + JORIG_BASE)); if (codebase) { pw1.setWriter("RC YES"); } else { pw1.setWriter("R YES"); } ProcessResult pr1 = pw1.execute(); Assert.assertTrue(pr1.stdout.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)); //the record was added to .appletSecuritySettings String s2 = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()).trim(); Assert.assertNotEquals("on codebase only, the file must not be stroed, stright save, it must be", codebase, s2.contains(JORIG_BASE)); assertRecordsCountInAppletTrustSettings(1); //create atacker String htmlin = FileUtils.loadFileAsString(new File(server.getDir(), JHTMLIN + ".in")); //now change codebase to be same as ^ but launch applet from evilServer1 htmlin = htmlin.replaceAll("EVILURL2", server.getUrl().toExternalForm()); //and as bonus get resources from evilServer2 htmlin = htmlin.replaceAll("EVILURL1", evilServer2.getUrl().toExternalForm()); FileUtils.saveFile(htmlin, new File(server.getDir(), JHTMLIN)); String ob2 = FileUtils.loadFileAsString(new File(server.getDir(), JHTMLIN)); assertTrue(ob2.contains("FakeCodebase1")); ProcessWrapper pw2 = new ProcessWrapper( server.getJavawsLocation(), Arrays.asList(OptionsDefinitions.OPTIONS.HEADLESS.option), evilServer1.getUrl("/" + JHTMLIN) ); String word = "YES"; if (stopSecond) { word = "NO"; } if (codebase) { pw2.setWriter("RC " + word); } else { pw2.setWriter("R " + word); } ProcessResult pr2 = pw2.execute(); //this MUST ask for permissions to run, otherwise fail Assert.assertNotEquals("if second was run, correct end must be printed, otherwise mus tnot be printed",stopSecond, pr2.stdout.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)); String s1 = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()).trim(); Assert.assertNotEquals("on codebase only, the file must not be stroed, stright save, it must be", codebase, s1.contains(JHTMLIN)); Assert.assertNotEquals("on codebase only, the file must not be stroed, stright save, it must be", codebase, s1.contains(JORIG_BASE)); assertRecordsCountInAppletTrustSettings(2); } finally { dp.restoreProperties(); } } private void assertRecordsCountInAppletTrustSettings(int expected) throws Exception{ UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); //i1.readContents(); Method readContents = UnsignedAppletActionStorageImpl.class.getDeclaredMethod("readContents"); readContents.setAccessible(true); readContents.invoke(i1); Assert.assertEquals(expected, i1.getMatchingItems(null, null, null).size()); } } icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024444 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/resources/0000755000175000002070000000000013441742745025331 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/resources/PaxHeaders.7406/FakeCodebase.html.in0000644000000000000000000000013213441742745030310 xustar0030 mtime=1552401893.130832634 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/resources/FakeCodebase.html.in0000644000175000002070000000347313441742745031127 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/resources/PaxHeaders.7406/FakeCodebase.jnlp.in0000644000000000000000000000013213441742745030307 xustar0030 mtime=1552401893.115832665 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/resources/FakeCodebase.jnlp.in0000644000175000002070000000057513441742745031126 0ustar00jvanekmock00000000000000 OriginalCodebase FakeCodebase IcedTea icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/resources/PaxHeaders.7406/OriginalCodebase.jnl0000644000000000000000000000013213441742745030420 xustar0030 mtime=1552401893.120832654 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/resources/OriginalCodebase.jnlp0000644000175000002070000000055613441742745031416 0ustar00jvanekmock00000000000000 OriginalCodebase FakeCodebase IcedTea icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/resources/PaxHeaders.7406/OriginalCodebase.htm0000644000000000000000000000013213441742745030425 xustar0030 mtime=1552401893.117832661 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/FakeCodebase/resources/OriginalCodebase.html0000644000175000002070000000345313441742745031416 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/EntryPointUnsignedSingleInvalid0000644000000000000000000000013113441742745026416 xustar0029 mtime=1552401893.15183259 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/0000755000175000002070000000000013441742745027304 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745030414 xustar0029 mtime=1552401893.15183259 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/testcases/0000755000175000002070000000000013441742745031302 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/testcases/PaxHeaders.7406/E0000644000000000000000000000033613441742745030607 xustar00133 path=icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/testcases/EntryPointUnsignedSingleInvalidTest.java 29 mtime=1552401893.15183259 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/testcases/EntryPointUnsigne0000644000175000002070000001400713441742745034673 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointUnsignedSingleInvalidTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; //this test is moreover only testing that the attribute is ignored in unsigend app @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException { dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException { dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointUnsignedSingleInvalid.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointUnsignedSingleInvalid_security.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "EntryPointUnsignedSingleInvalid_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointUnsignedSingleInvalid_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception { server.getBrowserLocation(); ProcessResult p = server.executeBrowser("EntryPointUnsignedSingleInvalid.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "EntryPointUnsignedSingleInvalid.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745027371 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/0000755000175000002070000000000013441742745030256 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/PaxHeaders.7406/EntryP0000644000000000000000000000032613441742745030617 xustar00124 path=icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/EntryPointUnsignedSingleInvalid.java 30 mtime=1552401893.113832669 30 atime=1552402157.275253395 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/EntryPointUnsignedSing0000644000175000002070000000407413441742745034637 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointUnsignedSingleInvalid extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/PaxHeaders.7406/META-I0000644000000000000000000000013213441742745030305 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/META-INF/0000755000175000002070000000000013441742745031416 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/META-INF/PaxHeaders.740000644000000000000000000000013213441742745030363 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/META-INF/MANIFEST.MF0000644000175000002070000000007313441742745033050 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Entry-Point: SomeDifferentMainClass icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/PaxHeaders.7406/resources0000644000000000000000000000013213441742745030431 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/0000755000175000002070000000000013441742745031316 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/PaxHeaders.7406/E0000644000000000000000000000034313441742745030621 xustar00138 path=icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid_security.jnlp 29 mtime=1552401893.12283265 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsigne0000644000175000002070000000444113441742745034710 0ustar00jvanekmock00000000000000 EntryPointUnsignedSingleInvalid IcedTea EntryPointUnsignedSingleInvalid icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/PaxHeaders.7406/E0000644000000000000000000000033313441742745030620 xustar00129 path=icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid.html 30 mtime=1552401893.130832634 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsigne0000644000175000002070000000347313441742745034714 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/PaxHeaders.7406/E0000644000000000000000000000033313441742745030620 xustar00129 path=icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid.jnlp 30 mtime=1552401893.114832667 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsigne0000644000175000002070000000434313441742745034711 0ustar00jvanekmock00000000000000 EntryPointUnsignedSingleInvalid IcedTea EntryPointUnsignedSingleInvalid icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/PaxHeaders.7406/E0000644000000000000000000000035313441742745030622 xustar00145 path=icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid_applet_security.jnlp 30 mtime=1552401893.119832657 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsigne0000644000175000002070000000463713441742745034717 0ustar00jvanekmock00000000000000 EntryPointUnsignedSingleInvalid IcedTea EntryPointUnsignedSingleInvalid icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/PaxHeaders.7406/E0000644000000000000000000000034213441742745030620 xustar00136 path=icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid_applet.jnlp 30 mtime=1552401893.116832663 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsigne0000644000175000002070000000452113441742745034707 0ustar00jvanekmock00000000000000 EntryPointUnsignedSingleInvalid IcedTea EntryPointUnsignedSingleInvalid icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/EmbeddedJnlpInApplet0000644000000000000000000000013113441742745024107 xustar0029 mtime=1552401893.15183259 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/0000755000175000002070000000000013441742745024775 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745026105 xustar0029 mtime=1552401893.15183259 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/testcases/0000755000175000002070000000000013441742745026773 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/testcases/PaxHeaders.7406/EmbeddedJnlp0000644000000000000000000000031013441742745030421 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/testcases/EmbeddedJnlpInAppletTest.java 29 mtime=1552401893.15183259 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/testcases/EmbeddedJnlpInAppletTest.jav0000644000175000002070000000620513441742745034312 0ustar00jvanekmock00000000000000/* EmbeddedJnlpInAppletTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class EmbeddedJnlpInAppletTest extends BrowserTest { final static String s = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; @Test @TestInBrowsers(testIn = { Browsers.one }) public void JnlpInApplet() throws Exception { ProcessResult pr = server.executeBrowser("/JnlpInApplet.html", AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue("Stdout should contain " + s + " but did not", pr.stdout.contains(s)); } @Test @TestInBrowsers(testIn = { Browsers.one }) public void EmbeddedJnlpInAppletWithADotAsCodebase() throws Exception { ProcessResult pr = server.executeBrowser("/EmbeddedJnlpInAppletWithDotCodebase.html", AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue("Stdout should contain " + s + " but did not", pr.stdout.contains(s)); } @Test @TestInBrowsers(testIn = { Browsers.one }) public void EmbeddedJnlpInAppletWithNoCodebase() throws Exception { ProcessResult pr = server.executeBrowser("/EmbeddedJnlpInAppletNoCodebase.html", AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue("Stdout should contain " + s + " but did not", pr.stdout.contains(s)); } } icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/PaxHeaders.7406/resources0000644000000000000000000000013113441742745026121 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/0000755000175000002070000000000013441742745027007 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/PaxHeaders.7406/EmbeddedJnlp0000644000000000000000000000032313441742745030441 xustar00122 path=icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/EmbeddedJnlpInAppletWithDotCodebase.html 29 mtime=1552401893.12283265 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/EmbeddedJnlpInAppletWithDotC0000644000175000002070000001240513441742745034314 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/PaxHeaders.7406/JnlpInApplet0000644000000000000000000000013213441742745030462 xustar0030 mtime=1552401893.112832671 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/JnlpInApplet.html0000644000175000002070000000346213441742745032242 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/PaxHeaders.7406/EmbeddedJnlp0000644000000000000000000000031713441742745030444 xustar00117 path=icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/EmbeddedJnlpInAppletNoCodebase.html 30 mtime=1552401893.119832657 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/EmbeddedJnlpInAppletNoCodeba0000644000175000002070000001244513441742745034305 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/PaxHeaders.7406/EmbeddedJnlp0000644000000000000000000000013213441742745030437 xustar0030 mtime=1552401893.116832663 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/resources/EmbeddedJnlp.jnlp0000644000175000002070000000436013441742745032214 0ustar00jvanekmock00000000000000 SignedAppletTest IcedTea SignedAppletTest icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025062 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.106183459 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/srcs/0000755000175000002070000000000013441742745025747 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/srcs/PaxHeaders.7406/EmbeddedJnlp.java0000644000000000000000000000013213441742745030317 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.274253398 30 ctime=1552410887.085183508 icedtea-web-1.8/tests/reproducers/simple/EmbeddedJnlpInApplet/srcs/EmbeddedJnlp.java0000644000175000002070000000346513441742745031137 0ustar00jvanekmock00000000000000/* EmbeddedJnlp.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; @SuppressWarnings("serial") public class EmbeddedJnlp extends Applet { @Override public void start() { System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/DownloadService20000644000000000000000000000013213441742745023310 xustar0030 mtime=1552401893.129832636 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/DownloadService2/0000755000175000002070000000000013441742745024175 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/DownloadService2/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024262 xustar0030 mtime=1552401893.150832592 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/DownloadService2/srcs/0000755000175000002070000000000013441742745025147 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/DownloadService2/srcs/PaxHeaders.7406/DownloadService2.java0000644000000000000000000000013213441742745030354 xustar0030 mtime=1552401893.129832636 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/DownloadService2/srcs/DownloadService2.java0000644000175000002070000000346413441742745031173 0ustar00jvanekmock00000000000000/* DownloadService2.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import javax.jnlp.*; public class DownloadService2 { public static void main(String[] args) throws UnavailableServiceException { ServiceManager.lookup("javax.jnlp.DownloadService2"); } } icedtea-web-1.8/tests/reproducers/simple/DownloadService2/srcs/PaxHeaders.7406/DownloadService.java0000644000000000000000000000013213441742745030272 xustar0030 mtime=1552401893.150832592 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/DownloadService2/srcs/DownloadService.java0000644000175000002070000000346113441742745031106 0ustar00jvanekmock00000000000000/* DownloadService2.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import javax.jnlp.*; public class DownloadService { public static void main(String[] args) throws UnavailableServiceException{ ServiceManager.lookup("javax.jnlp.DownloadService"); } } icedtea-web-1.8/tests/reproducers/simple/DownloadService2/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025322 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/DownloadService2/resources/0000755000175000002070000000000013441742745026207 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/DownloadService2/resources/PaxHeaders.7406/DownloadService.0000644000000000000000000000013213441742745030470 xustar0030 mtime=1552401893.112832671 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/DownloadService2/resources/DownloadService.jnlp0000644000175000002070000000377113441742745032174 0ustar00jvanekmock00000000000000 looup downloadservice IcedTea icedtea-web-1.8/tests/reproducers/simple/DownloadService2/resources/PaxHeaders.7406/DownloadService20000644000000000000000000000013213441742745030474 xustar0030 mtime=1552401893.120832654 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/DownloadService2/resources/DownloadService2.jnlp0000644000175000002070000000377413441742745032261 0ustar00jvanekmock00000000000000 looup downloadservice2 IcedTea icedtea-web-1.8/tests/reproducers/simple/DownloadService2/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025306 xustar0030 mtime=1552401893.114832667 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/DownloadService2/testcases/0000755000175000002070000000000013441742745026173 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/DownloadService2/testcases/PaxHeaders.7406/DownloadService20000644000000000000000000000013213441742745030460 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/DownloadService2/testcases/DownloadService2Test.java0000644000175000002070000000441213441742745033051 0ustar00jvanekmock00000000000000/* DownloadService2Test.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class DownloadService2Test { private static ServerAccess server = new ServerAccess(); @Test public void downloadService() throws Exception { ProcessResult pr=server.executeJavawsHeadless(null,"/DownloadService.jnlp"); Assert.assertEquals((Integer)0, pr.returnValue); } @Test public void downloadService2() throws Exception { ProcessResult pr=server.executeJavawsHeadless(null,"/DownloadService2.jnlp"); Assert.assertEquals((Integer)0, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/CustomPolicies0000644000000000000000000000013213441742745023100 xustar0030 mtime=1552401893.129832636 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/0000755000175000002070000000000013441742745023765 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024052 xustar0030 mtime=1552401893.129832636 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/srcs/0000755000175000002070000000000013441742745024737 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/srcs/PaxHeaders.7406/CustomPolicies.java0000644000000000000000000000013213441742745027734 xustar0030 mtime=1552401893.129832636 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/srcs/CustomPolicies.java0000644000175000002070000000105413441742745030544 0ustar00jvanekmock00000000000000import java.applet.Applet; import java.security.AccessControlException; public class CustomPolicies extends Applet { @Override public void start() { System.out.println("CustomPolicies applet read: " + read("user.home")); System.exit(0); } private String read(String key) { try { return System.getProperty(key); } catch (AccessControlException ace) { return ace.toString(); } } public static void main(String[] args) { new CustomPolicies().start(); } } icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025112 xustar0030 mtime=1552401893.150832592 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/resources/0000755000175000002070000000000013441742745025777 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/resources/PaxHeaders.7406/CustomPolicies.htm0000644000000000000000000000013213441742745030643 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/resources/CustomPolicies.html0000644000175000002070000000350413441742745031631 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/resources/PaxHeaders.7406/CustomPoliciesJnlp0000644000000000000000000000013213441742745030700 xustar0030 mtime=1552401893.150832592 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/resources/CustomPoliciesJnlpHref.html0000644000175000002070000000343313441742745033263 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/resources/PaxHeaders.7406/CustomPoliciesAppl0000644000000000000000000000013213441742745030671 xustar0030 mtime=1552401893.111832673 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/resources/CustomPoliciesApplet.jnlp0000644000175000002070000000427013441742745032777 0ustar00jvanekmock00000000000000 CustomPoliciesApplet IcedTea Test that unsigned applets can perform privileged actions when granted by custom policies icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/resources/PaxHeaders.7406/CustomPoliciesAppl0000644000000000000000000000013213441742745030671 xustar0030 mtime=1552401893.120832654 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/resources/CustomPoliciesApplication.jnlp0000644000175000002070000000431413441742745034014 0ustar00jvanekmock00000000000000 CustomPoliciesApplication IcedTea Test that unsigned applets can perform privileged actions when granted by custom policies icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025076 xustar0030 mtime=1552401893.113832669 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/testcases/0000755000175000002070000000000013441742745025763 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/testcases/PaxHeaders.7406/CustomPoliciesTest0000644000000000000000000000013213441742745030700 xustar0030 mtime=1552401893.113832669 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CustomPolicies/testcases/CustomPoliciesTest.java0000644000175000002070000002071213441742745032432 0ustar00jvanekmock00000000000000/* CustomPoliciesTest.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOException; import java.net.URL; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPRuntime; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /* Test that adding permission for all codesources to read the user.home property * results in an unsigned applet being able to perform this action */ public class CustomPoliciesTest extends BrowserTest { private static DeploymentConfiguration config = JNLPRuntime.getConfiguration(); private static File policy, policyBackup; @BeforeClass public static void setPolicyLocation() throws Exception { policy = new File(new URL(config.getProperty(DeploymentConfiguration.KEY_USER_SECURITY_POLICY)).getPath()); File securityDir = policy.getParentFile(); File[] previousBackups = securityDir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.startsWith("java.policy.bak"); } }); for (File backup : previousBackups) { ServerAccess.logErrorReprint("Warning: found previous policy file backup at " + backup); } } @Before public void backupPolicy() throws Exception { if (policy.isFile()) { policyBackup = File.createTempFile("java.policy.bak", null, policy.getParentFile()); if (!policy.renameTo(policyBackup)) { ServerAccess.logErrorReprint("Could not back up existing policy file"); throw new RuntimeException("Could not back up existing policy file"); } } } @After public void restorePolicy() { policy.delete(); if (policyBackup != null && policyBackup.isFile()) { policyBackup.renameTo(policy); } } private void writePolicy() throws IOException { FileWriter out = new FileWriter(policy); try { String policyText="grant {\n permission java.util.PropertyPermission \"user.home\", \"read\";\n};\n"; out.write(policyText, 0, policyText.length()); } finally { out.close(); } } @NeedsDisplay @Test @TestInBrowsers(testIn={Browsers.one}) public void testHtmlLaunchWithPolicy() throws Exception { writePolicy(); assertPolicyExists(); RulesFolowingClosingListener listener = new RulesFolowingClosingListener(); listener.addContainsRule("CustomPolicies applet read:"); ProcessResult pr = server.executeBrowser("CustomPolicies.html", listener, null); assertInit(pr); assertReadProps(pr); assertNoAccessControlException(pr); } @NeedsDisplay @Test @TestInBrowsers(testIn={Browsers.one}) public void testHtmlJnlpHrefLaunchWithPolicy() throws Exception { writePolicy(); assertPolicyExists(); RulesFolowingClosingListener listener = new RulesFolowingClosingListener(); listener.addContainsRule("CustomPolicies applet read:"); ProcessResult pr = server.executeBrowser("CustomPoliciesJnlpHref.html", listener, null); assertInit(pr); assertReadProps(pr); assertNoAccessControlException(pr); } @Test public void testJnlpAppletLaunchWithPolicy() throws Exception { writePolicy(); assertPolicyExists(); ProcessResult pr = server.executeJavawsHeadless("CustomPoliciesApplet.jnlp"); assertInit(pr); assertReadProps(pr); assertNoAccessControlException(pr); } @Test public void testJnlpApplicationLaunchWithPolicy() throws Exception { writePolicy(); assertPolicyExists(); ProcessResult pr = server.executeJavawsHeadless("CustomPoliciesApplication.jnlp"); assertInit(pr); assertReadProps(pr); assertNoAccessControlException(pr); } @NeedsDisplay @Test @TestInBrowsers(testIn = { Browsers.one }) public void testHtmlLaunch() throws Exception { assertNoPolicyExists(); RulesFolowingClosingListener listener = new RulesFolowingClosingListener(); listener.addContainsRule("CustomPolicies applet read:"); ProcessResult pr = server.executeBrowser("CustomPolicies.html", listener, null); assertInit(pr); assertAccessControlException(pr); } @NeedsDisplay @Test @TestInBrowsers(testIn = { Browsers.one }) public void testHtmlJnlpHrefLaunch() throws Exception { assertNoPolicyExists(); RulesFolowingClosingListener listener = new RulesFolowingClosingListener(); listener.addContainsRule("CustomPolicies applet read:"); ProcessResult pr = server.executeBrowser("CustomPoliciesJnlpHref.html", listener, null); assertInit(pr); assertAccessControlException(pr); } @Test public void testJnlpAppletLaunch() throws Exception { assertNoPolicyExists(); ProcessResult pr = server.executeJavawsHeadless("CustomPoliciesApplet.jnlp"); assertInit(pr); assertAccessControlException(pr); } @Test public void testJnlpApplicationLaunch() throws Exception { assertNoPolicyExists(); ProcessResult pr = server.executeJavawsHeadless("CustomPoliciesApplication.jnlp"); assertInit(pr); assertAccessControlException(pr); } private void assertAccessControlException(ProcessResult pr) { assertTrue("Applet should not have been able to read user.home", pr.stdout.contains("AccessControlException: access denied")); } private void assertPolicyExists() { assertTrue("A user policy file should be installed", policy.isFile()); } private void assertNoPolicyExists() { assertFalse("A user policy file should not be installed", policy.isFile()); } private void assertInit(ProcessResult pr) { assertTrue("Applet should have initialized", pr.stdout.contains("CustomPolicies applet read:")); } private void assertReadProps(ProcessResult pr) { assertTrue("stdout should contain user.home", pr.stdout.contains(System.getProperty("user.home"))); } private void assertNoAccessControlException(ProcessResult pr) { assertFalse("Applet should have been able to read user.home", pr.stdout.contains("AccessControlException: access denied")); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/CountingApplet10000644000000000000000000000013213441742745023153 xustar0030 mtime=1552401893.149832594 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/0000755000175000002070000000000013441742745024040 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025151 xustar0030 mtime=1552401893.149832594 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/testcases/0000755000175000002070000000000013441742745026036 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/testcases/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030527 xustar0030 mtime=1552401893.149832594 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/testcases/ParallelAppletsTest.java0000644000175000002070000002153213441742745032631 0ustar00jvanekmock00000000000000/* ParallelAppletsTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class ParallelAppletsTest extends BrowserTest { @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1Ex2s() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1EE_x_2s.html"); checkSimpleSignedStarted(pr); checkNotInitialised(pr); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1x2E() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1_x_2EE.html"); checkExactCounts(1, 7, pr); checkNotInitialised(pr); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1x2e() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1_x_2e.html"); checkExactCounts(1, 7, pr); checkException(pr); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1ex2s() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1e_x_2s.html"); checkSimpleSignedStarted(pr); checkException(pr); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1sx2() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1s_x_2.html"); checkAppletStarted(pr); checkSimpleSignedStarted(pr); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1sx2s() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1s_x_2s.html"); int found=countCounts(SimpleSignedStarted, pr.stdout); assertExactCount(SimpleSignedStarted, 2, found); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1sx2ssk() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1s_x_2ss.html"); checkSimpleSigned2Started(pr); checkSimpleSignedStarted(pr); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1x2sk() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1_x_2sk.html"); checkExitNotAllowed(pr); checkAtLeastCounts(1, 7, pr); checkExactCounts(2, 5, pr); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1kx2() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1k_x_2.html"); checkExitNotAllowed(pr); checkAtLeastCounts(1, 7, pr); checkExactCounts(2, 5, pr); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1x2() throws Exception { long back = ServerAccess.PROCESS_TIMEOUT; ServerAccess.PROCESS_TIMEOUT = 40 * 1000;//ms try{ ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1_x_2.html"); checkExactCounts(2, 7, pr); }finally { ServerAccess.PROCESS_TIMEOUT = back; } } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void testParallelAppletsTest1x1() throws Exception { ProcessResult pr = server.executeBrowser("ParallelAppletsTest_1_x_1.html"); checkExactCounts(2, 7, pr); } private static final String ACE = "java.security.AccessControlException"; private static final String Sexit = "System.exit()"; private static final String LE1 = "net.sourceforge.jnlp.LaunchException"; private static final String LE2 = "Fatal: Initialization Error"; private static final String Cinit = "Could not initialize applet"; private static final String CountStub = "counting... "; private static final String SimpleSignedStarted = "AppletTestSigned was started"; private static final String SimpleSigned2Started = "AppletTestSigned2 was started"; private static final String AppletStarted = "applet was started"; private static final String AppletThrowedException = "java.lang.RuntimeException: Correct exception"; private void checkExitNotAllowed(ProcessResult pr) { Assert.assertTrue("Applets cant call " + Sexit, pr.stderr.contains(ACE)); Assert.assertTrue("Applets cant call " + Sexit, pr.stderr.contains(Sexit)); } private void checkNotInitialised(ProcessResult pr) { Assert.assertTrue("Applets should not be initialised ", pr.stderr.matches("(?s).*" + LE1 + ".*" + LE2 + ".*" + Cinit + ".*")); } private void checkSimpleSignedStarted(ProcessResult pr) { Assert.assertTrue("Applet's start should be confirmed by " + SimpleSignedStarted, pr.stdout.contains(SimpleSignedStarted)); } private void checkSimpleSigned2Started(ProcessResult pr) { Assert.assertTrue("Applet's start should be confirmed by " + SimpleSigned2Started, pr.stdout.contains(SimpleSigned2Started)); } private void checkAppletStarted(ProcessResult pr) { Assert.assertTrue("Applet's start should be confirmed by " + AppletStarted, pr.stdout.contains(AppletStarted)); } private void checkException(ProcessResult pr) { Assert.assertTrue("Applet's exception should be confirmed by " + AppletThrowedException, pr.stderr.contains(AppletThrowedException)); } //appelt is counting to ten, but last shouts are very often consumated during termination, //so the chek is now called with "7" instead of "10" private void checkExactCounts(int howManyTimes, int countIdTill, ProcessResult pr) { for (int i = 0; i <= countIdTill; i++) { String countId = CountStub + i+"\n"; int found = countCounts(countId, pr.stdout); assertExactCount(countId, howManyTimes, found); } } private void assertExactCount(String what, int howManyTimes, int found) { Assert.assertEquals(what + " was expected exactly " + howManyTimes + " but was found " + found, howManyTimes, found); } private void checkAtLeastCounts(int howManyTimes, int countIdTill, ProcessResult pr) { for (int i = 0; i <= countIdTill; i++) { String countId = CountStub + i; int found = countCounts(countId, pr.stdout); Assert.assertTrue(countId + " was expected et least " + howManyTimes + " but was found " + found, found >= howManyTimes); } } private int countCounts(String what, String where) { int lastIndex = 0; int count = 0; while (lastIndex != -1) { lastIndex = where.indexOf(what, lastIndex); if (lastIndex != -1) { count++; lastIndex += what.length(); } } return count; } } icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025165 xustar0030 mtime=1552401893.149832594 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/0000755000175000002070000000000013441742745026052 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.120832654 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1s_x_2s.html0000644000175000002070000000406613441742745034231 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.120832654 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_1.html0000644000175000002070000000362513441742745033662 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013113441742745030542 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2sk.html0000644000175000002070000000370513441742745034220 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.149832594 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2e.html0000644000175000002070000000361513441742745034027 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.111832673 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1s_x_2ss.html0000644000175000002070000000363213441742745034412 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.110832675 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2.html0000644000175000002070000000363313441742745033662 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.112832671 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1e_x_2s.html0000644000175000002070000000362113441742745034207 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.117832661 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1s_x_2.html0000644000175000002070000000421013441742745034035 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.116832663 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1EE_x_2s.html0000644000175000002070000000362613441742745034261 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1k_x_2.html0000644000175000002070000000367013441742745034036 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/PaxHeaders.7406/ParallelAppletsTe0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2EE.html0000644000175000002070000000361413441742745034073 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024125 xustar0030 mtime=1552401893.119832657 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/srcs/0000755000175000002070000000000013441742745025012 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/srcs/PaxHeaders.7406/CountingApplet1.java0000644000000000000000000000013213441742745030062 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CountingApplet1/srcs/CountingApplet1.java0000644000175000002070000000667713441742745030712 0ustar00jvanekmock00000000000000 import java.applet.Applet; import java.awt.BorderLayout; import javax.swing.JLabel; import javax.swing.SwingUtilities; /* CountingApplet1.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class CountingApplet1 extends Applet { public static void main(String[] args) throws InterruptedException { Integer counter = null; if (args.length > 0) { counter = new Integer(args[0]); } int i = 0; while (true) { System.out.println("counting... " + i); System.out.flush(); if (counter != null && i == counter.intValue()) { System.exit(-i); } i++; Thread.sleep(1000); } } @Override public void init() { System.out.println("applet was initialised"); final CountingApplet1 self = this; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { self.setLayout(new BorderLayout()); self.add(new JLabel("C1")); self.validate(); self.repaint(); } }); } @Override public void start() { System.out.println("applet was started"); String s = getParameter("kill"); final String[] params; if (s != null) { params = new String[]{s}; } else { params = new String[0]; } new Thread(new Runnable() { @Override public void run() { try { main(params); } catch (Exception ex) { ex.printStackTrace(); } } }).start(); } @Override public void stop() { System.out.println("applet was stopped"); } @Override public void destroy() { System.out.println("applet will be destroyed"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/CodebasesAtts0000644000000000000000000000013213441742745022662 xustar0030 mtime=1552401893.118832658 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/0000755000175000002070000000000013441742745023547 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024674 xustar0030 mtime=1552401893.116832663 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/resources/0000755000175000002070000000000013441742745025561 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/resources/PaxHeaders.7406/CodebasesAttsApplet0000644000000000000000000000013213441742745030566 xustar0030 mtime=1552401893.116832663 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/resources/CodebasesAttsApplet.jnlp.in0000644000175000002070000000426413441742745032753 0ustar00jvanekmock00000000000000 CodebasesAtts IcedTea PR2489 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/resources/PaxHeaders.7406/CodebasesAttsJnlpHr0000644000000000000000000000013213441742745030536 xustar0030 mtime=1552401893.110832675 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/resources/CodebasesAttsJnlpHref.html.in0000644000175000002070000000347213441742745033237 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/resources/PaxHeaders.7406/CodebasesAttsApp.jn0000644000000000000000000000013213441742745030467 xustar0030 mtime=1552401893.116832663 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/resources/CodebasesAttsApp.jnlp.in0000644000175000002070000000416413441742745032245 0ustar00jvanekmock00000000000000 CodebasesAtts IcedTea PR2489 @ID@ icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/resources/PaxHeaders.7406/CodebasesAtts.html.0000644000000000000000000000013213441742745030441 xustar0030 mtime=1552401893.113832669 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/resources/CodebasesAtts.html.in0000644000175000002070000000343613441742745031606 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024660 xustar0030 mtime=1552401893.149832594 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/testcases/0000755000175000002070000000000013441742745025545 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/testcases/PaxHeaders.7406/CodebasesAttsNoDial0000644000000000000000000000013113441742745030472 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/testcases/CodebasesAttsNoDialogsTest1.java0000644000175000002070000010041213441742745033653 0ustar00jvanekmock00000000000000/* CodebasesAttsNoDialogsTest1.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.AbstractMap; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.util.FileUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /** * * null, empty, none, wrong, correct jnlp x html different codebases. * * no dialogs should be appeared. Second testsuite with ALL dialogs (head only) * * */ public class CodebasesAttsNoDialogsTest1 extends BrowserTest { public static final String appletCloseString = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; public static final String[] JAVAWS_HTML_ARRAY = new String[]{OptionsDefinitions.OPTIONS.HTML.option}; public static final List JAVAWS_HTML_LIST = Arrays.asList(JAVAWS_HTML_ARRAY); public static final String JNLPAPP = "CodebasesAttsApp.jnlp"; public static final String JNLPAPPLET = "CodebasesAttsApplet.jnlp"; public static final String HTML = "CodebasesAtts.html"; public static final String HTMLHREF = "CodebasesAttsJnlpHref.html"; public static final String CodebasesAtts = "CodebasesAtts"; private static ServerLauncher emptyServer; private static ServerLauncher secondValidServer; private static DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier ensuredDP; public static final String[] files = new String[]{"CodebasesAttsApp.jnlp", "CodebasesAtts.html", "CodebasesAttsApplet.jnlp", "CodebasesAttsJnlpHref.html"}; @BeforeClass public static void initSecondaryServers() throws IOException { emptyServer = ServerAccess.getIndependentInstanceOnTmpDir(); secondValidServer = ServerAccess.getIndependentInstanceOnTmpDir(); } @AfterClass public static void stopSecondaryServers() throws IOException { emptyServer.stop(); secondValidServer.stop(); } @BeforeClass public static void setProperties() throws IOException { ensuredDP = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier( new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.NONE.name()), new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.name()) ); ensuredDP.setProperties(); } @AfterClass public static void resetProperties() throws IOException { ensuredDP.restoreProperties(); } //jnlp app @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_dot() throws Exception { prepare("\".\""); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_empty() throws Exception { prepare("\"\""); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_space() throws Exception { prepare("\" \""); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_spaces() throws Exception { prepare("\" \""); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsTestWorksJnlp1_null() throws Exception { prepare(null); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_value() throws Exception { prepare(server.getUrl().toString()); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test //all three are valid, but on l one bug is supported nows @Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") public void codebasesAttsTestWorksJnlp1_value2() throws Exception { prepare(secondValidServer.getUrl().toString()); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); //param comes from original jnlp, this will be visible on jnlp_href Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_value3() throws Exception { prepare(secondValidServer.getUrl().toString()); ProcessResult pr = server.executeJavawsUponUrl(null, new URL(secondValidServer.getUrl().toString() + "/" + JNLPAPP), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } //value3 and 4 tests ar emoreover testing taht our three servers are working as expected. @NeedsDisplay @Test //all three are valid, but on l one bug is supported now @Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") //@Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") public void codebasesAttsTestWorksJnlp1_value4() throws Exception { prepare(server.getUrl().toString()); ProcessResult pr = server.executeJavawsUponUrl(null, new URL(secondValidServer.getUrl().toString() + "/" + JNLPAPP), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); //param comes from original jnlp, this will be visible on jnlp_href Assert.assertTrue(pr.stdout.contains("BID0")); } //jnlp applet @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_dot() throws Exception { prepare("\".\""); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_empty() throws Exception { prepare("\"\""); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_space() throws Exception { prepare("\" \""); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_spaces() throws Exception { prepare("\" \""); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsTestWorksJnlp2_null() throws Exception { prepare(null); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_value() throws Exception { prepare(server.getUrl().toString()); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test //all three are valid, but on l one bug is supported now @Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") public void codebasesAttsTestWorksJnlp2_value2() throws Exception { prepare(secondValidServer.getUrl().toString()); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); //param comes from original jnlp, this will be visible on jnlp_href Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_value3() throws Exception { prepare(secondValidServer.getUrl().toString()); ProcessResult pr = server.executeJavawsUponUrl(null, new URL(secondValidServer.getUrl().toString() + "/" + JNLPAPPLET), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } //value3 and 4 tests ar emoreover testing taht our three servers are working as expected. @NeedsDisplay @Test //all three are valid, but on l one bug is supported now //@Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") @Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") public void codebasesAttsTestWorksJnlp2_value4() throws Exception { prepare(server.getUrl().toString()); ProcessResult pr = server.executeJavawsUponUrl(null, new URL(secondValidServer.getUrl().toString() + "/" + JNLPAPPLET), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); //param comes from original jnlp, this will be visible on jnlp_href Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml1_dot() throws Exception { prepare("\".\""); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml1_empty() throws Exception { prepare("\"\""); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksJHtml1_space() throws Exception { prepare("\" \""); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml1_spaces() throws Exception { prepare("\" \""); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsTestWorksHtml1_null() throws Exception { prepare(null); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml1_value() throws Exception { prepare(server.getUrl().toString()); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) //all three are valid, but on l one bug is supported now //@Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") @Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") public void codebasesAttsTestWorksHtml1_value2() throws Exception { prepare(secondValidServer.getUrl().toString()); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); //param comes from original jnlp, this will be visible on jnlp_href Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml1_value3() throws Exception { prepare(secondValidServer.getUrl().toString()); ProcessResult pr = server.executeBrowser(null, new URL(secondValidServer.getUrl().toString() + "/" + HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } //value3 and 4 tests ar emoreover testing taht our three servers are working as expected. @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) //all three are valid, but on l one bug is supported now @Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") public void codebasesAttsTestWorksHtml1_value4() throws Exception { prepare(server.getUrl().toString()); ProcessResult pr = server.executeBrowser(null, new URL(secondValidServer.getUrl().toString() + "/" + HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); //param comes from original jnlp, this will be visible on jnlp_href Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_dot() throws Exception { prepare("\".\""); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_empty() throws Exception { prepare("\"\""); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksJHtml2_space() throws Exception { prepare("\" \""); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_spaces() throws Exception { prepare("\" \""); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsTestWorksHtml2_null() throws Exception { prepare(null); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_value() throws Exception { prepare(server.getUrl().toString()); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) //all three are valid, but on l one bug is supported now //@Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") @Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") public void codebasesAttsTestWorksHtml2_value2() throws Exception { prepare(secondValidServer.getUrl().toString()); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); //param comes from original jnlp, this will be visible on SECOND jnlp_href tests Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_value3() throws Exception { prepare(secondValidServer.getUrl().toString()); ProcessResult pr = server.executeBrowser(null, new URL(secondValidServer.getUrl().toString() + "/" + HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } //value3 and 4 tests ar emoreover testing taht our three servers are working as expected. @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) //all three are valid, but on l one bug is supported now //@Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") @Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") public void codebasesAttsTestWorksHtml2_value4() throws Exception { prepare(server.getUrl().toString()); ProcessResult pr = server.executeBrowser(null, new URL(secondValidServer.getUrl().toString() + "/" + HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); //param comes from original jnlp, this will be visible on jnlp_href Assert.assertTrue(pr.stdout.contains("BID0")); } public static void prepare(String codebase) throws IOException { prepare(codebase, codebase); } public static void prepare(String codebase1, String codebase2) throws IOException { prepareSingle(codebase1, null, null, '1', ServerAccess.getInstance().getDir(), files); prepareSingle(codebase2, null, null, '2', secondValidServer.getDir(), files); } public static void prepareSingle(URL codebase, String jnlphref, String jar, char id, File targetDir, String[] files) throws IOException { prepareSingle(codebase.toExternalForm(), jnlphref, jar, id, targetDir, files); } public static void prepareSingle(String codebase, String jnlphref, String jar, char id, File targetDir, String[] files) throws IOException { File srcDir = ServerAccess.getInstance().getDir(); for (String file : files) { String s1 = FileUtils.loadFileAsString(new File(srcDir, file + ".in")); if (codebase == null) { s1 = s1.replace("@CODEBASE@", ""); } else { s1 = s1.replace("@CODEBASE@", "codebase=\"" + codebase + "\""); } if (jnlphref == null) { s1 = s1.replace("@JNLPHREF@", "CodebasesAttsApplet.jnlp"); } else { s1 = s1.replace("@JNLPHREF@", jnlphref + "/CodebasesAttsApplet.jnlp"); } if (jar == null) { s1 = s1.replace("@JAR@", "CodebasesAtts"); } else { s1 = s1.replace("@JAR@", jar + "/CodebasesAtts"); } s1 = s1.replace("@ID@", "" + id); FileUtils.saveFile(s1, new File(targetDir, file)); } String n = "CodebasesAtts.jar"; if (!srcDir.equals(targetDir)) { copyJarAndChange(new File(srcDir, n), new File(targetDir, n), id); } } /** * This copy zip jar entry by entry, and for one particular class it do BYTE * changes * * @param from * @param to * @param id * @throws FileNotFoundException * @throws IOException */ private static void copyJarAndChange(File from, File to, char id) throws FileNotFoundException, IOException { ZipFile original = new ZipFile(from); try (ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(to))) { Enumeration entries = original.entries(); byte[] buffer = new byte[512]; while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); if (entry.getName().endsWith("CodebasesAtts.class")) { ZipEntry newEntry = new ZipEntry(entry.getName()); outputStream.putNextEntry(newEntry); try (InputStream in = original.getInputStream(entry)) { copyStreamAndChange(in, outputStream, id); } } else { ZipEntry newEntry = new ZipEntry(entry.getName()); outputStream.putNextEntry(newEntry); try (InputStream in = original.getInputStream(entry)) { while (0 < in.available()) { int read = in.read(buffer); outputStream.write(buffer, 0, read); } } } outputStream.closeEntry(); } } } /** * This changes bytes BID0 to BID'idchar'. * * @param din * @param dout * @param id * @throws FileNotFoundException * @throws IOException */ private static void copyStreamAndChange(InputStream din, OutputStream dout, char id) throws FileNotFoundException, IOException { int c; final boolean[] BID0 = new boolean[]{false, false, false}; while ((c = din.read()) != -1) { if (c == 'B') { BID0[0] = true; dout.write((byte) c); } else if (c == 'I' && BID0[0]) { BID0[1] = true; dout.write((byte) c); } else if (c == 'D' && BID0[1]) { BID0[2] = true; dout.write((byte) c); } else if (c == '0' && BID0[2]) { dout.write((byte) id); reset(BID0); } else { reset(BID0); dout.write((byte) c); } } } private static void reset(final boolean[] b) { for (int i = 0; i < b.length; i++) { b[i] = false; } } } icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/testcases/PaxHeaders.7406/CodebasesAttsDialog0000644000000000000000000000013213441742745030524 xustar0030 mtime=1552401893.149832594 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/testcases/CodebasesAttsDialogsTest1.java0000644000175000002070000002440013441742745033360 0ustar00jvanekmock00000000000000/* CodebasesAttsNoDialogsTest1.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.util.FileUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /** * * null, empty, none, wrong, correct jnlp x html different codebases. * * no dialogs should be appeared. Second testsuite with ALL dialogs (head only) * * */ public class CodebasesAttsDialogsTest1 extends BrowserTest { private static final String appletCloseString = CodebasesAttsNoDialogsTest1.appletCloseString; private static final String[] JAVAWS_HTML_ARRAY = CodebasesAttsNoDialogsTest1.JAVAWS_HTML_ARRAY; private static final List JAVAWS_HTML_LIST = CodebasesAttsNoDialogsTest1.JAVAWS_HTML_LIST; private static final String[] JAVAWS_HEADLES_ARRAY = new String[]{OptionsDefinitions.OPTIONS.HTML.HEADLESS.option}; private static final List JAVAWS_HEADLES_LIST = Arrays.asList(JAVAWS_HEADLES_ARRAY); private static final String JNLPAPP = CodebasesAttsNoDialogsTest1.JNLPAPP; private static final String JNLPAPPLET = CodebasesAttsNoDialogsTest1.JNLPAPPLET; private static final String HTML = CodebasesAttsNoDialogsTest1.HTML; private static final String HTMLHREF = CodebasesAttsNoDialogsTest1.HTMLHREF; private static final String CodebasesAtts = CodebasesAttsNoDialogsTest1.CodebasesAtts; private static ServerLauncher secondValidServer; private static DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier ensuredDP; public static final String[] files = new String[]{"CodebasesAttsApp.jnlp", "CodebasesAtts.html", "CodebasesAttsApplet.jnlp", "CodebasesAttsJnlpHref.html"}; @BeforeClass public static void initSecondaryServers() throws IOException { secondValidServer = ServerAccess.getIndependentInstanceOnTmpDir(); } @AfterClass public static void stopSecondaryServers() throws IOException { secondValidServer.stop(); } @BeforeClass public static void setProperties() throws IOException { ensuredDP = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier( new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ALL.name()), new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ASK_UNSIGNED.name()) ); ensuredDP.setProperties(); } @AfterClass public static void resetProperties() throws IOException { ensuredDP.restoreProperties(); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsTestWorksJnlp1_null() throws Exception { prepare(null); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), JAVAWS_HEADLES_LIST, server.getUrl(JNLPAPP)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsTestWorksJnlp2_null() throws Exception { prepare(null); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), JAVAWS_HEADLES_LIST, server.getUrl(JNLPAPPLET)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay //@Test rowsers dont support headless dialogues @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsTestWorksHtml1_null() throws Exception { prepare(null); ProcessResult pr = server.executeBrowser(null, HTML, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay //@Test browsers do not support ehadless dialogues @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsTestWorksHtml2_null() throws Exception { prepare(null); ProcessResult pr = server.executeBrowser(null, HTMLHREF, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsTestWorksJavawsHtml1_null() throws Exception { prepare(null); ArrayList HTML_HEADLESS = new ArrayList<>(); HTML_HEADLESS.addAll(JAVAWS_HEADLES_LIST); HTML_HEADLESS.addAll(JAVAWS_HTML_LIST); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HTML_HEADLESS, server.getUrl(HTML)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsTestWorksJavawsHtml2_null() throws Exception { prepare(null); ArrayList HTML_HEADLESS = new ArrayList<>(); HTML_HEADLESS.addAll(JAVAWS_HEADLES_LIST); HTML_HEADLESS.addAll(JAVAWS_HTML_LIST); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HTML_HEADLESS, server.getUrl(HTMLHREF)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } public static void prepare(String codebase) throws IOException { prepare(codebase, codebase); } public static void prepare(String codebase1, String codebase2) throws IOException { CodebasesAttsNoDialogsTest1.prepareSingle(codebase1, null, null, '1', ServerAccess.getInstance().getDir(), files); CodebasesAttsNoDialogsTest1.prepareSingle(codebase2, null, null, '2', secondValidServer.getDir(), files); } } icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/testcases/PaxHeaders.7406/CodebasesAttsNoDial0000644000000000000000000000013213441742745030473 xustar0030 mtime=1552401893.112832671 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/testcases/CodebasesAttsNoDialogsTest2.java0000644000175000002070000005657513441742745033700 0ustar00jvanekmock00000000000000/* CodebasesAttsNoDialogsTest1.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import java.net.URL; import java.util.AbstractMap; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /** * * null, empty, none, wrong, correct jnlp x html different codebases. * * no dialogs should be appeared. Second testsuite with ALL dialogs (head only) * * */ public class CodebasesAttsNoDialogsTest2 extends BrowserTest { private static final String appletCloseString = CodebasesAttsNoDialogsTest1.appletCloseString; private static final String[] HTMLA = CodebasesAttsNoDialogsTest1.JAVAWS_HTML_ARRAY; private static final List HTMLL = CodebasesAttsNoDialogsTest1.JAVAWS_HTML_LIST; private static final String JNLPAPP = CodebasesAttsNoDialogsTest1.JNLPAPP; private static final String JNLPAPPLET = CodebasesAttsNoDialogsTest1.JNLPAPPLET; private static final String HTML = CodebasesAttsNoDialogsTest1.HTML; private static final String HTMLHREF = CodebasesAttsNoDialogsTest1.HTMLHREF; private static final String CodebasesAtts = CodebasesAttsNoDialogsTest1.CodebasesAtts; private static ServerLauncher secondValidServer; private static DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier ensuredDP; @BeforeClass public static void initSecondaryServers() throws IOException { secondValidServer = ServerAccess.getIndependentInstanceOnTmpDir(); } @AfterClass public static void stopSecondaryServers() throws IOException { secondValidServer.stop(); } @BeforeClass public static void setProperties() throws IOException { ensuredDP = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier( new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.NONE.name()), new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.name()) ); ensuredDP.setProperties(); } @AfterClass public static void resetProperties() throws IOException { ensuredDP.restoreProperties(); } //jnlp app @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_NormalValid_normal() throws Exception { prepare(server.getUrl(), secondValidServer.getUrl()); ProcessResult pr = server.executeJavawsUponUrl(null, server.getUrl(JNLPAPP), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_NormalValid_second() throws Exception { prepare(server.getUrl(), secondValidServer.getUrl()); ProcessResult pr = server.executeJavawsUponUrl(null, secondValidServer.getUrl(JNLPAPP), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_ValidNormal_normal() throws Exception { prepare(secondValidServer.getUrl(), server.getUrl()); ProcessResult pr = server.executeJavawsUponUrl(null, server.getUrl(JNLPAPP), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp1_ValidNormal_second() throws Exception { prepare(secondValidServer.getUrl(), server.getUrl()); ProcessResult pr = server.executeJavawsUponUrl(null, secondValidServer.getUrl(JNLPAPP), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } //jnlp app let @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_NormalValid_normal() throws Exception { prepare(server.getUrl(), secondValidServer.getUrl()); ProcessResult pr = server.executeJavawsUponUrl(null, server.getUrl(JNLPAPPLET), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_NormalValid_second() throws Exception { prepare(server.getUrl(), secondValidServer.getUrl()); ProcessResult pr = server.executeJavawsUponUrl(null, secondValidServer.getUrl(JNLPAPPLET), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_ValidNormal_normal() throws Exception { prepare(secondValidServer.getUrl(), server.getUrl()); ProcessResult pr = server.executeJavawsUponUrl(null, server.getUrl(JNLPAPPLET), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test public void codebasesAttsTestWorksJnlp2_ValidNormal_second() throws Exception { prepare(secondValidServer.getUrl(), server.getUrl()); ProcessResult pr = server.executeJavawsUponUrl(null, secondValidServer.getUrl(JNLPAPPLET), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } //html @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml1_NormalValid_normal() throws Exception { prepare(server.getUrl(), secondValidServer.getUrl()); ProcessResult pr = server.executeBrowser(null, server.getUrl(HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml1_NormalValid_second() throws Exception { prepare(server.getUrl(), secondValidServer.getUrl()); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml1_ValidNormal_normal() throws Exception { prepare(secondValidServer.getUrl(), server.getUrl()); ProcessResult pr = server.executeBrowser(null, server.getUrl(HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml1_ValidNormal_second() throws Exception { prepare(secondValidServer.getUrl(), server.getUrl()); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } //htmlhref relative hrefs @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_NormalValid_normal() throws Exception { prepare(server.getUrl(), secondValidServer.getUrl()); ProcessResult pr = server.executeBrowser(null, server.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_NormalValid_second() throws Exception { prepare(server.getUrl(), secondValidServer.getUrl()); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_ValidNormal_normal() throws Exception { prepare(secondValidServer.getUrl(), server.getUrl()); ProcessResult pr = server.executeBrowser(null, server.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); //codebase is relative, so launchiong server is used to locate jnlp } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_ValidNormal_second() throws Exception { prepare(secondValidServer.getUrl(), server.getUrl()); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2"));//jnlphref is relative, so launchiong server is used to locate jnlp } public void prepare(URL c1, URL c2) throws IOException { prepare(c1.toExternalForm(), c2.toExternalForm()); } public static void prepare(String codebase1, String codebase2) throws IOException { CodebasesAttsNoDialogsTest1.prepareSingle(codebase1, null, null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle(codebase2, null, null, '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); } //htmlhref absolute hrefs @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_NormalValid_normal_absoluteJnlpHrefNormal() throws Exception { CodebasesAttsNoDialogsTest1.prepareSingle(server.getUrl(), server.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle(secondValidServer.getUrl(), server.getUrl().toExternalForm(), null, '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ProcessResult pr = server.executeBrowser(null, server.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @Test @TestInBrowsers(testIn = Browsers.one) //all three are valid, but on l one bug is supported now @Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") public void codebasesAttsTestWorksHtml2_NormalValid_normal_absoluteJnlpHrefSecond() throws Exception { CodebasesAttsNoDialogsTest1.prepareSingle(server.getUrl(), secondValidServer.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle(secondValidServer.getUrl(), secondValidServer.getUrl().toExternalForm(), null, '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ProcessResult pr = server.executeBrowser(null, server.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) //all three are valid, but on l one bug is supported now //@Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") @Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") public void codebasesAttsTestWorksHtml2_NormalValid_second_absoluteJnlpHrefNormal() throws Exception { CodebasesAttsNoDialogsTest1.prepareSingle(server.getUrl(), server.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle(secondValidServer.getUrl(), server.getUrl().toExternalForm(), null, '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_NormalValid_second_absoluteJnlpHrefSecond() throws Exception { CodebasesAttsNoDialogsTest1.prepareSingle(server.getUrl(), secondValidServer.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle(secondValidServer.getUrl(), secondValidServer.getUrl().toExternalForm(), null, '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) //all three are valid, but on l one bug is supported now //@Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") @Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7") public void codebasesAttsTestWorksHtml2_ValidNormal_normal_absoluteJnlpHrefNormal() throws Exception { CodebasesAttsNoDialogsTest1.prepareSingle(secondValidServer.getUrl(), server.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle(server.getUrl(), server.getUrl().toExternalForm(), null, '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ProcessResult pr = server.executeBrowser(null, server.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_ValidNormal_normal_absoluteJnlpHrefSecond() throws Exception { CodebasesAttsNoDialogsTest1.prepareSingle(secondValidServer.getUrl(), secondValidServer.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle(server.getUrl(), secondValidServer.getUrl().toExternalForm(), null, '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ProcessResult pr = server.executeBrowser(null, server.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) public void codebasesAttsTestWorksHtml2_ValidNormal_second_bsoluteJnlpHrefNormal() throws Exception { CodebasesAttsNoDialogsTest1.prepareSingle(secondValidServer.getUrl(), server.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle(server.getUrl(), server.getUrl().toExternalForm(), null, '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID2")); } @NeedsDisplay @Test @TestInBrowsers(testIn = Browsers.one) //all three are valid, but on l one bug is supported now @Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a public void codebasesAttsTestWorksHtml2_ValidNormal_second_bsoluteJnlpHrefSecond() throws Exception { CodebasesAttsNoDialogsTest1.prepareSingle(secondValidServer.getUrl(), secondValidServer.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle(server.getUrl(), secondValidServer.getUrl().toExternalForm(), null, '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAtts)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } } icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/testcases/PaxHeaders.7406/CodebasesAttsNoDial0000644000000000000000000000013213441742745030473 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/testcases/CodebasesAttsNoDialogsTest3.java0000644000175000002070000004140313441742745033661 0ustar00jvanekmock00000000000000/* CodebasesAttsNoDialogsTest1.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.AbstractMap; import java.util.Arrays; import java.util.List; import java.util.Random; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.Browser; import net.sourceforge.jnlp.browsertesting.BrowserFactory; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /** * * null, empty, none, wrong, correct jnlp x html different codebases. * * no dialogs should be appeared. Second testsuite with ALL dialogs (head only) * * */ public class CodebasesAttsNoDialogsTest3 extends BrowserTest { private static final String appletCloseString = CodebasesAttsNoDialogsTest1.appletCloseString; private static final String[] HTMLA = CodebasesAttsNoDialogsTest1.JAVAWS_HTML_ARRAY; private static final List HTMLL = CodebasesAttsNoDialogsTest1.JAVAWS_HTML_LIST; private static final String JNLPAPP = CodebasesAttsNoDialogsTest1.JNLPAPP; private static final String JNLPAPPLET = CodebasesAttsNoDialogsTest1.JNLPAPPLET; private static final String HTML = CodebasesAttsNoDialogsTest1.HTML; private static final String HTMLHREF = CodebasesAttsNoDialogsTest1.HTMLHREF; private static final String CodebasesAtts = CodebasesAttsNoDialogsTest1.CodebasesAtts; private static ServerLauncher secondValidServer; private static ServerLauncher thirdValidServer; private static DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier ensuredDP; private static final String ABS = "ABS"; private static boolean WAS; private static final boolean Force_Outputs = false;//set to true to see outputs of apps in big test @BeforeClass public static void initSecondaryServers() throws IOException { secondValidServer = ServerAccess.getIndependentInstanceOnTmpDir(); thirdValidServer = ServerAccess.getIndependentInstanceOnTmpDir(); } @AfterClass public static void stopSecondaryServers() throws IOException { secondValidServer.stop(); thirdValidServer.stop(); } @BeforeClass public static void setProperties() throws IOException { ensuredDP = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier( new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.NONE.name()), new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.name()) ); ensuredDP.setProperties(); } @AfterClass public static void resetProperties() throws IOException { ensuredDP.restoreProperties(); } @BeforeClass public static void setOutput() throws IOException { WAS = ServerAccess.LOGS_REPRINT; } @AfterClass public static void resetOutput() throws IOException { ServerAccess.LOGS_REPRINT = WAS; } /* *Most fun. jnlp/applet is on page, jnlp on second and resource on third * (those should fail) * As adition, jnlphref have applet on one side, jnlp on second and this one have codebase on THIRD * (agian representation of that triple bug from CodebasesAttsNoDialogsTest1 */ //@Test test is disbaled. Is not testing much more then other CodebasesAttsNoDialogsTest1-3 tests and is fragile. Also its behaviour may change, if loading form non-codebase/docbase resources will be prohibited //@TestInBrowsers(testIn = Browsers.one) hacked manually. We really do not wont to iterate this test browser-times public void threeServers__okValues() throws IOException, Exception { Browser localBrowser = BrowserFactory.getFactory().getRandom(); setBrowser(localBrowser.getID()); Browsers browserBackup = getBrowser(); try { int totalCounter = 0; //we know that "" and " " behaves in same way, so let sminimalize this lopp //abs get substituted by hardcoded path String[] validValues = new String[]{ABS, null, "", "."}; for (int a = 0; a < validValues.length; a++) { String codebaseIn = validValues[a]; for (int b = 0; b < validValues.length; b++) { String jnlpHrefIn = validValues[b]; for (int c = 0; c < validValues.length; c++) { String jarIn = validValues[c]; if (jarIn != null) { if (jarIn.trim().isEmpty()) { jarIn = null; } } if (jnlpHrefIn != null) { if (jnlpHrefIn.trim().isEmpty()) { jnlpHrefIn = null; } } //ServerLauncher[] servers = new ServerLauncher[]{ServerAccess.getIndependentInstance(), secondValidServer, thirdValidServer}; //for (abs x abs or abs x relative or realtive x relative) x (nonm jnlp href) are enough two servers //lets yousee tmp ones, as they have aligned id and BID ServerLauncher[] servers = new ServerLauncher[]{secondValidServer, thirdValidServer}; for (int i = 0; i < servers.length; i++) { ServerLauncher usedServer = servers[i]; String[] codebaseJnlpHrefJar = setByServer(usedServer, codebaseIn, jnlpHrefIn, jarIn); CodebasesAttsNoDialogsTest1.prepareSingle(codebaseJnlpHrefJar[0], codebaseJnlpHrefJar[1], codebaseJnlpHrefJar[2], ("" + (i + 1)).charAt(0), usedServer.getDir(), CodebasesAttsNoDialogsTest1.files); } for (int i = 0; i < servers.length; i++) { totalCounter++; ServerLauncher usedServer = servers[i]; //server is caller, only because it knows javaws/browser location ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint(totalCounter + ") i=" + i + ", c=" + c + ", b=" + b + ", a=" + a); ServerAccess.logOutputReprint(usedServer.getUrl().toExternalForm() + ": " + codebaseIn + ", " + jnlpHrefIn + ", " + jarIn); ServerAccess.logOutputReprint("jnlpapp " + JNLPAPP); ServerAccess.LOGS_REPRINT = false; ProcessResult pr1 = server.executeJavawsUponUrl(null, usedServer.getUrl(JNLPAPP), new AutoOkClosingListener(), new AutoErrorClosingListener()); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint(pr1.stdout); ServerAccess.logOutputReprint(pr1.stderr); generalPass(pr1); ServerAccess.logOutputReprint("jnlpapplet " + JNLPAPPLET); ServerAccess.LOGS_REPRINT = false; ProcessResult pr2 = server.executeJavawsUponUrl(null, usedServer.getUrl(JNLPAPPLET), new AutoOkClosingListener(), new AutoErrorClosingListener()); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint(pr2.stdout); ServerAccess.logOutputReprint(pr2.stderr); generalPass(pr2); ServerAccess.logOutputReprint("html " + HTML); ServerAccess.LOGS_REPRINT = false; ProcessResult pr3 = server.executeBrowser(null, usedServer.getUrl(HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint(pr3.stdout); ServerAccess.logOutputReprint(pr3.stderr); generalPass(pr3); ServerAccess.logOutputReprint("javaws html " + HTML); ServerAccess.LOGS_REPRINT = false; ProcessResult pr33 = server.executeJavawsUponUrl(HTMLL, usedServer.getUrl(HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint(pr33.stdout); ServerAccess.logOutputReprint(pr33.stderr); generalPass(pr33); ServerAccess.logOutputReprint("htmlhref " + HTMLHREF); ServerAccess.LOGS_REPRINT = false; ProcessResult pr4 = server.executeBrowser(null, usedServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint(pr4.stdout); ServerAccess.logOutputReprint(pr4.stderr); generalPass(pr4); ServerAccess.logOutputReprint("javaws htmlhref " + HTMLHREF); ServerAccess.LOGS_REPRINT = false; ProcessResult pr44 = server.executeJavawsUponUrl(HTMLL, usedServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint(pr44.stdout); ServerAccess.logOutputReprint(pr44.stderr); generalPass(pr44); } } } } } finally { setBrowser(browserBackup); } } //@Test @TestInBrowsers(testIn = Browsers.one) //all three are valid, but on l one bug is supported now @Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a public void threeServers_resourceIsElsewhere1_html() throws IOException, Exception { CodebasesAttsNoDialogsTest1.prepareSingle((String) null, secondValidServer.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle((String) null, null, thirdValidServer.getUrl().toExternalForm(), '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle((String) null, null, null, '3', thirdValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint("htmlhref " + HTMLHREF); ServerAccess.LOGS_REPRINT = false; ProcessResult pr4 = server.executeBrowser(null, ServerAccess.getInstance().getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint(pr4.stdout); ServerAccess.logOutputReprint(pr4.stderr); Assert.assertTrue(pr4.stdout.contains("id: 1")); //param is from applet page Assert.assertTrue(pr4.stdout.contains("BID3")); ServerAccess.LOGS_REPRINT = WAS; } @Test @Bug(id = "PR2805") @KnownToFail //all three are valid, but on l one bug is supported now, but 2805 have priority //@Bug(id = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2016-January/034446.html") //@Bug(id = "http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d") //@Bug(id = "http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a public void threeServers_resourceIsElsewhere1_javawshtml() throws IOException, Exception { CodebasesAttsNoDialogsTest1.prepareSingle((String) null, secondValidServer.getUrl().toExternalForm(), null, '1', ServerAccess.getInstance().getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle((String) null, null, thirdValidServer.getUrl().toExternalForm(), '2', secondValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); CodebasesAttsNoDialogsTest1.prepareSingle((String) null, null, null, '3', thirdValidServer.getDir(), CodebasesAttsNoDialogsTest1.files); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint("javaws htmlhref " + HTMLHREF); ServerAccess.LOGS_REPRINT = false; ProcessResult pr44 = server.executeJavawsUponUrl(HTMLL, ServerAccess.getInstance().getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); ServerAccess.LOGS_REPRINT = Force_Outputs; ServerAccess.logOutputReprint(pr44.stdout); ServerAccess.logOutputReprint(pr44.stderr); //Assert.assertTrue(pr44.stdout.contains("id: 2")); //param is from jnlphreffed file. This may be considered bug Assert.assertTrue(pr44.stdout.contains("BID3")); Assert.assertTrue(pr44.stdout.contains("id: 1")); //should be same as threeServers_resourceIsElsewhere1_html ServerAccess.LOGS_REPRINT = WAS; } private String[] setByServer(ServerLauncher instance, String codebaseIn, String jnlpHrefIn, String jarIn) throws MalformedURLException { String[] codebaseJnlpHrefJar = new String[]{codebaseIn, jnlpHrefIn, jarIn}; if (ABS.equals(codebaseIn)) { codebaseJnlpHrefJar[0] = instance.getUrl().toExternalForm(); } if (ABS.equals(jnlpHrefIn)) { codebaseJnlpHrefJar[1] = instance.getUrl().toExternalForm(); } if (ABS.equals(jarIn)) { codebaseJnlpHrefJar[2] = instance.getUrl().toExternalForm(); } return codebaseJnlpHrefJar; } private void generalPass(ProcessResult pr1) { generalPass(pr1.stdout); } private void generalPass(String s) { Assert.assertTrue(s.contains("id: ")); Assert.assertTrue(s.contains("BID")); } } icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023634 xustar0030 mtime=1552401893.118832658 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/srcs/0000755000175000002070000000000013441742745024521 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/srcs/PaxHeaders.7406/CodebasesAtts.java0000644000000000000000000000013213441742745027300 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodebasesAtts/srcs/CodebasesAtts.java0000644000175000002070000000505513441742745030115 0ustar00jvanekmock00000000000000/* ExtensionJnlpTestApplet.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.*; import java.awt.Graphics; /** * * Note that for html's appelt and jnlphreff's jnlp file may have different * codebase. * */ public class CodebasesAtts extends Applet { private static final String appletCloseString = "*** APPLET FINISHED ***"; private static final String bid = "BID0"; public static void main(String... args) { System.out.println("id: "+args[0]); System.out.println("BID: "+bid); System.out.println(CodebasesAtts.class.getName()); System.out.println(appletCloseString); System.out.flush(); System.out.println("some garbage"); } @Override public void init() { } @Override public void start() { main(getParameter("id")); } @Override public void stop() { } @Override public void destroy() { } @Override public void paint(Graphics g) { } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/CodeBaseManifestEntryUnsignedNotMatching0000644000000000000000000000013213441742745030145 xustar0030 mtime=1552401893.111832673 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/0000755000175000002070000000000013441742745031032 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/PaxHeaders.7406/re0000644000000000000000000000013213441742745030553 xustar0030 mtime=1552401893.148832596 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/0000755000175000002070000000000013441742745033044 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/PaxHeade0000644000000000000000000000035513441742745031222 xustar00147 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/CodeBaseManifestEntryUnsignedNotMatching.html 30 mtime=1552401893.115832665 30 atime=1552402157.274253398 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/CodeBase0000644000175000002070000000360113441742745034434 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/PaxHeade0000644000000000000000000000035713441742745031224 xustar00151 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/CodeBaseManifestEntryUnsignedNotMatchingJnlp.html 30 mtime=1552401893.148832596 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/CodeBase0000644000175000002070000000355213441742745034441 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/PaxHeade0000644000000000000000000000035313441742745031220 xustar00147 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/CodeBaseManifestEntryUnsignedNotMatching.jnlp 30 mtime=1552401893.109832677 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/CodeBase0000644000175000002070000000434713441742745034444 0ustar00jvanekmock00000000000000 ClasspathManifest IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/PaxHeade0000644000000000000000000000036113441742745031217 xustar00153 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/CodeBaseManifestEntryUnsignedNotMatchingApplet.jnlp 30 mtime=1552401893.118832658 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/resources/CodeBase0000644000175000002070000000455013441742745034440 0ustar00jvanekmock00000000000000 Classpath Manifest Applet Test IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/PaxHeaders.7406/sr0000644000000000000000000000013213441742745030571 xustar0030 mtime=1552401893.126832642 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/srcs/0000755000175000002070000000000013441742745032004 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/srcs/PaxHeaders.740000644000000000000000000000034613441742745030760 xustar00142 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/srcs/CodeBaseManifestEntryUnsignedNotMatching.java 30 mtime=1552401893.126832642 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/srcs/CodeBaseManif0000644000175000002070000000454613441742745034360 0ustar00jvanekmock00000000000000/* ClasspathManifest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class CodeBaseManifestEntryUnsignedNotMatching extends Applet { private class Killer extends Thread { public int n = 1000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; public static void main(String[] args) { x(); } @Override public void start() { x(); killer = new Killer(); killer.start(); } public static void x() { System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/srcs/PaxHeaders.740000644000000000000000000000013213441742745030751 xustar0030 mtime=1552401893.111832673 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/srcs/META-INF/0000755000175000002070000000000013441742745033144 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/srcs/META-INF/PaxH0000644000000000000000000000031513441742745030477 xustar00117 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/srcs/META-INF/MANIFEST.MF 30 mtime=1552401893.111832673 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/srcs/META-INF/MANI0000644000175000002070000000017613441742745033617 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Codebase: somthingWhatShould mustNeverMatch Application-Name: CodeBaseManifestEntryUnsignedNotMatching icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/ClipboardContent0000644000000000000000000000013213441742745023370 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/0000755000175000002070000000000013441742745024255 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024342 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/srcs/0000755000175000002070000000000013441742745025227 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/srcs/PaxHeaders.7406/ClipboardContent.java0000644000000000000000000000013013441742745030512 xustar0030 mtime=1552401893.115832665 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/srcs/ClipboardContent.java0000644000175000002070000001616513441742745031335 0ustar00jvanekmock00000000000000/* ClipboardContent.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.concurrent.TimeUnit; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.text.JTextComponent; public class ClipboardContent extends JPanel { private static final String contentC = "COPY#$REPRODUCER"; private static final String contentP = "PASTE#$REPRODUCER"; private static class LocalFrame extends JFrame { JTextField t; public LocalFrame(String str) { super(); t = new JTextField(str); this.add(t); this.setSize(100, 100); this.pack(); t.selectAll(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void run() throws InterruptedException { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { setVisible(true); } }); while (!this.isVisible()) { Thread.sleep(100); } } public JTextField getT() { return t; } } public void putToClipboard1(String str) { Toolkit toolkit = Toolkit.getDefaultToolkit(); Clipboard clipboard = toolkit.getSystemClipboard(); StringSelection strSel = new StringSelection(str); clipboard.setContents(strSel, null); printFlavors(); } public void putToClipboard2(final String str) throws InterruptedException, NoSuchMethodException, IllegalAccessException, UnsupportedFlavorException, IllegalArgumentException, InvocationTargetException, IOException { final LocalFrame lf = new LocalFrame(str); lf.run(); ((JTextComponent) (lf.getT())).copy(); printFlavors(); lf.dispose(); } public String pasteFromClipboard2() throws InterruptedException, NoSuchMethodException, IllegalAccessException, UnsupportedFlavorException, IllegalArgumentException, InvocationTargetException, IOException { final LocalFrame lf = new LocalFrame("xxx"); lf.run(); ((JTextComponent) (lf.getT())).paste(); printFlavors(); String s = lf.getT().getText(); lf.dispose(); return s; } private void printFlavors() { //just for debugging // Toolkit toolkit = Toolkit.getDefaultToolkit(); // Clipboard clipboard = toolkit.getSystemClipboard(); // Transferable clipData = clipboard.getContents(clipboard); // DataFlavor[] cd = clipData.getTransferDataFlavors(); // for (DataFlavor dataFlavor : cd) { // System.out.println(dataFlavor.getMimeType()); // } } public String pasteFromClipboard1() throws UnsupportedFlavorException, IOException { Toolkit toolkit = Toolkit.getDefaultToolkit(); Clipboard clipboard = toolkit.getSystemClipboard(); Transferable clipData = clipboard.getContents(clipboard); printFlavors(); String s = (String) (clipData.getTransferData( DataFlavor.stringFlavor)); return s; } public static void main(String[] args) throws Exception { ClipboardContent cl = new ClipboardContent(); if (args.length == 0) { throw new IllegalArgumentException("at least copy1|2 or paste1|2 must be as argument (+mandatory number giving use timeout in seconds before termination)"); } else if (args.length == 1) { cl.proceed(args[0]); } else { cl.proceed(args[0], args[1]); } } public void proceed(String arg) throws Exception { proceed(arg, 0); } public void proceed(String arg, String keepAliveFor) throws Exception { proceed(arg, Long.valueOf(keepAliveFor)); } public void proceed(String arg, long timeOut) throws Exception { if (arg.equals("copy1")) { System.out.println(this.getClass().getName() + " copying1 to clipboard " + contentC); putToClipboard1(contentC); System.out.println(this.getClass().getName() + " copied1 to clipboard " + pasteFromClipboard1()); } else if (arg.equals("paste1")) { System.out.println(this.getClass().getName() + " pasting1 from clipboard "); String nwContent = pasteFromClipboard1(); System.out.println(this.getClass().getName() + " pasted1 from clipboard " + nwContent); } else if (arg.equals("copy2")) { System.out.println(this.getClass().getName() + " copying2 to clipboard " + contentC); putToClipboard2(contentC); System.out.println(this.getClass().getName() + " copied2 to clipboard " + pasteFromClipboard2()); } else if (arg.equals("paste2")) { System.out.println(this.getClass().getName() + " pasting2 from clipboard "); String nwContent = pasteFromClipboard2(); System.out.println(this.getClass().getName() + " pasted2 from clipboard " + nwContent); } else { throw new IllegalArgumentException("supported copy1|2 paste1|2"); } long start = System.nanoTime(); while (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) < timeOut) { Thread.sleep(500); } } } icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025366 xustar0030 mtime=1552401893.109832677 30 atime=1552410887.106183459 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/testcases/0000755000175000002070000000000013441742745026253 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/testcases/PaxHeaders.7406/ClipboardContent0000644000000000000000000000013013441742745030616 xustar0030 mtime=1552401893.109832677 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/testcases/ClipboardContentTests.java0000644000175000002070000001517613441742745033405 0ustar00jvanekmock00000000000000/* ClipboardContentTests.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.tools.WaitingForStringProcess; import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ContentReaderListener; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.tools.AsyncJavaws; import static net.sourceforge.jnlp.tools.ClipboardHelpers.pasteFromClipboard; import static net.sourceforge.jnlp.tools.ClipboardHelpers.putToClipboard; import org.junit.Assert; import org.junit.Test; @Bug(id="PR708") public class ClipboardContentTests { private static final String XCEPTION = "xception"; private static final String contentC = "COPY#$REPRODUCER"; private static final String contentP = "PASTE#$REPRODUCER"; private static final String emptyContent = "empty content"; private static ServerAccess server = new ServerAccess(); private static final List javawsTrustArg = Collections.unmodifiableList(Arrays.asList(new String[]{"-Xtrustall"})); @Test public void assertClipboardIsWorking() throws Exception { putToClipboard(emptyContent); Assert.assertEquals(emptyContent, pasteFromClipboard()); putToClipboard(contentC); Assert.assertEquals(contentC, pasteFromClipboard()); } @Test @Bug(id = "PR708") public void ClipboardContentTestCopy1() throws Exception { putToClipboard(emptyContent); Assert.assertEquals("Clipboard must contain new value, did not", emptyContent, pasteFromClipboard()); WaitingForStringProcess wfsp = new WaitingForStringProcess(server, "/ClipboardContentCopy1.jnlp", javawsTrustArg, true, "copied"); wfsp.run(); String ss = pasteFromClipboard(); Assert.assertEquals("Clipboard content must not be changed - was", emptyContent, ss); Assert.assertNotNull("Result had to be delivered, was not", wfsp.getAj().getResult()); Assert.assertTrue("ClipboardContentSignedCopy stderr should contain " + XCEPTION + " but did not ", wfsp.getAj().getResult().stderr.contains(XCEPTION)); } //@Test needs awt robot to close dialog @Bug(id = "PR708") @NeedsDisplay public void ClipboardContentTestCopy2() throws Exception { putToClipboard(emptyContent); Assert.assertEquals("Clipboard must contain new value, did not", emptyContent, pasteFromClipboard()); WaitingForStringProcess wfsp = new WaitingForStringProcess(server, "/ClipboardContentCopy2.jnlp", javawsTrustArg, false, "copied"); wfsp.run(); String ss = pasteFromClipboard(); Assert.assertEquals("Clipboard content must not be changed, was", emptyContent, ss); Assert.assertNotNull("Result had to be delivered, was not", wfsp.getAj().getResult()); Assert.assertTrue("ClipboardContentSignedCopy stderr should contain " + XCEPTION + " but did not", wfsp.getAj().getResult().stderr.contains(XCEPTION)); } @Test @Bug(id = "PR708") public void ClipboardContentTestPaste1() throws Exception { //necessery errasing putToClipboard(emptyContent); Assert.assertEquals("Clipboard must contain new value, did not", emptyContent, pasteFromClipboard()); //now put the tested data putToClipboard(contentP); Assert.assertEquals("Clipboard must contain new value, did not", contentP, pasteFromClipboard()); ProcessResult pr = server.executeJavawsHeadless(javawsTrustArg, "/ClipboardContentPaste1.jnlp"); Assert.assertFalse("ClipboardContentTestPaste stdout should not contain " + contentP + " but didn't", pr.stdout.contains(contentP)); Assert.assertTrue("ClipboardContentTestPaste stderr should contain " + XCEPTION + " but didn't ", pr.stderr.contains(XCEPTION)); } //@Test //needs awt robot to close dialog //Q - can this test be headless,and so automated? //A - no, headless test are present. Swing is handling clipoard by little bit more complicated ways // but imho at the end its the same privlidges. So this test is kept only fo record @Bug(id = "PR708") @NeedsDisplay public void ClipboardContentTestPaste2() throws Exception { //necessery errasing putToClipboard(emptyContent); Assert.assertEquals("Clipboard must contain new value, did not", emptyContent, pasteFromClipboard()); //now put the tested data putToClipboard(contentP); Assert.assertEquals("Clipboard must contain new value, did not", contentP, pasteFromClipboard()); Assert.assertEquals("Clipboard must contain new value, did not", contentP, pasteFromClipboard()); ProcessResult pr = server.executeJavaws(javawsTrustArg, "/ClipboardContentPaste2.jnlp"); Assert.assertFalse("ClipboardContentTestPaste stdout should not contain " + contentP + " but didn't", pr.stdout.contains(contentP)); Assert.assertTrue("ClipboardContentTestPaste stderr should contain " + XCEPTION + " but didn't ", pr.stderr.contains(XCEPTION)); } } icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025402 xustar0030 mtime=1552401893.125832644 30 atime=1552410887.107183457 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/resources/0000755000175000002070000000000013441742745026267 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/resources/PaxHeaders.7406/ClipboardContent0000644000000000000000000000013013441742745030632 xustar0030 mtime=1552401893.125832644 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/resources/ClipboardContentCopy1.jnlp0000644000175000002070000000445113441742745033326 0ustar00jvanekmock00000000000000 ClipboardContentCopy1 IcedTea ClipboardContentCopy1 copy1 10 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/resources/PaxHeaders.7406/ClipboardContent0000644000000000000000000000013013441742745030632 xustar0030 mtime=1552401893.110832675 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/resources/ClipboardContentCopy2.jnlp0000644000175000002070000000445113441742745033327 0ustar00jvanekmock00000000000000 ClipboardContentCopy2 IcedTea ClipboardContentCopy2 copy2 10 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/resources/PaxHeaders.7406/ClipboardContent0000644000000000000000000000013013441742745030632 xustar0030 mtime=1552401893.115832665 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/resources/ClipboardContentPaste2.jnlp0000644000175000002070000000441513441742745033471 0ustar00jvanekmock00000000000000 ClipboardContentPaste2 IcedTea ClipboardContentPaste2 paste2 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/resources/PaxHeaders.7406/ClipboardContent0000644000000000000000000000013013441742745030632 xustar0030 mtime=1552401893.112832671 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/ClipboardContent/resources/ClipboardContentPaste1.jnlp0000644000175000002070000000441513441742745033470 0ustar00jvanekmock00000000000000 ClipboardContentPaste1 IcedTea ClipboardContentPaste1 paste1 icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/CheckServices0000644000000000000000000000013213441742745022657 xustar0030 mtime=1552401893.148832596 30 atime=1552410887.107183457 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CheckServices/0000755000175000002070000000000013441742745023544 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CheckServices/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024655 xustar0030 mtime=1552401893.148832596 30 atime=1552410887.107183457 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CheckServices/testcases/0000755000175000002070000000000013441742745025542 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CheckServices/testcases/PaxHeaders.7406/CheckServicesTests.0000644000000000000000000000013013441742745030475 xustar0030 mtime=1552401893.148832596 28 atime=1552402157.2732534 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CheckServices/testcases/CheckServicesTests.java0000644000175000002070000001022313441742745032147 0ustar00jvanekmock00000000000000/* CheckServicesTests.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; @Bug(id="http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-February/017153.html") public class CheckServicesTests extends BrowserTest{ public void evaluateApplet(ProcessResult pr, boolean applet) { String s0 = "Codebase for applet was found in constructor"; Assert.assertTrue("CheckServices stdout should contain `" + s0 + "' but didn't.", pr.stdout.contains(s0)); String s1 = "Codebase for applet was found in init()"; Assert.assertTrue("CheckServices stdout should contain `" + s1 + "' but didn't.", pr.stdout.contains(s1)); String s2 = "Codebase for applet was found in start()"; Assert.assertTrue("CheckServices stdout should contain `" + s2 + "' but didn't.", pr.stdout.contains(s2)); if (applet){ /*this is working correctly in most browser, but not in all. temporarily disabling String s3 = "Codebase for applet was found in stop()"; Assert.assertTrue("CheckServices stdout should contain `" + s3 + "' but didn't.", pr.stdout.contains(s3)); String s4 = "Codebase for applet was found in destroy()"; Assert.assertTrue("CheckServices stdout should contain `" + s4 + "' but didn't.", pr.stdout.contains(s4)); */ } String s5 = "Exception occurred with null codebase in"; Assert.assertFalse("CheckServices stderr should not contain `" + s5 + "' but did.", pr.stdout.contains(s5)); String s6 = "Applet killing itself after 2000 ms of life"; Assert.assertTrue("CheckServices stdout should contain `" + s6 + "' but didn't.", pr.stdout.contains(s6)); } @Test @NeedsDisplay public void CheckWebstartServices() throws Exception { ProcessResult pr = server.executeJavaws(null, "/CheckServices.jnlp"); evaluateApplet(pr, false); Assert.assertFalse(pr.wasTerminated); Assert.assertEquals((Integer)0, pr.returnValue); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) public void CheckPluginJNLPHServices() throws Exception { ProcessResult pr = server.executeBrowser(null, "/CheckPluginServices.html"); evaluateApplet(pr,false); Assert.assertTrue(pr.wasTerminated); } } icedtea-web-1.8/tests/reproducers/simple/CheckServices/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024671 xustar0030 mtime=1552401893.114832667 30 atime=1552410887.107183457 30 ctime=1552410887.084183511 icedtea-web-1.8/tests/reproducers/simple/CheckServices/resources/0000755000175000002070000000000013441742745025556 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CheckServices/resources/PaxHeaders.7406/CheckPluginServices0000644000000000000000000000013013441742745030567 xustar0030 mtime=1552401893.114832667 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/CheckServices/resources/CheckPluginServices.html0000644000175000002070000000343513441742745032351 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/CheckServices/resources/PaxHeaders.7406/CheckServices.jnlp0000644000000000000000000000013013441742745030352 xustar0030 mtime=1552401893.108832679 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/CheckServices/resources/CheckServices.jnlp0000644000175000002070000000432013441742745031163 0ustar00jvanekmock00000000000000 CheckServices IcedTea CheckServices icedtea-web-1.8/tests/reproducers/simple/CheckServices/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023631 xustar0030 mtime=1552401893.117832661 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/CheckServices/srcs/0000755000175000002070000000000013441742745024516 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CheckServices/srcs/PaxHeaders.7406/CheckServices.java0000644000000000000000000000013013441742745027270 xustar0030 mtime=1552401893.117832661 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/CheckServices/srcs/CheckServices.java0000644000175000002070000000753413441742745030113 0ustar00jvanekmock00000000000000/* CheckServices.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import javax.jnlp.ServiceManager; import javax.jnlp.BasicService; import java.applet.Applet; public class CheckServices extends Applet { public CheckServices() { System.out.println("Applet constructor reached."); checkSetup("constructor"); } public void checkSetup(String method) { try { BasicService basicService = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService"); // getCodeBase() will return null if ServiceManager does not // have access to ApplicationInstance. String codebase = basicService.getCodeBase().toString(); System.out.println("Codebase for applet was found in " + method + ": " + codebase); } catch (NullPointerException npe) { System.err.println("Exception occurred with null codebase in " + method); npe.printStackTrace(); } catch (Exception ex) { System.err.println("Exception occurred (probably with ServiceManager)."); ex.printStackTrace(); } } @Override public void init() { System.out.println("Applet is initializing."); checkSetup("init()"); } @Override public void start() { System.out.println("Applet is starting."); checkSetup("start()"); // FIXME: Instead of killing the thread, use the AWT robot to close // the applet window, signaling the event that runs stop/destroy. System.out.println("Killer thread is starting."); Thread killer = new Thread() { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing itself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } }; killer.start(); } @Override public void stop() { System.out.println("Applet is stopping."); checkSetup("stop()"); } @Override public void destroy() { System.out.println("Applet is destorying itself."); checkSetup("destroy()"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AppletTest0000644000000000000000000000013213441742745022223 xustar0030 mtime=1552401893.114832667 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/0000755000175000002070000000000013441742745023110 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTest/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024235 xustar0030 mtime=1552401893.147832598 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/0000755000175000002070000000000013441742745025122 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/PaxHeaders.7406/appletViewTest.html0000644000000000000000000000013013441742745030156 xustar0030 mtime=1552401893.114832667 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/appletViewTest.html0000644000175000002070000000402313441742745030767 0ustar00jvanekmock00000000000000 ok applet

ok applet

ok applet

bad applet

bad applet

icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/PaxHeaders.7406/errorAppletAutoTests.h0000644000000000000000000000013013441742745030634 xustar0030 mtime=1552401893.125832644 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/errorAppletAutoTests.html0000644000175000002070000000351713441742745032171 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/PaxHeaders.7406/appletZeroWH.html0000644000000000000000000000013013441742745027562 xustar0030 mtime=1552401893.147832598 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/appletZeroWH.html0000644000175000002070000000353113441742745030376 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/PaxHeaders.7406/appletZeroH.html0000644000000000000000000000013013441742745027433 xustar0030 mtime=1552401893.108832679 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/appletZeroH.html0000644000175000002070000000353313441742745030251 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/PaxHeaders.7406/AppletTest.jnlp0000644000000000000000000000013013441742745027262 xustar0030 mtime=1552401893.109832677 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/AppletTest.jnlp0000644000175000002070000000447013441742745030101 0ustar00jvanekmock00000000000000 AppletTest IcedTea AppletTest icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/PaxHeaders.7406/appletAutoTests2.html0000644000000000000000000000013013441742745030421 xustar0030 mtime=1552401893.114832667 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/appletAutoTests2.html0000644000175000002070000000353513441742745031241 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/PaxHeaders.7406/appletAutoTests.html0000644000000000000000000000013013441742745030337 xustar0030 mtime=1552401893.111832673 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/appletAutoTests.html0000644000175000002070000000354313441742745031156 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/PaxHeaders.7406/appletZeroW.html0000644000000000000000000000013013441742745027452 xustar0030 mtime=1552401893.116832663 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/resources/appletZeroW.html0000644000175000002070000000353313441742745030270 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletTest/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023175 xustar0030 mtime=1552401893.112832671 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/srcs/0000755000175000002070000000000013441742745024062 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTest/srcs/PaxHeaders.7406/AppletErrorTest.java0000644000000000000000000000013013441742745027212 xustar0030 mtime=1552401893.110832675 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/srcs/AppletErrorTest.java0000644000175000002070000002150713441742745030031 0ustar00jvanekmock00000000000000/* AppletErrorTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. * */ import java.applet.Applet; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Random; import javax.swing.JApplet; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class AppletErrorTest extends JApplet { private class Killer extends Thread { public int n = 20000; @Override public void run() { try { Thread.sleep(n); System.out.println("Error Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private volatile boolean waiting = true; private boolean isApplet = true; private Killer killer; private final String IN_GUI_THREAD = "IN_GUI_THREAD"; private final String BEHIND_GUI_THREAD = "BEHIND_GUI_THREAD"; private final String IN_GUI = "IN_GUI"; private final String IN_INIT = "IN_INIT"; private final String IN_START = "IN_START"; private final String IN_STOP = "IN_STOP"; private final String IN_DESTROY = "IN_DESTROY"; private String levelOfDeath = BEHIND_GUI_THREAD; @Override public void init() { if (isApplet) { String s = getParameter("levelOfDeath"); if (s != null) { levelOfDeath = s; } } System.out.println("Error applet was initialised"); killer = new Killer(); if (levelOfDeath.equals(IN_INIT)) { throw new RuntimeException("Intentional exception from init"); } } public static void main(String[] args) { final JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(899, 600); f.setLayout(new BorderLayout()); AppletErrorTest ae = new AppletErrorTest(); ae.isApplet=false; ae.init(); f.add(ae); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { f.setVisible(true); } }); ae.start(); } @Override public void start() { final AppletErrorTest aSelf = this; final JPanel self = new JPanel(); aSelf.setLayout(new BorderLayout()); aSelf.add(self); self.setLayout(new GridLayout(0, 4)); final Random r = new Random(); new Thread(new Runnable() { @Override public void run() { new Colorer(self, r).run(); } }).start(); System.out.println("Error applet was started"); killer.start(); System.out.println("killer was started"); if (levelOfDeath.equals(IN_GUI_THREAD) || levelOfDeath.equals(IN_GUI) || levelOfDeath.equals(BEHIND_GUI_THREAD)) { new Thread(new Runnable() { @Override public void run() { try { for (int i = 0; i < 15; i++) { try { System.out.println("Rainbow is shining"); new GuiRainbow(self, r, i).run(); if (levelOfDeath.equals(BEHIND_GUI_THREAD) && i >= 12) { throw new RuntimeException("Intentional error from start (gui is running)- " + levelOfDeath); } Thread.sleep(200); } catch (InterruptedException ex) { throw new RuntimeException(ex); } } } finally { waiting = false; } } }).start(); } if (!isApplet) { if (levelOfDeath.equals(IN_GUI)) { while (waiting) { try { Thread.sleep(100); SwingUtilities.invokeLater(new Runnable() { public void run() { aSelf.repaint(); aSelf.validate(); aSelf.repaint(); } }); } catch (InterruptedException ex) { throw new RuntimeException(ex); } } throw new RuntimeException("Intentional error from start (gui was running)- " + levelOfDeath); } } if (levelOfDeath.equals(IN_START)) { throw new RuntimeException("Intentional error from start (gui was not running)- " + levelOfDeath); } } @Override public void stop() { System.out.println("Error applet was stopped"); if (levelOfDeath.equals(IN_STOP)) { throw new RuntimeException("Intentional exception from stop" + levelOfDeath); } } @Override public void destroy() { System.out.println("Error applet will be destroyed"); if (levelOfDeath.equals(IN_DESTROY)) { throw new RuntimeException("Intentional exception from destroy" + levelOfDeath); } } private class GuiRainbow implements Runnable { private final JComponent self; private final Random r; private final int i; public GuiRainbow(JComponent self, Random r, int i) { this.self = self; this.r = r; this.i = i; } @Override public void run() { if (self.getComponentCount() > 1 && r.nextInt(2) == 0) { int x = r.nextInt(self.getComponentCount()); self.remove(x); self.validate(); } else { JLabel ll=new JLabel("Hi, its error applet here " + i); self.add(ll); self.validate(); ll.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { throw new RuntimeException("Intentional exception by click to "+i); } }); } System.out.println("Components are handled"); if (levelOfDeath.equals(IN_GUI_THREAD) && i >= 8) { throw new RuntimeException("Intentional error from swing thread (gui is running)- " + levelOfDeath); } } } class Colorer implements Runnable { private final JComponent self; private final Random r; public Colorer(JComponent self, Random r) { this.self = self; this.r = r; } @Override public void run() { int i = 0; while (true) { i++; try { self.setBackground(new Color(r.nextInt())); System.out.println("Applet is coloring " + i); Thread.sleep(200); } catch (Exception ex) { //intentionally silenced } } } } } icedtea-web-1.8/tests/reproducers/simple/AppletTest/srcs/PaxHeaders.7406/AppletTest.java0000644000000000000000000000013013441742745026200 xustar0030 mtime=1552401893.112832671 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/srcs/AppletTest.java0000644000175000002070000000521313441742745027013 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class AppletTest extends Applet { private class Killer extends Thread { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Aplet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { System.out.println("applet was initialised"); killer = new Killer(); } @Override public void start() { System.out.println("applet was started"); System.out.println(getParameter("key1")); System.out.println(getParameter("key2")); killer.start(); System.out.println("killer was started"); } @Override public void stop() { System.out.println("applet was stopped"); } @Override public void destroy() { System.out.println("applet will be destroyed"); } } icedtea-web-1.8/tests/reproducers/simple/AppletTest/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024221 xustar0030 mtime=1552401893.114832667 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/testcases/0000755000175000002070000000000013441742745025106 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTest/testcases/PaxHeaders.7406/AppletTestTests.java0000644000000000000000000000013013441742745030247 xustar0030 mtime=1552401893.114832667 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java0000644000175000002070000001775013441742745031073 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class AppletTestTests extends BrowserTest { private final String s7 = "Aplet killing himself after 2000 ms of life"; private final String s2 = "value2"; private final String s1 = "value1"; private final String s0 = "applet was started"; private final String s3 = "applet was initialised"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(s0) && s.contains(s1) && s.contains(s2) && s.contains(s3) && s.contains(s7)); } } @Test @TestInBrowsers(testIn = {Browsers.googleChrome}) @NeedsDisplay public void doubleChrome() throws Exception { ServerAccess.PROCESS_TIMEOUT = 30 * 1000; try { //System.out.println("connecting AppletInFirefoxTest request in " + getBrowser().toString()); //just verify loging is recording browser ProcessResult pr1 = server.executeBrowser("/appletAutoTests2.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); if (pr1.process == null) { Assert.assertTrue("If proces was null here, then google-chrome had to not exist, and so " + ServerAccess.UNSET_BROWSER + " should be in exception, but exception was " + pr1.deadlyException.getMessage(), pr1.deadlyException.getMessage().contains(ServerAccess.UNSET_BROWSER)); return; } evaluateApplet(pr1, false); Assert.assertTrue(pr1.wasTerminated); //System.out.println("connecting AppletInFirefoxTest request in " + getBrowser().toString()); // just verify loging is recording browser ProcessResult pr = server.executeBrowser("/appletAutoTests2.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateApplet(pr, false); Assert.assertTrue(pr.wasTerminated); } finally { ServerAccess.PROCESS_TIMEOUT = 20 * 1000; //back to normal } } @Test @NeedsDisplay public void AppletTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/AppletTest.jnlp"); evaluateApplet(pr, true); Assert.assertFalse(pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } private void evaluateApplet(ProcessResult pr, boolean javawsApplet) { Assert.assertTrue("AppletTest stdout should contains " + s3 + " bud didn't", pr.stdout.contains(s3)); Assert.assertTrue("AppletTest stdout should contains " + s0 + " bud didn't", pr.stdout.contains(s0)); Assert.assertTrue("AppletTest stdout should contains " + s1 + " bud didn't", pr.stdout.contains(s1)); Assert.assertTrue("AppletTest stdout should contains " + s2 + " bud didn't", pr.stdout.contains(s2)); Assert.assertTrue("AppletTest stdout should contains " + s7 + " bud didn't", pr.stdout.contains(s7)); if (!javawsApplet) { /*this is working correctly in most browser, but not in all. temporarily disabling String s4 = "applet was stopped"; Assert.assertTrue("AppletTest stdout should contain " + s4 + " bud did't", pr.stdout.contains(s4)); String s5 = "applet will be destroyed"; Assert.assertTrue("AppletTest stdout should contain " + s5 + " bud did't", pr.stdout.contains(s5)); */ } } @Test @TestInBrowsers(testIn = {Browsers.all}) @NeedsDisplay public void AppletInBrowserTest() throws Exception { //System.out.println("connecting AppletInFirefoxTest request in " + getBrowser().toString()); //just verify loging is recordingb rowser ServerAccess.PROCESS_TIMEOUT = 30 * 1000; try { ProcessResult pr = server.executeBrowser("/appletAutoTests2.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateApplet(pr, false); //Assert.assertTrue(pr.wasTerminated); this checks asre evil //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null } finally { ServerAccess.PROCESS_TIMEOUT = 20 * 1000; //back to normal } } @TestInBrowsers(testIn = {Browsers.all}) @NeedsDisplay public void AppletInBrowserTestXslowX() throws Exception { //System.out.println("connecting AppletInFirefoxTest request in " + getBrowser().toString()); //just verify loging is recording browser ServerAccess.PROCESS_TIMEOUT = 30 * 1000; try { ProcessResult pr = server.executeBrowser("/appletAutoTests.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); pr.process.destroy(); evaluateApplet(pr, false); Assert.assertTrue(pr.wasTerminated); //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null } finally { ServerAccess.PROCESS_TIMEOUT = 20 * 1000; //back to normal } } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void appletZeroWH() throws Exception { ProcessResult pr = server.executeBrowser("/appletZeroWH.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateApplet(pr, false); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void appletZeroW() throws Exception { ProcessResult pr = server.executeBrowser("/appletZeroW.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateApplet(pr, false); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void appletZeroH() throws Exception { ProcessResult pr = server.executeBrowser("/appletZeroH.html", new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateApplet(pr, false); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AppletTakesLastParam0000644000000000000000000000013213441742745024160 xustar0030 mtime=1552401893.147832598 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/0000755000175000002070000000000013441742745025045 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026156 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/testcases/0000755000175000002070000000000013441742745027043 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/testcases/PaxHeaders.7406/AppletTakesL0000644000000000000000000000031013441742745030505 xustar00112 path=icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/testcases/AppletTakesLastParamTests.java 30 mtime=1552401893.124832646 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/testcases/AppletTakesLastParamTests.ja0000644000175000002070000000551013441742745034425 0ustar00jvanekmock00000000000000/* AppletTakesLastParamTests.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class AppletTakesLastParamTests extends BrowserTest { private void evaluate(ProcessResult pr) { String firstParam = "value1"; String secondParam = "value2"; Assert.assertFalse("AppletTakesLastParam stdout should not contain " + firstParam + " but did.", pr.stdout.contains(firstParam)); Assert.assertTrue("AppletTakesLastParam stdout should contain " + secondParam + " but did not.", pr.stdout.contains(secondParam)); } @Test @TestInBrowsers(testIn = {Browsers.one}) public void appletTakesLastParam() throws Exception { ProcessResult pr = server.executeBrowser("/appletTakesLastParam.html", AutoClose.CLOSE_ON_BOTH); evaluate(pr); } @Test public void jnlpTakesLastParam() throws Exception { ProcessResult pr = server.executeJavaws("/appletTakesLastParam.jnlp"); evaluate(pr); } }icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025132 xustar0030 mtime=1552401893.147832598 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/srcs/0000755000175000002070000000000013441742745026017 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/srcs/PaxHeaders.7406/AppletTakesLastPa0000644000000000000000000000013013441742745030452 xustar0030 mtime=1552401893.147832598 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/srcs/AppletTakesLastParam.java0000644000175000002070000000364613441742745032715 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class AppletTakesLastParam extends Applet { public void init() { System.out.println(getParameter("param")); System.out.println("*** APPLET FINISHED ***"); // Exits JNLP-launched applets, throws exception on normal applet: System.exit(0); } } icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026172 xustar0030 mtime=1552401893.116832663 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/resources/0000755000175000002070000000000013441742745027057 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/resources/PaxHeaders.7406/appletTakesL0000644000000000000000000000013013441742745030561 xustar0030 mtime=1552401893.107832681 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/resources/appletTakesLastParam.html0000644000175000002070000000351413441742745034032 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/resources/PaxHeaders.7406/appletTakesL0000644000000000000000000000013013441742745030561 xustar0030 mtime=1552401893.116832663 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletTakesLastParam/resources/appletTakesLastParam.jnlp0000644000175000002070000000456613441742745034041 0ustar00jvanekmock00000000000000 AppletTakesLastParam IcedTea AppletTakesLastParam icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AppletSharedClassLoader0000644000000000000000000000013213441742745024627 xustar0030 mtime=1552401893.109832677 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/0000755000175000002070000000000013441742745025514 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025601 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/srcs/0000755000175000002070000000000013441742745026466 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/srcs/PaxHeaders.7406/SharedClassLoa0000644000000000000000000000013013441742745030427 xustar0030 mtime=1552401893.113832669 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/srcs/SharedClassLoaderApplet1.java0000644000175000002070000000351713441742745034111 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import javax.swing.JApplet; public class SharedClassLoaderApplet1 extends JApplet { @Override public void init() { } @Override public void start() { new SharedSecret(this).run(); } } icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/srcs/PaxHeaders.7406/SharedClassLoa0000644000000000000000000000013013441742745030427 xustar0030 mtime=1552401893.106832684 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/srcs/SharedClassLoaderApplet2.java0000644000175000002070000000351713441742745034112 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import javax.swing.JApplet; public class SharedClassLoaderApplet2 extends JApplet { @Override public void init() { } @Override public void start() { new SharedSecret(this).run(); } } icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/srcs/PaxHeaders.7406/SharedSecret.j0000644000000000000000000000013013441742745030403 xustar0030 mtime=1552401893.115832665 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/srcs/SharedSecret.java0000644000175000002070000000537313441742745031715 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; public class SharedSecret { public static AtomicInteger value = new AtomicInteger(1); private final Applet body; private static final Random r = new Random(); public SharedSecret(Applet body) { this.body = body; System.out.println(body.getCodeBase().toString() + body.toString() + "have " + this.getClass().getClassLoader().toString()); } public void run() { while (true) { if (body.getParameter("reader") != null) { System.out.println(this.toString() + " Reading " + value.toString() + " X"); } else if (body.getParameter("writer") != null) { int a = value.incrementAndGet(); System.out.println(this.toString() + " Writing " + a + " X"); } else { System.out.println(this.toString() + "Unknown destiny"); } try { Thread.sleep(r.nextInt(50) + 50); } catch (Exception ex) { throw new RuntimeException(ex); } } } } icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/PaxHeaders.7406/resources0000644000000000000000000000013013441742745026637 xustar0028 mtime=1552401893.1468326 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/0000755000175000002070000000000013441742745027526 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000032713441742745030515 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-writer1.html 30 mtime=1552401893.112832671 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000352013441742745034410 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000033013441742745030507 xustar00128 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-reader1.html 30 mtime=1552401893.123832648 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000352113441742745034411 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000033613441742745030515 xustar00135 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-reader1-writer1.html 29 mtime=1552401893.12283265 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000377713441742745034426 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000033613441742745030515 xustar00136 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-reader1-writer2.html 28 mtime=1552401893.1468326 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000400013441742745034402 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000032713441742745030515 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-writer2.html 30 mtime=1552401893.106832684 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000352013441742745034410 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000033013441742745030507 xustar00128 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-reader2.html 30 mtime=1552401893.108832679 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000352113441742745034411 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000033713441742745030516 xustar00135 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-reader1-writer2.html 30 mtime=1552401893.107832681 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000377713441742745034426 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000033013441742745030507 xustar00128 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-writer2.html 30 mtime=1552401893.113832669 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000352113441742745034411 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000032713441742745030515 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-reader2.html 30 mtime=1552401893.112832671 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000352013441742745034410 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000033013441742745030507 xustar00128 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-writer1.html 30 mtime=1552401893.110832675 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000352113441742745034411 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000032713441742745030515 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-reader1.html 30 mtime=1552401893.110832675 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000352013441742745034410 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/PaxHeaders.7406/LaunchSha0000644000000000000000000000034013441742745030510 xustar00136 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-reader1-writer1.html 30 mtime=1552401893.115832665 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderAp0000644000175000002070000000400013441742745034402 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026625 xustar0030 mtime=1552401893.147832598 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/0000755000175000002070000000000013441742745027512 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/PaxHeaders.7406/SharedCla0000644000000000000000000000035013441742745030455 xustar00144 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/SharedClassLoaderApplet_WrittenPartialStubCodeBaseTest.java 30 mtime=1552401893.123832648 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/SharedClassLoaderApplet_W0000644000175000002070000002514413441742745034422 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class SharedClassLoaderApplet_WrittenPartialStubCodeBaseTest extends BrowserTest { //this is shortcut to avoid SharedClassLoaderApplet_dotCodeBaseTest.something //as static import from default package is forbidden private static final class X extends SharedClassLoaderApplet_dotCodeBaseTest { }; //this is shortcut to avoid SharedClassLoaderApplet_WrittenCompleteCodeBaseTest.something //as static import from default package is forbidden private static final class Y extends SharedClassLoaderApplet_WrittenCompleteCodeBaseTest { }; private static final ServerLauncher secondServer = ServerAccess.getIndependentInstance(); private static final String writtenCodeBaseSuffix = "_WCB2"; private static final String writtenCodeBaseFileSuffix = writtenCodeBaseSuffix + ".html"; private static final String subFolderName = "SharedClassLaoderSubCodebaseFolder"; private static final File root = server.getDir(); private static final File subRoot = new File(root, subFolderName); private static final File origJar1 = new File(server.getDir(), X.jar1); private static final File origJar2 = new File(server.getDir(), X.jar2); private static final String renamedJar1Name=X.jar1+"XYZ"; private static final String renamedJar2Name=X.jar2+"XYZ"; private static final File renamedJar1 = new File(server.getDir(), renamedJar1Name); private static final File renamedJar2 = new File(server.getDir(), renamedJar2Name); @BeforeClass public static void createAlternativeAndEnsureOriginalArchivesDontExist() throws IOException { if (!subRoot.exists()) { boolean b = subRoot.mkdir(); if (!b){ throw new RuntimeException(subRoot.toString()+" was not created"); } } FirefoxProfilesOperator.copyFile(origJar1, new File(subRoot, X.jar1)); FirefoxProfilesOperator.copyFile(origJar1, new File(subRoot, X.jar2)); //origJar2 is actually created by SharedClassLoaderApplet_dotCodeBaseTestcreateAlternativeArchive //so it do not need to exists if (origJar2.exists()){ boolean b = origJar2.renameTo(renamedJar2); if (!b) { throw new RuntimeException(origJar2.toString()+" was not renamed"); } } boolean b = origJar1.renameTo(renamedJar1); if (!b) { throw new RuntimeException(origJar1.toString()+" was not renamed"); } } @AfterClass public static void restoreRenamedJars(){ if (renamedJar2.exists()){ boolean b = renamedJar2.renameTo(origJar2); if (!b){ throw new RuntimeException(renamedJar2.toString()+" was not renamed"); } } boolean b = renamedJar1.renameTo(origJar1); if (!b) { throw new RuntimeException(renamedJar1.toString()+" was not renamed"); } } @BeforeClass public static void prepareFakeFiles() throws IOException { for (int i = 0; i < Y.originalNames.length; i++) { String string = Y.originalNames[i]; String content = ServerAccess.getContentOfStream(new FileInputStream(new File(server.getDir(), string + X.dotCodeBaseFileSuffix)), "utf-8"); String content1 = content.replaceAll("codebase=\"\\.\"", "codebase=\"/" + subFolderName + "/\""); ServerAccess.saveFile(content1, new File(server.getDir(), string + writtenCodeBaseFileSuffix)); } } @AfterClass public static void stopSecondServer() { secondServer.stop(); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAll_onePage() throws Exception { ProcessResult pr = server.executeBrowser(X.r1w1 + writtenCodeBaseFileSuffix, new RulesFolowingClosingListener(X.readShared), null); X.assertSharedLoader(pr, false); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllExceptMain_OnePage() throws Exception { ProcessResult pr = server.executeBrowser(X.r1w2 + writtenCodeBaseFileSuffix, new RulesFolowingClosingListener(X.readShared), null); X.assertSharedLoader(pr, false); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBase_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(server.getUrl(X.r1 + writtenCodeBaseFileSuffix)), null); X.assertSharedLoader(pr, true); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndMain_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(server.getUrl(X.r2 + writtenCodeBaseFileSuffix)), null); X.assertSharedLoader(pr, true); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndCodeBase_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(secondServer.getUrl(X.r1 + writtenCodeBaseFileSuffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseCodeBaseAndMain_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(secondServer.getUrl(X.r2 + writtenCodeBaseFileSuffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButArchives_onePage() throws Exception { ProcessResult pr = server.executeBrowser(X.r1w1_2 + writtenCodeBaseFileSuffix, new RulesFolowingClosingListener(X.readShared), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllExceptMainAndArchives_OnePage() throws Exception { ProcessResult pr = server.executeBrowser(X.r1w2_2 + writtenCodeBaseFileSuffix, new RulesFolowingClosingListener(X.readShared), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1_2 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(server.getUrl(X.r1 + writtenCodeBaseFileSuffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndMainAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1_2 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(server.getUrl(X.r2 + writtenCodeBaseFileSuffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndCodeBaseAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1_2 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(secondServer.getUrl(X.r1 + writtenCodeBaseFileSuffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseCodeBaseAndMainAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1_2 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(secondServer.getUrl(X.r2 + writtenCodeBaseFileSuffix)), null); X.assertNotSharedLoader(pr); } } icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/PaxHeaders.7406/SharedCla0000644000000000000000000000034513441742745030461 xustar00141 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/SharedClassLoaderApplet_WrittenCompleteCodeBaseTest.java 30 mtime=1552401893.147832598 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/SharedClassLoaderApplet_W0000644000175000002070000002230013441742745034411 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class SharedClassLoaderApplet_WrittenCompleteCodeBaseTest extends BrowserTest { //this is shortcut to avoid SharedClassLoaderApplet_dotCodeBaseTest.something //as static import from default package is forbidden private static final class X extends SharedClassLoaderApplet_dotCodeBaseTest { }; private static final ServerLauncher secondServer = ServerAccess.getIndependentInstance(); private static final String writtenCodeBaseSuffix = "_WCB"; private static final String writtenCodeBaseServer2Suffix =writtenCodeBaseSuffix+"_2"; private static final String writtenCodeBaseFileSuffix = writtenCodeBaseSuffix + ".html"; private static final String writtenCodeBaseFileServer2Suffix = writtenCodeBaseServer2Suffix + ".html"; public static final String[] originalNames = new String[]{ X.r1w1, X.r1w2, X.r1, X.w1, X.r2, X.w2, X.r1w1_2, X.r1w2_2, X.r1_2, X.w1_2, X.r2_2, X.w2_2}; @BeforeClass public static void createAlternativeArchive() throws IOException { FirefoxProfilesOperator.copyFile(new File(server.getDir(), X.jar1), new File(server.getDir(), X.jar2)); } @BeforeClass public static void prepareFakeFiles() throws IOException { for (int i = 0; i < originalNames.length; i++) { String string = originalNames[i]; String content = ServerAccess.getContentOfStream(new FileInputStream(new File(server.getDir(),string+X.dotCodeBaseFileSuffix)), "utf-8"); String content1=content.replaceAll("codebase=\"\\.\"", "codebase=\""+server.getUrl("") +"\""); ServerAccess.saveFile(content1, new File(server.getDir(),string+writtenCodeBaseFileSuffix)); if (string.equals(X.r1) || string.equals(X.r2)){ String content2=content.replaceAll("codebase=\"\\.\"", "codebase=\""+secondServer.getUrl() +"\""); ServerAccess.saveFile(content2, new File(server.getDir(),string+writtenCodeBaseFileServer2Suffix)); } } } @AfterClass public static void stopSecondServer() { secondServer.stop(); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAll_onePage() throws Exception { ProcessResult pr = server.executeBrowser(X.r1w1 + writtenCodeBaseFileSuffix, new RulesFolowingClosingListener(X.readShared), null); X.assertSharedLoader(pr,false); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllExceptMain_OnePage() throws Exception { ProcessResult pr = server.executeBrowser(X.r1w2 + writtenCodeBaseFileSuffix, new RulesFolowingClosingListener(X.readShared), null); X.assertSharedLoader(pr,false); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBase_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(server.getUrl(X.r1 + writtenCodeBaseFileSuffix)), null); X.assertSharedLoader(pr,true); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndMain_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(server.getUrl(X.r2 + writtenCodeBaseFileSuffix)), null); X.assertSharedLoader(pr,true); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndCodeBase_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(secondServer.getUrl(X.r1 + writtenCodeBaseFileServer2Suffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseCodeBaseAndMain_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(secondServer.getUrl(X.r2 + writtenCodeBaseFileServer2Suffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButArchives_onePage() throws Exception { ProcessResult pr = server.executeBrowser(X.r1w1_2 + writtenCodeBaseFileSuffix, new RulesFolowingClosingListener(X.readShared), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllExceptMainAndArchives_OnePage() throws Exception { ProcessResult pr = server.executeBrowser(X.r1w2_2 + writtenCodeBaseFileSuffix, new RulesFolowingClosingListener(X.readShared), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1_2 + writtenCodeBaseFileSuffix,new X.UrlLaunchingListener(server.getUrl(X.r1 + writtenCodeBaseFileSuffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndMainAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1_2 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(server.getUrl(X.r2 + writtenCodeBaseFileSuffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndCodeBaseAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1_2 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(secondServer.getUrl(X.r1 + writtenCodeBaseFileServer2Suffix)), null); X.assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseCodeBaseAndMainAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(X.w1_2 + writtenCodeBaseFileSuffix, new X.UrlLaunchingListener(secondServer.getUrl(X.r2 + writtenCodeBaseFileServer2Suffix)), null); X.assertNotSharedLoader(pr); } } icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/PaxHeaders.7406/SharedCla0000644000000000000000000000033113441742745030454 xustar00129 path=icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/SharedClassLoaderApplet_dotCodeBaseTest.java 30 mtime=1552401893.109832677 28 atime=1552402157.2732534 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletSharedClassLoader/testcases/SharedClassLoaderApplet_d0000644000175000002070000003206513441742745034437 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.closinglisteners.Rule; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class SharedClassLoaderApplet_dotCodeBaseTest extends BrowserTest { private static final ServerLauncher secondServer = ServerAccess.getIndependentInstance(); public static final String readingKeyword = "Reading"; private static String reaadOneKeyword = readingKeyword + " 1 X"; public static final String writingKeyword = "Writing"; public static final String unknownKeyword = "Unknown destiny"; public static final RulesFolowingClosingListener.MatchesRule readShared = new RulesFolowingClosingListener.MatchesRule("(?s).*" + readingKeyword + "\\s+[1-9][0-9]+\\sX.*"); public static final RulesFolowingClosingListener.MatchesRule writeShared = new RulesFolowingClosingListener.MatchesRule("(?s).*" + writingKeyword + "\\s+[1-9][0-9]+\\sX.*"); public static final Rule tooMuchReading = new Rule() { public static final int countsToBelieve = 5; @Override public void setRule(Object rule) { //noop } @Override public boolean evaluate(String upon) { return countStrings(upon) > countsToBelieve; } @Override public String toPassingString() { return "should contain at least" + countsToBelieve + " occurences of: " + reaadOneKeyword; } @Override public String toFailingString() { return "should contain no more than " + countsToBelieve + " occurences of: " + reaadOneKeyword; } }; public static class UrlLaunchingListener extends net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener { private final URL url; private boolean launched = false; public UrlLaunchingListener(URL url) { super(writeShared); this.url = url; } @Override protected boolean isAlowedToFinish(String content) { boolean b = super.isAlowedToFinish(content); if (b && !launched) { launched = true; try { //should imidately return because browser is running, if not, launch ins another thread ProcessWrapper pw = new ProcessWrapper(server.getBrowserLocation(), new ArrayList(), url); pw.execute(); } catch (Exception ex) { throw new RuntimeException(ex); } } return readShared.evaluate(content)/*ok*/ || tooMuchReading.evaluate(content)/*not ok*/; } } public static final String dotCodeBaseSuffix = ""; public static final String dotCodeBaseFileSuffix = dotCodeBaseSuffix+".html"; //names of used resources public static final String namePrefix = "LaunchSharedClassLoaderApplet-"; public static final String namePrefix2 = "LaunchSharedClassLoaderApplet2-"; public static final String r1w1 = namePrefix + "reader1-writer1"; public static final String r1w2 = namePrefix + "reader1-writer2"; public static final String r1 = namePrefix + "reader1"; public static final String w1 = namePrefix + "writer1"; public static final String r2 = namePrefix + "reader2"; public static final String w2 = namePrefix + "writer2"; public static final String r1w1_2 = namePrefix2 + "reader1-writer1"; public static final String r1w2_2 = namePrefix2 + "reader1-writer2"; public static final String r1_2 = namePrefix2 + "reader1"; public static final String w1_2 = namePrefix2 + "writer1"; public static final String r2_2 = namePrefix2 + "reader2"; public static final String w2_2 = namePrefix2 + "writer2"; public static final String jarPrefix = "AppletSharedClassLoader"; public static final String jar1 = jarPrefix + ".jar"; public static final String jar2 = jarPrefix + "2.jar"; @BeforeClass public static void createAlternativeArchive() throws IOException { FirefoxProfilesOperator.copyFile(new File(server.getDir(), jar1), new File(server.getDir(), jar2)); } @AfterClass public static void stopSecondServer() { secondServer.stop(); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAll_onePage() throws Exception { ProcessResult pr = server.executeBrowser(r1w1 + dotCodeBaseFileSuffix, new RulesFolowingClosingListener(readShared), null); assertSharedLoader(pr,false); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllExceptMain_OnePage() throws Exception { ProcessResult pr = server.executeBrowser(r1w2 + dotCodeBaseFileSuffix, new RulesFolowingClosingListener(readShared), null); assertSharedLoader(pr,false); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBase_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(w1 + dotCodeBaseFileSuffix, new UrlLaunchingListener(server.getUrl(r1 + dotCodeBaseFileSuffix)), null); assertSharedLoader(pr,true); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndMain_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(w1 + dotCodeBaseFileSuffix, new UrlLaunchingListener(server.getUrl(r2 + dotCodeBaseFileSuffix)), null); assertSharedLoader(pr,true); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test //codebase seems to be compared by dots only public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndCodeBase_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(w1 + dotCodeBaseFileSuffix, new UrlLaunchingListener(secondServer.getUrl(r1 + dotCodeBaseFileSuffix)), null); assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test //codebase seems to be compared by dots only public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseCodeBaseAndMain_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(w1 + dotCodeBaseFileSuffix, new UrlLaunchingListener(secondServer.getUrl(r2 + dotCodeBaseFileSuffix)), null); assertNotSharedLoader(pr); } public static int countStrings(String where) { return countStrings(reaadOneKeyword, where); } public static int countStrings(String what, String where) { int lastIndex = 0; int count = 0; while (lastIndex != -1) { lastIndex = where.indexOf(what, lastIndex); if (lastIndex != -1) { count++; lastIndex += what.length(); } } return count; } public static void assertSharedLoader(ProcessResult pr, boolean twoSyncPages) { Assert.assertFalse("stdout must not contains " + unknownKeyword, pr.stdout.contains(unknownKeyword)); Assert.assertTrue("stdout " + readShared.toPassingString(), readShared.evaluate(pr.stdout)); Assert.assertTrue("stdout " + writeShared.toPassingString(), writeShared.evaluate(pr.stdout)); if (twoSyncPages) { //for not synchronised applets there is danger of reading before writing //so this would be to strict and so randomly failing Assert.assertFalse("stdout should NOT contains several " + readingKeyword + " strings, have", tooMuchReading.evaluate(pr.stdout)); } } public static void assertNotSharedLoader(ProcessResult pr) { Assert.assertFalse("stdout " + readShared.toFailingString(), readShared.evaluate(pr.stdout)); Assert.assertTrue("stdout " + writeShared.toPassingString(), writeShared.evaluate(pr.stdout)); Assert.assertTrue("stdout should contain several " + readingKeyword + " strings, have not", tooMuchReading.evaluate(pr.stdout)); Assert.assertFalse("stdout must not contain " + unknownKeyword, pr.stdout.contains(unknownKeyword)); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButArchives_onePage() throws Exception { ProcessResult pr = server.executeBrowser(r1w1_2 + dotCodeBaseFileSuffix, new RulesFolowingClosingListener(readShared), null); assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllExceptMainAndArchives_OnePage() throws Exception { ProcessResult pr = server.executeBrowser(r1w2_2 + dotCodeBaseFileSuffix, new RulesFolowingClosingListener(readShared), null); assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(w1_2 + dotCodeBaseFileSuffix,new UrlLaunchingListener(server.getUrl(r1 + dotCodeBaseFileSuffix)), null); assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Bug(id = "PR580") @Test public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndMainAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(w1_2 + dotCodeBaseFileSuffix, new UrlLaunchingListener(server.getUrl(r2 + dotCodeBaseFileSuffix)), null); assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test //although codebase seems to be compared by dots only, the archive does its job public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseAndCodeBaseAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(w1_2 + dotCodeBaseFileSuffix, new UrlLaunchingListener(secondServer.getUrl(r1 + dotCodeBaseFileSuffix)), null); assertNotSharedLoader(pr); } @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay @Test //although codebase seems to be compared by dots only, the archive does its job public void SharedClassLoaderAppletTest_sharedAllButDocumentBaseCodeBaseAndMainAndArchives_twoPages() throws Exception { ProcessResult pr = server.executeBrowser(w1_2 + dotCodeBaseFileSuffix, new UrlLaunchingListener(secondServer.getUrl(r2 + dotCodeBaseFileSuffix)), null); assertNotSharedLoader(pr); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AppletReadsInvalidJar0000644000000000000000000000013013441742745024304 xustar0028 mtime=1552401893.1468326 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/0000755000175000002070000000000013441742745025173 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/PaxHeaders.7406/testcases0000644000000000000000000000013013441742745026302 xustar0028 mtime=1552401893.1468326 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/testcases/0000755000175000002070000000000013441742745027171 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/testcases/PaxHeaders.7406/AppletReads0000644000000000000000000000031213441742745030510 xustar00114 path=icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/testcases/AppletReadsInvalidJarTests.java 28 mtime=1552401893.1468326 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/testcases/AppletReadsInvalidJarTests.0000644000175000002070000000602513441742745034370 0ustar00jvanekmock00000000000000/* AppletReadsInvalidJarTests.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; public class AppletReadsInvalidJarTests extends BrowserTest{ static final String CORRECT_EXECUTION = "Program Executed Correctly."; static final String JNLP_EXPECTED_EXCEPTION = "ZipException"; /*This SHOULD NOT execute the applet!*/ @Test public void AppletJNLPTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless("/AppletReadsInvalidJar.jnlp"); Assert.assertFalse("AppletReadsInvalidJar stdout should NOT contain '" + CORRECT_EXECUTION + "', but did (applet should not have ran!).", pr.stdout.contains(CORRECT_EXECUTION)); Assert.assertTrue("AppletReadsInvalidJar stderr should contain 'ZipException', but did not.", pr.stderr.contains(JNLP_EXPECTED_EXCEPTION)); } /*This SHOULD execute the applet!*/ @Test @TestInBrowsers(testIn={Browsers.one}) public void AppletInFirefoxTest() throws Exception { ProcessResult pr = server.executeBrowser("/AppletReadsInvalidJar.html"); Assert.assertTrue("AppletReadsInvalidJar stdout should contain '" + CORRECT_EXECUTION + "' but did not.", pr.stdout.contains(CORRECT_EXECUTION)); } } icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026320 xustar0030 mtime=1552401893.112832671 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/resources/0000755000175000002070000000000013441742745027205 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/resources/PaxHeaders.7406/AppletReads0000644000000000000000000000013213441742745030524 xustar0030 mtime=1552401893.112832671 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/resources/AppletReadsInvalidJar.jnlp0000644000175000002070000000446113441742745034247 0ustar00jvanekmock00000000000000 AppletReadsInvalidJar IcedTea AppletTest icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/resources/PaxHeaders.7406/NOT_A_VALID0000644000000000000000000000013213441742745030137 xustar0030 mtime=1552401893.105832685 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/resources/NOT_A_VALID_JAR.jar0000644000175000002070000000000013441742745032204 0ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/resources/PaxHeaders.7406/AppletReads0000644000000000000000000000013213441742745030524 xustar0030 mtime=1552401893.112832671 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/resources/AppletReadsInvalidJar.html0000644000175000002070000000340613441742745034246 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025260 xustar0030 mtime=1552401893.114832667 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/srcs/0000755000175000002070000000000013441742745026145 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/srcs/PaxHeaders.7406/Valid.java0000644000000000000000000000013213441742745027237 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletReadsInvalidJar/srcs/Valid.java0000644000175000002070000000406413441742745030053 0ustar00jvanekmock00000000000000import java.applet.Applet; /* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class Valid extends Applet { private static class Killer extends Thread { @Override public void run() { try { int n = 2000; Thread.sleep(n); System.exit(0); } catch (Exception ex) { } } } @Override public void init() { new Killer().start(); System.out.println("Program Executed Correctly."); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AppletBaseURLTest0000644000000000000000000000013013441742745023377 xustar0028 mtime=1552401893.1468326 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/0000755000175000002070000000000013441742745024266 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/PaxHeaders.7406/testcases0000644000000000000000000000013013441742745025375 xustar0028 mtime=1552401893.1468326 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/testcases/0000755000175000002070000000000013441742745026264 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/testcases/PaxHeaders.7406/AppletBaseURLTe0000644000000000000000000000013013441742745030271 xustar0028 mtime=1552401893.1468326 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/testcases/AppletBaseURLTest.java0000644000175000002070000000734413441742745032402 0ustar00jvanekmock00000000000000/* AppletBaseURLTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; public class AppletBaseURLTest extends BrowserTest{ private void evaluateApplet(ProcessResult pr, String baseName) { String codebaseRule = "(?s).*Codebase is http://localhost:[0-9]{5}/ for this applet(?s).*"; Assert.assertTrue("AppletBaseURL stdout should match" + codebaseRule + " but didn't", pr.stdout.matches(codebaseRule)); String documentbaseRule = "(?s).*Document base is http://localhost:[0-9]{5}/" + baseName + " for this applet(?s).*"; Assert.assertTrue("AppletBaseURL stdout should match" + documentbaseRule + " but didn't", pr.stdout.matches(documentbaseRule)); } @NeedsDisplay @Test public void AppletWebstartBaseURLTest() throws Exception { ProcessResult pr = server.executeJavaws("/AppletBaseURLTest.jnlp"); evaluateApplet(pr, ""); Assert.assertFalse(pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR855") @NeedsDisplay @Test @TestInBrowsers(testIn={Browsers.one}) public void AppletInFirefoxTest() throws Exception { ProcessResult pr = server.executeBrowser("/AppletBaseURLTest.html", AutoClose.CLOSE_ON_BOTH); pr.process.destroy(); evaluateApplet(pr, "AppletBaseURLTest.html"); Assert.assertTrue(pr.wasTerminated); } @Bug(id="PR855") @NeedsDisplay @Test @TestInBrowsers(testIn={Browsers.one}) public void AppletWithJNLPHrefTest() throws Exception { ProcessResult pr = server.executeBrowser("/AppletJNLPHrefBaseURLTest.html", AutoClose.CLOSE_ON_BOTH); pr.process.destroy(); evaluateApplet(pr, "AppletJNLPHrefBaseURLTest.html"); Assert.assertTrue(pr.wasTerminated); } } icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025413 xustar0030 mtime=1552401893.111832673 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/resources/0000755000175000002070000000000013441742745026300 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/resources/PaxHeaders.7406/AppletBaseURLTe0000644000000000000000000000013213441742745030307 xustar0030 mtime=1552401893.111832673 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/resources/AppletBaseURLTest.jnlp0000644000175000002070000000435113441742745032433 0ustar00jvanekmock00000000000000 AppletBaseURL IcedTea AppletBaseURL icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/resources/PaxHeaders.7406/AppletJNLPHrefB0000644000000000000000000000013213441742745030233 xustar0030 mtime=1552401893.104832688 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/resources/AppletJNLPHrefBaseURLTest.html0000644000175000002070000000344713441742745033732 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/resources/PaxHeaders.7406/AppletBaseURLTe0000644000000000000000000000013213441742745030307 xustar0030 mtime=1552401893.111832673 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/resources/AppletBaseURLTest.html0000644000175000002070000000350613441742745032435 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024353 xustar0030 mtime=1552401893.114832667 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/srcs/0000755000175000002070000000000013441742745025240 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/srcs/PaxHeaders.7406/AppletBaseURL.java0000644000000000000000000000013213441742745027676 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AppletBaseURLTest/srcs/AppletBaseURL.java0000644000175000002070000000404713441742745030513 0ustar00jvanekmock00000000000000/* AppletBaseURL.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class AppletBaseURL extends Applet { @Override public void init() { System.out.println("Document base is " + getDocumentBase() + " for this applet"); System.out.println("Codebase is " + getCodeBase() + " for this applet"); System.out.println("*** APPLET FINISHED ***"); // Exits JNLP-launched applets, throws exception on normal applet: System.exit(0); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AddShutdownHook0000644000000000000000000000013213441742745023203 xustar0030 mtime=1552401893.113832669 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/0000755000175000002070000000000013441742745024070 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024155 xustar0030 mtime=1552401893.104832688 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/srcs/0000755000175000002070000000000013441742745025042 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/srcs/PaxHeaders.7406/AddShutdownHook.java0000644000000000000000000000013213441742745030142 xustar0030 mtime=1552401893.104832688 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/srcs/AddShutdownHook.java0000644000175000002070000000405413441742745030755 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AddShutdownHook.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class AddShutdownHook extends Applet { public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { // no op } }); } @Override public void start() { main(null); System.err.println("WRONG - ShutdownHook was probably added"); } } icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025215 xustar0030 mtime=1552401893.111832673 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/resources/0000755000175000002070000000000013441742745026102 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/resources/PaxHeaders.7406/AddShutdownHook_w0000644000000000000000000000013213441742745030610 xustar0030 mtime=1552401893.111832673 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook_wrong.html0000644000175000002070000000343613441742745033257 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/resources/PaxHeaders.7406/AddShutdownHook.j0000644000000000000000000000013213441742745030512 xustar0030 mtime=1552401893.111832673 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook.jnlp0000644000175000002070000000060613441742745032036 0ustar00jvanekmock00000000000000 test adding shutdown hooks IcedTea icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/resources/PaxHeaders.7406/AddShutdownHook.h0000644000000000000000000000013213441742745030510 xustar0030 mtime=1552401893.108832679 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook.html0000644000175000002070000000343313441742745032040 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025201 xustar0030 mtime=1552401893.145832603 30 atime=1552410887.107183457 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/testcases/0000755000175000002070000000000013441742745026066 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/testcases/PaxHeaders.7406/HangFirefoxTests.0000644000000000000000000000013213441742745030502 xustar0030 mtime=1552401893.145832603 30 atime=1552402157.272253402 30 ctime=1552410887.083183513 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/testcases/HangFirefoxTests.java0000644000175000002070000001245013441742745032156 0ustar00jvanekmock00000000000000/* AddShutdownHookTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import org.junit.Assert; import org.junit.Test; /** If this test has failed, you may try the following to reproduce the problem more consistently: - private static final int MAX_WORKERS = MAX_PARALLEL_INITS * 4; - private static final int PRIORITY_WORKERS = MAX_PARALLEL_INITS * 2; + private static final int MAX_WORKERS = MAX_PARALLEL_INITS * 2; + private static final int PRIORITY_WORKERS = MAX_PARALLEL_INITS * 1; in PluginMessageConsumer.java */ public class HangFirefoxTests extends BrowserTest { String leString = "Could not initialize"; String startedString = "applet was started"; RulesFolowingClosingListener.ContainsRule leRule = new RulesFolowingClosingListener.ContainsRule(leString); RulesFolowingClosingListener.ContainsRule appleStartedRule = new RulesFolowingClosingListener.ContainsRule(startedString); @Test @TestInBrowsers(testIn = Browsers.firefox) public void HangFirefoxWithRuntimeExceptionTests() throws Exception { ProcessResult pr = server.executeBrowser("/AddShutdownHook.html", new RulesFolowingClosingListener(appleStartedRule), new CountingClosingListener() { private boolean launched = false; @Override protected boolean isAlowedToFinish(String content) { if (AddShutdownHookTest.mr.evaluate(content) && !launched) { launched = true; try { server.executeBrowser("/appletAutoTests2.html", null, (CountingClosingListener) null); } catch (Exception ex) { throw new RuntimeException(ex); } } return false; } }); Assert.assertTrue("stderr " + AddShutdownHookTest.mr.toPassingString(), AddShutdownHookTest.mr.evaluate(pr.stderr)); Assert.assertTrue("stdout " + appleStartedRule.toPassingString(), appleStartedRule.evaluate(pr.stdout)); } @Test @TestInBrowsers(testIn = Browsers.firefox) public void HangFirefoxWithLaunchException() throws Exception { ProcessResult pr = server.executeBrowser("/AddShutdownHook_wrong.html", new RulesFolowingClosingListener(appleStartedRule), new CountingClosingListener() { private boolean launched = false; @Override protected boolean isAlowedToFinish(String content) { if (leRule.evaluate(content) && !launched) { launched = true; try { server.executeBrowser("/appletAutoTests2.html", null, (CountingClosingListener) null); } catch (Exception ex) { throw new RuntimeException(ex); } } return false; } }); Assert.assertTrue("stderr " + leRule.toPassingString(), leRule.evaluate(pr.stderr)); Assert.assertTrue("stdout " + appleStartedRule.toPassingString(), appleStartedRule.evaluate(pr.stdout)); } @Test @TestInBrowsers(testIn = Browsers.one) public void TestAddShutdownHookWrong() throws Exception { ProcessResult pr = server.executeBrowser("/AddShutdownHook_wrong.html", null, new RulesFolowingClosingListener(leRule)); Assert.assertTrue("stderr " + leRule.toPassingString(), leRule.evaluate(pr.stderr)); } } icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/testcases/PaxHeaders.7406/AddShutdownHookTe0000644000000000000000000000013213441742745030537 xustar0030 mtime=1552401893.113832669 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AddShutdownHook/testcases/AddShutdownHookTest.java0000644000175000002070000000774513441742745032653 0ustar00jvanekmock00000000000000/* AddShutdownHookTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import org.junit.Assert; import org.junit.Test; public class AddShutdownHookTest extends BrowserTest { public static final String s = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.lang.RuntimePermission.{0,5}" + "shutdownHooks" + ".*"; public static final String cnfString = "ClassNotFoundException"; public static final String confirmFailure = "WRONG - ShutdownHook was probably added"; public static final RulesFolowingClosingListener.MatchesRule mr = new RulesFolowingClosingListener.MatchesRule(s); public static final RulesFolowingClosingListener.ContainsRule cnf = new RulesFolowingClosingListener.ContainsRule(cnfString); public static final RulesFolowingClosingListener.ContainsRule cf = new RulesFolowingClosingListener.ContainsRule(confirmFailure); public static final RulesFolowingClosingListener rfc = new RulesFolowingClosingListener(mr); @Test public void AddShutdownHookTestLunch1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/AddShutdownHook.jnlp"); Assert.assertTrue("stderr " + mr.toPassingString(), mr.evaluate(pr.stderr)); Assert.assertFalse("stderr " + cnf.toFailingString(), cnf.evaluate(pr.stderr)); Assert.assertFalse("AddShutdownHookTestLunch1 should not be terminated, but was", pr.wasTerminated); Assert.assertFalse("stderr " + cf.toFailingString(), cf.evaluate(pr.stderr)); Assert.assertEquals((Integer) 1, pr.returnValue); } @Test @TestInBrowsers(testIn = Browsers.one) public void AddShutdownHookApplet() throws Exception { ProcessResult pr = server.executeBrowser("/AddShutdownHook.html", null, rfc); if (server.getCurrentBrowsers() == Browsers.firefox) { //lookslike only firefox is able to recieve this Assert.assertTrue("stderr " + mr.toPassingString(), mr.evaluate(pr.stderr)); } Assert.assertFalse("stderr " + cnf.toFailingString(), cnf.evaluate(pr.stderr)); Assert.assertFalse("stderr " + cf.toFailingString(), cf.evaluate(pr.stderr)); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AccessClassInPackage0000644000000000000000000000013213441742745024070 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/0000755000175000002070000000000013441742745024755 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025042 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/srcs/0000755000175000002070000000000013441742745025727 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/srcs/PaxHeaders.7406/AccessClassInPack0000644000000000000000000000013213441742745030317 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/srcs/AccessClassInPackage.java0000644000175000002070000000350113441742745032523 0ustar00jvanekmock00000000000000/* AccessClassInPackage.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class AccessClassInPackage { public static void main(String[] args) throws Exception{ Class.forName(args[0]); System.out.println("Class was obtained: "+ args[0]); } } icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026102 xustar0030 mtime=1552401893.144832604 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/0000755000175000002070000000000013441742745026767 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/PaxHeaders.7406/AccessClassI0000644000000000000000000000031613441742745030406 xustar00116 path=icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/AccessClassInPackageJAVAXJNLP.jnlp 30 mtime=1552401893.110832675 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/AccessClassInPackageJAVAXJNL0000644000175000002070000000434413441742745034007 0ustar00jvanekmock00000000000000 Test accessClassInPackage IcedTea testing access to some javax.jnlp.* package javax.jnlp.ServiceManager icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/PaxHeaders.7406/AccessClassI0000644000000000000000000000031313441742745030403 xustar00113 path=icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/AccessClassInPackageSUNSEC.jnlp 30 mtime=1552401893.144832604 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/AccessClassInPackageSUNSEC.j0000644000175000002070000000436013441742745034020 0ustar00jvanekmock00000000000000 Test accessClassInPackage IcedTea testing access to sun.security.* package sun.security.internal.spec.TlsKeyMaterialSpec icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/PaxHeaders.7406/AccessClassI0000644000000000000000000000031113441742745030401 xustar00112 path=icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/AccessClassInPackageNETSF.jnlp 29 mtime=1552401893.10383269 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/AccessClassInPackageNETSF.jn0000644000175000002070000000434213441742745034055 0ustar00jvanekmock00000000000000 Test accessClassInPackage IcedTea testing access to net.sourceforge.* package net.sourceforge.jnlp.Parser icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/PaxHeaders.7406/AccessClassI0000644000000000000000000000031113441742745030401 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/AccessClassInPackageSELF.jnlp 30 mtime=1552401893.113832669 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/resources/AccessClassInPackageSELF.jnl0000644000175000002070000000433213441742745034102 0ustar00jvanekmock00000000000000 Test accessClassInPackage IcedTea testing aaccess to package's internal class AccessClassInPackage icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026066 xustar0030 mtime=1552401893.105832685 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/testcases/0000755000175000002070000000000013441742745026753 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/testcases/PaxHeaders.7406/AccessClassI0000644000000000000000000000031113441742745030365 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/testcases/AccessClassInPackageTest.java 30 mtime=1552401893.105832685 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/AccessClassInPackage/testcases/AccessClassInPackageTest.jav0000644000175000002070000001511013441742745034245 0ustar00jvanekmock00000000000000/* AccessClassInPackageTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class AccessClassInPackageTest { private static ServerAccess server = new ServerAccess(); private String[] files = { "AccessClassInPackageJAVAXJNLP.jnlp", "AccessClassInPackageSELF.jnlp", "AccessClassInPackageNETSF.jnlp", "AccessClassInPackageSUNSEC.jnlp" }; private String[] filesSigned = { "AccessClassInPackageSignedJAVAXJNLP.jnlp", "AccessClassInPackageSignedSELF.jnlp", "AccessClassInPackageSignedNETSF.jnlp", "AccessClassInPackageSignedSUNSEC.jnlp" }; private String[] badExceptions = { "accessClassInPackage.javax.jnlp.ServiceManager", "accessClassInPackage.AccessClassInPackage", "accessClassInPackage.net.sourceforge.jnlp", "accessClassInPackage.sun.security.internal.spec" }; private String[] pass = { "javax.jnlp.ServiceManager", "AccessClassInPackage", "net.sourceforge.jnlp.Parser", "sun.security.internal.spec.TlsKeyMaterialSpec" }; private static final List xta = Arrays.asList(new String[]{"-Xtrustall"}); private void testShouldFail(ProcessResult pr, String s) { String c = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.lang.RuntimePermission.{0,5}" + s + ".*"; Assert.assertTrue("stderr should match `" + c + "`, but didn't ", pr.stderr.matches(c)); } private void testShouldNOTFail(ProcessResult pr, String s) { String c = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.lang.RuntimePermission.{0,5}" + s + ".*"; Assert.assertFalse("stderr should NOT match `" + c + "`, but did ", pr.stderr.matches(c)); } private void commonPitfall(ProcessResult pr) { commonPitfall(pr, 0); } private void commonPitfall(ProcessResult pr, int i) { String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("AccessClassInPackageTestLunch1 should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) i, pr.returnValue); } private void testShouldPass(ProcessResult pr, String s) { String c = "Class was obtained: " + s; Assert.assertTrue("stdout should contains `" + c + "`, but didn't ", pr.stdout.contains(c)); } private void testShouldNOTPass(ProcessResult pr, String s) { String c = "Class was obtained: " + s; Assert.assertFalse("stdout should not contains `" + c + "`, but did ", pr.stdout.contains(c)); } @Test public void AccessClassInPackageJAVAXJNLP() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/" + files[0]); commonPitfall(pr); testShouldPass(pr, pass[0]); testShouldNOTFail(pr, badExceptions[0]); } @Test public void AccessClassInPackageSELF() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/" + files[1]); commonPitfall(pr); testShouldPass(pr, pass[1]); testShouldNOTFail(pr, badExceptions[1]); } @Test public void AccessClassInPackageNETSF() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/" + files[2]); commonPitfall(pr, 1); testShouldFail(pr, badExceptions[2]); testShouldNOTPass(pr, pass[2]); } @Test public void AccessClassInPackageSUNSEC() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/" + files[3]); commonPitfall(pr, 1); testShouldFail(pr, badExceptions[3]); testShouldNOTPass(pr, pass[3]); } //now signed vaiants @Test public void AccessClassInPackageSignedJAVAXJNLP() throws Exception { ProcessResult pr = server.executeJavawsHeadless(xta, "/" + filesSigned[0]); commonPitfall(pr); testShouldPass(pr, pass[0]); testShouldNOTFail(pr, badExceptions[0]); } @Test public void AccessClassInPackageSignedSELF() throws Exception { ProcessResult pr = server.executeJavawsHeadless(xta, "/" + filesSigned[1]); commonPitfall(pr); testShouldPass(pr, pass[1]); testShouldNOTFail(pr, badExceptions[1]); } @Test public void AccessClassInPackageSignedNETSF() throws Exception { ProcessResult pr = server.executeJavawsHeadless(xta, "/" + filesSigned[2]); commonPitfall(pr); testShouldPass(pr, pass[2]); testShouldNOTFail(pr, badExceptions[2]); } @Test public void AccessClassInPackageSignedSUNSEC() throws Exception { ProcessResult pr = server.executeJavawsHeadless(xta, "/" + filesSigned[3]); commonPitfall(pr); testShouldPass(pr, pass[3]); testShouldNOTFail(pr, badExceptions[3]); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/simpletest20000644000000000000000000000013213441742745022411 xustar0030 mtime=1552401893.163832565 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/simpletest2/0000755000175000002070000000000013441742745023276 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/simpletest2/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023363 xustar0030 mtime=1552401893.147832598 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/simpletest2/srcs/0000755000175000002070000000000013441742745024250 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/simpletest2/srcs/PaxHeaders.7406/SimpleTest2.java0000644000000000000000000000013213441742745026456 xustar0030 mtime=1552401893.147832598 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/simpletest2/srcs/SimpleTest2.java0000644000175000002070000000430013441742745027263 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* SimpleTest2.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SimpleTest2 extends Applet{ public static void main(String[] args) { throw new RuntimeException("Correct exception"); } @Override public void init() { System.out.println("applet was initialised"); } @Override public void start() { System.out.println("applet was started"); main(null); } @Override public void stop() { System.out.println("applet was stopped"); } @Override public void destroy() { System.out.println("applet will be destroyed"); } } icedtea-web-1.8/tests/reproducers/simple/simpletest2/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024423 xustar0030 mtime=1552401893.163832565 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/simpletest2/resources/0000755000175000002070000000000013441742745025310 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/simpletest2/resources/PaxHeaders.7406/simpletest2.jnlp0000644000000000000000000000013213441742745027640 xustar0030 mtime=1552401893.163832565 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/simpletest2/resources/simpletest2.jnlp0000644000175000002070000000413413441742745030452 0ustar00jvanekmock00000000000000 simpletest2 IcedTea simpletest2 icedtea-web-1.8/tests/reproducers/simple/simpletest2/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024407 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/simpletest2/testcases/0000755000175000002070000000000013441742745025274 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/simpletest2/testcases/PaxHeaders.7406/SimpleTest2Test.java0000644000000000000000000000013213441742745030342 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/simpletest2/testcases/SimpleTest2Test.java0000644000175000002070000000456013441742745031157 0ustar00jvanekmock00000000000000/* SimpleTest2Test.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class SimpleTest2Test { private static ServerAccess server = new ServerAccess(); @Test public void testSimpletest2lunchException() throws Exception { ProcessResult pr=server.executeJavawsHeadless(null,"/simpletest2.jnlp"); String s="Correct exception"; Assert.assertTrue("stderr should contains "+s+" but didn't",pr.stderr.contains(s)); String ss="Exception"; Assert.assertTrue("stderr should contains "+ss+" but did not",pr.stderr.contains(ss)); Assert.assertFalse("testSimpletest2lunchException should not be terminated, but was",pr.wasTerminated); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/VersionedJar__V10000644000000000000000000000013213441742745023236 xustar0030 mtime=1552401893.136832621 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/0000755000175000002070000000000013441742745024123 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024210 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/srcs/0000755000175000002070000000000013441742745025075 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/srcs/PaxHeaders.7406/VersionedJar.java0000644000000000000000000000013213441742745027523 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/srcs/VersionedJar.java0000644000175000002070000000351513441742745030337 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.*; import java.awt.*; import java.lang.reflect.Array; import java.lang.reflect.Field; public class VersionedJar { static public void main(String[] args) { System.out.println("Versioned jar was accessed."); } }icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025250 xustar0030 mtime=1552401893.145832603 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/resources/0000755000175000002070000000000013441742745026135 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/resources/PaxHeaders.7406/VersionedJarDisa0000644000000000000000000000013213441742745030444 xustar0030 mtime=1552401893.145832603 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/resources/VersionedJarDisabled.jnlp0000644000175000002070000000403313441742745033045 0ustar00jvanekmock00000000000000 Test versioned jars IcedTea icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/resources/PaxHeaders.7406/VersionedJarEnab0000644000000000000000000000013213441742745030431 xustar0030 mtime=1552401893.130832634 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/resources/VersionedJarEnabled.jnlp0000644000175000002070000000404613441742745032674 0ustar00jvanekmock00000000000000 Test replacing security manager IcedTea icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025234 xustar0030 mtime=1552401893.136832621 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/testcases/0000755000175000002070000000000013441742745026121 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/testcases/PaxHeaders.7406/VersionedJarTest0000644000000000000000000000013213441742745030467 xustar0030 mtime=1552401893.136832621 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/VersionedJar__V1/testcases/VersionedJarTest.java0000644000175000002070000000631713441742745032226 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class VersionedJarTest { private static final ServerAccess server = new ServerAccess(); private static final String VERSIONED = "Versioned jar was accessed."; private static final String FAILURE = "net.sourceforge.jnlp.LaunchException"; @BeforeClass public static void clearCache() throws Exception{ //to speedup individual methods server.executeJavawsClearCache(); } @Test public void testDisabledVersionParameter() throws Exception { //if testEnabledVersionParameter is run before this onne, then it fails server.executeJavawsClearCache(); //the versioning is realted only to downloading of resources, so afaik this behaviour is correct ProcessResult pr = server.executeJavawsHeadless("/VersionedJarDisabled.jnlp"); Assert.assertFalse("Stdout should NOT contain '" + VERSIONED + "', but did.", pr.stdout.contains(VERSIONED)); Assert.assertTrue("Stderr should contain '" +FAILURE + "', but did not.", pr.stderr.contains(FAILURE)); } @Test public void testEnabledVersionParameter() throws Exception { server.executeJavawsClearCache(); ProcessResult pr = server.executeJavawsHeadless("/VersionedJarEnabled.jnlp"); Assert.assertTrue("Stdout should contain '" + VERSIONED + "', but did not.", pr.stdout.contains(VERSIONED)); Assert.assertFalse("Stderr should NOT contain '" +FAILURE + "', but did.", pr.stderr.contains(FAILURE)); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/UnicodeLineBreak0000644000000000000000000000013213441742745023301 xustar0030 mtime=1552401893.135832623 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/0000755000175000002070000000000013441742745024166 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745024252 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/srcs/0000755000175000002070000000000013441742745025140 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/srcs/PaxHeaders.7406/UnicodeLineBreak.java0000644000000000000000000000013113441742745030335 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/srcs/UnicodeLineBreak.java0000644000175000002070000000343413441742745031152 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class UnicodeLineBreak extends Applet { @Override public void init() { System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025313 xustar0030 mtime=1552401893.129832636 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/resources/0000755000175000002070000000000013441742745026200 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/resources/PaxHeaders.7406/UnicodeLineBreak0000644000000000000000000000013213441742745030456 xustar0030 mtime=1552401893.129832636 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/resources/UnicodeLineBreak.html0000644000175000002070000000403413441742745032232 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025277 xustar0030 mtime=1552401893.135832623 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/testcases/0000755000175000002070000000000013441742745026164 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/testcases/PaxHeaders.7406/UnicodeLineBreak0000644000000000000000000000013213441742745030442 xustar0030 mtime=1552401893.135832623 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/UnicodeLineBreak/testcases/UnicodeLineBreakTests.java0000644000175000002070000001506413441742745033223 0ustar00jvanekmock00000000000000/* AppletTestTests.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import static org.junit.Assert.assertTrue; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.util.FileUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class UnicodeLineBreakTests extends BrowserTest { private static DeploymentPropertiesModifier dp; private static File backup; @BeforeClass public static void setSecurity() throws IOException{ dp = new DeploymentPropertiesModifier(); dp.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ASK_UNSIGNED.name()); } @BeforeClass public static void backupAppTrust() throws IOException{ backup = File.createTempFile("unicodeNewLIne", "itwReproducers"); backup.deleteOnExit(); FirefoxProfilesOperator.copyFile(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile(), backup); } @AfterClass public static void restoreAppTrust() throws IOException{ FirefoxProfilesOperator.copyFile(backup, PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); } @AfterClass public static void resetSecurity() throws IOException{ dp.restoreProperties(); } //headless dialogues now works only for javaws. press ok, otherwise first assert fails //@Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void unicodeLineBreakTest() throws Exception { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file to examine later ProcessResult pr = server.executeBrowser("/UnicodeLineBreak.html", AutoClose.CLOSE_ON_CORRECT_END); assertTrue(pr.stdout.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)); String s = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); String[] ss = s.split("\n"); for (String string : ss) { Assert.assertFalse(string.contains("\\Qhttp://evil-site/evil.page/\\E \\Qhttp://evil-site/\\E malware.jar")); } } //javaws -html is imune to this trick when tagsoup is used @Test @NeedsDisplay public void unicodeLineBreakTestJavaWsHtmlTagsupProbablyOn() throws Exception { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file to examine later //tagsoup remove the new line. So here we must really test the startWith, which may be fragile ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option,OptionsDefinitions.OPTIONS.HTML.option}), server.getUrl("/UnicodeLineBreak.html"), new AutoOkClosingListener(), null, null); pw.setWriter("YES\n"); ProcessResult pr = pw.execute(); assertTrue(pr.stdout.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)); String s = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); String[] ss = s.split("\n"); for (String string : ss) { Assert.assertFalse(string.startsWith("A 1432197956873 \\Qhttp://evil-site/evil.page/\\E \\Qhttp://evil-site/\\E malware.jar")); } } @Test @NeedsDisplay public void unicodeLineBreakTestJavaWsHtmlTagsupForcedOff() throws Exception { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file to examine later ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.XML.option, OptionsDefinitions.OPTIONS.HEADLESS.option, OptionsDefinitions.OPTIONS.HTML.option}), server.getUrl("/UnicodeLineBreak.html"), new AutoOkClosingListener(), null, null); pw.setWriter("YES\n"); ProcessResult pr = pw.execute(); assertTrue(pr.stdout.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)); String s = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); String[] ss = s.split("\n"); for (String string : ss) { Assert.assertFalse(string.contains("\\Qhttp://evil-site/evil.page/\\E \\Qhttp://evil-site/\\E malware.jar")); } } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/Spaces can be everywhere0000644000000000000000000000013213441742745024613 xustar0030 mtime=1552401893.138832617 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/0000755000175000002070000000000013441742745025500 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026611 xustar0030 mtime=1552401893.138832617 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/testcases/0000755000175000002070000000000013441742745027476 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/testcases/PaxHeaders.7406/SpacesCa0000644000000000000000000000031713441742745030300 xustar00117 path=icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/testcases/SpacesCanBeEverywhereTests.java 30 mtime=1552401893.138832617 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/testcases/SpacesCanBeEverywhereTes0000644000175000002070000002754713441742745034271 0ustar00jvanekmock00000000000000/* SpacesCanBeEverywhereTests.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.ContentReaderListener; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import org.junit.Assert; import org.junit.Test; @Bug(id={"http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2011-October/016127.html","PR804","PR811"}) public class SpacesCanBeEverywhereTests extends BrowserTest { public static final String s = "Spaces can be everywhere.jsr was launched correctly"; @Bug(id="PR811") @Test @NeedsDisplay public void SpacesCanBeEverywhereLocalAppletTestsJnlp2() throws Exception { List commands=new ArrayList(1); commands.add(server.getJavawsLocation()); commands.add(server.getDir()+"/NotOnly spaces can kill Ф›ХЁФХ™ХО too.jnlp"); /* Change of dir is cousing the Exception bellow * ServerAccess.ProcessResult pr = ServerAccess.executeProcess(commands,server.getDir()); * No X11 DISPLAY variable was set, but this program performed an operation which requires it. * at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:173) * at java.awt.Window.(Window.java:476) * at java.awt.Frame.(Frame.java:419) * at java.awt.Frame.(Frame.java:384) * at javax.swing.SwingUtilities$SharedOwnerFrame.(SwingUtilities.java:1754) * at javax.swing.SwingUtilities.getSharedOwnerFrame(SwingUtilities.java:1831) * at javax.swing.JWindow.(JWindow.java:185) * at javax.swing.JWindow.(JWindow.java:137) * at net.sourceforge.jnlp.runtime.JNLPSecurityManager.(JNLPSecurityManager.java:121) * at net.sourceforge.jnlp.runtime.JNLPRuntime.initialize(JNLPRuntime.java:202) * at net.sourceforge.jnlp.runtime.Boot.run(Boot.java:177) * at net.sourceforge.jnlp.runtime.Boot.run(Boot.java:51) * at java.security.AccessController.doPrivileged(Native Method) * at net.sourceforge.jnlp.runtime.Boot.main(Boot.java:168) * * Thats why there is absolute path to the file. * * This is also why SpacesCanBeEverywhereLocalTests1Signed is passing - * it is in headless mode. This can be considered as bug, but because it is * only on ocal files, and probably only from test run - it can be ignored */ ProcessResult pr = ServerAccess.executeProcess(commands); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test @NeedsDisplay public void SpacesCanBeEverywhereRemoteAppletTestsJnlp2() throws Exception { ProcessResult pr = server.executeJavaws("/NotOnly%20spaces%20can%20kill%20%C4%9B%C5%A1%C4%8D%C5%99%C5%BE%20too.jnlp"); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); Assert.assertFalse("should NOT be terminated, but was", pr.wasTerminated); } @Bug(id="PR811") @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.all}) public void SpacesCanBeEverywhereRemoteAppletTestsHtml2() throws Exception { ProcessResult pr = server.executeBrowser("/spaces+applet+Tests.html", Arrays.asList(new ContentReaderListener[] {new StringBasedClosingListener(s)}), null); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); Assert.assertTrue("should be terminated, but was not", pr.wasTerminated); } @Bug(id={"PR811","http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2011-October/016144.html"}) @Test public void SpacesCanBeEverywhereRemoteTests1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/Spaces%20can%20be%20everywhere1.jnlp"); String s = "Good simple javaws exapmle"; Assert.assertTrue("stdout should contains `" + s + "`, but did not", pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test public void SpacesCanBeEverywhereRemoteTests2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/Spaces%20can%20be%20everywhere2.jnlp"); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test public void SpacesCanBeEverywhereRemoteTests2_withQuery1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/Spaces%20can%20be%20everywhere2.jnlp?test=10"); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test public void SpacesCanBeEverywhereRemoteTests2_withQuery2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/Spaces%20can%20be%20everywhere2.jnlp?test%3D10"); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test public void SpacesCanBeEverywhereRemoteTests3() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/SpacesCanBeEverywhere1.jnlp"); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR804") @Test public void SpacesCanBeEverywhereLocalTests1() throws Exception { List commands=new ArrayList(4); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add("Spaces can be everywhere1.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands,server.getDir()); String s = "Good simple javaws exapmle"; Assert.assertTrue("stdout should contains `" + s + "`, but did not", pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR804") @Test public void SpacesCanBeEverywhereLocalTests2() throws Exception { List commands=new ArrayList(4); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add("Spaces can be everywhere2.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands,server.getDir()); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR804") @Test public void SpacesCanBeEverywhereLocalTests4() throws Exception { List commands=new ArrayList(4); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(server.getDir()+"/Spaces can be everywhere2.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR804") @Test public void SpacesCanBeEverywhereLocalTests3() throws Exception { List commands=new ArrayList(4); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add("SpacesCanBeEverywhere1.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands,server.getDir()); Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026625 xustar0030 mtime=1552401893.161832569 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/0000755000175000002070000000000013441742745027512 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/PaxHeaders.7406/spaces a0000644000000000000000000000013213441742745030304 xustar0030 mtime=1552401893.131832631 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/spaces applet Tests.html0000644000175000002070000000344713441742745034217 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/PaxHeaders.7406/Spaces c0000644000000000000000000000031613441742745030252 xustar00116 path=icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/Spaces can be everywhere2.jnlp 30 mtime=1552401893.144832604 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/Spaces can be everywhere0000644000175000002070000000423513441742745034116 0ustar00jvanekmock00000000000000 Spaces can be everywhere2 IcedTea Spaces can be everywhere2 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/PaxHeaders.7406/Spaces c0000644000000000000000000000031613441742745030252 xustar00116 path=icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/Spaces can be everywhere1.jnlp 30 mtime=1552401893.161832569 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/Spaces can be everywhere0000644000175000002070000000420613441742745034114 0ustar00jvanekmock00000000000000 Spaces can be everywhere1 IcedTea Spaces can be everywhere1 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/PaxHeaders.7406/SpacesCa0000644000000000000000000000031313441742745030310 xustar00113 path=icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/SpacesCanBeEverywhere1.jnlp 30 mtime=1552401893.129832636 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/SpacesCanBeEverywhere1.j0000644000175000002070000000417613441742745034133 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/PaxHeaders.7406/NotOnly 0000644000000000000000000000033313441742745030272 xustar00129 path=icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/NotOnly spaces can kill Ф›ХЁФХ™ХО too.jnlp 30 mtime=1552401893.135832623 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/resources/NotOnly spaces can kill 0000644000175000002070000000452413441742745034001 0ustar00jvanekmock00000000000000 Spaces can be everywhere test with few more chars for encoding IcedTea AppletTest icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025565 xustar0030 mtime=1552401893.134832625 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/srcs/0000755000175000002070000000000013441742745026452 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/srcs/PaxHeaders.7406/SpacesCanBeEv0000644000000000000000000000013213441742745030167 xustar0030 mtime=1552401893.134832625 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/Spaces can be everywhere/srcs/SpacesCanBeEverywhere.java0000644000175000002070000000465413441742745033503 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* SpacesCanBeEverywhere.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SpacesCanBeEverywhere extends Applet{ public static void main(String[] args){ System.out.println("Spaces can be everywhere.jsr was launched correctly"); } private class Killer extends Thread { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { killer = new Killer(); } @Override public void start() { main(null); killer.start(); System.out.println("killer was started"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/ReplaceSecurityManager0000644000000000000000000000013213441742745024534 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/0000755000175000002070000000000013441742745025421 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026546 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/resources/0000755000175000002070000000000013441742745027433 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/resources/PaxHeaders.7406/ReplaceSec0000644000000000000000000000031113441742745030553 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/resources/ReplaceSecurityManager.jnlp 30 mtime=1552401893.141832611 30 atime=1552402157.272253402 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/resources/ReplaceSecurityManager.jnl0000644000175000002070000000376713441742745034553 0ustar00jvanekmock00000000000000 Test replacing security manager IcedTea icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025506 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/srcs/0000755000175000002070000000000013441742745026373 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/srcs/PaxHeaders.7406/ReplaceSecurity0000644000000000000000000000013213441742745030611 xustar0030 mtime=1552401893.124832646 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/srcs/ReplaceSecurityManager.java0000644000175000002070000000343313441742745033637 0ustar00jvanekmock00000000000000/* ReplaceSecurityManager.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class ReplaceSecurityManager { public static void main(String[] args) throws Exception{ System.setSecurityManager(null); } } icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026532 xustar0030 mtime=1552401893.126832642 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/testcases/0000755000175000002070000000000013441742745027417 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/testcases/PaxHeaders.7406/ReplaceSec0000644000000000000000000000031513441742745030543 xustar00115 path=icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/testcases/ReplaceSecurityManagerTest.java 30 mtime=1552401893.126832642 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReplaceSecurityManager/testcases/ReplaceSecurityManagerTest0000644000175000002070000000510313441742745034577 0ustar00jvanekmock00000000000000/* ReplaceSecurityManagerTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class ReplaceSecurityManagerTest { private static ServerAccess server = new ServerAccess(); @Test public void ReplaceSecurityManagerLunch1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/ReplaceSecurityManager.jnlp"); String s = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.lang.RuntimePermission.{0,5}" + "setSecurityManager" + ".*"; Assert.assertTrue("stderr should match "+s+" but didn't",pr.stderr.matches(s)); String cc="ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `"+cc+"`, but did",pr.stderr.contains(cc)); Assert.assertFalse("ReplaceSecurityManagerLunch1 should not be terminated, but was",pr.wasTerminated); Assert.assertEquals((Integer) 1, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/ReadProperties0000644000000000000000000000013113441742745023065 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReadProperties/0000755000175000002070000000000013441742745023753 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReadProperties/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745025063 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReadProperties/testcases/0000755000175000002070000000000013441742745025751 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReadProperties/testcases/PaxHeaders.7406/ReadPropertiesTest0000644000000000000000000000013113441742745030653 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReadProperties/testcases/ReadPropertiesTest.java0000644000175000002070000000634013441742745032407 0ustar00jvanekmock00000000000000/* ReadPropertiesTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class ReadPropertiesTest { private static ServerAccess server = new ServerAccess(); @Test public void ReadPropertiesLunch1() throws Exception { ProcessResult pr=server.executeJavawsHeadless(null,"/ReadProperties1.jnlp"); String s = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.util.PropertyPermission.{0,5}" + "user.name.{0,5}read" + ".*"; Assert.assertTrue("stderr should match "+s+" but didn't",pr.stderr.matches(s)); String cc="ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `"+cc+"`, but did",pr.stderr.contains(cc)); Assert.assertFalse("ReadPropertiesLunch1 should not be terminated, but was",pr.wasTerminated); Assert.assertEquals((Integer)1, pr.returnValue); } @Test public void ReadPropertiesLunch2() throws Exception { ProcessResult pr=server.executeJavawsHeadless(null,"/ReadProperties2.jnlp"); String s = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.util.PropertyPermission.{0,5}" + "user.home.{0,5}read" + ".*"; Assert.assertTrue("stderr should match "+s+" but didn't",pr.stderr.matches(s)); String cc="ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `"+cc+"`, but did",pr.stderr.contains(cc)); Assert.assertFalse("ReadPropertiesLunch2 should not be terminated, but was",pr.wasTerminated); Assert.assertEquals((Integer)1, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/simple/ReadProperties/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025100 xustar0030 mtime=1552401893.126832642 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReadProperties/resources/0000755000175000002070000000000013441742745025765 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReadProperties/resources/PaxHeaders.7406/ReadProperties1.jn0000644000000000000000000000013213441742745030517 xustar0030 mtime=1552401893.124832646 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReadProperties/resources/ReadProperties1.jnlp0000644000175000002070000000405513441742745031667 0ustar00jvanekmock00000000000000 read properties using System.getenv() IcedTea user.name icedtea-web-1.8/tests/reproducers/simple/ReadProperties/resources/PaxHeaders.7406/ReadProperties2.jn0000644000000000000000000000013213441742745030520 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReadProperties/resources/ReadProperties2.jnlp0000644000175000002070000000405313441742745031666 0ustar00jvanekmock00000000000000 read properties using System.getenv() IcedTea user.home icedtea-web-1.8/tests/reproducers/simple/ReadProperties/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024040 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReadProperties/srcs/0000755000175000002070000000000013441742745024725 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReadProperties/srcs/PaxHeaders.7406/ReadProperties.java0000644000000000000000000000013213441742745027710 xustar0030 mtime=1552401893.130832634 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ReadProperties/srcs/ReadProperties.java0000644000175000002070000000351313441742745030522 0ustar00jvanekmock00000000000000/* ReadProperties.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class ReadProperties { /** *some system property is expected as arg[0], eg user.name or user.home */ public static void main(String[] args) { System.out.println(System.getProperty(args[0])); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/ManifestedJar20000644000000000000000000000013213441742745022734 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar2/0000755000175000002070000000000013441742745023621 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ManifestedJar2/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023706 xustar0030 mtime=1552401893.125832644 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar2/srcs/0000755000175000002070000000000013441742745024573 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ManifestedJar2/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013213441742745025046 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar2/srcs/META-INF/0000755000175000002070000000000013441742745025733 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ManifestedJar2/srcs/META-INF/PaxHeaders.7406/MANIFEST.MF0000644000000000000000000000013213441742745026555 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar2/srcs/META-INF/MANIFEST.MF0000644000175000002070000000012313441742745027361 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Main-Class: ManifestedJar2 Application-Name: ManifestedJar2 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar2/srcs/PaxHeaders.7406/ManifestedJar2.java0000644000000000000000000000013213441742745027424 xustar0030 mtime=1552401893.125832644 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/ManifestedJar2/srcs/ManifestedJar2.java0000644000175000002070000000350413441742745030236 0ustar00jvanekmock00000000000000/* AllStackTraces.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class ManifestedJar2 { public static void main(String[] args) { hello2(); } public static void hello2() { System.out.println("Hello from ManifestedJar2"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/LocalisedInformationElement0000644000000000000000000000013213441742745025555 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/0000755000175000002070000000000013441742745026442 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745027553 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/testcases/0000755000175000002070000000000013441742745030440 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/testcases/PaxHeaders.7406/Local0000644000000000000000000000032713441742745030613 xustar00125 path=icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/testcases/LocalisedInformationElementTest.java 30 mtime=1552401893.130832634 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/testcases/LocalisedInformationE0000644000175000002070000004207613441742745034606 0ustar00jvanekmock00000000000000/* LocalisedInformationElementTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import org.junit.Assert; import org.junit.Test; public class LocalisedInformationElementTest { private static ServerAccess server = new ServerAccess(); /** * this will prepare new set of varibales with wanted locale, which * can be then passed to subprocess * @param locale - locale to be set to LANG variable, eg cs_CZ.UTF-8 */ public static String[] getChangeLocalesForSubproces(String locale) { ServerAccess.logOutputReprint("Setting locales"); Map p = System.getenv(); Set> r = p.entrySet(); List> rr = new ArrayList>(r); Collections.sort(rr, new Comparator>() { @Override public int compare(Entry o1, Entry o2) { return o1.getKey().compareTo(o2.getKey()); } }); String[] l = new String[rr.size()]; int i = -1; for (Iterator> it = rr.iterator(); it.hasNext();) { i++; Entry entry = it.next(); String v = entry.getValue(); String s = entry.getKey() + "=" + v; //System.out.println(s); if (entry.getKey().equals("LANG")) { ServerAccess.logOutputReprint("was " + v); v = locale; ServerAccess.logOutputReprint("set " + v); } s = entry.getKey() + "=" + v; l[i] = s; } return l; } public static ProcessResult evaluateLocalisedInformationElementTest(String id, String[] variables, boolean verbose) throws Exception { ProcessResult pr = executeJavaws(verbose, variables, id); String s = "LocalisedInformationElement launched"; Assert.assertTrue(id + " stdout should contains " + s + " bud didn't", pr.stdout.contains(s)); String locMatch = "(?s).*default locale: \\w{2}.*"; Assert.assertTrue(id + " stdout should match " + locMatch + " bud didn't", pr.stdout.matches(locMatch)); return pr; } public static ProcessResult evaluateLocalisedInformationElementTestNotLaunched(String id, String[] variables, boolean verbose) throws Exception { ProcessResult pr = executeJavaws(verbose, variables, id); String s = "LocalisedInformationElement launched"; Assert.assertFalse(id + " stdout should not contains " + s + " bud didn't", pr.stdout.contains(s)); String ss = "xception"; Assert.assertTrue(id + " stderr should contains " + ss + " but didn't", pr.stderr.contains(ss)); String locMatch = "(?s).*default locale: \\w{2}.*"; Assert.assertFalse(id + " stdout should not match " + locMatch + " bud didn't", pr.stdout.matches(locMatch)); String sss = "MissingVendorException"; Assert.assertTrue(id + " stderr should contains " + sss + " but didn't", pr.stderr.contains(sss)); return pr; } private static ProcessResult executeJavaws(boolean verbose, String[] variables, String id) throws Exception { List oa = new ArrayList(1); if (verbose) { oa.add("-verbose"); } final ProcessResult pr; if (variables == null) { pr = server.executeJavawsHeadless(oa, "/" + id + ".jnlp"); } else { pr = server.executeJavawsHeadless(oa, "/" + id + ".jnlp", variables); } return pr; } //the description checkis disabled for all PR955, so it is representing just //PR955 issue. Tests with enable description check are introduced later private final boolean w1=false; @Test @Bug(id = "PR955") public void testLocalisedInformationElementLaunchWithLocalisedInformation1() throws Exception { String[] l = getChangeLocalesForSubproces("en_US.UTF-8"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement1", l, true); assertTiVeDe(pr, "localisedJnlp1.jnlp1", "IcedTea", "LocalisedInformationElement1.jnlp", w1); } //LANG variable do not 'accept' nationales without regions :( // @Test // @Bug(id = "PR955") // public void testLocalisedInformationElementLaunchWithLocalisedInformation2() throws Exception { // String[] l = getChangeLocalesForSubproces("cs"); // ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement1", l,true); // assertTiVeDe(pr,"LocalisedInformationElement1.jnlp po cesky","IcedTea CZ","Muj vlastni LocalisedInformationElement1.jnlp",w1); // } @Test @Bug(id = "PR955") public void testLocalisedInformationElementLaunchWithLocalisedInformation22() throws Exception { String[] l = getChangeLocalesForSubproces("cs_CZ"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement1", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp po cesky", "IcedTea CZ", "Muj vlastni LocalisedInformationElement1.jnlp", w1); } @Test @Bug(id = "PR955") public void testLocalisedInformationElementLaunchWithLocalisedInformation33_1() throws Exception { String[] l = getChangeLocalesForSubproces("fr_BE"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement1", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp la francee BE", "IcedTea", "La LocalisedInformationElement1.jnlp", w1); } // java is ignoring set encoding :( // @Test // @Bug(id = "PR955") // public void testLocalisedInformationElementLaunchWithLocalisedInformation33_2() throws Exception { // String[] l = getChangeLocalesForSubproces("fr_BE.iso88591"); // ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement1", l, true); // assertTiVeDe(pr, "LocalisedInformationElement1.jnlp la francee BE iso88591", "IcedTea", "La LocalisedInformationElement1.jnlp",false); // } @Test @Bug(id = "PR955") public void testLocalisedInformationElementLaunchWithLocalisedInformation33_() throws Exception { String[] l = getChangeLocalesForSubproces("fr_CH"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement1", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp la francee", "IcedTea", "La LocalisedInformationElement1.jnlp", w1); } @Test @Bug(id = "PR955") public void testLocalisedInformationElementLaunchWithLocalisedInformation1_withPieceMissing() throws Exception { String[] l = getChangeLocalesForSubproces("en_US.UTF-8"); ProcessResult pr = evaluateLocalisedInformationElementTestNotLaunched("LocalisedInformationElement2", l, true); } @Test @Bug(id = "PR955") public void testLocalisedInformationElementLaunchWithLocalisedInformation22_withPieceMissing() throws Exception { String[] l = getChangeLocalesForSubproces("cs_CZ"); ProcessResult pr = evaluateLocalisedInformationElementTestNotLaunched("LocalisedInformationElement2", l, true); } @Test @Bug(id = "PR955") public void testLocalisedInformationElementLaunchWithLocalisedInformation33_1_withPieceMissing() throws Exception { String[] l = getChangeLocalesForSubproces("fr_BE"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement2", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp la francee BE", "IcedTea", "La LocalisedInformationElement1.jnlp", w1); } @Test @Bug(id = "PR955") public void testLocalisedInformationElementLaunchWithLocalisedInformation33_withPieceMissing() throws Exception { String[] l = getChangeLocalesForSubproces("fr_CH"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement2", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp la francee", "IcedTea", "La LocalisedInformationElement1.jnlp", w1); } //thsoe 11 methods are jsut for printing of locales passed to javaws //so actually testing the LOCALE hack @Test public void printLocales() throws Exception { ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", null, false); } @Test public void printLocalesChanged1() throws Exception { String[] l = getChangeLocalesForSubproces("cs_CZ.UTF-8"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertTrue(pr.stdout.contains("cs_CZ")); } // the following four have acepted iso encoding, but not used it @Test public void printLocalesChanged2() throws Exception { String[] l = getChangeLocalesForSubproces("en_AU.ISO-8859-1"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertTrue(pr.stdout.contains("en_AU")); } @Test public void printLocalesChanged22() throws Exception { String[] l = getChangeLocalesForSubproces("en_AU.ISO88591"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertTrue(pr.stdout.contains("en_AU")); } @Test public void printLocalesChanged2222() throws Exception { String[] l = getChangeLocalesForSubproces("en_AU.iso-8859-1"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertTrue(pr.stdout.contains("en_AU")); } @Test public void printLocalesChanged3() throws Exception { String[] l = getChangeLocalesForSubproces("en_AU.UTF-8"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertTrue(pr.stdout.contains("en_AU")); } // the following five have NOTacepted iso encoding at all @Test public void printLocalesChanged2_X() throws Exception { String[] l = getChangeLocalesForSubproces("en_AU.ISO-8859-2"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertFalse(pr.stdout.contains("en_AU")); } @Test public void printLocalesChanged22_X() throws Exception { String[] l = getChangeLocalesForSubproces("en_AU.ISO88592"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertFalse(pr.stdout.contains("en_AU")); } @Test public void printLocalesChanged2222_X() throws Exception { String[] l = getChangeLocalesForSubproces("en_AU.iso-8859-2"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertFalse(pr.stdout.contains("en_AU")); } @Test public void printLocalesChanged3_X() throws Exception { String[] l = getChangeLocalesForSubproces("en_AU.UTF-16"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertFalse(pr.stdout.contains("en_AU")); } @Test public void printLocalesChanged4_X() throws Exception { String[] l = getChangeLocalesForSubproces("en_AU.jklukl56489jkyk"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement_noLoc", l, false); Assert.assertFalse(pr.stdout.contains("en_AU")); } private static final String DEFAULT_HOMEPAGE = "http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"; public static void assertTiVeDe(ProcessResult pr, String title, String vendor, String description, boolean descTests) { assertTiHpVeDe(pr, title, DEFAULT_HOMEPAGE, vendor, description, descTests); } public static void assertTiHpVeDe(ProcessResult pr, String title, String homepage, String vendor, String description, boolean descTests) { Assert.assertTrue("call shuld evaluate homepage as: " + homepage + " but did not", pr.stdout.contains("Homepage: " + homepage)); Assert.assertTrue("call shuld evaluate title as: " + title + " but did not", pr.stdout.contains("Acceptable title tag found, contains: " + title)); Assert.assertTrue("call shuld evaluate vendor as: " + " but did not", pr.stdout.contains("Acceptable vendor tag found, contains: " + vendor)); if (descTests) { Assert.assertTrue("call shuld evaluate description as: " + description + " but did not", pr.stdout.contains("Description: " + description)); } } //following tests are testing also localisation of description private final boolean w2=true; @Test public void testLocalisedInformationElementLaunchWithLocalisedInformation1_withDescription() throws Exception { String[] l = getChangeLocalesForSubproces("en_US.UTF-8"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement3", l, true); assertTiVeDe(pr, "localisedJnlp1.jnlp1", "IcedTea", "D_DEF", w2); } @Test public void testLocalisedInformationElementLaunchWithLocalisedInformation22_withDescription() throws Exception { String[] l = getChangeLocalesForSubproces("cs_CZ"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement3", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp po cesky", "IcedTea CZ", "D_DEF_CS", w2); } @Test public void testLocalisedInformationElementLaunchWithLocalisedInformation33_1_withDescription() throws Exception { String[] l = getChangeLocalesForSubproces("fr_BE"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement3", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp la francee BE", "IcedTea", "D_FR_BE", w2); } @Test public void testLocalisedInformationElementLaunchWithLocalisedInformation33__withDescription() throws Exception { String[] l = getChangeLocalesForSubproces("fr_CH"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement3", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp la francee", "IcedTea", "D_DEF_FR", w2); } @Test public void testLocalisedInformationElementLaunchWithLocalisedInformation33_1_withPieceMissing_withDescription() throws Exception { String[] l = getChangeLocalesForSubproces("fr_BE"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement4", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp la francee BE", "IcedTea", "D_DEF_FR", w2); } @Test public void testLocalisedInformationElementLaunchWithLocalisedInformation33_withPieceMissing_withDescription() throws Exception { String[] l = getChangeLocalesForSubproces("fr_CH"); ProcessResult pr = evaluateLocalisedInformationElementTest("LocalisedInformationElement4", l, true); assertTiVeDe(pr, "LocalisedInformationElement1.jnlp la francee", "IcedTea", "D_DEF_FR", w2); } //following tests are testing localisation of homepage //to lazy to do... } icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/PaxHeaders.7406/resources0000644000000000000000000000013113441742745027566 xustar0029 mtime=1552401893.15683258 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/0000755000175000002070000000000013441742745030454 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/PaxHeaders.7406/Local0000644000000000000000000000032413441742745030624 xustar00122 path=icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement3.jnlp 30 mtime=1552401893.138832617 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationE0000644000175000002070000000524213441742745034614 0ustar00jvanekmock00000000000000 localisedJnlp1.jnlp1 IcedTea D_DEF LocalisedInformationElement1.jnlp la francee D_DEF_FR LocalisedInformationElement1.jnlp la francee BE D_FR_BE LocalisedInformationElement1.jnlp po cesky IcedTea CZ D_DEF_CS icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/PaxHeaders.7406/Local0000644000000000000000000000032313441742745030623 xustar00122 path=icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement2.jnlp 29 mtime=1552401893.15683258 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationE0000644000175000002070000000547313441742745034622 0ustar00jvanekmock00000000000000 localisedJnlp1.jnlp1 LocalisedInformationElement1.jnlp LocalisedInformationElement1.jnlp la francee IcedTea La LocalisedInformationElement1.jnlp LocalisedInformationElement1.jnlp la francee BE LocalisedInformationElement1.jnlp po cesky Muj vlastni LocalisedInformationElement1.jnlp icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/PaxHeaders.7406/Local0000644000000000000000000000032313441742745030623 xustar00122 path=icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement4.jnlp 29 mtime=1552401893.12283265 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationE0000644000175000002070000000533613441742745034620 0ustar00jvanekmock00000000000000 localisedJnlp1.jnlp1 D_DEF LocalisedInformationElement1.jnlp la francee IcedTea D_DEF_FR LocalisedInformationElement1.jnlp la francee BE LocalisedInformationElement1.jnlp po cesky D_DEF_CS icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/PaxHeaders.7406/Local0000644000000000000000000000033113441742745030622 xustar00127 path=icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement_noLoc.jnlp 30 mtime=1552401893.124832646 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationE0000644000175000002070000000427313441742745034617 0ustar00jvanekmock00000000000000 localisedJnlp_noLoc.jnlp1 IcedTea LocalisedInformationElement_noLoc.jnlp icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/PaxHeaders.7406/Local0000644000000000000000000000032413441742745030624 xustar00122 path=icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement1.jnlp 30 mtime=1552401893.129832636 30 atime=1552402157.271253404 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationE0000644000175000002070000000555513441742745034623 0ustar00jvanekmock00000000000000 localisedJnlp1.jnlp1 IcedTea LocalisedInformationElement1.jnlp LocalisedInformationElement1.jnlp la francee La LocalisedInformationElement1.jnlp LocalisedInformationElement1.jnlp la francee BE LocalisedInformationElement1.jnlp la francee BE iso88591 LocalisedInformationElement1.jnlp po cesky IcedTea CZ Muj vlastni LocalisedInformationElement1.jnlp icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026527 xustar0030 mtime=1552401893.128832638 30 atime=1552410887.107183457 30 ctime=1552410887.082183515 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/srcs/0000755000175000002070000000000013441742745027414 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/srcs/PaxHeaders.7406/LocalisedI0000644000000000000000000000031613441742745030543 xustar00116 path=icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/srcs/LocalisedInformationElement.java 30 mtime=1552401893.128832638 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/LocalisedInformationElement/srcs/LocalisedInformationElemen0000644000175000002070000000424413441742745034576 0ustar00jvanekmock00000000000000/* LocalisedInformationElement.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Locale; public class LocalisedInformationElement{ public static void main(String[] args){ System.out.println("LocalisedInformationElement launched"); System.out.println("*******************"); // This needs signed code // String locale = System.getProperty("user.language"); // System.out.println("value of user.language: "+locale); Locale loc=Locale.getDefault(); System.out.println("default locale: "+loc.toString()); System.out.println("*******************"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JnlpHrefAttribute0000644000000000000000000000013213441742745023532 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/0000755000175000002070000000000013441742745024417 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025530 xustar0030 mtime=1552401893.130832634 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/testcases/0000755000175000002070000000000013441742745026415 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/testcases/PaxHeaders.7406/JnlpHrefAttribu0000644000000000000000000000013213441742745030573 xustar0030 mtime=1552401893.130832634 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/testcases/JnlpHrefAttributeTest.java0000644000175000002070000000737613441742745033531 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import org.junit.Assert; import org.junit.Test; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; public class JnlpHrefAttributeTest extends BrowserTest { @Test @TestInBrowsers(testIn = { Browsers.firefox, Browsers.opera}) @NeedsDisplay public void testJnlpHrefAttributeWorks() throws Exception { //midori and epiphany really do not understand jnlpHref if (server.getBrowserLocation().endsWith("midori") || server.getBrowserLocation().endsWith("epiphany")){ return; } if (server.getBrowserLocation().endsWith(ServerAccess.UNSET_BROWSER)){ return; } String url = "./JnlpHrefAttribute.html"; ProcessResult pr = server.executeBrowser(url, new AutoOkClosingListener(), new AutoOkClosingListener()); Assert.assertTrue("The stdout should contain " + AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING + ", but it didnt.", pr.stdout.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)); } @Test @TestInBrowsers(testIn = { Browsers.midori, Browsers.epiphany}) @NeedsDisplay public void testJnlpHrefAttributeDoesNotWork() throws Exception { //others really do if (!(server.getBrowserLocation().endsWith("midori") || server.getBrowserLocation().endsWith("epiphany"))){ return; } if (server.getBrowserLocation().endsWith(ServerAccess.UNSET_BROWSER)){ return; } String url = "./JnlpHrefAttribute.html"; ProcessResult pr = server.executeBrowser(url, new AutoErrorClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse("The stdout should not contain " + AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING + ", but it did.", pr.stdout.contains(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING)); } } icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025544 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/resources/0000755000175000002070000000000013441742745026431 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/resources/PaxHeaders.7406/JnlpHrefAttribu0000644000000000000000000000013213441742745030607 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/resources/JnlpHrefAttribute.html0000644000175000002070000000043013441742745032710 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/resources/PaxHeaders.7406/JnlpHrefAttribu0000644000000000000000000000013213441742745030607 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/resources/JnlpHrefAttribute.jnlp0000644000175000002070000000402613441742745032714 0ustar00jvanekmock00000000000000 simple application IcedTea icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745024503 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/srcs/0000755000175000002070000000000013441742745025371 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/srcs/PaxHeaders.7406/JnlpHrefAttribute.ja0000644000000000000000000000013113441742745030470 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JnlpHrefAttribute/srcs/JnlpHrefAttribute.java0000644000175000002070000000352713441742745031637 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.lang.System; import java.applet.Applet; public class JnlpHrefAttribute extends Applet { private static final String initStr = "*** APPLET FINISHED ***"; @Override public void init() { System.out.println(initStr); } }icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JavawsAWTRobotFindsButton0000644000000000000000000000013213441742745025133 xustar0030 mtime=1552401893.137832619 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/0000755000175000002070000000000013441742745026020 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027145 xustar0030 mtime=1552401893.137832619 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/resources/0000755000175000002070000000000013441742745030032 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/resources/PaxHeaders.7406/javaws-0000644000000000000000000000032213441742745030516 xustar00120 path=icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/resources/javaws-awtrobot-finds-button.jnlp 30 mtime=1552401893.137832619 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/resources/javaws-awtrobot-finds-b0000644000175000002070000000447213441742745034436 0ustar00jvanekmock00000000000000 AWTRobot usage sample IcedTea AWTRobot usage sample icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026105 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/srcs/0000755000175000002070000000000013441742745026772 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/srcs/PaxHeaders.7406/JavawsAWTRob0000644000000000000000000000031213441742745030357 xustar00112 path=icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/srcs/JavawsAWTRobotFindsButton.java 30 mtime=1552401893.121832652 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/srcs/JavawsAWTRobotFindsButton.ja0000644000175000002070000001131213441742745034301 0ustar00jvanekmock00000000000000/* JavawsAWTRobotFindsButton.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Image; import java.awt.Panel; import java.awt.Button; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class JavawsAWTRobotFindsButton extends Applet { private static final String initStr = "JavawsAWTRobotFindsButton is ready for awt tests!"; public static final String iconFile = "marker.png"; public static final Color APPLET_COLOR = new Color(230, 230, 250); // lavender public static final Color BUTTON_COLOR1 = new Color(32, 178, 170); // light sea green public Image img; public Panel panel; public void init(){ img = getImage(getCodeBase(), iconFile); createGUI(); writeAppletInitialized(); } //this method should be called by the extending applet //when the whole gui is ready public void writeAppletInitialized(){ System.out.println(initStr); } //paint the icon in upper left corner @Override public void paint(Graphics g){ int width = 32; int height = 32; int x = 0; int y = 0; g.drawImage(img, x, y, width, height, this); super.paint(g); } private Button createButton(String label, Color color) { Button b = new Button(label); b.setBackground(color); b.setPreferredSize(new Dimension(100, 50)); return b; } // sets background of the applet // and adds the panel with 2 buttons private void createGUI() { setBackground(APPLET_COLOR); panel = new Panel(); panel.setBounds(33,33,267,267); Button bA = createButton("Button A", BUTTON_COLOR1); bA.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent e) { System.out.println("Mouse clicked button A."); } @Override public void mouseEntered(MouseEvent arg0) { } @Override public void mouseExited(MouseEvent arg0) { } @Override public void mousePressed(MouseEvent arg0) { } @Override public void mouseReleased(MouseEvent arg0) { } }); panel.add(bA); Button bB = createButton("Button B", BUTTON_COLOR1); bB.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent e) { System.out.println("Mouse clicked button B."); } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } }); panel.add(bB); this.add(panel); } } icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745027130 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/testcases/0000755000175000002070000000000013441742745030016 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/testcases/PaxHeaders.7406/buttonA0000644000000000000000000000013113441742745030544 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/testcases/buttonA.png0000644000175000002070000000070413441742745032141 0ustar00jvanekmock00000000000000‰PNG  IHDRj9QY)™ pHYs  šœtIMEн5/Ÿ ~cIDATxкэœ1‚0€св8пЬФьт?a“ф~‹ГПХ7ў‰‹3“ГѓM7МфхнЃ"сhN№ћbŒmJЅ_њZ еќvћЮ`*(@њ–IаOEБAЧHtТ6Зlд<ЅЋъHял‚8^/ёр}T”ћщќљЕgъ`цEњашCњашCњашCња=Ть5кЅ€lФњIWеЖŒKЮu>‰–qBŠJ“ъxгрuНR’њMjI}ѕwљбЎ]ЖЭ@™}в1Ѕ…§Є =Щq%?џ ^л˜ПGЎжр4НҘАцБЯ~ЕЈŸ§LBЖjRux§ViЏ™рТХС‚Ч>;rЙQЬ]šйЄ”ДNˆмtё›ыfЁЂи”msиюиЄёйЄбUЕJуІ{^єЁ}€>єЁ}€>єЁ}€>єЁo=Dž6пOgМLдwМ^мЏо`€_ыб1•–ѓOLш[&?жMЏA­IENDЎB`‚icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/testcases/PaxHeaders.7406/JavawsA0000644000000000000000000000032313441742745030467 xustar00121 path=icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/testcases/JavawsAWTRobotFindsButtonTest.java 30 mtime=1552401893.123832648 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavawsAWTRobotFindsButton/testcases/JavawsAWTRobotFindsButt0000644000175000002070000001171213441742745034403 0ustar00jvanekmock00000000000000/* JavawsAWTRobotFindsButtonTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.awt.Color; import java.awt.event.InputEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.awt.AWTFrameworkException; import net.sourceforge.jnlp.awt.AWTHelper; import net.sourceforge.jnlp.awt.imagesearch.ComponentFinder; import net.sourceforge.jnlp.awt.imagesearch.ComponentNotFoundException; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.closinglisteners.Rule; import org.junit.Assert; import org.junit.Test; public class JavawsAWTRobotFindsButtonTest { public static final ServerAccess server = new ServerAccess(); private final String initStr = "JavawsAWTRobotFindsButton is ready for awt tests!"; private static final Color APPLET_COLOR = new Color(230, 230, 250); // lavender private static final Color BUTTON_COLOR1 = new Color(32, 178, 170); // light sea green private static final BufferedImage buttonIcon; static{ try { buttonIcon = ImageIO.read(ClassLoader.getSystemClassLoader().getResource("buttonA.png")); } catch (IOException e) { throw new RuntimeException("Problem initializing buttonIcon",e); } } private class AWTHelperImpl_ClickButtonIcon extends AWTHelper{ public AWTHelperImpl_ClickButtonIcon() { super(initStr, 400, 400); this.setAppletColor(APPLET_COLOR); } @Override public void run() { // move mouse into the button area and out try { clickOnIconExact(buttonIcon, InputEvent.BUTTON1_MASK); } catch (ComponentNotFoundException e) { Assert.fail("Button icon not found: "+e.getMessage()); } } } private void evaluateStdoutContents(ProcessResult pr, AWTHelper helper) { // Assert that the applet was initialized. Rule i = helper.getInitStrAsRule(); Assert.assertTrue(i.toPassingString(), i.evaluate(initStr)); // Assert there are all the test messages from applet for (Rule r : helper.getRules() ) { Assert.assertTrue(r.toPassingString(), r.evaluate(pr.stdout)); } } private void appletAWTMouseTest(String url, AWTHelper helper) throws Exception { String strURL = "/" + url; try { ServerAccess.PROCESS_TIMEOUT = 40 * 1000;// ms ProcessResult pr = server.executeJavaws(strURL, helper, helper); evaluateStdoutContents(pr, helper); } finally { ServerAccess.PROCESS_TIMEOUT = 20 * 1000;// ms } } @Test @NeedsDisplay public void findAndClickButtonByIcon_Test() throws Exception { // display the page, activate applet, click on button AWTHelper helper = new AWTHelperImpl_ClickButtonIcon(); helper.addClosingRulesFromStringArray(new String[] { "Mouse clicked button A." }); appletAWTMouseTest("javaws-awtrobot-finds-button.jnlp", helper); } @Test public void iconFileLoaded_Test() throws IOException { Assert.assertNotNull("buttonIcon should not be null", buttonIcon); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JavascriptSet0000644000000000000000000000013213441742745022720 xustar0030 mtime=1552401893.126832642 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/0000755000175000002070000000000013441742745023605 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024732 xustar0030 mtime=1552401893.155832582 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/resources/0000755000175000002070000000000013441742745025617 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/resources/PaxHeaders.7406/Javascript_Set.js0000644000000000000000000000013213441742745030266 xustar0030 mtime=1552401893.137832619 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/resources/Javascript_Set.js0000644000175000002070000000142013441742745031073 0ustar00jvanekmock00000000000000var setvar; function doJToJSSetTests() { var urlArgs = document.URL.split("?"); var func = urlArgs[1]; // pre-initialization of arrays if (func === "jjsSet1DArray") { setvar = new Array(); } else if (func === "jjsSet2DArray") { setvar = new Array(); setvar[1] = new Array(); } // calling the applet function eval('applet.' + func + '()'); // preparing jsvar value string for output if (func === "jjsSet1DArray") { str = "" + setvar[1]; } else if (func === "jjsSet2DArray") { str = "" + setvar[1][1]; } else if (func === "jjsSetObject") { str = setvar.toString(); } else { var str = "" + setvar; } applet.printStrAndFinish(str); } doTest(doJToJSSetTests, applet);icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/resources/PaxHeaders.7406/JavascriptSet.html0000644000000000000000000000013213441742745030457 xustar0030 mtime=1552401893.155832582 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/resources/JavascriptSet.html0000644000175000002070000000110413441742745031263 0ustar00jvanekmock00000000000000 Java JavaScript LiveConnect - Set values from applet

The JToJSSet html page

icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/resources/PaxHeaders.7406/javascript-set.jnlp0000644000000000000000000000013213441742745030633 xustar0030 mtime=1552401893.120832654 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/resources/javascript-set.jnlp0000644000175000002070000000132313441742745031442 0ustar00jvanekmock00000000000000 Java to JavaScript LiveConnect - Set IcedTea LiveConnect - tests for setting JS values from Java. icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024716 xustar0030 mtime=1552401893.126832642 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/testcases/0000755000175000002070000000000013441742745025603 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/testcases/PaxHeaders.7406/JavascriptSetTest.j0000644000000000000000000000013213441742745030570 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/testcases/JavascriptSetTest.java0000644000175000002070000001744013441742745032076 0ustar00jvanekmock00000000000000/* JToJSSetTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class JavascriptSetTest extends BrowserTest { public final boolean doNotRunInOpera = false; private final String initStr = "JToJSSet applet initialized."; private final String afterStr = "afterTests"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(String[] expectedStdoutsOR, ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JToJSSetTest stdout should contain " + initStr + " but it didnt.", pr.stdout.contains(initStr)); // Assert that the values set from JavaScript are ok boolean atLeastOne = false; for (String s : expectedStdoutsOR) { if (pr.stdout.contains(s)) { atLeastOne = true; } } Assert.assertTrue("JToJSSet: the output should include at least one of expected Stdouts, but it didnt.", atLeastOne); } private void javaToJSSetTest(String urlEnd, String[] expectedValsOR) throws Exception { if (doNotRunInOpera) { Browsers b = server.getCurrentBrowser().getID(); if (b == Browsers.opera) { return; } } String strURL = "/JavascriptSet.html?" + urlEnd; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateStdoutContents(expectedValsOR, pr); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_int_Test() throws Exception { javaToJSSetTest("jjsSetInt", new String[] { "1" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_Integer_Test() throws Exception { javaToJSSetTest("jjsSetInteger", new String[] { "2" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_double_Test() throws Exception { javaToJSSetTest("jjsSetdouble", new String[] { "2.5" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_Double_Test() throws Exception { javaToJSSetTest("jjsSetDouble", new String[] { "2.5" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_float_Test() throws Exception { javaToJSSetTest("jjsSetfloat", new String[] { "2.5" }); // 2.3->2.2999... } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_Float_Test() throws Exception { javaToJSSetTest("jjsSetFloat", new String[] { "2.5" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_long_Test() throws Exception { javaToJSSetTest("jjsSetlong", new String[] { "4294967296" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_Long_Test() throws Exception { javaToJSSetTest("jjsSetLong", new String[] { "4294967297" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_short_Test() throws Exception { javaToJSSetTest("jjsSetshort", new String[] { "3" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_Short_Test() throws Exception { javaToJSSetTest("jjsSetShort", new String[] { "4" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_byte_Test() throws Exception { javaToJSSetTest("jjsSetbyte", new String[] { "5" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_Byte_Test() throws Exception { javaToJSSetTest("jjsSetByte", new String[] { "6" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_char_Test() throws Exception { javaToJSSetTest("jjsSetchar", new String[] { "97" }); // i.e. 'a' } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_Character_Test() throws Exception { javaToJSSetTest("jjsSetCharacter", new String[] { "97" }); // i.e. 'a' } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_boolean_Test() throws Exception { javaToJSSetTest("jjsSetboolean", new String[] { "true" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_Boolean_Test() throws Exception { javaToJSSetTest("jjsSetBoolean", new String[] { "true" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_String_Test() throws Exception { javaToJSSetTest("jjsSetString", new String[] { "№ Žу€’ТЃ$ЧЃт‚Ќ№–" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_object_Test() throws Exception { javaToJSSetTest("jjsSetObject", new String[] { "DummyObject2" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_1DArrayElement_Test() throws Exception { javaToJSSetTest("jjsSet1DArray", new String[] { "100" }); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSSet_2DArrayElement_Test() throws Exception { javaToJSSetTest("jjsSet2DArray", new String[] { "200" }); } } icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745023671 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/srcs/0000755000175000002070000000000013441742745024557 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/srcs/PaxHeaders.7406/JavascriptSet.java0000644000000000000000000000013113441742745027373 xustar0029 mtime=1552401893.12283265 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptSet/srcs/JavascriptSet.java0000644000175000002070000000614613441742745030213 0ustar00jvanekmock00000000000000import java.applet.Applet; import netscape.javascript.JSObject; public class JavascriptSet extends Applet { private JSObject window; public void init() { window = JSObject.getWindow(this); String initStr = "JToJSSet applet initialized."; System.out.println(initStr); } // methods for testing setting of JavaScript variables public void jjsSetInt() { setWindowMember((int) 1); } public void jjsSetInteger() { setWindowMember(new Integer(2)); } public void jjsSetdouble() { setWindowMember((double) 2.5); } public void jjsSetDouble() { setWindowMember(new Double(2.5)); } public void jjsSetfloat() { setWindowMember((float) 2.5); } public void jjsSetFloat() { setWindowMember(new Float(2.5)); } public void jjsSetshort() { setWindowMember((short) 3); } public void jjsSetShort() { setWindowMember(new Short((short) 4)); } public void jjsSetlong() { setWindowMember((long) 4294967296L); } public void jjsSetLong() { setWindowMember(new Long(4294967297L)); } public void jjsSetbyte() { setWindowMember((byte) 5); } public void jjsSetByte() { setWindowMember(new Byte((byte) 6)); } public void jjsSetchar() { setWindowMember((char) 'a'); } public void jjsSetCharacter() { setWindowMember(new Character('a')); } public void jjsSetboolean() { setWindowMember((boolean) true); } public void jjsSetBoolean() { setWindowMember(new Boolean(true)); } public void jjsSetString() { setWindowMember("№ Žу€’ТЃ$ЧЃт‚Ќ№–"); } public void jjsSetObject() { DummyObject dummyObject = new DummyObject("DummyObject2"); setWindowMember(dummyObject); } public void jjsSet1DArray() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } ((JSObject) window.getMember("setvar")).setSlot(1, 100); } public void jjsSet2DArray() { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } ((JSObject) ((JSObject) window.getMember("setvar")).getSlot(1)).setSlot(1, 200); } public void jjsSetJSObject() { setWindowMember(window); } public void setWindowMember(Object value) { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window"); } window.setMember("setvar", value); } // auxiliary class and method for writing output: public void printStrAndFinish(String str) { System.out.println(str); System.out.println("afterTests"); } public class DummyObject { private String str; public DummyObject(String s) { this.str = s; } public void setStr(String s) { this.str = s; } public String toString() { return str; } } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JavascriptFuncParam0000644000000000000000000000013113441742745024040 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/0000755000175000002070000000000013441742745024726 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745026036 xustar0029 mtime=1552401893.12783264 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/testcases/0000755000175000002070000000000013441742745026724 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/testcases/PaxHeaders.7406/JavascriptFun0000644000000000000000000000013113441742745030615 xustar0029 mtime=1552401893.12783264 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/testcases/JavascriptFuncParamTest.java0000644000175000002070000001740613441742745034342 0ustar00jvanekmock00000000000000/* JToJSFuncParamTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.annotations.KnownToFail; import org.junit.Assert; import org.junit.Test; public class JavascriptFuncParamTest extends BrowserTest { public final boolean doNotRunInOpera = false; private final String initStr = "JToJSFuncParam applet initialized."; private final String afterStr = "afterTests"; private final String globStart = "Call with "; private final String globEnd = " from JS"; private final String jEnd = " from J"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JToJSFuncParamTest stdout should contain " + initStr + " but it didnt.", pr.stdout.contains(initStr)); // Assert that the results of two calls of js func are the same int gs = pr.stdout.indexOf(globStart); int ge = pr.stdout.indexOf(globEnd); int je = pr.stdout.indexOf(jEnd); int jss = je + jEnd.length() + 1; String javaOutput = pr.stdout.substring(gs, je); String jsOutput = pr.stdout.substring(jss, ge); Assert.assertTrue("JToJSFuncParam: the J and JS outputs are not equal!", javaOutput.equals(jsOutput)); } private void javaToJSFuncParamTest(String funcStr) throws Exception { if( doNotRunInOpera){ Browsers b = server.getCurrentBrowser().getID(); if(b == Browsers.opera){ return; } } String strURL = "/JavascriptFuncParam.html?" + funcStr; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateStdoutContents(pr); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_int_Test() throws Exception { javaToJSFuncParamTest("jjsCallintParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_double_Test() throws Exception { javaToJSFuncParamTest("jjsCalldoubleParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_float_Test() throws Exception { javaToJSFuncParamTest("jjsCallfloatParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_long_Test() throws Exception { javaToJSFuncParamTest("jjsCalllongParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_short_Test() throws Exception { javaToJSFuncParamTest("jjsCallshortParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_byte_Test() throws Exception { javaToJSFuncParamTest("jjsCallbyteParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_char_Test() throws Exception { javaToJSFuncParamTest("jjsCallcharParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_boolean_Test() throws Exception { javaToJSFuncParamTest("jjsCallbooleanParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_Integer_Test() throws Exception { javaToJSFuncParamTest("jjsCallIntegerParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_Double_Test() throws Exception { javaToJSFuncParamTest("jjsCallDoubleParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_Float_Test() throws Exception { javaToJSFuncParamTest("jjsCallFloatParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_Long_Test() throws Exception { javaToJSFuncParamTest("jjsCallLongParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_Short_Test() throws Exception { javaToJSFuncParamTest("jjsCallShortParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_Byte_Test() throws Exception { javaToJSFuncParamTest("jjsCallByteParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_Boolean_Test() throws Exception { javaToJSFuncParamTest("jjsCallBooleanParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_Character_Test() throws Exception { javaToJSFuncParamTest("jjsCallCharacterParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_String_Test() throws Exception { javaToJSFuncParamTest("jjsCallStringParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJToJSFuncParam_DummyObject_Test() throws Exception { javaToJSFuncParamTest("jjsCallDummyObjectParam"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail(failsIn={Browsers.googleChrome, Browsers.chromiumBrowser}) public void AppletJToJSFuncParam_JSObject_Test() throws Exception { javaToJSFuncParamTest("jjsCallJSObjectParam"); } } icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026053 xustar0030 mtime=1552401893.135832623 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/resources/0000755000175000002070000000000013441742745026740 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/resources/PaxHeaders.7406/JavascriptFun0000644000000000000000000000013213441742745030632 xustar0030 mtime=1552401893.135832623 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/resources/JavascriptFuncParam.html0000644000175000002070000000114013441742745033525 0ustar00jvanekmock00000000000000 Java JavaScript LiveConnect - Function Parameters

The JToJSFuncParam html page

icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/resources/PaxHeaders.7406/JavascriptFun0000644000000000000000000000013213441742745030632 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/resources/JavascriptFuncParam.js0000644000175000002070000000120113441742745033173 0ustar00jvanekmock00000000000000function JJSParameterTypeFunc(type_parameter, js_str_param) { var str = "Call with " + type_parameter.toString() + ":" + typeof (type_parameter) + " from J"; applet.printOut(str); var value = eval(js_str_param); JSSubFunc(value); } function JSSubFunc(type_parameter) { var str = "Call with " + type_parameter.toString() + ":" + typeof (type_parameter) + " from JS"; applet.printOut(str); } function attemptFuncParamTest() { var urlArgs = document.URL.split("?"); var func = urlArgs[1]; applet[func](); applet.printOut("afterTests"); } doTest(attemptFuncParamTest, applet);icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/resources/PaxHeaders.7406/javascript-fu0000644000000000000000000000013213441742745030631 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/resources/javascript-funcparam.jnlp0000644000175000002070000000140613441742745033746 0ustar00jvanekmock00000000000000 Java to JavaScript LiveConnect - FuncParam IcedTea LiveConnect - tests for parameter conversion between Java and JavaScript. icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025013 xustar0030 mtime=1552401893.125832644 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/srcs/0000755000175000002070000000000013441742745025700 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/srcs/PaxHeaders.7406/JavascriptFuncPara0000644000000000000000000000013213441742745030541 xustar0030 mtime=1552401893.125832644 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JavascriptFuncParam/srcs/JavascriptFuncParam.java0000644000175000002070000000665013441742745032455 0ustar00jvanekmock00000000000000import java.applet.Applet; import netscape.javascript.JSObject; public class JavascriptFuncParam extends Applet { public DummyObject dummyObject = new DummyObject("DummyObject1"); private JSObject window; private final String jsFunctionName = "JJSParameterTypeFunc"; public void init() { window = JSObject.getWindow(this); String initStr = "JToJSFuncParam applet initialized."; System.out.println(initStr); } // methods for testing calling JavaScript function with different parameters public void jjsCallintParam() { int i = 1; passToJavascript(i); } public void jjsCalldoubleParam() { double d = 1.1; passToJavascript(d); } public void jjsCallfloatParam() { float f = 1.5f; passToJavascript(f); } public void jjsCalllongParam() { long l = 10000; passToJavascript(l); } public void jjsCallshortParam() { short s = 1; passToJavascript(s); } public void jjsCallbyteParam() { byte b = 1; passToJavascript(b); } public void jjsCallcharParam() { char c = 'a'; passToJavascript(c, "97"); } public void jjsCallbooleanParam() { boolean b = true; passToJavascript(b); } public void jjsCallIntegerParam() { Integer i = new Integer(1); passToJavascript(i); } public void jjsCallDoubleParam() { Double i = new Double(1.5); passToJavascript(i); } public void jjsCallFloatParam() { Float i = new Float(1.5); passToJavascript(i); } public void jjsCallLongParam() { Long i = new Long(10000); passToJavascript(i); } public void jjsCallShortParam() { Short i = new Short((short) 1); passToJavascript(i); } public void jjsCallByteParam() { Byte i = new Byte((byte) 1); passToJavascript(i); } public void jjsCallBooleanParam() { Boolean i = new Boolean(true); passToJavascript(i); } public void jjsCallCharacterParam() { Character i = new Character('a');// 97 passToJavascript(i, "97"); } public void jjsCallStringParam() { String i = "teststring"; passToJavascript(i, "\"teststring\""); } public void jjsCallDummyObjectParam() { DummyObject i = new DummyObject("dummy1"); passToJavascript(i, "applet.getNewDummyObject(\"dummy1\")"); } public void jjsCallJSObjectParam() { passToJavascript(JSObject.getWindow(this), "window"); } private void passToJavascript(Object obj, String repr) { if (window == null) { window = JSObject.getWindow(this); System.out.println("Null window."); } window.call(jsFunctionName, new Object[] { obj, repr }); } private void passToJavascript(Object obj) { passToJavascript(obj, obj.toString()); } // auxiliary methods and class: public void printOut(String s) { System.out.println(s); } public class DummyObject { private String str; public DummyObject(String s) { this.str = s; } public void setStr(String s) { this.str = s; } public String toString() { return str; } } public DummyObject getNewDummyObject(String s) { return new DummyObject(s); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JSToJSet0000644000000000000000000000013213441742745021543 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.107183457 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJSet/0000755000175000002070000000000013441742745022430 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJSet/PaxHeaders.7406/resources0000644000000000000000000000013213441742745023555 xustar0030 mtime=1552401893.153832586 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJSet/resources/0000755000175000002070000000000013441742745024442 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJSet/resources/PaxHeaders.7406/JSToJava_Set.js0000644000000000000000000000013213441742745026424 xustar0030 mtime=1552401893.134832625 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJSet/resources/JSToJava_Set.js0000644000175000002070000000233213441742745027234 0ustar00jvanekmock00000000000000//dummy javascript class whose instance is passed as JSObject parameter: function JSCar(mph, color) { this.mph = mph; this.color = color; } function attemptSetTests() { var decodedUrl = decodeURI(document.URL); var urlArgs = decodedUrl.split("?"); var testParams = urlArgs[1].split(";"); var field = testParams[0]; var value = testParams[1]; if (value === "JavaScript") { if (field === "_char") { value = 97; } if (field === "_Character") { value = new (applet.Packages).java.lang.Character(65); } if (field === "_specialString") { value = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; } if (field === "_JSObject") { value = new JSCar(100, "red"); } } else if (value.indexOf('[') != -1) { var elem = value.substring(1); value = new Array(); value[0] = elem; } eval('applet.' + field + ' = value'); // modifying _intArray[0] into _intArray // _DoubleArray[0] into _DoubleArray var nameEnd = field.indexOf('['); if (nameEnd != -1) { field = field.substring(0, nameEnd); } applet.printNewValueAndFinish(field); } doTest(attemptSetTests, applet); icedtea-web-1.8/tests/reproducers/simple/JSToJSet/resources/PaxHeaders.7406/JSToJSet.html0000644000000000000000000000013213441742745026125 xustar0030 mtime=1552401893.153832586 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJSet/resources/JSToJSet.html0000644000175000002070000000120613441742745026734 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - Set values from applet

The JSToJSet html page

icedtea-web-1.8/tests/reproducers/simple/JSToJSet/resources/PaxHeaders.7406/jstoj-set.jnlp0000644000000000000000000000013213441742745026441 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJSet/resources/jstoj-set.jnlp0000644000175000002070000000130213441742745027245 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - Set RedHat LiveConnect - tests for setting members on Java side. icedtea-web-1.8/tests/reproducers/simple/JSToJSet/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745023541 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJSet/testcases/0000755000175000002070000000000013441742745024426 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJSet/testcases/PaxHeaders.7406/JSToJSetTest.java0000644000000000000000000000013213441742745026726 xustar0030 mtime=1552401893.124832646 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJSet/testcases/JSToJSetTest.java0000644000175000002070000002246213441742745027544 0ustar00jvanekmock00000000000000/* JSToJSetTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; @Bug(id = { "PR1298" }) public class JSToJSetTest extends BrowserTest { // the JS<->J tests tend to make Opera unusable public final boolean doNotRunInOpera = false; private final String initStr = "JSToJSet applet initialized."; private final String afterStr = "afterTests"; public enum TestType { ARRAY_ELEMENT, WHOLE_ARRAY, NORMAL_VALUE } private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(String expectedStdout, ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JSToJSet: the stdout should contain " + initStr + ", but it didnt.", pr.stdout.contains(initStr)); // Assert that the values set by JavaScript are ok Assert.assertTrue("JSToJSet: the output should include: " + expectedStdout + ", but it didnt.", pr.stdout.contains(expectedStdout)); } private void jsToJavaSetNormalTest(String fieldStr, String valueStr) throws Exception { if (doNotRunInOpera) { if (server.getCurrentBrowser().getID() == Browsers.opera) { return; } } String strURL = "/JSToJSet.html?" + fieldStr + ";" + valueStr; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); String expectedStdout = "New value is: " + valueStr; evaluateStdoutContents(expectedStdout, pr); } private void jsToJavaSetSpecialTest(String fieldStr, String valueStr, TestType testType) throws Exception { if (doNotRunInOpera) { Browsers b = server.getCurrentBrowser().getID(); if (b == Browsers.opera) { return; } } String strURL = "/JSToJSet.html?"; String expectedStdout = ""; switch (testType) { case ARRAY_ELEMENT:// array element strURL += fieldStr + ";" + valueStr; expectedStdout = "New array value is: " + valueStr; break; case WHOLE_ARRAY:// whole array, set 1st element strURL += fieldStr + ";[" + valueStr; expectedStdout = "New array value is: " + valueStr; break; case NORMAL_VALUE:// char et al - to be set at JS side strURL += fieldStr + ";JavaScript"; expectedStdout = "New value is: " + valueStr; break; default: break; } ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateStdoutContents(expectedStdout, pr); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_int_Test() throws Exception { jsToJavaSetNormalTest("_int", "1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_double_Test() throws Exception { jsToJavaSetNormalTest("_double", "1.0"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_float_Test() throws Exception { jsToJavaSetNormalTest("_float", "1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_long_Test() throws Exception { jsToJavaSetNormalTest("_long", "10000"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_boolean_Test() throws Exception { jsToJavaSetNormalTest("_boolean", "true"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_char_Test() throws Exception { jsToJavaSetSpecialTest("_char", "a", TestType.NORMAL_VALUE); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_byte_Test() throws Exception { jsToJavaSetNormalTest("_byte", "10"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @Bug(id = { "PR1298" }) public void AppletJSToJSet_intArrayElement_Test() throws Exception { jsToJavaSetSpecialTest("_intArray[0]", "1", TestType.ARRAY_ELEMENT); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_regularString_Test() throws Exception { jsToJavaSetNormalTest("_String", "teststring"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_specialCharsString_Test() throws Exception { jsToJavaSetSpecialTest("_specialString", "№ Žу€’ТЃ$ЧЃт‚Ќ№–", TestType.NORMAL_VALUE); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_null_Test() throws Exception { jsToJavaSetNormalTest("_Object", "null"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJSet_Integer_Test() throws Exception { jsToJavaSetNormalTest("_Integer", "1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJSet_Double_Test() throws Exception { jsToJavaSetNormalTest("_Double", "1.0"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJSet_Float_Test() throws Exception { jsToJavaSetNormalTest("_Float", "1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJSet_Long_Test() throws Exception { jsToJavaSetNormalTest("_Long", "10000"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_Boolean_Test() throws Exception { jsToJavaSetNormalTest("_Boolean", "true"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_Character_Test() throws Exception { jsToJavaSetSpecialTest("_Character", "A", TestType.NORMAL_VALUE); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJSet_Byte_Test() throws Exception { jsToJavaSetNormalTest("_Byte", "100"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail @Bug(id = { "PR1298" }) public void AppletJSToJSet_DoubleArrayElement_Test() throws Exception { jsToJavaSetSpecialTest("_DoubleArray[0]", "1.1", TestType.ARRAY_ELEMENT); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay @KnownToFail public void AppletJSToJSet_DoubleFullArray_Test() throws Exception { jsToJavaSetSpecialTest("_DoubleArray2", "0.1", TestType.WHOLE_ARRAY); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJSet_JSObject_Test() throws Exception { jsToJavaSetSpecialTest("_JSObject", "100, red", TestType.NORMAL_VALUE); } } icedtea-web-1.8/tests/reproducers/simple/JSToJSet/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745022515 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJSet/srcs/0000755000175000002070000000000013441742745023402 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJSet/srcs/PaxHeaders.7406/JSToJSet.java0000644000000000000000000000013213441742745025042 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.271253404 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJSet/srcs/JSToJSet.java0000644000175000002070000000341213441742745025652 0ustar00jvanekmock00000000000000import java.applet.Applet; import java.lang.reflect.Array; import java.lang.reflect.Field; import netscape.javascript.JSObject; public class JSToJSet extends Applet { public int _int; public double _double; public float _float; public long _long; public boolean _boolean; public char _char; public byte _byte; public String _String; public String _specialString; public Object _Object = new String("non-null object"); public int[] _intArray = new int[1]; public Integer _Integer; public Double _Double; public Float _Float; public Long _Long; public Boolean _Boolean; public Character _Character = 'B'; public Byte _Byte; public Double[] _DoubleArray = new Double[10]; public Double[] _DoubleArray2; public char[] _charArray = new char[1]; public Character[] _CharacterArray = new Character[1]; public JSObject _JSObject; public void init() { String initStr = "JSToJSet applet initialized."; System.out.println(initStr); } public void printNewValueAndFinish(String fieldname) throws Exception { Field field = getClass().getDeclaredField(fieldname); Object value = field.get(this); System.out.println("Old value is: " + value); if (fieldname.equals("_JSObject")) { Integer mph = (Integer) _JSObject.getMember("mph"); String color = (String) _JSObject.getMember("color"); System.out.println("New value is: " + mph + ", " + color); } else if (value != null && value.getClass().isArray()) { System.out.println("New array value is: " + Array.get(value, 0)); } else { System.out.println("New value is: " + value); } System.out.println("afterTests"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JSToJFuncResol0000644000000000000000000000013213441742745022710 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/0000755000175000002070000000000013441742745023575 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024722 xustar0030 mtime=1552401893.153832586 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/resources/0000755000175000002070000000000013441742745025607 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/resources/PaxHeaders.7406/JSToJava_FuncResol0000644000000000000000000000013213441742745030323 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/resources/JSToJava_FuncResol.js0000644000175000002070000000050313441742745031544 0ustar00jvanekmock00000000000000function attemptFuncResolTests() { var urlArgs = document.URL.split("?"); var testParams = urlArgs[1].split(";"); var func = testParams[0]; var value = decodeURIComponent(testParams[1]); eval('applet.' + func + '(' + value + ')'); applet.writeAfterTests(); } doTest(attemptFuncResolTests, applet);icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/resources/PaxHeaders.7406/JSToJFuncResol.htm0000644000000000000000000000013213441742745030263 xustar0030 mtime=1552401893.153832586 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/resources/JSToJFuncResol.html0000644000175000002070000000124313441742745031247 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - FuncResol values from applet

The JSToJFuncResol html page

icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/resources/PaxHeaders.7406/jstoj-funcresol.jn0000644000000000000000000000013213441742745030457 xustar0030 mtime=1552401893.117832661 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/resources/jstoj-funcresol.jnlp0000644000175000002070000000141013441742745031617 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - FuncResol IcedTea LiveConnect - tests for overloaded function resolution when calling Java functions from JS. icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024706 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/testcases/0000755000175000002070000000000013441742745025573 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/testcases/PaxHeaders.7406/JSToJFuncResolTest0000644000000000000000000000013213441742745030320 xustar0030 mtime=1552401893.123832648 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/testcases/JSToJFuncResolTest.java0000644000175000002070000001742113441742745032055 0ustar00jvanekmock00000000000000/* JSToJFuncResolTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.annotations.KnownToFail; import org.junit.Assert; import org.junit.Test; public class JSToJFuncResolTest extends BrowserTest { private final String initStr = "JSToJFuncResol applet initialized."; private final String afterStr = "afterTests"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return (s.contains(initStr) && s.contains(afterStr)); } } private void evaluateStdoutContents(String expectedStdout, ProcessResult pr) { // Assert that the applet was initialized. Assert.assertTrue("JSToJFuncResol: the stdout should contain " + initStr + ", but it didnt.", pr.stdout.contains(initStr)); // Assert that the values set by JavaScript are ok Assert.assertTrue("JSToJFuncResol: the output should include: " + expectedStdout + ", but it didnt.", (pr.stderr.contains(expectedStdout) || pr.stdout.contains(expectedStdout))); } private void jsToJavaFuncResolTest(String methodStr, String valueStr, String expectedStdout) throws Exception { String strURL = "/JSToJFuncResol.html?" + methodStr + ";" + valueStr; ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); evaluateStdoutContents(expectedStdout, pr); } /****** Primitive (numeric) value resolutions ******/ @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_numeric_Test() throws Exception { jsToJavaFuncResolTest("numeric", "1", "numeric(int) with 1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_numericToDifferentNumeric_Test() throws Exception { jsToJavaFuncResolTest("numericToDifferentNumeric", "1.1", "numericToDifferentNumeric(double) with 1.1"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_numericToDouble_Test() throws Exception { jsToJavaFuncResolTest("numericToDouble", "1.1", "numericToDouble(double) with 1.1"); } /****** Null resolutions ******/ @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_nullToInteger_Test() throws Exception { jsToJavaFuncResolTest("nullToInteger", "null", "nullToInteger(Integer) with null"); } /****** Java inherited class resolutions ******/ @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_inheritedClass_Test() throws Exception { jsToJavaFuncResolTest("inheritedClass", "applet.getNewOverloadTestHelper2()", "inheritedClass(OverloadTestHelper2) with JSToJFuncResol$OverloadTestHelper2@"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_inheritedClassToParent1_Test() throws Exception { jsToJavaFuncResolTest("inheritedClassToParent1", "applet.getNewOverloadTestHelper3()", "inheritedClassToParent1(OverloadTestHelper2) with JSToJFuncResol$OverloadTestHelper3@"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_inheritedClassToParent2_Test() throws Exception { jsToJavaFuncResolTest("inheritedClassToParent2", "applet.getNewOverloadTestHelper2()", "inheritedClassToParent2(OverloadTestHelper1) with JSToJFuncResol$OverloadTestHelper2@"); } /****** Java object resolutions ******/ @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_javaObjectToString_Test() throws Exception { jsToJavaFuncResolTest("javaObjectToString", "applet.getNewOverloadTestHelper1()", "javaObjectToString(String) with JSToJFuncResol$OverloadTestHelper1@"); } /****** String resolutions ******/ @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_javascriptStringToNumeric_Test() throws Exception { jsToJavaFuncResolTest("javascriptStringToNumeric", "\"1.1\"", "javascriptStringToNumeric(double) with 1.1"); } /****** Javascript object resolutions ******/ @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_javascriptObject_Test() throws Exception { jsToJavaFuncResolTest("javascriptObject", "window", "javascriptObject(JSObject) with [object Window]"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_javascriptObjectToArray_Test() throws Exception { jsToJavaFuncResolTest("javascriptObjectToArray", "[10]", "javascriptObjectToArray(int[]) with [I@"); } /****** The unsupported resolutions: *****/ @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_nullToPrimitive_Test() throws Exception { jsToJavaFuncResolTest("nullToPrimitive", "null", "Error on Java side: No suitable method named nullToPrimitive with matching args found"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_javascriptObjectToUnrelatedType_Test() throws Exception { jsToJavaFuncResolTest("javascriptObjectToUnrelatedType", "window", "Error on Java side: No suitable method named javascriptObjectToUnrelatedType with matching args found"); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void AppletJSToJFuncResol_unsupported_Test() throws Exception { jsToJavaFuncResolTest("unsupported", "25", "Error on Java side: No suitable method named unsupported with matching args found"); } } icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023662 xustar0030 mtime=1552401893.119832657 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/srcs/0000755000175000002070000000000013441742745024547 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/srcs/PaxHeaders.7406/JSToJFuncResol.java0000644000000000000000000000013213441742745027354 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSToJFuncResol/srcs/JSToJFuncResol.java0000644000175000002070000001716213441742745030173 0ustar00jvanekmock00000000000000import java.applet.Applet; import netscape.javascript.JSObject; public class JSToJFuncResol extends Applet { /****** Primitive (numeric) value resolutions ******/ /* * Javascript primitive numeric (int) value resolutions: - to an analogous * primitive Java type (best - lowest cost) - to another primitive numeric * Java type (long) (second lowest) - to Java String type (third lowest) */ public void numeric(int p) { System.out.println("numeric(int) with " + p); } public void numeric(long p) { System.out.println("numeric(long) with " + p); } public void numeric(String p) { System.out.println("numeric(String) with " + p); } /* * Javascript primitive numeric (int) value resolutions: - to a different * primitive Java numeric type (double) (best - second lowest cost) - to * Java string (third lowest cost) */ public void numericToDifferentNumeric(double p) { System.out.println("numericToDifferentNumeric(double) with " + p); } public void numericToDifferentNumeric(String p) { System.out.println("numericToDifferentNumeric(String) with " + p); } /* * Javascript primitive numeric (floating point) value resolutions: - to a * primitive Java numeric type (double) (best - lowest cost) - to Java char */ public void numericToDouble(double p) { System.out.println("numericToDouble(double) with " + p); } public void numericToDouble(char p) { System.out.println("numericToDouble(char) with " + p); } /****** Null resolutions ******/ /* * Javascript null value resolutions: - to any nonprimitive Java type (e.g. * Integer) (best) - to a primitive Java type (int) (not allowed) */ public void nullToInteger(Integer p) { System.out.println("nullToInteger(Integer) with " + p); } public void nullToInteger(int p) { System.out.println("nullToInteger(int) with " + p); } /****** Java inherited class resolutions ******/ /* * Java inherited class (OverloadTestHelper2) value resolutions: - to the * same class type (OverloadTestHelper2) (best) - to a superclass * (OverloadTestHelper1) (second best) - to a subclass (OverloadTestHelper3) * (not possible) */ public void inheritedClass(OverloadTestHelper2 p) { System.out.println("inheritedClass(OverloadTestHelper2) with " + p); } public void inheritedClass(OverloadTestHelper1 p) { System.out.println("inheritedClass(OverloadTestHelper1) with " + p); } public void inheritedClass(OverloadTestHelper3 p) { System.out.println("inheritedClass(OverloadTestHelper3) with " + p); } /* * Java inherited class (OverloadTestHelper3) value resolutions: - to a * superclass (OverloadTestHelper2) (best - second lowest cost) - to a * superclass of superclass (OverloadTestHelper1) (higher cost) */ public void inheritedClassToParent1(OverloadTestHelper2 p) { System.out.println("inheritedClassToParent1(OverloadTestHelper2) with " + p); } public void inheritedClassToParent1(OverloadTestHelper1 p) { System.out.println("inheritedClassToParent1(OverloadTestHelper1) with " + p); } /* * Java inherited class (OverloadTestHelper2) resolutions: - to the * superclass (OverloadTestHelper1) (best - second lowest cost) - to Java * String (third lowest cost) */ public void inheritedClassToParent2(OverloadTestHelper1 p) { System.out.println("inheritedClassToParent2(OverloadTestHelper1) with " + p); } public void inheritedClassToParent2(String p) { System.out.println("inheritedClassToParent2(String) with " + p); } /****** Java object resolutions ******/ /* * Java object (OverloadTestHelper1) value resolutions: - to Java String * (best - third lowest cost) - to a different nonprimitive Java class * (JSObject) (not possible) */ public void javaObjectToString(String p) { System.out.println("javaObjectToString(String) with " + p); } public void javaObjectToString(JSObject p) { System.out.println("javaObjectToString(JSObject) with " + p); } /****** String resolutions ******/ /* * Javascript string value resolutions: - to a primitive numeric Java type * (double) (best - second lowest cost) - to a nonprimitive Java class * (OverloadTestHelper1 as a dummy)(not possible) */ public void javascriptStringToNumeric(double p) { System.out.println("javascriptStringToNumeric(double) with " + p); } public void javascriptStringToNumeric(OverloadTestHelper1 p) { System.out.println("javascriptStringToNumeric(OverloadTestHelper1) with " + p); } /****** Javascript object resolutions ******/ /* * Javascript object value resolutions: - to JSObject Java type (best - * lowest cost) - to Java String type (fourth lowest cost) - to Java array * of Strings (fourth lowest cost) - to a Java superclass (Object) (second * lowest cost) */ public void javascriptObject(JSObject p) { System.out.println("javascriptObject(JSObject) with " + p); } public void javascriptObject(String p) { System.out.println("javascriptObject(String) with " + p); } public void javascriptObject(String[] p) { System.out.println("javascriptObject(String[]) with " + p); } public void javascriptObject(Object p) { System.out.println("javascriptObject(Object) with " + p); } /* * Javascript object (array) value resolutions: - to a Java array of * primitive numeric Java type (int[]) (best - fourth lowest cost) - to a * nonprimitive Java class Integer (impossible) */ public void javascriptObjectToArray(int[] p) { System.out.println("javascriptObjectToArray(int[]) with " + p); } public void javascriptObjectToArray(Integer p) { System.out.println("javascriptObjectToArray(Integer) with " + p); } /****** Not allowed resolutions *******/ /* * Impossible resolutions all should result in * "Error on Java side: No suitable method named ... with matching args found" * - null to a primitive numeric Java type (int) - JSObject (window) to a * different nonprimitive Java class (OverloadTestHelper1) - non-array value * (numeric primitive 25) to array */ public void nullToPrimitive(int p) { System.out.println("nullToPrimitive(int) with " + p); } public void javascriptObjectToUnrelatedType(OverloadTestHelper1 p) { System.out.println("javascriptObjectToUnrelatedType(OverloadTesthelper1) with " + p); } public void unsupported(Object[] p) { System.out.println("unsupported(Object[]) with " + p); } /****** Auxiliary methods and classes ******/ public void init() { String initStr = "JSToJFuncResol applet initialized."; System.out.println(initStr); } public void writeAfterTests() { System.out.println("afterTests"); } // dummy classes for passing objects as function parameters public class OverloadTestHelper1 { }; public class OverloadTestHelper2 extends OverloadTestHelper1 { }; public class OverloadTestHelper3 extends OverloadTestHelper2 { }; public OverloadTestHelper1 getNewOverloadTestHelper1() { return new OverloadTestHelper1(); } public OverloadTestHelper2 getNewOverloadTestHelper2() { return new OverloadTestHelper2(); } public OverloadTestHelper3 getNewOverloadTestHelper3() { return new OverloadTestHelper3(); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/JSObjectWithoutToString0000644000000000000000000000013113441742745024656 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/0000755000175000002070000000000013441742745025544 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025630 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/srcs/0000755000175000002070000000000013441742745026516 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/srcs/PaxHeaders.7406/JSObjectWithou0000644000000000000000000000013113441742745030473 xustar0029 mtime=1552401893.13283263 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/srcs/JSObjectWithoutToString.java0000644000175000002070000000042313441742745034101 0ustar00jvanekmock00000000000000import java.applet.Applet; import netscape.javascript.JSObject; public class JSObjectWithoutToString extends Applet { public void callJSToString(JSObject jso) { System.out.println(jso.toString()); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026655 xustar0030 mtime=1552401893.117832661 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/testcases/0000755000175000002070000000000013441742745027542 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/testcases/PaxHeaders.7406/JSObjectW0000644000000000000000000000031713441742745030454 xustar00117 path=icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/testcases/JSObjectWithoutToStringTest.java 30 mtime=1552401893.117832661 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/testcases/JSObjectWithoutToStringTe0000644000175000002070000000544713441742745034511 0ustar00jvanekmock00000000000000/* JSObjectWithoutToStringTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class JSObjectWithoutToStringTest extends BrowserTest { private static final String appletCloseString = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) public void testJSObjectWithoutToString() throws Exception { ProcessResult pr = server.executeBrowser("/JSObjectWithoutToString.html", AutoClose.CLOSE_ON_CORRECT_END); Assert.assertFalse("IndexOutOfBounds exception should not have occurred", pr.stderr.contains("java.lang.ArrayIndexOutOfBoundsException")); Assert.assertTrue("Applet should have completed normally", pr.stdout.contains(appletCloseString)); } } icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026671 xustar0030 mtime=1552401893.152832588 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/resources/0000755000175000002070000000000013441742745027556 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/resources/PaxHeaders.7406/JSObjectW0000644000000000000000000000031113441742745030462 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/resources/JSObjectWithoutToString.js 30 mtime=1552401893.152832588 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/resources/JSObjectWithoutToString.j0000644000175000002070000000022613441742745034452 0ustar00jvanekmock00000000000000function attemptToStringTest() { var null_obj = Object.create(null); applet.callJSToString(null_obj); } doTest(attemptToStringTest, applet); icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/resources/PaxHeaders.7406/JSObjectW0000644000000000000000000000031313441742745030464 xustar00113 path=icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/resources/JSObjectWithoutToString.html 30 mtime=1552401893.123832648 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/JSObjectWithoutToString/resources/JSObjectWithoutToString.h0000644000175000002070000000131413441742745034447 0ustar00jvanekmock00000000000000 JavaScript to Java LiveConnect - Function return values from applet

The JSObjectWithoutToString html page

icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/IcoAccess0000644000000000000000000000013213441742745021772 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/0000755000175000002070000000000013441742745022657 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/IcoAccess/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745023770 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/testcases/0000755000175000002070000000000013441742745024655 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/IcoAccess/testcases/PaxHeaders.7406/IcoAccessTest.java0000644000000000000000000000013213441742745027404 xustar0030 mtime=1552401893.124832646 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/testcases/IcoAccessTest.java0000644000175000002070000001266713441742745030230 0ustar00jvanekmock00000000000000/* SimpleTest1Test.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Assert; import org.junit.Test; public class IcoAccessTest extends BrowserTest { @Test public void testJavawsCanUseIcoProvider() throws Exception { ProcessResult pr = server.executeJavaws(null, "IcoAccess.jnlp"); Assert.assertTrue(pr.stdout.contains("IcoAccess running")); Assert.assertTrue(pr.stdout.matches("(?s).*http.*IcoAccess.ico.*")); Assert.assertTrue(pr.stdout.contains("array checks passed")); //javaws CAN access our registered provider Assert.assertTrue(pr.stdout.contains("ico: BufferedImage@")); Assert.assertFalse(pr.stdout.contains("ico: null")); Assert.assertTrue(pr.stdout.contains("IcoAccess ended")); Assert.assertTrue(pr.stdout.contains("png: BufferedImage@")); Assert.assertFalse(pr.stdout.contains("png: null")); } @Test //well this si reallys trange. //from outpouts its clear that ico provider IS registered.. public void testJavawsHeadlessCanNotUseIcoProvider() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "IcoAccess.jnlp"); Assert.assertTrue(pr.stdout.contains("IcoAccess running")); Assert.assertTrue(pr.stdout.matches("(?s).*http.*IcoAccess.ico.*")); Assert.assertTrue(pr.stdout.contains("array checks passed")); //javaws CANNOT access our registered provider Assert.assertFalse(pr.stdout.contains("ico: BufferedImage@")); Assert.assertTrue(pr.stdout.contains("ico: null")); Assert.assertTrue(pr.stdout.contains("IcoAccess ended")); Assert.assertTrue(pr.stdout.contains("png: BufferedImage@")); Assert.assertFalse(pr.stdout.contains("png: null")); //ok, I dont understand this. Normal providers works... } @Test public void testJavawsHtmlCanUseIcoProvider() throws Exception { ProcessResult pr = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "IcoAccess.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("IcoAccess running")); Assert.assertTrue(pr.stdout.matches("(?s).*http.*IcoAccess.ico.*")); Assert.assertTrue(pr.stdout.contains("array checks passed")); //javaws CAN access our registered provider Assert.assertTrue(pr.stdout.contains("ico: BufferedImage@")); Assert.assertFalse(pr.stdout.contains("ico: null")); Assert.assertTrue(pr.stdout.contains("IcoAccess ended")); Assert.assertTrue(pr.stdout.contains("png: BufferedImage@")); } @Test @TestInBrowsers(testIn = Browsers.one) public void testAppletCanUseIcoProvider() throws Exception { ProcessResult pr = server.executeBrowser("IcoAccess.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(pr.stdout.contains("IcoAccess running")); Assert.assertTrue(pr.stdout.matches("(?s).*http.*IcoAccess.ico.*")); Assert.assertTrue(pr.stdout.contains("array checks passed")); //applets CAN access our registered provider Assert.assertTrue(pr.stdout.contains("ico: BufferedImage@")); Assert.assertFalse(pr.stdout.contains("ico: null")); Assert.assertTrue(pr.stdout.contains("IcoAccess ended")); Assert.assertTrue(pr.stdout.contains("png: BufferedImage@")); Assert.assertFalse(pr.stdout.contains("png: null")); } } icedtea-web-1.8/tests/reproducers/simple/IcoAccess/PaxHeaders.7406/resources0000644000000000000000000000013113441742745024003 xustar0029 mtime=1552401893.15183259 30 atime=1552410887.108183454 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/resources/0000755000175000002070000000000013441742745024671 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/IcoAccess/resources/PaxHeaders.7406/IcoAccess.ico0000644000000000000000000000013213441742745026411 xustar0030 mtime=1552401893.131832631 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/resources/IcoAccess.ico0000644000175000002070000000257613441742745027233 0ustar00jvanekmock00000000000000h( џџџicedtea-web-1.8/tests/reproducers/simple/IcoAccess/resources/PaxHeaders.7406/IcoAccess.html0000644000000000000000000000013213441742745026603 xustar0030 mtime=1552401893.152832588 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/resources/IcoAccess.html0000644000175000002070000000361613441742745027421 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/IcoAccess/resources/PaxHeaders.7406/IcoAccess.jnlp0000644000000000000000000000013213441742745026602 xustar0030 mtime=1552401893.116832663 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/resources/IcoAccess.jnlp0000644000175000002070000000412213441742745027411 0ustar00jvanekmock00000000000000 IcoAccess IcedTea IcoAccess icedtea-web-1.8/tests/reproducers/simple/IcoAccess/resources/PaxHeaders.7406/IcoAccess.png0000644000000000000000000000013213441742745026423 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.270253407 30 ctime=1552410887.081183517 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/resources/IcoAccess.png0000644000175000002070000001311013441742745027227 0ustar00jvanekmock00000000000000‰PNG  IHDRP2Ы-\ќbKGDџџџ НЇ“ pHYs  šœtIMEп НШhеiTXtCommentCreated with GIMPd.eЌIDAThо}›лeGuЦkе>Зю>ЇлžKћ2іŒgl0Ъ ЖЧ&B“Рц5˜Є`Œ"Y\" Jl)фoАР !dG\œ8vЄ$OY`№ј‚Џaf,˜БЧOЯtO_NŸ>{яЊЅ1‰gD.Ќ-JˆpU%MRgŒшœc<Г3йIˆЖ@^fўж˜gEсЈ)­ %б‰ЯрoD­bЊд‚‰˜:`4Zd4CVEЪ™Ј2??Я­ЗоЪx<цЬ›oЖˆlэЊГ“me5MјŸr№р<№РќіЗПу{пћ:„Г1~ё5F‰’ч9yž7ДIbоaVLžдѓЊgK‹ГгэљЄL&лˆЃХ"J1Эc§ƒЙЙдI"g–јв—ПH‘—|ћлџШx<"ўЋJІ"мњўїѓџёяќтйgљд}ŸЂ›uBrи­\вЄњ;ЃЊ`­eccƒээ1гщ”ћюЛ ЌЕX[R––вZlYђц›orіьйнёБ…ƒвЮЄ~0&ceх]Ќs,//“u;фг)ЇЯœfК3х#љEQrсТ{œ>sš#GŽ№ОїН?I,Фы˜ЬSt Ÿэi’cхЕ™ˆт€ээ гi4aу˜д˜š†ВIЋеДЖoDчЊJ^фE‰Е%Ж FД–В,ыяˆˆoRќj!Ч—…еkg<МЌoЌуы'Яя:ИИrР˜Љн%ЊЛKgqЮbD}фTЦ5ЕMМ›ЛhЁЮ’ў_‡ЬLЙгЎ)Ž8W?з–&dХ:WˆТ?ђМИk•lД№„nЗƒsŽВ,kЃ8,"Тx<і/‚Хa­ЋКKЃЂ8kБж5C\ОŠ &|й:‡ ‹hHrZЏІ]•н*ИSтГ–sЕёUyІœjЈ]YhœѕЅђдД:•кђщД~пZПA;гi§Лі1О№—-K67ЗјъWПЪБcGйЛoћwБББYcЫНї~‚сpШ‰'ИњъЅ`DзP@kЯЌоГжrј№aцsˆз]}№ЁгЩш zyЮtgJQ–СЃМсL‚рgeY`дчЙЫт“XY€ƒЩdТс#‡1*<џќ‹ќъWЯБrщ"пќцЗpЮ&ѓВжђвЏ_тйgСЯ~і3~њгŸњMЌ’ˆѕ *Тжж_џкзиикЈ>ыd ТЧ?ўq†У…к08Ч=їм]г–;яМ‡ŸрmЗню3,.ТAgАQиЛojДN:XЫhqб' 'Ивеczуг47hBКзщ`­ГгщАЖЖЦтвE1E.]К„fЦcОseЩ/љ,‚ЯЃ…ž~њПъЃk-§~ŸŸќф‰а‘'žx‚Йљљ }іrжPnЙхіяляпs>sZыpжqьиб@AЊї,ФсИх–›йимђ™Ы9ццц)Ы2Њz4Ђ7aќсТМ/„}'еoъЌ ascУуXв–RКНeiйИВAЇу3ђ пЇ(JVWW1&УYKž{Ъvъд)њ§О‡šвQ:ЧЏ_z‰ХЅQ]McXЙxб'(ы8}ц4ЮйŠ^љI–ЮѓйцЮЛюbkМ…Е~‡ЪЂЖЗЗЙыЎЛpЮN—S:ЧЧ3йžАМ™"Яи›~ŸЏB*OёЛМДt•=[жРнЩВ:C;ы!Ц•hOžI#ЃЂ@Ю9vІ;a“`ii‰<Я™NЇ”eЮqф№ЪВфьйГ8чиооf~aœУ‰№вK/7Iа96ЗЖŽFр`а№ЦыoT;d8ыpЮƒыс›nТ† џеОРWўњ+lnlАџ~ŠВԘŒяўѓwyф‘GшuЛlЧьйГ‡§ћ—qЮБО~…ЧџЗPuј'Q$т>3yУБККЪЪЪ ˆЃŒŒˆ*Нn—сhд„y№ŽNЗKЏлЁгщ0 (‹‚вZжззQђЪ{пӘŒSЇOWєЪЧuЮњ2ШYЧ3ЯŒKЫ•ѕ+”жrУ„ЕЕ5?NikžgУќе˜:уЈCxsk‹cGR–%яЛх–ƒCеЅ5HћHЋjcOt›VЛ‰шNSУк0y `hUЂUDКЪТ 6Ѕ\xn!ЎЩю6<'^cљЎцрће˜MMнєQUЮŸ‡МШY-Rк’^ЗЧЉSЇ(­ЃлыbT§o­Хтъ(tжBh[k)ђмїХ1˜›ыMEЋ |Э{XЮѕзрЕз^KYЌГlO&ш]ЕHѕюяeQАoп>VWWЙњЊЋъїЕU7зXя“FQ`ЉН ўnЏзчР 8wіœ/§TшtКЬ XgєѕГ<б†"/F”eIщJT…iЮЕз]ыЫОв’‡oК‰iž‡€ЅЅE_З;ЧТќЯ<ѓ wПƒ“Я=GiK-*d6Yч)‚†№В}Цc<р‹ЧЎAПЧwОѓO ‡CŒ1, икмЊInU;Кр5ЮйаТ—Кwg6VрЩБeg2% šгQЃ! ћ§‚„Ц&ТоН{Y^^Ўѕ/ж–,-.rљђeпŠВ5ЪЁC‡xўљч›ЊЋоKžчќщ'?ЩОН{cXZ\ф7Ї~ƒ .mIЏчЧЮЗŒ mР@“._ОŒs–јУфEAžчм}їнlnnњD‚pгЁCt:LfјЬŸ}†Ђ(ъ0кПМёx›Н{їда IЇ’ ИуœѓI+ˆxЦлŒBц (rђщДNBmф8Т&+YжЉХТpXЗЄ*O.‹’С`€sŽљ…y:/Ој"&Ышd=є“эIMр1МђкЋtЛ]^~љeliщ>yUgЋUќw:]VV.ж5рУ?„ ЌЎЎђєSOбыЏ^цГїпЯ /МРбЃG)Š‚NЗУ;я\`ДИФh8то{яEеxw ‹б/PŠВ@Ив6дa{ZЗ‘*L\]] uЗP|œ=€ FGCЌsєћž*Q&“ dК3eyџ2oП§6O>љ$ЏПў:oМёF(B ѓ|є›птџћ0Ц0оsлБVДЌщ™ЙАŸ?џљ/шv}WcИ0dn0‡ ЛyђфsXчиммфШс#lnmњe2CccB[ЉЂ+бљЋƒЄSmŒašO› [†ЊЃjTу,“PaX;лC oЯžЋ)ЫЂ.EE•мРd{B’„ EСwощk§,уЬ™3>l­‘<+№TшќљѓОL\пршБ?ЊˆДдЛ^ vўќy677› :5Y–qіwП UKрiС;D„ЗЮНMЗл ЕГЯ^ЖІ+щ1Ѓ‹оЏE5‹Ѕ ѕ6"ОOчжB‘чѕцЮmb…—Šвщv§QГьНzЇ@B]gw{=РѓЦуЧsхЪ•:ф+6@hдVld0дwы­З†ЉЂzўУс?ќсЩдднфhЯƒС ‘с–…?U.,™ЏЉЅЏЖ,щtЛdЦ4Всhэз•M%ЛЭ ‚—нжbc<GВqэћ"емLKtžze-m%ЌкV5%ŠМHMАьRЌ)Eъ­а‹Ўl%rлн_ћкУ.@ЕОKЪСfHb,бжЕВfГfЏ’ъ“љДєг•И>єeІ5д–ѓ6–OикЮN4ZуDUкRvЖЏД/њ$КчјњBšв+™…IИЁ&wb’$A—iGн.wfъёU>Q2@g+‘™[GвК ˜о)kqЎіb9йLВjylk!вЎŽfц"3 o7Hв–agВv %кьЋѕgІЭ…Њ/›Yњв&й~Сfц‚b-"jг˜­aJЮЎзђъ™F4НєзN:K;$”–ыЌWЦ4*ЎЗ’fU‰$8ЂMл=‘ОЪl-лО ЗЌ˜!Ш­[@F’q’EˆДЎ[iўКћХš”ЛЖo`ЖŒнўM›žШ.‚тЖYУywЛэј{ИъьэЅx'[зЅ’ћQš$9шЬЕгф&‘ЄICZз4Ў—5•+šоEN.,юVЕШ аV йОPљџ7йИњŸ˜rIENDЎB`‚icedtea-web-1.8/tests/reproducers/simple/IcoAccess/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745022743 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/srcs/0000755000175000002070000000000013441742745023631 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/IcoAccess/srcs/PaxHeaders.7406/IcoAccess.java0000644000000000000000000000013113441742745025517 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/IcoAccess/srcs/IcoAccess.java0000644000175000002070000001003513441742745026327 0ustar00jvanekmock00000000000000 import java.applet.Applet; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import javax.imageio.ImageIO; import javax.jnlp.BasicService; import javax.jnlp.ServiceManager; import javax.jnlp.UnavailableServiceException; /* SimpleTest1.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class IcoAccess extends Applet{ @Override public void init() { try { main(getCodeBase().toExternalForm()); } catch (Exception ex){ ex.printStackTrace(); } } public static void main(String... args) throws UnavailableServiceException, MalformedURLException, IOException { //args = new String[]{"http://localhost:44321"}; System.out.println("IcoAccess running"); final URL codeBase; if (args.length == 0) { final BasicService bs = (BasicService) ServiceManager.lookup( "javax.jnlp.BasicService"); codeBase = bs.getCodeBase(); } else { //for "normal" app tsting and appelts codeBase = new URL(args[0]); } System.out.println(codeBase); URL ico = new URL(codeBase + "/IcoAccess.ico"); URL png = new URL(codeBase + "/IcoAccess.png"); System.out.println(ico); byte[] b = new byte[1406]; for (int i = 0; i < b.length; i++) { b[i] = 0; } try (InputStream is = ico.openStream()) { is.read(b); } check(0, b[0]); check(0, b[1]); check(1, b[2]); check(0, b[3]); check(1, b[4]); check(0, b[5]); check(16, b[6]); check(16, b[7]); check(0, b[1273]); for (int i = 1274; i <= 1341; i++) { check(1, b[i]); } check(0, b[1342]); System.out.println("array checks passed"); BufferedImage i = ImageIO.read(new BufferedInputStream(new ByteArrayInputStream(b))); System.out.println("ico: " + i); System.out.println("IcoAccess ended"); BufferedImage i2 = ImageIO.read(png); System.out.println("png: " + i2); System.out.println("*** APPLET FINISHED ***"); } private static void check(int i, byte b) { if (i != b) { throw new RuntimeException("The image was not laoded!"); } } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/CreateClassLoader0000644000000000000000000000013113441742745023455 xustar0030 mtime=1552401893.118832658 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/0000755000175000002070000000000013441742745024343 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/PaxHeaders.7406/resources0000644000000000000000000000013113441742745025467 xustar0030 mtime=1552401893.113832669 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/resources/0000755000175000002070000000000013441742745026355 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/resources/PaxHeaders.7406/CreateClassLoad0000644000000000000000000000013113441742745030460 xustar0030 mtime=1552401893.113832669 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/resources/CreateClassLoader.jnlp0000644000175000002070000000377213441742745032573 0ustar00jvanekmock00000000000000 set context classloader IcedTea icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745025453 xustar0030 mtime=1552401893.118832658 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/testcases/0000755000175000002070000000000013441742745026341 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/testcases/PaxHeaders.7406/CreateClassLoad0000644000000000000000000000013113441742745030444 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/testcases/CreateClassLoaderTest.java0000644000175000002070000000505213441742745033366 0ustar00jvanekmock00000000000000/* CreateClassLoaderTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class CreateClassLoaderTest { private static ServerAccess server = new ServerAccess(); @Test public void CreateClassLoaderLunch1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/CreateClassLoader.jnlp"); String s = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.lang.RuntimePermission.{0,5}" + "createClassLoader" + ".*"; Assert.assertTrue("Stderr should match "+s+" but didn't",pr.stderr.matches(s)); String cc="ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `"+cc+"`, but did",pr.stderr.contains(cc)); Assert.assertFalse("CreateClassLoaderLunch1 should not be terminated, but was",pr.wasTerminated); Assert.assertEquals((Integer) 1, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745024427 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/srcs/0000755000175000002070000000000013441742745025315 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/srcs/PaxHeaders.7406/CreateClassLoader.ja0000644000000000000000000000013113441742745030340 xustar0030 mtime=1552401893.115832665 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CreateClassLoader/srcs/CreateClassLoader.java0000644000175000002070000000351613441742745031505 0ustar00jvanekmock00000000000000/* CreateClassLoader.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.net.URL; import java.net.URLClassLoader; public class CreateClassLoader { public static void main(String[] args) throws Exception { URLClassLoader ucl = new URLClassLoader(new URL[0]); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/CodeBaseManifestEntryUnsignedMatching0000644000000000000000000000013113441742745027463 xustar0030 mtime=1552401893.113832669 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/0000755000175000002070000000000013441742745030351 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/PaxHeaders.7406/resou0000644000000000000000000000013113441742745030620 xustar0030 mtime=1552401893.148832596 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/0000755000175000002070000000000013441742745032363 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/PaxHeaders.0000644000000000000000000000035413441742745031163 xustar00147 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/CodeBaseManifestEntryUnsignedMatchingApplet.jnlp 30 mtime=1552401893.126832642 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/CodeBaseMan0000644000175000002070000000453413441742745034415 0ustar00jvanekmock00000000000000 Classpath Manifest Applet Test IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/PaxHeaders.0000644000000000000000000000034613441742745031164 xustar00141 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/CodeBaseManifestEntryUnsignedMatching.jnlp 30 mtime=1552401893.148832596 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/CodeBaseMan0000644000175000002070000000433613441742745034415 0ustar00jvanekmock00000000000000 ClasspathManifest IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/PaxHeaders.0000644000000000000000000000035213441742745031161 xustar00145 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/CodeBaseManifestEntryUnsignedMatchingJnlp.html 30 mtime=1552401893.111832673 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/CodeBaseMan0000644000175000002070000000354413441742745034415 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/PaxHeaders.0000644000000000000000000000034613441742745031164 xustar00141 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/CodeBaseManifestEntryUnsignedMatching.html 30 mtime=1552401893.117832661 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/resources/CodeBaseMan0000644000175000002070000000357313441742745034417 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745030435 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/srcs/0000755000175000002070000000000013441742745031323 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/srcs/PaxHeaders.7406/0000644000000000000000000000013113441742745030514 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/srcs/META-INF/0000755000175000002070000000000013441742745032463 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/srcs/META-INF/PaxHead0000644000000000000000000000031313441742745030466 xustar00114 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/srcs/META-INF/MANIFEST.MF 30 mtime=1552401893.115832665 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/srcs/META-INF/MANIFES0000644000175000002070000000017413441742745033472 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Codebase: http://localhost https://localhost Application-Name: CodeBaseManifestEntryUnsignedMatching icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/srcs/PaxHeaders.7406/0000644000000000000000000000034113441742745030517 xustar00136 path=icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/srcs/CodeBaseManifestEntryUnsignedMatching.java 30 mtime=1552401893.113832669 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/srcs/CodeBaseManifest0000644000175000002070000000454313441742745034410 0ustar00jvanekmock00000000000000/* ClasspathManifest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class CodeBaseManifestEntryUnsignedMatching extends Applet { private class Killer extends Thread { public int n = 1000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; public static void main(String[] args) { x(); } @Override public void start() { x(); killer = new Killer(); killer.start(); } public static void x() { System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AppletJsAppletDeadlock0000644000000000000000000000013013441742745024453 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/0000755000175000002070000000000013441742745025342 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/PaxHeaders.7406/resources0000644000000000000000000000013013441742745026465 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/resources/0000755000175000002070000000000013441742745027354 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/resources/PaxHeaders.7406/AppletJsAp0000644000000000000000000000030713441742745030476 xustar00111 path=icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/resources/AppletJsAppletDeadlock.html 29 mtime=1552401893.12283265 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/resources/AppletJsAppletDeadlock.htm0000644000175000002070000000421613441742745034410 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025426 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/srcs/0000755000175000002070000000000013441742745026314 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/srcs/PaxHeaders.7406/AppletJsAppletD0000644000000000000000000000013113441742745030422 xustar0030 mtime=1552401893.106832684 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/srcs/AppletJsAppletDeadlock.java0000644000175000002070000000605413441742745033503 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.awt.TextArea; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import netscape.javascript.JSObject; public class AppletJsAppletDeadlock extends java.applet.Applet { private TextArea outputText = null; public void printOutput(String msg) { System.out.println(msg); outputText.setText(outputText.getText() + msg + "\n"); } public void jsCallback(String location) { printOutput("Callback function called"); // try requesting the page try { URL url = new URL(location); URLConnection con = url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader( con.getInputStream())); String line; while ((line = br.readLine()) != null) { System.err.println(line); } printOutput("Succesfully connected to " + location); } catch (Exception e) { printOutput("Failed to connect to '" + location + "': " + e.getMessage()); } } @Override public void start() { // public void init() { outputText = new TextArea("", 12, 95); this.add(outputText); printOutput("AppletJsAppletDeadlock started"); JSObject win = JSObject.getWindow(this); win.eval("callApplet();"); printOutput("JS call finished"); } } icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745026452 xustar0030 mtime=1552401893.109832677 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/testcases/0000755000175000002070000000000013441742745027340 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/testcases/PaxHeaders.7406/AppletJsAp0000644000000000000000000000031413441742745030460 xustar00115 path=icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/testcases/AppletJsAppletDeadlockTest.java 30 mtime=1552401893.109832677 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletJsAppletDeadlock/testcases/AppletJsAppletDeadlockTest0000644000175000002070000001105713441742745034446 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class AppletJsAppletDeadlockTest extends BrowserTest { private static final String called = "Callback function called"; private static final String started = "AppletJsAppletDeadlock started"; private static final String finished = "JS call finished"; private static final RulesFolowingClosingListener.ContainsRule calledRule = new RulesFolowingClosingListener.ContainsRule(called); private static final RulesFolowingClosingListener.ContainsRule startedRule = new RulesFolowingClosingListener.ContainsRule(started); private static final RulesFolowingClosingListener.ContainsRule finishedRule = new RulesFolowingClosingListener.ContainsRule(finished); private static final long defaultTimeout = ServerAccess.PROCESS_TIMEOUT; @BeforeClass public static void setTimeout() { //the timeout is js call is 60s //see sun.applet.PluginAppletViewer.REQUEST_TIMEOUT //so wee need to have little longer timooute here ServerAccess.PROCESS_TIMEOUT = 120000;//120 s } @AfterClass public static void resetTimeout() { ServerAccess.PROCESS_TIMEOUT = defaultTimeout; } @Test @NeedsDisplay @TestInBrowsers(testIn = Browsers.one) public void callAppletJsAppletNotDeadlock() throws Exception { ProcessResult processResult = server.executeBrowser("AppletJsAppletDeadlock.html", new RulesFolowingClosingListener(finishedRule), null); Assert.assertTrue(startedRule.toPassingString(), startedRule.evaluate(processResult.stdout)); Assert.assertTrue(finishedRule.toPassingString(), finishedRule.evaluate(processResult.stdout)); //this is representing another error, not sure now it is worthy to be fixed //Assert.assertTrue(calledRule.toPassingString(), calledRule.evaluate(processResult.stdout)); } @Test @NeedsDisplay @TestInBrowsers(testIn = Browsers.one) @KnownToFail public void callAppletJsAppletSuccessfullyEvaluated() throws Exception { ProcessResult processResult = server.executeBrowser("AppletJsAppletDeadlock.html", new RulesFolowingClosingListener(finishedRule), null); Assert.assertTrue(startedRule.toPassingString(), startedRule.evaluate(processResult.stdout)); Assert.assertTrue(finishedRule.toPassingString(), finishedRule.evaluate(processResult.stdout)); Assert.assertTrue(calledRule.toPassingString(), calledRule.evaluate(processResult.stdout)); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AllStackTraces0000644000000000000000000000013113441742745022775 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/0000755000175000002070000000000013441742745023663 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/PaxHeaders.7406/resources0000644000000000000000000000013113441742745025007 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/resources/0000755000175000002070000000000013441742745025675 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/resources/PaxHeaders.7406/AllStackTraces.jnl0000644000000000000000000000013113441742745030431 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/resources/AllStackTraces.jnlp0000644000175000002070000000060613441742745031424 0ustar00jvanekmock00000000000000 Test Thread.getAllStackTraces IcedTea icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745023747 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/srcs/0000755000175000002070000000000013441742745024635 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/srcs/PaxHeaders.7406/AllStackTraces.java0000644000000000000000000000013113441742745027527 xustar0030 mtime=1552401893.106832684 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/srcs/AllStackTraces.java0000644000175000002070000000334713441742745030347 0ustar00jvanekmock00000000000000/* AllStackTraces.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class AllStackTraces { public static void main(String[] args) { Thread.getAllStackTraces(); } } icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745024773 xustar0030 mtime=1552401893.109832677 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/testcases/0000755000175000002070000000000013441742745025661 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/testcases/PaxHeaders.7406/AllStackTracesTest0000644000000000000000000000013113441742745030473 xustar0030 mtime=1552401893.109832677 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AllStackTraces/testcases/AllStackTracesTest.java0000644000175000002070000000504313441742745032226 0ustar00jvanekmock00000000000000/* AllStackTracesTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class AllStackTracesTest { private static final ServerAccess server = new ServerAccess(); @Test public void AllStackTracesTest1() throws Exception { ProcessResult pr=server.executeJavawsHeadless(null,"/AllStackTraces.jnlp"); String c = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.lang.RuntimePermission.{0,5}" + "getStackTrace" + ".*"; Assert.assertTrue("stderr should match `"+c+"`, but didn't ",pr.stderr.matches(c)); String cc="ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `"+cc+"`, but did ",pr.stderr.contains(cc)); Assert.assertFalse("AllStackTracesTest1 should not be terminated, but was",pr.wasTerminated); Assert.assertEquals((Integer)1, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AbsolutePathsAndQueryStrings0000644000000000000000000000013113441742745025736 xustar0030 mtime=1552401893.110832675 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/0000755000175000002070000000000013441742745026624 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/PaxHeaders.7406/resources0000644000000000000000000000013113441742745027750 xustar0030 mtime=1552401893.108832679 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/0000755000175000002070000000000013441742745030636 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/PaxHeaders.7406/Abso0000644000000000000000000000032413441742745030640 xustar00123 path=icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html 30 mtime=1552401893.104832688 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQuer0000644000175000002070000000355613441742745034630 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/PaxHeaders.7406/Abso0000644000000000000000000000032413441742745030640 xustar00123 path=icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp 30 mtime=1552401893.108832679 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQuer0000644000175000002070000000441413441742745034622 0ustar00jvanekmock00000000000000 AbsolutePathsAndQueryStrings IcedTea Use relative codebase URLs to append to host names, and correctly parse query strings icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745027734 xustar0030 mtime=1552401893.110832675 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/0000755000175000002070000000000013441742745030622 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/PaxHeaders.7406/Abso0000644000000000000000000000032413441742745030624 xustar00123 path=icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java 30 mtime=1552401893.110832675 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQuer0000644000175000002070000001306313441742745034606 0ustar00jvanekmock00000000000000/* AbsolutePathsAndQueryStrings.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.net.URL; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.config.DeploymentConfiguration; import org.junit.Assert; import org.junit.Test; public class AbsolutePathsAndQueryStrings extends BrowserTest { private static final String appletCloseString = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; @Bug(id = "PR1204") @NeedsDisplay @Test @TestInBrowsers(testIn = {Browsers.one}) public void testAbsolutePathAndQueryStringBrowser() throws Exception { /* HTML specifies absolute path and path params, ensure that this is able to launch correctly */ ProcessResult pr = server.executeBrowser("/AbsolutePathsAndQueryStrings.html", AutoClose.CLOSE_ON_BOTH); Assert.assertTrue("stdout should contain " + appletCloseString + " but did not", pr.stdout.contains(appletCloseString)); } @Bug(id = "PR1204") @NeedsDisplay @Test public void testAbsolutePathAndQueryStringWebstart() throws Exception { /* JNLP specifies absolute path and path params, ensure that this is able to launch correctly */ ProcessResult pr = server.executeJavawsHeadless("/AbsolutePathsAndQueryStrings.jnlp"); Assert.assertTrue("stdout should contain \"running\"but did not", pr.stdout.contains("running")); } @Bug(id = "PR1204") @Test public void testCaching() throws Exception { //prepare cached files testAbsolutePathAndQueryStringWebstart(); /* Test that caching ignores path parameters and double-slash issue from absolute codebase paths */ URL plainLocation = new URL("http://localhost:" + server.getPort() + "/StripHttpPathParams.jar"); URL paramLocation = new URL("http://localhost:" + server.getPort() + "/StripHttpPathParams.jar?i=abcd"); URL absoluteLocation = new URL("http://localhost:" + server.getPort() + "//StripHttpPathParams.jar"); URL absoluteParamLocation = new URL("http://localhost:" + server.getPort() + "//StripHttpPathParams.jar?i=abcd"); DeploymentConfiguration config = JNLPRuntime.getConfiguration(); config.load(); String cacheLocation = config.getProperty(DeploymentConfiguration.KEY_USER_CACHE_DIR) + File.separator; File cacheDir = new File(cacheLocation); Assert.assertTrue(cacheDir.isDirectory()); int hasCachedCopy = 0; for (File cache : cacheDir.listFiles()) { File[] cacheFiles1 = new File[]{ CacheUtil.urlToPath(plainLocation, cache.getPath()), CacheUtil.urlToPath(absoluteLocation, cache.getPath()),}; File[] cacheFiles2 = new File[]{ CacheUtil.urlToPath(paramLocation, cache.getPath()), CacheUtil.urlToPath(absoluteParamLocation, cache.getPath()),}; for (File f : cacheFiles1) { if (f.isFile()) { hasCachedCopy ++; } for (File g : cacheFiles1) { Assert.assertEquals(f.getPath(), g.getPath()); } } for (File f : cacheFiles2) { if (f.isFile()) { hasCachedCopy ++; } for (File g : cacheFiles2) { Assert.assertEquals(f.getPath(), g.getPath()); } } } Assert.assertTrue("At least 4 items should be in cach. Are not. Are: " + hasCachedCopy, hasCachedCopy >= 4); } } icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/DocumentBaseEncoding0000644000000000000000000000013113441742745024155 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/0000755000175000002070000000000013441742745025043 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745026153 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/testcases/0000755000175000002070000000000013441742745027041 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/testcases/PaxHeaders.7406/DocumentBase0000644000000000000000000000031113441742745030524 xustar00112 path=icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/testcases/DocumentBaseEncodingTests.java 30 mtime=1552401893.121832652 30 atime=1552402157.270253407 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/testcases/DocumentBaseEncodingTests.ja0000644000175000002070000000724413441742745034427 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; public class DocumentBaseEncodingTests extends BrowserTest { static final private String urlPattern = "http://localhost:\\d+"; private String escapePattern(String plainText) { return "\\Q" + plainText + "\\E"; } // Surround a pattern with two plain text matches and wildcards to match any occurence private String surroundPattern(String plainText1, String pattern, String plainText2) { return "(?s).*" + escapePattern(plainText1) + pattern + escapePattern(plainText2) + "\\W.*"; } private void testEncoding(String urlParam, String encodedUrlParam) throws Exception { ProcessResult pr = server.executeBrowser("Document Base Encoding.html" + urlParam, AutoClose.CLOSE_ON_CORRECT_END); final String codeBasePattern = surroundPattern("CodeBase: ", urlPattern, "/"); final String documentBasePattern = surroundPattern("DocumentBase: ", urlPattern, "/Document%20Base%20Encoding.html" + encodedUrlParam); Assert.assertTrue("DocumentBaseEncoding stdout should match '" + codeBasePattern + "' but did not.", pr.stdout.matches(codeBasePattern)); Assert.assertTrue("DocumentBaseEncoding stdout should match '" + documentBasePattern + "' but did not.", pr.stdout.matches(documentBasePattern)); } @Test @TestInBrowsers(testIn = { Browsers.one }) public void testSpacesInUrl() throws Exception { testEncoding("?spaces test", "?spaces%20test"); } @Test @TestInBrowsers(testIn = { Browsers.one }) public void testComplexParameterInUrl() throws Exception { String urlParam = "?testkey=http%3A%2F%2Ftest.com%3Ftest%3Dtest"; // test value is 'http://test.com?test=test' percent-encoded testEncoding(urlParam, urlParam /* Already encoded. */); } } icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025127 xustar0030 mtime=1552401893.118832658 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/srcs/0000755000175000002070000000000013441742745026015 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/srcs/PaxHeaders.7406/DocumentBaseEncod0000644000000000000000000000013113441742745030451 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.269253409 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/srcs/DocumentBaseEncoding.java0000644000175000002070000000361113441742745032701 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class DocumentBaseEncoding extends Applet { @Override public void init() { System.out.println("DocumentBase: " + getDocumentBase()); System.out.println("CodeBase: " + getCodeBase()); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/PaxHeaders.7406/resources0000644000000000000000000000013113441742745026167 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/resources/0000755000175000002070000000000013441742745027055 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/resources/PaxHeaders.7406/Document Bas0000644000000000000000000000013113441742745030433 xustar0030 mtime=1552401893.115832665 30 atime=1552402157.269253409 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/DocumentBaseEncoding/resources/Document Base Encoding.html0000644000175000002070000000337313441742745034071 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/AppletTagWithMissingCodeAttribute0000644000000000000000000000013113441742745026663 xustar0030 mtime=1552401893.113832669 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/0000755000175000002070000000000013441742745027551 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745030661 xustar0030 mtime=1552401893.113832669 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/testcases/0000755000175000002070000000000013441742745031547 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/testcases/PaxHeaders.74060000644000000000000000000000033613441742745030670 xustar00133 path=icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/testcases/AppletTagWithMissingCodeAttribute.java 30 mtime=1552401893.113832669 30 atime=1552402157.269253409 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/testcases/AppletTagWithMi0000644000175000002070000000516213441742745034501 0ustar00jvanekmock00000000000000/* AppletTagWithMissingCodeAttribute.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; public class AppletTagWithMissingCodeAttribute extends BrowserTest { final static String closingString = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; @Test @TestInBrowsers(testIn = { Browsers.firefox }) //fails everywhere but in firefox. other browsers dont know how to handle it public void EmbeddedAppletWithMissingCodeAttribute() throws Exception { ProcessResult pr = server.executeBrowser("/AppletTagWithMissingCodeAttribute.html", AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue("Stdout should contain " + closingString + " but did not", pr.stdout.contains(closingString)); } } icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/PaxHeaders.7406/resources0000644000000000000000000000013113441742745030675 xustar0030 mtime=1552401893.113832669 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/resources/0000755000175000002070000000000013441742745031563 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/resources/PaxHeaders.74060000644000000000000000000000033613441742745030704 xustar00133 path=icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/resources/AppletTagWithMissingCodeAttribute.html 30 mtime=1552401893.113832669 30 atime=1552402157.269253409 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/resources/AppletTagWithMi0000644000175000002070000000344413441742745034516 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/resources/PaxHeaders.74060000644000000000000000000000032413441742745030701 xustar00123 path=icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/resources/AppletJnlpWithMainClass.jnlp 30 mtime=1552401893.111832673 30 atime=1552402157.269253409 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/AppletTagWithMissingCodeAttribute/resources/AppletJnlpWithM0000644000175000002070000000435613441742745034540 0ustar00jvanekmock00000000000000 AppletJnlpWithMainClass IcedTea AppletJnlpWithMainClass icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/ReadEnvironment0000644000000000000000000000013113441742745023235 xustar0030 mtime=1552401893.157832577 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/0000755000175000002070000000000013441742745024123 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745025233 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/testcases/0000755000175000002070000000000013441742745026121 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/testcases/PaxHeaders.7406/ReadEnvironmentTe0000644000000000000000000000013113441742745030624 xustar0030 mtime=1552401893.141832611 30 atime=1552402157.269253409 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/testcases/ReadEnvironmentTest.java0000644000175000002070000000502713441742745032730 0ustar00jvanekmock00000000000000/* ReadEnvironmentTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class ReadEnvironmentTest { private static ServerAccess server = new ServerAccess(); @Test public void ReadEnvironmentLunch1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/ReadEnvironment.jnlp"); String s = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.lang.RuntimePermission.{0,5}" + "getenv.USER" + ".*"; Assert.assertTrue("stderr should match"+s+"but didn't",pr.stderr.matches(s)); String cc="ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `"+cc+"`, but did",pr.stderr.contains(cc)); Assert.assertFalse("ReadEnvironmentLunch1 should not be terminated, but was",pr.wasTerminated); Assert.assertEquals((Integer) 1, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745024207 xustar0030 mtime=1552401893.157832577 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/srcs/0000755000175000002070000000000013441742745025075 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/srcs/PaxHeaders.7406/ReadEnvironment.java0000644000000000000000000000013113441742745030227 xustar0030 mtime=1552401893.157832577 30 atime=1552402157.269253409 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/srcs/ReadEnvironment.java0000644000175000002070000000334613441742745031046 0ustar00jvanekmock00000000000000/* ReadEnvironment.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class ReadEnvironment { public static void main(String[] args) { System.getenv("USER"); } } icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/PaxHeaders.7406/resources0000644000000000000000000000013113441742745025247 xustar0030 mtime=1552401893.131832631 30 atime=1552410887.108183454 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/resources/0000755000175000002070000000000013441742745026135 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/resources/PaxHeaders.7406/ReadEnvironment.j0000644000000000000000000000013113441742745030577 xustar0030 mtime=1552401893.131832631 30 atime=1552402157.269253409 29 ctime=1552410887.08018352 icedtea-web-1.8/tests/reproducers/simple/ReadEnvironment/resources/ReadEnvironment.jnlp0000644000175000002070000000376213441742745032132 0ustar00jvanekmock00000000000000 ReadEnvironment using System.getenv() IcedTea icedtea-web-1.8/tests/reproducers/simple/PaxHeaders.7406/GeneratedId0000644000000000000000000000013113441742745022310 xustar0029 mtime=1552401893.15183259 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/simple/GeneratedId/0000755000175000002070000000000013441742745023176 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/GeneratedId/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024307 xustar0030 mtime=1552401893.131832631 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/simple/GeneratedId/testcases/0000755000175000002070000000000013441742745025174 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/GeneratedId/testcases/PaxHeaders.7406/GeneratedIdTest.java0000644000000000000000000000013213441742745030242 xustar0030 mtime=1552401893.131832631 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/simple/GeneratedId/testcases/GeneratedIdTest.java0000644000175000002070000001666113441742745031064 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class GeneratedIdTest { private static final ServerAccess server = new ServerAccess(); private static final String okBase = "0 - id: "; private static final String someId1 = "SomeId"; private static final String someId2 = "AnotherId"; private static final String okBase1 = okBase + someId1; private static final String okBase2 = okBase + someId2; private static final String baseName1 = "GeneratedId.jnlp"; private static final String baseName1_noHref = "GeneratedIdNoHref.jnlp"; private static final String baseName2 = "GeneratedId_1_tmp.jnlp"; private static final String baseName2_noHref = "GeneratedIdNoHref_1_tmp.jnlp"; public static File prepareChangedFileWithHref() throws IOException { File src = new File(server.getDir(), baseName1); File dest = new File(server.getDir(), baseName2); String srcJnlp = ServerAccess.getContentOfStream(new FileInputStream(src)); ServerAccess.saveFile(srcJnlp.replace(someId1, someId2), dest); return dest; } public static File prepareChangedFileNoHref() throws IOException { File src = new File(server.getDir(), baseName1); File dest = new File(server.getDir(), baseName2_noHref); String srcJnlp = ServerAccess.getContentOfStream(new FileInputStream(src)); ServerAccess.saveFile(srcJnlp.replace(someId1, someId2).replace("href=\"GeneratedId.jnlp\"", ""), dest); return dest; } public static File prepareCopiedFileNoHref() throws IOException { File src = new File(server.getDir(), baseName1); File dest = new File(server.getDir(), baseName1_noHref); String srcJnlp = ServerAccess.getContentOfStream(new FileInputStream(src)); ServerAccess.saveFile(srcJnlp.replace("href=\"GeneratedId.jnlp\"", ""), dest); return dest; } @Test //have href //is local //should be redownloaded //href points to different file public void launchLocalChangedFileWithHref() throws Exception { File dest = prepareChangedFileWithHref(); List l = new ArrayList(3); l.add(server.getJavawsLocation()); l.add(ServerAccess.HEADLES_OPTION); l.add(dest.getAbsolutePath()); ProcessResult pr = ServerAccess.executeProcess(l); Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); } @Test //do not have href //is local //should NOT be redownloaded public void launchLocalChangedFileWithNoHref() throws Exception { File dest = prepareChangedFileNoHref(); List l = new ArrayList(3); l.add(server.getJavawsLocation()); l.add(ServerAccess.HEADLES_OPTION); l.add(dest.getAbsolutePath()); ProcessResult pr = ServerAccess.executeProcess(l); Assert.assertTrue("Stdout should contain '" + okBase2 + "', but did not.", pr.stdout.contains(okBase2)); } @Test //do have href //is local //should be redownloaded (how to verify!?!) public void launchLocalFileWithHref() throws Exception { File dest = new File(server.getDir(), baseName1); List l = new ArrayList(3); l.add(server.getJavawsLocation()); l.add(ServerAccess.HEADLES_OPTION); l.add(dest.getAbsolutePath()); ProcessResult pr = ServerAccess.executeProcess(l); Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); } @Test //do not have href //is local //should NOT be redownloaded (how to verify!?!) public void launchLocalFileNoHref() throws Exception { File dest = prepareCopiedFileNoHref(); List l = new ArrayList(3); l.add(server.getJavawsLocation()); l.add(ServerAccess.HEADLES_OPTION); l.add(dest.getAbsolutePath()); ProcessResult pr = ServerAccess.executeProcess(l); Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); } @Test //remote //have href //should not be redownloaded (how to verify!?!) //href is same file public void launchRemoteFileWithHref() throws Exception { ProcessResult pr = server.executeJavawsHeadless("/" + baseName1); Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); } //remote //have href //should be redownloaded as href is different file @Test public void launchRemoteChangedFileWithHref() throws Exception { File f = prepareChangedFileWithHref(); ProcessResult pr = server.executeJavawsHeadless("/" + f.getName()); Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); } @Test //remote //have not href //should not be redownloaded (how to verify!?!) public void launchRemoteFileWithNoHref() throws Exception { File f = prepareCopiedFileNoHref(); ProcessResult pr = server.executeJavawsHeadless("/" + f.getName()); Assert.assertTrue("Stdout should contain '" + okBase1 + "', but did not.", pr.stdout.contains(okBase1)); } //remote //have not href //should NOT be redownloaded @Test public void launchRemoteChangedFileWithNoHref() throws Exception { File f = prepareChangedFileNoHref(); ProcessResult pr = server.executeJavawsHeadless("/" + f.getName()); Assert.assertTrue("Stdout should contain '" + okBase2 + "', but did not.", pr.stdout.contains(okBase2)); } } icedtea-web-1.8/tests/reproducers/simple/GeneratedId/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745023262 xustar0029 mtime=1552401893.15183259 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/simple/GeneratedId/srcs/0000755000175000002070000000000013441742745024150 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/simple/GeneratedId/srcs/PaxHeaders.7406/GeneratedId.java0000644000000000000000000000013113441742745026355 xustar0029 mtime=1552401893.15183259 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/simple/GeneratedId/srcs/GeneratedId.java0000644000175000002070000000342413441742745027171 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class GeneratedId { static public void main(String[] args) { for(int x = 0; x Test Generated Id IcedTea SomeId icedtea-web-1.8/tests/reproducers/PaxHeaders.7406/signed20000644000000000000000000000013213441742745020200 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/0000755000175000002070000000000013441742745021065 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/PaxHeaders.7406/MultipleSignaturesTestSamePackage0000644000000000000000000000013213441742745026762 xustar0030 mtime=1552401893.144832604 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/0000755000175000002070000000000013441742745027647 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/PaxHeaders.7406/testcase0000644000000000000000000000013213441742745030575 xustar0030 mtime=1552401893.144832604 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/testcases/0000755000175000002070000000000013441742745031645 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/testcases/PaxHeaders.7400000644000000000000000000000034513441742745030700 xustar00139 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/testcases/MultipleSignaturesTestTestsSamePackage.java 30 mtime=1552401893.144832604 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/testcases/MultipleSignat0000644000175000002070000001306713441742745034540 0ustar00jvanekmock00000000000000/* MultipleSignaturesTestTests.java Copyright (C) 20121 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; public class MultipleSignaturesTestTestsSamePackage extends BrowserTest{ public static final String secExcRegex = "(?s).*java.lang.SecurityException: .* signer information does not match signer information of other classes in the same package.*"; public static final String launchExcDiffCerts = "Fatal: Application Error: The JNLP application is not fully signed by a single cert."; public static final List v = Arrays.asList(new String[] {ServerAccess.VERBOSE_OPTION}); private static final String GSJE= "Good simple javaws exapmle"; @Test @NeedsDisplay public void multipleSignaturesTestSamePackageJnlpApplet() throws Exception { ProcessResult pr = server.executeJavaws(v,"/MultipleSignaturesTest2_SamePackage.jnlp"); String s = GSJE; Assert.assertFalse("stdout should NOT contains `"+s+"`, but did",pr.stdout.contains(s)); String ss = "killer was started"; Assert.assertTrue("stdout should contains `"+ss+"`, but did not",pr.stdout.contains(ss)); String sss="Applet killing himself after 2000 ms of life"; Assert.assertTrue("stdout should contains `"+sss+"`, but did not",pr.stdout.contains(sss)); //Applet in jnlp have exception consumed even in verbose mode. Howevwer at least foreign method is not invoken // String cc = "xception"; // Assert.assertTrue("stderr should contains `" + cc + "`, but did not", pr.stderr.contains(cc)); // Assert.assertTrue("stderr should match " + secExcRegex + "`, but did not", pr.stderr.matches(secExcRegex)); } @Test @NeedsDisplay @TestInBrowsers(testIn=Browsers.one) public void multipleSignaturesTestSamePackageHtmlApplet() throws Exception { ProcessResult pr = server.executeBrowser("/MultipleSignaturesTest_SamePackage.html"); String s = GSJE; Assert.assertFalse("stdout should NOT contains `"+s+"`, but did",pr.stdout.contains(s)); String cc = "xception"; Assert.assertTrue("stderr should contains `" + cc + "`, but did not", pr.stderr.contains(cc)); Assert.assertTrue("stderr should match " + secExcRegex + "`, but did not", pr.stderr.matches(secExcRegex)); String ss = "killer was started"; Assert.assertTrue("stdout should contains `"+ss+"`, but did not",pr.stdout.contains(ss)); String sss="Applet killing himself after 2000 ms of life"; Assert.assertTrue("stdout should contains `"+sss+"`, but did not",pr.stdout.contains(sss)); } @Test public void multipleSignaturesTestSamePackageJnlpApplication() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/MultipleSignaturesTest1_SamePackage.jnlp"); String s = GSJE; Assert.assertFalse("stdout should NOT contains `"+s+"`, but did",pr.stdout.contains(s)); String cc = "xception"; Assert.assertTrue("stderr should contains `" + cc + "`, but did not", pr.stderr.contains(cc)); Assert.assertTrue("stderr should match " + secExcRegex + "`, but did not", pr.stderr.matches(secExcRegex)); } @Test public void multipleSignaturesTestSamePackageJnlpApplicationRequesting() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/MultipleSignaturesTest1_SamePackage_requesting.jnlp"); String s = GSJE; Assert.assertFalse("stdout should NOT contain `"+s+"`, but did", pr.stdout.contains(s)); Assert.assertTrue("stderr should contain `" + launchExcDiffCerts + "`, but did not", pr.stderr.contains(launchExcDiffCerts)); } } icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/PaxHeaders.7406/resource0000644000000000000000000000013213441742745030611 xustar0030 mtime=1552401893.110832675 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/0000755000175000002070000000000013441742745031661 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/PaxHeaders.7400000644000000000000000000000034213441742745030711 xustar00136 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignaturesTest2_SamePackage.jnlp 30 mtime=1552401893.110832675 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignat0000644000175000002070000000461413441742745034552 0ustar00jvanekmock00000000000000 MultipleSignaturesTest2_SamePackage IcedTea MultipleSignaturesTest2_SamePackage icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/PaxHeaders.7400000644000000000000000000000034013441742745030707 xustar00135 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignaturesTest_SamePackage.html 29 mtime=1552401893.10383269 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignat0000644000175000002070000000351713441742745034553 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/PaxHeaders.7400000644000000000000000000000035513441742745030715 xustar00147 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignaturesTest1_SamePackage_requesting.jnlp 30 mtime=1552401893.110832675 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignat0000644000175000002070000000446513441742745034556 0ustar00jvanekmock00000000000000 MultipleSignaturesTest1_SamePackage IcedTea MultipleSignaturesTest1_SamePackage icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/PaxHeaders.7400000644000000000000000000000034213441742745030711 xustar00136 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignaturesTest1_SamePackage.jnlp 30 mtime=1552401893.107832681 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignat0000644000175000002070000000437013441742745034551 0ustar00jvanekmock00000000000000 MultipleSignaturesTest1_SamePackage IcedTea MultipleSignaturesTest1_SamePackage icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745027734 xustar0030 mtime=1552401893.112832671 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/srcs/0000755000175000002070000000000013441742745030621 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/srcs/PaxHeaders.7406/Mul0000644000000000000000000000033313441742745030474 xustar00129 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/srcs/MultipleSignaturesTestSamePackage.java 30 mtime=1552401893.112832671 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTestSamePackage/srcs/MultipleSignaturesT0000644000175000002070000000612113441742745034530 0ustar00jvanekmock00000000000000import java.applet.Applet; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /* MultipleSignaturesTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class MultipleSignaturesTestSamePackage extends Applet { public static void main(String[] args) { executeForeignMethodCaught(); } public static void executeForeignMethodCaught() { try { executeForeignMethod(); } catch (Exception ex) { throw new RuntimeException(ex); } } public static void executeForeignMethod() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException { Class clazz = Class.forName("SimpletestSigned1"); Method mainMethod = clazz.getDeclaredMethod("main", String[].class); mainMethod.invoke(clazz.newInstance(), (Object) null); } private static class Killer extends Thread { public static final int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { killer = new Killer(); } @Override public void start() { killer.start(); System.out.println("killer was started"); main(null); } } icedtea-web-1.8/tests/reproducers/signed2/PaxHeaders.7406/MultipleSignaturesTest0000644000000000000000000000013213441742745024700 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/0000755000175000002070000000000013441742745025565 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025652 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/srcs/0000755000175000002070000000000013441742745026537 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/srcs/PaxHeaders.7406/somecrazytestp0000644000000000000000000000013213441742745030746 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/srcs/somecrazytestpackage/0000755000175000002070000000000013441742745032767 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/srcs/somecrazytestpackage/PaxHeader0000644000000000000000000000033213441742745031322 xustar00128 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/srcs/somecrazytestpackage/MultipleSignaturesTest.java 30 mtime=1552401893.120832654 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/srcs/somecrazytestpackage/MultipleS0000644000175000002070000000657713441742745034647 0ustar00jvanekmock00000000000000package somecrazytestpackage; import java.applet.Applet; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /* MultipleSignaturesTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class MultipleSignaturesTest extends Applet { //Ignored when class being called is SimpletestSigned1, used with ReadPropertiesSigned private static final String SYSTEM_PROPERTY = "user.home"; public static void main(String[] args) { executeForeignMethodCaught(args[0]); } public static void executeForeignMethodCaught(String classname) { try { executeForeignMethod(classname); } catch (Exception ex) { throw new RuntimeException(ex); } } public static void executeForeignMethod(String classname) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException { Class clazz = Class.forName(classname); Method mainMethod = clazz.getDeclaredMethod("main", String[].class); mainMethod.invoke(clazz.newInstance(), (Object) new String[] {SYSTEM_PROPERTY}); } private class Killer extends Thread { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { killer = new Killer(); } @Override public void start() { killer.start(); System.out.println("killer was started"); main(new String[]{getParameter("mainclass")}); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026712 xustar0030 mtime=1552401893.143832607 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/0000755000175000002070000000000013441742745027577 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/PaxHeaders.7406/MultipleS0000644000000000000000000000031313441742745030631 xustar00113 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest1.jnlp 30 mtime=1552401893.109832677 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest1.j0000644000175000002070000000437713441742745034546 0ustar00jvanekmock00000000000000 MultipleSignaturesTest1 IcedTea MultipleSignaturesTest1 SimpletestSigned1 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/PaxHeaders.7406/MultipleS0000644000000000000000000000033113441742745030631 xustar00127 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTestUsesPermissions.html 30 mtime=1552401893.143832607 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTestUse0000644000175000002070000000361213441742745034701 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/PaxHeaders.7406/MultipleS0000644000000000000000000000032613441742745030635 xustar00124 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest1_requesting.jnlp 30 mtime=1552401893.102832692 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest1_r0000644000175000002070000000447413441742745034635 0ustar00jvanekmock00000000000000 MultipleSignaturesTest1 IcedTea MultipleSignaturesTest1 SimpletestSigned1 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/PaxHeaders.7406/MultipleS0000644000000000000000000000031213441742745030630 xustar00112 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest.html 30 mtime=1552401893.109832677 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest.ht0000644000175000002070000000360413441742745034637 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/PaxHeaders.7406/MultipleS0000644000000000000000000000031313441742745030631 xustar00113 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest2.jnlp 30 mtime=1552401893.112832671 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest2.j0000644000175000002070000000462413441742745034542 0ustar00jvanekmock00000000000000 MultipleSignaturesTest2 IcedTea MultipleSignaturesTest2 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026676 xustar0030 mtime=1552401893.104832688 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/testcases/0000755000175000002070000000000013441742745027563 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/testcases/PaxHeaders.7406/MultipleS0000644000000000000000000000031713441742745030621 xustar00117 path=icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/testcases/MultipleSignaturesTestTests.java 30 mtime=1552401893.104832688 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/MultipleSignaturesTest/testcases/MultipleSignaturesTestTes0000644000175000002070000001162713441742745034671 0ustar00jvanekmock00000000000000/* MultipleSignaturesTestTests.java Copyright (C) 20121 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; @Bug(id = {"PR822"}) public class MultipleSignaturesTestTests extends BrowserTest{ public static final String GSJE = "Good simple javaws exapmle"; public static final String launchExcDiffCerts = "Fatal: Application Error: The JNLP application is not fully signed by a single cert."; public static final String accExcString = "java.security.AccessControlException: access denied"; @Test @NeedsDisplay public void multipleSignaturesTestJnlpApplet() throws Exception { ProcessResult pr = server.executeJavaws("/MultipleSignaturesTest2.jnlp"); String s = GSJE; Assert.assertTrue("stdout should contains `" + s + "`, but did not", pr.stdout.contains(s)); } @Test @NeedsDisplay @TestInBrowsers(testIn=Browsers.one) public void multipleSignaturesTestHtmlApplet() throws Exception { ProcessResult pr = server.executeBrowser("/MultipleSignaturesTest.html", AutoClose.CLOSE_ON_CORRECT_END); String s = GSJE; Assert.assertTrue("stdout should contains `" + s + "`, but did not", pr.stdout.contains(s)); Assert.assertFalse("stderr should NOT contains `" + accExcString + "`, but did", pr.stderr.contains(accExcString)); } @Test @NeedsDisplay @TestInBrowsers(testIn=Browsers.one) @Bug(id={"PR822"}) public void multipleSignaturesTestHtmlAppletUsesPermissions() throws Exception { ProcessResult pr = server.executeBrowser("/MultipleSignaturesTestUsesPermissions.html", AutoClose.CLOSE_ON_CORRECT_END); // This calls ReadPropertiesSigned with user.home, it is not easy to think of a pattern to match this // Instead we make sure _something_ was printed Assert.assertFalse("stdout should NOT be empty, but was", pr.stdout.isEmpty()); Assert.assertFalse("stderr should NOT contains `" + accExcString + "`, but did", pr.stderr.contains(accExcString)); } @Test public void multipleSignaturesTestJnlpApplication() throws Exception { ProcessResult pr = server.executeJavawsHeadless("/MultipleSignaturesTest1.jnlp"); //well this is questionable - application is signed but is not requesting // permissions, but still usage of foreign code is allowed. String s = GSJE; Assert.assertTrue("stdout should contains `" + s + "`, but did not", pr.stdout.contains(s)); } @Test public void multipleSignaturesTestJnlpApplicationRequesting() throws Exception { // This jar is fully signed - however a JNLP application requires that one of the signers signs everything ProcessResult pr = server.executeJavawsHeadless("/MultipleSignaturesTest1_requesting.jnlp"); String s = GSJE; Assert.assertFalse("stdout should NOT contain `" + s + "`, but did", pr.stdout.contains(s)); Assert.assertTrue("stderr should contain `" + launchExcDiffCerts + "`, but did not", pr.stderr.contains(launchExcDiffCerts)); } } icedtea-web-1.8/tests/reproducers/signed2/PaxHeaders.7406/AppletTestSigned20000644000000000000000000000013213441742745023501 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/AppletTestSigned2/0000755000175000002070000000000013441742745024366 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/AppletTestSigned2/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024453 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/AppletTestSigned2/srcs/0000755000175000002070000000000013441742745025340 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed2/AppletTestSigned2/srcs/PaxHeaders.7406/AppletTestSigned2.j0000644000000000000000000000013213441742745030204 xustar0030 mtime=1552401893.106832684 30 atime=1552402157.269253409 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed2/AppletTestSigned2/srcs/AppletTestSigned2.java0000644000175000002070000000417313441742745031511 0ustar00jvanekmock00000000000000/* AppletTestSigned2.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class AppletTestSigned2 extends Applet { @Override public void init() { System.out.println("AppletTestSigned2 was initialised"); } @Override public void start() { System.out.println("AppletTestSigned2 was started"); } @Override public void stop() { System.out.println("AppletTestSigned2 was stopped"); } @Override public void destroy() { System.out.println("AppletTestSigned2 will be destroyed"); } } icedtea-web-1.8/tests/reproducers/PaxHeaders.7406/signed0000644000000000000000000000013213441742745020116 xustar0030 mtime=1552401893.108832679 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/0000755000175000002070000000000013441742745021003 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/jsengineSigned0000644000000000000000000000013213441742745023052 xustar0030 mtime=1552401893.119832657 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/0000755000175000002070000000000013441742745023737 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024024 xustar0030 mtime=1552401893.143832607 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/srcs/0000755000175000002070000000000013441742745024711 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/srcs/PaxHeaders.7406/jsengineSigned.java0000644000000000000000000000013213441742745027700 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/srcs/jsengineSigned.java0000644000175000002070000000452513441742745030516 0ustar00jvanekmock00000000000000/* jsengineSigned.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class jsengineSigned{ private static final ScriptEngine engine1 = new ScriptEngineManager().getEngineByName("JavaScript"); private static final ScriptEngine engine2 = new ScriptEngineManager(jsengineSigned.class.getClassLoader()).getEngineByName("JavaScript"); private static final ScriptEngine engine3 = new ScriptEngineManager(null).getEngineByName("JavaScript"); public static void main(String[] args){ System.out.println("starting"); System.out.println("A-"+engine1+"-Z"); System.out.println("B-"+engine2+"-Y"); System.out.println("C-"+engine3+"-X"); System.out.println("finished"); } } icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/srcs/PaxHeaders.7406/jsengineAppletSigned.ja0000644000000000000000000000013213441742745030517 xustar0030 mtime=1552401893.143832607 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/srcs/jsengineAppletSigned.java0000644000175000002070000000460613441742745031664 0ustar00jvanekmock00000000000000/* jsengineApplet.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class jsengineAppletSigned extends Applet{ private static final ScriptEngine engine1 = new ScriptEngineManager().getEngineByName("JavaScript"); private static final ScriptEngine engine2 = new ScriptEngineManager(jsengineAppletSigned.class.getClassLoader()).getEngineByName("JavaScript"); private static final ScriptEngine engine3 = new ScriptEngineManager(null).getEngineByName("JavaScript"); @Override public void start(){ System.out.println("starting"); System.out.println("A-"+engine1+"-Z"); System.out.println("B-"+engine2+"-Y"); System.out.println("C-"+engine3+"-X"); System.out.println("finished"); } } icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025064 xustar0030 mtime=1552401893.111832673 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/resources/0000755000175000002070000000000013441742745025751 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/resources/PaxHeaders.7406/jsengineAppletSign0000644000000000000000000000013213441742745030655 xustar0030 mtime=1552401893.109832677 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/resources/jsengineAppletSigned.html0000644000175000002070000000343313441742745032744 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/resources/PaxHeaders.7406/jsengineAppletSign0000644000000000000000000000013213441742745030655 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/resources/jsengineAppletSigned.jnlp0000644000175000002070000000446013441742745032744 0ustar00jvanekmock00000000000000 jsengine IcedTea jsengine icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/resources/PaxHeaders.7406/jsengineSigned.jnl0000644000000000000000000000013213441742745030602 xustar0030 mtime=1552401893.111832673 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/resources/jsengineSigned.jnlp0000644000175000002070000000423713441742745031600 0ustar00jvanekmock00000000000000 jsengineSigned IcedTea jsengineSigned icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745025047 xustar0029 mtime=1552401893.10383269 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/testcases/0000755000175000002070000000000013441742745025735 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/testcases/PaxHeaders.7406/jsengineSignedTest0000644000000000000000000000013113441742745030643 xustar0029 mtime=1552401893.10383269 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/jsengineSigned/testcases/jsengineSignedTest.java0000644000175000002070000001136113441742745032376 0ustar00jvanekmock00000000000000/* jsengineSignedTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import org.junit.Assert; import org.junit.Test; public class jsengineSignedTest extends BrowserTest{ @Test public void jsengineSignedTestcase1() throws Exception { String originalResourceName = "jsengineSigned.jnlp"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + originalResourceName); //ServerAccess.logOutputReprint(pr.stderr); //ServerAccess.logOutputReprint(pr.stdout); Assert.assertTrue(pr.stdout.matches("(?s).*starting.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*A-.*nashorn.*-Z.*") || pr.stdout.matches("(?s)(?i).*A-.*rhino.*-Z.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*B-.*nashorn.*-Y.*") || pr.stdout.matches("(?s)(?i).*B-.*rhino.*-Y.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*C-.*nashorn.*-X.*") || pr.stdout.matches("(?s)(?i).*C-.*rhino.*-X.*")); Assert.assertTrue(pr.stdout.matches("(?s).*finished.*")); } @Test public void jsengineAppletSignedTestcase1() throws Exception { String originalResourceName = "jsengineAppletSigned.jnlp"; ProcessResult pr = server.executeJavawsHeadless(null, "/" + originalResourceName, new StringBasedClosingListener("finished"), null, null); //ServerAccess.logOutputReprint(pr.stderr); //ServerAccess.logOutputReprint(pr.stdout); Assert.assertTrue(pr.stdout.matches("(?s).*starting.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*A-.*nashorn.*-Z.*") || pr.stdout.matches("(?s)(?i).*A-.*rhino.*-Z.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*B-.*nashorn.*-Y.*") || pr.stdout.matches("(?s)(?i).*B-.*rhino.*-Y.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*C-.*nashorn.*-X.*") || pr.stdout.matches("(?s)(?i).*C-.*rhino.*-X.*")); Assert.assertTrue(pr.stdout.matches("(?s).*finished.*")); } @Test @TestInBrowsers(testIn = {Browsers.all}) public void jsengineAppletSignedTestcase2() throws Exception { String originalResourceName = "jsengineAppletSigned.html"; ProcessResult pr = server.executeBrowser("/" + originalResourceName, new StringBasedClosingListener("finished"), null); //ServerAccess.logOutputReprint(pr.stderr); //ServerAccess.logOutputReprint(pr.stdout); Assert.assertTrue(pr.stdout.matches("(?s).*starting.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*A-.*nashorn.*-Z.*") || pr.stdout.matches("(?s)(?i).*A-.*rhino.*-Z.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*B-.*nashorn.*-Y.*") || pr.stdout.matches("(?s)(?i).*B-.*rhino.*-Y.*")); Assert.assertTrue(pr.stdout.matches("(?s)(?i).*C-.*nashorn.*-X.*") || pr.stdout.matches("(?s)(?i).*C-.*rhino.*-X.*")); Assert.assertTrue(pr.stdout.matches("(?s).*finished.*")); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/Spaces can be everywhere signed0000644000000000000000000000013213441742745026025 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/0000755000175000002070000000000013441742745026712 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/PaxHeaders.7406/resources0000644000000000000000000000013213441742745030037 xustar0030 mtime=1552401893.142832609 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/0000755000175000002070000000000013441742745030724 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/PaxHeaders.7406/N0000644000000000000000000000035113441742745030237 xustar00143 path=icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/NotOnly spaces can kill Ф›ХЁФХ™ХО too signed.jnlp 30 mtime=1552401893.108832679 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/NotOnly spaces ca0000644000175000002070000000456513441742745034066 0ustar00jvanekmock00000000000000 Spaces can be everywhere test with few more chars for encoding signed IcedTea AppletTest icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/PaxHeaders.7406/s0000644000000000000000000000032613441742745030306 xustar00124 path=icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/spaces applet Tests signed.html 30 mtime=1552401893.118832658 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/spaces applet Tes0000644000175000002070000000346313441742745034115 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/PaxHeaders.7406/S0000644000000000000000000000033013441742745030241 xustar00126 path=icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/SpacesCanBeEverywhere1signed.jnlp 30 mtime=1552401893.142832609 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/SpacesCanBeEveryw0000644000175000002070000000424513441742745034165 0ustar00jvanekmock00000000000000 Spaces can be everywhere signed IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/PaxHeaders.7406/S0000644000000000000000000000033413441742745030245 xustar00130 path=icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/Spaces can be everywhere1 signed.jnlp 30 mtime=1552401893.101832694 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/Spaces can be eve0000644000175000002070000000424713441742745033725 0ustar00jvanekmock00000000000000 Spaces can be everywhere1 signed IcedTea Spaces can be everywhere1 signed icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/PaxHeaders.7406/S0000644000000000000000000000033413441742745030245 xustar00130 path=icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/Spaces can be everywhere2 signed.jnlp 30 mtime=1552401893.111832673 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/resources/Spaces can be eve0000644000175000002070000000427013441742745033721 0ustar00jvanekmock00000000000000 Spaces can be everywhere2 IcedTea Spaces can be everywhere2 signed icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026777 xustar0030 mtime=1552401893.102832692 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/srcs/0000755000175000002070000000000013441742745027664 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/srcs/PaxHeaders.7406/Spaces0000644000000000000000000000032213441742745030216 xustar00120 path=icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/srcs/SpacesCanBeEverywhereSigned.java 30 mtime=1552401893.102832692 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/srcs/SpacesCanBeEverywhereS0000644000175000002070000000467713441742745034125 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* SpacesCanBeEverywhereSigned.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SpacesCanBeEverywhereSigned extends Applet{ public static void main(String[] args){ System.out.println("Signed spaces can be everywhere.jsr was launched correctly"); } private class Killer extends Thread { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { killer = new Killer(); } @Override public void start() { main(null); killer.start(); System.out.println("killer was started"); } } icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745030023 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/testcases/0000755000175000002070000000000013441742745030710 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/testcases/PaxHeaders.7406/S0000644000000000000000000000033413441742745030231 xustar00130 path=icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/testcases/SpacesCanBeEverywhereTestsSigned.java 30 mtime=1552401893.106832684 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/Spaces can be everywhere signed/testcases/SpacesCanBeEveryw0000644000175000002070000003075413441742745034155 0ustar00jvanekmock00000000000000/* SpacesCanBeEverywhereTestsSigned.java Copyright (C) 20121 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.annotations.TestInBrowsers; import org.junit.Assert; import org.junit.Test; @Bug(id={"http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2011-October/016127.html","PR804","PR811"}) public class SpacesCanBeEverywhereTestsSigned extends BrowserTest { @Bug(id="PR811") @Test @NeedsDisplay public void SpacesCanBeEverywhereLocalAppletTestsJnlp2Signed() throws Exception { List commands=new ArrayList(1); commands.add(server.getJavawsLocation()); commands.add(server.getDir()+"/NotOnly spaces can kill Ф›ХЁФХ™ХО too signed.jnlp"); /* Change of dir is cousing the Exception bellow * ServerAccess.ProcessResult pr = ServerAccess.executeProcess(commands,server.getDir()); * No X11 DISPLAY variable was set, but this program performed an operation which requires it. * at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:173) * at java.awt.Window.(Window.java:476) * at java.awt.Frame.(Frame.java:419) * at java.awt.Frame.(Frame.java:384) * at javax.swing.SwingUtilities$SharedOwnerFrame.(SwingUtilities.java:1754) * at javax.swing.SwingUtilities.getSharedOwnerFrame(SwingUtilities.java:1831) * at javax.swing.JWindow.(JWindow.java:185) * at javax.swing.JWindow.(JWindow.java:137) * at net.sourceforge.jnlp.runtime.JNLPSecurityManager.(JNLPSecurityManager.java:121) * at net.sourceforge.jnlp.runtime.JNLPRuntime.initialize(JNLPRuntime.java:202) * at net.sourceforge.jnlp.runtime.Boot.run(Boot.java:177) * at net.sourceforge.jnlp.runtime.Boot.run(Boot.java:51) * at java.security.AccessController.doPrivileged(Native Method) * at net.sourceforge.jnlp.runtime.Boot.main(Boot.java:168) * * Thats why there is absolute path to the file. * * This is also why SpacesCanBeEverywhereLocalTests1Signed is passing - * it is in headless mode. This can be considered as bug, but because it is * only on ocal files, and probably only from test run - it can be ignored */ ProcessResult pr = ServerAccess.executeProcess(commands); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test @NeedsDisplay public void SpacesCanBeEverywhereRemoteAppletTestsJnlp2Signed() throws Exception { ProcessResult pr = server.executeJavaws("/NotOnly%20spaces%20can%20kill%20%C4%9B%C5%A1%C4%8D%C5%99%C5%BE%20too%20signed.jnlp"); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); Assert.assertFalse("should NOT be terminated, but was not", pr.wasTerminated); } @Bug(id="PR811") @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void SpacesCanBeEverywhereRemoteAppletTestsHtml2Signed() throws Exception { ProcessResult pr = server.executeBrowser("/spaces+applet+Tests+signed.html"); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); Assert.assertTrue("should be terminated, but was not", pr.wasTerminated); } @Bug(id={"PR811","http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2011-October/016144.html"}) @Test public void SpacesCanBeEverywhereRemoteTests1Signed() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/Spaces%20can%20be%20everywhere1%20signed.jnlp"); String s = "Good simple javaws exapmle"; Assert.assertTrue("stdout should contains `" + s + "`, but did not", pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test public void SpacesCanBeEverywhereRemoteTests2Signed() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/Spaces%20can%20be%20everywhere2%20signed.jnlp"); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test public void SpacesCanBeEverywhereRemoteTests2Signed_withQuery1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/Spaces%20can%20be%20everywhere2%20signed.jnlp?test=20"); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test public void SpacesCanBeEverywhereRemoteTests2Signed_withQuery2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/Spaces%20can%20be%20everywhere2%20signed.jnlp?test%3D20"); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR811") @Test public void SpacesCanBeEverywhereRemoteTests3Signed() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/SpacesCanBeEverywhere1signed.jnlp"); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR804") @Test public void SpacesCanBeEverywhereLocalTests1Signed() throws Exception { List commands=new ArrayList(4); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add("Spaces can be everywhere1.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands,server.getDir()); String s = "Good simple javaws exapmle"; Assert.assertTrue("stdout should contains `" + s + "`, but did not", pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR804") @Test public void SpacesCanBeEverywhereLocalTests2Signed() throws Exception { List commands=new ArrayList(4); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add("Spaces can be everywhere2 signed.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands,server.getDir()); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR804") @Test public void SpacesCanBeEverywhereLocalTests4Signed() throws Exception { List commands=new ArrayList(4); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(server.getDir()+"/Spaces can be everywhere2 signed.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Bug(id="PR804") @Test public void SpacesCanBeEverywhereLocalTests3Signed() throws Exception { List commands=new ArrayList(4); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add("SpacesCanBeEverywhere1signed.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands,server.getDir()); String s="Signed spaces can be everywhere.jsr was launched correctly"; Assert.assertTrue("stdout should contains `"+s+"`, but did not",pr.stdout.contains(s)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SignedJnlpTemplate0000644000000000000000000000013213441742745023647 xustar0030 mtime=1552401893.118832658 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/0000755000175000002070000000000013441742745024534 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024621 xustar0030 mtime=1552401893.142832609 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/srcs/0000755000175000002070000000000013441742745025506 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/srcs/PaxHeaders.7406/SignedJnlpTemplate.0000644000000000000000000000013213441742745030430 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/srcs/SignedJnlpTemplate.java0000644000175000002070000000341213441742745032102 0ustar00jvanekmock00000000000000/* SignedJnlpTemplate.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SignedJnlpTemplate { public static void main(String[] args) { System.out.println("Running signed application in main"); } } icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/srcs/PaxHeaders.7406/JNLP-INF0000644000000000000000000000013213441742745025776 xustar0030 mtime=1552401893.142832609 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/srcs/JNLP-INF/0000755000175000002070000000000013441742745026663 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/srcs/JNLP-INF/PaxHeaders.7406/APPLICATIO0000644000000000000000000000013213441742745027423 xustar0030 mtime=1552401893.142832609 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/srcs/JNLP-INF/APPLICATION_TEMPLATE.jnlp0000644000175000002070000000432613441742745032613 0ustar00jvanekmock00000000000000 * IcedTea * icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025661 xustar0030 mtime=1552401893.110832675 30 atime=1552410887.108183454 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/resources/0000755000175000002070000000000013441742745026546 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/resources/PaxHeaders.7406/SignedJnlpTemp0000644000000000000000000000013213441742745030544 xustar0030 mtime=1552401893.107832681 30 atime=1552402157.268253411 30 ctime=1552410887.079183522 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/resources/SignedJnlpTemplate1.jnlp0000644000175000002070000000464613441742745033257 0ustar00jvanekmock00000000000000 SignedJnlpTemplate IcedTea SignedJnlpTemplate icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/resources/PaxHeaders.7406/SignedJnlpTemp0000644000000000000000000000013213441742745030544 xustar0030 mtime=1552401893.101832694 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/resources/SignedJnlpTemplate2.jnlp0000644000175000002070000000467313441742745033260 0ustar00jvanekmock00000000000000 SignedJnlpTemplate IcedTea SignedJnlpTemplate icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/resources/PaxHeaders.7406/SignedJnlpTemp0000644000000000000000000000013213441742745030544 xustar0030 mtime=1552401893.110832675 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/resources/SignedJnlpTemplate3.jnlp0000644000175000002070000000504713441742745033255 0ustar00jvanekmock00000000000000 SignedJnlpTemplate IcedTea SignedJnlpTemplate IcedTea-Web IcedTea icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025645 xustar0030 mtime=1552401893.102832692 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/testcases/0000755000175000002070000000000013441742745026532 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/testcases/PaxHeaders.7406/SignedJnlpTemp0000644000000000000000000000013213441742745030530 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpTemplate/testcases/SignedJnlpTemplateTest.java0000644000175000002070000000665113441742745033776 0ustar00jvanekmock00000000000000/* SignedJnlpTemplateTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class SignedJnlpTemplateTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); private final String signedException = "net.sourceforge.jnlp.LaunchException: Fatal: Application Error: The signed " + "JNLP file did not match the launching JNLP file. Missing Resource: Signed Application did not match " + "launching JNLP File"; @Test public void launchingFileMatchesSignedTemplate1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpTemplate1.jnlp"); String s = "Running signed application in main"; Assert.assertTrue("Stdout should contains " + s + " but did not", pr.stdout.contains(s)); } /** * Missing 'j2se' child within the 'resource' element in the launching JNLP file */ @Test public void launchingFileDoesNotMatchSignedTemplate2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpTemplate2.jnlp"); Assert.assertTrue("Stderr should contains " + signedException + " but did not", pr.stderr.contains(signedException)); } /** * Added an extra "information" element to the launching JNLP file * */ @Test public void launchingFileDoesNotMatchSignedTemplate3() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpTemplate3.jnlp"); Assert.assertTrue("Stderr should contains " + signedException + " but did not", pr.stderr.contains(signedException)); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SignedJnlpCaseTestTwo0000644000000000000000000000013213441742745024301 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/0000755000175000002070000000000013441742745025166 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026277 xustar0030 mtime=1552401893.141832611 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/testcases/0000755000175000002070000000000013441742745027164 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/testcases/PaxHeaders.7406/SignedJnlpC0000644000000000000000000000013213441742745030437 xustar0030 mtime=1552401893.141832611 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/testcases/SignedJnlpCaseTwoTest.java0000644000175000002070000000557213441742745034223 0ustar00jvanekmock00000000000000/* SignedJnlpCaseTwoTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class SignedJnlpCaseTwoTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); @Test public void launchingFileMatchesSigned() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpCaseTestTwo1.jnlp"); String s = "Running signed application in main"; Assert.assertTrue("Stdout should contains " + s + " but did not", pr.stdout.contains(s)); } @Test public void launchingFileDoesNotMatchSigned() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpCaseTestTwo2.jnlp"); String s = "net.sourceforge.jnlp.LaunchException: Fatal: Application Error: The signed " + "JNLP file did not match the launching JNLP file. Missing Resource: Signed Application did not match " + "launching JNLP File"; Assert.assertTrue("Stderr should contains " + s + " but did not", pr.stderr.contains(s)); } } icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025253 xustar0030 mtime=1552401893.110832675 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/srcs/0000755000175000002070000000000013441742745026140 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/srcs/PaxHeaders.7406/JNLP-INF0000644000000000000000000000013213441742745026430 xustar0030 mtime=1552401893.100832696 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/srcs/JNLP-INF/0000755000175000002070000000000013441742745027315 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/srcs/JNLP-INF/PaxHeaders.7406/aPpLiCa0000644000000000000000000000031213441742745027701 xustar00112 path=icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/srcs/JNLP-INF/aPpLiCaTiOn_tEmPlAte.jnlp 30 mtime=1552401893.100832696 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/srcs/JNLP-INF/aPpLiCaTiOn_tEmPlAte.jn0000644000175000002070000000430713441742745033450 0ustar00jvanekmock00000000000000 SignedJnlpCaseTest IcedTea SignedJnlpCaseTest icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/srcs/PaxHeaders.7406/SignedJnlpCase.j0000644000000000000000000000013213441742745030334 xustar0030 mtime=1552401893.110832675 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/srcs/SignedJnlpCase.java0000644000175000002070000000340213441742745031633 0ustar00jvanekmock00000000000000/* SignedJnlpCase.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SignedJnlpCase { public static void main(String[] args) { System.out.println("Running signed application in main"); } } icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026313 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/resources/0000755000175000002070000000000013441742745027200 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/resources/PaxHeaders.7406/SignedJnlpC0000644000000000000000000000013213441742745030453 xustar0030 mtime=1552401893.106832684 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/resources/SignedJnlpCaseTestTwo2.jnlp0000644000175000002070000000443013441742745034333 0ustar00jvanekmock00000000000000 SignedJnlpCaseTest 2 IcedTea SignedJnlpCaseTest 2 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/resources/PaxHeaders.7406/SignedJnlpC0000644000000000000000000000013213441742745030453 xustar0030 mtime=1552401893.106832684 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestTwo/resources/SignedJnlpCaseTestTwo1.jnlp0000644000175000002070000000442413441742745034335 0ustar00jvanekmock00000000000000 SignedJnlpCaseTest IcedTea SignedJnlpCaseTest icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SignedJnlpApplication0000644000000000000000000000013213441742745024337 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/0000755000175000002070000000000013441742745025224 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026335 xustar0030 mtime=1552401893.100832696 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/testcases/0000755000175000002070000000000013441742745027222 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/testcases/PaxHeaders.7406/SignedJnlpA0000644000000000000000000000031313441742745030474 xustar00113 path=icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/testcases/SignedJnlpApplicationTest.java 30 mtime=1552401893.100832696 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/testcases/SignedJnlpApplicationTest.j0000644000175000002070000000673013441742745034464 0ustar00jvanekmock00000000000000/* SignedJnlpApplicationTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class SignedJnlpApplicationTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); private final String signedException = "net.sourceforge.jnlp.LaunchException: Fatal: Application Error: The signed " + "JNLP file did not match the launching JNLP file. Missing Resource: Signed Application did not match " + "launching JNLP File"; @Test public void launchingFileMatchesSignedApplication1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpApplication1.jnlp"); String s = "Running signed application in main"; Assert.assertTrue("Stdout should contains " + s + " but did not", pr.stdout.contains(s)); } /** * Using a different value of name within the 'property' element in the launching JNLP file */ @Test public void launchingFileDoesNotMatchSignedApplication1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpApplication2.jnlp"); Assert.assertTrue("Stderr should contains " + signedException + " but did not", pr.stderr.contains(signedException)); } /** * Missing 'property' child element within 'resource' in the launching JNLP file */ @Test public void launchingFileDoesNotMatchSignedApplication2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpApplication3.jnlp"); Assert.assertTrue("Stderr should contains " + signedException + " but did not", pr.stderr.contains(signedException)); } } icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026351 xustar0030 mtime=1552401893.116832663 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/resources/0000755000175000002070000000000013441742745027236 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/resources/PaxHeaders.7406/SignedJnlpA0000644000000000000000000000013213441742745030507 xustar0030 mtime=1552401893.116832663 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/resources/SignedJnlpApplication1.jnlp0000644000175000002070000000444113441742745034430 0ustar00jvanekmock00000000000000 SignedJnlpApplication IcedTea SignedJnlpApplication icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/resources/PaxHeaders.7406/SignedJnlpA0000644000000000000000000000013213441742745030507 xustar0030 mtime=1552401893.100832696 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/resources/SignedJnlpApplication2.jnlp0000644000175000002070000000501213441742745034424 0ustar00jvanekmock00000000000000 SignedJnlpApplication IcedTea SignedJnlpApplication icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/resources/PaxHeaders.7406/SignedJnlpA0000644000000000000000000000013113441742745030506 xustar0029 mtime=1552401893.10383269 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/resources/SignedJnlpApplication3.jnlp0000644000175000002070000000457713441742745034444 0ustar00jvanekmock00000000000000 SignedJnlpApplication IcedTea SignedJnlpApplication icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025311 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/srcs/0000755000175000002070000000000013441742745026176 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/srcs/PaxHeaders.7406/SignedJnlpApplic0000644000000000000000000000013213441742745030477 xustar0030 mtime=1552401893.106832684 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/srcs/SignedJnlpApplication.java0000644000175000002070000000342013441742745033261 0ustar00jvanekmock00000000000000/* SignedJnlpApplication.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SignedJnlpApplication { public static void main(String[] args) { System.out.println("Running signed application in main"); } } icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/srcs/PaxHeaders.7406/JNLP-INF0000644000000000000000000000013213441742745026466 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/srcs/JNLP-INF/0000755000175000002070000000000013441742745027353 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/srcs/JNLP-INF/PaxHeaders.7406/APPLICA0000644000000000000000000000013213441742745027537 xustar0030 mtime=1552401893.106832684 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpApplication/srcs/JNLP-INF/APPLICATION.jnlp0000644000175000002070000000444113441742745032006 0ustar00jvanekmock00000000000000 SignedJnlpApplication IcedTea SignedJnlpApplication icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SignedJarResource0000644000000000000000000000013213441742745023474 xustar0030 mtime=1552401893.140832613 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/0000755000175000002070000000000013441742745024361 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024446 xustar0030 mtime=1552401893.140832613 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/srcs/0000755000175000002070000000000013441742745025333 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/srcs/PaxHeaders.7406/SignedJarResource.ja0000644000000000000000000000013213441742745030415 xustar0030 mtime=1552401893.140832613 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/srcs/SignedJarResource.java0000644000175000002070000000340013441742745031551 0ustar00jvanekmock00000000000000/* SignedJarResource.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SignedJarResource { public static void main(String[] args){ System.out.println("Running SignedJarResource.."); } } icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025506 xustar0030 mtime=1552401893.108832679 30 atime=1552410887.108183454 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/resources/0000755000175000002070000000000013441742745026373 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/resources/PaxHeaders.7406/SignedJarExtens0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.099832698 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/resources/SignedJarExtension.jnlp0000644000175000002070000000464513441742745033034 0ustar00jvanekmock00000000000000 SignedJarExtension IcedTea SignedJarExtension icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/resources/PaxHeaders.7406/SignedJarResour0000644000000000000000000000013213441742745030554 xustar0030 mtime=1552401893.108832679 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SignedJarResource/resources/SignedJarResource.jnlp0000644000175000002070000000456113441742745032644 0ustar00jvanekmock00000000000000 SignedJarResource IcedTea SignedJarResource icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/ShowDocument0000644000000000000000000000013213441742745022535 xustar0030 mtime=1552401893.105832685 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/ShowDocument/0000755000175000002070000000000013441742745023422 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ShowDocument/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024533 xustar0030 mtime=1552401893.099832698 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/ShowDocument/testcases/0000755000175000002070000000000013441742745025420 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ShowDocument/testcases/PaxHeaders.7406/ShowDocumentTest.jav0000644000000000000000000000013213441742745030571 xustar0030 mtime=1552401893.099832698 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/ShowDocument/testcases/ShowDocumentTest.java0000644000175000002070000000675213441742745031554 0ustar00jvanekmock00000000000000/* ShowDocumentTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import org.junit.Assert; import org.junit.Test; public class ShowDocumentTest { private static ServerAccess server = new ServerAccess(); @Test public void testShowDocumentMain() throws Exception { ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList( new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option, "-J-Ddurl=http://localhost:" + server.getPort() + "/document.txt"}), server.getUrl("ShowDocumentMain.jnlp")); pw.setWriter("curl\n"); pw.addStdOutListener(new StringBasedClosingListener("killer was started")); ProcessResult pr = pw.execute(); Assert.assertFalse("stderr should NOT contains Exception but didn", pr.stderr.contains("Exception")); Assert.assertTrue("stdout hsould read document but didn't", pr.stdout.contains("document appears!")); } @Test public void testShowDocumentApplet() throws Exception { ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList( new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option, "-J-Ddurl=http://localhost:" + server.getPort() + "/document.txt"}), server.getUrl("ShowDocumentApplet.jnlp")); pw.setWriter("curl\n"); pw.addStdOutListener(new StringBasedClosingListener("killer was started")); ProcessResult pr = pw.execute(); Assert.assertFalse("stderr should NOT contains Exception but didn", pr.stderr.contains("Exception")); Assert.assertTrue("stdout hsould read document but didn't", pr.stdout.contains("document appears!")); } } icedtea-web-1.8/tests/reproducers/signed/ShowDocument/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024547 xustar0030 mtime=1552401893.104832688 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/ShowDocument/resources/0000755000175000002070000000000013441742745025434 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ShowDocument/resources/PaxHeaders.7406/ShowDocumentApplet.j0000644000000000000000000000013213441742745030564 xustar0030 mtime=1552401893.100832696 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/ShowDocument/resources/ShowDocumentApplet.jnlp0000644000175000002070000000442713441742745032115 0ustar00jvanekmock00000000000000 ShowDocumentApplet IcedTea ShowDocumentApplet icedtea-web-1.8/tests/reproducers/signed/ShowDocument/resources/PaxHeaders.7406/document.txt0000644000000000000000000000013213441742745027203 xustar0030 mtime=1552401893.104832688 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/ShowDocument/resources/document.txt0000644000175000002070000000003013441742745030004 0ustar00jvanekmock00000000000000document appears! Good. icedtea-web-1.8/tests/reproducers/signed/ShowDocument/resources/PaxHeaders.7406/ShowDocumentMain.jnl0000644000000000000000000000013213441742745030555 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/ShowDocument/resources/ShowDocumentMain.jnlp0000644000175000002070000000423713441742745031553 0ustar00jvanekmock00000000000000 ShowDocumentMain IcedTea ShowDocumentMain icedtea-web-1.8/tests/reproducers/signed/ShowDocument/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023507 xustar0030 mtime=1552401893.105832685 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/ShowDocument/srcs/0000755000175000002070000000000013441742745024374 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ShowDocument/srcs/PaxHeaders.7406/ShowDocument.java0000644000000000000000000000013213441742745027046 xustar0030 mtime=1552401893.105832685 30 atime=1552402157.268253411 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/ShowDocument/srcs/ShowDocument.java0000644000175000002070000000755313441742745027670 0ustar00jvanekmock00000000000000 import java.applet.Applet; import java.net.MalformedURLException; import java.net.URL; import javax.jnlp.BasicService; import javax.jnlp.ServiceManager; import javax.jnlp.UnavailableServiceException; /* SimpleTest2.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class ShowDocument extends Applet { //this is the only reason why it is isgned private static String url = System.getProperty("durl", "http://www-eng-x.llnl.gov/documents/a_document.txt"); private static class Killer extends Thread { public static final int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; public static void main(String[] args) throws MalformedURLException, UnavailableServiceException { // Lookup the javax.jnlp.BasicService object BasicService bs = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService"); // Invoke the showDocument method bs.showDocument(new URL(url)); } public void work1() { try { boolean ok = true; this.getAppletContext().showDocument(new URL(url)); if (!ok) { throw new RuntimeException("document should show"); } } catch (Exception e) { throw new RuntimeException(e); } } public void work2() { try { boolean ok = true; this.getAppletContext().showDocument(new URL(url), ""); if (!ok) { throw new RuntimeException("document should show"); } } catch (Exception e) { throw new RuntimeException(e); } } @Override public void init() { System.out.println("applet was initialised"); killer = new Killer(); } @Override public void start() { System.out.println("applet was started"); work1(); work2(); killer.start(); } @Override public void stop() { System.out.println("applet was stopped"); } @Override public void destroy() { System.out.println("applet will be destroyed"); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SavingCookies0000644000000000000000000000013213441742745022662 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/0000755000175000002070000000000013441742745023547 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SavingCookies/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024660 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/testcases/0000755000175000002070000000000013441742745025545 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SavingCookies/testcases/PaxHeaders.7406/SavingCookiesTests.0000644000000000000000000000013213441742745030525 xustar0030 mtime=1552401893.115832665 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/testcases/SavingCookiesTests.java0000644000175000002070000001713213441742745032203 0ustar00jvanekmock00000000000000/* SavingCookieTests.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ContentReaderListener; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Assert; import org.junit.Test; public class SavingCookiesTests extends BrowserTest { static final String ENTERING_CHECK = "Entered CheckingCookies"; static final String CHECKING_COMPLETION = "Finished CheckingCookies"; static final String SAVING_COMPLETION = "Finished SavingCookies"; private final static List TRUSTALL = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); static class ParallelRun extends Thread { ParallelRun(String url, String completionString) { this.url = url; this.completionString = completionString; this.completed = false; } ProcessResult pr; private String url; private String completionString; volatile boolean completed; @Override public void run() { try { final ContentReaderListener stdoutListener = new ContentReaderListener() { @Override public void charReaded(char ch) { } @Override public synchronized void lineReaded(String s) { if (completionString != null && s.contains(completionString)) { completed = true; } } }; if (url.endsWith(".html")) { pr = server.executeBrowser(url, stdoutListener, null); } else if (url.endsWith(".jnlp")) { pr = server.executeJavawsHeadless(TRUSTALL, url, stdoutListener, null, null); } } catch (Exception ex) { throw new RuntimeException(ex); } finally { completed = true; } } } final String COOKIE_SESSION_CHECK = "Found cookie: TEST=session"; final String COOKIE_PERSISTENT_CHECK = "Found cookie: TEST=persistent"; @Test @TestInBrowsers(testIn = { Browsers.one }) public void AppletCheckCookieIsntSet() throws Exception { final String COOKIE_SANITY_CHECK = "Found cookie: TEST="; ProcessResult pr = server.executeBrowser("/CheckCookie.html"); Assert.assertFalse("stdout should NOT contain '" + COOKIE_SANITY_CHECK + "' but did.", pr.stdout.contains(COOKIE_SANITY_CHECK)); Assert.assertTrue("stdout should contain '" + CHECKING_COMPLETION + "' but did not.", pr.stdout.contains(CHECKING_COMPLETION)); } @Test @TestInBrowsers(testIn = { Browsers.one }) @Bug(id = "PR588") public void AppletSessionCookieShowDoc() throws Exception { ProcessResult pr = server.executeBrowser("/SaveSessionCookieAndGotoCheck.html"); Assert.assertTrue("stdout should contain '" + ENTERING_CHECK + "' but did not.", pr.stdout.contains(ENTERING_CHECK)); Assert.assertTrue("stdout should contain '" + COOKIE_SESSION_CHECK + "' but did not.", pr.stdout.contains(COOKIE_SESSION_CHECK)); } @Test @TestInBrowsers(testIn = { Browsers.one }) @Bug(id = "PR588") public void AppletSessionCookieParallel() throws Exception { ParallelRun save = new ParallelRun("/SaveSessionCookie.html", SAVING_COMPLETION); save.start(); while (!save.completed) { Thread.sleep(100); } ProcessResult check = server.executeBrowser("/CheckCookie.html"); save.join(); Assert.assertTrue("stdout should contain '" + ENTERING_CHECK + "' but did not.", save.pr.stdout.contains(ENTERING_CHECK)); //XXX: It is necessary to check save.pr's stdout, because it does not show up in 'check.stdout' for some reason Assert.assertTrue("stdout should contain '" + COOKIE_SESSION_CHECK + "' but did not.", save.pr.stdout.contains(COOKIE_SESSION_CHECK)); } @Test @TestInBrowsers(testIn = { Browsers.one }) @Bug(id = "PR588") public void AppletSessionCookieSequential() throws Exception { ProcessResult save = server.executeBrowser("/SaveSessionCookie.html"); ProcessResult check = server.executeBrowser("/CheckCookie.html"); Assert.assertTrue("stdout should contain '" + ENTERING_CHECK + "' but did not.", check.stdout.contains(ENTERING_CHECK)); //Session cookies should NOT be intact upon browser close and re-open Assert.assertFalse("stdout should NOT contain '" + COOKIE_SESSION_CHECK + "' but did.", check.stdout.contains(COOKIE_SESSION_CHECK)); } @Test @TestInBrowsers(testIn = { Browsers.one }) @Bug(id = "PR588") public void AppletPersistentCookieShowDoc() throws Exception { ProcessResult pr = server.executeBrowser("/SavePersistentCookieAndGotoCheck.html"); Assert.assertTrue("stdout should contain '" + ENTERING_CHECK + "' but did not.", pr.stdout.contains(ENTERING_CHECK)); Assert.assertTrue("stdout should contain '" + COOKIE_PERSISTENT_CHECK + "' but did not.", pr.stdout.contains(COOKIE_PERSISTENT_CHECK)); } @Test @TestInBrowsers(testIn = { Browsers.one }) @Bug(id = "PR588") public void AppletPersistentCookieSequential() throws Exception { ProcessResult save = server.executeBrowser("/SavePersistentCookie.html"); //Use show doc to clear cookie afterwards ProcessResult check = server.executeBrowser("/CheckCookieAndGotoClear.html"); Assert.assertTrue("stdout should contain '" + ENTERING_CHECK + "' but did not.", check.stdout.contains(ENTERING_CHECK)); //Persistent cookies should be stored past this point Assert.assertTrue("stdout should contain '" + COOKIE_PERSISTENT_CHECK + "' but did not.", check.stdout.contains(COOKIE_PERSISTENT_CHECK)); } } icedtea-web-1.8/tests/reproducers/signed/SavingCookies/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024674 xustar0030 mtime=1552401893.139832615 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/0000755000175000002070000000000013441742745025561 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/PaxHeaders.7406/CheckCookieAndGotoC0000644000000000000000000000013213441742745030422 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/CheckCookieAndGotoClear.html0000644000175000002070000000365113441742745033046 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/PaxHeaders.7406/CheckCookie.html0000644000000000000000000000013213441742745030006 xustar0030 mtime=1552401893.139832615 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/CheckCookie.html0000644000175000002070000000343713441742745030625 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/PaxHeaders.7406/SaveSessionCookieAn0000644000000000000000000000013013441742745030545 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/SaveSessionCookieAndGotoCheck.html0000644000175000002070000000365613441742745034267 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/PaxHeaders.7406/ClearPersistentCook0000644000000000000000000000013213441742745030617 xustar0030 mtime=1552401893.099832698 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/ClearPersistentCookie.html0000644000175000002070000000363313441742745032715 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/PaxHeaders.7406/SavePersistentCooki0000644000000000000000000000031213441742745030640 xustar00112 path=icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/SavePersistentCookieAndGotoCheck.html 30 mtime=1552401893.104832688 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/SavePersistentCookieAndGotoCheck.ht0000644000175000002070000000367413441742745034453 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/PaxHeaders.7406/SavePersistentCooki0000644000000000000000000000013213441742745030640 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/SavePersistentCookie.html0000644000175000002070000000357013441742745032565 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/PaxHeaders.7406/SaveSessionCookie.h0000644000000000000000000000013213441742745030516 xustar0030 mtime=1552401893.104832688 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/resources/SaveSessionCookie.html0000644000175000002070000000356413441742745032053 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SavingCookies/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023634 xustar0030 mtime=1552401893.139832615 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/srcs/0000755000175000002070000000000013441742745024521 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SavingCookies/srcs/PaxHeaders.7406/SavingCookies.java0000644000000000000000000000013213441742745027320 xustar0030 mtime=1552401893.139832615 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/srcs/SavingCookies.java0000644000175000002070000001102613441742745030130 0ustar00jvanekmock00000000000000/* SavingCookies.java Store cookies in the java cookie store, and go to a page that confirms they are there. Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.io.IOException; import java.net.CookieHandler; import java.net.CookieManager; import java.net.HttpCookie; import java.net.URI; import java.net.URL; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; public class SavingCookies extends Applet { // Set up a response header with Set-Cookie static private Map> responseHeaders(String cookie) { List cookies = new ArrayList(); cookies.add(cookie); Map> rh = new HashMap>(); rh.put("Set-Cookie", cookies); rh.put("Cookie", cookies); return rh; } static private void saveCookie(URI uri, String cookie) throws IOException { CookieHandler handler = CookieHandler.getDefault(); if (handler == null) { System.out.println("Failing due to lack of CookieHandler class!"); return; } System.out.println("Using CookieHandler class: " + handler.getClass().getCanonicalName()); System.out.println("Putting " + cookie + " at " + uri.toString()); handler.put(uri, responseHeaders(cookie)); } /* If a show-document param was set, go there */ private void gotoNextDocument() { URL baseURL = getCodeBase(); String nextDocument = getParameter("show-document"); if (nextDocument != null) { try { System.out.println("Calling showDocument(" + nextDocument + ")"); getAppletContext().showDocument(new URL(baseURL.toString() + nextDocument)); } catch (Exception e) { e.printStackTrace(); } } } static private String formatCookie(String cookie, boolean persistent) { if (persistent) { // Put in the cookie date format final int TIMEOUT = 3600; DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss 'GMT'", Locale.US); Calendar cal = Calendar.getInstance(); cal.add(Calendar.SECOND, TIMEOUT); cookie += "; "; cookie += "Expires=" + df.format(cal.getTime()) + "; "; cookie += "Max-Age=" + TIMEOUT + "; "; } return cookie; } @Override public void start() { System.out.println("Entered SavingCookies.java"); URL baseURL = getCodeBase(); try { saveCookie(baseURL.toURI(), formatCookie(getParameter("cookie"), "yes".equals(getParameter("persistent")))); } catch (Exception e) { e.printStackTrace(); } System.out.println("Finished SavingCookies.java"); gotoNextDocument(); } } icedtea-web-1.8/tests/reproducers/signed/SavingCookies/srcs/PaxHeaders.7406/CheckingCookies.java0000644000000000000000000000013213441742745027604 xustar0030 mtime=1552401893.107832681 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SavingCookies/srcs/CheckingCookies.java0000644000175000002070000001010613441742745030412 0ustar00jvanekmock00000000000000/* CheckingCookies.java Confirms that a test cookie is in the cookie store Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.io.IOException; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; public class CheckingCookies extends Applet { static class Killer extends Thread { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing itself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } static private void printCookieInfo(URI uri) throws IOException { CookieHandler handler = CookieHandler.getDefault(); Map> cookieMap = null; if (handler == null) { System.out.println("Failing due to lack of CookieHandler class!"); return; } System.out.println("Using CookieHandler class: " + handler.getClass().getCanonicalName()); cookieMap = handler.get(uri, new HashMap>()); for (Map.Entry> entry : cookieMap.entrySet()) { System.out.println("Iterating cookiemap with " + entry.getKey() + " => " + entry.getValue()); if (entry.getKey().contains("Cookie")) { for (String cookie : entry.getValue()) { System.out.println("Found cookie: " + cookie); } } } } /* If a show-document param was set, go there */ private void gotoNextDocument() { URL baseURL = getCodeBase(); String nextDocument = getParameter("show-document"); if (nextDocument != null) { try { System.out.println("Calling showDocument(" + nextDocument + ")"); getAppletContext().showDocument(new URL(baseURL.toString() + nextDocument)); } catch (Exception e) { e.printStackTrace(); } } } @Override public void start() { System.out.println("Entered CheckingCookies.java"); try { printCookieInfo(getCodeBase().toURI()); } catch (Exception e) { e.printStackTrace(); } System.out.println("Finished CheckingCookies.java"); gotoNextDocument(); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SandboxSignedSandbox0000644000000000000000000000013213441742745024165 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/0000755000175000002070000000000013441742745025052 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025136 xustar0029 mtime=1552401893.10383269 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/srcs/0000755000175000002070000000000013441742745026024 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/srcs/PaxHeaders.7406/SandboxSignedSand0000644000000000000000000000013013441742745030473 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/srcs/SandboxSignedSandbox.java0000644000175000002070000000406113441742745032737 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxSignedSandbox extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013113441742745026276 xustar0029 mtime=1552401893.10383269 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/srcs/META-INF/0000755000175000002070000000000013441742745027164 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/srcs/META-INF/PaxHeaders.7406/MANIFEST0000644000000000000000000000013113441742745027504 xustar0029 mtime=1552401893.10383269 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/srcs/META-INF/MANIFEST.MF0000644000175000002070000000005413441742745030615 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Permissions: sandbox icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026177 xustar0030 mtime=1552401893.138832617 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/0000755000175000002070000000000013441742745027064 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000013213441742745030563 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox.jnlp0000644000175000002070000000425413441742745034025 0ustar00jvanekmock00000000000000 SandboxSignedSandbox IcedTea SandboxSignedSandbox icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000013213441742745030563 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox.html0000644000175000002070000000344413441742745034026 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031413441742745030565 xustar00114 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox_applet.jnlp 30 mtime=1552401893.099832698 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox_applet.0000644000175000002070000000443213441742745034504 0ustar00jvanekmock00000000000000 SandboxSignedSandbox IcedTea SandboxSignedSandbox icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031513441742745030566 xustar00116 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox_security.jnlp 29 mtime=1552401893.10383269 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox_securit0000644000175000002070000000435213441742745034620 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxSignedSandbox icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000032513441742745030567 xustar00123 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox_applet_security.jnlp 30 mtime=1552401893.101832694 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox_applet_0000644000175000002070000000452713441742745034572 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxSignedSandbox icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026163 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.109183452 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/testcases/0000755000175000002070000000000013441742745027050 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/testcases/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031113441742745030546 xustar00111 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/testcases/SandboxSignedSandboxTest.java 30 mtime=1552401893.106832684 30 atime=1552402157.267253413 30 ctime=1552410887.078183524 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedSandbox/testcases/SandboxSignedSandboxTest.jav0000644000175000002070000001476013441742745034471 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxSignedSandboxTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm.restoreProperties(); } @Test //no security dialog //should run in snadbox (jnlp dont have all-permnissions) public void javawsAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedSandbox.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test //no security dialog //pass, crash, invalid combination all-permissions x sandbox public void javawsAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedSandbox_security.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test //no security dialog //should run in snadbox (jnlp dont have all-permnissions) public void javawsAppletAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}),"SandboxSignedSandbox_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition()));//applets have exception flused only in verbose mode? strange... } @Test //no security dialog //pass, crash, invalid combination all-permissions x sandbox public void javawsAppletAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedSandbox_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) //no security dialog //started in sandbox public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxSignedSandbox.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[] {OptionsDefinitions.OPTIONS.HTML.option}), "SandboxSignedSandbox.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SandboxSignedMissing0000644000000000000000000000013113441742745024177 xustar0029 mtime=1552401893.10383269 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/0000755000175000002070000000000013441742745025065 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026176 xustar0030 mtime=1552401893.106832684 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/testcases/0000755000175000002070000000000013441742745027063 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/testcases/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031113441742745030561 xustar00111 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/testcases/SandboxSignedMissingTest.java 30 mtime=1552401893.097832702 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/testcases/SandboxSignedMissingTest.jav0000644000175000002070000001525613441742745034520 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxSignedMissingTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm1 = new DeploymentPropertiesModifier(); private static final DeploymentPropertiesModifier dpm2 = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm1.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); dpm2.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm2.restoreProperties(); dpm1.restoreProperties(); } @Test //no security dialog //crash (jnlp dont have all-permnissions) public void javawsAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedMissing.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test //no security dialog //pass public void javawsAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedMissing_security.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test //no security dialog //crash (jnlp dont have all-permnissions) public void javawsAppletAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}),"SandboxSignedMissing_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition()));//applets have exception flused only in verbose mode? strange... } @Test //no security dialog //pass public void javawsAppletAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedMissing_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) //no security dialog //pass public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxSignedMissing.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[] {OptionsDefinitions.OPTIONS.HTML.option}), "SandboxSignedMissing.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/testcases/PaxHeaders.7406/SandboxSigne0000644000000000000000000000032513441742745030566 xustar00123 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/testcases/SandboxSignedMissingTestHighSecurity.java 30 mtime=1552401893.106832684 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/testcases/SandboxSignedMissingTestHigh0000644000175000002070000002510513441742745034533 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxSignedMissingTestHighSecurity extends BrowserTest { private static final DeploymentPropertiesModifier dpm1 = new DeploymentPropertiesModifier(); private static final DeploymentPropertiesModifier dpm2 = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm1.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); dpm2.setProperties(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ASK_UNSIGNED.toChars()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm2.restoreProperties(); dpm1.restoreProperties(); } @Test // security dialog //crash (jnlp dont have all-permnissions) public void javawsAllPermNoSecurityYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxSignedMissing.jnlp")); pw.setWriter("YES\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } // security dialog //crash (jnlp dont have all-permnissions) @Test public void javawsAllPermNoSecurityNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxSignedMissing.jnlp")); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test // security dialog //pass public void javawsAllPermAllSecurityYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxSignedMissing_security.jnlp")); pw.setWriter("YES\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test // security dialog //pass public void javawsAllPermAllSecurityNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxSignedMissing_security.jnlp")); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test // security dialog //crash (jnlp dont have all-permnissions) public void javawsAppletAllPermNoSecurityYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless", "-verbose"), server.getUrl("SandboxSignedMissing_applet.jnlp")); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("YES\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition()));//applets have exception flused only in verbose mode? strange... } @Test // security dialog //crash (jnlp dont have all-permnissions) public void javawsAppletAllPermNoSecurityNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless", "-verbose"), server.getUrl("SandboxSignedMissing_applet.jnlp")); pw.addStdErrListener(new AutoErrorClosingListener()); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition()));//applets have exception flused only in verbose mode? strange... } @Test //security dialog //pass public void javawsAppletAllPermAllSecurityYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxSignedMissing_applet_security.jnlp")); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("YES\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test //security dialog //pass public void javawsAppletAllPermAllSecurityNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless"), server.getUrl("SandboxSignedMissing_applet_security.jnlp")); pw.addStdErrListener(new AutoErrorClosingListener()); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } //browser do not support headless dialogues //@Test //@TestInBrowsers(testIn = Browsers.one) //no security dialog //pass public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxSignedMissing.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtmlYes() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless", "-html"), server.getUrl("SandboxSignedMissing.html")); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("YES\n"); ProcessResult p = pw.execute(); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtmlNo() throws Exception{ ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList("-headless", "-html"), server.getUrl("SandboxSignedMissing.html")); pw.addStdOutListener(new AutoOkClosingListener()); pw.setWriter("NO\n"); ProcessResult p = pw.execute(); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026212 xustar0030 mtime=1552401893.138832617 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/0000755000175000002070000000000013441742745027077 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031413441742745030600 xustar00114 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing_applet.jnlp 30 mtime=1552401893.113832669 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing_applet.0000644000175000002070000000443513441742745034535 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxSignedMissing icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000013213441742745030576 xustar0030 mtime=1552401893.138832617 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing.jnlp0000644000175000002070000000425413441742745034053 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxSignedMissing icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000032313441742745030600 xustar00123 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing_applet_security.jnlp 28 mtime=1552401893.0988327 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing_applet_0000644000175000002070000000453313441742745034615 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxSignedMissing icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031613441742745030602 xustar00116 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing_security.jnlp 30 mtime=1552401893.101832694 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing_securit0000644000175000002070000000435213441742745034646 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxSignedMissing icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000013213441742745030576 xustar0030 mtime=1552401893.105832685 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing.html0000644000175000002070000000344413441742745034054 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025151 xustar0029 mtime=1552401893.10383269 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/srcs/0000755000175000002070000000000013441742745026037 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013113441742745026311 xustar0029 mtime=1552401893.10383269 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/srcs/META-INF/0000755000175000002070000000000013441742745027177 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/srcs/META-INF/PaxHeaders.7406/MANIFEST0000644000000000000000000000013113441742745027517 xustar0029 mtime=1552401893.10383269 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/srcs/META-INF/MANIFEST.MF0000644000175000002070000000002713441742745030630 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/srcs/PaxHeaders.7406/SandboxSignedMiss0000644000000000000000000000013113441742745030535 xustar0029 mtime=1552401893.10383269 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedMissing/srcs/SandboxSignedMissing.java0000644000175000002070000000406113441742745032765 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxSignedMissing extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SandboxSignedInvalid0000644000000000000000000000013213441742745024155 xustar0030 mtime=1552401893.102832692 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/0000755000175000002070000000000013441742745025042 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026153 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/testcases/0000755000175000002070000000000013441742745027040 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/testcases/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031113441742745030536 xustar00111 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/testcases/SandboxSignedInvalidTest.java 30 mtime=1552401893.096832704 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/testcases/SandboxSignedInvalidTest.jav0000644000175000002070000001435513441742745034451 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxSignedInvalidTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm.restoreProperties(); } @Test //no security dialog //crash (jnlp dont have all-permnissions) public void javawsAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedInvalid.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test //no security dialog //pass public void javawsAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedInvalid_security.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test //no security dialog //crash (jnlp dont have all-permnissions) public void javawsAppletAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedInvalid_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test //no security dialog //pass public void javawsAppletAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedInvalid_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) //no security dialog //pass public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxSignedInvalid.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[] {OptionsDefinitions.OPTIONS.HTML.option}), "SandboxSignedInvalid.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026167 xustar0030 mtime=1552401893.137832619 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/0000755000175000002070000000000013441742745027054 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031413441742745030555 xustar00114 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid_applet.jnlp 30 mtime=1552401893.113832669 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid_applet.0000644000175000002070000000443313441742745034465 0ustar00jvanekmock00000000000000 SandboxSignedInvalid IcedTea SandboxSignedInvalid icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000013213441742745030553 xustar0030 mtime=1552401893.137832619 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid.jnlp0000644000175000002070000000425413441742745034005 0ustar00jvanekmock00000000000000 SandboxSignedInvalid IcedTea SandboxSignedInvalid icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000032313441742745030555 xustar00123 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid_applet_security.jnlp 28 mtime=1552401893.0988327 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid_applet_0000644000175000002070000000453113441742745034545 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxSignedInvalid icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031613441742745030557 xustar00116 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid_security.jnlp 30 mtime=1552401893.100832696 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid_securit0000644000175000002070000000435213441742745034600 0ustar00jvanekmock00000000000000 SandboxSignedMissing IcedTea SandboxSignedInvalid icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000013213441742745030553 xustar0030 mtime=1552401893.105832685 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid.html0000644000175000002070000000344413441742745034006 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025127 xustar0030 mtime=1552401893.102832692 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/srcs/0000755000175000002070000000000013441742745026014 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013213441742745026267 xustar0030 mtime=1552401893.102832692 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/srcs/META-INF/0000755000175000002070000000000013441742745027154 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/srcs/META-INF/PaxHeaders.7406/MANIFEST0000644000000000000000000000013213441742745027475 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/srcs/META-INF/MANIFEST.MF0000644000175000002070000000006113441742745030603 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Permissions: invalidValue icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/srcs/PaxHeaders.7406/SandboxSignedInva0000644000000000000000000000013213441742745030475 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedInvalid/srcs/SandboxSignedInvalid.java0000644000175000002070000000406113441742745032717 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxSignedInvalid extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SandboxSignedAllPerm0000644000000000000000000000013213441742745024123 xustar0030 mtime=1552401893.101832694 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/0000755000175000002070000000000013441742745025010 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026121 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/testcases/0000755000175000002070000000000013441742745027006 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/testcases/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031113441742745030504 xustar00111 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/testcases/SandboxSignedAllPermTest.java 30 mtime=1552401893.096832704 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/testcases/SandboxSignedAllPermTest.jav0000644000175000002070000001440313441742745034357 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxSignedAllPermTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm.restoreProperties(); } @Test //no security dialog //crash (jnlp dont have all-permnissions) public void javawsAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedAllPerm.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[] {OptionsDefinitions.OPTIONS.HTML.option}), "SandboxSignedAllPerm.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test //no security dialog //pass public void javawsAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedAllPerm_security.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test //no security dialog //crash (jnlp dont have all-permnissions) public void javawsAppletAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "SandboxSignedAllPerm_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); //applets have exception flused only in verbose mode? strange... } @Test //no security dialog //pass public void javawsAppletAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("SandboxSignedAllPerm_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) //no security dialog //pass public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("SandboxSignedAllPerm.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026135 xustar0030 mtime=1552401893.137832619 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/0000755000175000002070000000000013441742745027022 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031413441742745030523 xustar00114 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm_applet.jnlp 30 mtime=1552401893.112832671 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm_applet.0000644000175000002070000000441713441742745034403 0ustar00jvanekmock00000000000000 SandboxSignedAllPerm IcedTea SandboxSignedAllPerm icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000013213441742745030521 xustar0030 mtime=1552401893.137832619 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm.jnlp0000644000175000002070000000425413441742745033721 0ustar00jvanekmock00000000000000 SandboxSignedAllPerm IcedTea SandboxSignedAllPerm icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000032513441742745030525 xustar00123 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm_applet_security.jnlp 30 mtime=1552401893.097832702 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm_applet_0000644000175000002070000000453513441742745034465 0ustar00jvanekmock00000000000000 SandboxSignedAllPerm IcedTea SandboxSignedAllPerm icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000031613441742745030525 xustar00116 path=icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm_security.jnlp 30 mtime=1552401893.100832696 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm_securit0000644000175000002070000000435213441742745034514 0ustar00jvanekmock00000000000000 SandboxSignedAllPerm IcedTea SandboxSignedAllPerm icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/PaxHeaders.7406/SandboxSigne0000644000000000000000000000013213441742745030521 xustar0030 mtime=1552401893.104832688 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm.html0000644000175000002070000000344413441742745033722 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025075 xustar0030 mtime=1552401893.102832692 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/srcs/0000755000175000002070000000000013441742745025762 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013213441742745026235 xustar0030 mtime=1552401893.101832694 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/srcs/META-INF/0000755000175000002070000000000013441742745027122 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/srcs/META-INF/PaxHeaders.7406/MANIFEST0000644000000000000000000000013213441742745027443 xustar0030 mtime=1552401893.101832694 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/srcs/META-INF/MANIFEST.MF0000644000175000002070000000006413441742745030554 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Permissions: all-permissions icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/srcs/PaxHeaders.7406/SandboxSignedAllP0000644000000000000000000000013213441742745030376 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SandboxSignedAllPerm/srcs/SandboxSignedAllPerm.java0000644000175000002070000000406113441742745032633 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SandboxSignedAllPerm extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SOPBypassSigned0000644000000000000000000000013213441742745023073 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SOPBypassSigned/0000755000175000002070000000000013441742745023760 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SOPBypassSigned/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024045 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SOPBypassSigned/srcs/0000755000175000002070000000000013441742745024732 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SOPBypassSigned/srcs/PaxHeaders.7406/SOPBypassSigned.java0000644000000000000000000000013213441742745027742 xustar0030 mtime=1552401893.095832706 30 atime=1552402157.267253413 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/SOPBypassSigned/srcs/SOPBypassSigned.java0000644000175000002070000002670113441742745030560 0ustar00jvanekmock00000000000000/* SOPBypass.java Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.MalformedURLException; import java.net.Socket; import java.net.URL; import java.net.URLConnection; import java.security.AccessController; import java.security.AccessControlException; import java.security.PrivilegedAction; public class SOPBypassSigned extends Applet { private String unrelatedUrl; private String reachableResource; private String resourcesUrl; @Override public void init(){ setUnrelatedUrl(this.getParameter("unrelatedUrl")); setReachableResource(this.getParameter("reachableResource")); setResourcesUrl(this.getParameter("resourceUrl")); } @Override public void start() { System.out.println("Applet Started"); System.out.println("Codebase URL: " + getCodeBase()); System.out.println("DocumentBase URL: " + getDocumentBase()); System.out.println("unrelatedUrl: " + unrelatedUrl); AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { checkPrivilege(); attemptSocketConnectionToCodebase(); attemptSocketConnectionToDocumentBase(); attemptSocketConnectionToUnrelated(); attemptSocketConnectionToResourcesLoc(); attemptUrlConnectionToCodebase(); attemptUrlConnectionToDocumentBase(); attemptUrlConnectionToUnrelated(); attemptUrlConnectionToResourcesLoc(); return true; } }); System.out.println("*** APPLET FINISHED ***"); } void checkPrivilege() { boolean canRead = false; try { System.getProperty("user.home"); canRead = true; } catch (AccessControlException ace) { ace.printStackTrace(); canRead = false; } System.out.println("Elevated privileges: " + canRead); } void attemptSocketConnectionToCodebase() { String host = getCodeBase().getHost(); int port = getCodeBase().getPort(); attemptSocketConnection(host, port, reachableResource, "codeBase", true); } void attemptSocketConnectionToDocumentBase() { String host = getDocumentBase().getHost(); int port = getDocumentBase().getPort(); attemptSocketConnection(host, port, reachableResource, "documentBase", true); } void attemptSocketConnectionToUnrelated() { String host = "example.com"; int port = 80; if (unrelatedUrl != null){ host=extractHost(unrelatedUrl); port=extractPort(unrelatedUrl); } attemptSocketConnection(host, port, reachableResource, "unrelated", true); } void attemptSocketConnectionToResourcesLoc() { String host = getCodeBase().getHost(); int port = getCodeBase().getPort(); //if resources url was null, then it was probably from codebase if (resourcesUrl != null){ host=extractHost(resourcesUrl); port=extractPort(resourcesUrl); } attemptSocketConnection(host, port, reachableResource, "resource's", true); } void attemptSocketConnection(String host, int port, String resource, String id, boolean sendData) { boolean connected = true; try { final Socket local = new Socket(); local.bind(null); local.connect(new InetSocketAddress(host, port)); final BufferedReader br = new BufferedReader(new InputStreamReader(local.getInputStream())); final PrintWriter writer = new PrintWriter(local.getOutputStream(), true); if (sendData) { writer.println("GET /" + reachableResource + " HTTP/1.1"); writer.println("Host: " + "itwTest"); writer.println("Accept: */*"); writer.println("User-Agent: Java"); //used to it to much writer.println(""); // Important, else the server will expect that there's more into the request. writer.flush(); String s = getText(br); System.out.println("" + s); if (s == null || s.trim().isEmpty()) { connected = false; } local.close(); } } catch (Exception e) { connected = false; e.printStackTrace(); } System.out.println("SocketConnection:" + id + " " + connected); } void attemptUrlConnectionToCodebase() { attemptUrlConnection(getCodeBase(), reachableResource, "codeBase"); } void attemptUrlConnectionToDocumentBase() { attemptUrlConnection(getDocumentBase(), reachableResource, "documentBase"); } void attemptUrlConnectionToUnrelated() { try { if (unrelatedUrl == null) { attemptUrlConnection(new URL("http://example.com:80"), reachableResource, "unrelated"); } else { attemptUrlConnection(new URL(unrelatedUrl), reachableResource, "unrelated"); } } catch (MalformedURLException e) { e.printStackTrace(); System.out.println("Unrelated URL test failed due to MalformedURLException"); System.out.println("URLConnection:unrelated false"); } } void attemptUrlConnectionToResourcesLoc() { try { if (resourcesUrl == null) { //if resources url was null, then it was probably from codebase attemptUrlConnection(getCodeBase(), reachableResource, "resource's"); } else { attemptUrlConnection(new URL(resourcesUrl), reachableResource, "resource's"); } } catch (MalformedURLException e) { e.printStackTrace(); System.out.println("resource's URL test failed due to MalformedURLException"); System.out.println("URLConnection:resource's false"); } } void attemptUrlConnection(URL url, String resource, String id) { boolean connected = true; try { URLConnection conn = url.openConnection(); conn.connect(); conn.getContentEncoding(); conn.getContentLength(); conn.getContentType(); if (resource != null) { URLConnection connn = concateUrlAndResource(url, resource).openConnection(); connn.connect(); connn.getContentEncoding(); connn.getContentLength(); connn.getContentType(); String s = getText(connn.getInputStream()); System.out.println("" + s); if (s == null || s.trim().isEmpty()) { connected = false; } } } catch (Exception e) { connected = false; e.printStackTrace(); } System.out.println("URLConnection:" + id + " " + connected); } public static void main(String[] args) { //args = new String[]{"SOPBypass-filtered.html", "http://localhost:44321"}; SOPBypassSigned sop = new SOPBypassSigned(); if (args.length > 0) { sop.setReachableResource(args[0]); } if (args.length > 1) { sop.setUnrelatedUrl(args[1]); } if (args.length > 2) { sop.setResourcesUrl(args[2]); } sop.start(); } private void setUnrelatedUrl(String s) { unrelatedUrl = s; } private void setReachableResource(String s) { reachableResource = s; } public void setResourcesUrl(String resourcesUrl) { this.resourcesUrl = resourcesUrl; } static private String extractHost(String unrelatedUrl) { String s[] = unrelatedUrl.split(":"); while (s[1].startsWith("/")) { s[1] = s[1].substring(1); } return s[1]; } static private int extractPort(String unrelatedUrl) { String s[] = unrelatedUrl.split(":"); if (s.length < 3) { return 80; } //protocol:host:port or //protocol:i:p:...:v:6:port int i = s.length - 1; try { return new Integer(s[i]); } catch (NumberFormatException ex) { //nope } return 80; } private URL concateUrlAndResource(URL url, String resource) { String s = url.toExternalForm(); String badResource1 = resource.replace("-filtered", ""); String badResource2 = badResource1.replace("Signed", ""); //see testcases for usages s = s.replace("/codebase/", "/"); s = s.replace("/"+badResource1, "/"); s = s.replace("/"+badResource2, "/"); try { //docbase may have it if (s.endsWith(resource)) { return new URL(s); } if (s.endsWith("/")) { s = s + resource; } else { s = s + "/" + resource; } return new URL(s); } catch (MalformedURLException ex) { //jsut adding resource to vlaisd url. //should not happen, if so, die later return null; } } public static String getText(InputStream is) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(is)); try { return getText(in); } finally { in.close(); } } public static String getText(BufferedReader in) throws Exception { StringBuilder response = new StringBuilder(); String inputLine; while ((inputLine = in.readLine()) != null) { response.append(inputLine); } return response.toString(); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/ReadPropertiesSigned0000644000000000000000000000013213441742745024200 xustar0030 mtime=1552401893.104832688 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/0000755000175000002070000000000013441742745025065 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025152 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/srcs/0000755000175000002070000000000013441742745026037 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/srcs/PaxHeaders.7406/ReadPropertiesSig0000644000000000000000000000013213441742745030545 xustar0030 mtime=1552401893.095832706 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/srcs/ReadPropertiesSigned.java0000644000175000002070000000354113441742745032767 0ustar00jvanekmock00000000000000/* ReadPropertiesSigned.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class ReadPropertiesSigned { /** *some system property is expected as arg[0], eg user.name or user.home */ public static void main(String[] args) { System.out.println(System.getProperty(args[0])); } } icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026212 xustar0030 mtime=1552401893.101832694 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/resources/0000755000175000002070000000000013441742745027077 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/resources/PaxHeaders.7406/ReadProperti0000644000000000000000000000013213441742745030612 xustar0030 mtime=1552401893.100832696 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned1.jnlp0000644000175000002070000000072313441742745034131 0ustar00jvanekmock00000000000000 read properties using System.getenv() IcedTea user.name icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/resources/PaxHeaders.7406/ReadProperti0000644000000000000000000000013213441742745030612 xustar0030 mtime=1552401893.101832694 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned2.jnlp0000644000175000002070000000101313441742745034123 0ustar00jvanekmock00000000000000 read properties using System.getenv() IcedTea user.name icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/PaxHeaders.7406/README0000644000000000000000000000013013441742745025133 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/README0000644000175000002070000000016413441742745025746 0ustar00jvanekmock00000000000000This test is relied on by custom/MultipleSignaturesPerJar. Any changes to this reproducer may require updates there.icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026176 xustar0030 mtime=1552401893.104832688 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/testcases/0000755000175000002070000000000013441742745027063 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/testcases/PaxHeaders.7406/ReadProperti0000644000000000000000000000031113441742745030575 xustar00111 path=icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/testcases/ReadPropertiesSignedTest.java 30 mtime=1552401893.104832688 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesSigned/testcases/ReadPropertiesSignedTest.jav0000644000175000002070000001023013441742745034503 0ustar00jvanekmock00000000000000/* ReadPropertiesSignedTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class ReadPropertiesSignedTest { private static ServerAccess server = new ServerAccess(); private final List l=Collections.unmodifiableList(Arrays.asList(new String[] {"-Xtrustall"})); String accessMatcher = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.util.PropertyPermission.{0,5}" + "user.name.{0,5}read" + ".*"; @Test public void ReadSignedPropertiesWithoutPermissionsWithXtrustAll() throws Exception { //no request for permissions ProcessResult pr=server.executeJavawsHeadless(l,"/ReadPropertiesSigned1.jnlp"); Assert.assertTrue("Stderr should match "+accessMatcher+" but did not",pr.stderr.matches(accessMatcher)); String ss="ClassNotFoundException"; Assert.assertFalse("Stderr should not contains "+ss+" but did",pr.stderr.contains(ss)); Assert.assertFalse("should not be terminated but was",pr.wasTerminated); Assert.assertEquals((Integer)1, pr.returnValue); } @Test public void ReadSignedPropertiesWithPermissionsWithXtrustAll() throws Exception { //request for allpermissions ProcessResult pr=server.executeJavawsHeadless(l,"/ReadPropertiesSigned2.jnlp"); Assert.assertFalse("Stderr should NOT match "+accessMatcher+" but did",pr.stderr.matches(accessMatcher)); String ss="ClassNotFoundException"; Assert.assertFalse("Stderr should not contains "+ss+" but did",pr.stderr.contains(ss)); Assert.assertFalse("should not be terminated but was",pr.wasTerminated); Assert.assertEquals((Integer)0, pr.returnValue); } @Test public void EnsureXtrustallNotAffectingUnsignedBehaviour() throws Exception { ProcessResult pr=server.executeJavawsHeadless(l,"/ReadProperties1.jnlp"); Assert.assertTrue("Stderr should match "+accessMatcher+" but did not",pr.stderr.matches(accessMatcher)); String ss="ClassNotFoundException"; Assert.assertFalse("Stderr should not contains "+ss+" but did",pr.stderr.contains(ss)); Assert.assertFalse("should not be terminated but was",pr.wasTerminated); Assert.assertEquals((Integer)1, pr.returnValue); ProcessResult pr2=server.executeJavawsHeadless(null,"/ReadProperties1.jnlp"); Assert.assertEquals(pr.stderr, pr2.stderr); Assert.assertEquals(pr.stdout, pr2.stdout); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/MultiJar-SignedJnlpTemplate0000644000000000000000000000013213441742745025374 xustar0030 mtime=1552401893.099832698 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/0000755000175000002070000000000013441742745026261 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745026345 xustar0029 mtime=1552401893.10383269 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/0000755000175000002070000000000013441742745027233 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/PaxHeaders.7406/JNLP-INF0000644000000000000000000000013213441742745027523 xustar0030 mtime=1552401893.094832708 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/JNLP-INF/0000755000175000002070000000000013441742745030410 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/JNLP-INF/PaxHeaders.7406/A0000644000000000000000000000032013441742745027702 xustar00118 path=icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/JNLP-INF/APPLICATION_TEMPLATE.jnlp 30 mtime=1552401893.094832708 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/JNLP-INF/APPLICATION_TEMPL0000644000175000002070000000440413441742745033041 0ustar00jvanekmock00000000000000 Matching Signed Jnlp Template IcedTea Matching Signed Jnlp Template icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/PaxHeaders.7406/SignedJnlp0000644000000000000000000000013113441742745030402 xustar0029 mtime=1552401893.10383269 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/SignedJnlpTemplate.java0000644000175000002070000000471613441742745033637 0ustar00jvanekmock00000000000000/* SignedJnlpTemplate.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.lang.reflect.*; public class SignedJnlpTemplate { public static void run() { System.out.println("**Running SignedJnlpTemplate"); } @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) throws Exception { System.out.println("Starting application with signed application_template jnlp"); //No parameters Class noparam[] = {}; //Run SignedJnlpApplication Class c1 = Class.forName("SignedJnlpApplication"); Method m1 = c1.getDeclaredMethod("run", noparam); m1.invoke(c1); //Run SimpleApplication Class c2 = Class.forName("SimpleApplication"); Method m2 = c2.getDeclaredMethod("run", noparam); m2.invoke(c2); System.out.println("Ending application with signed application_template jnlp"); } } icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027406 xustar0030 mtime=1552401893.100832696 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/resources/0000755000175000002070000000000013441742745030273 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/resources/PaxHeaders.7406/MainJ0000644000000000000000000000033513441742745030411 xustar00131 path=icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/resources/MainJarWithMatchingSignedJnlpTemplate.jnlp 30 mtime=1552401893.099832698 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/resources/MainJarWithMatchingSi0000644000175000002070000000543613441742745034352 0ustar00jvanekmock00000000000000 Matching Signed Jnlp Template IcedTea Matching Signed Jnlp Template icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/resources/PaxHeaders.7406/MainJ0000644000000000000000000000033713441742745030413 xustar00133 path=icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/resources/MainJarWithUnmatchingSignedJnlpTemplate.jnlp 30 mtime=1552401893.100832696 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpTemplate/resources/MainJarWithUnmatching0000644000175000002070000000560413441742745034416 0ustar00jvanekmock00000000000000 XXXXXXX - THIS FILE DOES NOT MATCH THE SIGNED JNLP TEMPLATE FILE - XXXXXXX IcedTea XXXXXXX - THIS FILE DOES NOT MATCH THE SIGNED JNLP TEMPLATE FILE - XXXXXXX icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/MultiJar-NoSignedJnlp0000644000000000000000000000013213441742745024175 xustar0030 mtime=1552401893.099832698 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/0000755000175000002070000000000013441742745025062 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025147 xustar0030 mtime=1552401893.094832708 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/srcs/0000755000175000002070000000000013441742745026034 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/srcs/PaxHeaders.7406/SimpleApplicatio0000644000000000000000000000013213441742745030406 xustar0030 mtime=1552401893.094832708 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/srcs/SimpleApplication.java0000644000175000002070000000465513441742745032326 0ustar00jvanekmock00000000000000/* SimpleApplication.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.lang.reflect.*; public class SimpleApplication { public static void run() { System.out.println("**Running SimpleApplication"); } @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) throws Exception { System.out.println("Starting application without a Signed Jnlp"); //No parameters Class noparam[] = {}; //Run SignedJnlpApplication Class c1 = Class.forName("SignedJnlpApplication"); Method m1 = c1.getDeclaredMethod("run", noparam); m1.invoke(c1); //Run SignedJnlpTemplate Class c2 = Class.forName("SignedJnlpTemplate"); Method m2 = c2.getDeclaredMethod("run", noparam); m2.invoke(c2); System.out.println("Ending application without a Signed Jnlp"); } } icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026207 xustar0030 mtime=1552401893.099832698 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/resources/0000755000175000002070000000000013441742745027074 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/resources/PaxHeaders.7406/MainJarWith0000644000000000000000000000031213441742745030364 xustar00112 path=icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/resources/MainJarWithoutSignedJnlp.jnlp 30 mtime=1552401893.099832698 30 atime=1552402157.266253416 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/MultiJar-NoSignedJnlp/resources/MainJarWithoutSignedJnlp.jn0000644000175000002070000000540513441742745034314 0ustar00jvanekmock00000000000000 Main Jar does have a signed jnlp IcedTea Main Jar does have a signed jnlp icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/LoadResources0000644000000000000000000000013213441742745022670 xustar0030 mtime=1552401893.097832702 30 atime=1552410887.109183452 30 ctime=1552410887.077183527 icedtea-web-1.8/tests/reproducers/signed/LoadResources/0000755000175000002070000000000013441742745023555 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/LoadResources/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024666 xustar0030 mtime=1552401893.093832711 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/testcases/0000755000175000002070000000000013441742745025553 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/LoadResources/testcases/PaxHeaders.7406/LoadResourcesTest.j0000644000000000000000000000013213441742745030530 xustar0030 mtime=1552401893.093832711 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/testcases/LoadResourcesTest.java0000644000175000002070000002407013441742745032033 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Assert; import org.junit.Test; public class LoadResourcesTest { private static final ServerAccess server = new ServerAccess(); static void checkLaunched(ProcessResult pr, boolean app1, boolean javaws) { String s11 = "LoadResources started"; String s12 = "LoadResourcesPackaged started"; if (app1) { assertContains(s12, pr); assertNotContains(s11, pr); } else { assertContains(s11, pr); assertNotContains(s12, pr); } if (!javaws) { String c01 = "[CONSTRUCTOR]context(some.file): Pass - "; //without fix for 2968, this fails assertContains(c01, pr); String c02 = "[CONSTRUCTOR]class(some.file): Pass - "; assertContains(c02, pr); String c03 = "[CONSTRUCTOR]system(some.file): Fail - "; //why so?, still everywhere... assertContains(c03, pr); String c04 = "[CONSTRUCTOR]context(LoadResources.class): Pass - "; //without fix for 2968, this fails assertContains(c04, pr); String c05 = "[CONSTRUCTOR]class(LoadResources.class): Pass - "; assertContains(c05, pr); String c06 = "[CONSTRUCTOR]system(LoadResources.class): Fail - "; assertContains(c06, pr); String c07 = "[CONSTRUCTOR]context(some/pkg/LoadResourcesPackaged.class): Pass - "; assertContains(c07, pr); String c08 = "[CONSTRUCTOR]class(some/pkg/LoadResourcesPackaged.class): Pass - "; assertContains(c08, pr); String c09 = "[CONSTRUCTOR]system(some/pkg/LoadResourcesPackaged.class): Fail - "; assertContains(c09, pr); String c10 = "[CONSTRUCTOR]this(some.file): Pass - "; assertContains(c10, pr); String c11 = "[CONSTRUCTOR]this(LoadResources.class): Pass - "; assertContains(c11, pr); String c12 = "[CONSTRUCTOR]this(some/pkg/LoadResourcesPackaged.class): Pass - "; assertContains(c12, pr); String c13 = "[INIT]context(some.file): Fail - "; // this is weird. Why fix for 2968 fixed only constructor? assertContains(c13, pr); String c14 = "[INIT]class(some.file): Pass - "; //safest as ususlly assertContains(c14, pr); String c15 = "[INIT]system(some.file): Fail - "; //failing as usually assertContains(c15, pr); String c16 = "[INIT]context(LoadResources.class): Fail - "; // this is weird. Why fix for 2968 fixed only constructor? assertContains(c16, pr); String c17 = "[INIT]class(LoadResources.class): Pass - "; assertContains(c17, pr); String c18 = "[INIT]system(LoadResources.class): Fail - "; assertContains(c18, pr); String c19 = "[INIT]context(some/pkg/LoadResourcesPackaged.class): Fail - "; assertContains(c19, pr); String c20 = "[INIT]class(some/pkg/LoadResourcesPackaged.class): Pass - "; assertContains(c20, pr); String c21 = "[INIT]system(some/pkg/LoadResourcesPackaged.class): Fail - "; assertContains(c21, pr); String c22 = "[INIT]this(some.file): Pass - "; assertContains(c22, pr); String c23 = "[INIT]this(LoadResources.class): Pass - "; assertContains(c23, pr); String c24 = "[INIT]this(some/pkg/LoadResourcesPackaged.class): Pass - "; assertContains(c24, pr); String c25 = "[START]context(some.file): Fail - "; //still the surprise assertContains(c15, pr); String c26 = "[START]class(some.file): Pass - "; assertContains(c16, pr); String c27 = "[START]system(some.file): Fail - "; assertContains(c27, pr); String c28 = "[START]context(LoadResources.class): Fail - "; assertContains(c28, pr); String c29 = "[START]class(LoadResources.class): Pass - "; assertContains(c29, pr); String c30 = "[START]system(LoadResources.class): Fail - "; assertContains(c30, pr); String c31 = "[START]context(some/pkg/LoadResourcesPackaged.class): Fail - "; assertContains(c31, pr); String c32 = "[START]class(some/pkg/LoadResourcesPackaged.class): Pass - "; assertContains(c32, pr); String c33 = "[START]system(some/pkg/LoadResourcesPackaged.class): Fail - "; assertContains(c33, pr); String c34 = "[START]this(some.file): Pass - "; assertContains(c34, pr); String c35 = "[START]this(LoadResources.class): Pass - "; assertContains(c35, pr); String c36 = "[START]this(some/pkg/LoadResourcesPackaged.class): Pass - "; assertContains(c36, pr); } else { String c1 = "[MAIN]context(some.file): Pass - "; //javaws was never affeted by 2968 assertContains(c1, pr); String c2 = "[MAIN]class(some.file): Pass - "; assertContains(c2, pr); String c3 = "[MAIN]system(some.file): Fail - "; assertContains(c3, pr); String c4 = "[MAIN]context(LoadResources.class): Pass - "; //interesting difference compared to start/init of same call assertContains(c4, pr); String c5 = "[MAIN]class(LoadResources.class): Pass - "; assertContains(c5, pr); String c6 = "[MAIN]system(LoadResources.class): Fail - "; assertContains(c6, pr); String c7 = "[MAIN]context(some/pkg/LoadResourcesPackaged.class): Pass - "; //interesting difference compared to start/init of same call assertContains(c7, pr); String c8 = "[MAIN]class(some/pkg/LoadResourcesPackaged.class): Pass - "; assertContains(c8, pr); String c9 = "[MAIN]system(some/pkg/LoadResourcesPackaged.class): Fail - "; assertContains(c9, pr); } } private static void assertContains(String c01, ProcessResult pr) { Assert.assertTrue("loadResourcesTest stdout should contains " + c01 + " bud didn't", pr.stdout.contains(c01)); } private static void assertNotContains(String s11, ProcessResult pr) { Assert.assertFalse("loadResourcesTest stdout should contains " + s11 + " bud didn", pr.stdout.contains(s11)); } @Test public void loadResourcesTest1() throws Exception { //with args, dont forget -jnlp final List args = Arrays.asList(new String[]{ OptionsDefinitions.OPTIONS.ARG.option, "type1", "some.file", OptionsDefinitions.OPTIONS.JNLP.option}); ProcessResult pr = server.executeJavawsHeadless(args, "/LoadResources1.jnlp"); checkLaunched(pr, false, true); } @Test public void loadResourcesTest2() throws Exception { //with args, dont forget -jnlp final List args = Arrays.asList(new String[]{ OptionsDefinitions.OPTIONS.ARG.option, "type1", "some.file", OptionsDefinitions.OPTIONS.JNLP.option}); ProcessResult pr = server.executeJavawsHeadless(args, "/LoadResources2.jnlp"); checkLaunched(pr, true, true); } @Test @Bug(id = "2968") public void loadResourcesAppletTest1() throws Exception { //with args, dont forget -jnlp final List args = Arrays.asList(new String[]{ OptionsDefinitions.OPTIONS.JNLP.option}); ProcessResult pr = server.executeJavawsHeadless(args, "/LoadResourcesApplet1.jnlp", new AutoOkClosingListener(), null, null); checkLaunched(pr, false, false); } @Test @Bug(id = "2968") public void loadResourcesTestApplet2() throws Exception { //with args, dont forget -jnlp final List args = Arrays.asList(new String[]{ OptionsDefinitions.OPTIONS.JNLP.option}); ProcessResult pr = server.executeJavawsHeadless(args, "/LoadResourcesApplet2.jnlp", new AutoOkClosingListener(), null, null); checkLaunched(pr, true, false); } } icedtea-web-1.8/tests/reproducers/signed/LoadResources/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024702 xustar0030 mtime=1552401893.134832625 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/resources/0000755000175000002070000000000013441742745025567 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/LoadResources/resources/PaxHeaders.7406/LoadResourcesApplet0000644000000000000000000000013213441742745030622 xustar0030 mtime=1552401893.109832677 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/resources/LoadResourcesApplet1.jnlp0000644000175000002070000000444713441742745032466 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/signed/LoadResources/resources/PaxHeaders.7406/LoadResources2.jnlp0000644000000000000000000000013213441742745030500 xustar0030 mtime=1552401893.134832625 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/resources/LoadResources2.jnlp0000644000175000002070000000432513441742745031314 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/signed/LoadResources/resources/PaxHeaders.7406/LoadResourcesApplet0000644000000000000000000000013213441742745030622 xustar0030 mtime=1552401893.094832708 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/resources/LoadResourcesApplet2.jnlp0000644000175000002070000000451113441742745032457 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/signed/LoadResources/resources/PaxHeaders.7406/LoadResources1.jnlp0000644000000000000000000000013213441742745030477 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/resources/LoadResources1.jnlp0000644000175000002070000000430413441742745031310 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/signed/LoadResources/PaxHeaders.7406/srcs0000644000000000000000000000013013441742745023640 xustar0028 mtime=1552401893.0988327 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/srcs/0000755000175000002070000000000013441742745024527 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/LoadResources/srcs/PaxHeaders.7406/LoadResourcesPackaged.ja0000644000000000000000000000013013441742745030423 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/srcs/LoadResourcesPackaged.java0000644000175000002070000001371413441742745031572 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package some.pkg; import java.applet.Applet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; //import javax.swing.JApplet; /** * Intentionally copypasted so LoadResource and LoadResource packed do not call * each other or climb outside of its pacakage */ //public class LoadResourcesPackaged extends JApplet { public class LoadResourcesPackaged extends Applet { public static final String PASS = "Pass"; public static final String FAIL = "Fail"; public static final String CONTEXT = "context"; public static final String CLASS = "class"; public static final String SYSTEM = "system"; public static final String[] STATIC_LOADERS = new String[]{CONTEXT, CLASS, SYSTEM}; public static final String THIS = "this"; public static final String[] INSTANCE_LOADERS = new String[]{THIS}; public static String[] FILES = new String[]{"some.file", "LoadResources.class", "some/pkg/LoadResourcesPackaged.class"}; private static String phase; static { System.out.println("LoadResourcesPackaged started"); } public static void main(String[] args) { phase = "MAIN"; checkAllStatic(); } public LoadResourcesPackaged() { phase = "CONSTRUCTOR"; checkAllStatic(); checkAllInstance(); } @Override public void init() { phase = "INIT"; checkAllStatic(); checkAllInstance(); } @Override public void start() { phase = "START"; checkAllStatic(); checkAllInstance(); System.out.println("*** APPLET FINISHED ***"); } private static void checkAllStatic() { for (String file : FILES) { for (String loader : STATIC_LOADERS) { checkStaticOnly(loader, file); } } } private void checkAllInstance() { for (String file : FILES) { for (String loader : INSTANCE_LOADERS) { checkInstance(loader, file); } } } private static void checkStaticOnly(String clType, String resource) { title(clType, resource); try { //we need catch exception both in classlaoder check and resource check ClassLoader cl = getStaticClassLoader(clType); String res = read(getResource(cl, resource)); pass(res); } catch (Exception ex) { fail(ex); ex.printStackTrace(); } } private static void fail(Exception ex) { System.out.println(FAIL + " - " + ex.getMessage()); } private static void pass(String res) { System.out.println(PASS + " - " + res); } private static void title(String clType, String resource) { System.out.print("[" + phase + "]" + clType + "(" + resource + "): "); System.err.print("[" + phase + "]" + clType + "(" + resource + "): "); } private void checkInstance(String clType, String resource) { title(clType, resource); try { //we need catch exception both in classlaoder check and resource check ClassLoader cl = getInstanceClassLoader(clType); String res = read(getResource(cl, resource)); pass(res); } catch (Exception ex) { fail(ex); ex.printStackTrace(); } } private static ClassLoader getStaticClassLoader(String type) { switch (type) { case CONTEXT: return Thread.currentThread().getContextClassLoader(); case CLASS: return LoadResourcesPackaged.class .getClassLoader(); case SYSTEM: return ClassLoader.getSystemClassLoader(); } return null; } private ClassLoader getInstanceClassLoader(String type) { switch (type) { case THIS: return this.getClass().getClassLoader(); } return null; } private static InputStream getResource(ClassLoader classLoader, String arg) { return classLoader.getResourceAsStream(arg); } private static String read(java.io.InputStream is) throws IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.US_ASCII))) { return br.readLine(); } } } icedtea-web-1.8/tests/reproducers/signed/LoadResources/srcs/PaxHeaders.7406/LoadResources.java0000644000000000000000000000013213441742745027334 xustar0030 mtime=1552401893.097832702 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/srcs/LoadResources.java0000644000175000002070000001362113441742745030147 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; //import javax.swing.JApplet; /** * Intentionally copypasted so LoadResource and LoadResource packed do not call * each other or climb outside of its pacakage */ //public class LoadResources extends JApplet{ public class LoadResources extends Applet { public static final String PASS = "Pass"; public static final String FAIL = "Fail"; public static final String CONTEXT = "context"; public static final String CLASS = "class"; public static final String SYSTEM = "system"; public static final String[] STATIC_LOADERS = new String[]{CONTEXT, CLASS, SYSTEM}; public static final String THIS = "this"; public static final String[] INSTANCE_LOADERS = new String[]{THIS}; public static String[] FILES = new String[]{"some.file", "LoadResources.class", "some/pkg/LoadResourcesPackaged.class"}; private static String phase; static { System.out.println("LoadResources started"); } public static void main(String[] args) { phase = "MAIN"; checkAllStatic(); } public LoadResources() { phase = "CONSTRUCTOR"; checkAllStatic(); checkAllInstance(); } @Override public void init() { phase = "INIT"; checkAllStatic(); checkAllInstance(); } @Override public void start() { phase = "START"; checkAllStatic(); checkAllInstance(); System.out.println("*** APPLET FINISHED ***"); } private static void checkAllStatic() { for (String file : FILES) { for (String loader : STATIC_LOADERS) { checkStaticOnly(loader, file); } } } private void checkAllInstance() { for (String file : FILES) { for (String loader : INSTANCE_LOADERS) { checkInstance(loader, file); } } } private static void checkStaticOnly(String clType, String resource) { title(clType, resource); try { //we need catch exception both in classlaoder check and resource check ClassLoader cl = getStaticClassLoader(clType); String res = read(getResource(cl, resource)); pass(res); } catch (Exception ex) { fail(ex); ex.printStackTrace(); } } private static void fail(Exception ex) { System.out.println(FAIL + " - " + ex.getMessage()); } private static void pass(String res) { System.out.println(PASS + " - " + res); } private static void title(String clType, String resource) { System.out.print("[" + phase + "]" + clType + "(" + resource + "): "); System.err.print("[" + phase + "]" + clType + "(" + resource + "): "); } private void checkInstance(String clType, String resource) { title(clType, resource); try { //we need catch exception both in classlaoder check and resource check ClassLoader cl = getInstanceClassLoader(clType); String res = read(getResource(cl, resource)); pass(res); } catch (Exception ex) { fail(ex); ex.printStackTrace(); } } private static ClassLoader getStaticClassLoader(String type) { switch (type) { case CONTEXT: return Thread.currentThread().getContextClassLoader(); case CLASS: return LoadResources.class .getClassLoader(); case SYSTEM: return ClassLoader.getSystemClassLoader(); } return null; } private ClassLoader getInstanceClassLoader(String type) { switch (type) { case THIS: return this.getClass().getClassLoader(); } return null; } private static InputStream getResource(ClassLoader classLoader, String arg) { return classLoader.getResourceAsStream(arg); } private static String read(java.io.InputStream is) throws IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.US_ASCII))) { return br.readLine(); } } } icedtea-web-1.8/tests/reproducers/signed/LoadResources/srcs/PaxHeaders.7406/some.file0000644000000000000000000000013013441742745025521 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/LoadResources/srcs/some.file0000644000175000002070000000001213441742745026324 0ustar00jvanekmock00000000000000some text icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/Kemtrakpro0000644000000000000000000000013013441742745022233 xustar0028 mtime=1552401893.0988327 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/0000755000175000002070000000000013441742745023122 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024233 xustar0030 mtime=1552401893.093832711 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/testcases/0000755000175000002070000000000013441742745025120 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/testcases/PaxHeaders.7406/KemtrakTests.java0000644000000000000000000000013213441742745027574 xustar0030 mtime=1552401893.093832711 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/testcases/KemtrakTests.java0000644000175000002070000002331313441742745030406 0ustar00jvanekmock00000000000000/* Copyright (C) 20121 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.util.AbstractMap; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.util.FileUtils; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @Bug(id = {"PR3350"}) /** * The issue is visible only in manifest attributes on, so this is manual * reproducer, automated in head */ public class KemtrakTests extends BrowserTest { private static final ServerAccess SERVER = new ServerAccess(); private static final String JNLP_APPLET_ORIG = "Kemtrak.jnlp"; private static final String JNLP_APP_ORIG = "Kemtrak_javaws.jnlp"; private static final String JNLP_APPLET_CODEBASED = "Kemtrak_cb.jnlp"; private static final String JNLP_APP_CODEBASED = "Kemtrak_javaws_cb.jnlp"; @BeforeClass public static void prepareCodebasedFiles() throws IOException { /** * Kemtrak added the codebase="." during fixing the pr3350 then pr3351 * rised */ File dir = SERVER.getDir(); File jnlp1 = new File(dir, JNLP_APPLET_ORIG); File jnlp2 = new File(dir, JNLP_APP_ORIG); File jnlp12 = new File(dir, JNLP_APPLET_CODEBASED); File jnlp22 = new File(dir, JNLP_APP_CODEBASED); String file1 = FileUtils.loadFileAsString(jnlp1); String file2 = FileUtils.loadFileAsString(jnlp2); file1=addCodebase(file1); file2=addCodebase(file2); file1 = file1.replaceAll(JNLP_APPLET_ORIG, JNLP_APPLET_CODEBASED); file2 = file2.replaceAll(JNLP_APP_ORIG, JNLP_APP_CODEBASED); FileUtils.saveFile(file1, jnlp12); FileUtils.saveFile(file2, jnlp22); } private static String addCodebase(String s){ return s.replaceFirst("version=\"1.302.1.29\"", "version=\"1.302.1.29\" codebase=\".\""); } @Bug(id = "PR3350") @Test public void KemtrakTest1() throws Exception { DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier dm = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier( new AbstractMap.SimpleEntry<>( DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ALL.name()), new AbstractMap.SimpleEntry<>( DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ASK_UNSIGNED.name())); try { dm.setProperties(); ProcessWrapper pw = new ProcessWrapper(SERVER.getJavawsLocation(), Arrays.asList(new String[]{ServerAccess.HEADLES_OPTION}), SERVER.getUrl(JNLP_APPLET_ORIG)); pw.setWriter("YES\nYES\n"); pw.addStdOutListener(new StringBasedClosingListener("kemtrak finished")); ProcessResult pr = pw.execute(); Assert.assertTrue("Stdout should contain Kemtrak1 but did not", pr.stdout.contains("Kemtrak1")); Assert.assertTrue("Stdout should contain Kemtrak2 but did not", pr.stdout.contains("Kemtrak2")); Assert.assertTrue("Stdout should contain jcalendar1 but did not", pr.stdout.contains("jcalendar1")); } finally { dm.restoreProperties(); } } @Bug(id = "PR3351") @KnownToFail @Test public void KemtrakTest2() throws Exception { ProcessWrapper pw = new ProcessWrapper(SERVER.getJavawsLocation(), Arrays.asList(new String[]{ ServerAccess.HEADLES_OPTION, OptionsDefinitions.OPTIONS.PARAM.option, "closeJar=closeJar", OptionsDefinitions.OPTIONS.JNLP.option}), SERVER.getUrl(JNLP_APPLET_CODEBASED)); pw.setWriter("YES\nYES\n"); pw.addStdOutListener(new StringBasedClosingListener("kemtrak finished")); ProcessResult pr = pw.execute(); Assert.assertTrue("Stdout should contain Kemtrak1 but did not", pr.stdout.contains("Kemtrak1")); Assert.assertTrue("Stdout should contain Kemtrak2 but did not", pr.stdout.contains("Kemtrak2")); Assert.assertTrue("Stdout should contain jcalendar2 but did not", pr.stdout.contains("jcalendar2")); } @Test public void KemtrakTest_javaws1() throws Exception { DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier dm = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier( new AbstractMap.SimpleEntry<>( DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ALL.name()), new AbstractMap.SimpleEntry<>( DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ASK_UNSIGNED.name())); try { dm.setProperties(); ProcessWrapper pw = new ProcessWrapper(SERVER.getJavawsLocation(), Arrays.asList(new String[]{ServerAccess.HEADLES_OPTION}), SERVER.getUrl(JNLP_APP_ORIG)); pw.setWriter("YES\nYES\n"); pw.addStdOutListener(new StringBasedClosingListener("kemtrak finished")); ProcessResult pr = pw.execute(); Assert.assertFalse("Stdout must nor contain Kemtrak1 but did not", pr.stdout.contains("Kemtrak1")); Assert.assertTrue("Stdout should contain Kemtrak2 but did not", pr.stdout.contains("Kemtrak2")); Assert.assertTrue("Stdout should contain jcalendar1 but did not", pr.stdout.contains("jcalendar1")); } finally { dm.restoreProperties(); } } @Bug(id = "PR3351") @KnownToFail @Test public void KemtrakTest_javaws2() throws Exception { ProcessWrapper pw = new ProcessWrapper(SERVER.getJavawsLocation(), Arrays.asList(new String[]{ ServerAccess.HEADLES_OPTION, OptionsDefinitions.OPTIONS.ARG.option, "closeJar", SERVER.getUrl().toExternalForm()+"/", OptionsDefinitions.OPTIONS.JNLP.option}), SERVER.getUrl(JNLP_APP_CODEBASED)); pw.setWriter("YES\nYES\n"); pw.addStdOutListener(new StringBasedClosingListener("kemtrak finished")); ProcessResult pr = pw.execute(); Assert.assertFalse("Stdout must not contain Kemtrak1 but did not", pr.stdout.contains("Kemtrak1")); Assert.assertTrue("Stdout should contain Kemtrak2 but did not", pr.stdout.contains("Kemtrak2")); Assert.assertTrue("Stdout should contain jcalendar2 but did not", pr.stdout.contains("jcalendar2")); } @Test /** * We can see that issue is not reproducible outside itw */ public void KemtrakTest_java() throws Exception { ProcessWrapper pw = new ProcessWrapper(System.getProperty("java.home")+"/bin/java", Arrays.asList(new String[]{ "-cp", new File(SERVER.getDir(), "jcalendar.jar").getAbsolutePath()+File.pathSeparator+new File(SERVER.getDir(), "Kemtrakpro.jar").getAbsolutePath(), "Kemtrak", "closeJar", }), SERVER.getDir().toURI().toURL().toExternalForm()+"/"); pw.setWriter("YES\nYES\n"); pw.addStdOutListener(new StringBasedClosingListener("kemtrak finished")); ProcessResult pr = pw.execute(); Assert.assertFalse("Stdout must not contain Kemtrak1 but did not", pr.stdout.contains("Kemtrak1")); Assert.assertTrue("Stdout should contain Kemtrak2 but did not", pr.stdout.contains("Kemtrak2")); Assert.assertTrue("Stdout should contain jcalendar2 but did not", pr.stdout.contains("jcalendar2")); } } icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024247 xustar0030 mtime=1552401893.097832702 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/resources/0000755000175000002070000000000013441742745025134 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/resources/PaxHeaders.7406/Kemtrak.jnlp0000644000000000000000000000013213441742745026607 xustar0030 mtime=1552401893.094832708 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/resources/Kemtrak.jnlp0000644000175000002070000000344313441742745027423 0ustar00jvanekmock00000000000000 Kemtrak 007 Kemtrak AB icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/resources/PaxHeaders.7406/Kemtrak_javaws.jnlp0000644000000000000000000000013213441742745030162 xustar0030 mtime=1552401893.097832702 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/resources/Kemtrak_javaws.jnlp0000644000175000002070000000300113441742745030764 0ustar00jvanekmock00000000000000 Kemtrak 007 Kemtrak AB icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/PaxHeaders.7406/srcs0000644000000000000000000000013013441742745023205 xustar0028 mtime=1552401893.0988327 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/srcs/0000755000175000002070000000000013441742745024074 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/srcs/PaxHeaders.7406/Kemtrak.java0000644000000000000000000000013013441742745025523 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/srcs/Kemtrak.java0000644000175000002070000001067113441742745026342 0ustar00jvanekmock00000000000000/* Copyright (C) 2017 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.io.File; import java.io.IOException; import java.lang.reflect.*; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; public class Kemtrak extends Applet { private class Killer extends Thread { public int n = 1000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; public static void main(String[] args) throws IOException { System.out.println("Kemtrak2"); if (args.length == 2 && args[0].equals("closeJar")) { String cbase = args[1]; System.out.println("Closing Jar!"); URL localURL = new java.net.URL("jar", "", cbase + "jcalendar.jar!/"); JarURLConnection localObject3 = (java.net.JarURLConnection) localURL.openConnection(); java.util.jar.JarFile localJarFile = ((java.net.JarURLConnection) localObject3).getJarFile(); String str9 = localJarFile.getName(); int i3 = localJarFile.size(); localJarFile.close(); System.out.println("jcalendar " + localURL + " " + str9 + ", entrie: " + i3); //if one call inisde jcalendar.jar (jcalendar1() and/or jcalendar2) *BEFORE* closing, issue is NOT hit jcalendar2(); } else { jcalendar1(); } System.out.println("kemtrak finished"); } @Override public void init() { try { System.out.println("Kemtrak1"); String cj = this.getParameter("closeJar"); if ("closeJar".equals(cj)) { Kemtrak.main(new String[]{"closeJar", getCodeBase().toExternalForm()}); } else { Kemtrak.main(new String[0]); } } catch (IOException u) { throw new RuntimeException(u); } finally { killer = new Killer(); killer.start(); } } //we use reflection only to avoid jcalendar.jar on classpath public static void jcalendar1() { try { Class signedAppletClass = Class.forName("jcalendar"); Method m = signedAppletClass.getMethod("main1", String[].class); m.invoke(null, (Object) null); } catch (Exception e) { throw new RuntimeException(e); } } public static void jcalendar2() { try { Class signedAppletClass = Class.forName("jcalendar"); Method m = signedAppletClass.getMethod("main2", String[].class); m.invoke(null, (Object) null); } catch (Exception e) { throw new RuntimeException(e); } } } icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013013441742745024345 xustar0028 mtime=1552401893.0988327 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/srcs/META-INF/0000755000175000002070000000000013441742745025234 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/srcs/META-INF/PaxHeaders.7406/MANIFEST.MF0000644000000000000000000000013013441742745026054 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/Kemtrakpro/srcs/META-INF/MANIFEST.MF0000644000175000002070000000035713441742745026673 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Created-By: 1.6.0 (Sun Microsystems Inc.) Permissions: all-permissions Trusted-Only: true Application-Name: Kemtrak Main-Class: Kemtrak Class-path: jcalendar.jar Codebase: * Application-Library-Allowable-Codebase: * icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/InternalClassloaderWithDownloadedResource0000644000000000000000000000013213441742745030414 xustar0030 mtime=1552401893.134832625 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/0000755000175000002070000000000013441742745031301 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/PaxHeaders.7406/t0000644000000000000000000000013213441742745030657 xustar0030 mtime=1552401893.109832677 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/testcases/0000755000175000002070000000000013441742745033277 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/testcases/PaxHead0000644000000000000000000000036313441742745031307 xustar00153 path=icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/testcases/InternalClassloaderWithDownloadedResourceTest.java 30 mtime=1552401893.109832677 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/testcases/Interna0000644000175000002070000001407513441742745034631 0ustar00jvanekmock00000000000000/* InternalClassloaderWithDownloadedResourceTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @Bug(id = {"RH816592","PR858"}) public class InternalClassloaderWithDownloadedResourceTest extends BrowserTest { private final List l = Collections.unmodifiableList(Arrays.asList(new String[]{"-verbose", "-Xtrustall", "-J-Dserveraccess.port=" + server.getPort()})); private static final File portsFile = new File(System.getProperty("java.io.tmpdir"), "serveraccess.port"); @Before public void setUp() { try { ServerAccess.logOutputReprint("Writeing " + server.getPort() + " to " + portsFile.getAbsolutePath()); ServerAccess.saveFile("" + server.getPort(), portsFile); ServerAccess.logOutputReprint("done"); } catch (Exception ex) { ServerAccess.logException(ex); } } @After public void tearDown() { ServerAccess.logOutputReprint("Deleting " + portsFile.getAbsolutePath()); boolean b = portsFile.delete(); ServerAccess.logOutputReprint("Deletion state (should be true) is " + b); } @Test @Bug(id = {"RH816592","PR858"}) public void launchInternalClassloaderWithDownloadedResourceAsJnlpApplication() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/InternalClassloaderWithDownloadedResource-new.jnlp"); evaluate(pr); Assert.assertFalse("should not be terminated but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } private void evaluate(ProcessResult pr) { String ss = "Good simple javaws exapmle"; Assert.assertTrue("Stdout should contains " + ss + " but didn't", pr.stdout.contains(ss)); } @Test @Bug(id = {"RH816592","PR858"}) public void launchInternalClassloaderWithDownloadedResourceAsJnlpApplet() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/InternalClassloaderWithDownloadedResource-applet-new.jnlp"); evaluate(pr); Assert.assertFalse("should not be terminated but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Test @Bug(id = {"RH816592","PR858"}) @NeedsDisplay @TestInBrowsers(testIn={Browsers.all}) public void launchInternalClassloaderWithDownloadedResourceAsHtmlApplet() throws Exception { ProcessResult pr = server.executeBrowser("/InternalClassloaderWithDownloadedResource-new.html"); evaluate(pr); Assert.assertTrue("should be terminated but was not", pr.wasTerminated); } @Test @Bug(id = {"http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-May/018737.html"}) public void launchInternalClassloaderWithDownloadedResourceAsJnlpApplicationHack() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/InternalClassloaderWithDownloadedResource-hack.jnlp"); evaluate(pr); Assert.assertFalse("should not be terminated but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Test @Bug(id = {"http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-May/018737.html"}) public void launchInternalClassloaderWithDownloadedResourceAsJnlpAppletHack() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/InternalClassloaderWithDownloadedResource-applet-hack.jnlp"); evaluate(pr); Assert.assertFalse("should not be terminated but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Test @NeedsDisplay @Bug(id = {"http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-May/018737.html"}) @TestInBrowsers(testIn={Browsers.all}) public void launchInternalClassloaderWithDownloadedResourceAsHtmlAppletHack() throws Exception { ProcessResult pr = server.executeBrowser("/InternalClassloaderWithDownloadedResource-hack.html"); evaluate(pr); Assert.assertTrue("should be terminated but was not", pr.wasTerminated); } } icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/PaxHeaders.7406/s0000644000000000000000000000013213441742745030656 xustar0030 mtime=1552401893.134832625 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/srcs/0000755000175000002070000000000013441742745032253 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/srcs/PaxHeaders.70000644000000000000000000000035213441742745031140 xustar00144 path=icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/srcs/InternalClassloaderWithDownloadedResource.java 30 mtime=1552401893.134832625 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/srcs/InternalClas0000644000175000002070000001435213441742745034562 0ustar00jvanekmock00000000000000/* InternalClassloaderWithDownloadedResource.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; public class InternalClassloaderWithDownloadedResource extends Applet { public static void main(String[] args) throws Exception { int port = 44321; //debug default String sPort = System.getProperty("serveraccess.port"); if (sPort != null) { port = new Integer(sPort); } if (args.length != 1) { throw new IllegalArgumentException("exactly one argument expected"); } resolveArgument(args[0], port); } private static void downlaodAndExecuteForeignMethod(int port, int classlaoder) throws SecurityException, InvocationTargetException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, MalformedURLException, IllegalArgumentException { URL url = new URL("http://localhost:" + port + "/SimpletestSigned1.jar"); URLClassLoader ucl = null; if (classlaoder == 1) { ucl = (URLClassLoader) InternalClassloaderWithDownloadedResource.class.getClassLoader(); System.out.println("Downloading " + url.toString()); Method privateStringMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); privateStringMethod.setAccessible(true); privateStringMethod.invoke(ucl, url); } else if (classlaoder == 2) { ucl = new URLClassLoader(new URL[]{url}); } else { throw new IllegalArgumentException("just 1 or 2 classlaoder id expected"); } executeForeignMethod(port, ucl); } private static void executeForeignMethod(int port, URLClassLoader loader) throws SecurityException, InvocationTargetException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, MalformedURLException, IllegalArgumentException { String className = "SimpletestSigned1"; Class cls = loader.loadClass(className); Method m = cls.getMethod("main", new Class[]{new String[0].getClass()}); System.out.println("executing " + className + "'s main"); m.invoke(null, (Object) new String[0]); } private static void resolveArgument(String s, int port) throws Exception { if (s == null) { throw new IllegalArgumentException("arg was null"); } else if (s.equalsIgnoreCase("hack")) { downlaodAndExecuteForeignMethod(port, 1); } else if (s.equalsIgnoreCase("new")) { downlaodAndExecuteForeignMethod(port, 2); } else { throw new IllegalArgumentException("hack or new expected as argument"); } } private class Killer extends Thread { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { System.out.println("applet was initialised"); killer = new Killer(); } @Override public void start() { System.out.println("applet was started"); killer.start(); int port = 44321; //debug default try { File portsFile = new File(System.getProperty("java.io.tmpdir"), "serveraccess.port"); if (portsFile.exists()) { String sPort = null; BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(portsFile), "utf-8")); try { sPort = br.readLine(); } finally { br.close(); } if (sPort != null) { port = new Integer(sPort.trim()); } } } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } try { resolveArgument(getParameter("arg"), port); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } System.out.println("killer was started"); } @Override public void stop() { System.out.println("applet was stopped"); } @Override public void destroy() { System.out.println("applet will be destroyed"); } } icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/PaxHeaders.7406/r0000644000000000000000000000013213441742745030655 xustar0030 mtime=1552401893.101832694 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/0000755000175000002070000000000013441742745033313 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/PaxHead0000644000000000000000000000036313441742745031323 xustar00153 path=icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-new.html 30 mtime=1552401893.092832712 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/Interna0000644000175000002070000000367313441742745034647 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/PaxHead0000644000000000000000000000037313441742745031324 xustar00161 path=icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-applet-hack.jnlp 30 mtime=1552401893.094832708 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/Interna0000644000175000002070000000502613441742745034641 0ustar00jvanekmock00000000000000 InternalClassloaderWithDownloadedResource-applet-hack IcedTea InternalClassloaderWithDownloadedResource-applet-hack icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/PaxHead0000644000000000000000000000036413441742745031324 xustar00154 path=icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-hack.html 30 mtime=1552401893.097832702 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/Interna0000644000175000002070000000367413441742745034650 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/PaxHead0000644000000000000000000000037213441742745031323 xustar00160 path=icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-applet-new.jnlp 30 mtime=1552401893.096832704 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/Interna0000644000175000002070000000502213441742745034635 0ustar00jvanekmock00000000000000 InternalClassloaderWithDownloadedResource-applet-new IcedTea InternalClassloaderWithDownloadedResource-applet-new icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/PaxHead0000644000000000000000000000036313441742745031323 xustar00153 path=icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-new.jnlp 30 mtime=1552401893.101832694 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/Interna0000644000175000002070000000460013441742745034636 0ustar00jvanekmock00000000000000 InternalClassloaderWithDownloadedResource-new IcedTea InternalClassloaderWithDownloadedResource-new new icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/PaxHead0000644000000000000000000000036213441742745031322 xustar00154 path=icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-hack.jnlp 28 mtime=1552401893.0988327 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/InternalClassloaderWithDownloadedResource/resources/Interna0000644000175000002070000000460413441742745034642 0ustar00jvanekmock00000000000000 InternalClassloaderWithDownloadedResource-hack IcedTea InternalClassloaderWithDownloadedResource-hack hack icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/GifarBase0000644000000000000000000000013213441742745021741 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/0000755000175000002070000000000013441742745022626 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/GifarBase/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745023737 xustar0030 mtime=1552401893.108832679 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/testcases/0000755000175000002070000000000013441742745024624 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/GifarBase/testcases/PaxHeaders.7406/GifarTestcases.java0000644000000000000000000000013213441742745027566 xustar0030 mtime=1552401893.108832679 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/testcases/GifarTestcases.java0000644000175000002070000002164613441742745030407 0ustar00jvanekmock00000000000000/* AppletTestTests.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.imageio.ImageIO; import net.sourceforge.jnlp.ClosingListener; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.InvalidJarHeaderException; import net.sourceforge.jnlp.util.JarFile; import org.junit.Assert; import org.junit.Test; public class GifarTestcases extends BrowserTest { List trustIgnore = Arrays.asList(new String[]{ServerAccess.HEADLES_OPTION, OptionsDefinitions.OPTIONS.TRUSTALL.option, OptionsDefinitions.OPTIONS.NOHEADERS.option}); List trust = Arrays.asList(new String[]{ServerAccess.HEADLES_OPTION, OptionsDefinitions.OPTIONS.TRUSTALL.option}); RulesFolowingClosingListener.ContainsRule exceptionRule = new RulesFolowingClosingListener.ContainsRule(InvalidJarHeaderException.class.getName()); RulesFolowingClosingListener.ContainsRule okRule = new RulesFolowingClosingListener.ContainsRule("Image loaded"); RulesFolowingClosingListener.ContainsRule sucideRule = new RulesFolowingClosingListener.ContainsRule("gifar killing himself"); private ClosingListener getExceptionClosingListener() { return new RulesFolowingClosingListener(exceptionRule); } private ClosingListener getOkClosingListener() { return new RulesFolowingClosingListener(okRule, sucideRule); } File okJar = new File(server.getDir(), "GifarBase.jar"); File hackedJar = new File(server.getDir(), "Gifar.jar"); File okImage = new File(server.getDir(), "happyNonAnimated.gif"); File hackedImage = new File(server.getDir(), "Gifar.gif"); @Test public void unittest_verify_okJar() throws IOException { JNLPRuntime.setIgnoreHeaders(false); JarFile j1 = new JarFile(okJar); Assert.assertNotNull(j1); JNLPRuntime.setIgnoreHeaders(true); JarFile j2 = new JarFile(okJar); Assert.assertNotNull(j2); } @Test public void unittest_verify_badJar() throws IOException { JNLPRuntime.setIgnoreHeaders(false); Exception ex=null; JarFile j1=null; try{ j1 = new JarFile(hackedJar); }catch(InvalidJarHeaderException e){ ex=e; } Assert.assertNull(j1); Assert.assertNotNull(ex); Assert.assertEquals(InvalidJarHeaderException.class, ex.getClass()); JNLPRuntime.setIgnoreHeaders(true); JarFile j2 = new JarFile(hackedJar); Assert.assertNotNull(j2); } @Test public void unittest_verify_badImageAsJar() throws IOException { JNLPRuntime.setIgnoreHeaders(false); Exception ex=null; JarFile j1=null; try{ j1 = new JarFile(hackedImage); }catch(InvalidJarHeaderException e){ ex=e; } Assert.assertNull(j1); Assert.assertNotNull(ex); Assert.assertEquals(InvalidJarHeaderException.class, ex.getClass()); JNLPRuntime.setIgnoreHeaders(true); JarFile j2 = new JarFile(hackedImage); Assert.assertNotNull(j2); } @Test public void unittest_verify_okImage() throws IOException { JNLPRuntime.setIgnoreHeaders(false); BufferedImage j1 = ImageIO.read(okImage); Assert.assertNotNull(j1); JNLPRuntime.setIgnoreHeaders(true); BufferedImage j2 = ImageIO.read(okImage); Assert.assertNotNull(j2); } @Test public void unittest_verify_badImaqe() throws IOException { JNLPRuntime.setIgnoreHeaders(false); BufferedImage j1 = ImageIO.read(hackedImage); Assert.assertNotNull(j1); JNLPRuntime.setIgnoreHeaders(true); BufferedImage j2 = ImageIO.read(hackedImage); Assert.assertNotNull(j2); } @Test @NeedsDisplay public void GifarViaJnlp_application() throws Exception { ProcessResult pr = server.executeJavaws(trust, "gifar_application.jnlp"); Assert.assertFalse("stdout " + okRule.toFailingString() + " but did", okRule.evaluate(pr.stdout)); Assert.assertTrue("stderr " + exceptionRule.toPassingString() + " but did'nt", exceptionRule.evaluate(pr.stderr)); Assert.assertEquals((Integer) 1, pr.returnValue); } @Test @NeedsDisplay //this test is known to fail on jdk8+ which do nto alow some "gif" instances on classpath @KnownToFail public void GifarViaJnlp_application_ignoreHeaders() throws Exception { ProcessResult pr = server.executeJavaws(trustIgnore, "gifar_application.jnlp"); Assert.assertTrue("stdout " + okRule.toPassingString() + " but didn't", okRule.evaluate(pr.stdout)); Assert.assertFalse("stderr " + exceptionRule.toFailingString() + " but did", exceptionRule.evaluate(pr.stderr)); Assert.assertEquals((Integer) 0, pr.returnValue); } @Test @NeedsDisplay public void GifarViaJnlp_applet() throws Exception { ProcessResult pr = server.executeJavaws(trust, "gifar_applet.jnlp"); Assert.assertFalse("stdout " + okRule.toFailingString() + " but did", okRule.evaluate(pr.stdout)); Assert.assertTrue("stderr " + exceptionRule.toPassingString() + " but didn't", exceptionRule.evaluate(pr.stderr)); Assert.assertEquals((Integer) 1, pr.returnValue); } @Test @NeedsDisplay //this test is known to fail on jdk8+ which do nto alow some "gif" instances on classpath @KnownToFail public void GifarViaJnlp_applet_ignoreHeaders() throws Exception { ProcessResult pr = server.executeJavaws(trustIgnore, "gifar_applet.jnlp"); Assert.assertTrue("stdout " + okRule.toPassingString() + " but didn't", okRule.evaluate(pr.stdout)); Assert.assertFalse("stderr " + exceptionRule.toFailingString() + " but did", exceptionRule.evaluate(pr.stderr)); Assert.assertEquals((Integer) 0, pr.returnValue); } @Test @TestInBrowsers(testIn = {Browsers.all}) @NeedsDisplay public void GifarViaBrowser_hacked() throws Exception { ProcessResult pr = server.executeBrowser("gifarView_hacked.html", getOkClosingListener(), getExceptionClosingListener()); Assert.assertFalse("stdout " + okRule.toFailingString() + " but did", okRule.evaluate(pr.stdout)); Assert.assertTrue("stderr " + exceptionRule.toPassingString() + " but didn't", exceptionRule.evaluate(pr.stderr)); } @Test @TestInBrowsers(testIn = {Browsers.one}) @NeedsDisplay public void GifarViaBrowser_ok() throws Exception { ProcessResult pr = server.executeBrowser("gifarView_ok.html", getOkClosingListener(), getExceptionClosingListener()); Assert.assertTrue("stdout " + okRule.toPassingString() + " but didn't", okRule.evaluate(pr.stdout)); Assert.assertFalse("stderr " + exceptionRule.toFailingString() + " but did", exceptionRule.evaluate(pr.stderr)); } } icedtea-web-1.8/tests/reproducers/signed/GifarBase/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745022713 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/srcs/0000755000175000002070000000000013441742745023600 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/GifarBase/srcs/PaxHeaders.7406/GifarMain.java0000644000000000000000000000013213441742745025470 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/srcs/GifarMain.java0000644000175000002070000001547513441742745026314 0ustar00jvanekmock00000000000000 import java.awt.BorderLayout; import java.awt.image.BufferedImage; import java.net.URL; import javax.imageio.ImageIO; import javax.jnlp.BasicService; import javax.jnlp.ServiceManager; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JApplet; import javax.swing.JFrame; import javax.swing.JLabel; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class GifarMain extends JApplet { boolean isApplet = true; String defaultPath = "happyNonAnimated.gif"; String imageName; URL path = null; private class Killer extends Thread { public int n = 3000; @Override public void run() { try { Thread.sleep(n); System.out.println("gifar killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { System.out.println("gifar was initialised"); killer = new Killer(); this.setLayout(new BorderLayout()); String futurePath = null; if (isApplet) { futurePath = getParameter("image"); if ("yes".equals(futurePath)) { imageName = defaultPath; } else if (futurePath != null) { imageName = futurePath; } } } @Override public void start() { System.out.println("gifar is starting"); String s = "" + System.getProperty("java.vm.version") + "
" + System.getProperty("java.vm.vendor") + "
" + System.getProperty("java.vm.name") + "
" + System.getProperty("java.specification.version") + "
" + System.getProperty("java.specification.vendor") + "
" + System.getProperty("java.specification.name") + ""; JLabel jLabel1 = new JLabel(s); this.add(jLabel1, BorderLayout.NORTH); System.out.println("Used image: " + imageName); if (imageName != null) { try { path = new URL(getIndependentCodebase(), imageName); System.out.println("Loading: "+path.toString()); JLabel jLabel2 = new JLabel(loadIcon(path)); System.out.println("Image loaded"); this.add(jLabel2, BorderLayout.SOUTH); } catch (Exception ex) { //ex.printStackTrace(); throw new RuntimeException(ex); } } killer.start(); System.out.println("is applet: " + isApplet); System.out.println("gifar was started"); } Icon loadIcon(URL u) { try { BufferedImage i = ImageIO.read(u.openStream()); return new ImageIcon(i); } catch (Exception ex) { throw new RuntimeException(ex); } } public URL getIndependentCodebase() { try { URL u1 = getCodeBaseApplet(); URL u2 = getCodeBaseJavaws(); if (u1 != null) { return u1; } if (u2 != null) { return u2; } return new URL("http://localhost:44321/"); } catch (Exception ex) { throw new RuntimeException(ex); } } public URL getCodeBaseApplet() { try { URL codebase = getCodeBase(); if (codebase != null) { System.out.println("applet codebase: " + codebase.toString()); return codebase; } else { System.out.println("applet codebase: null"); } } catch (Exception ex) { ex.printStackTrace(); System.out.println("applet codebase: null"); } return null; } public URL getCodeBaseJavaws() { try { BasicService bs = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService"); URL codebase = bs.getCodeBase(); if (codebase != null) { System.out.println("javaws codebase: " + codebase.toString()); return codebase; } else { System.out.println("javaws codebase: null"); } } catch (Exception ex) { ex.printStackTrace(); System.out.println("javaws codebase: null"); } return null; } @Override public void stop() { System.out.println("gifar was stopped"); } @Override public void destroy() { System.out.println("gifar will be destroyed"); } public static void main(String[] args){ final JFrame f = new JFrame(); f.setLayout(new BorderLayout()); f.setSize(250, 200); GifarMain gm = new GifarMain(); gm.isApplet = false; f.add(gm); gm.init(); if (args.length > 0) { if ("yes".equals(args[0])) { gm.imageName = gm.defaultPath; } else { gm.imageName = args[0]; } } gm.start(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); java.awt.EventQueue.invokeLater(new Runnable() { public void run() { f.setVisible(true); } }); } } icedtea-web-1.8/tests/reproducers/signed/GifarBase/PaxHeaders.7406/resources0000644000000000000000000000013213441742745023753 xustar0030 mtime=1552401893.101832694 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/resources/0000755000175000002070000000000013441742745024640 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/GifarBase/resources/PaxHeaders.7406/gifar_application.jnlp0000644000000000000000000000013213441742745030370 xustar0030 mtime=1552401893.092832712 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/resources/gifar_application.jnlp0000644000175000002070000000432413441742745031203 0ustar00jvanekmock00000000000000 GifarView IcedTea Gifar issue Gifar.jar icedtea-web-1.8/tests/reproducers/signed/GifarBase/resources/PaxHeaders.7406/gifarView_ok.html0000644000000000000000000000013213441742745027332 xustar0030 mtime=1552401893.097832702 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/resources/gifarView_ok.html0000644000175000002070000000376213441742745030152 0ustar00jvanekmock00000000000000

There should be gif image There should be gif image There should be gif image

icedtea-web-1.8/tests/reproducers/signed/GifarBase/resources/PaxHeaders.7406/gifarView_hacked.html0000644000000000000000000000013213441742745030140 xustar0030 mtime=1552401893.096832704 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/resources/gifarView_hacked.html0000644000175000002070000000375613441742745030763 0ustar00jvanekmock00000000000000

There should be gif image There should be gif image There should be gif image

icedtea-web-1.8/tests/reproducers/signed/GifarBase/resources/PaxHeaders.7406/happyNonAnimated.gif0000644000000000000000000000013213441742745027756 xustar0030 mtime=1552401893.101832694 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/GifarBase/resources/happyNonAnimated.gif0000644000175000002070000001542713441742745030577 0ustar00jvanekmock00000000000000GIF89addчџR1ЛP6ЖN9ДL=БO>ЌKBЋIEЉ_?ІKGЄGJЃDMЁWHŸMMFP?UšFSšeK—TQ•]O•?X—GV–GX’@[“SV’A]к;#9`‘bU‹A`Œ9ctR‹O^‹ЬC(AcˆHaˆ9fŠpX„W`„9i†Ag…ТJ.ЋP9лD%~W€n\Bi‚Lf„Sd„9lƒ_aДP2ЁU@9oFmz]f|jcyРQ/Ys8r|Ol{5uyZj|š]AйM(AsxЋZ8‚`xNpxsh]_lr6xvŠcUtgsMtsˆco3|sˆe_‹fOjo[пR%eonEym@zrZtbkP3ozjo˜bh}lW/‚lІd:ЁcTеX-žd\cvX<iJ}i-†i–kF7„hutRuqrXzqF‚]*ŠfЏdWoI5‡e@„dФb6jzSв_/'c3Šbр]*o=\€VTdСdDЖgO,_P…YŠvKvЌЋMбЃJщž=ЁГJЪЈKЛЌPзЇDъЅAЗЕKцЊDйЏFь­?ЬИMзЕKьВCъЗFшОIяУFS.Н!ўCreated with GIMP!љ џ,ddўГTИЄ`A#№XЈЃ!‡aHlaЂтˆ‹!BtрРQ BZЈ0a ЈlРВ0$@@›7  0 ЇO@  ЈQЃY4˜сB B”ƒbХ5vєјQ$Щ’(UЎd SЬ™5qаI ­ЯŸA‰=šTщвƒ Ÿ‰ ‘UЋ'АŽШИ‘ƒЎ"G~ +ЖхKГgгтдЙг-\CхЮ­kЗŠС%yŸFебїяе‹ƒЕrќи5фW“ŒД,{эM›kйђ| ѓаЙТpшљsгЇPЅFœxU0с­­]ƒ-›хуШ4!x€`“ВхЫ™чў†^—xqМ E+_оАsГі:нAЪБ ЪBF`Eš фЄл[єžQу1qL…Ц_S1gQV…q}АнWYД%@BvфСdмє]qi\‚х™з Sъ­gš ‚ЅVѓax’†-Йг vbЧ рv9Ќp(њ&зx,&eоy 98ZiUYejЯ­нHѕ‰Е!LЄШ)iH@гm\ЁЪьі№лP†Ё`‹w#ij…х(]†<ВС mЙE"А€]мёfœr@@›J…xF)%AQ”šФЉЈЁъz~eй…ўёYЈ#u,m`fWЌ@‚МЎpG-ЊЄAd[rАB$WрлЇhфЙg_,ЦS8AФЕиХЖCt;D 5аPУDюjиGЬЗXl < DЃwмaG$єFвG-ЕР‰€nr.АјГЮ&5­Gl1C 3<ƒ[tqФLXЁm;„KnE[кX˜%„\BКЌkŸJмqŠ]ј=aw8№ОE•Њ4ЧћЛCоˆHt 1pохЂGБD€ў”Р~jВ‚Lˆ]€@eоВAѓХс d˜GxЛю X`Bхœ7+ mш:2‘€v!Ž]Ќ ;@ 6Ш:€pŠю3šвVY4ЃХяXм …!DШUŠ,јG1$и@8JЃM’(™…BиХ.2Ё„ ˆXЂ%маЧіЉ w>Шf6g„Ш(рТ+АХп PˆlO{i…vоР/&b*й˜йР™ЪўTwHФ–hњ!T*oј€ ^HЈœр,PЁ M№ApР…Šr!…DHТ9бйBu.В6pС BPЈ/™LLзcРc>'5ЕЭmD ІYЭк]Sb№BЦрГŸсЇд šDэ`‡ ј PHТ^d„KuК K&IPbŸ АРzЦTЉLJGЂ˜"zшSш6@щYUј‚gЂP-,@Д DpТЉ’ƒNDКFяЉk@R+ сФ [>ЋƒЩђѓ…јƒP ›‚ d8CЈDх"ЖVЫ fHBzшŠЮЉЕч4ЉQ|0№&Ј"7˜ъф(I\Рžo”ўЬdK‡šўэ8жЊЩ>Ы.K(UЄ =H9С —:p# | ЊЈE%R[’HBЭ`Тѕ`‹—"VZш5!{fMVO|:qФYqk№§lрУФ@ј’D ƒ„]4c7РЯcbЫU@Ђр/ |рНЮЗањ‚Z„уFЅнк0&_чЦGЈD3*„ } ЭG)>pЧVЖDЌ[>ШЭМ=ѓщOw…‚ЌзJ@HˆрVИжrУЫJ˜€ \HтЏ"9ё‘PbИЛ7aФ%ми*Ђ ЦЎ{№иP/ hfЈўЈ5мт7ШPР‚2AgI4Ё ;P.F\‰Zр‚ "h n€ +|€Њѕ4&–Еќ-0ЖŠ*@м`у0ѓŒ ˆ ƒ| …NkAbPœ†с'ШDCСjUHЉymЪА‹`рТ СЩGжuwЈ{–ИФц№шмqA ‚рoL“Aе3|ƒДё?-ЈaЭnNHІа„LИьЇxDФАBсІ˜˜c&lpЎ/M %@n Р хчhБ$<Ёќр}[$ƒВ7ц3ИA }АЈnQ@Œ›дй6Bœ ъoПЬеXј– ан \,Тѕ••ў]Š]p,шЁНKXBaСћ~а=фСM”лн †6paс@—ƒ"†-Pa =ж6М npу+XЈŸD†WL,Ђ$…КЌР mLcЅИЪэ§’кLтхŽ˜ёЬq0‡? œрqШƒцрѓ ]ohCN{\%3PщMњ"ЄNЕД'#Ђ%m_w‘ŽЏk‡ОРzшbкl"и„яЬЙаGм<|{ЯnїЁ§Z  "…)PЁпЎ…Ь*И.nОЊс€JŠiœ|щр†_ QБЌ<&›и$†эя@тй‰РyKщ-<‚ ŠКщўA‰GdBѕЌŸ‚Ђ{Š`ШЬЯЁhФЗвYЎС0—/E9ДQ ysуСчF:вqCPо10‘|/ЗmА;WЄEm0Žрv‰Р(wj 3„}лЧ}о~^P б%{0Ѓ щgKЫqWƒт16Р х0 †V˜Ащ№0и*€ €ТІт$HБФm  (‚№t@‚ sа€№H н7n^ h~јЂ Ѕр"8‚‚b5eР г€ /№1АЅp1yХ”ЩЗ р ЈƒƒФyз6xˆ‡•€„”А„”  9…žd И3ўчЗ j0KuK]˜=`‹РnЌqgШч€ %аk‰ЦŸа†Т6o ‡'єEC€№џѓIЈ„K• u0aU@ˆ•pˆцg~џЅŒШTSZЁU(`мpr†Pa‚Ÿ№‰nЈ ސpА4HYdwE~јЁрu0*` •€ˆКX Љ`KUW3Т8„Q!Уј ‹а5jФ‰cБŒЫИ Ќ‡аƒ$OPz8tLјБˆ_P_PzА В—‹Ж6 d`Ч…%w…ŽєХ/Pcx(вђи†Ќ€ t—ƒвИќИ}Lи}Њр„;Е'wГЉЖ dў QŽI‚АТk:bIђ8p ЈА}№?v't§X’p’‚@fE_р†˜КИ МаR ђр.zf#%•FЏБ#*Б =љ‰?”•0G‰”$Щ„ЉX {а”kа3YPn0 Ș‹џЅ ƒP\Zyaц-ё…WЃu‰‘Œ `–=щ†Ќ№ „0kљвF”жШ}pЙ”•0 z yuyVuр"ц’ЭР МшfdfаЎйм_е'№Tѕe(c‰ А˜g™|Ќ”„А’Й‡ЋЦjЦЙ”}P Ё0—t№™ša€iŽр_ 9GЃ` ` šШўdƒаК№К Љ№šЏЙ-EP= RР;tЛЩ›Нй Пщ Ј@„р{Ÿs0 Ѓ sŸ„№а€x07tУtР’ЭPгР OX%Ц•ƒ` МР дpм№ пР Ъ ЪР р™ ‹аe€ž. ”&' я Н™| p —  šр šЃъ (}­Ѓs—цМ0 Њ‹Эа  Ё 1J .ШчЅч TZЅ Ђсi=№”єБРЂЛ٘й†.чr2JЃ—PjЊІ2•G?К3hp‚ —|9Gг  ˆ` !œPЁ/ƒ€Šя@ў„JЈіРьрърцže`]Z_ І№й˜mxv.ЧŒ ‡аЉ‡ S ъІ7†yрЃ0GЈ:Gмрu№U"њ ћЈД:Ј…JіЋЙ:ю№ ЉP=Ђ0Љ_І/š|“€ЉšЊЉžњЉ :J9Їst  д™ЊкР ІPwАЊ ч№ЇЕjЋЗŠфZЎЙЪЈЉPщЂ0Љ-*ІѓxЉЪКЌœкЉЯ ­Є3  DšЊт  Ма ‚H%`` с*Ў…ZЎфКЛірК`.ЂГаЎюjЌ–ŠЌѓЪЌžzЏy| CšЊ)6 Ъ Дшc`0ў ВZЋЗzЋЙZЎћАё  а:9 KЌя ЏЬШБeЊЉ2њБЯšG‰@мрЏџЪ У@ \KР Ъ р ЈˆšЕКЊЋ [ГќpГ9h]СГ=›Б•Д—šЉєкЌGЛA‰0 K‹Њт№Џпрˆ^`а Ш№­ДЪъ`€ћ ю0Иƒ;[Лќ№Ец` PrBЖe[Ќ;ІBk єZЏЮкІxрžР г€])6Зк№ ‚Рh5ћ ь@Ћє Ш0 І` У0ЛК  ЪИёрѓРЋё`УГ зnЙяКБdЊЖ›ŠЙ™ЛЙћЙЁ+КШ№fХа‚Уў Ћ ЈєРп0 œ0рОР Б; ЖkЛАЋ~-xЙ0М+Йgл mИ ЩŠМEkЏ ЪЙќ:ЗќћЏбћ”œёˆPЕЌЫца Q`ЊВРCp*fОфydюW!ДаОћО? ЏѓKϘjЙ›кЌЮъЎ€ ŸлПхpџ{VIС­ КJЈъ  œ•Ч(]щ-5gXб%@ ьО>;ЙёZЙќС[Ј€ каПтpТШр q Тc€арТƒ:Ј‰ъН4Ь4 ‘z–Ž=ьУLЖяKЉ<П|ЙGœФKЬПхрФP|^c@ Ь є НлЛИ`№f[™NЏ–ў>,ЦУKЌf|ЌlϘ‹ФJlТpќœPТ#lЧ ;Ш€РьеЧч˜WРШЙ0Ц<[Ц?kМШŠМF\ž€ дPsћЦpЬtg цР1БЬ€йЖ˜М8V ›,Цž,  М˜ЋpЦЃlПZš жЌ\щ` Щр pZ—Є ю@ЫЗjРааЊJŠžŒ!рЫП\СС<ЬgЛСѕЋЖEЋ Iќ­oœЎы ‰` hЎPЧw\Јі0цаЭЋW*ФUаХ•™u*нb?ђ…ц|Ю Фf[ЬЂмБŒp5š Ш QъКЩ@ ЃЊЯц0Е аа@ (ўвˆАвœав-н ­авƒYіУ1ёаэЩ‘[ШЂ<ДD;ЃєЩ Ш€ Ь€ ž0p:‰р Г,ГkЬ Ь€T=еT}еXMеаа 3]гUS 8-ЦЗ0жЗ@Ж„ЪŸа jЦ>М5Š pэ šPв—Џ‰€ЭкLјАЋёаз}}€­‚=и„-иђ€аР f05S `mЮДа Жp зр ЖPж;ЬХЌжЌР ђ+ЏˆŒІiJзјъ:‰ ю`„JЎЛКЛїИАлќаД]лД­ђ ƒуbާиЦ` Зp Т€ Тp ˜ЭГg А№ иА лрйhўlбЩЬІЁ:}ž€кЊmЎџl5ыАВMлў0офэ§ша ‹нл&№лРM Т@ И€ з` ƒLЌЋ и п€ б§йЧ\ФFœЙјŠ|р шкі@ГџќнВ=лхсў щm,дю жЦпд  еp ЩmжФ лP к@ Щ№ k кEЌМ k𡈆ЫАћАЛ^лун^ош­оЖDбсР0мХ- Оp }С“ЊпЯ@ еА П h{Ш-ЮЖGЫЈ№ 3nЎ€§кžИ:Оу9ž‰НиЫс AўлРАсОp Gž ?,бВр л л€ RNЙTОЖўF ЊH3лАќ }­€оЖшњђАК…цBn Йа ШqNЦ_j ПащАДьŒЬVšА €оАјPуё@еђ ёPи…В.ыОеЙ}с ’юоцl ч,ШJ В ХLбzNПm Т КЬЇюАЉ~ђА Ўр лАж~эиŽэаАэЎ€йIWЁыКžс йœ,б№kШ{NДlkЪы0у5Ћэ`Я‰Pяž0эгžвњОвuPЅ˜WBтОыб РPюПžфšўЅВ€жzоЮ|оЉ—№ эp ўАƒОG š ЩЯSђЋчcкљўфва Фа ОўаЦРЩ:-ьЖ0ьЋ ФьœЦ~ л ѓррёА дќЪш5*Vaрмн юб ЧА Тр Чађщcl Оp з€ –]ѓы<нЄ,ёІоѓэл  еЌТDп'~ђ нєhЮск` Ы@ Roюш| О0Я` ъP Т€ ЖІЦрЫz№ у№к^ эЈРј,ЧщЅЇІmŸєв жА ИP Ыp +мСнЩ<мЯ ЯћЇу0ѓŸж^птЏ7.яGэDB?єqMБYФ•ЋЉ—€ ђpŸИђў ~`iЕŸ^ИЯ^•п бp Я  &Ћ 'n еP р№ эЯ<ЯЈo №лѕ,ЮЌАѓиИАБM“ GifarView IcedTea Gifar issue icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/ExtensionJnlp0000644000000000000000000000013213441742745022716 xustar0030 mtime=1552401893.093832711 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/0000755000175000002070000000000013441742745023603 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024730 xustar0030 mtime=1552401893.133832627 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/0000755000175000002070000000000013441742745025615 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/PaxHeaders.7406/UsesSignedJnlpJarAn0000644000000000000000000000032013441742745030540 xustar00118 path=icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/UsesSignedJnlpJarAndSignedJarExtension.jnlp 30 mtime=1552401893.108832679 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/UsesSignedJnlpJarAndSignedJarExtens0000644000175000002070000000505513441742745034500 0ustar00jvanekmock00000000000000 UsesSignedJnlpJarAndSignedJarExtension IcedTea UsesSignedJnlpJarAndSignedJarExtension icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/PaxHeaders.7406/UsesSignedJnlpExten0000644000000000000000000000013213441742745030631 xustar0030 mtime=1552401893.133832627 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/UsesSignedJnlpExtension.jnlp0000644000175000002070000000471113441742745033277 0ustar00jvanekmock00000000000000 UsesSignedJnlpExtension IcedTea UsesSignedJnlpExtension icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/PaxHeaders.7406/UsesSignedJarExtens0000644000000000000000000000013213441742745030625 xustar0030 mtime=1552401893.091832715 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/UsesSignedJarExtension.jnlp0000644000175000002070000000464213441742745033113 0ustar00jvanekmock00000000000000 UseSignedJarExtension IcedTea UseSignedJarExtension icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/PaxHeaders.7406/UsesSignedJnlp.jnlp0000644000000000000000000000013213441742745030567 xustar0030 mtime=1552401893.100832696 30 atime=1552402157.266253416 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/UsesSignedJnlp.jnlp0000644000175000002070000000465013441742745031404 0ustar00jvanekmock00000000000000 UsesSignedJnlp IcedTea UsesSignedJnlp icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/PaxHeaders.7406/UsesSignedJar.jnlp0000644000000000000000000000013213441742745030400 xustar0030 mtime=1552401893.097832702 30 atime=1552402157.265253418 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/resources/UsesSignedJar.jnlp0000644000175000002070000000466613441742745031224 0ustar00jvanekmock00000000000000 UsesSignedJar IcedTea UsesSignedJar icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024714 xustar0030 mtime=1552401893.093832711 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/testcases/0000755000175000002070000000000013441742745025601 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/testcases/PaxHeaders.7406/ExtensionJnlpTest.j0000644000000000000000000000013213441742745030604 xustar0030 mtime=1552401893.093832711 30 atime=1552402157.265253418 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/ExtensionJnlp/testcases/ExtensionJnlpTest.java0000644000175000002070000000757013441742745032115 0ustar00jvanekmock00000000000000/* ExtensionJnlpTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import org.junit.Assert; import org.junit.Test; public class ExtensionJnlpTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); private final String jarOutput = "Running SignedJarResource.."; private final String signedJnlpException = "net.sourceforge.jnlp.LaunchException: Fatal: Application Error: " + "The signed JNLP file did not match the launching JNLP file. Missing Resource: Signed Application " + "did not match launching JNLP File"; @Test public void checkingForRequiredResources() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UsesSignedJar.jnlp"); Assert.assertTrue("Could not locate SignedJarResource class within SignedJarResource jar", pr.stdout.contains(jarOutput)); String s = "Running SignedJnlpResource.."; pr = server.executeJavawsHeadless(l, "/UsesSignedJnlp.jnlp"); Assert.assertTrue("Could not locate SignedJnlpResource class within SignedJnlpResource jar", pr.stdout.contains(s)); } @Bug(id = "PR1040") @Test public void usingSignedExtension() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UsesSignedJarExtension.jnlp"); Assert.assertTrue("Stdout should contain " + jarOutput + " but did not", pr.stdout.contains(jarOutput)); } @Bug(id = "PR1041") @Test public void mainJarInExtension() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UsesSignedJnlpJarAndSignedJarExtension.jnlp"); Assert.assertTrue("Stdout should contain " + jarOutput + " but did not", pr.stdout.contains(jarOutput)); } @Bug(id = "PR1042") @Test public void checkingSignedJnlpInExtension() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/UsesSignedJnlpExtension.jnlp"); Assert.assertTrue("Stdout should contain " + signedJnlpException + " but did not", pr.stderr.contains(signedJnlpException)); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/EntryPointSignedSingleSecondInvalidFirstOk0000644000000000000000000000013213441742745030472 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/0000755000175000002070000000000013441742745031357 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/PaxHeaders.7406/0000644000000000000000000000013113441742745030550 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.109183452 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/0000755000175000002070000000000013441742745033371 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/PaxHea0000644000000000000000000000037213441742745031235 xustar00160 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk_security.jnlp 30 mtime=1552401893.107832681 30 atime=1552402157.265253418 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryP0000644000175000002070000000453013441742745034537 0ustar00jvanekmock00000000000000 EntryPointSignedSingleSecondInvalidFirstOk IcedTea EntryPointSignedSingleSecondInvalidFirstOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/PaxHea0000644000000000000000000000040013441742745031225 xustar00167 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk_applet_security.jnlp 29 mtime=1552401893.13283263 30 atime=1552402157.265253418 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryP0000644000175000002070000000474113441742745034543 0ustar00jvanekmock00000000000000 EntryPointSignedSingleSecondInvalidFirstOk IcedTea EntryPointSignedSingleSecondInvalidFirstOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/PaxHea0000644000000000000000000000036113441742745031233 xustar00151 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk.jnlp 30 mtime=1552401893.091832715 30 atime=1552402157.265253418 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryP0000644000175000002070000000443213441742745034540 0ustar00jvanekmock00000000000000 EntryPointSignedSingleSecondInvalidFirstOk IcedTea EntryPointSignedSingleSecondInvalidFirstOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/PaxHea0000644000000000000000000000037013441742745031233 xustar00158 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk_applet.jnlp 30 mtime=1552401893.100832696 30 atime=1552402157.265253418 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryP0000644000175000002070000000462313441742745034542 0ustar00jvanekmock00000000000000 EntryPointSignedSingleSecondInvalidFirstOk IcedTea EntryPointSignedSingleSecondInvalidFirstOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/PaxHea0000644000000000000000000000036113441742745031233 xustar00151 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk.html 30 mtime=1552401893.096832704 30 atime=1552402157.265253418 30 ctime=1552410887.076183529 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryP0000644000175000002070000000352013441742745034535 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/PaxHeaders.7406/0000644000000000000000000000013213441742745030551 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/0000755000175000002070000000000013441742745032331 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/PaxHeaders.0000644000000000000000000000035413441742745031131 xustar00146 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/EntryPointSignedSingleSecondInvalidFirstOk.java 30 mtime=1552401893.092832712 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/EntryPointS0000644000175000002070000000410713441742745034514 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleSecondInvalidFirstOk extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/PaxHeaders.0000644000000000000000000000013213441742745031123 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/META-INF/0000755000175000002070000000000013441742745033471 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/META-INF/Pa0000644000000000000000000000032113441742745030521 xustar00119 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/META-INF/MANIFEST.MF 30 mtime=1552401893.095832706 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/META-INF/MA0000644000175000002070000000014613441742745033712 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Entry-Point: EntryPointSignedSingleSecondInvalidFirstOk SomeDifferentMainClass icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/PaxHeaders.7406/0000644000000000000000000000013213441742745030551 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/testcases/0000755000175000002070000000000013441742745033355 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/testcases/PaxHea0000644000000000000000000000036513441742745031223 xustar00155 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/testcases/EntryPointSignedSingleSecondInvalidFirstOkTest.java 30 mtime=1552401893.096832704 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/testcases/EntryP0000644000175000002070000001377313441742745034534 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleSecondInvalidFirstOkTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException { dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException { dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleSecondInvalidFirstOk.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleSecondInvalidFirstOk_security.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "EntryPointSignedSingleSecondInvalidFirstOk_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleSecondInvalidFirstOk_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception { server.getBrowserLocation(); ProcessResult p = server.executeBrowser("EntryPointSignedSingleSecondInvalidFirstOk.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "EntryPointSignedSingleSecondInvalidFirstOk.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/EntryPointSignedSingleOk0000644000000000000000000000013213441742745025017 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/0000755000175000002070000000000013441742745025704 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/PaxHeaders.7406/resources0000644000000000000000000000013113441742745027030 xustar0029 mtime=1552401893.13283263 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/0000755000175000002070000000000013441742745027716 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/PaxHeaders.7406/EntryPoi0000644000000000000000000000032613441742745030607 xustar00124 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk_security.jnlp 30 mtime=1552401893.106832684 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk0000644000175000002070000000437613441742745034554 0ustar00jvanekmock00000000000000 EntryPointSignedSingleOk IcedTea EntryPointSignedSingleOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/PaxHeaders.7406/EntryPoi0000644000000000000000000000033413441742745030606 xustar00131 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk_applet_security.jnlp 29 mtime=1552401893.13283263 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk0000644000175000002070000000456513441742745034554 0ustar00jvanekmock00000000000000 EntryPointSignedSingleOk IcedTea EntryPointSignedSingleOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/PaxHeaders.7406/EntryPoi0000644000000000000000000000031513441742745030605 xustar00115 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk.jnlp 30 mtime=1552401893.090832717 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk0000644000175000002070000000430013441742745034537 0ustar00jvanekmock00000000000000 EntryPointSignedSingleOk IcedTea EntryPointSignedSingleOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/PaxHeaders.7406/EntryPoi0000644000000000000000000000032413441742745030605 xustar00122 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk_applet.jnlp 30 mtime=1552401893.099832698 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk0000644000175000002070000000444713441742745034553 0ustar00jvanekmock00000000000000 EntryPointSignedSingleOk IcedTea EntryPointSignedSingleOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/PaxHeaders.7406/EntryPoi0000644000000000000000000000031513441742745030605 xustar00115 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk.html 30 mtime=1552401893.096832704 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk0000644000175000002070000000345413441742745034550 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025771 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/srcs/0000755000175000002070000000000013441742745026656 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/srcs/PaxHeaders.7406/EntryPointSig0000644000000000000000000000013213441742745030547 xustar0030 mtime=1552401893.092832712 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/srcs/EntryPointSignedSingleOk.java0000644000175000002070000000406513441742745034427 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleOk extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013213441742745027131 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/srcs/META-INF/0000755000175000002070000000000013441742745030016 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/srcs/META-INF/PaxHeaders.7406/MANI0000644000000000000000000000013213441742745027655 xustar0030 mtime=1552401893.095832706 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/srcs/META-INF/MANIFEST.MF0000644000175000002070000000007513441742745031452 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Entry-Point: EntryPointSignedSingleOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745027015 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/testcases/0000755000175000002070000000000013441742745027702 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/testcases/PaxHeaders.7406/EntryPoi0000644000000000000000000000032113441742745030566 xustar00119 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/testcases/EntryPointSignedSingleOkTest.java 30 mtime=1552401893.096832704 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleOk/testcases/EntryPointSignedSingleOk0000644000175000002070000001403013441742745034524 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleOkTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException{ dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException{ dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleOk.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleOk_security.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception{ ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "EntryPointSignedSingleOk_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermAllSecurity() throws Exception{ ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleOk_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception{ server.getBrowserLocation(); ProcessResult p = server.executeBrowser("EntryPointSignedSingleOk.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "EntryPointSignedSingleOk.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/EntryPointSignedSingleInvalid0000644000000000000000000000013213441742745026034 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/0000755000175000002070000000000013441742745026721 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/PaxHeaders.7406/resources0000644000000000000000000000013213441742745030046 xustar0030 mtime=1552401893.131832631 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/0000755000175000002070000000000013441742745030733 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/PaxHeaders.7406/Ent0000644000000000000000000000034013441742745030575 xustar00134 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid_security.jnlp 30 mtime=1552401893.105832685 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSin0000644000175000002070000000442713441742745034604 0ustar00jvanekmock00000000000000 EntryPointSignedSingleInvalid IcedTea EntryPointSignedSingleInvalid icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/PaxHeaders.7406/Ent0000644000000000000000000000034713441742745030604 xustar00141 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid_applet_security.jnlp 30 mtime=1552401893.131832631 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSin0000644000175000002070000000462313441742745034602 0ustar00jvanekmock00000000000000 EntryPointSignedSingleInvalid IcedTea EntryPointSignedSingleInvalid icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/PaxHeaders.7406/Ent0000644000000000000000000000032713441742745030602 xustar00125 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid.jnlp 30 mtime=1552401893.090832717 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSin0000644000175000002070000000433113441742745034576 0ustar00jvanekmock00000000000000 EntryPointSignedSingleInvalid IcedTea EntryPointSignedSingleInvalid icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/PaxHeaders.7406/Ent0000644000000000000000000000033613441742745030602 xustar00132 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid_applet.jnlp 30 mtime=1552401893.099832698 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSin0000644000175000002070000000450513441742745034601 0ustar00jvanekmock00000000000000 EntryPointSignedSingleInvalid IcedTea EntryPointSignedSingleInvalid icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/PaxHeaders.7406/Ent0000644000000000000000000000032713441742745030602 xustar00125 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid.html 30 mtime=1552401893.095832706 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSin0000644000175000002070000000346613441742745034606 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745027006 xustar0030 mtime=1552401893.094832708 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/0000755000175000002070000000000013441742745027673 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/PaxHeaders.7406/EntryPoi0000644000000000000000000000032213441742745030560 xustar00120 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/EntryPointSignedSingleInvalid.java 30 mtime=1552401893.092832712 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/EntryPointSignedSingleIn0000644000175000002070000000407213441742745034517 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleInvalid extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013213441742745030146 xustar0030 mtime=1552401893.094832708 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/META-INF/0000755000175000002070000000000013441742745031033 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/META-INF/PaxHeaders.74060000644000000000000000000000013213441742745030146 xustar0030 mtime=1552401893.094832708 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/META-INF/MANIFEST.MF0000644000175000002070000000007313441742745032465 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Entry-Point: SomeDifferentMainClass icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745030032 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/testcases/0000755000175000002070000000000013441742745030717 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/testcases/PaxHeaders.7406/Ent0000644000000000000000000000033313441742745030563 xustar00129 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/testcases/EntryPointSignedSingleInvalidTest.java 30 mtime=1552401893.095832706 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleInvalid/testcases/EntryPointSignedSin0000644000175000002070000001364613441742745034573 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleInvalidTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException { dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException { dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleInvalid.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleInvalid_security.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "EntryPointSignedSingleInvalid_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleInvalid_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception { server.getBrowserLocation(); ProcessResult p = server.executeBrowser("EntryPointSignedSingleInvalid.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "EntryPointSignedSingleInvalid.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/EntryPointSignedSingleFirstInvalidSecondOk0000644000000000000000000000013213441742745030472 xustar0030 mtime=1552401893.094832708 30 atime=1552410887.109183452 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/0000755000175000002070000000000013441742745031357 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/PaxHeaders.7406/0000644000000000000000000000013113441742745030550 xustar0030 mtime=1552401893.131832631 29 atime=1552410887.11018345 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/0000755000175000002070000000000013441742745033371 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/PaxHea0000644000000000000000000000037213441742745031235 xustar00160 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk_security.jnlp 30 mtime=1552401893.105832685 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryP0000644000175000002070000000453013441742745034537 0ustar00jvanekmock00000000000000 EntryPointSignedSingleFirstInvalidSecondOk IcedTea EntryPointSignedSingleFirstInvalidSecondOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/PaxHea0000644000000000000000000000040113441742745031226 xustar00167 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk_applet_security.jnlp 30 mtime=1552401893.131832631 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryP0000644000175000002070000000474113441742745034543 0ustar00jvanekmock00000000000000 EntryPointSignedSingleFirstInvalidSecondOk IcedTea EntryPointSignedSingleFirstInvalidSecondOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/PaxHea0000644000000000000000000000036113441742745031233 xustar00151 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk.jnlp 30 mtime=1552401893.089832719 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryP0000644000175000002070000000443213441742745034540 0ustar00jvanekmock00000000000000 EntryPointSignedSingleFirstInvalidSecondOk IcedTea EntryPointSignedSingleFirstInvalidSecondOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/PaxHea0000644000000000000000000000036613441742745031240 xustar00158 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk_applet.jnlp 28 mtime=1552401893.0988327 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryP0000644000175000002070000000462313441742745034542 0ustar00jvanekmock00000000000000 EntryPointSignedSingleFirstInvalidSecondOk IcedTea EntryPointSignedSingleFirstInvalidSecondOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/PaxHea0000644000000000000000000000036113441742745031233 xustar00151 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk.html 30 mtime=1552401893.095832706 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryP0000644000175000002070000000352013441742745034535 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/PaxHeaders.7406/0000644000000000000000000000013113441742745030550 xustar0030 mtime=1552401893.094832708 29 atime=1552410887.11018345 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/0000755000175000002070000000000013441742745032331 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/PaxHeaders.0000644000000000000000000000035413441742745031131 xustar00146 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/EntryPointSignedSingleFirstInvalidSecondOk.java 30 mtime=1552401893.091832715 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/EntryPointS0000644000175000002070000000410713441742745034514 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleFirstInvalidSecondOk extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/PaxHeaders.0000644000000000000000000000013113441742745031122 xustar0030 mtime=1552401893.094832708 29 atime=1552410887.11018345 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/META-INF/0000755000175000002070000000000013441742745033471 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/META-INF/Pa0000644000000000000000000000032113441742745030521 xustar00119 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/META-INF/MANIFEST.MF 30 mtime=1552401893.094832708 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/META-INF/MA0000644000175000002070000000014613441742745033712 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Entry-Point: SomeDifferentMainClass EntryPointSignedSingleFirstInvalidSecondOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/PaxHeaders.7406/0000644000000000000000000000013113441742745030550 xustar0030 mtime=1552401893.094832708 29 atime=1552410887.11018345 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/testcases/0000755000175000002070000000000013441742745033355 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/testcases/PaxHea0000644000000000000000000000036513441742745031223 xustar00155 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/testcases/EntryPointSignedSingleFirstInvalidSecondOkTest.java 30 mtime=1552401893.095832706 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/testcases/EntryP0000644000175000002070000001377313441742745034534 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleFirstInvalidSecondOkTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException { dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException { dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleFirstInvalidSecondOk.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleFirstInvalidSecondOk_security.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "EntryPointSignedSingleFirstInvalidSecondOk_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleFirstInvalidSecondOk_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception { server.getBrowserLocation(); ProcessResult p = server.executeBrowser("EntryPointSignedSingleFirstInvalidSecondOk.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "EntryPointSignedSingleFirstInvalidSecondOk.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation)); Assert.assertTrue(p.stdout.contains(aok.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/EntryPointSignedSingleBothOk0000644000000000000000000000013113441742745025633 xustar0030 mtime=1552401893.093832711 29 atime=1552410887.11018345 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/0000755000175000002070000000000013441742745026521 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/PaxHeaders.7406/resources0000644000000000000000000000013113441742745027645 xustar0030 mtime=1552401893.130832634 29 atime=1552410887.11018345 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/0000755000175000002070000000000013441742745030533 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000032513441742745030562 xustar00124 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk2.jnlp 29 mtime=1552401893.10383269 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000432613441742745034551 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothOk IcedTea EntryPointSignedSingleBothOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000032613441742745030563 xustar00124 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk2.html 30 mtime=1552401893.130832634 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000346513441742745034554 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000033713441742745030565 xustar00133 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_security1.jnlp 30 mtime=1552401893.088832721 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000442413441742745034550 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothOk IcedTea EntryPointSignedSingleBothOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000032613441742745030563 xustar00124 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk1.html 30 mtime=1552401893.087832723 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000346513441742745034554 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000033513441742745030563 xustar00131 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_applet1.jnlp 30 mtime=1552401893.090832717 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000450113441742745034544 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothOk IcedTea EntryPointSignedSingleBothOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000034613441742745030565 xustar00140 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_applet_security1.jnlp 30 mtime=1552401893.093832711 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000461713441742745034554 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothOk IcedTea EntryPointSignedSingleBothOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000033513441742745030563 xustar00131 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_applet2.jnlp 30 mtime=1552401893.093832711 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000450113441742745034544 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothOk IcedTea EntryPointSignedSingleBothOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000033513441742745030563 xustar00133 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_security2.jnlp 28 mtime=1552401893.0988327 30 atime=1552402157.265253418 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000442413441742745034550 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothOk IcedTea EntryPointSignedSingleBothOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000032513441742745030562 xustar00124 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk1.jnlp 30 mtime=1552401893.097832702 29 atime=1552402157.26425342 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000432613441742745034551 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothOk IcedTea EntryPointSignedSingleBothOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/PaxHeaders.7406/Entr0000644000000000000000000000034513441742745030564 xustar00140 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_applet_security2.jnlp 30 mtime=1552401893.094832708 29 atime=1552402157.26425342 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSing0000644000175000002070000000461713441742745034554 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothOk IcedTea EntryPointSignedSingleBothOk icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745026605 xustar0030 mtime=1552401893.130832634 29 atime=1552410887.11018345 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/0000755000175000002070000000000013441742745027473 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/PaxHeaders.7406/EntryPoin0000644000000000000000000000032013441742745030534 xustar00119 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/EntryPointSignedSingleBothOk2.java 30 mtime=1552401893.104832688 29 atime=1552402157.26425342 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/EntryPointSignedSingleBot0000644000175000002070000000416313441742745034476 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleBothOk2 extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet2 running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET2 FINISHED ***"); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/PaxHeaders.7406/EntryPoin0000644000000000000000000000032013441742745030534 xustar00119 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/EntryPointSignedSingleBothOk1.java 30 mtime=1552401893.130832634 29 atime=1552402157.26425342 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/EntryPointSignedSingleBot0000644000175000002070000000416313441742745034476 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleBothOk1 extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet1 running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET1 FINISHED ***"); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013113441742745027745 xustar0030 mtime=1552401893.091832715 29 atime=1552410887.11018345 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/META-INF/0000755000175000002070000000000013441742745030633 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/META-INF/PaxHeaders.7406/0000644000000000000000000000013113441742745030024 xustar0030 mtime=1552401893.091832715 29 atime=1552402157.26425342 30 ctime=1552410887.075183531 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/META-INF/MANIFEST.MF0000644000175000002070000000014013441742745032260 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Entry-Point: EntryPointSignedSingleBothOk2 EntryPointSignedSingleBothOk1 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745027631 xustar0030 mtime=1552401893.094832708 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/testcases/0000755000175000002070000000000013441742745030517 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/testcases/PaxHeaders.7406/Entr0000644000000000000000000000033113441742745030543 xustar00128 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/testcases/EntryPointSignedSingleBothOkTest2.java 30 mtime=1552401893.094832708 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/testcases/EntryPointSignedSing0000644000175000002070000001576613441742745034547 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class EntryPointSignedSingleBothOkTest2 extends BrowserTest { public static final String MAGICAL_OK1_CLOSING_STRING = "*** APPLET1 FINISHED ***"; public static final String MAGICAL_OK2_CLOSING_STRING = "*** APPLET2 FINISHED ***"; private static class AutoOk1ClosingListener extends StringBasedClosingListener { public AutoOk1ClosingListener() { super(MAGICAL_OK1_CLOSING_STRING); } } private static class AutoOk2ClosingListener extends StringBasedClosingListener { public AutoOk2ClosingListener() { super(MAGICAL_OK2_CLOSING_STRING); } } private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aok1 = new AutoOk1ClosingListener(); private static final StringBasedClosingListener aok2 = new AutoOk2ClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation1 = "*** applet1 running ***"; private static final String confirmation2 = "*** applet2 running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException { dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException { dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity2() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleBothOk2.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation2)); Assert.assertFalse(p.stdout.contains(aok2.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); assertNope(p); } @Test public void javawsAllPermAllSecurity2() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleBothOk_security2.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation2)); Assert.assertTrue(p.stdout.contains(aok2.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity2() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "EntryPointSignedSingleBothOk_applet2.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation2)); Assert.assertFalse(p.stdout.contains(aok2.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); assertNope(p); } @Test public void javawsAppletAllPermAllSecurity2() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleBothOk_applet_security2.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation2)); Assert.assertTrue(p.stdout.contains(aok2.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); assertNope(p); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity2() throws Exception { server.getBrowserLocation(); ProcessResult p = server.executeBrowser("EntryPointSignedSingleBothOk2.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation2)); Assert.assertTrue(p.stdout.contains(aok2.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); assertNope(p); } @Test public void javawsHtml2() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "EntryPointSignedSingleBothOk2.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation2)); Assert.assertTrue(p.stdout.contains(aok2.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); assertNope(p); } public void assertNope(ProcessResult p){ Assert.assertFalse(p.stdout.contains(confirmation1)); Assert.assertFalse(p.stdout.contains(aok1.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/testcases/PaxHeaders.7406/Entr0000644000000000000000000000033113441742745030543 xustar00128 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/testcases/EntryPointSignedSingleBothOkTest1.java 30 mtime=1552401893.093832711 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothOk/testcases/EntryPointSignedSing0000644000175000002070000001601513441742745034533 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class EntryPointSignedSingleBothOkTest1 extends BrowserTest { public static final String MAGICAL_OK1_CLOSING_STRING = "*** APPLET1 FINISHED ***"; public static final String MAGICAL_OK2_CLOSING_STRING = "*** APPLET2 FINISHED ***"; private static class AutoOk1ClosingListener extends StringBasedClosingListener { public AutoOk1ClosingListener() { super(MAGICAL_OK1_CLOSING_STRING); } } private static class AutoOk2ClosingListener extends StringBasedClosingListener { public AutoOk2ClosingListener() { super(MAGICAL_OK2_CLOSING_STRING); } } private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aok1 = new AutoOk1ClosingListener(); private static final StringBasedClosingListener aok2 = new AutoOk2ClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation1 = "*** applet1 running ***"; private static final String confirmation2 = "*** applet2 running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException { dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException { dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity1() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleBothOk1.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation1)); Assert.assertFalse(p.stdout.contains(aok1.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); assertNope(p); } @Test public void javawsAllPermAllSecurity1() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleBothOk_security1.jnlp"); Assert.assertTrue(p.stdout.contains(confirmation1)); Assert.assertTrue(p.stdout.contains(aok1.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); assertNope(p); } @Test public void javawsAppletAllPermNoSecurity1() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "EntryPointSignedSingleBothOk_applet1.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation1)); Assert.assertFalse(p.stdout.contains(aok1.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); assertNope(p); } @Test public void javawsAppletAllPermAllSecurity1() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleBothOk_applet_security1.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation1)); Assert.assertTrue(p.stdout.contains(aok1.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); assertNope(p); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity1() throws Exception { server.getBrowserLocation(); ProcessResult p = server.executeBrowser("EntryPointSignedSingleBothOk1.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertTrue(p.stdout.contains(confirmation1)); Assert.assertTrue(p.stdout.contains(aok1.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); assertNope(p); } @Test public void javawsHtml1() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "EntryPointSignedSingleBothOk1.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(p.stdout.contains(confirmation1)); Assert.assertTrue(p.stdout.contains(aok1.getCondition())); Assert.assertFalse(p.stderr.contains(aer.getCondition())); assertNope(p); } public void assertNope(ProcessResult p){ Assert.assertFalse(p.stdout.contains(confirmation2)); Assert.assertFalse(p.stdout.contains(aok2.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/EntryPointSignedSingleBothInvalid0000644000000000000000000000013113441742745026650 xustar0030 mtime=1552401893.094832708 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/0000755000175000002070000000000013441742745027536 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/PaxHeaders.7406/resources0000644000000000000000000000013113441742745030662 xustar0030 mtime=1552401893.129832636 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/0000755000175000002070000000000013441742745031550 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/PaxHeaders.74060000644000000000000000000000035513441742745030672 xustar00149 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid_applet_security.jnlp 29 mtime=1552401893.10383269 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSigne0000644000175000002070000000465313441742745034604 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothInvalid IcedTea EntryPointSignedSingleBothInvalid icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/PaxHeaders.74060000644000000000000000000000034513441742745030671 xustar00140 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid_applet.jnlp 30 mtime=1552401893.129832636 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSigne0000644000175000002070000000453513441742745034603 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothInvalid IcedTea EntryPointSignedSingleBothInvalid icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/PaxHeaders.74060000644000000000000000000000033613441742745030671 xustar00133 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid.html 30 mtime=1552401893.087832723 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSigne0000644000175000002070000000347613441742745034606 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/PaxHeaders.74060000644000000000000000000000034713441742745030673 xustar00142 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid_security.jnlp 30 mtime=1552401893.090832717 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSigne0000644000175000002070000000445313441742745034602 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothInvalid IcedTea EntryPointSignedSingleBothInvalid icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/PaxHeaders.74060000644000000000000000000000033613441742745030671 xustar00133 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid.jnlp 30 mtime=1552401893.097832702 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSigne0000644000175000002070000000435513441742745034603 0ustar00jvanekmock00000000000000 EntryPointSignedSingleBothInvalid IcedTea EntryPointSignedSingleBothInvalid icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745027622 xustar0030 mtime=1552401893.093832711 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/0000755000175000002070000000000013441742745030510 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/PaxHeaders.7406/META0000644000000000000000000000013113441742745030350 xustar0030 mtime=1552401893.093832711 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/META-INF/0000755000175000002070000000000013441742745031650 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/META-INF/PaxHeaders.0000644000000000000000000000013113441742745030441 xustar0030 mtime=1552401893.093832711 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/META-INF/MANIFEST.MF0000644000175000002070000000012513441742745033300 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Entry-Point: SomeDifferentMainClass AnotherDifferentMainClass icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/PaxHeaders.7406/Entr0000644000000000000000000000033113441742745030534 xustar00128 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/EntryPointSignedSingleBothInvalid.java 30 mtime=1552401893.092832712 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/EntryPointSignedSing0000644000175000002070000000407613441742745034530 0ustar00jvanekmock00000000000000 import java.applet.Applet; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleBothInvalid extends Applet { @Override public void init() { confirm(); } public static void main(String... s) { confirm(); } private static void confirm() { System.out.println("*** applet running ***"); System.out.println(System.getProperty("user.home")); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745030646 xustar0030 mtime=1552401893.094832708 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/testcases/0000755000175000002070000000000013441742745031534 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/testcases/PaxHeaders.74060000644000000000000000000000034213441742745030652 xustar00137 path=icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/testcases/EntryPointSignedSingleBothInvalidTest.java 30 mtime=1552401893.094832708 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/EntryPointSignedSingleBothInvalid/testcases/EntryPointSigne0000644000175000002070000001370213441742745034563 0ustar00jvanekmock00000000000000 import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /* AppletTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class EntryPointSignedSingleBothInvalidTest extends BrowserTest { private static final DeploymentPropertiesModifier dpm = new DeploymentPropertiesModifier(); private static final StringBasedClosingListener aok = new AutoOkClosingListener(); private static final StringBasedClosingListener aer = new AutoErrorClosingListener(); private static final String confirmation = "*** applet running ***"; @BeforeClass public static void setDeploymentManifestPermissionReadingOnly() throws IOException { dpm.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT.toString()); } @AfterClass public static void restoreDeploymentProeprtiees() throws IOException { dpm.restoreProperties(); } @Test public void javawsAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleBothInvalid.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleBothInvalid_security.jnlp"); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermNoSecurity() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{"-headless", "-verbose"}), "EntryPointSignedSingleBothInvalid_applet.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsAppletAllPermAllSecurity() throws Exception { ProcessResult p = server.executeJavawsHeadless("EntryPointSignedSingleBothInvalid_applet_security.jnlp", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test @TestInBrowsers(testIn = Browsers.one) public void appletAllPermAllSecurity() throws Exception { server.getBrowserLocation(); ProcessResult p = server.executeBrowser("EntryPointSignedSingleBothInvalid.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } @Test public void javawsHtml() throws Exception { ProcessResult p = server.executeJavaws(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}), "EntryPointSignedSingleBothInvalid.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertFalse(p.stdout.contains(confirmation)); Assert.assertFalse(p.stdout.contains(aok.getCondition())); Assert.assertTrue(p.stderr.contains(aer.getCondition())); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/DownloadService0000644000000000000000000000013113441742745023205 xustar0030 mtime=1552401893.129832636 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/DownloadService/0000755000175000002070000000000013441742745024073 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/DownloadService/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745025203 xustar0030 mtime=1552401893.129832636 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/DownloadService/testcases/0000755000175000002070000000000013441742745026071 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/DownloadService/testcases/PaxHeaders.7406/DownloadServiceTe0000644000000000000000000000013113441742745030564 xustar0030 mtime=1552401893.129832636 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/DownloadService/testcases/DownloadServiceTest.java0000644000175000002070000004353613441742745032677 0ustar00jvanekmock00000000000000/* DownloadServiceTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class DownloadServiceTest { private static final ServerAccess server = new ServerAccess(); private final String exitString = "Exiting DownloadService.."; private static final List checkCache = new ArrayList<>(); private static final List manageJnlpResources = new ArrayList<>(); private static final List manageExternalResources = new ArrayList<>(); @BeforeClass public static void initalizeClass() throws MalformedURLException { //Check Cache checkCache.add(server.getJavawsLocation()); checkCache.add("-arg"); checkCache.add(server.getUrl().toString() + "/"); checkCache.add("-arg"); checkCache.add("checkCache"); checkCache.add("-Xtrustall"); checkCache.add(ServerAccess.HEADLES_OPTION); checkCache.add(server.getUrl() + "/DownloadService.jnlp"); //Manage Jnlp Resouces manageJnlpResources.add(server.getJavawsLocation()); manageJnlpResources.add("-arg"); manageJnlpResources.add(server.getUrl().toString() + "/"); manageJnlpResources.add("-arg"); manageJnlpResources.add("manageJnlpJars"); manageJnlpResources.add("-Xtrustall"); manageJnlpResources.add(ServerAccess.HEADLES_OPTION); manageJnlpResources.add(server.getUrl() + "/DownloadService.jnlp"); //Manage External Resources manageExternalResources.add(server.getJavawsLocation()); manageExternalResources.add("-arg"); manageExternalResources.add(server.getUrl().toString() + "/"); manageExternalResources.add("-arg"); manageExternalResources.add("manageExternalJars"); manageExternalResources.add("-Xtrustall"); manageExternalResources.add(ServerAccess.HEADLES_OPTION); manageExternalResources.add(server.getUrl() + "/DownloadService.jnlp"); } /** * Executes reproducer to checks if DownloadServices's cache checks are working correctly. * @return stdout of reproducer. */ private String runCacheCheckTests() throws Exception { //Check cache test ProcessResult processResult = ServerAccess.executeProcess(checkCache); String stdoutCheckCache = processResult.stdout; Assert.assertTrue("CheckCache - DownloadServiceRunner instance did not close as expected, this test may fail.", stdoutCheckCache.contains(exitString)); return stdoutCheckCache; } /** * Executes reproducer to checks if DownloadServices's management of external jars are working correctly. * @return stdout of reproducer. */ private String runExternalTests() throws Exception { ProcessResult processResult = ServerAccess.executeProcess(manageExternalResources); String stdoutExternalResources = processResult.stdout; Assert.assertTrue("ManageExternalResources - DownloadServiceRunner instance did not close as expected, this test may fail.", stdoutExternalResources.contains(exitString)); return stdoutExternalResources; } /** * Executes reproducer to checks if DownloadServices's management of jnlp jars are working correctly. * @return stdout of reproducer. */ private String runJnlpResourceTests() throws Exception { ProcessResult processResult = ServerAccess.executeProcess(manageJnlpResources); String stdoutJnlpResources = processResult.stdout; Assert.assertTrue("ManageJnlpResources - DownloadServiceRunner instance did not close as expected, this test may fail.", stdoutJnlpResources.contains(exitString)); return stdoutJnlpResources; } @Test public void checkIfRequiredResourcesExist() { //Jnlp files Assert.assertTrue("DownloadService.jnlp is a required resource that's missing.", new File(server.getDir().getAbsolutePath() + "/DownloadService.jnlp").isFile()); Assert.assertTrue("DownloadServiceExtension.jnlp is a required resource that's missing.", new File(server.getDir().getAbsolutePath() + "/DownloadServiceExtension.jnlp").isFile()); //Jar files Assert.assertTrue("DownloadService.jar is a required resource that's missing.", new File(server.getDir().getAbsolutePath() + "/DownloadService.jar").isFile()); Assert.assertTrue("SignedJnlpResource.jar is a required resource that's missing.", new File(server.getDir().getAbsolutePath() + "/SignedJnlpResource.jar").isFile()); Assert.assertTrue("SignedJarResource.jar is a required resource that's missing.", new File(server.getDir().getAbsolutePath() + "/SignedJarResource.jar").isFile()); Assert.assertTrue("MultiJar-NoSignedJnlp.jar is a required resource that's missing.", new File(server.getDir().getAbsolutePath() + "/MultiJar-NoSignedJnlp.jar").isFile()); } @Test public void testcheckCaches() throws Exception { String stdoutCheckCache = runCacheCheckTests(); //Stdout validations String s = "CHECKCACHE-isPartCached: LaunchPartOne: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); s = "CHECKCACHE-isPartCached: LaunchPartTwo: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); s = "CHECKCACHE-isPartCached: NonExistingPart: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); } @Test public void testcheckCachesUsingArray() throws Exception { String stdoutCheckCache = runCacheCheckTests(); //Stdout validations String s = "CHECKCACHEUSINGMUTIPLEPARTS-isPartCached(Array): ValidLaunchParts: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); s = "CHECKCACHEUSINGMUTIPLEPARTS-isPartCached(Array): HalfValidLaunchParts: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); s = "CHECKCACHEUSINGMUTIPLEPARTS-isPartCached(Array): InvalidParts: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); } @Test public void testExtensioncheckCaches() throws Exception { String stdoutCheckCache = runCacheCheckTests(); //Stdout validations String s = "CHECKEXTENSIONCACHE-isExtensionPartCached: ExtensionPartOne: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); s = "CHECKEXTENSIONCACHE-isExtensionPartCached: NonExistingPart: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); s = "CHECKEXTENSIONCACHE-isExtensionPartCached: NonExistingUrl: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); } @Test public void testExtensioncheckCachesUsingArray() throws Exception { String stdoutCheckCache = runCacheCheckTests(); //Stdout validations String s = "CHECKEXTENSIONCACHEUSINGMUTIPLEPARTS-isExtensionPartCached(Array): ValidExtensionParts: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); s = "CHECKEXTENSIONCACHEUSINGMUTIPLEPARTS-isExtensionPartCached(Array): HalfValidExtensionParts: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); s = "CHECKEXTENSIONCACHEUSINGMUTIPLEPARTS-isExtensionPartCached(Array): InvalidParts: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutCheckCache.contains(s)); } @Test public void testExternalResourceChecks() throws Exception { runCacheCheckTests(); String stdoutExternalResources = runExternalTests(); //Stdout validations //This is automatically cached from the test engine because the .jar exists String s = "CHECKEXTERNALCACHE-isResourceCached: UrlToExternalResource: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutExternalResources.contains(s)); s = "CHECKEXTERNALCACHE-isResourceCached: NonExistingUrl: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutExternalResources.contains(s)); } @Test public void testRemovePart() throws Exception { runCacheCheckTests(); String stdoutJnlpResources = runJnlpResourceTests(); String s = "REMOVEPART-removePart: LaunchPartOne-BEFORE: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "REMOVEPART-removePart: LaunchPartOne-AFTER: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "REMOVEPART-removePart: LaunchPartTwo-BEFORE: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "REMOVEPART-removePart: LaunchPartTwo-AFTER: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); } @Test public void testRemoveExtensionPart() throws Exception { runCacheCheckTests(); String stdoutJnlpResources = runJnlpResourceTests(); //Stdout validations String s = "REMOVEEXTENSIONPART-removeExtensionPart: ExtensionPartOne-BEFORE: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "REMOVEEXTENSIONPART-removeExtensionPart: ExtensionPartOne-AFTER: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); } @Test public void testRemoveExtensionPartUsingArray() throws Exception { runCacheCheckTests(); String stdoutJnlpResources = runJnlpResourceTests(); //Stdout validations String s = "REMOVEEXTENSIONUSINGVALIDPARTINARRAY-removeExtensionPart(Array): ValidExtensionParts-BEFORE: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "REMOVEEXTENSIONUSINGVALIDPARTINARRAY-removeExtensionPart(Array): ValidExtensionParts-AFTER: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "REMOVEEXTENSIONUSINGHALFVALIDPARTINARRAY-removeExtensionPart(Array): HalfValidExtensionParts-BEFORE: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "REMOVEEXTENSIONUSINGHALFVALIDPARTINARRAY-removeExtensionPart(Array): HalfValidExtensionParts-AFTER: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); } @Test public void testRemoveExternalResource() throws Exception { runCacheCheckTests(); String stdoutExternalResources = runExternalTests(); //Stdout validations String s = "REMOVEEXTERNALPART-removeResource: UrlToExternalResource-BEFORE: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutExternalResources.contains(s)); s = "REMOVEEXTERNALPART-removeResource: UrlToExternalResource-AFTER: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutExternalResources.contains(s)); } @Test public void testLoadPart() throws Exception { runCacheCheckTests(); String stdoutJnlpResources = runJnlpResourceTests(); //Stdout validations //Part 'one' String s = "LOADPART-loadPart: LaunchPartOne-BEFORE: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "LOADPART-loadPart: LaunchPartOne-AFTER: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); //Part 'two' s = "LOADPART-loadPart: LaunchPartTwo-BEFORE: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "LOADPART-loadPart: LaunchPartTwo-AFTER: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); } @Test public void testLoadExtensionPart() throws Exception { runCacheCheckTests(); String stdoutJnlpResources = runJnlpResourceTests(); //Stdout validations String s = "LOADEXTENSIONPART-loadExtensionPart: ExtensionPartOne-BEFORE: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "LOADEXTENSIONPART-loadExtensionPart: ExtensionPartOne-AFTER: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); } @Test public void testLoadExtensionPartUsingArray() throws Exception { runCacheCheckTests(); String stdoutJnlpResources = runJnlpResourceTests(); //Stdout validations String s = "LOADEXTENSIONUSINGVALIDPARTINARRAY-loadExtensionPart(Array): ValidExtensionParts-BEFORE: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "LOADEXTENSIONUSINGVALIDPARTINARRAY-loadExtensionPart(Array): ValidExtensionParts-AFTER: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "LOADEXTENSIONUSINGHALFVALIDPARTINARRAY-loadExtensionPart(Array): HalfValidExtensionParts-BEFORE: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "LOADEXTENSIONUSINGHALFVALIDPARTINARRAY-loadExtensionPart(Array): HalfValidExtensionParts-AFTER: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); } @Test public void testLoadExternalResource() throws Exception { runCacheCheckTests(); String stdoutExternalResources = runExternalTests(); //Stdout validations String s = "LOADEXTERNALRESOURCE-loadResource: UrlToExternalResource-BEFORE: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutExternalResources.contains(s)); s = "LOADEXTERNALRESOURCE-loadResource: UrlToExternalResource-AFTER: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutExternalResources.contains(s)); } @Test public void testRepeatedlyLoadingAndUnloadingJnlpResources() throws Exception { runCacheCheckTests(); String stdoutJnlpResources = runJnlpResourceTests(); //Stdout validations String s = "MULTIPLEMETHODCALLS - removePart: LaunchPartOne: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); s = "MULTIPLEMETHODCALLS - loadPart: LaunchPartOne: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutJnlpResources.contains(s)); } @Test public void testRepeatedlyLoadingAndUnloadingExternalResources() throws Exception { runCacheCheckTests(); String stdoutExternalResources = runExternalTests(); //Stdout validations String s = "MULTIPLEMETHODCALLS - removeResource: UrlToExternalResource: false"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutExternalResources.contains(s)); s = "MULTIPLEMETHODCALLS - loadResource: UrlToExternalResource: true"; Assert.assertTrue("stdout should contain \"" + s + "\" but did not.", stdoutExternalResources.contains(s)); } } icedtea-web-1.8/tests/reproducers/signed/DownloadService/PaxHeaders.7406/resources0000644000000000000000000000013113441742745025217 xustar0030 mtime=1552401893.093832711 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/DownloadService/resources/0000755000175000002070000000000013441742745026105 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/DownloadService/resources/PaxHeaders.7406/DownloadServiceEx0000644000000000000000000000013113441742745030604 xustar0030 mtime=1552401893.086832725 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/DownloadService/resources/DownloadServiceExtension.jnlp0000644000175000002070000000457713441742745033774 0ustar00jvanekmock00000000000000 DownloadServiceExtension IcedTea DownloadServiceExtension icedtea-web-1.8/tests/reproducers/signed/DownloadService/resources/PaxHeaders.7406/DownloadService.j0000644000000000000000000000013113441742745030537 xustar0030 mtime=1552401893.093832711 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/DownloadService/resources/DownloadService.jnlp0000644000175000002070000000503713441742745032067 0ustar00jvanekmock00000000000000 DownloadService IcedTea DownloadService icedtea-web-1.8/tests/reproducers/signed/DownloadService/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745024157 xustar0030 mtime=1552401893.096832704 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/DownloadService/srcs/0000755000175000002070000000000013441742745025045 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/DownloadService/srcs/PaxHeaders.7406/DownloadServiceRunner.0000644000000000000000000000013113441742745030517 xustar0030 mtime=1552401893.096832704 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/DownloadService/srcs/DownloadServiceRunner.java0000644000175000002070000004123413441742745032176 0ustar00jvanekmock00000000000000/* DownloadService.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import javax.jnlp.DownloadService; import javax.jnlp.ServiceManager; import javax.jnlp.UnavailableServiceException; public class DownloadServiceRunner { URL serverUrl = null; URL extensionUrl = null; URL NonExistingUrl = null; URL urlToExternalResource = null; /** * Launching jnlp and extension jnlp PARTS */ final String launchPartOne = "one"; final String launchPartTwo = "two"; final String extensionPartOne = "extOne"; final String nonExistingPart = "random"; /** * Parts in Array */ final String[] validLaunchParts = { launchPartOne, launchPartTwo }; final String[] halfValidLaunchParts = { launchPartOne, nonExistingPart }; final String[] validExtensionParts = { extensionPartOne }; final String[] halfValidExtensionParts = { extensionPartOne, nonExistingPart }; final String[] invalidParts = { nonExistingPart, "random2" }; private static DownloadService downloadService; static { try { downloadService = (DownloadService) ServiceManager.lookup("javax.jnlp.DownloadService"); } catch (UnavailableServiceException ex) { System.err.println("DownloadService is not available."); } } public DownloadServiceRunner(String urlToServer) throws MalformedURLException, InterruptedException { serverUrl = new URL(urlToServer); extensionUrl = new URL(urlToServer + "DownloadServiceExtension.jnlp"); NonExistingUrl = new URL(urlToServer + "NONEXISTINGFILE.JNLP"); urlToExternalResource = new URL(urlToServer + "EmptySignedJar.jar"); System.out.println(urlToExternalResource.toString()); } /** * Checks the cache status of resources using isPartCached() */ private void checkCache() throws MalformedURLException { System.out.println("CHECKCACHE-isPartCached: LaunchPartOne: " + downloadService.isPartCached(launchPartOne)); System.out.println("CHECKCACHE-isPartCached: LaunchPartTwo: " + downloadService.isPartCached(launchPartTwo)); System.out.println("CHECKCACHE-isPartCached: NonExistingPart: " + downloadService.isPartCached(nonExistingPart)); } /** * Checks the cache status of resources using isPartCached([]) - an array with part names */ private void checkCacheUsingMultipleParts() throws MalformedURLException { System.out.println("CHECKCACHEUSINGMUTIPLEPARTS-isPartCached(Array): ValidLaunchParts: " + downloadService.isPartCached(validLaunchParts)); System.out.println("CHECKCACHEUSINGMUTIPLEPARTS-isPartCached(Array): HalfValidLaunchParts: " + downloadService.isPartCached(halfValidLaunchParts)); System.out.println("CHECKCACHEUSINGMUTIPLEPARTS-isPartCached(Array): InvalidParts: " + downloadService.isPartCached(invalidParts)); } /** * Checks the cache status of extension resources using isExtensionPartCached() */ private void checkExtensionCache() throws MalformedURLException { System.out.println("CHECKEXTENSIONCACHE-isExtensionPartCached: ExtensionPartOne: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); System.out.println("CHECKEXTENSIONCACHE-isExtensionPartCached: NonExistingPart: " + downloadService.isExtensionPartCached(extensionUrl, null, nonExistingPart)); System.out.println("CHECKEXTENSIONCACHE-isExtensionPartCached: NonExistingUrl: " + downloadService.isExtensionPartCached(NonExistingUrl, null, extensionPartOne)); } /** * Checks the cache status of extension resources using isExtensionPartCached([]) - an array with part names */ private void checkExtensionCacheUsingMultipleParts() throws MalformedURLException { System.out.println("CHECKEXTENSIONCACHEUSINGMUTIPLEPARTS-isExtensionPartCached(Array): ValidExtensionParts: " + downloadService.isExtensionPartCached(extensionUrl, null, validExtensionParts)); System.out.println("CHECKEXTENSIONCACHEUSINGMUTIPLEPARTS-isExtensionPartCached(Array): HalfValidExtensionParts: " + downloadService.isExtensionPartCached(extensionUrl, null, halfValidExtensionParts)); System.out.println("CHECKEXTENSIONCACHEUSINGMUTIPLEPARTS-isExtensionPartCached(Array): InvalidParts: " + downloadService.isExtensionPartCached(NonExistingUrl, null, invalidParts)); } /** * Checks the cache status of external (not mentioned in jnlps) resources using isResourceCached() */ private void checkExternalCache() { System.out.println("CHECKEXTERNALCACHE-isResourceCached: UrlToExternalResource: " + downloadService.isResourceCached(urlToExternalResource, null)); System.out.println("CHECKEXTERNALCACHE-isResourceCached: NonExistingUrl: " + downloadService.isResourceCached(NonExistingUrl, null)); } /** * Removes resources from cache using removePart() */ private void removePart() throws IOException { System.out.println("REMOVEPART-removePart: LaunchPartOne-BEFORE: " + downloadService.isPartCached(launchPartOne)); downloadService.removePart(launchPartOne); System.out.println("REMOVEPART-removePart: LaunchPartOne-AFTER: " + downloadService.isPartCached(launchPartOne)); System.out.println("REMOVEPART-removePart: LaunchPartTwo-BEFORE: " + downloadService.isPartCached(launchPartTwo)); downloadService.removePart(launchPartTwo); System.out.println("REMOVEPART-removePart: LaunchPartTwo-AFTER: " + downloadService.isPartCached(launchPartTwo)); } /** * Removes extension resources from cache using isExtensionPartCached() */ private void removeExtensionPart() throws IOException { System.out.println("REMOVEEXTENSIONPART-removeExtensionPart: ExtensionPartOne-BEFORE: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); downloadService.removeExtensionPart(extensionUrl, null, extensionPartOne); System.out.println("REMOVEEXTENSIONPART-removeExtensionPart: ExtensionPartOne-AFTER: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); } /** * Removes extension resources using part array (all parts exist) from cache using isExtensionPartCached() */ private void removeExtensionUsingValidPartInArray() throws IOException { System.out.println("REMOVEEXTENSIONUSINGVALIDPARTINARRAY-removeExtensionPart(Array): ValidExtensionParts-BEFORE: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); downloadService.removeExtensionPart(extensionUrl, null, validExtensionParts); System.out.println("REMOVEEXTENSIONUSINGVALIDPARTINARRAY-removeExtensionPart(Array): ValidExtensionParts-AFTER: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); } /** * Removes extension resources using part array (one part exists, the other one does not) from cache using isExtensionPartCached() */ private void removeExtensionUsingHalfValidPartInArray() throws IOException { System.out.println("REMOVEEXTENSIONUSINGHALFVALIDPARTINARRAY-removeExtensionPart(Array): HalfValidExtensionParts-BEFORE: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); downloadService.removeExtensionPart(extensionUrl, null, halfValidExtensionParts); System.out.println("REMOVEEXTENSIONUSINGHALFVALIDPARTINARRAY-removeExtensionPart(Array): HalfValidExtensionParts-AFTER: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); } /** * Removes external (not mentioned in jnlps) resources from cache using removeResource() */ private void removeExternalResource() throws IOException { System.out.println("REMOVEEXTERNALPART-removeResource: UrlToExternalResource-BEFORE: " + downloadService.isResourceCached(urlToExternalResource, null)); downloadService.removeResource(urlToExternalResource, null); System.out.println("REMOVEEXTERNALPART-removeResource: UrlToExternalResource-AFTER: " + downloadService.isResourceCached(urlToExternalResource, null)); } /** * Loads resources from cache using loadPart() */ private void loadPart() throws IOException { System.out.println("LOADPART-loadPart: LaunchPartOne-BEFORE: " + downloadService.isPartCached(launchPartOne)); downloadService.loadPart(launchPartOne, null); System.out.println("LOADPART-loadPart: LaunchPartOne-AFTER: " + downloadService.isPartCached(launchPartOne)); System.out.println("LOADPART-loadPart: LaunchPartTwo-BEFORE: " + downloadService.isPartCached(launchPartTwo)); downloadService.loadPart(launchPartTwo, null); System.out.println("LOADPART-loadPart: LaunchPartTwo-AFTER: " + downloadService.isPartCached(launchPartTwo)); } /** * Load extension resources from cache using loadExtensionPart() */ private void loadExtensionPart() throws IOException { System.out.println("LOADEXTENSIONPART-loadExtensionPart: ExtensionPartOne-BEFORE: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); downloadService.loadExtensionPart(extensionUrl, null, extensionPartOne, null); System.out.println("LOADEXTENSIONPART-loadExtensionPart: ExtensionPartOne-AFTER: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); } /** * Loads extension resources using part array (all parts exist) from cache using isExtensionPartCached() */ private void loadExtensionUsingValidPartInArray() throws IOException { System.out.println("LOADEXTENSIONUSINGVALIDPARTINARRAY-loadExtensionPart(Array): ValidExtensionParts-BEFORE: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); downloadService.loadExtensionPart(extensionUrl, null, validExtensionParts, null); System.out.println("LOADEXTENSIONUSINGVALIDPARTINARRAY-loadExtensionPart(Array): ValidExtensionParts-AFTER: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); } /** * Loads extension resources using part array (one part exists, the other one does not) from cache using isExtensionPartCached() */ private void loadExtensionUsingHalfValidPartInArray() throws IOException { System.out.println("LOADEXTENSIONUSINGHALFVALIDPARTINARRAY-loadExtensionPart(Array): HalfValidExtensionParts-BEFORE: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); downloadService.loadExtensionPart(extensionUrl, null, halfValidExtensionParts, null); System.out.println("LOADEXTENSIONUSINGHALFVALIDPARTINARRAY-loadExtensionPart(Array): HalfValidExtensionParts-AFTER: " + downloadService.isExtensionPartCached(extensionUrl, null, extensionPartOne)); } /** * Loads external (not mentioned in jnlps) resources from cache using removeResource() */ private void loadExternalResource() throws IOException { System.out.println("LOADEXTERNALRESOURCE-loadResource: UrlToExternalResource-BEFORE: " + downloadService.isResourceCached(urlToExternalResource, null)); downloadService.loadResource(urlToExternalResource, null, null); System.out.println("LOADEXTERNALRESOURCE-loadResource: UrlToExternalResource-AFTER: " + downloadService.isResourceCached(urlToExternalResource, null)); } /** * Repeatedly unloads and loads jars */ private void repeatedlyLoadingAndUnloadingJars() throws IOException { downloadService.removePart(launchPartOne); downloadService.loadPart(launchPartOne, null); downloadService.removePart(launchPartOne); System.out.println("MULTIPLEMETHODCALLS - removePart: LaunchPartOne: " + downloadService.isPartCached(launchPartOne)); downloadService.loadPart(launchPartOne, null); System.out.println("MULTIPLEMETHODCALLS - loadPart: LaunchPartOne: " + downloadService.isPartCached(launchPartOne)); } /** * Repeatedly unloads and loads external jars */ private void repeatedlyLoadingAndUnloadingExternalJars() throws IOException { downloadService.removeResource(urlToExternalResource, null); downloadService.loadResource(urlToExternalResource, null, null); downloadService.removeResource(urlToExternalResource, null); System.out.println("MULTIPLEMETHODCALLS - removeResource: UrlToExternalResource: " + downloadService.isResourceCached(urlToExternalResource, null)); downloadService.loadResource(urlToExternalResource, null, null); System.out.println("MULTIPLEMETHODCALLS - loadResource: UrlToExternalResource: " + downloadService.isResourceCached(urlToExternalResource, null)); } /** * Loads external jar as preparation for external resource testing */ private void prepareExternalResourceTests() { try { if (!downloadService.isResourceCached(urlToExternalResource, null)) downloadService.loadResource(urlToExternalResource, null, null); } catch (Exception e) { //Continue testing // This is okay to ignore as it may be a problem with loadResouce( ), which will be identified within tests } } public static void main(String[] args) throws IOException, InterruptedException { System.out.println("Running DownloadService.."); if (args.length < 2) { System.out.println("Requires 2 arguments: [server_url] [checkCache | manageJars | manageExternalJars]"); System.out.println("Exiting.."); return; } DownloadServiceRunner ds = new DownloadServiceRunner(args[0]); if (args[1].equals("checkCache")) { //Cache Resources ds.checkCache(); ds.checkCacheUsingMultipleParts(); ds.checkExtensionCache(); ds.checkExtensionCacheUsingMultipleParts(); } if (args[1].equals("manageJnlpJars")) { //Remove Resources ds.removePart(); ds.removeExtensionPart(); //Load Resources ds.loadPart(); ds.loadExtensionPart(); //Manage using multiple part arrays ds.removeExtensionUsingValidPartInArray(); ds.loadExtensionUsingValidPartInArray(); ds.removeExtensionUsingHalfValidPartInArray(); ds.loadExtensionUsingHalfValidPartInArray(); //Unloads and loads jars repeatedly ds.repeatedlyLoadingAndUnloadingJars(); } else if (args[1].equals("manageExternalJars")) { ds.prepareExternalResourceTests(); ds.checkExternalCache(); ds.removeExternalResource(); ds.loadExternalResource(); //Unloads and loads jars repeatedly ds.repeatedlyLoadingAndUnloadingExternalJars(); } System.out.println("Exiting DownloadService.."); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/CountingAppletSigned0000644000000000000000000000013113441742745024203 xustar0030 mtime=1552401893.086832725 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CountingAppletSigned/0000755000175000002070000000000013441742745025071 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CountingAppletSigned/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025155 xustar0030 mtime=1552401893.086832725 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CountingAppletSigned/srcs/0000755000175000002070000000000013441742745026043 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CountingAppletSigned/srcs/PaxHeaders.7406/CountingAppletSig0000644000000000000000000000013113441742745030554 xustar0030 mtime=1552401893.086832725 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CountingAppletSigned/srcs/CountingAppletSigned.java0000644000175000002070000000673313441742745033005 0ustar00jvanekmock00000000000000 import java.applet.Applet; import java.awt.BorderLayout; import javax.swing.JLabel; import javax.swing.SwingUtilities; /* CountingAppletSigned.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class CountingAppletSigned extends Applet { public static void main(String[] args) throws InterruptedException { Integer counter = null; if (args.length > 0) { counter = new Integer(args[0]); ; } int i = 0; while (true) { System.out.println("counting... " + i); System.out.flush(); if (counter != null && i == counter.intValue()) { System.exit(-i); } i++; Thread.sleep(1000); } } @Override public void init() { System.out.println("applet was initialised"); final CountingAppletSigned self = this; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { self.setLayout(new BorderLayout()); self.add(new JLabel("S")); self.validate(); self.repaint(); } }); } @Override public void start() { System.out.println("applet was started"); String s = getParameter("kill"); final String[] params; if (s != null) { params = new String[]{s}; } else { params = new String[0]; } new Thread(new Runnable() { @Override public void run() { try { main(params); } catch (Exception ex) { ex.printStackTrace(); } } }).start(); } @Override public void stop() { System.out.println("applet was stopped"); } @Override public void destroy() { System.out.println("applet will be destroyed"); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/CodeBaseManifestEntrySignedNotMatching0000644000000000000000000000013113441742745027561 xustar0030 mtime=1552401893.087832723 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/0000755000175000002070000000000013441742745030447 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745030533 xustar0030 mtime=1552401893.095832706 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/srcs/0000755000175000002070000000000013441742745031421 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/srcs/PaxHeaders.74060000644000000000000000000000034313441742745030540 xustar00138 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/srcs/CodeBaseManifestEntrySignedNotMatching.java 30 mtime=1552401893.085832727 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/srcs/CodeBaseManifes0000644000175000002070000000454413441742745034323 0ustar00jvanekmock00000000000000/* ClasspathManifest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class CodeBaseManifestEntrySignedNotMatching extends Applet { private class Killer extends Thread { public int n = 1000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; public static void main(String[] args) { x(); } @Override public void start() { x(); killer = new Killer(); killer.start(); } public static void x() { System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/srcs/PaxHeaders.74060000644000000000000000000000013113441742745030533 xustar0030 mtime=1552401893.095832706 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/srcs/META-INF/0000755000175000002070000000000013441742745032561 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/srcs/META-INF/PaxHea0000644000000000000000000000031413441742745030421 xustar00115 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/srcs/META-INF/MANIFEST.MF 30 mtime=1552401893.095832706 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/srcs/META-INF/MANIFE0000644000175000002070000000017413441742745033445 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Codebase: somthingWhatShould mustNeverMatch Application-Name: CodeBaseManifestEntrySignedNotMatching icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/PaxHeaders.7406/reso0000644000000000000000000000013113441742745030531 xustar0030 mtime=1552401893.092832712 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/0000755000175000002070000000000013441742745032461 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/PaxHeaders0000644000000000000000000000035013441742745031177 xustar00143 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/CodeBaseManifestEntrySignedNotMatching.html 30 mtime=1552401893.087832723 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/CodeBaseMa0000644000175000002070000000357413441742745034340 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/PaxHeaders0000644000000000000000000000035613441742745031205 xustar00149 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/CodeBaseManifestEntrySignedNotMatchingApplet.jnlp 30 mtime=1552401893.091832715 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/CodeBaseMa0000644000175000002070000000463313441742745034335 0ustar00jvanekmock00000000000000 Classpath Manifest Applet Test IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/PaxHeaders0000644000000000000000000000035013441742745031177 xustar00143 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/CodeBaseManifestEntrySignedNotMatching.jnlp 30 mtime=1552401893.090832717 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/CodeBaseMa0000644000175000002070000000443413441742745034334 0ustar00jvanekmock00000000000000 ClasspathManifest IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/PaxHeaders0000644000000000000000000000035413441742745031203 xustar00147 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/CodeBaseManifestEntrySignedNotMatchingJnlp.html 30 mtime=1552401893.092832712 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/resources/CodeBaseMa0000644000175000002070000000354513441742745034336 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/CodeBaseManifestEntrySignedMatching0000644000000000000000000000013113441742745027100 xustar0030 mtime=1552401893.090832717 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/0000755000175000002070000000000013441742745027766 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/PaxHeaders.7406/testcas0000644000000000000000000000013013441742745030545 xustar0029 mtime=1552401893.12783264 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/0000755000175000002070000000000013441742745031764 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/PaxHeaders.740000644000000000000000000000034713441742745030741 xustar00142 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntryUnsignedNotMatching.java 30 mtime=1552401893.101832694 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManif0000644000175000002070000001737613441742745034345 0ustar00jvanekmock00000000000000/* ClasspathManifestTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.util.FileUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class CodeBaseManifestEntryUnsignedNotMatching extends BrowserTest { RulesFolowingClosingListener.ContainsRule aokr = new RulesFolowingClosingListener.ContainsRule(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING); RulesFolowingClosingListener.ContainsRule eekr = new RulesFolowingClosingListener.ContainsRule(LaunchException.class.getSimpleName()); public static final String GENERAL_NAME = "CodeBaseManifestEntry"; public static final String SIGNATURE = "UnsignedNotMatching"; private static DeploymentPropertiesModifier codebaseModifier; @BeforeClass public static void setupDeploymentProperties() throws IOException { codebaseModifier = new DeploymentPropertiesModifier(); codebaseModifier.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.CODEBASE.toString()); } @AfterClass public static void setbackDeploymentProperties() throws IOException { codebaseModifier.restoreProperties(); } public void checkMessage(ProcessResult pr, int i) { CodeBaseManifestEntrySignedMatching.checkMessage(pr, i); } @NeedsDisplay @Test public void ApplicationJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, GENERAL_NAME + SIGNATURE + ".jnlp"); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 3); } @Test public void ApplicationJNLPLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + ".jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } private static void prepareCopyFile() throws IOException { CodeBaseManifestEntrySignedMatching.prepareCopyFile(GENERAL_NAME + SIGNATURE); } @Test public void ApplicationJNLPLocalTestWithRemoteCodebase() throws Exception { prepareCopyFile(); List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + "_copy.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 3); } @NeedsDisplay @Test public void AppletJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, GENERAL_NAME + SIGNATURE + "Applet.jnlp"); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 3); } @NeedsDisplay @Test public void AppletJNLPRLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + "Applet.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser(GENERAL_NAME + SIGNATURE + "Jnlp.html", new AutoOkClosingListener(), new RulesFolowingClosingListener(eekr)); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 3); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefLocalTest() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(GENERAL_NAME + SIGNATURE + "Jnlp.html"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir(), new AutoOkClosingListener(), null); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserAppletLocalTest() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(GENERAL_NAME + SIGNATURE + ".html"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir(), new AutoOkClosingListener(), null); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserAppletRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser(GENERAL_NAME + SIGNATURE + ".html", new AutoOkClosingListener(), new RulesFolowingClosingListener(eekr)); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 3); } } icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/PaxHeaders.740000644000000000000000000000034313441742745030735 xustar00139 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntryUnsignedMatching.java 29 mtime=1552401893.12783264 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManif0000644000175000002070000001670713441742745034342 0ustar00jvanekmock00000000000000/* ClasspathManifestTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class CodeBaseManifestEntryUnsignedMatching extends BrowserTest { RulesFolowingClosingListener.ContainsRule aokr = new RulesFolowingClosingListener.ContainsRule(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING); public static final String GENERAL_NAME = "CodeBaseManifestEntry"; public static final String SIGNATURE = "UnsignedMatching"; private static DeploymentPropertiesModifier codebaseModifier; @BeforeClass public static void setupDeploymentProperties() throws IOException { codebaseModifier = new DeploymentPropertiesModifier(); codebaseModifier.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.CODEBASE.toString()); } @AfterClass public static void setbackDeploymentProperties() throws IOException { codebaseModifier.restoreProperties(); } public void checkMessage(ProcessResult pr, int i) { CodeBaseManifestEntrySignedMatching.checkMessage(pr, i); } @NeedsDisplay @Test public void ApplicationJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, GENERAL_NAME + SIGNATURE + ".jnlp"); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 2); } @Test public void ApplicationJNLPLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + ".jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } private static void prepareCopyFile() throws IOException { CodeBaseManifestEntrySignedMatching.prepareCopyFile(GENERAL_NAME + SIGNATURE); } @Test public void ApplicationJNLPLocalTestWithRemoteCodebase() throws Exception { prepareCopyFile(); List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + "_copy.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 2); } @NeedsDisplay @Test public void AppletJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, GENERAL_NAME + SIGNATURE + "Applet.jnlp"); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 2); } @NeedsDisplay @Test public void AppletJNLPRLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + "Applet.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser(GENERAL_NAME + SIGNATURE + "Jnlp.html", ServerAccess.AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 2); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefLocalTest() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(GENERAL_NAME + SIGNATURE + "Jnlp.html"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir(), new AutoOkClosingListener(), null); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserAppletLocalTest() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(GENERAL_NAME + SIGNATURE + ".html"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir(), new AutoOkClosingListener(), null); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserAppletRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser(GENERAL_NAME + SIGNATURE + ".html", ServerAccess.AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 2); } } icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/PaxHeaders.740000644000000000000000000000034213441742745030734 xustar00137 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedMatching.java 30 mtime=1552401893.085832727 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManif0000644000175000002070000002127713441742745034340 0ustar00jvanekmock00000000000000/* ClasspathManifestTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.util.FileUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class CodeBaseManifestEntrySignedMatching extends BrowserTest { RulesFolowingClosingListener.ContainsRule aokr = new RulesFolowingClosingListener.ContainsRule(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING); public static final String GENERAL_NAME = "CodeBaseManifestEntry"; public static final String SIGNATURE = "SignedMatching"; public static final String[] keys = { /*0*/"CBCheckFile", /*1*/ "CBCheckNoEntry", /*2*/ "CBCheckUnsignedPass", /*3*/ "CBCheckUnsignedFail", /*4*/ "CBCheckOkSignedOk", /*5*/ "CBCheckSignedAppletDontMatchException", /*6*/ "CBCheckSignedFail"}; private static DeploymentPropertiesModifier codebaseModifier; @BeforeClass public static void setupDeploymentProperties() throws IOException { codebaseModifier = new DeploymentPropertiesModifier(); codebaseModifier.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.CODEBASE.toString()); } @AfterClass public static void setbackDeploymentProperties() throws IOException { codebaseModifier.restoreProperties(); } public static String getMessage(int i) { return Translator.R(keys[i]); } //may broke if run on non default locales //as those messages are localised public static final boolean CHECK_MESSAGES = true; public static void checkMessage(ProcessResult pr, int i) { if (CHECK_MESSAGES) { String m = getMessage(i).substring(0, 60);//there are variables in some cases, so cut it before boolean stdout = pr.stdout.contains(m); boolean stderr = pr.stderr.contains(m); Assert.assertTrue("result should contains " + m + " have not", stderr || stdout); } } @NeedsDisplay @Test public void ApplicationJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, GENERAL_NAME + SIGNATURE + ".jnlp"); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 4); } @Test public void ApplicationJNLPLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + ".jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } public static void prepareCopyFile(String s) throws IOException { String orig = FileUtils.loadFileAsString(new File(server.getDir() + "/" + s + ".jnlp")); String processed = orig.replace("codebase=\".\"", "codebase=\"" + server.getUrl().toExternalForm() + "\""); FileUtils.saveFile(processed, new File(server.getDir() + "/" + s + "_copy.jnlp")); } private static void prepareCopyFile() throws IOException { prepareCopyFile(GENERAL_NAME + SIGNATURE); } @Test public void ApplicationJNLPLocalTestWithRemoteCodebase() throws Exception { prepareCopyFile(); List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + "_copy.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 4); } @NeedsDisplay @Test public void AppletJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, GENERAL_NAME + SIGNATURE + "Applet.jnlp"); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 4); } @NeedsDisplay @Test public void AppletJNLPRLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + "Applet.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser(GENERAL_NAME + SIGNATURE + "Jnlp.html", ServerAccess.AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 4); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefLocalTest() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(GENERAL_NAME + SIGNATURE + "Jnlp.html"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir(), new AutoOkClosingListener(), null); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserAppletLocalTest() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(GENERAL_NAME + SIGNATURE + ".html"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir(), new AutoOkClosingListener(), null); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserAppletRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser(GENERAL_NAME + SIGNATURE + ".html", ServerAccess.AutoClose.CLOSE_ON_CORRECT_END); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 4); } } icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/PaxHeaders.740000644000000000000000000000034513441742745030737 xustar00140 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedNotMatching.java 30 mtime=1552401893.095832706 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManif0000644000175000002070000001752613441742745034342 0ustar00jvanekmock00000000000000/* ClasspathManifestTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class CodeBaseManifestEntrySignedNotMatching extends BrowserTest { RulesFolowingClosingListener.ContainsRule aokr = new RulesFolowingClosingListener.ContainsRule(AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING); RulesFolowingClosingListener.ContainsRule eekr = new RulesFolowingClosingListener.ContainsRule(LaunchException.class.getSimpleName()); public static final String GENERAL_NAME = "CodeBaseManifestEntry"; public static final String SIGNATURE = "SignedNotMatching"; private static DeploymentPropertiesModifier codebaseModifier; @BeforeClass public static void setupDeploymentProperties() throws IOException { codebaseModifier = new DeploymentPropertiesModifier(); codebaseModifier.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.CODEBASE.toString()); } @AfterClass public static void setbackDeploymentProperties() throws IOException { codebaseModifier.restoreProperties(); } public void checkMessage(ProcessResult pr, int i) { CodeBaseManifestEntrySignedMatching.checkMessage(pr, i); } @NeedsDisplay @Test public void ApplicationJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, GENERAL_NAME + SIGNATURE + ".jnlp"); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 6); } @NeedsDisplay @Test public void ApplicationJNLPLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + ".jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } private static void prepareCopyFile() throws IOException { CodeBaseManifestEntrySignedMatching.prepareCopyFile(GENERAL_NAME + SIGNATURE); } @Test public void ApplicationJNLPLocalTestWithRemoteCodebase() throws Exception { prepareCopyFile(); List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + "_copy.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 6); } @Test public void AppletJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, GENERAL_NAME + SIGNATURE + "Applet.jnlp"); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 6); } @NeedsDisplay @Test public void AppletJNLPRLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(GENERAL_NAME + SIGNATURE + "Applet.jnlp"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser(GENERAL_NAME + SIGNATURE + "Jnlp.html", new AutoOkClosingListener(), new RulesFolowingClosingListener(eekr)); Assert.assertFalse(aokr.toFailingString(), aokr.evaluate(pr.stdout)); Assert.assertTrue(eekr.toPassingString(), eekr.evaluate(pr.stderr)); checkMessage(pr, 5); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefLocalTest() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(GENERAL_NAME + SIGNATURE + "Jnlp.html"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir(), new AutoOkClosingListener(), null); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserAppletLocalTest() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(GENERAL_NAME + SIGNATURE + ".html"); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir(), new AutoOkClosingListener(), null); Assert.assertTrue(aokr.toPassingString(), aokr.evaluate(pr.stdout)); checkMessage(pr, 0); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserAppletRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser(GENERAL_NAME + SIGNATURE + ".html", new AutoOkClosingListener(), new RulesFolowingClosingListener(eekr)); Assert.assertFalse(aokr.toFailingString(), aokr.evaluate(pr.stdout)); Assert.assertTrue(eekr.toPassingString(), eekr.evaluate(pr.stderr)); checkMessage(pr, 5); } } icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/PaxHeaders.7406/resourc0000644000000000000000000000013013441742745030561 xustar0029 mtime=1552401893.12783264 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/0000755000175000002070000000000013441742745032000 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/PaxHeaders.740000644000000000000000000000034213441742745030750 xustar00137 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/CodeBaseManifestEntrySignedMatching.jnlp 30 mtime=1552401893.100832696 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/CodeBaseManif0000644000175000002070000000442313441742745034346 0ustar00jvanekmock00000000000000 ClasspathManifest IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/PaxHeaders.740000644000000000000000000000034113441742745030747 xustar00137 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/CodeBaseManifestEntrySignedMatching.html 29 mtime=1552401893.12783264 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/CodeBaseManif0000644000175000002070000000356613441742745034355 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/PaxHeaders.740000644000000000000000000000035013441742745030747 xustar00143 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/CodeBaseManifestEntrySignedMatchingApplet.jnlp 30 mtime=1552401893.087832723 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/CodeBaseManif0000644000175000002070000000461713441742745034353 0ustar00jvanekmock00000000000000 Classpath Manifest Applet Test IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/PaxHeaders.740000644000000000000000000000034613441742745030754 xustar00141 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/CodeBaseManifestEntrySignedMatchingJnlp.html 30 mtime=1552401893.090832717 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/resources/CodeBaseManif0000644000175000002070000000353713441742745034353 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745030052 xustar0030 mtime=1552401893.091832715 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/srcs/0000755000175000002070000000000013441742745030740 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/srcs/PaxHeaders.7406/Co0000644000000000000000000000033513441742745030421 xustar00132 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/srcs/CodeBaseManifestEntrySignedMatching.java 30 mtime=1552401893.090832717 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/srcs/CodeBaseManifestEn0000644000175000002070000000454113441742745034306 0ustar00jvanekmock00000000000000/* ClasspathManifest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class CodeBaseManifestEntrySignedMatching extends Applet { private class Killer extends Thread { public int n = 1000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; public static void main(String[] args) { x(); } @Override public void start() { x(); killer = new Killer(); killer.start(); } public static void x() { System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/srcs/PaxHeaders.7406/ME0000644000000000000000000000013113441742745030353 xustar0030 mtime=1552401893.091832715 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/srcs/META-INF/0000755000175000002070000000000013441742745032100 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/srcs/META-INF/PaxHeader0000644000000000000000000000031113441742745030430 xustar00112 path=icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/srcs/META-INF/MANIFEST.MF 30 mtime=1552401893.091832715 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/srcs/META-INF/MANIFEST.0000644000175000002070000000017213441742745033307 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Codebase: http://localhost https://localhost Application-Name: CodeBaseManifestEntrySignedMatching icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/ClipboardContentSigned0000644000000000000000000000013113441742745024501 xustar0030 mtime=1552401893.094832708 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/0000755000175000002070000000000013441742745025367 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025453 xustar0030 mtime=1552401893.084832729 29 atime=1552410887.11018345 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/srcs/0000755000175000002070000000000013441742745026341 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/srcs/PaxHeaders.7406/ClipboardConten0000644000000000000000000000013113441742745030521 xustar0030 mtime=1552401893.084832729 29 atime=1552402157.26425342 30 ctime=1552410887.074183534 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/srcs/ClipboardContentSigned.java0000644000175000002070000001621513441742745033575 0ustar00jvanekmock00000000000000/* ClipboardContentSigned.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.concurrent.TimeUnit; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.text.JTextComponent; public class ClipboardContentSigned extends JPanel { private static final String contentC = "COPY#$REPRODUCER"; private static final String contentP = "PASTE#$REPRODUCER"; private static class LocalFrame extends JFrame { JTextField t; public LocalFrame(String str) { super(); t = new JTextField(str); this.add(t); this.setSize(100, 100); this.pack(); t.selectAll(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void run() throws InterruptedException { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { setVisible(true); } }); while (!this.isVisible()) { Thread.sleep(100); } } public JTextField getT() { return t; } } public void putToClipboard1(String str) { Toolkit toolkit = Toolkit.getDefaultToolkit(); Clipboard clipboard = toolkit.getSystemClipboard(); StringSelection strSel = new StringSelection(str); clipboard.setContents(strSel, null); printFlavors(); } public void putToClipboard2(final String str) throws InterruptedException, NoSuchMethodException, IllegalAccessException, UnsupportedFlavorException, IllegalArgumentException, InvocationTargetException, IOException { final LocalFrame lf = new LocalFrame(str); lf.run(); ((JTextComponent) (lf.getT())).copy(); printFlavors(); lf.dispose(); } public String pasteFromClipboard2() throws InterruptedException, NoSuchMethodException, IllegalAccessException, UnsupportedFlavorException, IllegalArgumentException, InvocationTargetException, IOException { final LocalFrame lf = new LocalFrame("xxx"); lf.run(); ((JTextComponent) (lf.getT())).paste(); printFlavors(); String s = lf.getT().getText(); lf.dispose(); return s; } private void printFlavors() { //just for debugging // Toolkit toolkit = Toolkit.getDefaultToolkit(); // Clipboard clipboard = toolkit.getSystemClipboard(); // Transferable clipData = clipboard.getContents(clipboard); // DataFlavor[] cd = clipData.getTransferDataFlavors(); // for (DataFlavor dataFlavor : cd) { // System.out.println(dataFlavor.getMimeType()); // } } public String pasteFromClipboard1() throws UnsupportedFlavorException, IOException { Toolkit toolkit = Toolkit.getDefaultToolkit(); Clipboard clipboard = toolkit.getSystemClipboard(); Transferable clipData = clipboard.getContents(clipboard); printFlavors(); String s = (String) (clipData.getTransferData( DataFlavor.stringFlavor)); return s; } public static void main(String[] args) throws Exception { ClipboardContentSigned cl = new ClipboardContentSigned(); if (args.length == 0) { throw new IllegalArgumentException("at least copy1|2 or paste1|2 must be as argument (+mandatory number giving use timeout in seconds before termination)"); } else if (args.length == 1) { cl.proceed(args[0]); } else { cl.proceed(args[0], args[1]); } } public void proceed(String arg) throws Exception { proceed(arg, 0); } public void proceed(String arg, String keepAliveFor) throws Exception { proceed(arg, Long.valueOf(keepAliveFor)); } public void proceed(String arg, long timeOut) throws Exception { if (arg.equals("copy1")) { System.out.println(this.getClass().getName() + " copying1 to clipboard " + contentC); putToClipboard1(contentC); System.out.println(this.getClass().getName() + " copied1 to clipboard " + pasteFromClipboard1()); } else if (arg.equals("paste1")) { System.out.println(this.getClass().getName() + " pasting1 from clipboard "); String nwContent = pasteFromClipboard1(); System.out.println(this.getClass().getName() + " pasted1 from clipboard " + nwContent); } else if (arg.equals("copy2")) { System.out.println(this.getClass().getName() + " copying2 to clipboard " + contentC); putToClipboard2(contentC); System.out.println(this.getClass().getName() + " copied2 to clipboard " + pasteFromClipboard2()); } else if (arg.equals("paste2")) { System.out.println(this.getClass().getName() + " pasting2 from clipboard "); String nwContent = pasteFromClipboard2(); System.out.println(this.getClass().getName() + " pasted2 from clipboard " + nwContent); } else { throw new IllegalArgumentException("supported copy1|2 paste1|2"); } long start = System.nanoTime(); while (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start) < timeOut) { Thread.sleep(500); } } } icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/PaxHeaders.7406/resources0000644000000000000000000000013113441742745026513 xustar0030 mtime=1552401893.091832715 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/0000755000175000002070000000000013441742745027401 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/PaxHeaders.7406/ClipboardC0000644000000000000000000000031513441742745030521 xustar00116 path=icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy1.jnlp 30 mtime=1552401893.086832725 29 atime=1552402157.26425342 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy0000644000175000002070000000450713441742745034551 0ustar00jvanekmock00000000000000 ClipboardContentSignedCopy1 IcedTea ClipboardContentSignedCopy1 copy1 10 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/PaxHeaders.7406/ClipboardC0000644000000000000000000000031613441742745030522 xustar00117 path=icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste1.jnlp 30 mtime=1552401893.090832717 29 atime=1552402157.26425342 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedPast0000644000175000002070000000445313441742745034546 0ustar00jvanekmock00000000000000 ClipboardContentSignedPaste1 IcedTea ClipboardContentSignedPaste1 paste1 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/PaxHeaders.7406/ClipboardC0000644000000000000000000000031513441742745030521 xustar00116 path=icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy2.jnlp 30 mtime=1552401893.089832719 29 atime=1552402157.26425342 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy0000644000175000002070000000450713441742745034551 0ustar00jvanekmock00000000000000 ClipboardContentSignedCopy2 IcedTea ClipboardContentSignedCopy2 copy2 10 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/PaxHeaders.7406/ClipboardC0000644000000000000000000000031613441742745030522 xustar00117 path=icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste2.jnlp 30 mtime=1552401893.091832715 29 atime=1552402157.26425342 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedPast0000644000175000002070000000445313441742745034546 0ustar00jvanekmock00000000000000 ClipboardContentSignedPaste2 IcedTea ClipboardContentSignedPaste2 paste2 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745026477 xustar0030 mtime=1552401893.094832708 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/testcases/0000755000175000002070000000000013441742745027365 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/testcases/PaxHeaders.7406/ClipboardC0000644000000000000000000000031513441742745030505 xustar00116 path=icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/testcases/ClipboardContentSignedTests.java 30 mtime=1552401893.094832708 29 atime=1552402157.26425342 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClipboardContentSigned/testcases/ClipboardContentSignedTest0000644000175000002070000001323113441742745034534 0ustar00jvanekmock00000000000000/* ClipboardContentSignedTests.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ContentReaderListener; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.tools.AsyncJavaws; import static net.sourceforge.jnlp.tools.ClipboardHelpers.pasteFromClipboard; import static net.sourceforge.jnlp.tools.ClipboardHelpers.putToClipboard; import net.sourceforge.jnlp.tools.WaitingForStringProcess; import org.junit.Assert; import org.junit.Test; @Bug(id = "PR708") public class ClipboardContentSignedTests { private static final String contentC = "COPY#$REPRODUCER"; private static final String contentP = "PASTE#$REPRODUCER"; private static final String emptyContent = "empty content"; private static ServerAccess server = new ServerAccess(); private static final List javawsTrustArg = Collections.unmodifiableList(Arrays.asList(new String[]{"-Xtrustall"})); @Test public void assertClipboardIsWorking() throws Exception { putToClipboard(emptyContent); Assert.assertEquals("Clipboard must contain new value, did not", emptyContent, pasteFromClipboard()); putToClipboard(contentC); Assert.assertEquals("Clipboard must contain new value, did not", contentC, pasteFromClipboard()); } @Test @Bug(id = "PR708") public void ClipboardContentSignedTestCopy1() throws Exception { putToClipboard(emptyContent); Assert.assertEquals("Clipboard must contain new value, did not", emptyContent, pasteFromClipboard()); WaitingForStringProcess wfsp = new WaitingForStringProcess(server, "/ClipboardContentSignedCopy1.jnlp", javawsTrustArg, true, "copied"); wfsp.run(); String ss = pasteFromClipboard(); Assert.assertEquals("Clipboard must contain new value, did not", contentC, ss); } @Test @Bug(id = "PR708") @NeedsDisplay public void ClipboardContentSignedTestCopy2() throws Exception { putToClipboard(emptyContent); Assert.assertEquals("Clipboard must contain new value, did not", emptyContent, pasteFromClipboard()); WaitingForStringProcess wfsp = new WaitingForStringProcess(server, "/ClipboardContentSignedCopy2.jnlp", javawsTrustArg, false, "copied"); wfsp.run(); String ss = pasteFromClipboard(); Assert.assertEquals("Clipboard must contain new value, did not", contentC, ss); } @Test @Bug(id = "PR708") public void ClipboardContentSignedTestPaste1() throws Exception { //necessery errasing putToClipboard(emptyContent); Assert.assertEquals("Clipboard must contain new value, did not", emptyContent, pasteFromClipboard()); //now put the tested data putToClipboard(contentP); Assert.assertEquals("Clipboard must contain new value, did not", contentP, pasteFromClipboard()); ProcessResult pr = server.executeJavawsHeadless(javawsTrustArg, "/ClipboardContentSignedPaste1.jnlp"); Assert.assertTrue("ClipboardContentSignedTestPaste stdout should contain " + contentP + " but didn't", pr.stdout.contains(contentP)); } @Test @Bug(id = "PR708") @NeedsDisplay public void ClipboardContentSignedTestPaste2() throws Exception { //necessery errasing putToClipboard(emptyContent); Assert.assertEquals("Clipboard must contain new value, did not", emptyContent, pasteFromClipboard()); //now put the tested data putToClipboard(contentP); Assert.assertEquals("Clipboard must contain new value, did not", contentP, pasteFromClipboard()); Assert.assertEquals("Clipboard must contain new value, did not", contentP, pasteFromClipboard()); ProcessResult pr = server.executeJavaws(javawsTrustArg, "/ClipboardContentSignedPaste2.jnlp"); Assert.assertTrue("ClipboardContentSignedTestPaste stdout should contain " + contentP + " but didn't", pr.stdout.contains(contentP)); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/ClasspathManifestTest0000644000000000000000000000013113441742745024366 xustar0030 mtime=1552401893.100832696 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/0000755000175000002070000000000013441742745025254 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745026364 xustar0030 mtime=1552401893.100832696 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/testcases/0000755000175000002070000000000013441742745027252 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/testcases/PaxHeaders.7406/ClasspathMa0000644000000000000000000000013213441742745030565 xustar0030 mtime=1552401893.100832696 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/testcases/ClasspathManifestTest.java0000644000175000002070000002234513441742745034374 0ustar00jvanekmock00000000000000/* ClasspathManifestTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.util.FileUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class ClasspathManifestTest extends BrowserTest { private static final String s1 = "Searching for CheckForClasspath."; private static final String s2 = "CheckForClasspath found on classpath."; private static final String ss = "xception"; private static final String n1 = "ClasspathManifestJNLPHrefTest.html"; private static final String n4 = "ClasspathManifestApplicationTest.jnlp"; private static final String n2 = "ClasspathManifestAppletTest.jnlp"; private static final String n3 = "ClasspathManifestAppletTest.html"; private static final String[] ns = new String[]{n1, n2, n3, n4}; private static final String n0 = "ClasspathManifestTest.jar"; private static File newRoot; private static File newRoot1; public void checkAppFails(ProcessResult pr, String testName) { Assert.assertTrue("ClasspathManifest." + testName + " stdout should contain " + s1 + " but didn't", pr.stdout.contains(s1)); Assert.assertFalse("ClasspathManifest." + testName + " stdout should not contain " + s2 + " but did", pr.stdout.contains(s2)); Assert.assertTrue("ClasspathManifest." + testName + " stderr should contain " + ss + " but didn't", pr.stderr.contains(ss)); } public void checkAppPass(ProcessResult pr, String testName) { Assert.assertTrue("ClasspathManifest." + testName + " stdout should contain " + s1 + " but didn't", pr.stdout.contains(s1)); Assert.assertTrue("ClasspathManifest." + testName + " stdout should not contain " + s2 + " but did", pr.stdout.contains(s2)); Assert.assertFalse("ClasspathManifest." + testName + " stderr should contain " + ss + " but didn't", pr.stderr.contains(ss)); } @AfterClass public static void removeAlternativeLocalDirs() throws IOException { FirefoxProfilesOperator.deleteRecursively(newRoot); } @BeforeClass public static void createAlternativeLocalDirs() throws IOException { newRoot = File.createTempFile("itw", "ClasspathManifestTest"); newRoot.delete(); newRoot.mkdirs(); newRoot.deleteOnExit(); newRoot1 = new File(newRoot, "r1"); newRoot1.mkdir(); FirefoxProfilesOperator.copyRecursively(new File(server.getDir(), "Classpath"), newRoot); for (String n : ns) { copyTextFile(new File(server.getDir(), n), new File(newRoot, n)); } FirefoxProfilesOperator.copyFile(new File(server.getDir(), n0), new File(newRoot1, n0)); } public static void copyTextFile(File from, File to) throws IOException { String s = FileUtils.loadFileAsString(from); // for (String n : ns) { // s = s.replaceAll(n, newRoot1.getName()+"/" + n); // } s = s.replaceAll(n0, newRoot1.getName() + "/" + n0); FileUtils.saveFile(s, to); } @NeedsDisplay @Test public void ApplicationJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/" + n4); checkAppFails(pr, "ApplicationJNLPRemoteTest"); } /** * See the difference between *LocalTest() and *LocalTest_differentDir(). * * Itw always have "." on classpath. So * * ./jnlp or ./html (calling to jar.jar) + ./jar.jar + * ./Codebase/../second.jar are all on classapth but ./jnlp or ./html * (calling to someDir/jar.jar)+ ./someDir/jar.jar + * ./Codebase/../second.jar Is making the jar.jar laodable for startup, but * diapearing after encauntering Class-Path: in Manifest.mf * * @throws Exception */ @NeedsDisplay @Test public void ApplicationJNLPLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(n4); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); checkAppPass(pr, "ApplicationJNLPLocalTest"); } @NeedsDisplay @Test public void ApplicationJNLPLocalTest_differentDir() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(n4); ProcessResult pr = ServerAccess.executeProcess(commands, newRoot); checkAppFails(pr, "ApplicationJNLPLocalTest_differentDir"); } @NeedsDisplay @Test public void AppletJNLPRemoteTest() throws Exception { ProcessResult pr = server.executeJavawsHeadless(null, "/" + n2); checkAppFails(pr, "AppletJNLPRemoteTest"); } @NeedsDisplay @Test public void AppletJNLPRLocalTest() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(n2); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); checkAppPass(pr, "AppletJNLPRLocalTest"); } @NeedsDisplay @Test public void AppletJNLPRLocalTest_differentDir() throws Exception { List commands = new ArrayList<>(3); commands.add(server.getJavawsLocation()); commands.add(ServerAccess.HEADLES_OPTION); commands.add(n2); ProcessResult pr = ServerAccess.executeProcess(commands, newRoot); checkAppFails(pr, "AppletJNLPRLocalTest_differentDir"); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser("/" + n1); checkAppFails(pr, "BrowserJNLPHrefRemoteTest"); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefLocalTest() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(n1); ProcessResult pr = ServerAccess.executeProcess(commands, server.getDir()); checkAppPass(pr, "BrowserJNLPHrefLocalTest"); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserJNLPHrefLocalTest_differentDir() throws Exception { List commands = new ArrayList<>(2); commands.add(server.getBrowserLocation()); commands.add(n1); ProcessResult pr = ServerAccess.executeProcess(commands, newRoot); checkAppFails(pr, "BrowserJNLPHrefLocalTest_differentDir"); } @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) @Test public void BrowserAppletRemoteTest() throws Exception { ProcessResult pr = server.executeBrowser("/" + n3); Assert.assertTrue("ClasspathManifest.BrowserAppletRemoteTest stdout should contain " + s1 + " but didn't", pr.stdout.contains(s1)); // Should be the only one to search manifest for classpath. Assert.assertTrue("ClasspathManifest.BrowserAppletRemoteTest stdout should contain " + s2 + " but didn't", pr.stdout.contains(s2)); } } icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/PaxHeaders.7406/resources0000644000000000000000000000013113441742745026400 xustar0030 mtime=1552401893.090832717 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/0000755000175000002070000000000013441742745027266 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/PaxHeaders.7406/ClasspathMa0000644000000000000000000000031713441742745030606 xustar00117 path=icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestJNLPHrefTest.html 30 mtime=1552401893.083832731 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestJNLPHrefTe0000644000175000002070000000346113441742745034410 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/PaxHeaders.7406/ClasspathMa0000644000000000000000000000031513441742745030604 xustar00115 path=icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestAppletTest.jnlp 30 mtime=1552401893.089832719 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestAppletTest0000644000175000002070000000451713441742745034637 0ustar00jvanekmock00000000000000 Classpath Manifest Applet Test IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/PaxHeaders.7406/ClasspathMa0000644000000000000000000000031513441742745030604 xustar00115 path=icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestAppletTest.html 30 mtime=1552401893.088832721 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestAppletTest0000644000175000002070000000351213441742745034631 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/PaxHeaders.7406/ClasspathMa0000644000000000000000000000032213441742745030602 xustar00120 path=icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestApplicationTest.jnlp 30 mtime=1552401893.090832717 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestApplicatio0000644000175000002070000000436013441742745034633 0ustar00jvanekmock00000000000000 ClasspathManifest IcedTea ClasspathManifest icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025340 xustar0030 mtime=1552401893.126832642 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/srcs/0000755000175000002070000000000013441742745026226 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013113441742745026500 xustar0030 mtime=1552401893.126832642 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/srcs/META-INF/0000755000175000002070000000000013441742745027366 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/srcs/META-INF/PaxHeaders.7406/MANIFES0000644000000000000000000000013213441742745027563 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/srcs/META-INF/MANIFEST.MF0000644000175000002070000000015613441742745031022 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Class-Path: Classpath/Manifest/Test/Helper.jar Application-Name: ClasspathManifestTest icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/srcs/PaxHeaders.7406/ClasspathManifes0000644000000000000000000000013213441742745030566 xustar0030 mtime=1552401893.094832708 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/ClasspathManifestTest/srcs/ClasspathManifest.java0000644000175000002070000000544213441742745032507 0ustar00jvanekmock00000000000000/* ClasspathManifest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.lang.reflect.*; public class ClasspathManifest extends Applet { private class Killer extends Thread { public int n = 1000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; public static void main(String[] args) { searchForClasspath(); } @Override public void init() { searchForClasspath(); killer = new Killer(); killer.start(); } public static void searchForClasspath() { System.out.println("Searching for CheckForClasspath."); try { Class checkClass = Class.forName("CheckForClasspath"); Method checkMethod = checkClass.getDeclaredMethod("checkClasspathAndPrint"); checkMethod.invoke((Object) null); } catch (Exception ex) { System.out.println("Exception was thrown, class not found on classpath."); ex.printStackTrace(); } } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/CheckPluginParams0000644000000000000000000000013113441742745023455 xustar0030 mtime=1552401893.126832642 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/0000755000175000002070000000000013441742745024343 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745025453 xustar0030 mtime=1552401893.099832698 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/testcases/0000755000175000002070000000000013441742745026341 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/testcases/PaxHeaders.7406/CheckPluginPara0000644000000000000000000000013213441742745030454 xustar0030 mtime=1552401893.099832698 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/testcases/CheckPluginParamsTests.java0000644000175000002070000001004613441742745033570 0ustar00jvanekmock00000000000000/* CheckPluginParamsTests.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @Bug(id = "RH1273691") public class CheckPluginParamsTests extends BrowserTest { private static DeploymentPropertiesModifier d; private static final String ID = "test.custom"; @BeforeClass public static void setup() throws IOException { String value = " -D" + ID + "1=value1" + " -D" + ID + "2\\=value2=value2" + " -D" + ID + "3=value3\\=value3" + " -D" + ID + "4\\=value4\\\\=value4"; d = new DeploymentPropertiesModifier(); d.setProperties(DeploymentConfiguration.KEY_PLUGIN_JVM_ARGUMENTS, value); } @AfterClass public static void tearDown() throws IOException { d.restoreProperties(); } public void evaluateApplet(ProcessResult pr) { String s = pr.stdout; Assert.assertTrue(s.contains(ID + "1: value1")); Assert.assertTrue(s.contains(ID + "2: value2=value2")); Assert.assertTrue(s.contains(ID + "3: value3=value3")); Assert.assertTrue(s.contains(ID + "4: value4\\=value4")); } @Bug(id = "RH1273691") @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void CheckWebstartServices() throws Exception { ProcessResult pr = server.executeBrowser(null, "/CheckPluginParams1.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); evaluateApplet(pr); } @Bug(id = "RH1273691") @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void CheckPluginJNLPHServices() throws Exception { ProcessResult pr = server.executeBrowser(null, "/CheckPluginParams2.html", new AutoOkClosingListener(), new AutoErrorClosingListener()); evaluateApplet(pr); } } icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745024427 xustar0030 mtime=1552401893.126832642 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/srcs/0000755000175000002070000000000013441742745025315 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/srcs/PaxHeaders.7406/CheckPluginParams.ja0000644000000000000000000000013213441742745030361 xustar0030 mtime=1552401893.126832642 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/srcs/CheckPluginParams.java0000644000175000002070000000444213441742745031524 0ustar00jvanekmock00000000000000/* CheckPluginParams.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class CheckPluginParams extends Applet { private static final String ID ="test.custom"; public static void main(String... args){ System.out.println(""+ID+"1: "+System.getProperty(""+ID+"1")); System.out.println(""+ID+"2: "+System.getProperty(""+ID+"2")); System.out.println(""+ID+"3: "+System.getProperty(""+ID+"3")); System.out.println(""+ID+"4: "+System.getProperty(""+ID+"4")); } @Override public void init() { main(); } @Override public void start() { //main(); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/PaxHeaders.7406/resources0000644000000000000000000000013113441742745025467 xustar0030 mtime=1552401893.093832711 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/resources/0000755000175000002070000000000013441742745026355 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/resources/PaxHeaders.7406/CheckPluginPara0000644000000000000000000000013213441742745030470 xustar0030 mtime=1552401893.083832731 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/resources/CheckPluginParams1.html0000644000175000002070000000344513441742745032672 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/resources/PaxHeaders.7406/CheckPluginPara0000644000000000000000000000013213441742745030470 xustar0030 mtime=1552401893.093832711 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/resources/CheckPluginParams2.html0000644000175000002070000000342713441742745032673 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/resources/PaxHeaders.7406/CheckPluginPara0000644000000000000000000000013213441742745030470 xustar0030 mtime=1552401893.090832717 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/CheckPluginParams/resources/CheckPluginParams.jnlp0000644000175000002070000000435013441742745032604 0ustar00jvanekmock00000000000000 CheckPluginParams IcedTea CheckPluginParams icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/AppletTestSigned0000644000000000000000000000013113441742745023334 xustar0030 mtime=1552401893.089832719 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/0000755000175000002070000000000013441742745024222 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745025332 xustar0030 mtime=1552401893.082832733 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/testcases/0000755000175000002070000000000013441742745026220 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/testcases/PaxHeaders.7406/AppletTestSigned0000644000000000000000000000013213441742745030552 xustar0030 mtime=1552401893.082832733 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java0000644000175000002070000002042313441742745033326 0ustar00jvanekmock00000000000000/* AppletTestSignedTests.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import static net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener.*; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import org.junit.Assert; import org.junit.Test; public class AppletTestSignedTests extends BrowserTest { private static final String s0 = "AppletTestSigned was started"; private static final String s1 = "value1"; private static final String s2 = "value2"; private static final String s3 = "AppletTestSigned was initialised"; private static final String s7 = "AppletTestSigned killing himself after 2000 ms of life"; private static final ContainsRule startedRule = new ContainsRule(s0); private static final ContainsRule variable1Rule = new ContainsRule(s1); private static final ContainsRule variable2Rule = new ContainsRule(s2); private static final ContainsRule initialisedRule = new ContainsRule(s3); private static final ContainsRule killedRule = new ContainsRule(s7); private static final RulesFolowingClosingListener okListener=new RulesFolowingClosingListener(startedRule, variable1Rule, variable2Rule, initialisedRule, killedRule); @Test public void AppletTestSignedTest() throws Exception { ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}), server.getUrl("AppletTestSigned.jnlp")); pw.setWriter("YES\nYES\n"); pw.addStdOutListener(new StringBasedClosingListener("killer was started")); ProcessResult pr = pw.execute(); evaluateSignedApplet(pr, true); //closing listener affected those two //Assert.assertFalse(pr.wasTerminated); //Assert.assertEquals((Integer) 0, pr.returnValue); } @Test @TestInBrowsers(testIn = {Browsers.one}) public void AppletTestSignedTestBrowser() throws Exception { ProcessWrapper pw = new ProcessWrapper(server.getBrowserLocation(), Arrays.asList(new String[]{}), server.getUrl("AppletTestSigned.html")); pw.setWriter("YES\nYES\n"); pw.addStdOutListener(new StringBasedClosingListener("killer was started")); ProcessResult pr = pw.execute(); evaluateSignedApplet(pr, true); } @Test public void AppletTestSignedTestHtmlSwitch() throws Exception { ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option, OptionsDefinitions.OPTIONS.HTML.option}), server.getUrl("AppletTestSigned.html")); pw.setWriter("YES\nYES\n"); pw.addStdOutListener(new StringBasedClosingListener("killer was started")); ProcessResult pr = pw.execute(); evaluateSignedApplet(pr, true); } @Test public void AppletTestSignedTestHtmlSwitchNotAffectedByJnlpProtocol() throws Exception { String jnlpUrl = "jnlp://localhost:" + server.getPort() + "/AppletTestSigned.html"; ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option, OptionsDefinitions.OPTIONS.HTML.option}), jnlpUrl); pw.setWriter("YES\nYES\n"); pw.addStdOutListener(new StringBasedClosingListener("killer was started")); ProcessResult pr = pw.execute(); Assert.assertTrue("jnlp protocol should not be recognized", pr.stderr.contains("Invalid jnlp file "+jnlpUrl)); //applet should not start Assert.assertFalse("AppletTestSigned stdout " + initialisedRule.toFailingString()+ " but didn't", initialisedRule.evaluate(pr.stdout)); Assert.assertFalse("AppletTestSigned stdout " + startedRule.toFailingString() + " but didn't", startedRule.evaluate(pr.stdout)); Assert.assertFalse("AppletTestSigned stdout " + variable1Rule.toFailingString() + " but didn't", variable1Rule.evaluate(pr.stdout)); Assert.assertFalse("AppletTestSigned stdout " + variable2Rule.toFailingString() + " but didn't", variable2Rule.evaluate(pr.stdout)); } private void evaluateSignedApplet(ProcessResult pr, boolean javawsApplet) { Assert.assertTrue("AppletTestSigned stdout " + initialisedRule.toPassingString() + " but didn't", initialisedRule.evaluate(pr.stdout)); Assert.assertTrue("AppletTestSigned stdout " + startedRule.toPassingString() + " but didn't", startedRule.evaluate(pr.stdout)); Assert.assertTrue("AppletTestSigned stdout " + variable1Rule.toPassingString() + " but didn't", variable1Rule.evaluate(pr.stdout)); Assert.assertTrue("AppletTestSigned stdout " + variable2Rule.toPassingString() + " but didn't", variable2Rule.evaluate(pr.stdout)); //Assert.assertTrue("AppletTestSigned stdout " + killedRule.toPassingString() + " but didn't", killedRule.evaluate(pr.stdout)); if (!javawsApplet) { /*this is working correctly in most browser, but not in all. temporarily disabling String s4 = "AppletTestSigned was stopped"; Assert.assertTrue("AppletTestSigned stdout shouldt contain " + s4 + " but did", pr.stdout.contains(s4)); String s5 = "AppletTestSigned will be destroyed"; Assert.assertTrue("AppletTestSigned stdout shouldt contain " + s5 + " but did", pr.stdout.contains(s5)); */ } } @Test @TestInBrowsers(testIn = {Browsers.one}) public void AppletTestSignedFirefoxTestXslowX() throws Exception { ServerAccess.PROCESS_TIMEOUT = 30 * 1000; try { ProcessResult pr = server.executeBrowser("/AppletTestSigned2.html", okListener, null); evaluateSignedApplet(pr, false); //Assert.assertTrue(pr.wasTerminated); //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null } finally { ServerAccess.PROCESS_TIMEOUT = 20 * 1000; //back to normal } } @Test @TestInBrowsers(testIn = {Browsers.one}) public void AppletTestSignedFirefoxTest() throws Exception { ProcessResult pr = server.executeBrowser("/AppletTestSigned.html", ServerAccess.AutoClose.CLOSE_ON_CORRECT_END); evaluateSignedApplet(pr, false); //Assert.assertTrue(pr.wasTerminated); //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null } } icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/PaxHeaders.7406/resources0000644000000000000000000000013113441742745025346 xustar0030 mtime=1552401893.088832721 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/resources/0000755000175000002070000000000013441742745026234 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/resources/PaxHeaders.7406/AppletTestSigned0000644000000000000000000000013213441742745030566 xustar0030 mtime=1552401893.085832727 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned.html0000644000175000002070000000356213441742745032347 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/resources/PaxHeaders.7406/AppletTestSigned0000644000000000000000000000013213441742745030566 xustar0030 mtime=1552401893.088832721 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned2.html0000644000175000002070000000357013441742745032430 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/resources/PaxHeaders.7406/AppletTestSigned0000644000000000000000000000013213441742745030566 xustar0030 mtime=1552401893.087832723 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned.jnlp0000644000175000002070000000452713441742745032350 0ustar00jvanekmock00000000000000 SignedAppletTest IcedTea SignedAppletTest icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745024306 xustar0030 mtime=1552401893.089832719 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/srcs/0000755000175000002070000000000013441742745025174 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/srcs/PaxHeaders.7406/AppletTestSigned.java0000644000000000000000000000013213441742745030446 xustar0030 mtime=1552401893.089832719 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppletTestSigned/srcs/AppletTestSigned.java0000644000175000002070000000541113441742745031257 0ustar00jvanekmock00000000000000/* AppletTestSigned.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class AppletTestSigned extends Applet { private class Killer extends Thread { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.out.println("AppletTestSigned killing himself after " + n + " ms of life"); System.out.println("*** APPLET FINISHED ***"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { System.out.println("AppletTestSigned was initialised"); killer = new Killer(); } @Override public void start() { System.out.println("AppletTestSigned was started"); System.out.println(getParameter("key1")); System.out.println(getParameter("key2")); killer.start(); System.out.println("killer was started"); } @Override public void stop() { System.out.println("AppletTestSigned was stopped"); } @Override public void destroy() { System.out.println("AppletTestSigned will be destroyed"); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/AppContextHasJNLPClassLoader0000644000000000000000000000013113441742745025437 xustar0030 mtime=1552401893.125832644 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/0000755000175000002070000000000013441742745026325 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/PaxHeaders.7406/testcases0000644000000000000000000000012713441742745027442 xustar0028 mtime=1552401893.0988327 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/testcases/0000755000175000002070000000000013441742745030323 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/testcases/PaxHeaders.7406/AppC0000644000000000000000000000032713441742745030267 xustar00127 path=icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/testcases/AppContextHasJNLPClassLoaderTest.java 28 mtime=1552401893.0988327 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/testcases/AppContextHasJNLPCla0000644000175000002070000001056613441742745034103 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.annotations.Bug; import org.junit.Assert; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.ProcessResult; import org.junit.Test; public class AppContextHasJNLPClassLoaderTest extends BrowserTest { private static final String MAIN_APP_CONTEXT_CLASSLOADER = "main-thread: app context classloader == JNLPClassLoader"; private static final String MAIN_THREAD_CONTEXT_CLASSLOADER = "main-thread: thread context classloader == JNLPClassLoader"; private static final String SWING_APP_CONTEXT_CLASSLOADER = "swing-thread: app context classloader == JNLPClassLoader"; private static final String SWING_THREAD_CONTEXT_CLASSLOADER = "swing-thread: thread context classloader == JNLPClassLoader"; private void assertHasJNLPClassLoaderAsContextClassloader(ProcessResult pr) { // This shouldn't fail even with PR1251 // If the main thread does not have the right context classloader, something is quite wrong Assert.assertTrue("stdout should contains '" + MAIN_THREAD_CONTEXT_CLASSLOADER + "', but did not", pr.stdout.contains(MAIN_THREAD_CONTEXT_CLASSLOADER)); // PR1251 Assert.assertTrue("stdout should contains '" + MAIN_APP_CONTEXT_CLASSLOADER + "', but did not", pr.stdout.contains(MAIN_APP_CONTEXT_CLASSLOADER)); Assert.assertTrue("stdout should contains '" + SWING_APP_CONTEXT_CLASSLOADER + "', but did not", pr.stdout.contains(SWING_APP_CONTEXT_CLASSLOADER)); Assert.assertTrue("stdout should contains '" + SWING_THREAD_CONTEXT_CLASSLOADER + "', but did not", pr.stdout.contains(SWING_THREAD_CONTEXT_CLASSLOADER)); } @Test @KnownToFail @Bug(id="PR1251") public void testJNLPApplicationAppContext() throws Exception { ProcessResult pr = server.executeJavawsHeadless("/AppContextHasJNLPClassLoader.jnlp"); assertHasJNLPClassLoaderAsContextClassloader(pr); } @Test @KnownToFail // EventQueue.invokeAndWait is broken in JNLP applets, see PR1253 @Bug(id={"PR1251","PR1253"}) public void testJNLPAppletAppContext() throws Exception { ProcessResult pr = server.executeJavaws("/AppContextHasJNLPClassLoaderForJNLPApplet.jnlp"); assertHasJNLPClassLoaderAsContextClassloader(pr); } @Test @TestInBrowsers(testIn={Browsers.one}) @KnownToFail @Bug(id="PR1251") public void testAppletAppContext() throws Exception { ProcessResult pr = server.executeBrowser("/AppContextHasJNLPClassLoader.html", AutoClose.CLOSE_ON_CORRECT_END); assertHasJNLPClassLoaderAsContextClassloader(pr); } } icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745026411 xustar0030 mtime=1552401893.125832644 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/srcs/0000755000175000002070000000000013441742745027277 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/srcs/PaxHeaders.7406/AppContex0000644000000000000000000000032013441742745030312 xustar00118 path=icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/srcs/AppContextHasJNLPClassLoader.java 30 mtime=1552401893.125832644 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/srcs/AppContextHasJNLPClassLoa0000644000175000002070000000626713441742745034064 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import sun.awt.AppContext; import java.awt.EventQueue; /* Hybrid applet/application */ public class AppContextHasJNLPClassLoader extends Applet { /* * Output the current context classloader, and the current AppContext's * stored context classloader. * * The context classloader should never be the system classloader for a * webstart application or applet in any thread. */ static void printClassloaders(String location) { ClassLoader appContextClassLoader = AppContext.getAppContext().getContextClassLoader(); ClassLoader threadContextClassLoader = Thread.currentThread().getContextClassLoader(); System.out.println(location + ": app context classloader == " + appContextClassLoader.getClass().getSimpleName()); System.out.println(location + ": thread context classloader == " + threadContextClassLoader.getClass().getSimpleName()); } /* Applet start point */ @Override public void start() { try { main(null); } catch (Exception e) { e.printStackTrace(); } } /* Application start point */ public static void main(String[] args) throws Exception { printClassloaders("main-thread"); EventQueue.invokeAndWait(new Runnable() { public void run() { printClassloaders("swing-thread"); } }); // NB: The following is for JNLP applets only try { System.exit(0); } catch (Exception e) {e.printStackTrace(); } } } icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/PaxHeaders.7406/resources0000644000000000000000000000013113441742745027451 xustar0030 mtime=1552401893.092832712 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/0000755000175000002070000000000013441742745030337 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/PaxHeaders.7406/AppC0000644000000000000000000000032513441742745030301 xustar00123 path=icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/AppContextHasJNLPClassLoader.jnlp 30 mtime=1552401893.082832733 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/AppContextHasJNLPCla0000644000175000002070000000446313441742745034116 0ustar00jvanekmock00000000000000 Test AppContext Classloader IcedTea Test that AppContext's context classloader is a JNLPClassLoader icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/PaxHeaders.7406/AppC0000644000000000000000000000034213441742745030300 xustar00136 path=icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/AppContextHasJNLPClassLoaderForJNLPApplet.jnlp 30 mtime=1552401893.092832712 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/AppContextHasJNLPCla0000644000175000002070000000463113441742745034113 0ustar00jvanekmock00000000000000 Test AppContext Classloader IcedTea Test that AppContext's context classloader is a JNLPClassLoader icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/PaxHeaders.7406/AppC0000644000000000000000000000032513441742745030301 xustar00123 path=icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/AppContextHasJNLPClassLoader.html 30 mtime=1552401893.088832721 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/AppContextHasJNLPCla0000644000175000002070000000347313441742745034116 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SignedJnlpResource0000644000000000000000000000013113441742745023662 xustar0030 mtime=1552401893.104832688 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/0000755000175000002070000000000013441742745024550 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/PaxHeaders.7406/resources0000644000000000000000000000013113441742745025674 xustar0030 mtime=1552401893.117832661 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/resources/0000755000175000002070000000000013441742745026562 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/resources/PaxHeaders.7406/MatchingSigned0000644000000000000000000000031213441742745030561 xustar00112 path=icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/resources/MatchingSignedJnlpExtension.jnlp 30 mtime=1552401893.117832661 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/resources/MatchingSignedJnlpExtension.jn0000644000175000002070000000461613441742745034527 0ustar00jvanekmock00000000000000 MATCHES SIGNED JNLP IcedTea MATCHES SIGNED JNLP icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/resources/PaxHeaders.7406/UnmatchingSign0000644000000000000000000000031413441742745030615 xustar00114 path=icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/resources/UnmatchingSignedJnlpExtension.jnlp 30 mtime=1552401893.101832694 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/resources/UnmatchingSignedJnlpExtension.0000644000175000002070000000473113441742745034540 0ustar00jvanekmock00000000000000 UnmatchingSignedJnlpExtension IcedTea UnmatchingSignedJnlpExtension icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745024634 xustar0030 mtime=1552401893.107832681 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/srcs/0000755000175000002070000000000013441742745025522 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/srcs/PaxHeaders.7406/SignedJnlpResource.0000644000000000000000000000013213441742745030460 xustar0030 mtime=1552401893.107832681 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/srcs/SignedJnlpResource.java0000644000175000002070000000340513441742745032134 0ustar00jvanekmock00000000000000/* SignedJnlpResource..java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SignedJnlpResource { public static void main(String[] args){ System.out.println("Running SignedJnlpResource..."); } } icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/srcs/PaxHeaders.7406/JNLP-INF0000644000000000000000000000013113441742745026011 xustar0030 mtime=1552401893.104832688 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/srcs/JNLP-INF/0000755000175000002070000000000013441742745026677 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/srcs/JNLP-INF/PaxHeaders.7406/APPLICATIO0000644000000000000000000000013213441742745027437 xustar0030 mtime=1552401893.104832688 30 atime=1552402157.263253422 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpResource/srcs/JNLP-INF/APPLICATION_TEMPLATE.jnlp0000644000175000002070000000405413441742745032625 0ustar00jvanekmock00000000000000 MATCHES SIGNED JNLP * MATCHES SIGNED JNLP icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SignedJnlpCaseTestOne0000644000000000000000000000013113441742745024250 xustar0030 mtime=1552401893.109832677 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/0000755000175000002070000000000013441742745025136 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745025222 xustar0030 mtime=1552401893.117832661 29 atime=1552410887.11018345 30 ctime=1552410887.073183536 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/srcs/0000755000175000002070000000000013441742745026110 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/srcs/PaxHeaders.7406/JNLP-INF0000644000000000000000000000013113441742745026377 xustar0030 mtime=1552401893.117832661 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/srcs/JNLP-INF/0000755000175000002070000000000013441742745027265 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/srcs/JNLP-INF/PaxHeaders.7406/aPpLiCa0000644000000000000000000000013213441742745027651 xustar0030 mtime=1552401893.117832661 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/srcs/JNLP-INF/aPpLiCaTioN.jnlp0000644000175000002070000000442413441742745032221 0ustar00jvanekmock00000000000000 SignedJnlpCaseTest IcedTea SignedJnlpCaseTest icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/srcs/PaxHeaders.7406/SignedJnlpCase.j0000644000000000000000000000013213441742745030304 xustar0030 mtime=1552401893.101832694 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/srcs/SignedJnlpCase.java0000644000175000002070000000340213441742745031603 0ustar00jvanekmock00000000000000/* SignedJnlpCase.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SignedJnlpCase { public static void main(String[] args) { System.out.println("Running signed application in main"); } } icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745026246 xustar0030 mtime=1552401893.104832688 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/testcases/0000755000175000002070000000000013441742745027134 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/testcases/PaxHeaders.7406/SignedJnlpC0000644000000000000000000000013213441742745030407 xustar0030 mtime=1552401893.104832688 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/testcases/SignedJnlpCaseOneTest.java0000644000175000002070000000557313441742745034144 0ustar00jvanekmock00000000000000/* SignedJnlpCaseOneTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class SignedJnlpCaseOneTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); @Test public void launchingFileMatchesSigned() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpCaseTestOne1.jnlp"); String s = "Running signed application in main"; Assert.assertTrue("Stdout should contains " + s + " but did not", pr.stdout.contains(s)); } @Test public void launchingFileDoesNotMatchSigned() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJnlpCaseTestOne2.jnlp"); String s = "net.sourceforge.jnlp.LaunchException: Fatal: Application Error: The signed " + "JNLP file did not match the launching JNLP file. Missing Resource: Signed Application did not match " + "launching JNLP File"; Assert.assertTrue("Stderr should contains " + s + " but did not", pr.stderr.contains(s)); } } icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/PaxHeaders.7406/resources0000644000000000000000000000013113441742745026262 xustar0030 mtime=1552401893.141832611 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/resources/0000755000175000002070000000000013441742745027150 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/resources/PaxHeaders.7406/SignedJnlpC0000644000000000000000000000013213441742745030423 xustar0030 mtime=1552401893.141832611 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/resources/SignedJnlpCaseTestOne2.jnlp0000644000175000002070000000443013441742745034253 0ustar00jvanekmock00000000000000 SignedJnlpCaseTest 2 IcedTea SignedJnlpCaseTest 2 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/resources/PaxHeaders.7406/SignedJnlpC0000644000000000000000000000013213441742745030423 xustar0030 mtime=1552401893.109832677 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedJnlpCaseTestOne/resources/SignedJnlpCaseTestOne1.jnlp0000644000175000002070000000442413441742745034255 0ustar00jvanekmock00000000000000 SignedJnlpCaseTest IcedTea SignedJnlpCaseTest icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SignedAppletManifestSpecifiesSandbox0000644000000000000000000000013113441742745027335 xustar0030 mtime=1552401893.105832685 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/0000755000175000002070000000000013441742745030223 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/PaxHeaders.7406/testca0000644000000000000000000000013113441742745030620 xustar0030 mtime=1552401893.105832685 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/testcases/0000755000175000002070000000000013441742745032221 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/testcases/PaxHeaders.70000644000000000000000000000035213441742745031106 xustar00144 path=icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/testcases/SignedAppletManifestSpecifiesSandboxTests.java 30 mtime=1552401893.105832685 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/testcases/SignedApplet0000644000175000002070000001431013441742745034522 0ustar00jvanekmock00000000000000/* SignedAppletManifestSpecifiesSandboxTests.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import static org.junit.Assert.assertTrue; import java.io.IOException; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class SignedAppletManifestSpecifiesSandboxTests extends BrowserTest { private static final String STARTING_STRING = "SignedAppletManifestSpecifiesSandbox applet starting"; private static final String CLOSE_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; private static final String EXPECTED_STDOUT_PRINT = "SECURITY EXCEPTION"; private static final String STACKTRACE_EX_TYPE = "AccessControlException"; private static final String JNLP_EXPECTED_STDOUT = "Initialization Error"; private static final String JNLP_EXPECTED_STDERR = "net.sourceforge.jnlp.LaunchException"; private static DeploymentPropertiesModifier deploymentPropertiesModifier; @BeforeClass public static void setupDeploymentProperties() throws IOException { deploymentPropertiesModifier = new DeploymentPropertiesModifier(); deploymentPropertiesModifier.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()); } @AfterClass public static void setbackDeploymentProperties() throws IOException { deploymentPropertiesModifier.restoreProperties(); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testSignedAppletWithSandboxPermissionsInManifestHtml() throws Exception { final ProcessResult pr = server.executeBrowser("SignedAppletManifestSpecifiesSandbox.html", new AutoOkClosingListener(), null); assertHtmlAppletInitializes(pr); assertHtmlAppletSecurityException(pr); assertHtmlAppletCloses(pr); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testSignedAppletWithSandboxPermissionsInManifestHtmlJnlpHref() throws Exception { final ProcessResult pr = server.executeBrowser("SignedAppletManifestSpecifiesSandboxJnlpHref.html", new AutoOkClosingListener(), null); assertHtmlAppletInitializes(pr); assertHtmlAppletSecurityException(pr); assertHtmlAppletCloses(pr); } /* * JNLP applets and applications are not allowed to have mismatched tags and manifest attributes */ @Test @Bug(id="PR1769") public void testSignedAppletWithSandboxPermissionsInManifestJnlpApplet() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("SignedAppletManifestSpecifiesSandboxApplet.jnlp"); assertJnlpFailsToLaunch(pr); } /* * JNLP applets and applications are not allowed to have mismatched tags and manifest attributes */ @Test @Bug(id="PR1769") public void testSignedAppletWithSandboxPermissionsInManifestJnlpApplication() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("SignedAppletManifestSpecifiesSandboxApplication.jnlp"); assertJnlpFailsToLaunch(pr); } private static void assertHtmlAppletInitializes(final ProcessResult pr) { assertTrue("Applet should have initialized", pr.stdout.contains(STARTING_STRING)); } private static void assertHtmlAppletSecurityException(final ProcessResult pr) { assertTrue("Applet should have printed SECURITY EXCEPTION", pr.stdout.contains(EXPECTED_STDOUT_PRINT)); assertTrue("Applet should have produced an AccessControlException stacktrace", pr.stderr.contains(STACKTRACE_EX_TYPE)); } private static void assertHtmlAppletCloses(final ProcessResult pr) { assertTrue("Applet should have printed its exit string", pr.stdout.contains(CLOSE_STRING)); } private static void assertJnlpFailsToLaunch(final ProcessResult pr) { assertTrue("stdout should have contained Initialization Error", pr.stdout.contains(JNLP_EXPECTED_STDOUT)); assertTrue("stderr should have contained LaunchException", pr.stderr.contains(JNLP_EXPECTED_STDERR)); } } icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/PaxHeaders.7406/resour0000644000000000000000000000013113441742745030654 xustar0030 mtime=1552401893.140832613 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/0000755000175000002070000000000013441742745032235 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/PaxHeaders.70000644000000000000000000000036013441742745031121 xustar00150 path=icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedAppletManifestSpecifiesSandboxApplication.jnlp 30 mtime=1552401893.116832663 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedApplet0000644000175000002070000000453613441742745034547 0ustar00jvanekmock00000000000000 SignedAppletManifestSpecifiesSandbox IcedTea Test Permissions: sandbox manifest attribute icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/PaxHeaders.70000644000000000000000000000035313441742745031123 xustar00145 path=icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedAppletManifestSpecifiesSandboxApplet.jnlp 30 mtime=1552401893.140832613 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedApplet0000644000175000002070000000451713441742745034546 0ustar00jvanekmock00000000000000 SignedAppletManifestSpecifiesSandbox IcedTea Test Permissions: sandbox manifest attribute icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/PaxHeaders.70000644000000000000000000000035513441742745031125 xustar00147 path=icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedAppletManifestSpecifiesSandboxJnlpHref.html 30 mtime=1552401893.100832696 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedApplet0000644000175000002070000000371513441742745034545 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/PaxHeaders.70000644000000000000000000000034513441742745031124 xustar00139 path=icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedAppletManifestSpecifiesSandbox.html 30 mtime=1552401893.108832679 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedApplet0000644000175000002070000000356013441742745034543 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745030307 xustar0030 mtime=1552401893.105832685 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/0000755000175000002070000000000013441742745031175 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/PaxHeaders.7406/S0000644000000000000000000000034013441742745030513 xustar00134 path=icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/SignedAppletManifestSpecifiesSandbox.java 30 mtime=1552401893.105832685 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/SignedAppletManif0000644000175000002070000000452713441742745034462 0ustar00jvanekmock00000000000000/* SignedAppletManifestSpecifiesSandbox.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class SignedAppletManifestSpecifiesSandbox extends Applet { public static void main(final String[] args) { new SignedAppletManifestSpecifiesSandbox().init(); } @Override public void init() { System.out.println("SignedAppletManifestSpecifiesSandbox applet starting"); System.out.println("Reading user.home: " + getProp("user.home")); System.out.println("*** APPLET FINISHED ***"); } private static String getProp(final String key) { try { return System.getProperty(key); } catch (final SecurityException se) { se.printStackTrace(); return "SECURITY EXCEPTION"; } } } icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/PaxHeaders.7406/M0000644000000000000000000000013013441742745030502 xustar0029 mtime=1552401893.10383269 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/META-INF/0000755000175000002070000000000013441742745032335 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/META-INF/PaxHeade0000644000000000000000000000031213441742745030504 xustar00113 path=icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/META-INF/MANIFEST.MF 29 mtime=1552401893.10383269 30 atime=1552402157.263253422 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/META-INF/MANIFEST0000644000175000002070000000023413441742745033465 0ustar00jvanekmock00000000000000Manifest-Version: 1.0 Permissions: sandbox Application-Library-Allowable-Codebase: http://localhost Application-Name: SignedAppletManifestSpecifiesSandbox icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/RunInSandbox0000644000000000000000000000013113441742745022467 xustar0030 mtime=1552401893.101832694 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/0000755000175000002070000000000013441742745023355 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/PaxHeaders.7406/resources0000644000000000000000000000013113441742745024501 xustar0030 mtime=1552401893.136832621 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/resources/0000755000175000002070000000000013441742745025367 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/resources/PaxHeaders.7406/RunInSandboxApplet.j0000644000000000000000000000013213441742745030452 xustar0030 mtime=1552401893.112832671 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/resources/RunInSandboxApplet.jnlp0000644000175000002070000000431213441742745031774 0ustar00jvanekmock00000000000000 UsesSignedJar IcedTea Test "Run in Sandbox" functionality for signed applets icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/resources/PaxHeaders.7406/RunInSandbox.html0000644000000000000000000000013213441742745030017 xustar0030 mtime=1552401893.136832621 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/resources/RunInSandbox.html0000644000175000002070000000350013441742745030625 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/resources/PaxHeaders.7406/RunInSandboxApplicat0000644000000000000000000000013213441742745030532 xustar0030 mtime=1552401893.097832702 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/resources/RunInSandboxApplication.jnlp0000644000175000002070000000433313441742745033015 0ustar00jvanekmock00000000000000 UsesSignedJar IcedTea Test "Run in Sandbox" functionality for signed applets icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/resources/PaxHeaders.7406/RunInSandboxJnlpHref0000644000000000000000000000013213441742745030505 xustar0030 mtime=1552401893.099832698 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/resources/RunInSandboxJnlpHref.html0000644000175000002070000000342713441742745032266 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745023441 xustar0030 mtime=1552401893.101832694 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/srcs/0000755000175000002070000000000013441742745024327 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/srcs/PaxHeaders.7406/RunInSandbox.java0000644000000000000000000000013213441742745026734 xustar0030 mtime=1552401893.101832694 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/srcs/RunInSandbox.java0000644000175000002070000000103013441742745027536 0ustar00jvanekmock00000000000000import java.applet.Applet; public class RunInSandbox extends Applet { @Override public void start() { System.out.println("RunInSandbox read: " + read("user.home")); System.out.println("*** APPLET FINISHED ***"); } public static void main(String[] args) { new RunInSandbox().start(); System.exit(0); } private String read(String key) { try { return System.getProperty(key); } catch (Exception e) { return e.toString(); } } } icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745024465 xustar0030 mtime=1552401893.101832694 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/testcases/0000755000175000002070000000000013441742745025353 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/testcases/PaxHeaders.7406/RunInSandboxTest.jav0000644000000000000000000000013213441742745030457 xustar0030 mtime=1552401893.101832694 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/RunInSandbox/testcases/RunInSandboxTest.java0000644000175000002070000003136713441742745031442 0ustar00jvanekmock00000000000000/* RunInSandboxTest.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received mainCert copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making mainCert combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As mainCert special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is mainCert module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.browsertesting.BrowserTest; import java.util.List; import java.util.Collections; import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.config.PathsAndFiles; import org.junit.AfterClass; import static org.junit.Assert.*; import org.junit.BeforeClass; import org.junit.Test; public class RunInSandboxTest extends BrowserTest { private final List TRUSTALL = Collections.unmodifiableList(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.TRUSTALL.option})); private final List TRUSTNONE = Collections.unmodifiableList(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.TRUSTNONE.option})); private final List TRUSTALLHTML = Collections.unmodifiableList(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.TRUSTALL.option, OptionsDefinitions.OPTIONS.HTML.option})); private final List TRUSTNONEHTML = Collections.unmodifiableList(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.TRUSTNONE.option, OptionsDefinitions.OPTIONS.HTML.option})); private final List HEADLESS = Collections.unmodifiableList(Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option})); private static final String appletCloseString = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; private static final String ItwAlias = "icedteaweb_signed"; private static final char[] kpass = "changeit".toCharArray(); private static Certificate mainCert; @BeforeClass public static void exportCertificate() throws FileNotFoundException, IOException, NoSuchAlgorithmException, CertificateException, KeyStoreException { if (PathsAndFiles.USER_CERTS.getFile().exists()) { KeyStore ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream(PathsAndFiles.USER_CERTS.getFile()), null); mainCert = ks.getCertificate(ItwAlias); } } public static void deleteCertificate() throws FileNotFoundException, IOException, NoSuchAlgorithmException, CertificateException, KeyStoreException { if (mainCert != null) { KeyStore ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream(PathsAndFiles.USER_CERTS.getFile()), null); Certificate isThere = ks.getCertificate(ItwAlias); if (isThere != null) { ks.deleteEntry(ItwAlias); ks.store(new FileOutputStream(PathsAndFiles.USER_CERTS.getFile()), kpass); } } } @AfterClass public static void restoreCertificate() throws FileNotFoundException, IOException, NoSuchAlgorithmException, CertificateException, KeyStoreException { if (mainCert != null) { KeyStore ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream(PathsAndFiles.USER_CERTS.getFile()), null); ks.setCertificateEntry(ItwAlias, mainCert); ks.store(new FileOutputStream(PathsAndFiles.USER_CERTS.getFile()), kpass); } } //those tests must have NO certificate .. ItwAlias ... in keystore @Test public void testTrustAllJnlpAppletLaunch() throws Exception { deleteCertificate(); ProcessResult pr = server.executeJavawsHeadless(TRUSTALL, "RunInSandboxApplet.jnlp"); assertReadProperty(pr); assertProperClose(pr); } @Test public void testTrustNoneJnlpAppletLaunch() throws Exception { deleteCertificate(); ProcessResult pr = server.executeJavawsHeadless(TRUSTNONE, "RunInSandboxApplet.jnlp"); assertNotReadProperty(pr); assertAccessControlException(pr); assertProperClose(pr); } @Test public void testTrustAllStandardJnlpApplicationLaunch() throws Exception { deleteCertificate(); ProcessResult pr = server.executeJavawsHeadless(TRUSTALL, "RunInSandboxApplication.jnlp"); assertReadProperty(pr); assertProperClose(pr); } @Test public void testTrustNoneJnlpApplicationLaunch() throws Exception { deleteCertificate(); ProcessResult pr = server.executeJavawsHeadless(TRUSTNONE, "RunInSandboxApplication.jnlp"); assertNotReadProperty(pr); assertAccessControlException(pr); assertProperClose(pr); } @Test public void testTrustAlltHtmlJavawsLaunch() throws Exception { deleteCertificate(); ProcessResult pr = server.executeJavawsHeadless(TRUSTALLHTML, "RunInSandbox.html", new AutoOkClosingListener(), new AutoErrorClosingListener(), null); assertReadProperty(pr); assertProperClose(pr); } @Test public void testTrustNoneHtmlJavawsLaunch() throws Exception { deleteCertificate(); ProcessResult pr = server.executeJavawsHeadless(TRUSTNONEHTML, "RunInSandbox.html", new AutoOkClosingListener(), new AutoErrorClosingListener(), null); assertNotReadProperty(pr); assertAccessControlException(pr); assertProperClose(pr); } @Test public void testTrustAlltHtmlHrefJavawsLaunch() throws Exception { deleteCertificate(); ProcessResult pr = server.executeJavawsHeadless(TRUSTALLHTML, "RunInSandboxJnlpHref.html", new AutoOkClosingListener(), new AutoErrorClosingListener(), null); assertReadProperty(pr); assertProperClose(pr); } @Test public void testTrustNoneHtmlHrefJavawsLaunch() throws Exception { deleteCertificate(); ProcessResult pr = server.executeJavawsHeadless(TRUSTNONEHTML, "RunInSandboxJnlpHref.html", new AutoOkClosingListener(), new AutoErrorClosingListener(), null); assertNotReadProperty(pr); assertAccessControlException(pr); assertProperClose(pr); } ///end of must NOT be certificate //those MUST have certificate in sotre (see different result) @Test public void testHaveCErtJnlpAppletLaunch() throws Exception { restoreCertificate(); ProcessResult pr = server.executeJavawsHeadless("RunInSandboxApplet.jnlp"); assertReadProperty(pr); assertProperClose(pr); } @Test public void testHaveCertStandardJnlpApplicationLaunch() throws Exception { restoreCertificate(); ProcessResult pr = server.executeJavawsHeadless("RunInSandboxApplication.jnlp"); assertReadProperty(pr); assertProperClose(pr); } @Test @TestInBrowsers(testIn = Browsers.all) public void testHaveCertHtmlAppletLaunch() throws Exception { restoreCertificate(); ProcessResult pr = server.executeBrowser("RunInSandbox.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); assertReadProperty(pr); assertProperClose(pr); } @Test @TestInBrowsers(testIn = Browsers.all) public void testHaveCertStandardHtmlHrefApplicationLaunch() throws Exception { restoreCertificate(); ProcessResult pr = server.executeBrowser("RunInSandboxJnlpHref.html", ServerAccess.AutoClose.CLOSE_ON_BOTH); assertReadProperty(pr); assertProperClose(pr); } //end of must HAVE cert //and those must NOT have cert, and are trying to answer dialogues @Test public void testStandardJnlpApplicationLaunchWithAnswerYes() throws Exception { deleteCertificate(); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HEADLESS, server.getUrl("RunInSandboxApplication.jnlp")); pw.setWriter("YES\n"); ProcessResult pr = pw.execute(); assertReadProperty(pr); assertProperClose(pr); } @Test public void testStandardJnlpApplicationLaunchWithAnswerSandbox() throws Exception { deleteCertificate(); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HEADLESS, server.getUrl("RunInSandboxApplication.jnlp")); pw.setWriter("SANDBOX\n"); ProcessResult pr = pw.execute(); assertNotReadProperty(pr); assertAccessControlException(pr); assertProperClose(pr); } @Test public void testStandardJnlpApplicationLaunchWithAnswerNo() throws Exception { deleteCertificate(); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HEADLESS, server.getUrl("RunInSandboxApplication.jnlp")); pw.setWriter("NO\n"); ProcessResult pr = pw.execute(); assertNotReadProperty(pr); assertNotAccessControlException(pr); assertNotProperClose(pr); assertLaunchException(pr); } @Test public void testStandardJnlpApplicationLaunchWithAnswerEOF() throws Exception { deleteCertificate(); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HEADLESS, server.getUrl("RunInSandboxApplication.jnlp")); pw.setWriter(""); ProcessResult pr = pw.execute(); assertNotReadProperty(pr); assertNotAccessControlException(pr); assertNotProperClose(pr); assertLaunchException(pr); } //end of tests private void assertProperClose(ProcessResult pr) { assertTrue("applet should have closed correctly", pr.stdout.contains(appletCloseString)); } private void assertNotProperClose(ProcessResult pr) { assertFalse("applet must not have closed correctly", pr.stdout.contains(appletCloseString)); } private void assertReadProperty(ProcessResult pr) { assertTrue("applet should have been able to read user.home", pr.stdout.contains(System.getProperty("user.home"))); } private void assertNotReadProperty(ProcessResult pr) { assertFalse("applet should NOT been able to read user.home", pr.stdout.contains(System.getProperty("user.home"))); } private void assertAccessControlException(ProcessResult pr) { String ace = "java.security.AccessControlException: access denied (\"java.util.PropertyPermission\" \"user.home\" \"read\")"; assertTrue("applet should have throw AccessControlException", pr.stdout.contains(ace)); } private void assertNotAccessControlException(ProcessResult pr) { String ace = "java.security.AccessControlException: access denied (\"java.util.PropertyPermission\" \"user.home\" \"read\")"; assertFalse("applet must not throw AccessControlException", pr.stdout.contains(ace)); } private void assertLaunchException(ProcessResult pr) { String ace = "LaunchException"; assertTrue("applet should have throw LaunchException", pr.stderr.contains(ace)); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/ReadPropertiesBySignedHack0000644000000000000000000000013113441742745025261 xustar0030 mtime=1552401893.136832621 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/0000755000175000002070000000000013441742745026147 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745026233 xustar0030 mtime=1552401893.111832673 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/srcs/0000755000175000002070000000000013441742745027121 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/srcs/PaxHeaders.7406/ReadPropert0000644000000000000000000000031413441742745030465 xustar00114 path=icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/srcs/ReadPropertiesBySignedHack.java 30 mtime=1552401893.111832673 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/srcs/ReadPropertiesBySignedHack.0000644000175000002070000000514713441742745034275 0ustar00jvanekmock00000000000000/* ReadPropertiesSigned.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.lang.reflect.*; public class ReadPropertiesBySignedHack { /** *some system property is expected as arg[0], eg user.name or user.home */ public static void main(String[] args) throws Throwable { //security manager is not protecting us from accessing classes from //net.sourceforge.jnlp.runtime via reflection Class c2= Class.forName("net.sourceforge.jnlp.runtime.JNLPRuntime"); Field f2 = c2.getDeclaredField("trustAll"); f2.setAccessible(true); f2.setBoolean(null, true); Method m2=c2.getDeclaredMethod("setTrustAll",Boolean.TYPE); m2.setAccessible(true); m2.invoke((Object) null, true ); //but security manager is guarding us against lunching unsigned code //from signed archvive even if Xtrustall is on. Class c1= Class.forName("ReadProperties"); Method m1=c1.getDeclaredMethod("main",args.getClass()); m1.invoke((Object) null, (Object)args); } } icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/PaxHeaders.7406/resources0000644000000000000000000000013113441742745027273 xustar0030 mtime=1552401893.136832621 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/resources/0000755000175000002070000000000013441742745030161 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/resources/PaxHeaders.7406/ReadPr0000644000000000000000000000032113441742745030451 xustar00119 path=icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/resources/ReadPropertiesBySignedHack.jnlp 30 mtime=1552401893.136832621 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/resources/ReadPropertiesBySigned0000644000175000002070000000114513441742745034462 0ustar00jvanekmock00000000000000 read properties using System.getenv() IcedTea user.name icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745027257 xustar0030 mtime=1552401893.096832704 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/testcases/0000755000175000002070000000000013441742745030145 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/testcases/PaxHeaders.7406/ReadPr0000644000000000000000000000032513441742745030441 xustar00123 path=icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/testcases/ReadPropertiesBySignedHackTest.java 30 mtime=1552401893.096832704 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/ReadPropertiesBySignedHack/testcases/ReadPropertiesBySigned0000644000175000002070000000545213441742745034453 0ustar00jvanekmock00000000000000/* ReadPropertiesBySignedHackTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class ReadPropertiesBySignedHackTest { private static ServerAccess server = new ServerAccess(); private final List l=Collections.unmodifiableList(Arrays.asList(new String[] {"-Xtrustall"})); @Test public void ReadPropertiesBySignedHackWithjoutXtrustAll() throws Exception { //no request for permissions ProcessResult pr=server.executeJavawsHeadless(l,"/ReadPropertiesBySignedHack.jnlp"); String s="java.lang.SecurityException: class \"ReadProperties\"'s signer information does not match signer information of other classes in the same package"; Assert.assertTrue("Stderr should contains "+s+" but did not",pr.stderr.contains(s)); String ss="ClassNotFoundException"; Assert.assertFalse("Stderr should not contains "+ss+" but did",pr.stderr.contains(ss)); Assert.assertFalse("should not be terminated but was",pr.wasTerminated); Assert.assertEquals((Integer)1, pr.returnValue); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/MultiJar-SignedJnlpApplication0000644000000000000000000000013113441742745026063 xustar0030 mtime=1552401893.102832692 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/0000755000175000002070000000000013441742745026751 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745027035 xustar0030 mtime=1552401893.111832673 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/0000755000175000002070000000000013441742745027723 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/PaxHeaders.7406/JNLP-IN0000644000000000000000000000013113441742745030104 xustar0030 mtime=1552401893.111832673 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/JNLP-INF/0000755000175000002070000000000013441742745031100 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/JNLP-INF/PaxHeaders.7400000644000000000000000000000031213441742745030125 xustar00112 path=icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/JNLP-INF/APPLICATION.jnlp 30 mtime=1552401893.111832673 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/JNLP-INF/APPLICATION.jn0000644000175000002070000000464313441742745033203 0ustar00jvanekmock00000000000000 Matching Signed JNLP IcedTea Matching Signed JNLP icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/PaxHeaders.7406/SignedJ0000644000000000000000000000031313441742745030362 xustar00113 path=icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/SignedJnlpApplication.java 30 mtime=1552401893.095832706 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/SignedJnlpApplication.j0000644000175000002070000000467713441742745034335 0ustar00jvanekmock00000000000000/* SignedJnlpApplication.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.lang.reflect.*; public class SignedJnlpApplication { public static void run() { System.out.println("**Running SignedJnlpApplication"); } @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) throws Exception { System.out.println("Starting application with signed application jnlp"); //No parameters Class noparam[] = {}; //Run SignedJnlpTemplate Class c1 = Class.forName("SignedJnlpTemplate"); Method m1 = c1.getDeclaredMethod("run", noparam); m1.invoke(c1); //Run SimpleApplication Class c2 = Class.forName("SimpleApplication"); Method m2 = c2.getDeclaredMethod("run", noparam); m2.invoke(c2); System.out.println("Ending application with signed application jnlp"); } } icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/PaxHeaders.7406/testcases0000644000000000000000000000012713441742745030066 xustar0028 mtime=1552401893.0988327 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/testcases/0000755000175000002070000000000013441742745030747 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/testcases/PaxHeaders.7406/Mu0000644000000000000000000000031713441742745030450 xustar00119 path=icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/testcases/MultiJarSignedJnlpTest.java 28 mtime=1552401893.0988327 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/testcases/MultiJarSignedJnlp0000644000175000002070000001162613441742745034405 0ustar00jvanekmock00000000000000/* MultiJarSignedJnlpTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class MultiJarSignedJnlpTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); private final String signedJnlpException = "net.sourceforge.jnlp.LaunchException: Fatal: Application Error: " + "The signed JNLP file did not match the launching JNLP file. Missing Resource: Signed Application " + "did not match launching JNLP File"; @Test public void checkingForRequiredResources() throws Exception { //MainJarWithoutSignedJnlp.jnlp includes all three required jars String s = "Ending application without a Signed Jnlp"; ProcessResult pr = server.executeJavawsHeadless(l, "/MainJarWithoutSignedJnlp.jnlp"); Assert.assertTrue("Could not locate the required resources required to run this test", pr.stdout.contains(s)); } @Test public void mainJarMatchingSignedJnlpTemplate() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/MainJarWithMatchingSignedJnlpTemplate.jnlp"); String s = "Ending application with signed application_template jnlp"; Assert.assertTrue("Could not locate SignedJnlpTemplate class within MultiJar-SignedJnlpTemplate.jar", pr.stdout.contains(s)); Assert.assertFalse(pr.stderr.contains(signedJnlpException)); } @Test public void mainJarMatchingSignedJnlpApplication() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/MainJarWithMatchingSignedJnlpApplication.jnlp"); String s = "Ending application with signed application jnlp"; Assert.assertTrue("Could not locate SignedJnlpApplication class within MultiJar-SignedJnlpApplication.jar", pr.stdout.contains(s)); Assert.assertFalse(pr.stderr.contains(signedJnlpException)); } @Test public void mainJarWithUnmatchingSignedJnlpApplication() throws Exception { String s = "Ending application with signed application jnlp"; ProcessResult pr = server.executeJavawsHeadless(l, "/MainJarWithUnmatchingSignedJnlpApplication.jnlp"); Assert.assertTrue("Stdout should contains " + signedJnlpException + " but did not", pr.stderr.contains(signedJnlpException)); Assert.assertFalse( pr.stdout.contains(s)); } @Test public void mainJarWithUnmatchingSignedJnlpTemplate() throws Exception { String s = "Ending application with signed application_template jnlp"; ProcessResult pr = server.executeJavawsHeadless(l, "/MainJarWithUnmatchingSignedJnlpTemplate.jnlp"); Assert.assertTrue("Stdout should contains " + signedJnlpException + " but did not", pr.stderr.contains(signedJnlpException)); Assert.assertFalse(pr.stdout.contains(s)); } @Test public void mainJarWithoutSignedJnlp() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/MainJarWithoutSignedJnlp.jnlp"); String s = "Ending application without a Signed Jnlp"; Assert.assertTrue("Stdout should contains " + s + " but did not", pr.stdout.contains(s)); } } icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/PaxHeaders.7406/resources0000644000000000000000000000013113441742745030075 xustar0030 mtime=1552401893.135832623 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/resources/0000755000175000002070000000000013441742745030763 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/resources/PaxHeaders.7406/Ma0000644000000000000000000000034513441742745030441 xustar00139 path=icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/resources/MainJarWithUnmatchingSignedJnlpApplication.jnlp 30 mtime=1552401893.135832623 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/resources/MainJarWithUnmatch0000644000175000002070000000561213441742745034407 0ustar00jvanekmock00000000000000 XXXXXXX - THIS FILE DOES NOT MATCH THE SIGNED JNLP FILE - XXXXXXX IcedTea XXXXXXX - THIS FILE DOES NOT MATCH THE SIGNED JNLP FILE - XXXXXXX icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/resources/PaxHeaders.7406/Ma0000644000000000000000000000034213441742745030436 xustar00137 path=icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/resources/MainJarWithMatchingSignedJnlpApplication.jnlp 29 mtime=1552401893.10383269 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MultiJar-SignedJnlpApplication/resources/MainJarWithMatchin0000644000175000002070000000544413441742745034376 0ustar00jvanekmock00000000000000 Matching Signed JNLP IcedTea Matching Signed JNLP icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/MissingJar0000644000000000000000000000013113441742745022163 xustar0030 mtime=1552401893.099832698 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MissingJar/0000755000175000002070000000000013441742745023051 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MissingJar/PaxHeaders.7406/resources0000644000000000000000000000013113441742745024175 xustar0030 mtime=1552401893.135832623 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MissingJar/resources/0000755000175000002070000000000013441742745025063 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MissingJar/resources/PaxHeaders.7406/MissingJar3.jnlp0000644000000000000000000000013213441742745027271 xustar0030 mtime=1552401893.110832675 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MissingJar/resources/MissingJar3.jnlp0000644000175000002070000000110413441742745030075 0ustar00jvanekmock00000000000000 test MissingJar IcedTea icedtea-web-1.8/tests/reproducers/signed/MissingJar/resources/PaxHeaders.7406/MissingJar2.jnlp0000644000000000000000000000013213441742745027270 xustar0030 mtime=1552401893.135832623 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MissingJar/resources/MissingJar2.jnlp0000644000175000002070000000110413441742745030074 0ustar00jvanekmock00000000000000 test MissingJar IcedTea icedtea-web-1.8/tests/reproducers/signed/MissingJar/resources/PaxHeaders.7406/MissingJar4.jnlp0000644000000000000000000000013213441742745027272 xustar0030 mtime=1552401893.095832706 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MissingJar/resources/MissingJar4.jnlp0000644000175000002070000000114313441742745030101 0ustar00jvanekmock00000000000000 test MissingJar IcedTea icedtea-web-1.8/tests/reproducers/signed/MissingJar/resources/PaxHeaders.7406/MissingJar.jnlp0000644000000000000000000000013213441742745027206 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MissingJar/resources/MissingJar.jnlp0000644000175000002070000000114213441742745030014 0ustar00jvanekmock00000000000000 test MissingJar IcedTea icedtea-web-1.8/tests/reproducers/signed/MissingJar/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745024161 xustar0030 mtime=1552401893.099832698 29 atime=1552410887.11018345 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MissingJar/testcases/0000755000175000002070000000000013441742745025047 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MissingJar/testcases/PaxHeaders.7406/MissingJarTest.java0000644000000000000000000000013213441742745030010 xustar0030 mtime=1552401893.099832698 30 atime=1552402157.262253425 30 ctime=1552410887.072183539 icedtea-web-1.8/tests/reproducers/signed/MissingJar/testcases/MissingJarTest.java0000644000175000002070000000633713441742745030631 0ustar00jvanekmock00000000000000/* MissingJarTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class MissingJarTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[]{"-Xtrustall"})); private void evaluateResult(ProcessResult pr) { String c = "only fixed classloader can initialize this app"; Assert.assertTrue("stdout should contains `" + c + "`, but didn't ", pr.stdout.contains(c)); String cc = "ClassNotFoundException"; Assert.assertFalse("stderr should NOT contains `" + cc + "`, but did ", pr.stderr.contains(cc)); Assert.assertFalse("should not be terminated, but was", pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } @Test public void MissingJarTest1() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/MissingJar.jnlp"); evaluateResult(pr); } @Test public void MissingJarTest2() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/MissingJar2.jnlp"); evaluateResult(pr); } @Test public void MissingJarTest3() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/MissingJar3.jnlp"); evaluateResult(pr); } @Test public void MissingJarTest4() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/MissingJar4.jnlp"); evaluateResult(pr); } } icedtea-web-1.8/tests/reproducers/signed/MissingJar/PaxHeaders.7406/srcs0000644000000000000000000000012713441742745023142 xustar0028 mtime=1552401893.0988327 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/MissingJar/srcs/0000755000175000002070000000000013441742745024023 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/MissingJar/srcs/PaxHeaders.7406/MissingJar.java0000644000000000000000000000013013441742745026122 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/MissingJar/srcs/MissingJar.java0000644000175000002070000000341113441742745026733 0ustar00jvanekmock00000000000000/* MissingJar.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class MissingJar { public static void main(String[] args) { System.out.println("only fixed classloader can initialize this app"); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/EmptySignedJar0000644000000000000000000000013113441742745023002 xustar0030 mtime=1552401893.093832711 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/0000755000175000002070000000000013441742745023670 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/PaxHeaders.7406/resources0000644000000000000000000000013113441742745025014 xustar0030 mtime=1552401893.102832692 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/resources/0000755000175000002070000000000013441742745025702 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/resources/PaxHeaders.7406/EmptySignedJarExte0000644000000000000000000000013213441742745030530 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/resources/EmptySignedJarExtension.jnlp0000644000175000002070000000451413441742745033355 0ustar00jvanekmock00000000000000 EmptySignedJarExtension IcedTea EmptySignedJarExtension icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/resources/PaxHeaders.7406/EmptySignedJarInEx0000644000000000000000000000013213441742745030466 xustar0030 mtime=1552401893.089832719 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/resources/EmptySignedJarInExtensionJnlp.jnlp0000644000175000002070000000502113441742745034462 0ustar00jvanekmock00000000000000 EmptySignedJar IcedTea EmptySignedJar icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/resources/PaxHeaders.7406/EmptySignedJarInLa0000644000000000000000000000013213441742745030446 xustar0030 mtime=1552401893.092832712 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/resources/EmptySignedJarInLaunchingJnlp.jnlp0000644000175000002070000000500513441742745034420 0ustar00jvanekmock00000000000000 EmptySignedJar IcedTea EmptySignedJar icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745023754 xustar0030 mtime=1552401893.092832712 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/srcs/0000755000175000002070000000000013441742745024642 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/srcs/PaxHeaders.7406/META-INF0000644000000000000000000000013113441742745025114 xustar0030 mtime=1552401893.092832712 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/srcs/META-INF/0000755000175000002070000000000013441742745026002 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/srcs/META-INF/PaxHeaders.7406/empty_file0000644000000000000000000000013213441742745027252 xustar0030 mtime=1552401893.092832712 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/srcs/META-INF/empty_file0000644000175000002070000000002713441742745030061 0ustar00jvanekmock00000000000000This is an empty file. icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745025000 xustar0030 mtime=1552401893.093832711 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/testcases/0000755000175000002070000000000013441742745025666 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/testcases/PaxHeaders.7406/EmptySignedJarTest0000644000000000000000000000013213441742745030526 xustar0030 mtime=1552401893.093832711 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/EmptySignedJar/testcases/EmptySignedJarTest.java0000644000175000002070000000612713441742745032264 0ustar00jvanekmock00000000000000/* EmptySignedJarTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import org.junit.Assert; import org.junit.Test; public class EmptySignedJarTest { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); private final String jarOutput = "Running SignedJarResource.."; @Test public void checkingForRequiredResources() throws Exception { String s = "Running SignedJarResource.."; ProcessResult pr = server.executeJavawsHeadless(l, "/SignedJarResource.jnlp"); Assert.assertTrue("Could not locate SignedJarResource class within SignedJarResource jar", pr.stdout.contains(s)); } @Bug(id = "PR1049") @Test public void usingExtensionWithEmptyJar() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/EmptySignedJarInExtensionJnlp.jnlp"); Assert.assertTrue("Stdout should contain " + jarOutput + " but did not", pr.stdout.contains(jarOutput)); } @Bug(id = "PR1049") @Test public void usingLauncherWithEmptyJar() throws Exception { ProcessResult pr = server.executeJavawsHeadless(l, "/EmptySignedJarInLaunchingJnlp.jnlp"); Assert.assertTrue("Stdout should contain " + jarOutput + " but did not", pr.stdout.contains(jarOutput)); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/DeploymentPropertiesAreExposed0000644000000000000000000000013113441742745026272 xustar0030 mtime=1552401893.092832712 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/0000755000175000002070000000000013441742745027160 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/PaxHeaders.7406/resources0000644000000000000000000000013113441742745030304 xustar0030 mtime=1552401893.088832721 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/resources/0000755000175000002070000000000013441742745031172 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/resources/PaxHeaders.7406/De0000644000000000000000000000033113441742745030636 xustar00127 path=icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/resources/DeploymentPropertiesAreExposed.jnlp 30 mtime=1552401893.088832721 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/resources/DeploymentProperti0000644000175000002070000000406513441742745034767 0ustar00jvanekmock00000000000000 Verify that deployment configuration properties are exposed IcedTea icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/PaxHeaders.7406/testcases0000644000000000000000000000013113441742745030270 xustar0030 mtime=1552401893.092832712 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/testcases/0000755000175000002070000000000013441742745031156 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/testcases/PaxHeaders.7406/De0000644000000000000000000000033513441742745030626 xustar00131 path=icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/testcases/DeploymentPropertiesAreExposedTest.java 30 mtime=1552401893.092832712 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/testcases/DeploymentProperti0000644000175000002070000000535513441742745034756 0ustar00jvanekmock00000000000000/* DeploymentPropertiesAreExposedTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import static org.junit.Assert.*; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.config.DeploymentConfiguration; import org.junit.Test; public class DeploymentPropertiesAreExposedTest { @Test public void verifyDeploymentConfigrationIsExposedAsSystemProperties() throws Exception { ServerAccess server = new ServerAccess(); List trustCertificates = Arrays.asList(new String[] {"-Xtrustall"}); ProcessResult result = server.executeJavawsHeadless( trustCertificates, "/DeploymentPropertiesAreExposed.jnlp"); DeploymentConfiguration config = JNLPRuntime.getConfiguration(); config.load(); String userLogDir = config.getProperty(DeploymentConfiguration.KEY_USER_LOG_DIR); String actual = result.stdout.trim(); boolean stdOutMatches = actual.contains(userLogDir); assertTrue("'" + actual + "' should contains '" + userLogDir + "' but did not", stdOutMatches); } } icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745027244 xustar0030 mtime=1552401893.091832715 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/srcs/0000755000175000002070000000000013441742745030132 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/srcs/PaxHeaders.7406/Test.ja0000644000000000000000000000013213441742745030555 xustar0030 mtime=1552401893.091832715 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/DeploymentPropertiesAreExposed/srcs/Test.java0000644000175000002070000000336413441742745031722 0ustar00jvanekmock00000000000000/* Test.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class Test { public static void main(String[] args) { System.out.println(System.getProperty("deployment.user.logdir")); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/CodebasesAttsSigned0000644000000000000000000000013113441742745023773 xustar0030 mtime=1552401893.092832712 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/0000755000175000002070000000000013441742745024661 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/PaxHeaders.7406/resources0000644000000000000000000000013113441742745026005 xustar0030 mtime=1552401893.128832638 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/0000755000175000002070000000000013441742745026673 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/PaxHeaders.7406/CodebasesAtts0000644000000000000000000000031113441742745030531 xustar00111 path=icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSignedApp.jnlp.in 30 mtime=1552401893.101832694 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSignedApp.jnlp.i0000644000175000002070000000420613441742745034330 0ustar00jvanekmock00000000000000 CodebasesAttsSigned IcedTea PR2489 @ID@ icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/PaxHeaders.7406/CodebasesAtts0000644000000000000000000000013213441742745030532 xustar0030 mtime=1552401893.128832638 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSigned.html.in0000644000175000002070000000344413441742745034051 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/PaxHeaders.7406/CodebasesAtts0000644000000000000000000000031413441742745030534 xustar00114 path=icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSignedApplet.jnlp.in 30 mtime=1552401893.088832721 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSignedApplet.jnl0000644000175000002070000000431413441742745034426 0ustar00jvanekmock00000000000000 CodebasesAttsSigned IcedTea PR2489 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/PaxHeaders.7406/CodebasesAtts0000644000000000000000000000031613441742745030536 xustar00116 path=icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSignedJnlpHref.html.in 30 mtime=1552401893.091832715 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSignedJnlpHref.h0000644000175000002070000000347213441742745034361 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/PaxHeaders.7406/srcs0000644000000000000000000000013113441742745024745 xustar0030 mtime=1552401893.091832715 29 atime=1552410887.11018345 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/srcs/0000755000175000002070000000000013441742745025633 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/srcs/PaxHeaders.7406/CodebasesAttsSigne0000644000000000000000000000013213441742745030460 xustar0030 mtime=1552401893.091832715 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/srcs/CodebasesAttsSigned.java0000644000175000002070000000507113441742745032357 0ustar00jvanekmock00000000000000/* ExtensionJnlpTestApplet.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.*; import java.awt.Graphics; /** * * Note that for html's appelt and jnlphreff's jnlp file may have different * codebase. * */ public class CodebasesAttsSigned extends Applet { private static final String appletCloseString = "*** APPLET FINISHED ***"; private static final String bid = "BID0"; public static void main(String... args) { System.out.println("id: "+args[0]); System.out.println("BID: "+bid); System.out.println(CodebasesAttsSigned.class.getName()); System.out.println(appletCloseString); System.out.flush(); System.out.println("some garbage"); } @Override public void init() { } @Override public void start() { main(getParameter("id")); } @Override public void stop() { } @Override public void destroy() { } @Override public void paint(Graphics g) { } } icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025772 xustar0030 mtime=1552401893.092832712 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/testcases/0000755000175000002070000000000013441742745026657 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/testcases/PaxHeaders.7406/CodebasesAtts0000644000000000000000000000031713441742745030523 xustar00117 path=icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/testcases/CodebasesAttsSignedDialogsTest1.java 30 mtime=1552401893.092832712 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CodebasesAttsSigned/testcases/CodebasesAttsSignedDialogsTes0000644000175000002070000005572613441742745034456 0ustar00jvanekmock00000000000000/* CodebasesAttsSignedNoDialogsTest1.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ProcessWrapper; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import static net.sourceforge.jnlp.browsertesting.BrowserTest.server; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import net.sourceforge.jnlp.util.FileUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /** * * null, empty, none, wrong, correct jnlp x html different codebases. * * no dialogs should be appeared. Second testsuite with ALL dialogs (head only) * * */ public class CodebasesAttsSignedDialogsTest1 extends BrowserTest { public static final String appletCloseString = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; public static final String[] JAVAWS_HTML_ARRAY = new String[]{OptionsDefinitions.OPTIONS.HTML.option}; public static final List JAVAWS_HTML_LIST = Arrays.asList(JAVAWS_HTML_ARRAY); private static final String[] JAVAWS_HEADLES_ARRAY = new String[]{OptionsDefinitions.OPTIONS.HTML.HEADLESS.option}; private static final List JAVAWS_HEADLES_LIST = Arrays.asList(JAVAWS_HEADLES_ARRAY); public static final String JNLPAPP = "CodebasesAttsSignedApp.jnlp"; public static final String JNLPAPPLET = "CodebasesAttsSignedApplet.jnlp"; public static final String HTML = "CodebasesAttsSigned.html"; public static final String HTMLHREF = "CodebasesAttsSignedJnlpHref.html"; public static final String CodebasesAttsSigned = "CodebasesAttsSigned"; private static ServerLauncher secondValidServer; private static DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier ensuredDP; public static final String[] files = new String[]{"CodebasesAttsSignedApp.jnlp", "CodebasesAttsSigned.html", "CodebasesAttsSignedApplet.jnlp", "CodebasesAttsSignedJnlpHref.html"}; @BeforeClass public static void initSecondaryServers() throws IOException { secondValidServer = ServerAccess.getIndependentInstanceOnTmpDir(); } @AfterClass public static void stopSecondaryServers() throws IOException { secondValidServer.stop(); } @BeforeClass public static void setProperties() throws IOException { ensuredDP = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier( new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ALL.name()), new AbstractMap.SimpleEntry(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ASK_UNSIGNED.name()) ); ensuredDP.setProperties(); } @AfterClass public static void resetProperties() throws IOException { ensuredDP.restoreProperties(); } //jar from different source @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJnlp1_null_foreignJar() throws Exception { prepareSwapResources(); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), JAVAWS_HEADLES_LIST, secondValidServer.getUrl(JNLPAPP)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJnlp2_null_foreignJar() throws Exception { prepareSwapResources(); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), JAVAWS_HEADLES_LIST, secondValidServer.getUrl(JNLPAPPLET)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay //@Test browsers dont support headless dialogues @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksHtml1_null_foreignJar() throws Exception { prepareSwapResources(); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay //@Test browsers do not support ehadless dialogues @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksHtml2_null_foreignJar() throws Exception { prepareSwapResources(); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJavawsHtml1_null_foreignJar() throws Exception { prepareSwapResources(); ArrayList HTML_HEADLESS = new ArrayList<>(); HTML_HEADLESS.addAll(JAVAWS_HEADLES_LIST); HTML_HEADLESS.addAll(JAVAWS_HTML_LIST); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HTML_HEADLESS, secondValidServer.getUrl(HTML)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJavawsHtml2_null_foreignJar() throws Exception { prepareSwapResources(); ArrayList HTML_HEADLESS = new ArrayList<>(); HTML_HEADLESS.addAll(JAVAWS_HEADLES_LIST); HTML_HEADLESS.addAll(JAVAWS_HTML_LIST); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HTML_HEADLESS, secondValidServer.getUrl(HTMLHREF)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 2")); Assert.assertTrue(pr.stdout.contains("BID0")); } //done cross jars @NeedsDisplay @Test @Bug(id = "PR2489") //the only alaca one in "normal mode" public void codebasesAttsSignedTestWorksJnlp1_null() throws Exception { prepare(null); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), JAVAWS_HEADLES_LIST, server.getUrl(JNLPAPP)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJnlp2_null() throws Exception { prepare(null); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), JAVAWS_HEADLES_LIST, server.getUrl(JNLPAPPLET)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay //@Test browsers dont support headless dialogues @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksHtml1_null() throws Exception { prepare(null); ProcessResult pr = server.executeBrowser(null, HTML, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay //@Test browsers do not support ehadless dialogues @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksHtml2_null() throws Exception { prepare(null); ProcessResult pr = server.executeBrowser(null, HTMLHREF, new AutoOkClosingListener(), new AutoErrorClosingListener()); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJavawsHtml1_null() throws Exception { prepare(null); ArrayList HTML_HEADLESS = new ArrayList<>(); HTML_HEADLESS.addAll(JAVAWS_HEADLES_LIST); HTML_HEADLESS.addAll(JAVAWS_HTML_LIST); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HTML_HEADLESS, server.getUrl(HTML)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJavawsHtml2_null() throws Exception { prepare(null); ArrayList HTML_HEADLESS = new ArrayList<>(); HTML_HEADLESS.addAll(JAVAWS_HEADLES_LIST); HTML_HEADLESS.addAll(JAVAWS_HTML_LIST); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HTML_HEADLESS, server.getUrl(HTMLHREF)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertTrue(pr.stdout.contains(CodebasesAttsSigned)); Assert.assertTrue(pr.stdout.contains("id: 1")); Assert.assertTrue(pr.stdout.contains("BID0")); } public static void prepare(String codebase) throws IOException { prepare(codebase, codebase); } public static void prepare(String codebase1, String codebase2) throws IOException { prepareSingle(codebase1, null, null, '1', ServerAccess.getInstance().getDir(), files, true); prepareSingle(codebase2, null, null, '2', secondValidServer.getDir(), files, true); } //note, that the modification of jar is breaking signature.. well worthy to add test :) public static void prepareSingle(String codebase, String jnlphref, String jar, char id, File targetDir, String[] files, boolean corrupt) throws IOException { File srcDir = ServerAccess.getInstance().getDir(); for (String file : files) { String s1 = FileUtils.loadFileAsString(new File(srcDir, file + ".in")); if (codebase == null) { s1 = s1.replace("@CODEBASE@", ""); } else { s1 = s1.replace("@CODEBASE@", "codebase=\"" + codebase + "\""); } if (jnlphref == null) { s1 = s1.replace("@JNLPHREF@", "CodebasesAttsSignedApplet.jnlp"); } else { s1 = s1.replace("@JNLPHREF@", jnlphref + "/CodebasesAttsSignedApplet.jnlp"); } if (jar == null) { s1 = s1.replace("@JAR@", "CodebasesAttsSigned"); } else { s1 = s1.replace("@JAR@", jar + "/CodebasesAttsSigned"); } s1 = s1.replace("@ID@", "" + id); FileUtils.saveFile(s1, new File(targetDir, file)); } String n = "CodebasesAttsSigned.jar"; if (!srcDir.equals(targetDir)) { copyJarAndChange(new File(srcDir, n), new File(targetDir, n), id, corrupt); } } /** * This copy zip jar entry by entry, and for one particular class it do BYTE * changes * * @param from * @param to * @param id * @throws FileNotFoundException * @throws IOException */ private static void copyJarAndChange(File from, File to, char id, boolean corruptSignatures) throws FileNotFoundException, IOException { ZipFile original = new ZipFile(from); try (ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(to))) { Enumeration entries = original.entries(); byte[] buffer = new byte[512]; while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); if (entry.getName().endsWith("CodebasesAttsSigned.class") && corruptSignatures) { ZipEntry newEntry = new ZipEntry(entry.getName()); outputStream.putNextEntry(newEntry); try (InputStream in = original.getInputStream(entry)) { copyStreamAndChange(in, outputStream, id); } } else { ZipEntry newEntry = new ZipEntry(entry.getName()); outputStream.putNextEntry(newEntry); try (InputStream in = original.getInputStream(entry)) { while (0 < in.available()) { int read = in.read(buffer); outputStream.write(buffer, 0, read); } } } outputStream.closeEntry(); } } } /** * This changes bytes BID0 to BID'idchar'. * * @param din * @param dout * @param id * @throws FileNotFoundException * @throws IOException */ private static void copyStreamAndChange(InputStream din, OutputStream dout, char id) throws FileNotFoundException, IOException { int c; final boolean[] BID0 = new boolean[]{false, false, false}; while ((c = din.read()) != -1) { if (c == 'B') { BID0[0] = true; dout.write((byte) c); } else if (c == 'I' && BID0[0]) { BID0[1] = true; dout.write((byte) c); } else if (c == 'D' && BID0[1]) { BID0[2] = true; dout.write((byte) c); } else if (c == '0' && BID0[2]) { dout.write((byte) id); reset(BID0); } else { reset(BID0); dout.write((byte) c); } } } private static void reset(final boolean[] b) { for (int i = 0; i < b.length; i++) { b[i] = false; } } //reading corruptied jars @NeedsDisplay @Test //the only alaca one public void codebasesAttsSignedTestWorksJnlp1_null_corruptedJar() throws Exception { prepare(null); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), JAVAWS_HEADLES_LIST, secondValidServer.getUrl(JNLPAPP)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); generalFailure(pr); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJnlp2_null_corruptedJar() throws Exception { prepare(null); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), JAVAWS_HEADLES_LIST, secondValidServer.getUrl(JNLPAPPLET)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); generalFailure(pr); } @NeedsDisplay //@Test browsers dont support headless dialogues @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksHtml1_null_corruptedJar() throws Exception { prepare(null); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTML), new AutoOkClosingListener(), new AutoErrorClosingListener()); generalFailure(pr); } @NeedsDisplay //@Test browsers do not support ehadless dialogues @TestInBrowsers(testIn = Browsers.one) @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksHtml2_null_corruptedJar() throws Exception { prepare(null); ProcessResult pr = server.executeBrowser(null, secondValidServer.getUrl(HTMLHREF), new AutoOkClosingListener(), new AutoErrorClosingListener()); generalFailure(pr); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJavawsHtml1_null_corruptedJar() throws Exception { prepare(null); ArrayList HTML_HEADLESS = new ArrayList<>(); HTML_HEADLESS.addAll(JAVAWS_HEADLES_LIST); HTML_HEADLESS.addAll(JAVAWS_HTML_LIST); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HTML_HEADLESS, secondValidServer.getUrl(HTML)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); generalFailure(pr); } @NeedsDisplay @Test @Bug(id = "PR2489") public void codebasesAttsSignedTestWorksJavawsHtml2_null_corruptedJar() throws Exception { prepare(null); ArrayList HTML_HEADLESS = new ArrayList<>(); HTML_HEADLESS.addAll(JAVAWS_HEADLES_LIST); HTML_HEADLESS.addAll(JAVAWS_HTML_LIST); ProcessWrapper pw = new ProcessWrapper(server.getJavawsLocation(), HTML_HEADLESS, secondValidServer.getUrl(HTMLHREF)); pw.addStdOutListener(new AutoOkClosingListener()); pw.addStdErrListener(new AutoErrorClosingListener()); pw.setWriter("YES\nYES\nYES\nYES\n"); ProcessResult pr = pw.execute(); generalFailure(pr); } public void generalFailure(String s) { Assert.assertFalse(s.contains(appletCloseString)); Assert.assertFalse(s.contains("id:")); Assert.assertFalse(s.contains("BID")); } private void generalFailure(ProcessResult pr) { generalFailure(pr.stdout); } private void prepareSwapResources() throws IOException { prepareSingle(null, null, secondValidServer.getUrl().toExternalForm(), '1', ServerAccess.getInstance().getDir(), files, true); prepareSingle(null, null, server.getUrl().toExternalForm(), '2', secondValidServer.getDir(), files, true); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/Classpath.Manifest.Test.Helper0000644000000000000000000000013213441742745025741 xustar0030 mtime=1552401893.086832725 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/Classpath.Manifest.Test.Helper/0000755000175000002070000000000013441742745026626 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Classpath.Manifest.Test.Helper/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026713 xustar0030 mtime=1552401893.086832725 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/Classpath.Manifest.Test.Helper/srcs/0000755000175000002070000000000013441742745027600 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/Classpath.Manifest.Test.Helper/srcs/PaxHeaders.7406/CheckFo0000644000000000000000000000013213441742745030215 xustar0030 mtime=1552401893.086832725 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/Classpath.Manifest.Test.Helper/srcs/CheckForClasspath.java0000644000175000002070000000341713441742745033777 0ustar00jvanekmock00000000000000/* CheckForClasspath.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class CheckForClasspath { public static void checkClasspathAndPrint() { System.out.println("CheckForClasspath found on classpath."); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/CacheReproducer0000644000000000000000000000013213441742745023154 xustar0030 mtime=1552401893.088832721 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/0000755000175000002070000000000013441742745024041 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025166 xustar0030 mtime=1552401893.125832644 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/resources/0000755000175000002070000000000013441742745026053 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/resources/PaxHeaders.7406/CacheReproducer2.0000644000000000000000000000013013441742745030362 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.262253425 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/resources/CacheReproducer2.jnlp0000644000175000002070000000112713441742745032061 0ustar00jvanekmock00000000000000 Just prints out "Good simple javaws exapmle" using reflection call from CacheReproducer.jar SimpletestSigned1.jar IcedTea icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/resources/PaxHeaders.7406/CacheReproducer1_0000644000000000000000000000013213441742745030444 xustar0030 mtime=1552401893.125832644 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/resources/CacheReproducer1_1.jnlp0000644000175000002070000000113013441742745032272 0ustar00jvanekmock00000000000000 Just prints out "Good simple javaws exapmle" using reflection call from CacheReproducer.jar SimpletestSigned1.jar IcedTea icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/resources/PaxHeaders.7406/CacheReproducer2_0000644000000000000000000000013213441742745030445 xustar0030 mtime=1552401893.085832727 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/resources/CacheReproducer2_1.jnlp0000644000175000002070000000113013441742745032273 0ustar00jvanekmock00000000000000 Just prints out "Good simple javaws exapmle" using reflection call from CacheReproducer.jar SimpletestSigned1.jar IcedTea icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/resources/PaxHeaders.7406/CacheReproducer1.0000644000000000000000000000013213441742745030363 xustar0030 mtime=1552401893.093832711 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/resources/CacheReproducer1.jnlp0000644000175000002070000000113113441742745032053 0ustar00jvanekmock00000000000000 Just prints out "Good simple javaws exapmle" using reflection call from CacheReproducer.jar SimpletestSigned1.jar IcedTea icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025152 xustar0030 mtime=1552401893.088832721 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/testcases/0000755000175000002070000000000013441742745026037 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/testcases/PaxHeaders.7406/CacheReproducerTe0000644000000000000000000000013213441742745030501 xustar0030 mtime=1552401893.088832721 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/testcases/CacheReproducerTest.java0000644000175000002070000004104213441742745032601 0ustar00jvanekmock00000000000000/* CacheReproducerTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.tools.MessageProperties; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; public class CacheReproducerTest { private static final ServerAccess server = new ServerAccess(); private static final List trustedVerboses = Arrays.asList(new String[]{"-Xtrustall", ServerAccess.HEADLES_OPTION,"-verbose"}); private static final List verbosed = Arrays.asList(new String[]{"-verbose", ServerAccess.HEADLES_OPTION}); private static final String lre = "LruCacheException"; private static final String ioobe = "IndexOutOfBoundsException"; private static final String corruptRegex = "\\d{13}"; private static final Pattern corruptPatern = Pattern.compile(corruptRegex); private static final String corruptString = "156dsf1562kd5"; //recently.used is always here private static final int PERMANENT_FILES = 1; private static final File icedteaCache = PathsAndFiles.CACHE_DIR.getFile(); private static final File icedteaCacheFile = PathsAndFiles.getRecentlyUsedFile().getFile(); private static final File netxLock = PathsAndFiles.MAIN_LOCK.getFile(); String testS = "#netx file\n" + "#Mon Dec 12 16:20:46 CET 2011\n" + "1323703236508,0=/home/xp13/.icedtea/cache/0/http/localhost/ReadPropertiesBySignedHack.jnlp\n" + "1323703243086,2=/home/xp14/.icedtea/cache/2/http/localhost/ReadProperties.jar\n" + "1323703243082,1=/home/xp15/.icedtea/cache/1/http/localhost/ReadPropertiesBySignedHack.jar"; @Test public void cacheIsWorkingTest() throws Exception { clearAndEvaluateCache(); evaluateSimpleTest1OkCache(runSimpleTest1()); assertCacheIsNotEmpty(); } @Test public void cacheIsWorkingTestSigned() throws Exception { clearAndEvaluateCache(); evaluateSimpleTest1OkCache(runSimpleTest1Signed()); assertCacheIsNotEmpty(); } private class ParallelSimpleTestRunner extends Thread { public boolean b=false; @Override public void run() { try { ProcessResult pr = runSimpleTest1(); evaluateSimpleTest1OkCache(pr); b=true; } catch (Exception ex) { throw new RuntimeException(ex); } } } @Test @KnownToFail public void startParallelInstancesUponBrokenCache() throws Exception { clearAndEvaluateCache(); evaluateSimpleTest1OkCache(runSimpleTest1()); assertCacheIsNotEmpty(); breakCache1(); ParallelSimpleTestRunner t1=new ParallelSimpleTestRunner(); ParallelSimpleTestRunner t2=new ParallelSimpleTestRunner(); ParallelSimpleTestRunner t3=new ParallelSimpleTestRunner(); t1.start(); t2.start(); t3.start(); int c=0; while(true){ c++; Thread.sleep(100); if (c>600) throw new Error("threads have not died in time"); if (!t1.isAlive() && !t2.isAlive() && !t3.isAlive()) break; } Thread.sleep(1000); Assert.assertTrue(t1.b); Assert.assertTrue(t2.b); Assert.assertTrue(t3.b); } private void assertCacheIsNotEmpty() { Assert.assertTrue("icedtea cache " + icedteaCache.getAbsolutePath() + " should exist some any run", icedteaCache.exists()); Assert.assertTrue("icedtea cache file " + icedteaCacheFile.getAbsolutePath() + " should exist some any run", icedteaCacheFile.exists()); Assert.assertTrue("icedtea cache file " + icedteaCacheFile.getAbsolutePath() + " should not be empty", icedteaCacheFile.length() > PERMANENT_FILES); } /** * This is breaking integer numbers in first part of cache file item * @throws Exception */ @Test public void coruptAndRunCache1() throws Exception { clearAndEvaluateCache(); evaluateSimpleTest1OkCache(runSimpleTest1()); assertCacheIsNotEmpty(); breakCache1(); ProcessResult pr = runSimpleTest1(); assertLruExceptionAppeared(pr); evaluateSimpleTest1OkCache(pr); clearAndEvaluateCache(); ProcessResult pr2 = runSimpleTest1(); evaluateSimpleTest1OkCache(pr2); assertLruExceptionNOTappeared(pr2); } /** * This is breaking integer numbers in first part of cache file item * @throws Exception */ @Test public void coruptAndRunCache2() throws Exception { clearAndEvaluateCache(); evaluateSimpleTest1OkCache(runSimpleTest1()); assertCacheIsNotEmpty(); breakCache1(); ProcessResult pr = runSimpleTest1(); assertLruExceptionAppeared(pr); evaluateSimpleTest1OkCache(pr); ProcessResult pr3 = runSimpleTest1(); evaluateSimpleTest1OkCache(pr3); assertLruExceptionNOTappeared(pr3); clearAndEvaluateCache(); ProcessResult pr2 = runSimpleTest1(); evaluateSimpleTest1OkCache(pr2); assertLruExceptionNOTappeared(pr2); } /** * This is breaking paths in second part of cache file item * @throws Exception */ @Test public void coruptAndRunCache3() throws Exception { clearAndEvaluateCache(); evaluateSimpleTest1OkCache(runSimpleTest1()); assertCacheIsNotEmpty(); breakCache3(); ProcessResult pr = runSimpleTest1(); assertAoobNOTappeared(pr); assertLruExceptionAppeared(pr); evaluateSimpleTest1OkCache(pr); ProcessResult pr3 = runSimpleTest1(); evaluateSimpleTest1OkCache(pr3); assertLruExceptionNOTappeared(pr3); clearAndEvaluateCache(); ProcessResult pr2 = runSimpleTest1(); evaluateSimpleTest1OkCache(pr2); assertLruExceptionNOTappeared(pr2); } private void assertAoobNOTappeared(ProcessResult pr2) { Assert.assertFalse("serr should NOT contain " + ioobe, pr2.stderr.contains(ioobe)); } private void assertLruExceptionNOTappeared(ProcessResult pr2) { Assert.assertFalse("serr should NOT contain " + lre, pr2.stderr.contains(lre)); } private void assertLruExceptionAppeared(ProcessResult pr) { Assert.assertTrue("serr should contain " + lre, pr.stderr.contains(lre)); } @Test public void coruptAndRunCache1Signed() throws Exception { clearAndEvaluateCache(); evaluateSimpleTest1OkCache(runSimpleTest1()); assertCacheIsNotEmpty(); breakCache1(); ProcessResult pr = runSimpleTest1Signed(); assertLruExceptionAppeared(pr); evaluateSimpleTest1OkCache(pr); clearAndEvaluateCache(); ProcessResult pr2 = runSimpleTest1Signed(); evaluateSimpleTest1OkCache(pr2); assertLruExceptionNOTappeared(pr2); } @Test public void coruptAndRunCache2Signed() throws Exception { clearAndEvaluateCache(); evaluateSimpleTest1OkCache(runSimpleTest1()); assertCacheIsNotEmpty(); breakCache1(); ProcessResult pr = runSimpleTest1Signed(); assertLruExceptionAppeared(pr); evaluateSimpleTest1OkCache(pr); ProcessResult pr3 = runSimpleTest1Signed(); evaluateSimpleTest1OkCache(pr3); assertLruExceptionNOTappeared(pr3); clearAndEvaluateCache(); ProcessResult pr2 = runSimpleTest1Signed(); evaluateSimpleTest1OkCache(pr2); assertLruExceptionNOTappeared(pr2); } @Test public void clearCacheUnsucessfully() throws Exception { evaluateSimpleTest1OkCache(runSimpleTest1()); assertCacheIsNotEmpty(); ProcessResult pr; Thread t = new Thread(new Runnable() { @Override public void run() { try { ProcessResult pr = server.executeJavawsHeadless(verbosed, "/deadlocktest.jnlp"); } catch (Exception ex) { throw new RuntimeException(ex); } } }); t.start(); Thread.sleep(1000); pr = tryToClearcache(); String cacheClearError = MessageProperties.getMessage("CCannotClearCache"); Assert.assertTrue("Stderr should contain " + cacheClearError + ", but did not.", pr.stderr.contains(cacheClearError)); assertCacheIsNotEmpty(); } //next four tests are designed to ensure, that corrupted cache will not break already loaded cached files public static final String CR1 = "CacheReproducer1"; public static final String CR2 = "CacheReproducer2"; public static final String CR11 = "CacheReproducer1_1"; public static final String CR21 = "CacheReproducer2_1"; public void testsBody(String id, int breaker) throws Exception { clearAndEvaluateCache(); ProcessResult pr1 = runSimpleTestSigned(id); assertLruExceptionNOTappeared(pr1); evaluateSimpleTest1OkCache(pr1); if (breaker < 0) { breakCache1(); } else { breakCache2(breaker); } ProcessResult pr2 = runSimpleTestSigned(id); assertLruExceptionAppeared(pr2); evaluateSimpleTest1OkCache(pr2); } @Test public void testAlreadyLoadedCached1() throws Exception { testsBody(CR1, 1); testsBody(CR1, 2); testsBody(CR1, -1); } @Test public void testAlreadyLoadedCached2() throws Exception { testsBody(CR2, 1); testsBody(CR2, 2); testsBody(CR2, -1); } @Test public void testAlreadyLoadedCached11() throws Exception { testsBody(CR11, 1); testsBody(CR11, 2); testsBody(CR11, -1); } @Test public void testAlreadyLoadedCached21() throws Exception { testsBody(CR21, 1); testsBody(CR21, 2); testsBody(CR21, -1); } @AfterClass public static void clearCache() throws Exception { clearAndEvaluateCache(); } private static void clearAndEvaluateCache() throws Exception { clearAndEvaluateCache(true); } private static void clearAndEvaluateCache(boolean force) throws Exception { if (force) { if (netxLock.isFile()) { boolean b = netxLock.delete(); Assert.assertTrue(b); } } tryToClearcache(); Assert.assertTrue("icedtea cache " + icedteaCache.getAbsolutePath() + " should be empty after clearing", icedteaCache.listFiles().length == PERMANENT_FILES); } private static String loadFile(File f) throws FileNotFoundException, UnsupportedEncodingException, IOException { BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(icedteaCacheFile), "UTF-8")); StringBuilder sb = new StringBuilder(); while (true) { String s = r.readLine(); if (s == null) { break; } sb.append(s).append("\n"); } return sb.toString(); } private static String loadCacheFile() throws IOException { return loadFile(icedteaCacheFile); } @Test public void assertBreakers1AreWorking() { String s=testS; String sp[] = s.split("\n"); String ss[] = breakAll(s).split("\n"); for (int i = 0; i < 2; i++) { Assert.assertEquals(sp[i], ss[i]); } for (int i = 2; i < ss.length; i++) { Assert.assertNotSame(sp[i], ss[i]); } String sb = breakOne(s, 0); Assert.assertEquals(s, sb); for (int x = 1; x <= 3; x++) { String[] sx = breakOne(s, x).split("\n"); for (int i = 0; i < sx.length; i++) { if (i == x + 1) { Assert.assertNotSame(sp[i], sx[i]); } else { Assert.assertEquals(sp[i], sx[i]); } } } String sbb = breakOne(s, 4); Assert.assertEquals(s, sbb); } private static String breakAll(String s) { return s.replaceAll(corruptRegex, corruptString); } private static String breakOne(String s, int i) { Matcher m1 = corruptPatern.matcher(s); int x = 0; while (m1.find()) { x++; String r = (m1.group(0)); if (x == i) { return s.replace(r, corruptString); } } return s; } @Test public void assertBreakers2AreWorking() { String s=testS; String sp[] = s.split("\n"); String ss[] = breakPaths (s).split("\n"); for (int i = 0; i < 2; i++) { Assert.assertEquals(sp[i], ss[i]); } for (int i = 2; i < ss.length; i++) { Assert.assertNotSame(sp[i], ss[i]); } } private static String breakPaths(String s) { return s.replaceAll(System.getProperty("user.home") + ".*", "/ho"); } private static void breakCache1() throws IOException { String s = loadCacheFile(); s = breakAll(s); ServerAccess.saveFile(s, icedteaCacheFile); } private static void breakCache2(int i) throws FileNotFoundException, UnsupportedEncodingException, IOException { String s = loadCacheFile(); s = breakOne(s, i); ServerAccess.saveFile(s, icedteaCacheFile); } private static void breakCache3() throws IOException { String s = loadCacheFile(); s = breakPaths(s); ServerAccess.saveFile(s, icedteaCacheFile); } private static ProcessResult runSimpleTest1() throws Exception { return runSimpleTest1(verbosed, "simpletest1"); } private static ProcessResult runSimpleTest1(List args, String s) throws Exception { ProcessResult pr2 = server.executeJavawsHeadless(args, "/" + s + ".jnlp"); return pr2; } private static ProcessResult runSimpleTest1Signed() throws Exception { return runSimpleTestSigned("SimpletestSigned1"); } private static ProcessResult runSimpleTestSigned(String id) throws Exception { return runSimpleTest1(trustedVerboses, id); } private static void evaluateSimpleTest1OkCache(ProcessResult pr2) throws Exception { String s = "Good simple javaws exapmle"; Assert.assertTrue("test stdout should contain " + s + " but didn't", pr2.stdout.contains(s)); Assert.assertFalse(pr2.wasTerminated); Assert.assertEquals((Integer) 0, pr2.returnValue); } private static ProcessResult tryToClearcache() throws Exception { ProcessResult pr1 = server.executeJavawsClearCache(); return pr1; } } icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024126 xustar0030 mtime=1552401893.088832721 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/srcs/0000755000175000002070000000000013441742745025013 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/srcs/PaxHeaders.7406/CacheReproducer.java0000644000000000000000000000013213441742745030104 xustar0030 mtime=1552401893.088832721 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/CacheReproducer/srcs/CacheReproducer.java0000644000175000002070000000362413441742745030721 0ustar00jvanekmock00000000000000/* CacheReproducer.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.lang.reflect.*; public class CacheReproducer{ public static void main(String[] args) throws Exception{ Class c1= Class.forName("SimpletestSigned1"); Method m1=c1.getDeclaredMethod("main",args.getClass()); m1.invoke((Object) null, (Object)args); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/AccessClassInPackageSigned0000644000000000000000000000013213441742745025202 xustar0030 mtime=1552401893.087832723 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/0000755000175000002070000000000013441742745026067 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027214 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/0000755000175000002070000000000013441742745030101 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/PaxHeaders.7406/Access0000644000000000000000000000032613441742745030422 xustar00124 path=icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedNETSF.jnlp 30 mtime=1552401893.097832702 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSi0000644000175000002070000000450713441742745034260 0ustar00jvanekmock00000000000000 Test accessClassInPackage by signed app IcedTea testing access to net.sourceforge.* package by signed app net.sourceforge.jnlp.Parser icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/PaxHeaders.7406/Access0000644000000000000000000000033213441742745030417 xustar00128 path=icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedJAVAXJNLP.jnlp 30 mtime=1552401893.124832646 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSi0000644000175000002070000000447213441742745034261 0ustar00jvanekmock00000000000000 Test accessClassInPackage signed IcedTea testing access to some javax.jnlp.* package by signed app javax.jnlp.ServiceManager icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/PaxHeaders.7406/Access0000644000000000000000000000032513441742745030421 xustar00123 path=icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedSELF.jnlp 30 mtime=1552401893.084832729 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSi0000644000175000002070000000450313441742745034254 0ustar00jvanekmock00000000000000 Test accessClassInPackage by signed app IcedTea testing aaccess to package's internal class by signed app AccessClassInPackageSigned icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/PaxHeaders.7406/Access0000644000000000000000000000032713441742745030423 xustar00125 path=icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedSUNSEC.jnlp 30 mtime=1552401893.087832723 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSi0000644000175000002070000000452313441742745034256 0ustar00jvanekmock00000000000000 Test accessClassInPackage by signed app IcedTea testing access to sun.security.* package by signed app sun.security.internal.spec.TlsKeyMaterialSpec icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026154 xustar0030 mtime=1552401893.087832723 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/srcs/0000755000175000002070000000000013441742745027041 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/srcs/PaxHeaders.7406/AccessClass0000644000000000000000000000031413441742745030345 xustar00114 path=icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/srcs/AccessClassInPackageSigned.java 30 mtime=1552401893.087832723 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/AccessClassInPackageSigned/srcs/AccessClassInPackageSigned.0000644000175000002070000000350713441742745034133 0ustar00jvanekmock00000000000000/* AccessClassInPackage.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class AccessClassInPackageSigned { public static void main(String[] args) throws Exception{ Class.forName(args[0]); System.out.println("Class was obtained: "+ args[0]); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/jcalendar0000644000000000000000000000013213441742745022041 xustar0030 mtime=1552401893.108832679 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/jcalendar/0000755000175000002070000000000013441742745022726 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/jcalendar/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023013 xustar0030 mtime=1552401893.108832679 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/jcalendar/srcs/0000755000175000002070000000000013441742745023700 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/jcalendar/srcs/PaxHeaders.7406/jcalendar.java0000644000000000000000000000013213441742745025656 xustar0030 mtime=1552401893.108832679 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/jcalendar/srcs/jcalendar.java0000644000175000002070000000600613441742745026470 0ustar00jvanekmock00000000000000/* Copyright (C) 2017 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; /** * This is used by Kemtrak reproducer. Originally the jar was signed2, but I * always forget: netx: Initialization Error: Could not initialize applet. * (Fatal: Application Error: The JNLP application is not fully signed by a * single cert. The JNLP application has its components individually signed, * however there must be a common signer to all entries.) netx: Initialization * Error: Could not initialize applet. (Fatal: Application Error: The JNLP * application is not fully signed by a single cert. The JNLP application has * its components individually signed, however there must be a common signer to * all entries.) * * @author jvanek */ public class jcalendar extends Applet { private class Killer extends Thread { public int n = 1000; @Override public void run() { try { Thread.sleep(n); System.out.println("Applet killing himself after " + n + " ms of life"); System.exit(0); } catch (Exception ex) { } } } private Killer killer; public static void main1(String[] args) { System.out.println("jcalendar1"); } public static void main2(String[] args) { System.out.println("jcalendar2"); } @Override public void init() { System.out.println("jcalendar0"); killer = new Killer(); killer.start(); } } icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/SimpletestSigned10000644000000000000000000000013213441742745023462 xustar0030 mtime=1552401893.108832679 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/SimpletestSigned1/0000755000175000002070000000000013441742745024347 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SimpletestSigned1/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024434 xustar0030 mtime=1552401893.108832679 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/SimpletestSigned1/srcs/0000755000175000002070000000000013441742745025321 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SimpletestSigned1/srcs/PaxHeaders.7406/SimpletestSigned1.ja0000644000000000000000000000013213441742745030371 xustar0030 mtime=1552401893.108832679 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/SimpletestSigned1/srcs/SimpletestSigned1.java0000644000175000002070000000337613441742745031541 0ustar00jvanekmock00000000000000/* SimpletestSigned1.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SimpletestSigned1{ public static void main(String[] args){ System.out.println("Good simple javaws exapmle"); } } icedtea-web-1.8/tests/reproducers/signed/SimpletestSigned1/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025474 xustar0030 mtime=1552401893.105832685 30 atime=1552410887.111183447 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/SimpletestSigned1/resources/0000755000175000002070000000000013441742745026361 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/SimpletestSigned1/resources/PaxHeaders.7406/SimpletestSigne0000644000000000000000000000013213441742745030613 xustar0030 mtime=1552401893.105832685 30 atime=1552402157.261253427 30 ctime=1552410887.071183541 icedtea-web-1.8/tests/reproducers/signed/SimpletestSigned1/resources/SimpletestSigned1.jnlp0000644000175000002070000000415613441742745032620 0ustar00jvanekmock00000000000000 simpletest1 IcedTea simpletest1 icedtea-web-1.8/tests/reproducers/signed/PaxHeaders.7406/CustomPolicy0000644000000000000000000000013213441742745022550 xustar0030 mtime=1552401893.128832638 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/0000755000175000002070000000000013441742745023435 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024546 xustar0030 mtime=1552401893.102832692 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/testcases/0000755000175000002070000000000013441742745025433 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/testcases/PaxHeaders.7406/CustomPolicyTests.ja0000644000000000000000000000013213441742745030614 xustar0030 mtime=1552401893.102832692 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/testcases/CustomPolicyTests.java0000644000175000002070000000522113441742745031753 0ustar00jvanekmock00000000000000/* CustomPolicyTests.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import org.junit.Assert; import org.junit.Test; public class CustomPolicyTests { private ServerAccess server = new ServerAccess(); private static final List TRUSTALL = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); @Bug(id="1145") @Test public void customPolicyTest() throws Exception { final String expectedACE = "AccessControlException: Cannot set context class loader"; final String expectedOutput = "Program Executed Correctly"; ProcessResult pr = server.executeJavawsHeadless(TRUSTALL, "/CustomPolicy.jnlp"); Assert.assertTrue("Stdout should contain " + expectedACE + " but did not", pr.stdout.contains(expectedACE)); Assert.assertTrue("Stdout should contain " + expectedOutput + " but did not", pr.stdout.contains(expectedOutput)); } } icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023522 xustar0030 mtime=1552401893.128832638 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/srcs/0000755000175000002070000000000013441742745024407 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/srcs/PaxHeaders.7406/CustomPolicy.java0000644000000000000000000000013213441742745027074 xustar0030 mtime=1552401893.128832638 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/srcs/CustomPolicy.java0000644000175000002070000000702313441742745027706 0ustar00jvanekmock00000000000000/* CustomPolicy.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.net.MalformedURLException; import java.net.URL; import java.security.AccessControlContext; import java.security.AccessController; import java.security.cert.Certificate; import java.security.AccessControlException; import java.security.CodeSource; import java.security.PermissionCollection; import java.security.Permissions; import java.security.Policy; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.security.ProtectionDomain; public class CustomPolicy { public static AccessControlContext strictAccessControlContext() throws MalformedURLException { CodeSource code = new CodeSource(new URL("http://localhost"), (Certificate[]) null); ProtectionDomain pd = new ProtectionDomain(code, new Permissions(), null, null); return new AccessControlContext(new ProtectionDomain[] { pd }); } public static void main(String[] args) throws PrivilegedActionException, MalformedURLException { final Policy defaultPolicy = Policy.getPolicy(); Policy.setPolicy(new Policy() { public PermissionCollection getPermissions(CodeSource codesource) { System.out.println("Loading System here may cause problems."); return defaultPolicy.getPermissions(codesource); } public void refresh() { defaultPolicy.refresh(); } }); try { AccessController.doPrivileged(new PrivilegedExceptionAction() { public Void run() { Thread.currentThread().setContextClassLoader(null); return null; } }, strictAccessControlContext()); } catch (AccessControlException ace) { System.out.println("AccessControlException: Cannot set context class loader"); } System.out.println("Program Executed Correctly"); } } icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024562 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/resources/0000755000175000002070000000000013441742745025447 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/resources/PaxHeaders.7406/CustomPolicy.jnlp0000644000000000000000000000013213441742745030156 xustar0030 mtime=1552401893.096832704 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/signed/CustomPolicy/resources/CustomPolicy.jnlp0000644000175000002070000000401513441742745030766 0ustar00jvanekmock00000000000000 CustomPolicy IcedTea icedtea-web-1.8/tests/reproducers/PaxHeaders.7406/custom0000644000000000000000000000013213441742745020157 xustar0030 mtime=1552401893.084832729 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/0000755000175000002070000000000013441742745021044 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/remote0000644000000000000000000000013213441742745021452 xustar0030 mtime=1552401893.088832721 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/remote/0000755000175000002070000000000013441742745022337 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/remote/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745023450 xustar0030 mtime=1552401893.092832712 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/remote/testcases/0000755000175000002070000000000013441742745024335 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/remote/testcases/PaxHeaders.7406/RemoteApplicationSettings.0000644000000000000000000000013213441742745030666 xustar0030 mtime=1552401893.081832735 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/remote/testcases/RemoteApplicationSettings.java0000644000175000002070000002662413441742745032352 0ustar00jvanekmock00000000000000/* RemoteApplicationTests.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.runtime.Translator; import org.junit.Assert; import org.junit.Test; public class RemoteApplicationSettings { public static final String mustEmpty = "must be empty, was not"; public static final String stdout = "Stdout"; public static final String stderr = "Stderr"; public static final String stdoutEmpty = stdout + " " + mustEmpty; public static final String stderrEmpty = stderr + " " + mustEmpty; public static URL createCatchedUrl(String r) { try { return new URL(r); } catch (MalformedURLException mex) { throw new RuntimeException(mex); } } public interface RemoteApplicationTestcaseSettings { public URL getUrl(); public void evaluate(ProcessResult pr); public List modifyParams(List global); } public static abstract class StringBasedURL implements RemoteApplicationTestcaseSettings { URL u; public String clean(String s){ s = s.replace(Translator.R("MACDisabledMessage"),""); s = s.replace(Translator.R("MACCheckSkipped", ".*", ".*"), ""); s = s.replace(JNLPFile.TITLE_NOT_FOUND, ""); s = s.replaceAll("Fontconfig warning.*", ""); return s.replaceAll("\\s*" + JNLPFile.TITLE_NOT_FOUND + "\\s*", "").trim(); } @Override public URL getUrl() { return u; } public StringBasedURL(String r) { this.u = createCatchedUrl(r); } @Override public List modifyParams(List global) { return global; } } public static class FourierTransform extends StringBasedURL { public FourierTransform() { super("http://www.cs.brown.edu/exploratories/freeSoftware/repository/edu/brown/cs/exploratories/applets/fft1DApp/1d_fast_fourier_transform_java_jnlp.jnlp"); } @Override public void evaluate(ProcessResult pr) { Assert.assertTrue(stdoutEmpty, clean(pr.stdout).length() == 0); Assert.assertTrue(clean(pr.stderr).length() == 0 || pr.stderr.contains(IllegalStateException.class.getName())); } } public static class OrawebCernCh extends StringBasedURL { public OrawebCernCh() { super("https://oraweb.cern.ch/pls/atlasintegration/docs/EMDH_atlas.jnlp"); } @Override public void evaluate(ProcessResult pr) { Assert.assertTrue(stdoutEmpty, clean(pr.stdout).length() == 0); Assert.assertTrue(clean(pr.stderr).length() == 0 || pr.stderr.contains("Cannot grant permissions to unsigned jars. Application requested security permissions, but jars are not signed")); } @Override public List modifyParams(List global) { List l = new ArrayList(global); l.add("-J-Dhttps.protocols=TLSv1,SSLv3,SSLv2Hello"); return l; } } public static class GnattProject extends StringBasedURL { public GnattProject() { super("http://ganttproject.googlecode.com/svn/webstart/ganttproject-2.0.10/ganttproject-2.0.10.jnlp"); } @Override public void evaluate(ProcessResult pr) { Assert.assertTrue(stdout, clean(pr.stdout).length() == 0); Assert.assertTrue(pr.stderr.contains("Splash closed")); Assert.assertFalse(pr.stderr.contains("Exception")); } } public static class GeoGebra extends StringBasedURL { public GeoGebra() { super("http://www.geogebra.org/webstart/geogebra.jnlp"); } @Override public void evaluate(ProcessResult pr) { //some debug coords are appearing Assert.assertTrue(pr.stdout.toLowerCase().contains("geogebra")); Assert.assertFalse(pr.stderr.toLowerCase().contains("exception")); } } public abstract static class NoOutputs extends StringBasedURL { public NoOutputs(String r) { super(r); } @Override public void evaluate(ProcessResult pr) { Assert.assertTrue(stdoutEmpty, pr.stdout.length() == 0); Assert.assertTrue(stderrEmpty, pr.stderr.length() == 0); } } public abstract static class NearlyNoOutputs extends StringBasedURL { public NearlyNoOutputs(String r) { super(r); } @Override public void evaluate(ProcessResult pr) { Assert.assertTrue(stdoutEmpty, clean(pr.stdout).length() == 0); Assert.assertTrue(stderrEmpty, clean(pr.stderr).length() == 0); } } public abstract static class NearlyNoOutputsOnWrongJRE extends NearlyNoOutputs { public NearlyNoOutputsOnWrongJRE(String r) { super(r); } @Override public void evaluate(ProcessResult pr) { Assert.assertTrue(stdoutEmpty, removeJreVersionWarning(clean(pr.stdout)).length() == 0); Assert.assertTrue(stderrEmpty, removeJreVersionWarning(clean(pr.stderr)).length() == 0); } } private static final String pattern = ".*" + Translator.R("JREversionDontMatch", ".*", ".*") + ".*"; private static String removeJreVersionWarning(String clean) { return clean.replaceAll(pattern, ""); } @Test public void testJREversionDontMatchRemoval(){ Assert.assertTrue(removeJreVersionWarning(Translator.R("JREversionDontMatch", "1.8.0-pre.whatever", "{0}")).isEmpty()); Assert.assertTrue(removeJreVersionWarning(Translator.R("JREversionDontMatch", "{0}", "{1}")).isEmpty()); Assert.assertTrue(removeJreVersionWarning(Translator.R("JREversionDontMatch", "1.3.0-pre-pac", "1.8.0-pre.whatever}")).isEmpty()); Assert.assertTrue(removeJreVersionWarning(Translator.R("JREversionDontMatch", "", "")).isEmpty()); Assert.assertTrue(removeJreVersionWarning(Translator.R("JREversionDontMatch", " - - - - ", " - - - ")).isEmpty()); Assert.assertFalse(removeJreVersionWarning("AA\n"+Translator.R("JREversionDontMatch", "1.3+", "1.7")+"\nBB").equals("AA\nBB")); } public static class Arbores extends NearlyNoOutputsOnWrongJRE { public Arbores() { super("http://www.arbores.ca/AnnuityCalc.jnlp"); } } public static class PhetSims extends NearlyNoOutputs { public PhetSims() { super("http://phetsims.colorado.edu/sims/circuit-construction-kit/circuit-construction-kit-dc_en.jnlp"); } } public static class TopCoder extends NearlyNoOutputs { public TopCoder() { super("http://www.topcoder.com/contest/arena/ContestAppletProd.jnlp"); } } public static class SunSwingDemo extends StringBasedURL { public SunSwingDemo() throws MalformedURLException { super("https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/ComponentEventDemoProject/ComponentEventDemo.jnlp"); } @Override public void evaluate(ProcessResult pr) { Assert.assertFalse(pr.stdout.contains("Exception")); Assert.assertFalse(pr.stdout.contains("Error")); Assert.assertFalse(pr.stderr.contains("Exception")); Assert.assertFalse(pr.stderr.contains("Error")); } } public static class ArboresDeposit extends NearlyNoOutputsOnWrongJRE { public ArboresDeposit() throws MalformedURLException { super("http://www.arbores.ca/Deposit.jnlp"); } } public static class AviationWeather extends StringBasedURL { @Override public void evaluate(ProcessResult pr) { Assert.assertTrue(stdoutEmpty, clean(pr.stdout).length() == 0); Assert.assertTrue(clean(pr.stderr).length() == 0 || (clean(pr.stderr).contains("Cannot read File Manager history data file,") && pr.stderr.contains("FileMgr will be initialized with default options"))); } public AviationWeather() { super("http://aviationweather.gov/static/adds/java/fpt/fpt.jnlp"); } } public static class FuseSwing extends NearlyNoOutputs { public FuseSwing() { super("http://www.progx.org/users/Gfx/apps/fuse-swing-demo.jnlp"); } } @Test public void remoteApplicationSettingsAreWorking() throws Exception { RemoteApplicationTestcaseSettings s5 = new FourierTransform(); Assert.assertNotNull(s5.getUrl()); RemoteApplicationTestcaseSettings s4 = new Arbores(); Assert.assertNotNull(s4.getUrl()); RemoteApplicationTestcaseSettings s3 = new PhetSims(); Assert.assertNotNull(s3.getUrl()); RemoteApplicationTestcaseSettings s2 = new TopCoder(); Assert.assertNotNull(s2.getUrl()); RemoteApplicationTestcaseSettings s1 = new SunSwingDemo(); Assert.assertNotNull(s1.getUrl()); RemoteApplicationTestcaseSettings s6 = new ArboresDeposit(); Assert.assertNotNull(s6.getUrl()); RemoteApplicationTestcaseSettings s7 = new OrawebCernCh(); Assert.assertNotNull(s7.getUrl()); RemoteApplicationTestcaseSettings s8 = new AviationWeather(); Assert.assertNotNull(s8.getUrl()); RemoteApplicationTestcaseSettings s9 = new FuseSwing(); Assert.assertNotNull(s9.getUrl()); RemoteApplicationTestcaseSettings s10 = new GnattProject(); Assert.assertNotNull(s10.getUrl()); RemoteApplicationTestcaseSettings s11 = new GeoGebra(); Assert.assertNotNull(s11.getUrl()); } } icedtea-web-1.8/tests/reproducers/custom/remote/testcases/PaxHeaders.7406/RemoteApplicationTests.jav0000644000000000000000000000013213441742745030671 xustar0030 mtime=1552401893.092832712 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/remote/testcases/RemoteApplicationTests.java0000644000175000002070000001446513441742745031654 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.Remote; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @Remote public class RemoteApplicationTests { private static ServerAccess server = new ServerAccess(); private final List l = Collections.unmodifiableList(Arrays.asList(new String[]{"-Xtrustall"})); private final List ll = Collections.unmodifiableList(Arrays.asList(new String[]{"-Xtrustall", "-Xnofork"})); private static final long defaultTimeout = server.PROCESS_TIMEOUT; @BeforeClass public static void setup() { //Remote applications need to download files and take a little longer (20s) server.PROCESS_TIMEOUT = 20 * 1000l; } @AfterClass public static void teardown() { server.PROCESS_TIMEOUT = defaultTimeout; } @Test @NeedsDisplay public void topCoderRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.TopCoder(); ProcessResult pr = server.executeJavawsUponUrl(ll, settings.getUrl()); settings.evaluate(pr); } @Test @NeedsDisplay public void sunSwingRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.SunSwingDemo(); ProcessResult pr = server.executeJavawsUponUrl(l, settings.getUrl()); settings.evaluate(pr); } @Test @NeedsDisplay public void fourierTransformRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.FourierTransform(); ProcessResult pr = server.executeJavawsUponUrl(null, settings.getUrl()); settings.evaluate(pr); } @Test @NeedsDisplay public void arboresRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.Arbores(); ProcessResult pr = server.executeJavawsUponUrl(l, settings.getUrl()); settings.evaluate(pr); } @Test @NeedsDisplay public void phetsimsRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.PhetSims(); ProcessResult pr = server.executeJavawsUponUrl(l, settings.getUrl()); settings.evaluate(pr); } @Test @NeedsDisplay public void arboresDepositRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.ArboresDeposit(); ProcessResult pr = server.executeJavawsUponUrl(l, settings.getUrl()); settings.evaluate(pr); } /* This application need all permissions, but contains unsigned jar. Have exception but works at least somehow */ @Test @NeedsDisplay public void orawebCernChRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.OrawebCernCh(); ProcessResult pr = server.executeJavawsUponUrl(settings.modifyParams(ll), settings.getUrl()); settings.evaluate(pr); } @Test @NeedsDisplay public void AviationWeatherRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.AviationWeather(); ProcessResult pr = server.executeJavawsUponUrl(ll, settings.getUrl()); settings.evaluate(pr); } @Test @NeedsDisplay public void fuseSysRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.FuseSwing(); ProcessResult pr = server.executeJavawsUponUrl(l, settings.getUrl()); settings.evaluate(pr); } @Test @NeedsDisplay public void gantProjectRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.GnattProject(); ProcessResult pr = server.executeJavawsUponUrl(l, settings.getUrl()); settings.evaluate(pr); } @Test @NeedsDisplay public void geogebraRemoteTest() throws Exception { RemoteApplicationSettings.RemoteApplicationTestcaseSettings settings = new RemoteApplicationSettings.GeoGebra(); ProcessResult pr = server.executeJavawsUponUrl(ll, settings.getUrl()); settings.evaluate(pr); } } icedtea-web-1.8/tests/reproducers/custom/remote/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745022424 xustar0030 mtime=1552401893.088832721 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/remote/srcs/0000755000175000002070000000000013441742745023311 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/remote/srcs/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745024141 xustar0030 mtime=1552401893.088832721 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/remote/srcs/Makefile0000644000175000002070000000022513441742745024750 0ustar00jvanekmock00000000000000prepare-reproducer: echo "Nothing to do to prepare remote reproducers now" clean-reproducer: echo "Nothing to do to clean remote reproducers now" icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/TrustedOnlyAttribute0000644000000000000000000000013213441742745024337 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/0000755000175000002070000000000013441742745025224 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745026335 xustar0030 mtime=1552401893.124832646 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/testcases/0000755000175000002070000000000013441742745027222 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/testcases/PaxHeaders.7406/TrustedOnlyA0000644000000000000000000000031113441742745030731 xustar00111 path=icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/testcases/TrustedOnlyAttributeTest.java 30 mtime=1552401893.124832646 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/testcases/TrustedOnlyAttributeTest.jav0000644000175000002070000001455113441742745034752 0ustar00jvanekmock00000000000000/* TrustedOnlyAttributeTest.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.util.FileUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import java.io.File; import java.io.IOException; public class TrustedOnlyAttributeTest extends BrowserTest { private static final String RUNNING_STRING = "TrustedOnlyAttribute applet running"; private static final String CLOSE_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; private static File deployFile; private static String attributesCheck; @BeforeClass public static void setupDeploymentProperties() throws IOException { deployFile = PathsAndFiles.USER_DEPLOYMENT_FILE.getFile(); String properties = FileUtils.loadFileAsString(deployFile); for (String line : properties.split("\n")) { if (line.contains("deployment.manifest.attribute.check")) { attributesCheck = line; properties = properties.replace(line, "deployment.manifest.attributes.check=TRUSTED\n"); } } if (attributesCheck == null) { properties += "deployment.manifest.attributes.check=TRUSTED\n"; } FileUtils.saveFile(properties, deployFile); } @AfterClass public static void setbackDeploymentProperties() throws IOException { String properties = FileUtils.loadFileAsString(deployFile); if (attributesCheck != null) { properties = properties.replace("deployment.manifest.attributes.check=TRUSTED\n", attributesCheck); } else { properties = properties.replace("deployment.manifest.attributes.check=TRUSTED\n", ""); } FileUtils.saveFile(properties, deployFile); } @NeedsDisplay @Test @TestInBrowsers(testIn={Browsers.one}) public void testSignedAppletWithManifestAttributeAndNoHtmlSecurity() throws Exception { ProcessResult pr = server.executeBrowser("TrustedOnlyAttribute-signed.html", AutoClose.CLOSE_ON_BOTH); assertFalse("Applet should not have failed to launch", pr.stderr.contains("LaunchException")); assertTrue("Applet should have run", pr.stdout.contains(RUNNING_STRING)); } @Test public void testSignedAppletWithManifestAttributeAndNoJnlpSecurity() throws Exception { ProcessResult pr = server.executeJavawsHeadless("TrustedOnlyAttribute-signed-nosecurity.jnlp"); assertTrue("Applet should have failed to launch", pr.stderr.contains("LaunchException")); assertFalse("Applet should not have run", pr.stdout.contains(RUNNING_STRING)); } @Test public void testSignedAppletWithManifestAttributeWithJnlpSecurity() throws Exception { ProcessResult pr = server.executeJavawsHeadless("TrustedOnlyAttribute-signed-security.jnlp"); assertFalse("Applet should not have failed to launch", pr.stderr.contains("LaunchException")); assertTrue("Applet should have run", pr.stdout.contains(RUNNING_STRING)); } @NeedsDisplay @Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedAppletWithManifestAttributeAndNoHtmlSecurity() throws Exception { ProcessResult pr = server.executeBrowser("TrustedOnlyAttribute-unsigned.html", AutoClose.CLOSE_ON_BOTH); assertTrue("Applet should have failed to launch", pr.stderr.contains("LaunchException")); assertFalse("Applet should not have run", pr.stdout.contains(RUNNING_STRING)); } @Test public void testUnsignedAppletWithManifestAttributeAndNoJnlpSecurity() throws Exception { ProcessResult pr = server.executeJavawsHeadless("TrustedOnlyAttribute-unsigned-nosecurity.jnlp"); assertTrue("Applet should have failed to launch", pr.stderr.contains("LaunchException")); assertFalse("Applet should not have run", pr.stdout.contains(RUNNING_STRING)); } @Test public void testUnsignedAppletWithManifestAttributeWithJnlpSecurity() throws Exception { ProcessResult pr = server.executeJavawsHeadless("TrustedOnlyAttribute-unsigned-security.jnlp"); assertTrue("Applet should have failed to launch", pr.stderr.contains("LaunchException")); assertFalse("Applet should not have run", pr.stdout.contains(RUNNING_STRING)); } } icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745025311 xustar0030 mtime=1552401893.091832715 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/srcs/0000755000175000002070000000000013441742745026176 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/srcs/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745027026 xustar0030 mtime=1552401893.081832735 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/srcs/Makefile0000644000175000002070000000202013441742745027630 0ustar00jvanekmock00000000000000TESTNAME=TrustedOnlyAttribute JARSIGNER=$(EXPORTED_JARSIGNER) JAVAC=$(EXPORTED_JAVAC) JAR=$(EXPORTED_JAR) ifeq ($(OS), Windows_NT) TMPDIR:=$(shell cygpath -p -m $(shell mktemp -d)) else TMPDIR:=$(shell mktemp -d) endif prepare-reproducer: echo PREPARING REPRODUCER $(TESTNAME) in $(TMPDIR) cp MANIFEST.MF $(TMPDIR) ; \ $(JAVAC) -d $(TMPDIR) $(TESTNAME).java ; \ cd $(TMPDIR) ; \ $(JAR) cvfm $(TESTNAME)Signed.jar MANIFEST.MF $(TESTNAME).class ; \ $(JAR) cvfm $(TESTNAME)Unsigned.jar MANIFEST.MF $(TESTNAME).class ; \ $(EXPORTED_JARSIGNER) -keystore $(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME) -storepass $(PRIVATE_KEYSTORE_PASS) \ -keypass $(PRIVATE_KEYSTORE_PASS) "$(TMPDIR)/$(TESTNAME)Signed.jar" $(TEST_CERT_ALIAS)_signed ; \ cd $(TMPDIR); \ mv $(TESTNAME)Signed.jar $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) ; \ mv $(TESTNAME)Unsigned.jar $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) ; \ echo PREPARED REPRODUCER $(TESTNAME), removing $(TMPDIR) rm -rf $(TMPDIR) clean-reproducer: echo NOTHING TO CLEAN FOR $(TESTNAME) icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/srcs/PaxHeaders.7406/TrustedOnlyAttrib0000644000000000000000000000013213441742745030753 xustar0030 mtime=1552401893.091832715 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/srcs/TrustedOnlyAttribute.java0000644000175000002070000000371313441742745033225 0ustar00jvanekmock00000000000000/* TrustedOnlyAttribute.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class TrustedOnlyAttribute extends Applet { private static final String appletCloseString = "*** APPLET FINISHED ***"; @Override public void init() { System.out.println("TrustedOnlyAttribute applet running"); System.out.println(appletCloseString); System.exit(0); } } icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/srcs/PaxHeaders.7406/MANIFEST.MF0000644000000000000000000000013213441742745027020 xustar0030 mtime=1552401893.087832723 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/srcs/MANIFEST.MF0000644000175000002070000000007313441742745027630 0ustar00jvanekmock00000000000000Trusted-Only: true Application-Name: TrustedOnlyAttribute icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/PaxHeaders.7406/resources0000644000000000000000000000013213441742745026351 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/0000755000175000002070000000000013441742745027236 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/PaxHeaders.7406/TrustedOnlyA0000644000000000000000000000031413441742745030750 xustar00114 path=icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed.html 30 mtime=1552401893.096832704 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed.0000644000175000002070000000352713441742745034675 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/PaxHeaders.7406/TrustedOnlyA0000644000000000000000000000032513441742745030752 xustar00123 path=icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed-security.jnlp 30 mtime=1552401893.123832648 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed-0000644000175000002070000000443613441742745034674 0ustar00jvanekmock00000000000000 TrustedOnlyAttribute IcedTea Trusted-Only Manifest Attribute Test icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/PaxHeaders.7406/TrustedOnlyA0000644000000000000000000000033113441742745030747 xustar00127 path=icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigned-nosecurity.jnlp 30 mtime=1552401893.083832731 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigne0000644000175000002070000000435013441742745035011 0ustar00jvanekmock00000000000000 TrustedOnlyAttribute IcedTea Trusted-Only Manifest Attribute Test icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/PaxHeaders.7406/TrustedOnlyA0000644000000000000000000000031613441742745030752 xustar00116 path=icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigned.html 30 mtime=1552401893.086832725 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigne0000644000175000002070000000353113441742745035011 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/PaxHeaders.7406/TrustedOnlyA0000644000000000000000000000032713441742745030754 xustar00125 path=icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigned-security.jnlp 30 mtime=1552401893.086832725 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigne0000644000175000002070000000444213441742745035013 0ustar00jvanekmock00000000000000 TrustedOnlyAttribute IcedTea Trusted-Only Manifest Attribute Test icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/PaxHeaders.7406/TrustedOnlyA0000644000000000000000000000032713441742745030754 xustar00125 path=icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed-nosecurity.jnlp 30 mtime=1552401893.091832715 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed-0000644000175000002070000000434613441742745034674 0ustar00jvanekmock00000000000000 TrustedOnlyAttribute IcedTea Trusted-Only Manifest Attribute Test icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/SignedAppletExternalMainClass0000644000000000000000000000013213441742745026034 xustar0030 mtime=1552401893.085832727 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/0000755000175000002070000000000013441742745026721 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745030032 xustar0030 mtime=1552401893.080832738 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/testcases/0000755000175000002070000000000013441742745030717 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/testcases/PaxHeaders.7406/Sig0000644000000000000000000000033313441742745030557 xustar00129 path=icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/testcases/SignedAppletExternalMainClassTest.java 30 mtime=1552401893.080832738 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/testcases/SignedAppletExterna0000644000175000002070000000630113441742745034550 0ustar00jvanekmock00000000000000/* SignedAppletExternalMainClassTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; /* see also signed/SignedAppletCodebaseLoading which is related */ public class SignedAppletExternalMainClassTest extends BrowserTest { private static final String RUNNING_STRING = "SignedAppletExternalMainClass Applet Running"; private static final String CLOSE_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; @Bug(id="PR1513") @NeedsDisplay @Test @TestInBrowsers(testIn={Browsers.one}) public void testSignedAppletWithExternalMainClassLaunch() throws Exception { ProcessResult pr = server.executeBrowser("SignedAppletExternalMainClass.html", AutoClose.CLOSE_ON_CORRECT_END); assertProperStart(pr); assertCloseString(pr); } private static void assertProperStart(ProcessResult pr) { assertTrue("applet did not initialize", pr.stdout.contains(RUNNING_STRING)); } private static void assertCloseString(ProcessResult pr) { assertTrue("applet should have closed normally", pr.stdout.contains(CLOSE_STRING)); } } icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/PaxHeaders.7406/resources0000644000000000000000000000013213441742745030046 xustar0030 mtime=1552401893.083832731 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/resources/0000755000175000002070000000000013441742745030733 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/resources/PaxHeaders.7406/Sig0000644000000000000000000000032713441742745030576 xustar00125 path=icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/resources/SignedAppletExternalMainClass.html 30 mtime=1552401893.083832731 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/resources/SignedAppletExterna0000644000175000002070000000355113441742745034570 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745027006 xustar0030 mtime=1552401893.086832725 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/srcs/0000755000175000002070000000000013441742745027673 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/srcs/PaxHeaders.7406/SignedAp0000644000000000000000000000032213441742745030501 xustar00120 path=icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/srcs/SignedAppletExternalMainClass.java 30 mtime=1552401893.085832727 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/srcs/SignedAppletExternalMain0000644000175000002070000000371213441742745034510 0ustar00jvanekmock00000000000000/* SignedAppletExternalMainClass.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; public class SignedAppletExternalMainClass extends Applet { private static final String appletCloseString = "*** APPLET FINISHED ***"; @Override public void init() { System.out.println(SignedAppletExternalMainClassHelper.help()); System.out.println(appletCloseString); } } icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/srcs/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745030523 xustar0030 mtime=1552401893.085832727 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/srcs/Makefile0000644000175000002070000000167213441742745031341 0ustar00jvanekmock00000000000000TESTNAME=SignedAppletExternalMainClass JARSIGNER=$(EXPORTED_JARSIGNER) JAVAC=$(EXPORTED_JAVAC) JAR=$(EXPORTED_JAR) ifeq ($(OS), Windows_NT) TMPDIR:=$(shell cygpath -p -m $(shell mktemp -d)) else TMPDIR:=$(shell mktemp -d) endif prepare-reproducer: echo PREPARING REPRODUCER $(TESTNAME) in $(TMPDIR) $(JAVAC) -d $(TMPDIR) $(TESTNAME).java $(TESTNAME)Helper.java cd $(TMPDIR) ; \ $(JAR) cvf $(TESTNAME)Helper.jar $(TESTNAME)Helper.class ; \ $(EXPORTED_JARSIGNER) -keystore $(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME) -storepass $(PRIVATE_KEYSTORE_PASS) \ -keypass $(PRIVATE_KEYSTORE_PASS) "$(TMPDIR)/$(TESTNAME)Helper.jar" $(TEST_CERT_ALIAS)_signed ; \ cd $(TMPDIR); \ mv $(TESTNAME).class $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) ; \ mv $(TESTNAME)Helper.jar $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) ; echo PREPARED REPRODUCER $(TESTNAME), removing $(TMPDIR) rm -rf $(TMPDIR) clean-reproducer: echo NOTHING TO CLEAN FOR $(TESTNAME) icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/srcs/PaxHeaders.7406/SignedAp0000644000000000000000000000033013441742745030500 xustar00126 path=icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/srcs/SignedAppletExternalMainClassHelper.java 30 mtime=1552401893.086832725 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletExternalMainClass/srcs/SignedAppletExternalMain0000644000175000002070000000343513441742745034512 0ustar00jvanekmock00000000000000/* SignedAppletExternalMainClassHelper.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class SignedAppletExternalMainClassHelper { public static String help() { return "SignedAppletExternalMainClass Applet Running"; } } icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/SignedAppletCodebaseLoading0000644000000000000000000000013213441742745025462 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/0000755000175000002070000000000013441742745026347 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745027460 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/testcases/0000755000175000002070000000000013441742745030345 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/testcases/PaxHeaders.7406/Signe0000644000000000000000000000033013441742745030525 xustar00126 path=icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/testcases/SignedAppletCodebaseLoadingTests.java 30 mtime=1552401893.096832704 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/testcases/SignedAppletCodebaseL0000644000175000002070000000640613441742745034417 0ustar00jvanekmock00000000000000/* SignedAppletCodebaseLoadingTests.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.FileInputStream; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; /* see also signed/SignedAppletExternalMainClass which is related */ public class SignedAppletCodebaseLoadingTests extends BrowserTest { private static final String RUNNING_STRING = "SignedAppletCodebaseLoading Applet Running"; private static final String CLOSE_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; @Bug(id="PR1513") @NeedsDisplay @Test @TestInBrowsers(testIn={Browsers.one}) public void testCodebaseLoading() throws Exception { ProcessResult pr = server.executeBrowser("SignedAppletCodebaseLoading.html", AutoClose.CLOSE_ON_CORRECT_END); assertProperStart(pr); assertCloseString(pr); } private static void assertProperStart(ProcessResult pr) { assertTrue("applet did not initialize", pr.stdout.contains(RUNNING_STRING)); } private static void assertCloseString(ProcessResult pr) { assertTrue("applet should have closed normally", pr.stdout.contains(CLOSE_STRING)); } } icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026434 xustar0030 mtime=1552401893.123832648 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/0000755000175000002070000000000013441742745027321 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/PaxHeaders.7406/SignedAppl0000644000000000000000000000032413441742745030465 xustar00122 path=icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/SignedAppletCodebaseLoadingHelper.java 30 mtime=1552401893.123832648 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/SignedAppletCodebaseLoadin0000644000175000002070000000353313441742745034404 0ustar00jvanekmock00000000000000/* SignedAppletCodebaseLoadingHelper.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package helper; import signed.SignedAppletCodebaseLoading; public class SignedAppletCodebaseLoadingHelper { public static String getMessage() { return "SignedAppletCodebaseLoading Applet Running"; } } icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745030151 xustar0030 mtime=1552401893.080832738 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/Makefile0000644000175000002070000000232313441742745030761 0ustar00jvanekmock00000000000000TESTNAME=SignedAppletCodebaseLoading SRC_FILES=SignedAppletCodebaseLoading.java SignedAppletCodebaseLoadingHelper.java JAVAC_CLASSPATH=$(TEST_EXTENSIONS_DIR):$(NETX_DIR)/lib/classes.jar JAVAC=$(EXPORTED_JAVAC) JAR=$(EXPORTED_JAR) JARSIGNER=$(EXPORTED_JARSIGNER) JARSIGNER_CMD=$(JARSIGNER) -keystore $(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME) -storepass $(PRIVATE_KEYSTORE_PASS) -keypass $(PRIVATE_KEYSTORE_PASS) ifeq ($(OS), Windows_NT) TMPDIR:=$(shell cygpath -p -m $(shell mktemp -d)) else TMPDIR:=$(shell mktemp -d) endif prepare-reproducer: echo PREPARING REPRODUCER $(TESTNAME) $(JAVAC) -d $(TMPDIR) -classpath $(JAVAC_CLASSPATH) $(SRC_FILES); \ cp ../resources/* $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ cd $(TMPDIR); \ $(JAR) cfe SignedAppletCodebaseLoading.jar signed.SignedAppletCodebaseLoading signed; \ cd -; \ $(JARSIGNER_CMD) -sigfile Alpha $(TMPDIR)/SignedAppletCodebaseLoading.jar $(TEST_CERT_ALIAS)_signed; \ cp $(TMPDIR)/SignedAppletCodebaseLoading.jar $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ cp -r $(TMPDIR)/helper $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ echo PREPARED REPRODUCER $(TESTNAME), removing $(TMPDIR); \ rm -rf $(TMPDIR); \ clean-reproducer: echo NOTHING TO CLEAN FOR $(TESTNAME) icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/PaxHeaders.7406/SignedAppl0000644000000000000000000000031613441742745030466 xustar00116 path=icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/SignedAppletCodebaseLoading.java 30 mtime=1552401893.090832717 30 atime=1552402157.261253427 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/SignedAppletCodebaseLoadin0000644000175000002070000000370513441742745034405 0ustar00jvanekmock00000000000000/* SignedAppletCodebaseLoading.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package signed; import helper.SignedAppletCodebaseLoadingHelper; import java.applet.Applet; public class SignedAppletCodebaseLoading extends Applet { @Override public void start() { System.out.println(SignedAppletCodebaseLoadingHelper.getMessage()); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027474 xustar0030 mtime=1552401893.083832731 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/resources/0000755000175000002070000000000013441742745030361 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/resources/PaxHeaders.7406/Signe0000644000000000000000000000032313441742745030543 xustar00121 path=icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/resources/SignedAppletCodebaseLoading.html 30 mtime=1552401893.083832731 30 atime=1552402157.260253429 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/SignedAppletCodebaseLoading/resources/SignedAppletCodebaseL0000644000175000002070000000407513441742745034433 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/PartiallySignedAppletManifestSpecifiesSandb0000644000000000000000000000013213441742745030712 xustar0030 mtime=1552401893.084832729 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/0000755000175000002070000000000013441742745032146 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/PaxHeaders.740000644000000000000000000000013113441742745031112 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.111183447 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/0000755000175000002070000000000013441742745034160 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000037713441742745031413 xustar00165 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxUnsigned.jnlp 30 mtime=1552401893.095832706 30 atime=1552402157.260253429 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000460313441742745034630 0ustar00jvanekmock00000000000000 PartiallySigningAppletUnsigned IcedTea Test Partially Signing Applet Specifying Sandbox icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000041313441742745031402 xustar00177 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionSignedJNLPhref.html 30 mtime=1552401893.094832708 30 atime=1552402157.260253429 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000360113441742745034625 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000037613441742745031412 xustar00165 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxUnsigned.html 29 mtime=1552401893.12283265 30 atime=1552402157.260253429 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000370513441742745034632 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000040313441742745031401 xustar00169 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionSigned.jnlp 30 mtime=1552401893.121832652 30 atime=1552402157.260253429 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000463313441742745034633 0ustar00jvanekmock00000000000000 PartiallySigningAppletSigned IcedTea Test Partially Signing Applet Specifying AllPermission icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000040413441742745031402 xustar00170 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedApplicationManifestSpecifiesSandboxUnsigned.jnlp 30 mtime=1552401893.079832739 30 atime=1552402157.260253429 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000462213441742745034631 0ustar00jvanekmock00000000000000 PartiallySigningAppletUnsigned IcedTea Test Partially Signing Applet Specifying Sandbox icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000037513441742745031411 xustar00163 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxSigned.jnlp 30 mtime=1552401893.079832739 30 atime=1552402157.260253429 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000457313441742745034636 0ustar00jvanekmock00000000000000 PartiallySigningAppletSigned IcedTea Test Partially Signing Applet Specifying Sandbox icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000040713441742745031405 xustar00173 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxUnsignedJNLPhref.html 30 mtime=1552401893.082832733 30 atime=1552402157.260253429 30 ctime=1552410887.070183543 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000360313441742745034627 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000040513441742745031403 xustar00171 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionUnsigned.html 30 mtime=1552401893.081832735 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000372113441742745034630 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000041213441742745031401 xustar00176 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedApplicationManifestSpecifiesAllPermissionUnsigned.jnlp 30 mtime=1552401893.084832729 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000466213441742745034635 0ustar00jvanekmock00000000000000 PartiallySigningAppletUnsigned IcedTea Test Partially Signing Applet Specifying AllPermission icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000041513441742745031404 xustar00179 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionUnsignedJNLPhref.html 30 mtime=1552401893.083832731 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000361113441742745034626 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000041013441742745031377 xustar00174 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedApplicationManifestSpecifiesAllPermissionSigned.jnlp 30 mtime=1552401893.084832729 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000465213441742745034634 0ustar00jvanekmock00000000000000 PartiallySigningAppletSigned IcedTea Test Partially Signing Applet Specifying AllPermission icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000040513441742745031403 xustar00171 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionUnsigned.jnlp 30 mtime=1552401893.084832729 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000464313441742745034634 0ustar00jvanekmock00000000000000 PartiallySigningAppletUnsigned IcedTea Test Partially Signing Applet Specifying AllPermission icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000040513441742745031403 xustar00171 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxSignedJNLPhref.html 30 mtime=1552401893.087832723 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000357313441742745034635 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000040313441742745031401 xustar00169 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionSigned.html 30 mtime=1552401893.086832725 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000371513441742745034633 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000040213441742745031400 xustar00168 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedApplicationManifestSpecifiesSandboxSigned.jnlp 30 mtime=1552401893.082832733 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000461213441742745034630 0ustar00jvanekmock00000000000000 PartiallySigningAppletSigned IcedTea Test Partially Signing Applet Specifying Sandbox icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Pax0000644000000000000000000000037513441742745031411 xustar00163 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxSigned.html 30 mtime=1552401893.081832735 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/Par0000644000175000002070000000370013441742745034625 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/PaxHeaders.740000644000000000000000000000013113441742745031112 xustar0029 mtime=1552401893.12283265 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/0000755000175000002070000000000013441742745033120 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/PaxHeade0000644000000000000000000000013213441742745031267 xustar0030 mtime=1552401893.095832706 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/Makefile0000644000175000002070000000404113441742745034557 0ustar00jvanekmock00000000000000TESTNAME=PartiallySignedAppletManifestSpecifiesSandbox SRC_FILES=PartiallySignedAppletManifestSpecifiesSandboxSigned.java PartiallySignedAppletManifestSpecifiesSandboxUnsigned.java ENTRYPOINT_CLASSES=PartiallySignedAppletManifestSpecifiesSandboxHelper JAVAC_CLASSPATH=$(TEST_EXTENSIONS_DIR):$(NETX_DIR)/lib/classes.jar JAVAC=$(EXPORTED_JAVAC) JAR=$(EXPORTED_JAR) JARSIGNER=$(EXPORTED_JARSIGNER) JARSIGNER_CMD=$(JARSIGNER) -keystore $(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME) -storepass $(PRIVATE_KEYSTORE_PASS) -keypass $(PRIVATE_KEYSTORE_PASS) ifeq ($(OS), Windows_NT) TMPDIR:=$(shell cygpath -p -m $(shell mktemp -d)) else TMPDIR:=$(shell mktemp -d) endif prepare-reproducer: echo PREPARING REPRODUCER $(TESTNAME) $(JAVAC) -d $(TMPDIR) -classpath $(JAVAC_CLASSPATH) $(SRC_FILES); \ cp ../resources/* $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ cp ../srcs/MANIFEST.MF* $(TMPDIR); \ cd $(TMPDIR); \ $(JAR) cfme PartiallySignedAppletManifestSpecifiesSandboxSigned.jar MANIFEST.MF.1 signed.PartiallySignedAppletManifestSpecifiesSandboxSigned signed; \ $(JAR) cfme PartiallySignedAppletManifestSpecifiesSandbox.jar MANIFEST.MF.1 unsigned.PartiallySignedAppletManifestSpecifiesSandboxUnsigned unsigned; \ $(JAR) cfme PartiallySignedAppletManifestSpecifiesAllPermissionSigned.jar MANIFEST.MF.2 signed.PartiallySignedAppletManifestSpecifiesSandboxSigned signed; \ $(JAR) cfme PartiallySignedAppletManifestSpecifiesAllPermission.jar MANIFEST.MF.2 unsigned.PartiallySignedAppletManifestSpecifiesSandboxUnsigned unsigned; \ cd -; \ $(JARSIGNER_CMD) -sigfile Alpha $(TMPDIR)/PartiallySignedAppletManifestSpecifiesSandboxSigned.jar $(TEST_CERT_ALIAS)_signed; \ $(JARSIGNER_CMD) -sigfile Alpha $(TMPDIR)/PartiallySignedAppletManifestSpecifiesAllPermissionSigned.jar $(TEST_CERT_ALIAS)_signed; \ cp $(TMPDIR)/PartiallySignedAppletManifestSpecifies{Sandbox,AllPermission}{Signed,}.jar $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ echo PREPARED REPRODUCER $(TESTNAME), removing $(TMPDIR); \ rm -rf $(TMPDIR); \ clean-reproducer: echo NOTHING TO CLEAN FOR $(TESTNAME) icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/PaxHeade0000644000000000000000000000031413441742745031271 xustar00115 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/MANIFEST.MF.2 29 mtime=1552401893.12283265 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/MANIFEST0000644000175000002070000000022713441742745034252 0ustar00jvanekmock00000000000000Permissions: all-permissions Application-Library-Allowable-Codebase: http://localhost Application-Name: PartiallySignedAppletManifestSpecifiesSandbox icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/PaxHeade0000644000000000000000000000037013441742745031273 xustar00158 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/PartiallySignedAppletManifestSpecifiesSandboxSigned.java 30 mtime=1552401893.082832733 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/Partiall0000644000175000002070000000516013441742745034615 0ustar00jvanekmock00000000000000/* SignedAppletManifestSpecifiesSandbox.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package signed; import java.applet.Applet; import java.lang.SecurityException; import static unsigned.PartiallySignedAppletManifestSpecifiesSandboxUnsigned.getPropUnsigned; public class PartiallySignedAppletManifestSpecifiesSandboxSigned extends Applet{ public static void main(String[] args) { Applet app = new PartiallySignedAppletManifestSpecifiesSandboxSigned(); app.init(); } @Override public void init() { System.out.println("PartiallySignedAppletManifestSpecifiesSandbox Applet Starting"); System.out.println("UNSIGNED: " + getPropUnsigned("user.home")); System.out.println("IS SIGNED: " + getPropSigned("user.home")); System.out.println("*** APPLET FINISHED ***"); } public static String getPropSigned(final String key) { try { return System.getProperty(key); } catch (final SecurityException se) { se.printStackTrace(); return "SECURITY EXCEPTION"; } } } icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/PaxHeade0000644000000000000000000000037213441742745031275 xustar00160 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/PartiallySignedAppletManifestSpecifiesSandboxUnsigned.java 30 mtime=1552401893.085832727 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/Partiall0000644000175000002070000000526013441742745034616 0ustar00jvanekmock00000000000000/* MixedSigningAppletHelper.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package unsigned; import java.applet.Applet; import java.lang.SecurityException; import static signed.PartiallySignedAppletManifestSpecifiesSandboxSigned.getPropSigned; /* See also signed/PartiallySignedAppletManifestSpecifiesSandboxSigned */ public class PartiallySignedAppletManifestSpecifiesSandboxUnsigned extends Applet { public static void main(String[] args) { Applet app = new PartiallySignedAppletManifestSpecifiesSandboxUnsigned(); app.init(); } @Override public void init() { System.out.println("PartiallySignedAppletManifestSpecifiesSandbox Applet Starting"); System.out.println("UNSIGNED: " + getPropUnsigned("user.home")); System.out.println("IS SIGNED: " + getPropSigned("user.home")); System.out.println("*** APPLET FINISHED ***"); } public static String getPropUnsigned(final String key) { try { return System.getProperty(key); } catch (final SecurityException se) { se.printStackTrace(); return "SECURITY EXCEPTION"; } } } icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/PaxHeade0000644000000000000000000000031513441742745031272 xustar00115 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/MANIFEST.MF.1 30 mtime=1552401893.090832717 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/MANIFEST0000644000175000002070000000021713441742745034251 0ustar00jvanekmock00000000000000Permissions: sandbox Application-Library-Allowable-Codebase: http://localhost Application-Name: PartiallySignedAppletManifestSpecifiesSandbox icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/PaxHeaders.740000644000000000000000000000013213441742745031113 xustar0030 mtime=1552401893.084832729 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/testcases/0000755000175000002070000000000013441742745034144 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/testcases/Pax0000644000000000000000000000037413441742745031374 xustar00162 path=icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/testcases/PartiallySignedAppletManifestSpecifiesSandboxTests.java 30 mtime=1552401893.084832729 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/testcases/Par0000644000175000002070000002716113441742745034620 0ustar00jvanekmock00000000000000/* SignedAppletManifestSpecifiesSandboxTests.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.AbstractMap; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class PartiallySignedAppletManifestSpecifiesSandboxTests extends BrowserTest { private static final String STARTING_STRING = "PartiallySignedAppletManifestSpecifiesSandbox Applet Starting"; private static final String CLOSE_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; private static final String UNSIGNED_EXPECTED_STDOUT_PRINT = "UNSIGNED: SECURITY EXCEPTION"; private static final String SIGNED_EXPECTED_STDOUT_PRINT = "IS SIGNED: SECURITY EXCEPTION"; private static final String STACKTRACE_EX_TYPE = "AccessControlException"; private static final String STACKTRACE_NOT_GRANT_PERMISSIONS_TYPE = "Cannot grant permissions to unsigned jars"; private static final String USER_HOME = System.getProperty("user.home"); private static DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier modifier; @BeforeClass public static void setupDeploymentProperties() throws IOException { modifier = new DeploymentPropertiesModifier.MultipleDeploymentPropertiesModifier( new AbstractMap.SimpleEntry<>(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString()), new AbstractMap.SimpleEntry<>(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars() ) ); modifier.setProperties(); } @AfterClass public static void setbackDeploymentProperties() throws IOException { modifier.restoreProperties(); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testPartiallySignedAppletWithSandboxPermissionsInManifestLaunchWithUnsignedHTMLApp() throws Exception { final ProcessResult pr = server.executeBrowser("PartiallySignedAppletManifestSpecifiesSandboxUnsigned.html", new AutoOkClosingListener(), null); assertProperResult(pr); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testPartiallySignedAppletWithSandboxPermissionsInManifestLaunchWithSignedHTMLApp() throws Exception { final ProcessResult pr = server.executeBrowser("PartiallySignedAppletManifestSpecifiesSandboxSigned.html", new AutoOkClosingListener(), null); assertProperResult(pr); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testPartiallySignedJNLPAppletWithSandboxPermissionsInManifestLaunchWithUnsignedApp() throws Exception { final ProcessResult pr = server.executeBrowser("PartiallySignedAppletManifestSpecifiesSandboxUnsignedJNLPhref.html", new AutoOkClosingListener(), null); assertProperResult(pr); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testPartiallySignedJNLPAppletWithSandboxPermissionsInManifestLaunchWithSignedApp() throws Exception { final ProcessResult pr = server.executeBrowser("PartiallySignedAppletManifestSpecifiesSandboxSignedJNLPhref.html", new AutoOkClosingListener(), null); assertProperResult(pr); } @Test @Bug(id="PR1769") public void testPartiallySignedJNLPAppletWithSandboxPermissionsInManifestLaunchSigned() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("PartiallySignedAppletManifestSpecifiesSandboxSigned.jnlp"); assertProperResult(pr); } @Test @Bug(id="PR1769") public void testPartiallySignedJNLPAppletWithSandboxPermissionsInManifestLaunchUnsigned() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("PartiallySignedAppletManifestSpecifiesSandboxUnsigned.jnlp"); assertProperResult(pr); } @Test @Bug(id="PR1769") public void testPartiallySignedJNLPApplicationWithSandboxPermissionsInManifestLaunchSigned() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("PartiallySignedApplicationManifestSpecifiesSandboxSigned.jnlp"); assertProperResult(pr); } @Test @Bug(id="PR1769") public void testPartiallySignedJNLPApplicationWithSandboxPermissionsInManifestLaunchUnsigned() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("PartiallySignedApplicationManifestSpecifiesSandboxUnsigned.jnlp"); assertProperResult(pr); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testPartiallySignedAppletWithAllPermissionsInManifestLaunchWithUnsignedHTMLApp() throws Exception { final ProcessResult pr = server.executeBrowser("PartiallySignedAppletManifestSpecifiesAllPermissionUnsigned.html", new AutoOkClosingListener(), null); assertProperResult(pr); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testPartiallySignedAppletWithAllPermissionsInManifestLaunchWithSignedHTMLApp() throws Exception { final ProcessResult pr = server.executeBrowser("PartiallySignedAppletManifestSpecifiesAllPermissionSigned.html", new AutoOkClosingListener(), null); assertProperResultSignedAllowedAccess(pr); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testPartiallySignedJNLPAppletWithAllPermissionsInManifestLaunchWithUnsignedApp() throws Exception { final ProcessResult pr = server.executeBrowser("PartiallySignedAppletManifestSpecifiesAllPermissionUnsignedJNLPhref.html", new AutoOkClosingListener(), null); assertProperResult(pr); } @Test @NeedsDisplay @TestInBrowsers(testIn={Browsers.one}) @Bug(id="PR1769") public void testPartiallySignedJNLPAppletWithAllPermissionsInManifestLaunchWithSignedApp() throws Exception { final ProcessResult pr = server.executeBrowser("PartiallySignedAppletManifestSpecifiesAllPermissionSignedJNLPhref.html", new AutoOkClosingListener(), null); assertProperResultSignedAllowedAccess(pr); } @Test @Bug(id="PR1769") public void testPartiallySignedJNLPAppletWithAllPermissionsInManifestLaunchSigned() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("PartiallySignedAppletManifestSpecifiesAllPermissionSigned.jnlp"); assertJNLPPartialSignedNotRun(pr); } @Test @Bug(id="PR1769") public void testPartiallySignedJNLPAppletWithAllPermissionsInManifestLaunchUnsigned() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("PartiallySignedAppletManifestSpecifiesAllPermissionUnsigned.jnlp"); assertJNLPPartialSignedNotRun(pr); } @Test @Bug(id="PR1769") public void testPartiallySignedJNLPApplicationWithAllPermissionsInManifestLaunchSigned() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("PartiallySignedApplicationManifestSpecifiesAllPermissionSigned.jnlp"); assertJNLPPartialSignedNotRun(pr); } @Test @Bug(id="PR1769") public void testPartiallySignedJNLPApplicationWithAllPermissionsInManifestLaunchUnsigned() throws Exception { final ProcessResult pr = server.executeJavawsHeadless("PartiallySignedApplicationManifestSpecifiesAllPermissionUnsigned.jnlp"); assertJNLPPartialSignedNotRun(pr); } private static void assertProperResult(ProcessResult pr) { assertCorrectInit(pr); assertStdoutContainsUnsignedSecurityException(pr); assertStdoutContainsSignedSecurityException(pr); assertStderrContainsStacktrace(pr); assertCorrectClose(pr); } private static void assertProperResultSignedAllowedAccess(ProcessResult pr) { assertCorrectInit(pr); assertStdoutContainsUnsignedSecurityException(pr); assertStdoutContainsUserHome(pr); assertStderrContainsStacktrace(pr); assertCorrectClose(pr); } private static void assertJNLPPartialSignedNotRun(ProcessResult pr) { assertTrue("Applet should have not allowed the Partially Signed JNLP to launch", pr.stderr.contains(STACKTRACE_NOT_GRANT_PERMISSIONS_TYPE)); } private static void assertCorrectInit(ProcessResult pr) { assertTrue("Applet should have initialized", pr.stdout.contains(STARTING_STRING)); } private static void assertCorrectClose(ProcessResult pr) { assertTrue("Applet should have printed its exit string", pr.stdout.contains(CLOSE_STRING)); } private static void assertStderrContainsStacktrace(ProcessResult pr) { assertTrue("Applet should have produced an AccessControlException stacktrace", pr.stderr.contains(STACKTRACE_EX_TYPE)); } private static void assertStdoutContainsUnsignedSecurityException(ProcessResult pr) { assertTrue("Applet should have printed UNSIGNED: SECURITY EXCEPTION", pr.stdout.contains(UNSIGNED_EXPECTED_STDOUT_PRINT)); } private static void assertStdoutContainsSignedSecurityException(ProcessResult pr) { assertTrue("Applet should have printed SIGNED: SECURITY EXCEPTION", pr.stdout.contains(SIGNED_EXPECTED_STDOUT_PRINT)); } private static void assertStdoutContainsUserHome(ProcessResult pr) { assertTrue("Applet should have printed "+USER_HOME, pr.stdout.contains(USER_HOME)); } } icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/PackGZip0000644000000000000000000000013213441742745021627 xustar0030 mtime=1552401893.081832735 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/0000755000175000002070000000000013441742745022514 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/PackGZip/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745023625 xustar0030 mtime=1552401893.078832742 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/testcases/0000755000175000002070000000000013441742745024512 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/PackGZip/testcases/PaxHeaders.7406/PackGZipTest.java0000644000000000000000000000013213441742745027055 xustar0030 mtime=1552401893.078832742 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/testcases/PackGZipTest.java0000644000175000002070000000727013441742745027673 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; public class PackGZipTest extends BrowserTest { private static final String initStr = "init"; private class CountingClosingListenerImpl extends CountingClosingListener { @Override protected boolean isAlowedToFinish(String s) { return s.contains(initStr); } } @Before public void setup() { CacheUtil.clearCache(); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void testBrowserJNLP() throws Exception { String url = "/PackGZipJNLP.html"; ProcessResult pr = server.executeBrowser(url, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); Assert.assertTrue("stdout should contain " + initStr + ", but it didnt.", pr.stdout.contains(initStr)); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void testBrowserApplet() throws Exception { String url = "/PackGZipApplet.html"; ProcessResult pr = server.executeBrowser(url, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); Assert.assertTrue("stdout should contain " + initStr + ", but it didnt.", pr.stdout.contains(initStr)); } @Test @TestInBrowsers(testIn = { Browsers.all }) @NeedsDisplay public void testJavawsJNLP() throws Exception { String url = "/PackGZip.jnlp"; ProcessResult pr = server.executeJavawsHeadless(url, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); Assert.assertTrue("stdout should contain " + initStr + ", but it didnt.", pr.stdout.contains(initStr)); } } icedtea-web-1.8/tests/reproducers/custom/PackGZip/PaxHeaders.7406/resources0000644000000000000000000000013213441742745023641 xustar0030 mtime=1552401893.093832711 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/resources/0000755000175000002070000000000013441742745024526 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/PackGZip/resources/PaxHeaders.7406/PackGZip.jnlp0000644000000000000000000000013213441742745026253 xustar0030 mtime=1552401893.093832711 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/resources/PackGZip.jnlp0000644000175000002070000000407413441742745027070 0ustar00jvanekmock00000000000000 simple application IcedTea icedtea-web-1.8/tests/reproducers/custom/PackGZip/resources/PaxHeaders.7406/PackGZipApplet.html0000644000000000000000000000013213441742745027422 xustar0030 mtime=1552401893.081832735 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/resources/PackGZipApplet.html0000644000175000002070000000051013441742745030226 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PackGZip/resources/PaxHeaders.7406/PackGZipJNLP.html0000644000000000000000000000013213441742745026740 xustar0030 mtime=1552401893.083832731 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/resources/PackGZipJNLP.html0000644000175000002070000000040713441742745027551 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PackGZip/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745022601 xustar0030 mtime=1552401893.083832731 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/srcs/0000755000175000002070000000000013441742745023466 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/PackGZip/srcs/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745024316 xustar0030 mtime=1552401893.083832731 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/srcs/Makefile0000644000175000002070000000153513441742745025132 0ustar00jvanekmock00000000000000TESTNAME=PackGZip JAVAC_CLASSPATH=$(TEST_EXTENSIONS_DIR):$(NETX_DIR)/lib/classes.jar JAVAC=$(EXPORTED_JAVAC) JAR=$(EXPORTED_JAR) JARSIGNER=$(EXPORTED_JARSIGNER) PACKER=$(EXPORTED_PACK200) ifeq ($(OS), Windows_NT) TMPDIR:=$(shell cygpath -p -m $(shell mktemp -d)) else TMPDIR:=$(shell mktemp -d) endif prepare-reproducer: echo PREPARING REPRODUCER $(TESTNAME) $(JAVAC) -d $(TMPDIR) -classpath $(JAVAC_CLASSPATH) $(TESTNAME).java; \ cp ../resources/* $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ cd $(TMPDIR); \ $(JAR) cf $(TESTNAME).jar $(TESTNAME).class; \ cd $(TMPDIR); \ $(PACKER) $(TESTNAME).jar.pack.gz $(TESTNAME).jar; \ cp $(TMPDIR)/$(TESTNAME).jar.pack.gz $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ echo PREPARED REPRODUCER $(TESTNAME), removing $(TMPDIR); \ rm -rf $(TMPDIR); \ clean-reproducer: echo NOTHING TO CLEAN FOR $(TESTNAME) icedtea-web-1.8/tests/reproducers/custom/PackGZip/srcs/PaxHeaders.7406/PackGZip.java0000644000000000000000000000013213441742745025171 xustar0030 mtime=1552401893.081832735 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/PackGZip/srcs/PackGZip.java0000644000175000002070000000347213441742745026007 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.lang.System; public class PackGZip extends Applet { private static final String initStr = "init"; @Override public void init() { System.out.println(initStr); } } icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/NoClassDeff0000644000000000000000000000013213441742745022306 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/0000755000175000002070000000000013441742745023173 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745024304 xustar0030 mtime=1552401893.121832652 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/testcases/0000755000175000002070000000000013441742745025171 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/testcases/PaxHeaders.7406/NoClassDeffTest.java0000644000000000000000000000013213441742745030213 xustar0030 mtime=1552401893.121832652 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/testcases/NoClassDeffTest.java0000644000175000002070000010604713441742745031033 0ustar00jvanekmock00000000000000/* NoClassDeffTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; import net.sourceforge.jnlp.util.FileUtils; import org.junit.Assert; import org.junit.Test; @Bug(id = "PR2219") /** * * When NoClassDefFound is thrown from ITW. Current behaviour: javaws app * correctly dies browsers and -html correctly dies * * javaws applet SURVIVES init and start throwing this. But correctly dies in * paint * * */ public class NoClassDeffTest extends BrowserTest { private class NoClassDefFoundErrorClosingListener extends StringBasedClosingListener { public NoClassDefFoundErrorClosingListener() { super(NoClassDefFoundError.class.getSimpleName()); } } private static final String appletCloseString = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; private static final String[] HTMLA = new String[]{OptionsDefinitions.OPTIONS.HTML.option}; private static final List HTMLL = Arrays.asList(HTMLA); private static final String JNLPAPP = "NoClassDeffApp.jnlp"; private static final String JNLPAPPLET = "NoClassDeffApplet.jnlp"; private static final String HTML = "NoClassDeff.html"; private static final String HTMLHREF = "NoClassDeffJnlpHref.html"; //jnlp app OK run @Test @NeedsDisplay public void noClassDeffTestWorksJnlp1() throws Exception { prepare("okRun", false); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), null); Assert.assertFalse(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("main1")); Assert.assertTrue(pr.stdout.contains("main2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); Assert.assertFalse(pr.stdout.contains("EX: ")); } //jnlp bad run 1 @Test @NeedsDisplay public void noClassDeffTestThrowJnlp1() throws Exception { prepare("main", false); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("main1")); Assert.assertFalse(pr.stdout.contains("main2")); Assert.assertFalse(pr.stdout.contains(appletCloseString)); Assert.assertFalse(pr.stdout.contains("EX: ")); } //jnlp bad run 2 @Test @NeedsDisplay public void noClassDeffTestThrowCatchJnlp1() throws Exception { prepare("main", true); ProcessResult pr = server.executeJavaws(JNLPAPP, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("main1")); Assert.assertTrue(pr.stdout.contains("main2")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } //applets OK run //opera should go correctly up to destroy WITHOUT paint //epiphany only start and init //midori up to paint //firefox, no data //-html and jnlp applet get init, start, paint @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestWorksHtml1() throws Exception { prepare("okRun", false); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), null); Assert.assertFalse(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestWorksHtml2() throws Exception { prepare("okRun", false); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), null); Assert.assertFalse(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay public void noClassDeffTestWorksJnlp2() throws Exception { prepare("okRun", false); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), null); Assert.assertFalse(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); Assert.assertTrue(pr.stdout.contains("paint1")); Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestWorksJavawsHtml1() throws Exception { prepare("okRun", false); ProcessResult pr = server.executeJavaws(HTMLL, HTML, new AutoOkClosingListener(), null); Assert.assertFalse(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestWorksJavawsHtml2() throws Exception { prepare("okRun", false); ProcessResult pr = server.executeJavaws(HTMLL, HTMLHREF, new AutoOkClosingListener(), null); Assert.assertFalse(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } //jnlp applets crashes //they behave a bit differently form browser ones @Test @NeedsDisplay public void noClassDeffTestThrowsInitJnlp2() throws Exception { prepare("init", false); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertFalse(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertFalse(pr.stdout.contains("init2")); Assert.assertFalse(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); Assert.assertTrue(pr.stdout.contains("paint1")); Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay public void noClassDeffTestThrowsStartJnlp2() throws Exception { prepare("start", false); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertFalse(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); Assert.assertTrue(pr.stdout.contains("paint1")); Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay public void noClassDeffTestThrowsPaintJnlp2() throws Exception { prepare("paint", false); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); Assert.assertTrue(pr.stdout.contains("paint1")); Assert.assertFalse(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertFalse(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay public void noClassDeffTestThrowsCatchInitJnlp2() throws Exception { prepare("init", true); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); Assert.assertTrue(pr.stdout.contains("paint1")); Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay public void noClassDeffTestThrowsCatchStartJnlp2() throws Exception { prepare("start", true); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); Assert.assertTrue(pr.stdout.contains("paint1")); Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay public void noClassDeffTestThrowsCatchPaintJnlp2() throws Exception { prepare("paint", true); ProcessResult pr = server.executeJavaws(JNLPAPPLET, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); Assert.assertTrue(pr.stdout.contains("paint1")); Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } //-html and browser crashes // //applets crash init 1 @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsInitHtml1() throws Exception { prepare("init", false); ProcessResult pr = server.executeBrowser(HTML, null, new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertFalse(pr.stdout.contains("init2")); Assert.assertFalse(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsInitHtml2() throws Exception { prepare("init", false); ProcessResult pr = server.executeBrowser(HTMLHREF, null, new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertFalse(pr.stdout.contains("init2")); Assert.assertFalse(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsInitJavawsHtml1() throws Exception { prepare("init", false); ProcessResult pr = server.executeJavaws(HTMLL, HTML, null, new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertFalse(pr.stdout.contains("init2")); Assert.assertFalse(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsInitJavawsHtml2() throws Exception { prepare("init", false); ProcessResult pr = server.executeJavaws(HTMLL, HTMLHREF, null, new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertFalse(pr.stdout.contains("init2")); Assert.assertFalse(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertFalse(pr.stdout.contains(appletCloseString)); } //applets crash start 1 @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsStartHtml1() throws Exception { prepare("start", false); ProcessResult pr = server.executeBrowser(HTML, null, new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsStartHtml2() throws Exception { prepare("start", false); ProcessResult pr = server.executeBrowser(HTMLHREF, null, new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsStartJavawsHtml1() throws Exception { prepare("start", false); ProcessResult pr = server.executeJavaws(HTMLL, HTML, null, new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsStartJavawsHtml2() throws Exception { prepare("start", false); ProcessResult pr = server.executeJavaws(HTMLL, HTMLHREF, null, new NoClassDefFoundErrorClosingListener()); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertFalse(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertFalse(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertFalse(pr.stdout.contains(appletCloseString)); } private void prepare(String when, boolean catchError) throws IOException { File dir = ServerAccess.getInstance().getDir(); String[] files = new String[]{"NoClassDeffApp.jnlp", "NoClassDeff.html", "NoClassDeffApplet.jnlp", "NoClassDeffJnlpHref.html"}; for (String file : files) { String s = FileUtils.loadFileAsString(new File(dir, file + ".in")); s = s.replaceAll("DIE_ON_STAGE", when); s = s.replaceAll("CATCH_ERROR", String.valueOf(catchError)); FileUtils.saveFile(s, new File(dir, file)); } } //applets crash init 2 @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsCatchInitHtml1() throws Exception { prepare("init", true); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsCatchInitHtml2() throws Exception { prepare("init", true); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsCatchInitJavawsHtml1() throws Exception { prepare("init", true); ProcessResult pr = server.executeJavaws(HTMLL, HTML, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsCatchInitJavawsHtml2() throws Exception { prepare("init", true); ProcessResult pr = server.executeJavaws(HTMLL, HTMLHREF, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } //applets crash start 2 @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsCatchStartHtml1() throws Exception { prepare("start", true); ProcessResult pr = server.executeBrowser(HTML, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsCatchStartHtml2() throws Exception { prepare("start", true); ProcessResult pr = server.executeBrowser(HTMLHREF, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); // Assert.assertTrue(pr.stdout.contains(appletCloseString)); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsCatchStartJavawsHtml1() throws Exception { prepare("start", true); ProcessResult pr = server.executeJavaws(HTMLL, HTML, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); } @Test @NeedsDisplay @TestInBrowsers(testIn = {Browsers.one}) public void noClassDeffTestThrowsCatchStartJavawsHtml2() throws Exception { prepare("start", true); ProcessResult pr = server.executeJavaws(HTMLL, HTMLHREF, new AutoOkClosingListener(), null); Assert.assertTrue(pr.stdout.contains("Loading LostClass")); Assert.assertTrue(pr.stdout.contains("EX: ")); Assert.assertTrue(pr.stderr.contains(NoClassDefFoundError.class.getSimpleName())); Assert.assertTrue(pr.stdout.contains("init1")); Assert.assertTrue(pr.stdout.contains("init2")); Assert.assertTrue(pr.stdout.contains("start1")); Assert.assertTrue(pr.stdout.contains("start2")); // Assert.assertTrue(pr.stdout.contains("paint1")); // Assert.assertTrue(pr.stdout.contains("paint2")); // Assert.assertTrue(pr.stdout.contains("stop1")); // Assert.assertTrue(pr.stdout.contains("stop2")); // Assert.assertTrue(pr.stdout.contains("destroy1")); // Assert.assertTrue(pr.stdout.contains("destroy2")); Assert.assertTrue(pr.stdout.contains(appletCloseString)); } } icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745023260 xustar0030 mtime=1552401893.086832725 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/srcs/0000755000175000002070000000000013441742745024145 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/srcs/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745024775 xustar0030 mtime=1552401893.078832742 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/srcs/Makefile0000644000175000002070000000171013441742745025604 0ustar00jvanekmock00000000000000TESTNAME=NoClassDeff SRC_FILES=NoClassDeff ENTRYPOINT_CLASSES=NoClassDeff JAVAC_CLASSPATH=$(TEST_EXTENSIONS_DIR):$(NETX_DIR)/lib/classes.jar JAVAC=$(EXPORTED_JAVAC) JAR=$(EXPORTED_JAR) ifeq ($(OS), Windows_NT) TMPDIR:=$(shell cygpath -p -m $(shell mktemp -d)) else TMPDIR:=$(shell mktemp -d) endif prepare-reproducer: echo PREPARING REPRODUCER $(TESTNAME); pwd; ls ; $(JAVAC) -d $(TMPDIR) -classpath $(JAVAC_CLASSPATH) *.java; #now the hack, remove inner class so we can later die on CNFE or NCDFE ls $(TMPDIR)/ rm $(TMPDIR)/*\$$* ; ls $(TMPDIR)/ cp ../resources/* $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ for CLASS in $(ENTRYPOINT_CLASSES); \ do \ cd $(TMPDIR); \ $(JAR) cfe "$$CLASS.jar" "$$CLASS" "$$CLASS.class"; \ cd -;\ mv $(TMPDIR)/"$$CLASS.jar" $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ done; \ echo PREPARED REPRODUCER $(TESTNAME), removing $(TMPDIR) ; \ rm -rf $(TMPDIR) clean-reproducer: echo NOTHING TO CLEAN FOR $(TESTNAME) icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/srcs/PaxHeaders.7406/NoClassDeff.java0000644000000000000000000000013213441742745026327 xustar0030 mtime=1552401893.086832725 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/srcs/NoClassDeff.java0000644000175000002070000001140413441742745027137 0ustar00jvanekmock00000000000000/* ExtensionJnlpTestApplet.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.*; import java.awt.Graphics; public class NoClassDeff extends Applet { private static final String appletCloseString = "*** APPLET FINISHED ***"; private static String stage = null; private static boolean catchError = false; private static void checkStage() { if (stage == null) { throw new NullPointerException("satge cant be null"); } System.out.println(stage); System.out.println("catchError: " + catchError); } private static void lostClass() { System.out.println("Loading LostClass"); System.out.flush(); if (catchError) { try { LostClass l = new LostClass(); } catch (Throwable ex) {// vs exception System.out.println("EX: " + ex.toString()); System.out.flush(); ex.printStackTrace(); } } else { try { LostClass l = new LostClass(); } catch (Exception ex) {// vs throwable System.out.println("EX: " + ex.toString()); System.out.flush(); ex.printStackTrace(); } } } private static class LostClass { } public static void main(String[] args) { stage = args[0]; catchError = Boolean.valueOf(args[1]); checkStage(); System.out.println("main1"); if (stage.equalsIgnoreCase("main")) { lostClass(); } System.out.println("main2"); System.out.println(appletCloseString); System.out.flush(); System.out.println("some garbage"); } @Override public void init() { stage = getParameter("die"); catchError = Boolean.valueOf(getParameter("catchError")); System.out.println("init1"); if (stage.equalsIgnoreCase("init")) { lostClass(); } System.out.println("init2"); } @Override public void start() { checkStage(); System.out.println("start1"); if (stage.equalsIgnoreCase("start")) { lostClass(); } System.out.println("start2"); } @Override public void stop() { checkStage(); System.out.println("stop1"); if (stage.equalsIgnoreCase("stop")) { lostClass(); } System.out.println("stop2"); System.out.flush(); System.out.println("some garbage"); } @Override public void destroy() { checkStage(); System.out.println("destroy1"); if (stage.equalsIgnoreCase("destroy")) { lostClass(); } System.out.println("destroy2"); System.out.flush(); System.out.println("some garbage"); } @Override public void paint(Graphics g) { super.paint(g); checkStage(); System.out.println("paint1"); if (stage.equalsIgnoreCase("paint")) { lostClass(); } System.out.println("paint2"); System.out.println(appletCloseString); System.out.flush(); System.out.println("some garbage"); } } icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/PaxHeaders.7406/resources0000644000000000000000000000013213441742745024320 xustar0030 mtime=1552401893.083832731 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/resources/0000755000175000002070000000000013441742745025205 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/resources/PaxHeaders.7406/NoClassDeff.html.in0000644000000000000000000000013213441742745030017 xustar0030 mtime=1552401893.080832738 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/resources/NoClassDeff.html.in0000644000175000002070000000355313441742745030635 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/resources/PaxHeaders.7406/NoClassDeffApplet.jnl0000644000000000000000000000013213441742745030377 xustar0030 mtime=1552401893.082832733 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/resources/NoClassDeffApplet.jnlp.in0000644000175000002070000000436113441742745032000 0ustar00jvanekmock00000000000000 NoClassDeff IcedTea PR2219 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/resources/PaxHeaders.7406/NoClassDeffApp.jnlp.i0000644000000000000000000000013213441742745030301 xustar0030 mtime=1552401893.083832731 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/resources/NoClassDeffApp.jnlp.in0000644000175000002070000000430113441742745031265 0ustar00jvanekmock00000000000000 NoClassDeff IcedTea PR2219 DIE_ON_STAGE CATCH_ERROR icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/resources/PaxHeaders.7406/NoClassDeffJnlpHref.h0000644000000000000000000000013213441742745030326 xustar0030 mtime=1552401893.080832738 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/NoClassDeff/resources/NoClassDeffJnlpHref.html.in0000644000175000002070000000357013441742745032265 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/MultipleSignaturesPerJar0000644000000000000000000000013213441742745025123 xustar0030 mtime=1552401893.093832711 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/0000755000175000002070000000000013441742745026010 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745027121 xustar0030 mtime=1552401893.093832711 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/testcases/0000755000175000002070000000000013441742745030006 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/testcases/PaxHeaders.7406/Multiple0000644000000000000000000000032213441742745030715 xustar00120 path=icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/testcases/MultipleSignaturesPerJarTests.java 30 mtime=1552401893.093832711 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/testcases/MultipleSignaturesPerJar0000644000175000002070000001344513441742745034704 0ustar00jvanekmock00000000000000/* MultipleSignaturesTestTests.java Copyright (C) 20121 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import java.util.Arrays; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.Test; @Bug(id = { "PR822" }) public class MultipleSignaturesPerJarTests extends BrowserTest { private final List TRUST_ALL = Collections.unmodifiableList(Arrays.asList(new String[] { "-Xtrustall" })); public static final String CORRECT_FINISH = "Test has finished."; public static final String CNFEXCEPTION = "ClassNotFoundException"; public static final String DIFF_CERTS_EXCEPTION = "Fatal: Application Error: The JNLP application is not fully signed by a single cert."; public static final String ACEXCEPTION = "java.security.AccessControlException: access denied"; @Test @NeedsDisplay public void multipleSignaturesPerJarMatchingJNLP() throws Exception { ProcessResult pr = server.executeJavawsHeadless(TRUST_ALL, "/MultipleSignaturesPerJarMatching.jnlp"); // Assert relevant exceptions did not occur assertFalse("stderr should NOT contain `" + CNFEXCEPTION + "`, but did", pr.stderr.contains(CNFEXCEPTION)); assertFalse("stderr should NOT contain `" + ACEXCEPTION + "`, but did", pr.stderr.contains(ACEXCEPTION)); assertFalse("stderr should NOT contain `" + DIFF_CERTS_EXCEPTION + "`, but did", pr.stderr.contains(DIFF_CERTS_EXCEPTION)); // Assert that we correctly finish assertTrue("stdout should contain `" + CORRECT_FINISH + "`, but did not", pr.stdout.contains(CORRECT_FINISH)); } @Test @NeedsDisplay public void multipleSignaturesPerJarMismatchingJNLP() throws Exception { ProcessResult pr = server.executeJavawsHeadless(TRUST_ALL, "/MultipleSignaturesPerJarMismatching.jnlp"); // Assert only for the expected exception assertTrue("stderr should contain `" + DIFF_CERTS_EXCEPTION + "`, but did not", pr.stderr.contains(DIFF_CERTS_EXCEPTION)); // Assert that we did not correctly finish assertFalse("stdout should NOT contain " + CORRECT_FINISH + " but did", pr.stdout.contains(CORRECT_FINISH)); } private static void testForCorrectAppletExecution(ProcessResult pr) { // Assert relevant exceptions did not occur assertFalse("stderr should NOT contain `" + CNFEXCEPTION + "`, but did", pr.stderr.contains(CNFEXCEPTION)); assertFalse("stderr should NOT contain `" + ACEXCEPTION + "`, but did", pr.stderr.contains(ACEXCEPTION)); assertFalse("stderr should NOT contain `" + DIFF_CERTS_EXCEPTION + "`, but did", pr.stderr.contains(DIFF_CERTS_EXCEPTION)); // Assert that we correctly finish // It is difficult to check for user.home's value here, so we only check for the ending message: assertTrue("stdout should contain `" + CORRECT_FINISH + "`, but did not", pr.stdout.contains(CORRECT_FINISH)); } @Test @NeedsDisplay @TestInBrowsers(testIn = Browsers.one) @Bug(id = { "PR822" }) public void multipleSignaturesPerJarMismatchingApplet() throws Exception { ProcessResult pr = server.executeBrowser("/MultipleSignaturesPerJarMismatching.html", AutoClose.CLOSE_ON_CORRECT_END); // NB: Both this and the matching applet should pass // Unlike JNLPs, applets pass as long as all their parts are signed by *something* testForCorrectAppletExecution(pr); } @Test @NeedsDisplay @TestInBrowsers(testIn = Browsers.one) public void multipleSignaturesPerJarMatchingApplet() throws Exception { ProcessResult pr = server.executeBrowser("/MultipleSignaturesPerJarMatching.html", AutoClose.CLOSE_ON_CORRECT_END); testForCorrectAppletExecution(pr); } }icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027135 xustar0030 mtime=1552401893.082832733 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/0000755000175000002070000000000013441742745030022 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/PaxHeaders.7406/Multiple0000644000000000000000000000033013441742745030730 xustar00126 path=icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJarMismatching.jnlp 30 mtime=1552401893.077832744 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJar0000644000175000002070000000450613441742745034716 0ustar00jvanekmock00000000000000 MultipleSignaturesPerJarMismatching IcedTea MultipleSignaturesPerJarMismatching icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/PaxHeaders.7406/Multiple0000644000000000000000000000032513441742745030734 xustar00123 path=icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJarMatching.jnlp 30 mtime=1552401893.081832735 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJar0000644000175000002070000000447613441742745034724 0ustar00jvanekmock00000000000000 MultipleSignaturesPerJarMatching IcedTea MultipleSignaturesPerJarMatching icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/PaxHeaders.7406/Multiple0000644000000000000000000000032513441742745030734 xustar00123 path=icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJarMatching.html 30 mtime=1552401893.082832733 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJar0000644000175000002070000000357113441742745034717 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/PaxHeaders.7406/Multiple0000644000000000000000000000033013441742745030730 xustar00126 path=icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJarMismatching.html 30 mtime=1552401893.080832738 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJar0000644000175000002070000000356713441742745034724 0ustar00jvanekmock00000000000000

icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026075 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/srcs/0000755000175000002070000000000013441742745026762 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/srcs/PaxHeaders.7406/somecrazytest0000644000000000000000000000013213441742745031011 xustar0030 mtime=1552401893.120832654 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/srcs/somecrazytestpackage/0000755000175000002070000000000013441742745033212 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/srcs/somecrazytestpackage/PaxHeade0000644000000000000000000000034113441742745031363 xustar00135 path=icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/srcs/somecrazytestpackage/MultipleSignaturesPerJarMain.java 30 mtime=1552401893.120832654 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/srcs/somecrazytestpackage/Multiple0000644000175000002070000000607313441742745034736 0ustar00jvanekmock00000000000000 /* MultipleSignaturesPerJarMain.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package somecrazytestpackage; import java.applet.Applet; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MultipleSignaturesPerJarMain extends Applet { public static void main(String[] args) { executeForeignMethodCaught(); } public static void executeForeignMethodCaught() { try { executeForeignMethod(); } catch (Exception ex) { throw new RuntimeException(ex); } } public static void executeForeignMethod() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException { Class clazz = Class.forName("ReadPropertiesSigned"); Method mainMethod = clazz.getDeclaredMethod("main", String[].class); mainMethod.invoke(clazz.newInstance(), (Object)new String[] {"user.home"}); System.out.println("Test has finished."); } private class Killer extends Thread { public int n = 2000; @Override public void run() { try { Thread.sleep(n); System.exit(0); } catch (Exception ex) { } } } private Killer killer; @Override public void init() { killer = new Killer(); } @Override public void start() { main(null); System.out.println("*** APPLET FINISHED ***"); } } icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/srcs/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745027612 xustar0030 mtime=1552401893.085832727 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MultipleSignaturesPerJar/srcs/Makefile0000644000175000002070000000453213441742745030426 0ustar00jvanekmock00000000000000TESTNAME=MultipleSignaturesPerJar JAVAC_CLASSPATH=$(TEST_EXTENSIONS_DIR):$(NETX_DIR)/lib/classes.jar KEYTOOL=$(EXPORTED_KEYTOOL) JARSIGNER=$(EXPORTED_JARSIGNER) JARSIGNER_CMD=$(JARSIGNER) -keystore $(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME) -storepass $(PRIVATE_KEYSTORE_PASS) -keypass $(PRIVATE_KEYSTORE_PASS) JAVAC=$(EXPORTED_JAVAC) JAR=$(EXPORTED_JAR) # Index jar causes main class jar to load ifeq ($(OS), Windows_NT) TMPDIR:=$(shell cygpath -p -m $(shell mktemp -d)) else TMPDIR:=$(shell mktemp -d) endif prepare-reproducer: echo PREPARING REPRODUCER $(TESTNAME) in $(TMPDIR) $(JAVAC) -d $(TMPDIR) -classpath $(JAVAC_CLASSPATH) somecrazytestpackage/MultipleSignaturesPerJarMain.java # Extract ReadPropertiesSigned.class for our usage cd $(TMPDIR) ; \ $(JAR) xf $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/ReadPropertiesSigned.jar ReadPropertiesSigned.class ; # Create jars *testname*_A_and_B.jar, *testname*_A_only.jar, *testname*_B_only.jar # These are signed by signatures A and B, A only, B only, respectively. # *testname*_A_and_B.jar as well as *testname*_B_only.jar contain ReadPropertiesSigned.class, which exercises the signing. # *testname*_A_only.jar contains MultipleSignaturesTest.class, the (reused) main class for this reproducer. cd $(TMPDIR) ; \ $(JAR) cvf $(TESTNAME)_B_only.jar ReadPropertiesSigned.class ; \ cp $(TESTNAME)_B_only.jar $(TESTNAME)_A_and_B.jar ; \ $(JAR) cvf $(TESTNAME)_A_only.jar somecrazytestpackage ; # Sign with signature 'A', the signature used in the 'signed' reproducer group cd $(TMPDIR) ; \ for jar_to_sign in $(TESTNAME)_A_only.jar $(TESTNAME)_A_and_B.jar; do \ $(JARSIGNER_CMD) -sigfile Alpha "$$jar_to_sign" $(TEST_CERT_ALIAS)_signed ; \ done # Sign with signature 'B', the signature used in the 'signed2' reproducer group cd $(TMPDIR) ; \ for jar_to_sign in $(TESTNAME)_B_only.jar $(TESTNAME)_A_and_B.jar; do \ $(JARSIGNER_CMD) -sigfile Beta "$$jar_to_sign" $(TEST_CERT_ALIAS)_signed2 ; \ done # Move jars into deployment directory cd $(TMPDIR); \ mv $(TESTNAME)_B_only.jar $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) ; \ mv $(TESTNAME)_A_only.jar $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) ; \ mv $(TESTNAME)_A_and_B.jar $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) ; echo PREPARED REPRODUCER $(TESTNAME), removing $(TMPDIR) rm -rf $(TMPDIR) clean-reproducer: echo NOTHING TO CLEAN FOR $(TESTNAME)icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/MixedSigningApplet0000644000000000000000000000013213441742745023712 xustar0030 mtime=1552401893.085832727 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/0000755000175000002070000000000013441742745024577 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/PaxHeaders.7406/resources0000644000000000000000000000013213441742745025724 xustar0030 mtime=1552401893.079832739 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/resources/0000755000175000002070000000000013441742745026611 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/resources/PaxHeaders.7406/MixedSigningAp0000644000000000000000000000013213441742745030572 xustar0030 mtime=1552401893.076832746 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/resources/MixedSigningApplet.jnlp0000644000175000002070000000451013441742745033231 0ustar00jvanekmock00000000000000 MixedSigningApplet IcedTea Test per-JAR security assignment and permissions PARAM_ARG_TARGET SECURITY_TAG_TARGET icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/resources/PaxHeaders.7406/MixedSigningAp0000644000000000000000000000013213441742745030572 xustar0030 mtime=1552401893.079832739 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/resources/MixedSigningApplet.html0000644000175000002070000000411613441742745033234 0ustar00jvanekmock00000000000000 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745025710 xustar0030 mtime=1552401893.080832738 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/testcases/0000755000175000002070000000000013441742745026575 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/testcases/PaxHeaders.7406/MixedSigningAp0000644000000000000000000000031413441742745030560 xustar00114 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/testcases/MixedSigningAppletSignedTests.java 30 mtime=1552401893.080832738 30 atime=1552402157.260253429 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/testcases/MixedSigningAppletSignedTests.0000644000175000002070000007411713441742745034520 0ustar00jvanekmock00000000000000/* MixedSigningAppletSignedTests.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileInputStream; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Test; /* * All JNLP tests expect to be unable to perform restricted actions, * such as reading from System.getProperty. This is because partially signed * applet support (PR1592) is enabled *only* for browser plugin applets, and * not for JNLP applets or applications. The expected result in all JNLP * tests is therefore an AccessControlException. Most plugin applets expect * AccessControlExceptions as well, since they test to ensure that the signed * JAR(s) of an applet cannot leak information to unsigned parts of the applet * nor allow them to perform restricted actions. These tests also similarly * expect AccessControlExceptions. The only tests that expect to be able to * read successfully from System.getProperty are the plugin applet tests * where the signed JAR reads the data and then does not in any way transfer * it to the unsigned code, except when the signed JAR method specifically uses * AccessController.doPrivileged. These are "testSignedReadProperties", * "testSignedReadPropertiesDoPrivileged", and * "testUnsignedAttacksSignedDoPrivileged2". */ public class MixedSigningAppletSignedTests extends BrowserTest { private static final String CLOSE_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; private static final String USER_HOME = System.getProperty("user.home"); private static final String HREF_TARGET = "JNLP_HREF", APP_TYPE_TARGET = "APP_TYPE_TARGET", ARG_TARGET = "PARAM_ARG_TARGET", SECURITY_TARGET = "SECURITY_TAG_TARGET"; private static final String JNLP_SECURITY_TAG = ""; private static ProcessResult runJnlpApplet(String arg, boolean security) throws Exception { String argString = ""; String href = "MixedSigningApplet-Applet-" + arg + ".jnlp"; return prepareJnlpFromTemplate(href, "applet-desc", argString, security); } private static ProcessResult runJnlpApplication(String arg, boolean security) throws Exception { String argString = "\"" + arg + "\""; String href = "MixedSigningApplet-Application-" + arg + ".jnlp"; return prepareJnlpFromTemplate(href, "application-desc", argString, security); } private static ProcessResult prepareJnlpFromTemplate(String href, String type, String arg, boolean security) throws Exception { File src = new File(server.getDir(), "MixedSigningApplet.jnlp"); File dest = new File(server.getDir(), href); String srcJnlp = ServerAccess.getContentOfStream(new FileInputStream(src)); String resultJnlp = srcJnlp.replaceAll(HREF_TARGET, href) .replaceAll(APP_TYPE_TARGET, type) .replaceAll(ARG_TARGET, arg) .replaceAll(SECURITY_TARGET, security ? JNLP_SECURITY_TAG : ""); ServerAccess.saveFile(resultJnlp, dest); return server.executeJavawsHeadless(href); } /* * All browser tests disabled due to requiring user intervention to run * (partially signed dialog will appear) */ @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testNonPrivilegedAction() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testNonPrivilegedAction", AutoClose.CLOSE_ON_CORRECT_END); assertProperStart(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testNonPrivilegedActionDoPrivileged() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testNonPrivilegedActionDoPrivileged", AutoClose.CLOSE_ON_CORRECT_END); assertProperStart(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testNonPrivilegedActionDoPrivileged2() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testNonPrivilegedActionDoPrivileged2", AutoClose.CLOSE_ON_CORRECT_END); assertProperStart(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedReadProperties() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testUnsignedReadProperties", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedReadPropertiesDoPrivileged() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testUnsignedReadPropertiesDoPrivileged", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedReadPropertiesDoPrivileged2() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testUnsignedReadPropertiesDoPrivileged2", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testSignedReadProperties() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testSignedReadProperties", AutoClose.CLOSE_ON_CORRECT_END); assertContainsUserHome(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testSignedReadPropertiesDoPrivileged() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testSignedReadPropertiesDoPrivileged", AutoClose.CLOSE_ON_CORRECT_END); assertContainsUserHome(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testSignedExportPropertiesToUnsigned() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testSignedExportPropertiesToUnsigned", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testSignedExportPropertiesToUnsignedDoPrivileged() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testSignedExportPropertiesToUnsignedDoPrivileged", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testSignedExportPropertiesToUnsignedDoPrivileged2() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testSignedExportPropertiesToUnsignedDoPrivileged2", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedAttacksSigned() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testUnsignedAttacksSigned", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedAttacksSignedDoPrivileged() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testUnsignedAttacksSignedDoPrivileged", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedAttacksSignedDoPrivileged2() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testUnsignedAttacksSignedDoPrivileged2", AutoClose.CLOSE_ON_CORRECT_END); assertContainsUserHome(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedReflectionAttack() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testUnsignedReflectionAttack", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedReflectionAttackDoPrivileged() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testUnsignedReflectionAttackDoPrivileged", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @NeedsDisplay //@Test @TestInBrowsers(testIn={Browsers.one}) public void testUnsignedReflectionAttackDoPrivileged2() throws Exception { ProcessResult pr = server.executeBrowser("MixedSigningApplet.html?testUnsignedReflectionAttackDoPrivileged2", AutoClose.CLOSE_ON_CORRECT_END); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testNonPrivilegedAction", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testNonPrivilegedAction", false); assertProperStart(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionDoPrivilegedJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testNonPrivilegedActionDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionDoPrivilegedJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testNonPrivilegedActionDoPrivileged", false); assertProperStart(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionDoPrivileged2JNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testNonPrivilegedActionDoPrivileged2", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionDoPrivileged2JNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testNonPrivilegedActionDoPrivileged2", false); assertProperStart(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReadPropertiesJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReadProperties", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReadPropertiesJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReadProperties", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReadPropertiesDoPrivilegedJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReadPropertiesDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReadPropertiesDoPrivilegedJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReadPropertiesDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedReadPropertiesJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testSignedReadProperties", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedReadPropertiesJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testSignedReadProperties", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedReadPropertiesDoPrivilegedJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testSignedReadPropertiesDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedReadPropertiesDoPrivilegedJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testSignedReadPropertiesDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testSignedExportPropertiesToUnsigned", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testSignedExportPropertiesToUnsigned", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedDoPrivilegedJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testSignedExportPropertiesToUnsignedDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedDoPrivilegedJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testSignedExportPropertiesToUnsignedDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedDoPrivileged2JNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testSignedExportPropertiesToUnsignedDoPrivileged2", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedDoPrivileged2JNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testSignedExportPropertiesToUnsignedDoPrivileged2", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedAttacksSigned", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedAttacksSigned", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedDoPrivilegedJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedAttacksSignedDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedDoPrivilegedJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedAttacksSignedDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedDoPrivileged2JNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedAttacksSignedDoPrivileged2", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedDoPrivileged2JNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedAttacksSignedDoPrivileged2", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReflectionAttack", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReflectionAttack", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackDoPrivilegedJNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReflectionAttackDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackDoPrivilegedJNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReflectionAttackDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackDoPrivileged2JNLPAppletWithSecurity() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReflectionAttackDoPrivileged2", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackDoPrivileged2JNLPApplet() throws Exception { ProcessResult pr = runJnlpApplet("testUnsignedReflectionAttackDoPrivileged2", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testNonPrivilegedAction", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testNonPrivilegedAction", false); assertProperStart(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionDoPrivilegedJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testNonPrivilegedActionDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionDoPrivilegedJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testNonPrivilegedActionDoPrivileged", false); assertProperStart(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionDoPrivileged2JNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testNonPrivilegedActionDoPrivileged2", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testNonPrivilegedActionDoPrivileged2JNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testNonPrivilegedActionDoPrivileged2", false); assertProperStart(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReadPropertiesJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReadProperties", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReadPropertiesJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReadProperties", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReadPropertiesDoPrivilegedJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReadPropertiesDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReadPropertiesDoPrivilegedJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReadPropertiesDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedReadPropertiesJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testSignedReadProperties", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedReadPropertiesJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testSignedReadProperties", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedReadPropertiesDoPrivilegedJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testSignedReadPropertiesDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedReadPropertiesDoPrivilegedJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testSignedReadPropertiesDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testSignedExportPropertiesToUnsigned", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testSignedExportPropertiesToUnsigned", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedDoPrivilegedJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testSignedExportPropertiesToUnsignedDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedDoPrivilegedJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testSignedExportPropertiesToUnsignedDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedDoPrivileged2JNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testSignedExportPropertiesToUnsignedDoPrivileged2", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testSignedExportPropertiesToUnsignedDoPrivileged2JNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testSignedExportPropertiesToUnsignedDoPrivileged2", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedAttacksSigned", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedAttacksSigned", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedDoPrivilegedJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedAttacksSignedDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedDoPrivilegedJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedAttacksSignedDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedDoPrivileged2JNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedAttacksSignedDoPrivileged2", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedAttacksSignedDoPrivileged2JNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedAttacksSignedDoPrivileged2", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReflectionAttack", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReflectionAttack", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackDoPrivilegedJNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReflectionAttackDoPrivileged", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackDoPrivilegedJNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReflectionAttackDoPrivileged", false); assertAccessControlException(pr); assertCloseString(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackDoPrivileged2JNLPApplicationWithSecurity() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReflectionAttackDoPrivileged2", true); assertSecurityTagException(pr); } @Bug(id="PR1592") @Test public void testUnsignedReflectionAttackDoPrivileged2JNLPApplication() throws Exception { ProcessResult pr = runJnlpApplication("testUnsignedReflectionAttackDoPrivileged2", false); assertAccessControlException(pr); assertCloseString(pr); } private static void assertProperStart(ProcessResult pr) { assertTrue("stdout should contain MixedSigningApplet Applet Running but did not", pr.stdout.contains("MixedSigningApplet Applet Running")); } private static void assertContainsUserHome(ProcessResult pr) { assertTrue("stdout should contain " + USER_HOME + " but did not", pr.stdout.contains(USER_HOME)); } private static void assertAccessControlException(ProcessResult pr) { assertTrue("stderr should contain \"AccessControlException: access denied\" but did not", pr.stderr.contains("AccessControlException: access denied")); } private static void assertSecurityTagException(ProcessResult pr) { final String errorMessage = "Cannot grant permissions to unsigned jars. Application requested security permissions, but jars are not signed"; assertTrue("stderr should contain \"" + errorMessage + "\" but did not.", pr.stderr.contains(errorMessage)); } private static void assertCloseString(ProcessResult pr) { assertTrue("stdout should contain " + CLOSE_STRING + " but did not", pr.stdout.contains(CLOSE_STRING)); } } icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745024664 xustar0030 mtime=1552401893.119832657 30 atime=1552410887.111183447 30 ctime=1552410887.069183546 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/srcs/0000755000175000002070000000000013441742745025551 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/srcs/PaxHeaders.7406/MixedSigningAppletS0000644000000000000000000000013213441742745030542 xustar0030 mtime=1552401893.092832712 30 atime=1552402157.260253429 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/srcs/MixedSigningAppletSigned.java0000644000175000002070000002745313441742745033314 0ustar00jvanekmock00000000000000/* MixedSigningAppletSigned.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package signed; import helper.MixedSigningAppletHelper; import java.applet.Applet; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.security.AccessController; import java.security.PrivilegedAction; /* See also simple/MixedSigningApplet */ public class MixedSigningAppletSigned extends Applet { public static void main(String[] args) { MixedSigningAppletSigned applet = new MixedSigningAppletSigned(); applet.jnlpStart(args[0].replaceAll("\"", "")); } public void jnlpStart(String testName) { try { Method m = this.getClass().getMethod(testName); final String result = (String) m.invoke(this); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } try { Method m = this.getClass().getMethod(testName + "Reflect"); final String result = (String) m.invoke(this); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } System.out.println("*** APPLET FINISHED ***"); System.exit(0); } @Override public void start() { jnlpStart(getParameter("testName")); } public String testNonPrivilegedActionReflect() { return new HelperMethodCall().method("help").call(); } public String testNonPrivilegedAction() { return MixedSigningAppletHelper.help(); } public String testNonPrivilegedActionDoPrivilegedReflect() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testNonPrivilegedActionReflect(); } }); } public String testNonPrivilegedActionDoPrivileged() { return testNonPrivilegedActionDoPrivileged(); } public String testNonPrivilegedActionDoPrivileged2Reflect() { return new HelperMethodCall().method("helpDoPrivileged").call(); } public String testNonPrivilegedActionDoPrivileged2() { return MixedSigningAppletHelper.helpDoPrivileged(); } // Should succeed public String testSignedReadProperties() { return getProperty("user.home"); } // Should just be the same as above. It doesn't make much sense to make a reflective version here public String testSignedReadPropertiesReflect() { return testSignedReadProperties(); } public String testSignedReadPropertiesDoPrivileged() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testSignedReadProperties(); } }); } public String testSignedReadPropertiesDoPrivilegedReflect() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testSignedReadPropertiesReflect(); } }); } // Should result in AccessControlException public String testUnsignedReadPropertiesReflect() { return new HelperMethodCall().type(String.class).method("getProperty").arg("user.home").call(); } public String testUnsignedReadProperties() { return MixedSigningAppletHelper.getProperty("user.home"); } public String testUnsignedReadPropertiesDoPrivileged() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testUnsignedReadProperties(); } }); } public String testUnsignedReadPropertiesDoPrivilegedReflect() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testUnsignedReadPropertiesReflect(); } }); } public String testUnsignedReadPropertiesDoPrivileged2Reflect() { return new HelperMethodCall().type(String.class).method("getPropertyDoPrivileged").arg("user.home").call(); } public String testUnsignedReadPropertiesDoPrivileged2() { return MixedSigningAppletHelper.getPropertyDoPrivileged("user.home"); } // Should result in AccessControlException public String testSignedExportPropertiesToUnsignedReflect() { return new HelperMethodCall().type(String.class).method("getPropertyFromSignedJar").arg("user.home").call(); } public String testSignedExportPropertiesToUnsigned() { return MixedSigningAppletHelper.getPropertyFromSignedJar("user.home"); } public String testSignedExportPropertiesToUnsignedDoPrivilegedReflect() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testSignedExportPropertiesToUnsignedReflect(); } }); } public String testSignedExportPropertiesToUnsignedDoPrivileged() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testSignedExportPropertiesToUnsigned(); } }); } public String testSignedExportPropertiesToUnsignedDoPrivileged2Reflect() { return new HelperMethodCall().type(String.class).method("getPropertyFromSignedJarDoPrivileged").arg("user.home").call(); } public String testSignedExportPropertiesToUnsignedDoPrivileged2() { return MixedSigningAppletHelper.getPropertyFromSignedJarDoPrivileged("user.home"); } // Should result in AccessControlException public String testUnsignedAttacksSignedReflect() { return new HelperMethodCall().method("attack").call(); } public String testUnsignedAttacksSigned() { return MixedSigningAppletHelper.attack(); } public String testUnsignedAttacksSignedDoPrivilegedReflect() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testUnsignedAttacksSignedReflect(); } }); } public String testUnsignedAttacksSignedDoPrivileged() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testUnsignedAttacksSigned(); } }); } public String testUnsignedAttacksSignedDoPrivileged2Reflect() { return new HelperMethodCall().method("attackDoPrivileged").call(); } public String testUnsignedAttacksSignedDoPrivileged2() { return MixedSigningAppletHelper.attackDoPrivileged(); } // Should result in InvocationTargetException (due to AccessControlException) public String testUnsignedReflectionAttackReflect() { return new HelperMethodCall().method("reflectiveAttack").call(); } public String testUnsignedReflectionAttack() { return MixedSigningAppletHelper.reflectiveAttack(); } public String testUnsignedReflectionAttackDoPrivilegedReflect() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testUnsignedReflectionAttackReflect(); } }); } public String testUnsignedReflectionAttackDoPrivileged() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return testUnsignedReflectionAttack(); } }); } public String testUnsignedReflectionAttackDoPrivileged2Reflect() { return new HelperMethodCall().method("reflectiveAttackDoPrivileged").call(); } public String testUnsignedReflectionAttackDoPrivileged2() { return MixedSigningAppletHelper.reflectiveAttackDoPrivileged(); } public String calledByReflection() { return System.getProperty("user.home"); } public String calledByReflectionDoPrivileged() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return calledByReflection(); } }); } public static String getProperty(String prop) { return System.getProperty(prop); } public static String getPropertyDoPrivileged(String prop) { final String fProp = prop; return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return System.getProperty(fProp); } }); } private static class HelperMethodCall { private String methodName; private final List> methodSignature; private final List args; public HelperMethodCall() { methodSignature = new ArrayList>(); args = new ArrayList(); } public HelperMethodCall method(String methodName) { this.methodName = methodName; return this; } public HelperMethodCall type(Class methodSignature) { this.methodSignature.add(methodSignature); return this; } public HelperMethodCall arg(String arg) { this.args.add(arg); return this; } public T call() { try { Class helper = Class.forName("helper.MixedSigningAppletHelper"); Method m; if (this.methodSignature == null) { m = helper.getMethod(this.methodName); } else { m = helper.getMethod(this.methodName, this.methodSignature.toArray(new Class[methodSignature.size()])); } Object[] params = args.toArray(new String[args.size()]); @SuppressWarnings("unchecked") T result = (T) m.invoke(null, params); return result; } catch (Exception e) { e.printStackTrace(); return null; } } } } icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/srcs/PaxHeaders.7406/MixedSigningAppletH0000644000000000000000000000013213441742745030527 xustar0030 mtime=1552401893.119832657 30 atime=1552402157.260253429 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/srcs/MixedSigningAppletHelper.java0000644000175000002070000001155413441742745033315 0ustar00jvanekmock00000000000000/* MixedSigningAppletHelper.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package helper; import signed.MixedSigningAppletSigned; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; import java.security.AccessController; import java.security.PrivilegedAction; /* See also signed/MixedSigningAppletSigned */ public class MixedSigningAppletHelper { public static String help() { return "MixedSigningApplet Applet Running"; } public static String helpDoPrivileged() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return "MixedSigningApplet Applet Running"; } }); } public static String getProperty(String prop) { return System.getProperty(prop); } public static String getPropertyDoPrivileged(final String prop) { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return getProperty(prop); } }); } public static String getPropertyFromSignedJar(String prop) { try { Class signedAppletClass = Class.forName("signed.MixedSigningAppletSigned"); Method m = signedAppletClass.getMethod("getProperty", String.class); String result = (String) m.invoke(null, prop); return result; } catch (Exception e) { e.printStackTrace(); return e.toString(); } } public static String getPropertyFromSignedJarDoPrivileged(final String prop) { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return getPropertyFromSignedJar(prop); } }); } public static String attack() { try { Class signedAppletClass = Class.forName("signed.MixedSigningAppletSigned"); Method m = signedAppletClass.getMethod("getProperty", String.class); String result = (String) m.invoke(signedAppletClass.newInstance(), "user.home"); return result; } catch (Exception e) { e.printStackTrace(); return e.toString(); } } public static String attackDoPrivileged() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return new MixedSigningAppletSigned().testSignedReadPropertiesDoPrivileged(); } }); } public static String reflectiveAttack() { String result = null; try { Object signedApplet = Class.forName("signed.MixedSigningAppletSigned").newInstance(); Method getProp = signedApplet.getClass().getMethod("calledByReflection"); result = (String)getProp.invoke(signedApplet); } catch (Exception e) { e.printStackTrace(); result = e.toString(); } return result; } public static String reflectiveAttackDoPrivileged() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public String run() { return reflectiveAttack(); } }); } } icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/srcs/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745026401 xustar0030 mtime=1552401893.085832727 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningApplet/srcs/Makefile0000644000175000002070000000230613441742745027212 0ustar00jvanekmock00000000000000TESTNAME=MixedSigningApplet SRC_FILES=MixedSigningAppletSigned.java MixedSigningAppletHelper.java ENTRYPOINT_CLASSES=MixedSigningApplet JAVAC_CLASSPATH=$(TEST_EXTENSIONS_DIR):$(NETX_DIR)/lib/classes.jar JAVAC=$(EXPORTED_JAVAC) JAR=$(EXPORTED_JAR) JARSIGNER=$(EXPORTED_JARSIGNER) JARSIGNER_CMD=$(JARSIGNER) -keystore $(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME) -storepass $(PRIVATE_KEYSTORE_PASS) -keypass $(PRIVATE_KEYSTORE_PASS) ifeq ($(OS), Windows_NT) TMPDIR:=$(shell cygpath -p -m $(shell mktemp -d)) else TMPDIR:=$(shell mktemp -d) endif prepare-reproducer: echo PREPARING REPRODUCER $(TESTNAME) $(JAVAC) -d $(TMPDIR) -classpath $(JAVAC_CLASSPATH) $(SRC_FILES); \ cp ../resources/* $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ cd $(TMPDIR); \ $(JAR) cfe MixedSigningAppletSigned.jar signed.MixedSigningAppletSigned signed; \ $(JAR) cf MixedSigningApplet.jar helper; \ cd -; \ $(JARSIGNER_CMD) -sigfile Alpha $(TMPDIR)/MixedSigningAppletSigned.jar $(TEST_CERT_ALIAS)_signed; \ cp $(TMPDIR)/MixedSigningApplet{Signed,}.jar $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ echo PREPARED REPRODUCER $(TESTNAME), removing $(TMPDIR); \ rm -rf $(TMPDIR); \ clean-reproducer: echo NOTHING TO CLEAN FOR $(TESTNAME) icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/MixedSigningAndTrustedOnly0000644000000000000000000000013213441742745025404 xustar0030 mtime=1552401893.079832739 30 atime=1552410887.111183447 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/0000755000175000002070000000000013441742745026271 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745026356 xustar0030 mtime=1552401893.119832657 30 atime=1552410887.111183447 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/0000755000175000002070000000000013441742745027243 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/PaxHeaders.7406/MixedSignin0000644000000000000000000000032213441742745030575 xustar00120 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MixedSigningAndTrustedOnlyClass2.java 30 mtime=1552401893.119832657 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MixedSigningAndTrustedOnlyC0000644000175000002070000001145413441742745034523 0ustar00jvanekmock00000000000000 import java.applet.Applet; import java.util.Arrays; /* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class MixedSigningAndTrustedOnlyClass2 extends Applet { private static final String ID_THIS = "MixedSigningAndTrustedOnlyClass2"; private static final String ID_REMOTE = "MixedSigningAndTrustedOnlyClass1"; public static void main(String[] args) { runBody(args); } @Override public void start() { String c = getParameter("command"); String[] cc = c.split(" "); runBody(cc); } private static void runBody(String... commands) { try { System.out.println(ID_THIS + " running"); System.out.println("params: " + Arrays.toString(commands)); boolean canDie = true; for (String command : commands) { try { switch (command) { case "canDie": canDie = true; break; case "cantDie": canDie = false; break; case ID_THIS + "_Normal": doNormalLocal(); break; case ID_THIS + "_Restricted": doRestrictedActionLocal(); break; case ID_REMOTE + "_Normal": MixedSigningAndTrustedOnlyClass1.doNormalRemote(); break; case ID_REMOTE + "_Restricted": MixedSigningAndTrustedOnlyClass1.doRestrictedActionlRemote(); break; } } catch (Exception ex) { if (canDie) { throw ex; } else { ex.printStackTrace(); } } } } finally { System.out.println("*** APPLET FINISHED ***"); System.out.flush(); System.out.println("some garbage forcing to flush"); System.out.flush(); } } private static void doRestrictedAction() { String a = System.getProperty("user.home"); System.out.println(ID_THIS + " Property read"); System.out.println(a); System.out.flush(); } private static void doNormal() { System.out.println(ID_THIS + " confirmed"); System.out.flush(); } private static final String REMOTE_CALL = "RemoteCall - "; private static final String LOCAL_CALL = "LocalCall - "; public static void doNormalRemote() { System.out.print(REMOTE_CALL); doNormal(); System.out.flush(); } private static void doNormalLocal() { System.out.print(LOCAL_CALL); doNormal(); System.out.flush(); } public static void doRestrictedActionlRemote() { System.out.print(REMOTE_CALL); doRestrictedAction(); System.out.flush(); } private static void doRestrictedActionLocal() { System.out.print(LOCAL_CALL); doRestrictedAction(); System.out.flush(); } } icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745030073 xustar0030 mtime=1552401893.076832746 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/Makefile0000644000175000002070000000615413441742745030711 0ustar00jvanekmock00000000000000TESTNAME=MixedSigningAndTrustedOnly SRC_NAME1=$(TESTNAME)Class1 SRC_NAME2=$(TESTNAME)Class2 SRC_FILE1=$(SRC_NAME1).java SRC_FILE2=$(SRC_NAME2).java COMPILED_FILES1=$(SRC_NAME1)*.class COMPILED_FILES2=$(SRC_NAME2)*.class JAVAC_CLASSPATH=$(TEST_EXTENSIONS_DIR):$(NETX_DIR)/lib/classes.jar JAVAC=$(EXPORTED_JAVAC) JAR=$(EXPORTED_JAR) JARSIGNER=$(EXPORTED_JARSIGNER) JARSIGNER_CMD=$(JARSIGNER) -keystore $(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME) -storepass $(PRIVATE_KEYSTORE_PASS) -keypass $(PRIVATE_KEYSTORE_PASS) SIGFILE=-sigfile Alpha SIGNED1=$(TESTNAME)BothSigned.jar SIGNED2=$(TESTNAME)FirstSigned.jar SIGNED3=$(TESTNAME)SecondSigned.jar UNSIGNED1=$(TESTNAME)BothUnsigned.jar UNSIGNED2=$(TESTNAME)FirstUnsigned.jar UNSIGNED3=$(TESTNAME)SecondUnsigned.jar MSIGNED1=$(TESTNAME)BothSignedManifest.jar MSIGNED2=$(TESTNAME)FirstSignedManifest.jar MSIGNED3=$(TESTNAME)SecondSignedManifest.jar MUNSIGNED1=$(TESTNAME)BothUnsignedManifest.jar MUNSIGNED2=$(TESTNAME)FirstUnsignedManifest.jar MUNSIGNED3=$(TESTNAME)SecondUnsignedManifest.jar MANIFEST=MANIFEST.MF ifeq ($(OS), Windows_NT) TMPDIR:=$(shell cygpath -p -m $(shell mktemp -d)) else TMPDIR:=$(shell mktemp -d) endif prepare-reproducer: echo PREPARING REPRODUCER $(TESTNAME) ; \ $(JAVAC) -d $(TMPDIR) -classpath $(JAVAC_CLASSPATH) $(SRC_FILE1) $(SRC_FILE2); \ cp ../resources/* $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ pushd $(TMPDIR); \ $(JAR) cf $(SIGNED1) $(COMPILED_FILES1) $(COMPILED_FILES2); \ $(JAR) cf $(SIGNED2) $(COMPILED_FILES1) ; \ $(JAR) cf $(SIGNED3) $(COMPILED_FILES2); \ $(JAR) cf $(UNSIGNED1) $(COMPILED_FILES1) $(COMPILED_FILES2); \ $(JAR) cf $(UNSIGNED2) $(COMPILED_FILES1) ; \ $(JAR) cf $(UNSIGNED3) $(COMPILED_FILES2); \ popd ; \ cp $(MANIFEST) $(TMPDIR) ; \ pushd $(TMPDIR); \ $(JAR) cfm $(MSIGNED1) $(MANIFEST) $(COMPILED_FILES1) $(COMPILED_FILES2); \ $(JAR) cfm $(MSIGNED2) $(MANIFEST) $(COMPILED_FILES1) ; \ $(JAR) cfm $(MSIGNED3) $(MANIFEST) $(COMPILED_FILES2); \ $(JAR) cfm $(MUNSIGNED1) $(MANIFEST) $(COMPILED_FILES1) $(COMPILED_FILES2); \ $(JAR) cfm $(MUNSIGNED2) $(MANIFEST) $(COMPILED_FILES1) ; \ $(JAR) cfm $(MUNSIGNED3) $(MANIFEST) $(COMPILED_FILES2); \ popd ; \ $(JARSIGNER_CMD) $(SIGFILE) $(TMPDIR)/$(SIGNED1) $(TEST_CERT_ALIAS)_signed; \ $(JARSIGNER_CMD) $(SIGFILE) $(TMPDIR)/$(SIGNED2) $(TEST_CERT_ALIAS)_signed; \ $(JARSIGNER_CMD) $(SIGFILE) $(TMPDIR)/$(SIGNED3) $(TEST_CERT_ALIAS)_signed; \ $(JARSIGNER_CMD) $(SIGFILE) $(TMPDIR)/$(MSIGNED1) $(TEST_CERT_ALIAS)_signed; \ $(JARSIGNER_CMD) $(SIGFILE) $(TMPDIR)/$(MSIGNED2) $(TEST_CERT_ALIAS)_signed; \ $(JARSIGNER_CMD) $(SIGFILE) $(TMPDIR)/$(MSIGNED3) $(TEST_CERT_ALIAS)_signed; \ cp $(TMPDIR)/{$(SIGNED1),$(SIGNED2),$(SIGNED3)} $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ cp $(TMPDIR)/{$(UNSIGNED1),$(UNSIGNED2),$(UNSIGNED3)} $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ cp $(TMPDIR)/{$(MSIGNED1),$(MSIGNED2),$(MSIGNED3)} $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ cp $(TMPDIR)/{$(MUNSIGNED1),$(MUNSIGNED2),$(MUNSIGNED3)} $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ echo PREPARED REPRODUCER $(TESTNAME), removing $(TMPDIR); \ rm -rf $(TMPDIR); clean-reproducer: echo NOTHING TO CLEAN FOR $(TESTNAME) icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/PaxHeaders.7406/MixedSignin0000644000000000000000000000032213441742745030575 xustar00120 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MixedSigningAndTrustedOnlyClass1.java 30 mtime=1552401893.084832729 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MixedSigningAndTrustedOnlyC0000644000175000002070000001171413441742745034522 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.applet.Applet; import java.util.Arrays; public class MixedSigningAndTrustedOnlyClass1 extends Applet { private static final String ID_THIS = "MixedSigningAndTrustedOnlyClass1"; private static final String ID_REMOTE = "MixedSigningAndTrustedOnlyClass2"; public static void main(String[] args) { runBody(args); } @Override public void start() { String c = getParameter("command"); String[] cc = c.split(" "); runBody(cc); } private static void runBody(String... commands) { try { System.out.println(ID_THIS + " running"); System.out.println("params: " + Arrays.toString(commands)); boolean canDie = true; for (String command : commands) { try { switch (command) { case "canDie": canDie = true; break; case "cantDie": canDie = false; break; case ID_THIS + "_Normal": doNormalLocal(); break; case ID_THIS + "_Restricted": doRestrictedActionLocal(); break; case ID_REMOTE + "_Normal": MixedSigningAndTrustedOnlyClass2.doNormalRemote(); break; case ID_REMOTE + "_Restricted": MixedSigningAndTrustedOnlyClass2.doRestrictedActionlRemote(); break; } } catch (Exception ex) { if (canDie) { throw ex; } else { ex.printStackTrace(); } } } } finally { System.err.flush(); System.out.flush(); System.out.println("*** APPLET FINISHED ***"); System.out.flush(); System.out.println("some garbage forcing to flush"); System.out.flush(); System.err.println("some garbage forcing to flush"); System.err.flush(); } } private static void doRestrictedAction() { String a = System.getProperty("user.home"); System.out.println(ID_THIS + " Property read"); System.out.println(a); System.out.flush(); } private static void doNormal() { System.out.println(ID_THIS + " confirmed"); System.out.flush(); } private static final String REMOTE_CALL = "RemoteCall - "; private static final String LOCAL_CALL = "LocalCall - "; public static void doNormalRemote() { System.out.print(REMOTE_CALL); doNormal(); System.out.flush(); } private static void doNormalLocal() { System.out.print(LOCAL_CALL); doNormal(); System.out.flush(); } public static void doRestrictedActionlRemote() { System.out.print(REMOTE_CALL); doRestrictedAction(); System.out.flush(); } private static void doRestrictedActionLocal() { System.out.print(LOCAL_CALL); doRestrictedAction(); System.out.flush(); } } icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/PaxHeaders.7406/MANIFEST.MF0000644000000000000000000000013213441742745030065 xustar0030 mtime=1552401893.079832739 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MANIFEST.MF0000644000175000002070000000010013441742745030664 0ustar00jvanekmock00000000000000Trusted-only: true Application-Name: MixedSigningAndTrustedOnly icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745027402 xustar0030 mtime=1552401893.079832739 30 atime=1552410887.111183447 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/0000755000175000002070000000000013441742745030267 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/PaxHeaders.7406/MixedS0000644000000000000000000000032413441742745030576 xustar00122 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyPackage/ 30 mtime=1552401893.092832712 30 atime=1552410887.111183447 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrusted0000755000175000002070000000000013441742745034573 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrusted0000644000000000000000000000036313441742745031350 xustar00153 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyPackage/MixedSigningAndTrustedOnly.java 30 mtime=1552401893.092832712 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrusted0000644000175000002070000004700213441742745034600 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ //package MixedSigningAndTrustedOnlyPackage; package MixedSigningAndTrustedOnlyPackage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.Assert; import org.junit.Test; public class MixedSigningAndTrustedOnly extends BrowserTest { static List HEADLESS = Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HEADLESS.option}); static List HTML = Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.HTML.option}); static List verbose = Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.VERBOSE.option}); public static final String PREFIX = "MixedSigningAndTrustedOnly"; public static final String C1 = "Class1"; public static final String C2 = "Class2"; static final String ID11 = PREFIX + C1; static final String ID12 = PREFIX + C2; static final String ID21 = PREFIX + C1; static final String ID22 = PREFIX + C2; static final String RUNNING = " running"; //note the space static final String RUNNING1 = ID11 + RUNNING; static final String RUNNING2 = ID22 + RUNNING; static final String RESTRICTED_CONFIRM_SUFFIX = " Property read"; //note the space static final String NORMAL_CONFIRM_SUFFIX = " confirmed"; //same static final String REMOTE_PREFIX = "RemoteCall - "; //note the space static final String LOCAL_PREFIX = "LocalCall - "; //note the space static final String RESTRICTED11 = ID11 + RESTRICTED_CONFIRM_SUFFIX; static final String NORMAL11 = ID11 + NORMAL_CONFIRM_SUFFIX; static final String RESTRICTED12 = ID12 + RESTRICTED_CONFIRM_SUFFIX; static final String NORMAL12 = ID12 + NORMAL_CONFIRM_SUFFIX; static final String RESTRICTED21 = ID21 + RESTRICTED_CONFIRM_SUFFIX; static final String NORMAL21 = ID21 + NORMAL_CONFIRM_SUFFIX; static final String RESTRICTED22 = ID22 + RESTRICTED_CONFIRM_SUFFIX; static final String NORMAL22 = ID22 + NORMAL_CONFIRM_SUFFIX; public static final String NORMAL_SUFFIX = "_Normal"; public static final String RESTRICTED_SUFFIX = "_Restricted"; public static final String COMMAND_C1_NORMAL = PREFIX + C1 + NORMAL_SUFFIX; public static final String COMMAND_C1_RESTRICT = PREFIX + C1 + RESTRICTED_SUFFIX; public static final String COMMAND_C2_NORMAL = PREFIX + C2 + NORMAL_SUFFIX; public static final String COMMAND_C2_RESTRICT = PREFIX + C2 + RESTRICTED_SUFFIX; public static final String COMMAND_CAN_DIE = "canDie"; public static final String COMMAND_CANTTT_DIE = "cantDie"; public static final String BOTH = "Both"; public static final String SIGNED = "Signed"; public static final String MANIFESTED = "Manifest"; public static final String UNSIGNED = "Unsigned"; public static final String FIRST = "First"; public static final String SECOND = "Second"; public static final String JAR = ".jar"; static final Archives BS = new Archives(PREFIX + BOTH + SIGNED + JAR); static final Archives BSM = new Archives(PREFIX + BOTH + SIGNED + MANIFESTED + JAR); static final Archives BU = new Archives(PREFIX + BOTH + UNSIGNED + JAR); static final Archives BUM = new Archives(PREFIX + BOTH + UNSIGNED + MANIFESTED + JAR); static final Archives FS = new Archives(PREFIX + FIRST + SIGNED + JAR); static final Archives FSM = new Archives(PREFIX + FIRST + SIGNED + MANIFESTED + JAR); static final Archives FU = new Archives(PREFIX + FIRST + UNSIGNED + JAR); static final Archives FUM = new Archives(PREFIX + FIRST + UNSIGNED + MANIFESTED + JAR); static final Archives SS = new Archives(PREFIX + SECOND + SIGNED + JAR); static final Archives SSM = new Archives(PREFIX + SECOND + SIGNED + MANIFESTED + JAR); static final Archives SU = new Archives(PREFIX + SECOND + UNSIGNED + JAR); static final Archives SUM = new Archives(PREFIX + SECOND + UNSIGNED + MANIFESTED + JAR); static final String CLOSE_STRING = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING; static final String USER_HOME = System.getProperty("user.home"); private static final String MAIN_CLASS_KEY = "@MAIN_CLASS@"; private static final String APPLET_ARCHIVES_KEY = "@APPLET_ARCHIVES@"; private static final String APPLET_PARAMS_KEY = "@APPLET_PARAMS@"; private static final String HREF_KEY = "@HREF@"; private static final String JNLP_ARCHIVES_KEY = "@JNLP_ARCHIVES@"; private static final String SECURITY_KEY = "@SECURITY_TAG@"; private static final String JNLP_ARGS_KEY = "@JNLP_ARGS@"; private static final String JNLP_SECURITY_TAG = ""; static enum FileType { HTML, JNLP_APP, JNLP_APPLET } static class Archives { private final String urlOrName; private final boolean isMain; public Archives(String urlOrName, boolean isMain) { this.urlOrName = urlOrName; this.isMain = isMain; } public Archives(String s) { this(s, false); } public Archives asMain() { return new Archives(urlOrName, true); } } private static CharSequence createAppletArchives(Archives[] archives) { StringBuilder sb = new StringBuilder(); if (archives == null || archives.length == 0) { return sb; } for (Archives string : archives) { sb.append(string.urlOrName).append(","); } sb.delete(sb.length() - 1, sb.length()); return sb; } private static CharSequence createAppletParams(String[] params) { StringBuilder sb = new StringBuilder(); if (params == null || params.length == 0) { return sb; } sb.append(""); return sb; } private static CharSequence createJnlpArchives(Archives[] archives) { StringBuilder sb = new StringBuilder(); if (archives == null || archives.length == 0) { return sb; } for (Archives string : archives) { if (string.isMain) { sb.append("").append("\n"); } else { sb.append("").append("\n"); } } sb.delete(sb.length() - 1, sb.length()); return sb; } private static CharSequence createJnlpParams(String[] params) { StringBuilder sb = new StringBuilder(); if (params == null || params.length == 0) { return sb; } for (String string : params) { sb.append("").append(string).append("").append("\n"); } sb.delete(sb.length() - 1, sb.length()); return sb; } static String prepareFile(FileType type, String mainClassSuffix, Archives[] archives, String[] params, boolean security) throws IOException { String baseName = PREFIX; switch (type) { case HTML: baseName = baseName + ".html"; break; case JNLP_APP: baseName = baseName + "App.jnlp"; break; case JNLP_APPLET: baseName = baseName + "Applet.jnlp"; break; default: throw new RuntimeException("Unknown type"); } File src = new File(server.getDir(), baseName + ".in"); String srcJnlp = ServerAccess.getContentOfStream(new FileInputStream(src)); String resultJnlp = srcJnlp .replace(HREF_KEY, "") //trying... .replace(MAIN_CLASS_KEY, PREFIX + mainClassSuffix); switch (type) { case HTML: resultJnlp = resultJnlp .replace(APPLET_ARCHIVES_KEY, createAppletArchives(archives)) .replace(APPLET_PARAMS_KEY, createAppletParams(params)); break; case JNLP_APP: resultJnlp = resultJnlp .replace(JNLP_ARCHIVES_KEY, createJnlpArchives(archives)) .replace(JNLP_ARGS_KEY, createJnlpParams(params)); break; case JNLP_APPLET: resultJnlp = resultJnlp .replace(JNLP_ARCHIVES_KEY, createJnlpArchives(archives)) .replace(APPLET_PARAMS_KEY, createAppletParams(params)); break; default: throw new RuntimeException("Unknown type"); } resultJnlp = resultJnlp .replace(SECURITY_KEY, security ? JNLP_SECURITY_TAG : ""); File dest = new File(server.getDir(), baseName); ServerAccess.saveFile(resultJnlp, dest); return baseName; } @Test public void createAppletArchivesWorks() { CharSequence c1 = createAppletArchives(null); Assert.assertEquals("", c1.toString()); CharSequence c2 = createAppletArchives(new Archives[]{new Archives("archive")}); Assert.assertEquals("archive", c2.toString()); CharSequence c3 = createAppletArchives(new Archives[]{new Archives("archive1"), new Archives("archive2")}); Assert.assertEquals("archive1,archive2", c3.toString()); CharSequence c4 = createAppletArchives(new Archives[]{new Archives("archive1"), new Archives("archive2", true), new Archives("archive3")}); Assert.assertEquals("archive1,archive2,archive3", c4.toString()); } @Test public void createAppletParamsWorks() { CharSequence c1 = createAppletParams(null); Assert.assertEquals("", c1.toString()); CharSequence c2 = createAppletParams(new String[]{"archive"}); Assert.assertEquals("", c2.toString()); CharSequence c3 = createAppletParams(new String[]{"archive1", "archive2"}); Assert.assertEquals("", c3.toString()); CharSequence c4 = createAppletParams(new String[]{"archive1", "archive2", "archive3"}); Assert.assertEquals("", c4.toString()); } @Test public void createJnlpParamsWorks() { CharSequence c1 = createJnlpParams(null); Assert.assertEquals("", c1.toString()); CharSequence c2 = createJnlpParams(new String[]{"archive"}); Assert.assertEquals("archive", c2.toString()); CharSequence c3 = createJnlpParams(new String[]{"archive1", "archive2"}); Assert.assertEquals("archive1\narchive2", c3.toString()); CharSequence c4 = createJnlpParams(new String[]{"archive1", "archive2", "archive3"}); Assert.assertEquals("archive1\narchive2\narchive3", c4.toString()); } @Test public void createJnlpArchivesWorks() { CharSequence c1 = createJnlpArchives(null); Assert.assertEquals("", c1.toString()); CharSequence c2 = createJnlpArchives(new Archives[]{new Archives("archive", true)}); Assert.assertEquals("", c2.toString()); CharSequence c22 = createJnlpArchives(new Archives[]{new Archives("archive")}); Assert.assertEquals("", c22.toString()); CharSequence c3 = createJnlpArchives(new Archives[]{new Archives("archive1"), new Archives("archive2")}); Assert.assertEquals("\n", c3.toString()); CharSequence c4 = createJnlpArchives(new Archives[]{new Archives("archive1"), new Archives("archive2", true), new Archives("archive3")}); Assert.assertEquals("\n\n", c4.toString()); } static void assertAllOkC1(ProcessResult pr) { Assert.assertTrue(pr.stdout.contains(RUNNING1)); Assert.assertFalse(pr.stdout.contains(RUNNING2)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + NORMAL11)); Assert.assertTrue(pr.stdout.contains(REMOTE_PREFIX + NORMAL12)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + RESTRICTED11)); Assert.assertTrue(pr.stdout.contains(REMOTE_PREFIX + RESTRICTED12)); } static void assertAllOkC2(ProcessResult pr) { Assert.assertTrue(pr.stdout.contains(RUNNING2)); Assert.assertFalse(pr.stdout.contains(RUNNING1)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + NORMAL22)); Assert.assertTrue(pr.stdout.contains(REMOTE_PREFIX + NORMAL21)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + RESTRICTED22)); Assert.assertTrue(pr.stdout.contains(REMOTE_PREFIX + RESTRICTED21)); } static void assertC1C1okTransNotOk(ProcessResult pr) { Assert.assertFalse(pr.stdout.contains(RUNNING2)); Assert.assertTrue(pr.stdout.contains(RUNNING1)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + NORMAL11)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + RESTRICTED11)); Assert.assertFalse(pr.stdout.contains(REMOTE_PREFIX)); } static void assertC2C2okTransNotOk(ProcessResult pr) { Assert.assertTrue(pr.stdout.contains(RUNNING2)); Assert.assertFalse(pr.stdout.contains(RUNNING1)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + NORMAL22)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + RESTRICTED22)); Assert.assertFalse(pr.stdout.contains(REMOTE_PREFIX)); } static void assertC1C1OnlyUnrestrictedokTransNotOk(ProcessResult pr) { Assert.assertFalse(pr.stdout.contains(RUNNING2)); Assert.assertTrue(pr.stdout.contains(RUNNING1)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + NORMAL11)); Assert.assertFalse(pr.stdout.contains(LOCAL_PREFIX + RESTRICTED11)); Assert.assertFalse(pr.stdout.contains(REMOTE_PREFIX)); } static void assertC2C2OnlyUnrestrictedokTransNotOk(ProcessResult pr) { Assert.assertTrue(pr.stdout.contains(RUNNING2)); Assert.assertFalse(pr.stdout.contains(RUNNING1)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + NORMAL22)); Assert.assertFalse(pr.stdout.contains(LOCAL_PREFIX + RESTRICTED22)); Assert.assertFalse(pr.stdout.contains(REMOTE_PREFIX)); } //mostly useless, all tests are killed static void assertProcessOk(ProcessResult pr) { Assert.assertEquals(0, pr.returnValue.intValue()); } //mostly useless, all tests are killed static void assertProcessNotOk(ProcessResult pr) { Assert.assertNotEquals(0, pr.returnValue.intValue()); } static void assertAllButRestrictedC1(ProcessResult pr) { Assert.assertTrue(pr.stdout.contains(RUNNING1)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + NORMAL11)); Assert.assertTrue(pr.stdout.contains(REMOTE_PREFIX + NORMAL12)); assertNotRestricted(pr); } static void assertAllButRestrictedC2(ProcessResult pr) { Assert.assertTrue(pr.stdout.contains(RUNNING2)); Assert.assertTrue(pr.stdout.contains(REMOTE_PREFIX + NORMAL21)); Assert.assertTrue(pr.stdout.contains(LOCAL_PREFIX + NORMAL22)); assertNotRestricted(pr); } static void assertNotRestricted(ProcessResult pr) { Assert.assertFalse(pr.stdout.contains(RESTRICTED11)); Assert.assertFalse(pr.stdout.contains(RESTRICTED12)); Assert.assertFalse(pr.stdout.contains(RESTRICTED21)); Assert.assertFalse(pr.stdout.contains(RESTRICTED22)); } static void assertLaunchException(ProcessResult pr) { Assert.assertTrue(pr.stderr.contains("net.sourceforge.jnlp.LaunchException")); } static void assertInitError(ProcessResult pr) { Assert.assertTrue(pr.stderr.contains("Fatal: Initialization Error")); } static void assertSecurityException(ProcessResult pr) { Assert.assertTrue(pr.stderr.contains("java.lang.SecurityException")); } static void assertAccessControlException(ProcessResult pr) { Assert.assertTrue(pr.stderr.contains("java.security.AccessControlException")); } static void assertAccessDenied(ProcessResult pr) { Assert.assertTrue(pr.stderr.contains("access denied")); } static void assertNone(ProcessResult pr) { Assert.assertFalse(pr.stdout.contains(RUNNING1)); Assert.assertFalse(pr.stdout.contains(RUNNING2)); Assert.assertFalse(pr.stdout.contains(NORMAL11)); Assert.assertFalse(pr.stdout.contains(NORMAL12)); Assert.assertFalse(pr.stdout.contains(NORMAL21)); Assert.assertFalse(pr.stdout.contains(NORMAL22)); Assert.assertFalse(pr.stdout.contains(RESTRICTED11)); Assert.assertFalse(pr.stdout.contains(RESTRICTED12)); Assert.assertFalse(pr.stdout.contains(RESTRICTED21)); Assert.assertFalse(pr.stdout.contains(RESTRICTED22)); } static DeploymentPropertiesModifier setDeploymentPropertiesImpl() throws IOException { DeploymentPropertiesModifier q = new DeploymentPropertiesModifier(); File f = q.src.getFile(); if (!f.exists()) { f.getParentFile().mkdirs(); f.createNewFile(); } q.setProperties(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.TRUSTED.name()); return q; } } icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrusted0000644000000000000000000000036613441742745031353 xustar00156 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyPackage/MixedSigningAndTrustedOnlyBS1.java 30 mtime=1552401893.079832739 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrusted0000644000175000002070000002076013441742745034602 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ //package MixedSigningAndTrustedOnlyPackage; package MixedSigningAndTrustedOnlyPackage; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Test; import static MixedSigningAndTrustedOnlyPackage.MixedSigningAndTrustedOnly.*; import java.io.IOException; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.BeforeClass; /** * * Very simple tests. Basic behavior. jnlp and html with single signed jar, no * trusted-only manifest note - this file is declared to be in package, but * directory is wrong. Itw reproducers engine needs it like it, but your ide may * complain. Try to live with. Sorry */ public class MixedSigningAndTrustedOnlyBS1 extends BrowserTest { private static DeploymentPropertiesModifier q; @BeforeClass public static void setDeploymentProperties() throws IOException { q = setDeploymentPropertiesImpl(); } @AfterClass public static void resetDeploymentProperties() throws IOException { q.restoreProperties(); } @NeedsDisplay @Test @TestInBrowsers(testIn = {Browsers.one}) public void htmlC1AllCommandsBS() throws Exception { String file = prepareFile(FileType.HTML, C1, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeBrowser(file, AutoClose.CLOSE_ON_BOTH); assertAllOkC1(pr); } @NeedsDisplay @Test public void jnlpHtmlC1AllCommandsBS() throws Exception { String file = prepareFile(FileType.HTML, C1, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(HTML, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC1(pr); } @Test public void jnlpAppC1AllCommandsBSnosec() throws Exception { String file = prepareFile(FileType.JNLP_APP, C1, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(HEADLESS, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllButRestrictedC1(pr); assertLaunchException(pr); assertAccessDenied(pr); } @Test @NeedsDisplay public void jnlpAppletC1AllCommandsBSnosec() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C1, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(verbose, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllButRestrictedC1(pr); assertAccessControlException(pr); assertAccessDenied(pr); } @Test public void jnlpAppC1AllCommandsBSsec() throws Exception { String file = prepareFile(FileType.JNLP_APP, C1, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(HEADLESS, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC1(pr); } @Test @NeedsDisplay public void jnlpAppletC1AllCommandsBSsec() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C1, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC1(pr); } @NeedsDisplay @Test @TestInBrowsers(testIn = {Browsers.one}) public void htmlCc2llCommandsBS() throws Exception { String file = prepareFile(FileType.HTML, C2, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeBrowser(file, AutoClose.CLOSE_ON_BOTH); assertAllOkC2(pr); } @NeedsDisplay @Test public void jnlphtmlCc2llCommandsBS() throws Exception { String file = prepareFile(FileType.HTML, C2, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(HTML, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC2(pr); } @Test public void jnlpAppC2AllCommandsBSnosec() throws Exception { String file = prepareFile(FileType.JNLP_APP, C2, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(HEADLESS, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllButRestrictedC2(pr); assertLaunchException(pr); assertAccessDenied(pr); } @Test @NeedsDisplay public void jnlpAppletC2AllCommandsBSnosec() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C2, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(verbose, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllButRestrictedC2(pr); assertAccessControlException(pr); assertAccessDenied(pr); } @Test public void jnlpAppC2AllCommandsBSsec() throws Exception { String file = prepareFile(FileType.JNLP_APP, C2, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(HEADLESS, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC2(pr); } @Test @NeedsDisplay public void jnlpAppletC2AllCommandsBSsec() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C2, new Archives[]{BS}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC2(pr); } } icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrusted0000644000000000000000000000036713441742745031354 xustar00157 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyPackage/MixedSigningAndTrustedOnlyFSSU.java 30 mtime=1552401893.081832735 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrusted0000644000175000002070000003326513441742745034606 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ //package MixedSigningAndTrustedOnlyPackage; package MixedSigningAndTrustedOnlyPackage; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Test; import static MixedSigningAndTrustedOnlyPackage.MixedSigningAndTrustedOnly.*; import java.io.IOException; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.BeforeClass; /** * * jnlp and html with two jars, first signed, second unsigned, no trusted-only * manifest note - this file is declared to be in package, but directory is * wrong. Itw reproducers engine needs it like it, but your ide may complain. * Try to live with. Sorry */ public class MixedSigningAndTrustedOnlyFSSU extends BrowserTest { private static DeploymentPropertiesModifier q; @BeforeClass public static void setDeploymentProperties() throws IOException { q = setDeploymentPropertiesImpl(); } @AfterClass public static void resetDeploymentProperties() throws IOException { q.restoreProperties(); } @NeedsDisplay @Test @TestInBrowsers(testIn = {Browsers.one}) public void htmlC1AllCommandsFSSU() throws Exception { String file1 = prepareFile(FileType.HTML, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT}, false); ProcessResult pr1 = server.executeBrowser(file1, AutoClose.CLOSE_ON_BOTH); assertC1C1okTransNotOk(pr1); assertSecurityException(pr1); String file2 = prepareFile(FileType.HTML, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT, COMMAND_C2_NORMAL}, false); ProcessResult pr2 = server.executeBrowser(file2, AutoClose.CLOSE_ON_BOTH); assertC1C1okTransNotOk(pr2); assertSecurityException(pr2); } @NeedsDisplay @Test public void jnlpHtmlC1AllCommandsFSSU() throws Exception { String file = prepareFile(FileType.HTML, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT}, false); ProcessResult pr1 = server.executeJavaws(HTML, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC1C1okTransNotOk(pr1); assertSecurityException(pr1); String file2 = prepareFile(FileType.HTML, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT}, false); ProcessResult pr2 = server.executeJavaws(HTML, file2, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC1C1okTransNotOk(pr2); assertSecurityException(pr2); } @Test public void jnlpAppC1AllCommandsFSSUnosec() throws Exception { String file1 = prepareFile(FileType.JNLP_APP, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr1 = server.executeJavaws(HEADLESS, file1, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC1C1OnlyUnrestrictedokTransNotOk(pr1); assertSecurityException(pr1); String file2 = prepareFile(FileType.JNLP_APP, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT}, false); ProcessResult pr2 = server.executeJavaws(HEADLESS, file2, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC1C1OnlyUnrestrictedokTransNotOk(pr2); assertAccessControlException(pr2); assertAccessDenied(pr2); } @Test @NeedsDisplay public void jnlpAppletC1AllCommandsFSSUnosec() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(verbose, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC1C1OnlyUnrestrictedokTransNotOk(pr); assertSecurityException(pr); String file2 = prepareFile(FileType.JNLP_APPLET, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT}, false); ProcessResult pr2 = server.executeJavaws(verbose, file2, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC1C1OnlyUnrestrictedokTransNotOk(pr2); assertAccessControlException(pr2); assertAccessDenied(pr2); } @Test public void jnlpAppC1AllCommandsFSSUsec() throws Exception { String file = prepareFile(FileType.JNLP_APP, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(HEADLESS, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertNone(pr); assertInitError(pr); assertLaunchException(pr); } @Test @NeedsDisplay public void jnlpAppletC1AllCommandsFSSUsec() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C1, new Archives[]{FS, SU}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertNone(pr); assertInitError(pr); assertLaunchException(pr); } @NeedsDisplay @Test @TestInBrowsers(testIn = {Browsers.one}) public void htmlC2AllCommandsFSSU() throws Exception { String file1 = prepareFile(FileType.HTML, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr1 = server.executeBrowser(file1, AutoClose.CLOSE_ON_BOTH); assertC2C2OnlyUnrestrictedokTransNotOk(pr1); assertAccessDenied(pr1); assertAccessControlException(pr1); String file2 = prepareFile(FileType.HTML, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT,}, false); ProcessResult pr2 = server.executeBrowser(file2, AutoClose.CLOSE_ON_BOTH); assertC2C2OnlyUnrestrictedokTransNotOk(pr2); assertSecurityException(pr2); String file3 = prepareFile(FileType.HTML, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT,}, false); ProcessResult pr3 = server.executeBrowser(file3, AutoClose.CLOSE_ON_BOTH); assertC2C2OnlyUnrestrictedokTransNotOk(pr3); assertSecurityException(pr3); } @NeedsDisplay @Test public void jnlphtmlCc2llCommandsFSSU() throws Exception { String file1 = prepareFile(FileType.HTML, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr1 = server.executeJavaws(HTML, file1, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC2C2OnlyUnrestrictedokTransNotOk(pr1); assertAccessDenied(pr1); assertAccessControlException(pr1); String file2 = prepareFile(FileType.HTML, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr2 = server.executeJavaws(HTML, file2, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC2C2OnlyUnrestrictedokTransNotOk(pr2); assertSecurityException(pr2); String file3 = prepareFile(FileType.HTML, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr3 = server.executeJavaws(HTML, file3, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC2C2OnlyUnrestrictedokTransNotOk(pr3); assertSecurityException(pr3); } @Test public void jnlpAppC2AllCommandsFSSUnosec() throws Exception { String file1 = prepareFile(FileType.JNLP_APP, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr1 = server.executeJavaws(HEADLESS, file1, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC2C2OnlyUnrestrictedokTransNotOk(pr1); assertAccessDenied(pr1); assertAccessControlException(pr1); String file2 = prepareFile(FileType.JNLP_APP, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr2 = server.executeJavaws(HEADLESS, file2, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC2C2OnlyUnrestrictedokTransNotOk(pr2); assertSecurityException(pr2); String file3 = prepareFile(FileType.JNLP_APP, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr3 = server.executeJavaws(HEADLESS, file3, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC2C2OnlyUnrestrictedokTransNotOk(pr3); assertSecurityException(pr3); } @Test @NeedsDisplay public void jnlpAppletC2AllCommandsFSSUnosec() throws Exception { String file1 = prepareFile(FileType.JNLP_APPLET, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr1 = server.executeJavaws(verbose, file1, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC2C2OnlyUnrestrictedokTransNotOk(pr1); assertAccessDenied(pr1); assertAccessControlException(pr1); String file2 = prepareFile(FileType.JNLP_APPLET, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr2 = server.executeJavaws(verbose, file2, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC2C2OnlyUnrestrictedokTransNotOk(pr2); assertSecurityException(pr2); String file3 = prepareFile(FileType.JNLP_APPLET, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, false); ProcessResult pr3 = server.executeJavaws(verbose, file3, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertC2C2OnlyUnrestrictedokTransNotOk(pr3); assertSecurityException(pr3); } @Test public void jnlpAppC2AllCommandsFSSUsec() throws Exception { String file1 = prepareFile(FileType.JNLP_APP, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, true); ProcessResult pr = server.executeJavaws(HEADLESS, file1, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertNone(pr); assertInitError(pr); assertLaunchException(pr); } @Test @NeedsDisplay public void jnlpAppletC2AllCommandsFSSUsec() throws Exception { String file1 = prepareFile(FileType.JNLP_APPLET, C2, new Archives[]{FS, SU}, new String[]{COMMAND_C2_NORMAL, COMMAND_C2_RESTRICT, COMMAND_C1_NORMAL, COMMAND_C1_RESTRICT}, true); ProcessResult pr = server.executeJavaws(file1, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertNone(pr); assertInitError(pr); assertLaunchException(pr);; } } icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrusted0000644000000000000000000000037513441742745031353 xustar00163 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyPackage/MixedSigningAndTrustedOnlyBSmanifest.java 30 mtime=1552401893.081832735 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrusted0000644000175000002070000002166613441742745034610 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ //package MixedSigningAndTrustedOnlyPackage; package MixedSigningAndTrustedOnlyPackage; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess.AutoClose; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.closinglisteners.AutoErrorClosingListener; import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener; import org.junit.Test; import static MixedSigningAndTrustedOnlyPackage.MixedSigningAndTrustedOnly.*; import java.io.IOException; import net.sourceforge.jnlp.tools.DeploymentPropertiesModifier; import org.junit.AfterClass; import org.junit.BeforeClass; /** * * Very simple tests. Basic behavior. jnlp and html with single signed jar, trusted-only in manifest * note - this file is declared to be in package, but directory is wrong. Itw reproducers engine needs it like it, but your ide may complain. Try to live with. Sorry */ public class MixedSigningAndTrustedOnlyBSmanifest extends BrowserTest { private static DeploymentPropertiesModifier q; @BeforeClass public static void setDeploymentProperties() throws IOException{ q = setDeploymentPropertiesImpl(); } @AfterClass public static void resetDeploymentPropertiesmanifest() throws IOException{ q.restoreProperties(); } @NeedsDisplay @Test @TestInBrowsers(testIn = {Browsers.one}) public void htmlC1AllCommandsBSmanifest() throws Exception { String file = prepareFile(FileType.HTML, C1, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeBrowser(file, AutoClose.CLOSE_ON_BOTH); assertAllOkC1(pr); } @NeedsDisplay @Test public void jnlpHtmlC1AllCommandsBSmanifest() throws Exception { String file = prepareFile(FileType.HTML, C1, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(HTML, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC1(pr); } @Test public void jnlpAppC1AllCommandsBSnosecmanifest() throws Exception { String file = prepareFile(FileType.JNLP_APP, C1, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(HEADLESS, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertNone(pr); //trusted-only: true is prohibiting this from start at all. Signed, but not requesting all permissions. //stupid, but yeah. assertLaunchException(pr); } @Test @NeedsDisplay public void jnlpAppletC1AllCommandsBSnosecmanifest() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C1, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertNone(pr); //trusted-only: true is prohibiting this from start at all. Signed, but not requesting all permissions. //stupid, but yeah. assertLaunchException(pr); } @Test public void jnlpAppC1AllCommandsBSsecmanifest() throws Exception { String file = prepareFile(FileType.JNLP_APP, C1, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(HEADLESS, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC1(pr); } @Test @NeedsDisplay public void jnlpAppletC1AllCommandsBSsecmanifest() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C1, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC1(pr); } @NeedsDisplay @Test @TestInBrowsers(testIn = {Browsers.one}) public void htmlCc2llCommandsBSmanifest() throws Exception { String file = prepareFile(FileType.HTML, C2, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeBrowser(file, AutoClose.CLOSE_ON_BOTH); assertAllOkC2(pr); } @NeedsDisplay @Test public void jnlphtmlCc2llCommandsBSmanifest() throws Exception { String file = prepareFile(FileType.HTML, C2, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(HTML, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC2(pr); } @Test public void jnlpAppC2AllCommandsBSnosecmanifest() throws Exception { String file = prepareFile(FileType.JNLP_APP, C2, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(HEADLESS, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertNone(pr); //trusted-only: true is prohibiting this from start at all. Signed, but not requesting all permissions. //stupid, but yeah. assertLaunchException(pr); } @Test @NeedsDisplay public void jnlpAppletC2AllCommandsBSnosecmanifest() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C2, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, false); ProcessResult pr = server.executeJavaws(file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertNone(pr); //trusted-only: true is prohibiting this from start at all. Signed, but not requesting all permissions. //stupid, but yeah. assertLaunchException(pr); } @Test public void jnlpAppC2AllCommandsBSsecmanifest() throws Exception { String file = prepareFile(FileType.JNLP_APP, C2, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(HEADLESS, file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC2(pr); } @Test @NeedsDisplay public void jnlpAppletC2AllCommandsBSsecmanifest() throws Exception { String file = prepareFile(FileType.JNLP_APPLET, C2, new Archives[]{BSM}, new String[]{COMMAND_C1_NORMAL, COMMAND_C2_NORMAL, COMMAND_C1_RESTRICT, COMMAND_C2_RESTRICT}, true); ProcessResult pr = server.executeJavaws(file, new AutoOkClosingListener(), new AutoErrorClosingListener()); assertAllOkC2(pr); } } icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027416 xustar0030 mtime=1552401893.081832735 30 atime=1552410887.111183447 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/0000755000175000002070000000000013441742745030303 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/PaxHeaders.7406/MixedS0000644000000000000000000000032413441742745030612 xustar00122 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/MixedSigningAndTrustedOnly.html.in 30 mtime=1552401893.079832739 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/MixedSigningAndTrusted0000644000175000002070000000353113441742745034613 0ustar00jvanekmock00000000000000 @APPLET_PARAMS@ icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/PaxHeaders.7406/MixedS0000644000000000000000000000033213441742745030611 xustar00128 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/MixedSigningAndTrustedOnlyApplet.jnlp.in 30 mtime=1552401893.080832738 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/MixedSigningAndTrusted0000644000175000002070000000441113441742745034611 0ustar00jvanekmock00000000000000 MixedSigningAndTrustedOnly IcedTea Test per-JAR security assignment and permissions with or without Tusted-Only @JNLP_ARCHIVES@ @SECURITY_TAG@ @APPLET_PARAMS@ icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/PaxHeaders.7406/MixedS0000644000000000000000000000032713441742745030615 xustar00125 path=icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/MixedSigningAndTrustedOnlyApp.jnlp.in 30 mtime=1552401893.081832735 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/MixedSigningAndTrusted0000644000175000002070000000426013441742745034613 0ustar00jvanekmock00000000000000 MixedSigningAndTrustedOnly IcedTea Test per-JAR security assignment and permissions with or without Tusted-Only @JNLP_ARCHIVES@ @SECURITY_TAG@ @JNLP_ARGS@ icedtea-web-1.8/tests/reproducers/custom/PaxHeaders.7406/JavaFx0000644000000000000000000000013213441742745021336 xustar0030 mtime=1552401893.091832715 30 atime=1552410887.111183447 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/JavaFx/0000755000175000002070000000000013441742745022223 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/JavaFx/PaxHeaders.7406/testcases0000644000000000000000000000013213441742745023334 xustar0030 mtime=1552401893.091832715 30 atime=1552410887.111183447 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/JavaFx/testcases/0000755000175000002070000000000013441742745024221 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/JavaFx/testcases/PaxHeaders.7406/JavaFxTest.java0000644000000000000000000000013213441742745026273 xustar0030 mtime=1552401893.091832715 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/JavaFx/testcases/JavaFxTest.java0000644000175000002070000000675213441742745027115 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.util.Arrays; import net.sourceforge.jnlp.OptionsDefinitions; import org.junit.Assert; import org.junit.Test; import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.closinglisteners.StringBasedClosingListener; public class JavaFxTest { private static final String correct = "jnlp-javafx started"; private static final String done = "jnlp-javafx can be terminated"; public static final ServerAccess server = new ServerAccess(); /* * Randomly seeing: * (javaws:13906): Gdk-ERROR **: The program 'javaws' received an X Window System error. This probably reflects a bug in the program. The error was 'RenderBadPicture (invalid Picture parameter)'. (Details: serial 7754 error_code 141 request_code 138 minor_code 7) (Note to programmers: normally, X errors are reported asynchronously; that is, you will receive the error a while after causing it. To debug your program, run it with the --sync command line option to change this behavior. You can then get a meaningful backtrace from your debugger if you break on the gdk_x_error() function.) * Suprsing is, that awt splasshcreen is visible, and after it also itw error dialogue is visible */ @Test @NeedsDisplay public void testJavawsJNLP() throws Exception { ProcessResult pr = server.executeJavaws( Arrays.asList(new String[]{OptionsDefinitions.OPTIONS.NOSEC.option, OptionsDefinitions.OPTIONS.HEADLESS.option}), "/JavaFx.jnlp", new StringBasedClosingListener(done), new StringBasedClosingListener("xceptionxception")); System.out.println(pr.stdout); System.out.println(pr.stderr); Assert.assertTrue("stdout should contain " + correct + ", but it didnt.", pr.stdout.contains(correct)); } } icedtea-web-1.8/tests/reproducers/custom/JavaFx/PaxHeaders.7406/srcs0000644000000000000000000000013213441742745022310 xustar0030 mtime=1552401893.118832658 30 atime=1552410887.111183447 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/JavaFx/srcs/0000755000175000002070000000000013441742745023175 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/reproducers/custom/JavaFx/srcs/PaxHeaders.7406/helloworld.fxml0000644000000000000000000000013213441742745025430 xustar0030 mtime=1552401893.118832658 30 atime=1552402157.259253431 30 ctime=1552410887.068183548 icedtea-web-1.8/tests/reproducers/custom/JavaFx/srcs/helloworld.fxml0000644000175000002070000000142413441742745026241 0ustar00jvanekmock00000000000000
passed failed # (ms): ;
TOTAL:
()
passed:
()
failed:
()
ignored:
()

Individual results:

ignored failed passed
IGNORED (s) PASSED (s) " - WARNING This test is known to fail, but have passed! - This test is known to fail - This test is running remote content, note that failures may be caused by broken target application or connection
FAILED (s) - This test is known to fail - This test is running remote content, note that failures may be caused by broken target application or connection
-
                    
                  
STD-OUT -
                
              
STD-ERR -
                
              
icedtea-web-1.8/tests/PaxHeaders.7406/netx0000644000000000000000000000013113441742745015265 xustar0030 mtime=1552401893.060832779 30 atime=1552410887.112183445 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/0000755000175000002070000000000013441742745016153 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/PaxHeaders.7406/unit0000644000000000000000000000013113441742745016244 xustar0030 mtime=1552401893.076832746 30 atime=1552410887.112183445 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/0000755000175000002070000000000013441742745017132 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/PaxHeaders.7406/net0000644000000000000000000000013113441742745017032 xustar0030 mtime=1552401893.059832781 30 atime=1552410887.112183445 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/0000755000175000002070000000000013441742745017720 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/PaxHeaders.7406/sourceforge0000644000000000000000000000013113441742745021355 xustar0030 mtime=1552401893.059832781 30 atime=1552410887.112183445 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/0000755000175000002070000000000013441742745022243 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/PaxHeaders.7406/jnlp0000644000000000000000000000013113441742745022320 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.112183445 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/0000755000175000002070000000000013441742745023206 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/resources0000644000000000000000000000013113441742745024332 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.112183445 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/resources/0000755000175000002070000000000013441742745025220 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/resources/PaxHeaders.7406/MessagesPropertiesTes0000644000000000000000000000013113441742745030632 xustar0030 mtime=1552401893.095832706 30 atime=1552402157.258253434 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java0000644000175000002070000003240713441742745032555 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.resources; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import net.sourceforge.jnlp.ServerAccess; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.BeforeClass; import org.junit.Test; public class MessagesPropertiesTest { private final static class LocalesIdentifier { public static final LocalesIdentifier DEFAULT = new LocalesIdentifier("",""); public static final LocalesIdentifier CZ = new LocalesIdentifier("cs"); //public static final LocalesIdentifier CZ_CS = new LocalesIdentifier("CZ","cs"); public static final LocalesIdentifier DE = new LocalesIdentifier("de"); public static final LocalesIdentifier PL = new LocalesIdentifier("pl"); //public static final LocalesIdentifier DE_DE = new LocalesIdentifier("DE","de"); public static final LocalesIdentifier RU = new LocalesIdentifier("ru"); public static final String mainFileName = "Messages"; public static final String pckg = "net.sourceforge.jnlp.resources"; private final String country; private final String language; private final Locale locale; private final ResourceBundle bundle; public LocalesIdentifier(String country, String language) { this.country = country; this.language = language; if (getCountry().equals("") && getLanguage().equals("")){ locale = new Locale("unknown_so_default", "unknown_so_default"); } else { //get default by non existing language and country locale = new Locale(language, country); } bundle = ResourceBundle.getBundle(pckg+"." + mainFileName, locale); } public LocalesIdentifier(String language) { this.country = null; this.language = language; locale = new Locale(language); bundle = ResourceBundle.getBundle(pckg+"." + mainFileName, locale); } public String getCountry() { if (country == null) { return ""; } return country.trim(); } public String getLanguage() { if (language == null) { return ""; } return language.trim(); } public ResourceBundle getBundle() { return bundle; } public Locale getLocale() { return locale; } public String getId() { if (getLanguage().equals("")) { return getCountry(); } if (getCountry().equals("")) { return getLanguage(); } return getLanguage() + "_" + getCountry(); } public String getIdentifier() { if (getId().equals("")) { return "default"; } return getId(); } @Override public String toString() { return pckg+"."+mainFileName+"_"+getId(); } } private static LocalesIdentifier main; private static LocalesIdentifier[] secondary; @BeforeClass public static void loadResourceBoundels() { //get default by non existing language and country main = LocalesIdentifier.DEFAULT; assertNotNull(main); secondary= new LocalesIdentifier[] {LocalesIdentifier.CZ, LocalesIdentifier.DE, LocalesIdentifier.PL, LocalesIdentifier.RU}; assertNotNull(secondary); for (LocalesIdentifier secondary1 : secondary) { assertNotNull(secondary1); } } @Test public void allResourcesAreReallyDifferent() { List bundles = new ArrayList<>(secondary.length + 1); String detailResults=""; int errors = 0; bundles.addAll(Arrays.asList(secondary)); for (LocalesIdentifier resourceBundle1 : bundles) { Enumeration keys1 = resourceBundle1.getBundle().getKeys(); LocalesIdentifier resourceBundle2 = main; allLog("Checking for same items between " + resourceBundle1.getLocale() + " x " + resourceBundle2.getLocale() + " (should be " + resourceBundle1.getIdentifier() + " x " + resourceBundle2.getIdentifier() + ")"); int localErrors=0; while (keys1.hasMoreElements()) { String key = keys1.nextElement(); String val1 = getMissingResourceAsEmpty(resourceBundle1.getBundle(), key); if (val1.length() > 1000) { errLog("Skipping check of: " + key + " too long. (" + val1.length() + ")"); continue; } String val2 = getMissingResourceAsEmpty(resourceBundle2.getBundle(), key); outLog("\""+val1+"\" x \""+val2); if (val1.trim().equalsIgnoreCase(val2.trim())) { if (val1.trim().length() <= 5 /* short words like"ok", "", ...*/ || val1.toLowerCase().contains("://") /*urls...*/ || !val1.trim().contains(" ") /*one word*/ || val1.replaceAll("\\{\\d\\}", "").trim().length()<5 /*only vars and short words*/ //white list || (val1.trim().equals("std. err")) || (val1.trim().equals("std. out")) || (val1.trim().equals("Policy Editor")) || (val1.trim().equals("Java Reflection")) || (val1.trim().equals("javaws html")) || (val1.trim().matches("Minimum: .* Maximum: .*")) || (val1.trim().equals("jnlp href")) || (val1.trim().equals("shift F2")) || (val1.trim().equals("GNU Lesser General Public License.")) ) { errLog("Warning! Items equals for: " + key + " = " + val1 + " but are in allowed subset"); } else { errors++; localErrors++; errLog("Error! Items equals for: " + key + " = " + val1); } } } if (localErrors > 0){ detailResults+=resourceBundle1.getIdentifier()+" x "+resourceBundle2.getIdentifier()+": "+localErrors+";"; } errLog(localErrors+" errors allResourcesAreReallyDifferent fo "+resourceBundle1.getIdentifier()+" x "+resourceBundle2.getIdentifier()); } assertTrue("Several - " + errors + " - items are same in bundles. See error logs for details: "+detailResults, errors == 0); } private String getMissingResourceAsEmpty(ResourceBundle res, String key) { try { return res.getString(key); } catch (MissingResourceException ex) { return ""; } } @Test //it is not critical that some localisations are missing, however good to know //and actually this test sis covered by allResourcesAreReallyDifferent, because fallback is geting default value for unknnow localisation public void warnForNotLocalisedStrings() { int errors = 0; Enumeration keys = main.getBundle().getKeys(); for (LocalesIdentifier secondary1 : secondary) { int localErrors = 0; ResourceBundle sec = secondary1.getBundle(); String id = secondary1.getIdentifier(); allLog("Checking for missing strings in " + sec.getLocale() + " (should be " + id + ") compared with default"); while (keys.hasMoreElements()) { String key = keys.nextElement(); String val1 = getMissingResourceAsEmpty(main.getBundle(), key); String val2 = getMissingResourceAsEmpty(sec, key); outLog("\""+val1+"\" x \""+val2); if (val1.trim().isEmpty()) { } else { if (val2.trim().isEmpty()){ errors++; localErrors++; errLog("Error! There is value for default: " + key + ", but for " + id+" is missing"); } } } errLog(localErrors+" warnForNotLocalisedStrings errors for "+id); } assertTrue("Several - " + errors + " - items have missing localization. See error logs for details", errors == 0); } @Test public void noEmptyResources() { List bundles = new ArrayList<>(secondary.length + 1); bundles.add(main); int errors = 0; bundles.addAll(Arrays.asList(secondary)); for (LocalesIdentifier bundle : bundles) { ResourceBundle resourceBundle = bundle.getBundle(); String id = bundle.getIdentifier(); Enumeration keys = resourceBundle.getKeys(); allLog("Checking for empty items in " + resourceBundle.getLocale() + " (should be " + id + ")"); int localErrors=0; while (keys.hasMoreElements()) { String key = keys.nextElement(); String val = getMissingResourceAsEmpty(resourceBundle, key); outLog("\""+key+"\" = \""+val); if (val.trim().isEmpty()) { errors++; localErrors++; errLog("Error! Key: " + key + " have no vlue"); } } errLog(localErrors+" noEmptyResources errors for "+id); } assertTrue("Several - " + errors + " - items have no values", errors == 0); } @Test public void findKeysWhichAreInLocalisedButNotInDefault() { int errors = 0; for (LocalesIdentifier secondary1 : secondary) { int localErrors = 0; ResourceBundle sec = secondary1.getBundle(); Enumeration keys = sec.getKeys(); String id = secondary1.getId(); outLog("Checking for redundant keys in " + sec.getLocale() + " (should be " + id + ") compared with default"); errLog("Checking for redundant keys in " + sec.getLocale() + " (should be " + id + ") compared with default"); while (keys.hasMoreElements()) { String key = keys.nextElement(); String val2 = getMissingResourceAsEmpty(main.getBundle(), key); String val1 = getMissingResourceAsEmpty(sec, key); outLog("\""+val1+"\" x \""+val2); if (val2.trim().isEmpty() && !val1.trim().isEmpty()){ errors++; localErrors++; errLog("Error! There is value for "+id+", key " + key + ", but for default is missing"); } } errLog(localErrors+" findKeysWhichAreInLocalisedButNotInDefault errors for "+id); } assertTrue("Several - " + errors + " - items have value in localized version but not in default one", errors == 0); } private void allLog(String string) { outLog(string); errLog(string); } private void errLog(String string) { //used quite often :) //System.out.println(string); ServerAccess.logErrorReprint(string); } private void outLog(String string) { ServerAccess.logOutputReprint(string); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/browser0000644000000000000000000000013113441742745024003 xustar0030 mtime=1552401893.094832708 30 atime=1552410887.112183445 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/browser/0000755000175000002070000000000013441742745024671 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/browser/PaxHeaders.7406/BrowserAwareProxySelect0000644000000000000000000000013113441742745030610 xustar0030 mtime=1552401893.094832708 30 atime=1552402157.258253434 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/browser/BrowserAwareProxySelectorTest.java0000644000175000002070000002072713441742745033552 0ustar00jvanekmock00000000000000/* BrowserAwareProxySelectorTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browser; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.Proxy.Type; import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPProxySelector; import org.junit.Before; import org.junit.Test; public class BrowserAwareProxySelectorTest { static class TestBrowserAwareProxySelector extends BrowserAwareProxySelector { private final Map browserPrefs; public TestBrowserAwareProxySelector(DeploymentConfiguration config, Map browserPrefs) { super(config); this.browserPrefs = browserPrefs; } @Override protected Map parseBrowserPreferences() throws IOException { return browserPrefs; } } private static final String PROXY_HOST = "foo"; private static final int PROXY_PORT = 42; private static final InetSocketAddress PROXY_ADDRESS = new InetSocketAddress(PROXY_HOST, PROXY_PORT); private DeploymentConfiguration config; private Map browserPrefs; @Before public void setUp() { config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_BROWSER)); browserPrefs = new HashMap(); } @Test public void testNoBrowserProxy() throws URISyntaxException { browserPrefs.put("network.proxy.type", "0" /* none */); List result = getProxy(config, browserPrefs, new URI("https://example.org")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } @Test public void testBrowserManualSameProxy() throws URISyntaxException { browserPrefs.put("network.proxy.type", "1" /* = manual */); browserPrefs.put("network.proxy.share_proxy_settings", "true"); browserPrefs.put("network.proxy.http", PROXY_HOST); browserPrefs.put("network.proxy.http_port", String.valueOf(PROXY_PORT)); List result; result = getProxy(config, browserPrefs, new URI("https://example.org")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.HTTP, PROXY_ADDRESS), result.get(0)); result = getProxy(config, browserPrefs, new URI("socket://example.org")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.SOCKS, PROXY_ADDRESS), result.get(0)); } @Test public void testBrowserManualHttpsProxy() throws URISyntaxException { browserPrefs.put("network.proxy.type", "1" /* = manual */); browserPrefs.put("network.proxy.ssl", PROXY_HOST); browserPrefs.put("network.proxy.ssl_port", String.valueOf(PROXY_PORT)); List result = getProxy(config, browserPrefs, new URI("https://example.org")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.HTTP, PROXY_ADDRESS), result.get(0)); } @Test public void testBrowserManualHttpProxy() throws URISyntaxException { browserPrefs.put("network.proxy.type", "1" /* = manual */); browserPrefs.put("network.proxy.http", PROXY_HOST); browserPrefs.put("network.proxy.http_port", String.valueOf(PROXY_PORT)); List result = getProxy(config, browserPrefs, new URI("http://example.org")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.HTTP, PROXY_ADDRESS), result.get(0)); } @Test public void testBrowserManualFtpProxy() throws URISyntaxException { browserPrefs.put("network.proxy.type", "1" /* = manual */); browserPrefs.put("network.proxy.ftp", PROXY_HOST); browserPrefs.put("network.proxy.ftp_port", String.valueOf(PROXY_PORT)); List result = getProxy(config, browserPrefs, new URI("ftp://example.org")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.HTTP, PROXY_ADDRESS), result.get(0)); } @Test public void testBrowserManualSocksProxy() throws URISyntaxException { browserPrefs.put("network.proxy.type", "1" /* = manual */); browserPrefs.put("network.proxy.socks", PROXY_HOST); browserPrefs.put("network.proxy.socks_port", String.valueOf(PROXY_PORT)); List result = getProxy(config, browserPrefs, new URI("socket://example.org")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.SOCKS, PROXY_ADDRESS), result.get(0)); } @Test public void testBrowserManualHttpProxyFallsBackToSocksProxy() throws URISyntaxException { browserPrefs.put("network.proxy.type", "1" /* = manual */); browserPrefs.put("network.proxy.socks", PROXY_HOST); browserPrefs.put("network.proxy.socks_port", String.valueOf(PROXY_PORT)); List result = getProxy(config, browserPrefs, new URI("http://example.org")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.SOCKS, PROXY_ADDRESS), result.get(0)); } @Test public void testBrowserManualProxyUnknownProtocol() throws URISyntaxException { browserPrefs.put("network.proxy.type", "1" /* = manual */); List result = getProxy(config, browserPrefs, new URI("gopher://example.org")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } @Test public void testBrowserAutoProxyUnimplemented() throws URISyntaxException { browserPrefs.put("network.proxy.type", "4" /* = auto */); List result = getProxy(config, browserPrefs, new URI("http://example.org")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } @Test public void testBrowserSystemProxyUnimplemented() throws URISyntaxException { browserPrefs.put("network.proxy.type", "5" /* = system */); List result = getProxy(config, browserPrefs, new URI("http://example.org")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } @Test public void testBrowserPacProxyUnimplemented() throws URISyntaxException { browserPrefs.put("network.proxy.type", "2" /* = pac */); List result = getProxy(config, browserPrefs, new URI("http://example.org")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } private static List getProxy(DeploymentConfiguration config, Map browserPrefs, URI uri) { BrowserAwareProxySelector selector = new TestBrowserAwareProxySelector(config, browserPrefs); selector.initialize(); return selector.getFromBrowser(uri); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/PluginBridgeTest.java0000644000000000000000000000013113441742745026453 xustar0030 mtime=1552401893.093832711 30 atime=1552402157.258253434 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java0000644000175000002070000005765313441742745027304 0ustar00jvanekmock00000000000000/* * Copyright 2012 Red Hat, Inc. * This file is part of IcedTea, http://icedtea.classpath.org * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sourceforge.jnlp; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.List; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import net.sourceforge.jnlp.util.replacements.BASE64Encoder; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class PluginBridgeTest extends NoStdOutErrTest{ private class MockJNLPCreator extends JNLPCreator { private URL JNLPHref; public URL getJNLPHref() { return JNLPHref; } @Override public JNLPFile create(URL location, Version version, ParserSettings settings, UpdatePolicy policy, URL forceCodebase) throws IOException, ParseException { JNLPHref = location; return new MockJNLPFile(); } } private class MockJNLPFile extends JNLPFile { @Override public AppletDesc getApplet() { return new AppletDesc(null, null, null, 0, 0, new HashMap()); } @Override public ResourcesDesc getResources() { return new ResourcesDesc(null, null, null, null); } } static private PluginParameters createValidParamObject() { Map params = new HashMap<>(); params.put("code", ""); // Avoids an exception being thrown return new PluginParameters(params); } private static String originalCacheDir; @BeforeClass public static void setup() { originalCacheDir = PathsAndFiles.CACHE_DIR.getFullPath(); PathsAndFiles.CACHE_DIR.setValue(System.getProperty("java.io.tmpdir") + File.separator + "tempcache"); } @AfterClass public static void teardown() { CacheUtil.clearCache(); PathsAndFiles.CACHE_DIR.setValue(originalCacheDir); } @Test public void testAbsoluteJNLPHref() throws MalformedURLException, Exception { URL codeBase = new URL("http://undesired.absolute.codebase.com"); String absoluteLocation = "http://absolute.href.com/test.jnlp"; PluginParameters params = createValidParamObject(); params.put("jnlp_href", absoluteLocation); MockJNLPCreator mockCreator = new MockJNLPCreator(); PluginBridge pb = new PluginBridge(codeBase, null, "", "", 0, 0, params, mockCreator); assertEquals(absoluteLocation, mockCreator.getJNLPHref().toExternalForm()); } @Test public void testRelativeJNLPHref() throws MalformedURLException, Exception { URL codeBase = new URL("http://desired.absolute.codebase.com/"); String relativeLocation = "sub/dir/test.jnlp"; PluginParameters params = createValidParamObject(); params.put("jnlp_href", relativeLocation); MockJNLPCreator mockCreator = new MockJNLPCreator(); PluginBridge pb = new PluginBridge(codeBase, null, "", "", 0, 0, params, mockCreator); assertEquals(codeBase.toExternalForm() + relativeLocation, mockCreator.getJNLPHref().toExternalForm()); } @Test public void testNoSubDirInCodeBase() throws MalformedURLException, Exception { String desiredDomain = "http://desired.absolute.codebase.com"; URL codeBase = new URL(desiredDomain + "/undesired/sub/dir"); String relativeLocation = "/app/test/test.jnlp"; PluginParameters params = createValidParamObject(); params.put("jnlp_href", relativeLocation); MockJNLPCreator mockCreator = new MockJNLPCreator(); PluginBridge pb = new PluginBridge(codeBase, null, "", "", 0, 0, params, mockCreator); assertEquals(desiredDomain + relativeLocation, mockCreator.getJNLPHref().toExternalForm()); } @Test public void testGetRequestedPermissionLevel() throws MalformedURLException, Exception { String desiredDomain = "http://desired.absolute.codebase.com"; URL codeBase = new URL(desiredDomain + "/undesired/sub/dir"); String relativeLocation = "/app/test/test.jnlp"; PluginParameters params = createValidParamObject(); params.put("jnlp_href", relativeLocation); MockJNLPCreator mockCreator = new MockJNLPCreator(); PluginBridge pb = new PluginBridge(codeBase, null, "", "", 0, 0, params, mockCreator); assertEquals(pb.getRequestedPermissionLevel(), SecurityDesc.RequestedPermissionLevel.NONE); params.put(SecurityDesc.RequestedPermissionLevel.PERMISSIONS_NAME,SecurityDesc.RequestedPermissionLevel.ALL.toHtmlString()); pb = new PluginBridge(codeBase, null, "", "", 0, 0, params, mockCreator); assertEquals(pb.getRequestedPermissionLevel(), SecurityDesc.RequestedPermissionLevel.ALL); //unknown for applets! params.put(SecurityDesc.RequestedPermissionLevel.PERMISSIONS_NAME, SecurityDesc.RequestedPermissionLevel.J2EE.toJnlpString()); pb = new PluginBridge(codeBase, null, "", "", 0, 0, params, mockCreator); assertEquals(pb.getRequestedPermissionLevel(), SecurityDesc.RequestedPermissionLevel.NONE); params.put(SecurityDesc.RequestedPermissionLevel.PERMISSIONS_NAME, SecurityDesc.RequestedPermissionLevel.SANDBOX.toHtmlString()); pb = new PluginBridge(codeBase, null, "", "", 0, 0, params, mockCreator); assertEquals(pb.getRequestedPermissionLevel(), SecurityDesc.RequestedPermissionLevel.SANDBOX); params.put(SecurityDesc.RequestedPermissionLevel.PERMISSIONS_NAME, SecurityDesc.RequestedPermissionLevel.DEFAULT.toHtmlString()); pb = new PluginBridge(codeBase, null, "", "", 0, 0, params, mockCreator); assertEquals(pb.getRequestedPermissionLevel(), SecurityDesc.RequestedPermissionLevel.NONE); } @Test public void testBase64StringDecoding() throws Exception { String actualFile = "This is a sample string that will be encoded to" + "a Base64 string and then decoded using PluginBridge's" + "decoding method and compared."; BASE64Encoder encoder = new BASE64Encoder(); String encodedFile = encoder.encodeBuffer(actualFile.getBytes()); byte[] decodedBytes = PluginBridge.decodeBase64String(encodedFile); String decodedString = new String(decodedBytes); Assert.assertEquals(actualFile, decodedString); } @Test public void testEmbeddedJnlpWithValidCodebase() throws Exception { URL codeBase = new URL("http://icedtea.classpath.org"); String relativeLocation = "/EmbeddedJnlpFile.jnlp"; //Codebase within jnlp file is VALID /** Sample Test RedHat **/ String jnlpFileEncoded = "ICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCiAgICAgICAgICAgIDxqbmxwIHNwZWM9IjEu" + "NSsiIA0KICAgICAgICAgICAgICBocmVmPSJFbWJlZGRlZEpubHBGaWxlLmpubHAiIA0KICAgICAg" + "ICAgICAgICBjb2RlYmFzZT0iaHR0cDovL3d3dy5yZWRoYXQuY29tIiAgICANCiAgICAgICAgICAg" + "ID4NCg0KICAgICAgICAgICAgPGluZm9ybWF0aW9uPg0KICAgICAgICAgICAgICAgIDx0aXRsZT5T" + "YW1wbGUgVGVzdDwvdGl0bGU+DQogICAgICAgICAgICAgICAgPHZlbmRvcj5SZWRIYXQ8L3ZlbmRv" + "cj4NCiAgICAgICAgICAgICAgICA8b2ZmbGluZS1hbGxvd2VkLz4NCiAgICAgICAgICAgIDwvaW5m" + "b3JtYXRpb24+DQoNCiAgICAgICAgICAgIDxyZXNvdXJjZXM+DQogICAgICAgICAgICAgICAgPGoy" + "c2UgdmVyc2lvbj0nMS42KycgLz4NCiAgICAgICAgICAgICAgICA8amFyIGhyZWY9J0VtYmVkZGVk" + "Sm5scEphck9uZS5qYXInIG1haW49J3RydWUnIC8+DQogICAgICAgICAgICAgICAgPGphciBocmVm" + "PSdFbWJlZGRlZEpubHBKYXJUd28uamFyJyBtYWluPSd0cnVlJyAvPg0KICAgICAgICAgICAgPC9y" + "ZXNvdXJjZXM+DQoNCiAgICAgICAgICAgIDxhcHBsZXQtZGVzYw0KICAgICAgICAgICAgICAgIGRv" + "Y3VtZW50QmFzZT0iLiINCiAgICAgICAgICAgICAgICBuYW1lPSJyZWRoYXQuZW1iZWRkZWRqbmxw" + "Ig0KICAgICAgICAgICAgICAgIG1haW4tY2xhc3M9InJlZGhhdC5lbWJlZGRlZGpubHAiDQogICAg" + "ICAgICAgICAgICAgd2lkdGg9IjAiDQogICAgICAgICAgICAgICAgaGVpZ2h0PSIwIg0KICAgICAg" + "ICAgICAgLz4NCiAgICAgICAgICAgIDwvam5scD4="; MockJNLPCreator mockCreator = new MockJNLPCreator(); PluginParameters params = createValidParamObject(); params.put("jnlp_href", relativeLocation); params.put("jnlp_embedded", jnlpFileEncoded); String jnlpCodebase = "http://www.redhat.com"; PluginBridge pb = new PluginBridge(codeBase, null, "", "", 0, 0, params, mockCreator); JARDesc[] jars = pb.getResources().getJARs(); //Check if there are two jars cached Assert.assertTrue(jars.length == 2); //Resource can be in any order List resourceLocations = new ArrayList<>(); resourceLocations.add(jars[0].getLocation().toExternalForm()); resourceLocations.add(jars[1].getLocation().toExternalForm()); //Check URLs of jars Assert.assertTrue(resourceLocations.contains(jnlpCodebase + "/EmbeddedJnlpJarOne.jar")); Assert.assertTrue((resourceLocations.contains(jnlpCodebase + "/EmbeddedJnlpJarTwo.jar"))); } @Test //http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/applet/codebase_determination.html //example 3 public void testEmbeddedJnlpWithInvalidCodebase() throws Exception { URL overwrittenCodebase = new URL("http://icedtea.classpath.org"); String relativeLocation = "/EmbeddedJnlpFile.jnlp"; //Codebase within jnlp file is INVALID /** Sample Test RedHat **/ String jnlpFileEncoded = "ICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCiAgICAgICAgICAgIDxqbmxwIHNwZWM9IjEu" + "NSsiIA0KICAgICAgICAgICAgICBocmVmPSJFbWJlZGRlZEpubHBGaWxlLmpubHAiIA0KICAgICAg" + "ICAgICAgICBjb2RlYmFzZT0iaW52YWxpZFBhdGgiICAgIA0KICAgICAgICAgICAgPg0KDQogICAg" + "ICAgICAgICA8aW5mb3JtYXRpb24+DQogICAgICAgICAgICAgICAgPHRpdGxlPlNhbXBsZSBUZXN0" + "PC90aXRsZT4NCiAgICAgICAgICAgICAgICA8dmVuZG9yPlJlZEhhdDwvdmVuZG9yPg0KICAgICAg" + "ICAgICAgICAgIDxvZmZsaW5lLWFsbG93ZWQvPg0KICAgICAgICAgICAgPC9pbmZvcm1hdGlvbj4N" + "Cg0KICAgICAgICAgICAgPHJlc291cmNlcz4NCiAgICAgICAgICAgICAgICA8ajJzZSB2ZXJzaW9u" + "PScxLjYrJyAvPg0KICAgICAgICAgICAgICAgIDxqYXIgaHJlZj0nRW1iZWRkZWRKbmxwSmFyT25l" + "LmphcicgbWFpbj0ndHJ1ZScgLz4NCiAgICAgICAgICAgICAgICA8amFyIGhyZWY9J0VtYmVkZGVk" + "Sm5scEphclR3by5qYXInIG1haW49J3RydWUnIC8+DQogICAgICAgICAgICA8L3Jlc291cmNlcz4N" + "Cg0KICAgICAgICAgICAgPGFwcGxldC1kZXNjDQogICAgICAgICAgICAgICAgZG9jdW1lbnRCYXNl" + "PSIuIg0KICAgICAgICAgICAgICAgIG5hbWU9InJlZGhhdC5lbWJlZGRlZGpubHAiDQogICAgICAg" + "ICAgICAgICAgbWFpbi1jbGFzcz0icmVkaGF0LmVtYmVkZGVkam5scCINCiAgICAgICAgICAgICAg" + "ICB3aWR0aD0iMCINCiAgICAgICAgICAgICAgICBoZWlnaHQ9IjAiDQogICAgICAgICAgICAvPg0K" + "ICAgICAgICAgICAgPC9qbmxwPg=="; MockJNLPCreator mockCreator = new MockJNLPCreator(); PluginParameters params = createValidParamObject(); params.put("jnlp_href", relativeLocation); params.put("jnlp_embedded", jnlpFileEncoded); PluginBridge pb = new PluginBridge(overwrittenCodebase, null, "", "", 0, 0, params, mockCreator); JARDesc[] jars = pb.getResources().getJARs(); //Check if there are two jars cached Assert.assertTrue(jars.length == 2); //Resource can be in any order List resourceLocations = new ArrayList<>(); resourceLocations.add(jars[0].getLocation().toExternalForm()); resourceLocations.add(jars[1].getLocation().toExternalForm()); //Check URLs of jars Assert.assertTrue(resourceLocations.contains(overwrittenCodebase + "/EmbeddedJnlpJarOne.jar")); Assert.assertTrue((resourceLocations.contains(overwrittenCodebase + "/EmbeddedJnlpJarTwo.jar"))); } @Test public void testInvalidEmbeddedJnlp() throws Exception { URL overwrittenCodebase = new URL("http://icedtea.classpath.org"); String relativeLocation = "/EmbeddedJnlpFile.jnlp"; //Embedded jnlp is invalid String jnlpFileEncoded = "thisContextIsInvalid"; MockJNLPCreator mockCreator = new MockJNLPCreator(); PluginParameters params = createValidParamObject(); params.put("jnlp_href", relativeLocation); params.put("jnlp_embedded", jnlpFileEncoded); try { new PluginBridge(overwrittenCodebase, null, "", "", 0, 0, params, mockCreator); } catch (Exception e) { return; } Assert.fail("PluginBridge was successfully created with an invalid embedded jnlp value"); } @Test public void stripClassNoClass() throws Exception { Assert.assertEquals("blah.class.someclass", PluginBridge.strippClass("blah.class.someclass")); } @Test public void stripClassClass() throws Exception { Assert.assertEquals("blah.class.someclass", PluginBridge.strippClass("blah.class.someclass.class")); } private static final String CV="cbVal"; private static String fixCommonIssues(String input, boolean needsSecurity) { return PluginBridge.fixCommonIsuses(needsSecurity, input, CV, "titTets", "ventest"); } ; public static int countOccurences(String str, String findStr) { int lastIndex = 0; int count = 0; while (lastIndex != -1) { lastIndex = str.indexOf(findStr, lastIndex); if (lastIndex != -1) { count++; lastIndex += findStr.length(); } } return count; } private void checkIssuesFixed(String input, boolean security, boolean defaultCB) { assertEquals(1, countOccurences(input, "")); assertEquals(1, countOccurences(input, "")); } ; @Test public void testElementMatch() throws Exception { Assert.assertTrue("".matches(PluginBridge.toMatcher(PluginBridge.SANDBOX_REGEX))); Assert.assertTrue(" < sandbox > ".matches(PluginBridge.toMatcher(PluginBridge.SANDBOX_REGEX))); Assert.assertTrue(" < sandbox > \n".matches(PluginBridge.toMatcher(PluginBridge.SANDBOX_REGEX))); Assert.assertTrue("\n < SANDBOX > \n".matches(PluginBridge.toMatcher(PluginBridge.SANDBOX_REGEX))); Assert.assertEquals(" XX ", " < sAnDbOx > ".replaceAll(PluginBridge.SANDBOX_REGEX,"XX")); Assert.assertEquals(" A \n XX \n B ", " A \n \n B ".replaceAll(PluginBridge.SANDBOX_REGEX,"XX")); } @Test public void testClosingElementMatch() throws Exception { Assert.assertTrue("".matches(PluginBridge.toMatcher(PluginBridge.CLOSE_INFORMATION_REGEX))); Assert.assertTrue(" < /information > ".matches(PluginBridge.toMatcher(PluginBridge.CLOSE_INFORMATION_REGEX))); Assert.assertTrue(" < / information > \n".matches(PluginBridge.toMatcher(PluginBridge.CLOSE_INFORMATION_REGEX))); Assert.assertTrue("\n \n".matches(PluginBridge.toMatcher(PluginBridge.CLOSE_INFORMATION_REGEX))); Assert.assertEquals(" XX ", " ".replaceAll(PluginBridge.CLOSE_INFORMATION_REGEX,"XX")); Assert.assertEquals(" A \n XX \n B ", " A \n \n B ".replaceAll(PluginBridge.CLOSE_INFORMATION_REGEX,"XX")); } @Test public void testCodeBaseMatches() throws Exception { Assert.assertFalse("zzz codebase zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX1))); Assert.assertTrue("zzz codebase='someVal' zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX1))); Assert.assertTrue("zzz codebase='' \nzzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX1))); Assert.assertTrue("zzz codebase=\"\" zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX1))); Assert.assertTrue("zzz \ncodebase='.' zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX1))); Assert.assertTrue("zzz codebase=\".\" zzz\n".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX1))); Assert.assertTrue("zzz codebase='' zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); Assert.assertTrue("zzz codebase=\"\" zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); Assert.assertTrue("zzz codebase='.' zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); Assert.assertTrue("zzz codebase=\".\" zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); Assert.assertTrue("zzz codebase=\".\">".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); Assert.assertFalse("zzz codebase=\".\"X".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); Assert.assertFalse("zzz codebase='x' zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); Assert.assertFalse("zzz codebase=\"..\" zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); Assert.assertFalse("zzz codebase zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); Assert.assertFalse("zzz codebase='someVal' zzz".matches(PluginBridge.toMatcher(PluginBridge.CODEBASE_REGEX2))); } private static final String jnlpTempalte = " " + " @INFO@ \n" + " @SEC@ \n " + "\n" + " \n " + " \n" + "\n" + "\n" + " \n" + "\n" + " "; private static String prepareTemplate(String codebase, String information, String security ){ return jnlpTempalte.replace("@CB@", codebase).replace("@INFO@", information).replace("@SEC@", security); } @Test public void fixCommonIssuesNothingUnsigned() throws Exception { String source = prepareTemplate("","", ""); String fixed = fixCommonIssues(source, false); checkIssuesFixed(fixed, false, true); } @Test public void fixCommonNothingSigned() throws Exception { String source = prepareTemplate("","", ""); String fixed = fixCommonIssues(source, true); checkIssuesFixed(fixed, true, true); } @Test public void fixCommonIssuesEmptyInformationUnsigned() throws Exception { String source = prepareTemplate("","", ""); String fixed = fixCommonIssues(source, false); checkIssuesFixed(fixed, false, true); } @Test public void fixCommonIssuesEmptyInformationSigned() throws Exception { String source = prepareTemplate("","", ""); String fixed = fixCommonIssues(source, true); checkIssuesFixed(fixed, true, true); } @Test public void fixCommonIssuesInformationUnsigned() throws Exception { String source = prepareTemplate("","blahargh", ""); String fixed = fixCommonIssues(source, false); checkIssuesFixed(fixed, false, true); } @Test public void fixCommonIssuesInformationSigned() throws Exception { String source = prepareTemplate("","blahargh", ""); String fixed = fixCommonIssues(source, true); checkIssuesFixed(fixed, true, true); } @Test public void fixCommonIssuesInformationCodebaseDotUnsigned() throws Exception { String source = prepareTemplate("codebase='.'", "blahargh", ""); String fixed = fixCommonIssues(source, false); checkIssuesFixed(fixed, false, true); } @Test public void fixCommonIssuesInformationCodebaseDotUnsigned2() throws Exception { String source = prepareTemplate("codebase=\"\"", "blahargh", ""); String fixed = fixCommonIssues(source, false); checkIssuesFixed(fixed, false, true); } @Test public void fixCommonIssuesInformationCodebaseSigned() throws Exception { String source = prepareTemplate("codebase='customOne'","blahargh", ""); String fixed = fixCommonIssues(source, true); checkIssuesFixed(fixed, true, false); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/JNLPMatcherTestMallformedAllowe0000644000000000000000000000013113441742745030376 xustar0030 mtime=1552401893.092832712 30 atime=1552402157.258253434 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/JNLPMatcherTestMallformedAllowed.java0000644000175000002070000004024213441742745032275 0ustar00jvanekmock00000000000000/* JNLPMatcherTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Random; import net.sourceforge.jnlp.annotations.KnownToFail; import org.junit.Assert; import org.junit.Test; public class JNLPMatcherTestMallformedAllowed { final String tests[] = JNLPMatcherTest.tests; private final ClassLoader cl = ClassLoader.getSystemClassLoader(); private final boolean MALLFORMED_ALLOWED = true; private InputStream getLaunchReader() { return cl.getResourceAsStream("net/sourceforge/jnlp/launchApp.jnlp"); } @Test @KnownToFail public void testTemplateCDATA() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template0.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[0], true, test.isMatch()); } } @Test public void testTemplateDuplicate() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template1.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[1], true, test.isMatch()); } } @Test public void testTemplateWildCharsRandom() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template2.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[2], true, test.isMatch()); } } @Test public void testTemplateDifferentOrder() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template3.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[3], true, test.isMatch()); } } @Test public void testTemplateWildCharsAsAllValues() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template4.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[4], true, test.isMatch()); } } @Test @KnownToFail public void testTemplateComments() throws JNLPMatcherException, IOException { //heving comment inside element declaration is invalid anyway, so tagsoup can be excused for failing in this case try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template5.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[5], true, test.isMatch()); } } @Test public void testTemplateDifferentValues() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template6.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[6], false, test.isMatch()); } } @Test public void testTemplateExtraChild() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template7.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[7], false, test.isMatch()); } } @Test public void testTemplateFewerChild() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template8.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[8], false, test.isMatch()); } } @Test public void testTemplateDifferentFile() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template9.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[9], false, test.isMatch()); } } @Test @KnownToFail public void testApplicationCDATA() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application0.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[10], true, test.isMatch()); } } @Test public void testApplicationDuplicate() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application1.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[11], true, test.isMatch()); } } @Test public void testApplicationDifferentOrder() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application2.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[12], true, test.isMatch()); } } @Test public void testApplicationComments() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application3.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[13], true, test.isMatch()); } } @Test public void testApplicationWildCharsRandom() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application4.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[14], false, test.isMatch()); } } @Test public void testApplicationDifferentCodebaseValue() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application5.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[15], false, test.isMatch()); } } @Test public void testApplicationExtraChild() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application6.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[16], false, test.isMatch()); } } @Test public void testApplicationFewerChild() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application7.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[17], false, test.isMatch()); } } @Test public void testApplicationDifferentFile() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application8.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[18], false, test.isMatch()); } } @SuppressWarnings("unused") @Test public void testNullJNLPFiles() throws IOException { Exception expectedException = null; InputStream fileStream; try (InputStream launchReader = this.getLaunchReader()) { fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application8.jnlp"); try { JNLPMatcher test = new JNLPMatcher(null, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); } catch (Exception e) { expectedException = e; } Assert.assertEquals( "Checking exception after trying to create an instance with null signed application/template reader", expectedException.getClass().getName(), "net.sourceforge.jnlp.JNLPMatcherException"); try { JNLPMatcher test = new JNLPMatcher(fileStream, null, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); } catch (Exception e) { expectedException = e; } Assert.assertEquals( "Checking exception after trying to create an instance with null launching JNLP file reader", expectedException.getClass().getName(), "net.sourceforge.jnlp.JNLPMatcherException"); try { JNLPMatcher test = new JNLPMatcher(null, null, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); } catch (Exception e) { expectedException = e; } Assert.assertEquals( "Checking exception after trying to create an instance with both readers being null", expectedException.getClass().getName(), "net.sourceforge.jnlp.JNLPMatcherException"); } fileStream.close(); } @Test public void testCallingMatchMultiple() throws JNLPMatcherException, IOException { // Check with application InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application8.jnlp"); JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[19], false, test.isMatch()); Assert.assertEquals(tests[19], false, test.isMatch()); fileStream.close(); launchReader.close(); // Check with template launchReader = this.getLaunchReader(); fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template6.jnlp"); test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[19], false, test.isMatch()); Assert.assertEquals(tests[19], false, test.isMatch()); fileStream.close(); launchReader.close(); } @Test (timeout=5000 /*ms*/) public void testIsMatchDoesNotHangOnLargeData() throws JNLPMatcherException, UnsupportedEncodingException { /* construct an alphabet containing characters 'a' to 'z' */ final int ALPHABET_SIZE = 26; char[] alphabet = new char[ALPHABET_SIZE]; for (int i = 0; i < ALPHABET_SIZE; i++) { alphabet[i] = (char)('a' + i); } /* generate a long but random string using the alphabet */ final Random r = new Random(); final int STRING_SIZE = 1024 * 1024; // 1 MB StringBuilder descriptionBuilder = new StringBuilder(STRING_SIZE); for (int i = 0; i < STRING_SIZE; i++) { descriptionBuilder.append(alphabet[r.nextInt(ALPHABET_SIZE)]); } String longDescription = descriptionBuilder.toString(); String file = "\n" + " \n" + " JNLPMatcher hanges on large file size\n" + " IcedTea\n" + " " + longDescription + "\n" + " \n" + "\n"; InputStream reader1 = new ByteArrayInputStream(file.getBytes("utf-8")); InputStream reader2 = new ByteArrayInputStream(file.getBytes("utf-8")); JNLPMatcher matcher = new JNLPMatcher(reader1, reader2, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertTrue(matcher.isMatch()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/util0000644000000000000000000000013113441742745023275 xustar0030 mtime=1552401893.114832667 30 atime=1552410887.112183445 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/0000755000175000002070000000000013441742745024163 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/XDesktopEntryTest.java0000644000000000000000000000013113441742745027640 xustar0030 mtime=1552401893.086832725 30 atime=1552402157.258253434 29 ctime=1552410887.06718355 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/XDesktopEntryTest.java0000644000175000002070000003673313441742745030465 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import net.sourceforge.jnlp.InformationDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.PluginBridgeTest; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.WindowsIssue; import net.sourceforge.jnlp.mock.DummyJNLPFileWithJar; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.dialogresults.AccessWarningPaneComplexReturn; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class XDesktopEntryTest { private static final String des1 = "/my/little/Desktop"; private static final String des2name = "Plocha"; private static final String des2Res = System.getProperty("user.home") + "/" + des2name; private static final String HOME = "HOME"; private static final String des2 = "$" + HOME + "/" + des2name; private static final String des7 = "\"$" + HOME + "/" + des2name + "\""; private static final String des7res = System.getProperty("user.home") + "/" + des2name; private static final String des8 = "\\\"$" + HOME + "/" + des2name + "\\\""; private static final String des8res = "\"" + System.getProperty("user.home") + "/" + des2name + "\""; private static final String des9 = "\"$" + HOME + "/\\\"" + des2name + "\\\"\""; private static final String des9res = System.getProperty("user.home") + "/\"" + des2name + "\""; private static final String src1 = XDesktopEntry.XDG_DESKTOP_DIR + "=" + des1; private static final String src2 = " " + XDesktopEntry.XDG_DESKTOP_DIR + " = " + des1; private static final String src3 = "#" + XDesktopEntry.XDG_DESKTOP_DIR + " = " + des1; private static final String src4 = XDesktopEntry.XDG_DESKTOP_DIR + "=" + des2; private static final String src5 = " " + XDesktopEntry.XDG_DESKTOP_DIR + " = " + des2; private static final String src6 = "#" + XDesktopEntry.XDG_DESKTOP_DIR + " = " + des2; private static final String src7 = XDesktopEntry.XDG_DESKTOP_DIR + " = " + des7; private static final String src8 = XDesktopEntry.XDG_DESKTOP_DIR + " = " + des8; private static final String src9 = XDesktopEntry.XDG_DESKTOP_DIR + " = " + des9; private static Map backupedEnv; private static boolean wasHtml; private static boolean wasJavaws; @BeforeClass public static void saveJnlpRuntimeHtml() { wasHtml = JNLPRuntime.isHtml(); wasJavaws = JNLPRuntime.isWebstartApplication(); } private static void setIsWebstart(boolean value) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Field field = JNLPRuntime.class.getDeclaredField("isWebstartApplication"); field.setAccessible(true); field.set(null, value); } @After public void restoreJnlpRuntimeHtml() throws Exception { JNLPRuntime.setHtml(wasHtml); setIsWebstart(wasJavaws); } @AfterClass public static void restoreJnlpRuntimeHtmlFinally() throws Exception { JNLPRuntime.setHtml(wasHtml); setIsWebstart(wasJavaws); } @BeforeClass public static void ensureHomeVaribale() throws NoSuchFieldException, IllegalAccessException, IllegalArgumentException, ClassNotFoundException { ServerAccess.logOutputReprint("Environment"); envToString(); Map env = System.getenv(); if (env.containsKey(HOME)) { backupedEnv = null; } else { backupedEnv = env; Map m = new HashMap<>(env); m.put(HOME, System.getProperty("user.home")); fakeEnvironment(m); ServerAccess.logOutputReprint("Hacked environment"); envToString(); } } @AfterClass public static void restoreHomeVaribale() throws NoSuchFieldException, IllegalAccessException, IllegalArgumentException, ClassNotFoundException { Map env = System.getenv(); if (backupedEnv != null) { fakeEnvironment(backupedEnv); ServerAccess.logOutputReprint("Restored environment"); envToString(); } } private static void fakeEnvironment(Map m) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException, ClassNotFoundException { Class processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); Field env = processEnvironmentClass.getDeclaredField("theUnmodifiableEnvironment"); env.setAccessible(true); // remove final modifier from field Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(env, env.getModifiers() & ~Modifier.FINAL); env.set(null, m); } @Test @KnownToFail public void testHomeVariable() { Assert.assertTrue("Variable home must be in environment of this run, is not", System.getenv().containsKey(HOME)); Assert.assertNull("Variable home should be declared before test run, but was not and so is faked. This should be ok and is thrown just for record. See output of ensureHomeVaribale and restoreHomeVaribale", backupedEnv); } @Test public void getFreedesktopOrgDesktopPathFromtestSimple() throws IOException { String s = XDesktopEntry.getFreedesktopOrgDesktopPathFrom(new BufferedReader(new StringReader(src1))); Assert.assertEquals(des1, s); } @Test public void getFreedesktopOrgDesktopPathFromtestSpaced() throws IOException { String s = XDesktopEntry.getFreedesktopOrgDesktopPathFrom(new BufferedReader(new StringReader(src2))); Assert.assertEquals(des1, s); } @Test(expected = IOException.class) public void getFreedesktopOrgDesktopPathFromtestCommented() throws IOException { String s = XDesktopEntry.getFreedesktopOrgDesktopPathFrom(new BufferedReader(new StringReader(src3))); } @Test @WindowsIssue public void getFreedesktopOrgDesktopPathFromtestSimpleWithHome() throws IOException { if (JNLPRuntime.isUnix()) { String s = XDesktopEntry.getFreedesktopOrgDesktopPathFrom(new BufferedReader(new StringReader(src4))); Assert.assertEquals(s, des2Res); } } @Test @WindowsIssue public void getFreedesktopOrgDesktopPathFromtestSpacedWithHome() throws IOException { if (JNLPRuntime.isUnix()) { String s = XDesktopEntry.getFreedesktopOrgDesktopPathFrom(new BufferedReader(new StringReader(src5))); Assert.assertEquals(s, des2Res); } } @Test @WindowsIssue public void getFreedesktopOrgDesktopPathFromtestSpacedWithHomeAndQuotes() throws IOException { if (JNLPRuntime.isUnix()) { String s = XDesktopEntry.getFreedesktopOrgDesktopPathFrom(new BufferedReader(new StringReader(src7))); Assert.assertEquals(s, des7res); } } @Test @WindowsIssue public void getFreedesktopOrgDesktopPathFromtestSpacedWithHomeAndEscapedQuotes() throws IOException { if (JNLPRuntime.isUnix()) { String s = XDesktopEntry.getFreedesktopOrgDesktopPathFrom(new BufferedReader(new StringReader(src8))); Assert.assertEquals(s, des8res); } } @Test @WindowsIssue public void getFreedesktopOrgDesktopPathFromtestSpacedWithHomeAndMixedQuotes() throws IOException { if (JNLPRuntime.isUnix()) { String s = XDesktopEntry.getFreedesktopOrgDesktopPathFrom(new BufferedReader(new StringReader(src9))); Assert.assertEquals(s, des9res); } } @Test(expected = IOException.class) public void getFreedesktopOrgDesktopPathFromtestCommentedWithHome() throws IOException { String s = XDesktopEntry.getFreedesktopOrgDesktopPathFrom(new BufferedReader(new StringReader(src6))); } @Test public void desktopPath() { Assert.assertTrue(XDesktopEntry.getDesktop().getAbsolutePath().startsWith(System.getProperty("user.home")));; } private static void envToString() { mapToString(System.getenv()); } private static void mapToString(Map variables) { Set> env = variables.entrySet(); for (Map.Entry entry : env) { ServerAccess.logOutputReprint(entry.getKey() + " = " + entry.getValue()); } } @Test public void allFilesHaveSameName() throws IOException { JNLPFile jnlpf = new DummyJnlpWithTitle(); XDesktopEntry xde = new XDesktopEntry(jnlpf); File f1 = xde.getShortcutTmpFile(); File f2 = xde.getDesktopIconFile(); File f3 = xde.getLinuxMenuIconFile(); Assert.assertEquals(f1.getName(), f2.getName()); Assert.assertEquals(f2.getName(), f3.getName()); } @Test public void testPosibleFavIConPathparents() throws IOException { List commonResult = new ArrayList<>(); commonResult.add("/best/path/file"); commonResult.add("/best/path"); commonResult.add("/best"); commonResult.add(""); String path = "/best/path/file"; List r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); path = "best/path/file"; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); path = "best/path/file/"; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); path = "/best/path/file/"; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); commonResult = new ArrayList<>(); commonResult.add("/best\\path\\file"); commonResult.add("/best\\path"); commonResult.add("/best"); commonResult.add(""); path = "best\\path\\file"; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); path = "best\\path\\file\\"; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); path = "/best\\path\\file\\"; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); commonResult = new ArrayList<>(); commonResult.add("/"); commonResult.add(""); path = ""; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); commonResult = new ArrayList<>(); commonResult.add("/ "); commonResult.add(""); path = " "; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); commonResult = new ArrayList<>(); commonResult.add("/"); commonResult.add(""); path = "/"; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); commonResult = new ArrayList<>(); commonResult.add("/not/best\\path/file\\path"); commonResult.add("/not/best\\path/file"); commonResult.add("/not/best\\path"); commonResult.add("/not/best"); commonResult.add("/not"); commonResult.add(""); path = "not/best\\path/file\\path"; r = XDesktopEntry.possibleFavIconLocations(path); Assert.assertEquals(r,commonResult); } private void testHtmlOccurences(boolean html, boolean javaws, boolean menu, AccessWarningPaneComplexReturn.ShortcutResult.Shortcut type, int occurences) throws Exception { JNLPRuntime.setHtml(html); setIsWebstart(javaws); JNLPFile jnlpf = new DummyJnlpWithTitle(); XDesktopEntry xde = new XDesktopEntry(jnlpf); AccessWarningPaneComplexReturn.ShortcutResult a = new AccessWarningPaneComplexReturn.ShortcutResult(true); a.setBrowser("blah"); a.setFixHref(false); a.setShortcutType(type); Reader r = xde.getContentsAsReader(menu, a, true); String s = FileUtils.getContentOfReader(r); Assert.assertEquals(occurences, PluginBridgeTest.countOccurences(s, "-html")); } @Test public void htmlSwitchCorrectAccordingToJnlpRuntimeAndShortcutType() throws Exception { AccessWarningPaneComplexReturn.ShortcutResult.Shortcut[] v = AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.values(); for (AccessWarningPaneComplexReturn.ShortcutResult.Shortcut w : v) { int var1 = 0; if (w == AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.JAVAWS_HTML) { var1 = 1; } testHtmlOccurences(true, true, true, w, 1); testHtmlOccurences(true, false, false, w, var1); testHtmlOccurences(true, false, true, w, var1); testHtmlOccurences(true, true, false, w, 1); testHtmlOccurences(false, true, true, w, 0); testHtmlOccurences(false, false, false, w, var1); testHtmlOccurences(false, true, false, w, 0); testHtmlOccurences(false, false, true, w, var1); } } private static class DummyJnlpWithTitle extends DummyJNLPFileWithJar { public DummyJnlpWithTitle() throws MalformedURLException { super(new File("/some/path/blah.jar")); } @Override public InformationDesc getInformation() { return new InformationDesc(null, false) { @Override public String getTitle() { return "Demo App"; } }; } }; } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/ClasspathMatcherTest.java0000644000000000000000000000013213441742745030304 xustar0030 mtime=1552401893.085832727 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/ClasspathMatcherTest.java0000644000175000002070000010014613441742745031116 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import net.sourceforge.jnlp.util.ClasspathMatcher.ClasspathMatchers; import org.junit.Assert; import org.junit.Test; public class ClasspathMatcherTest { @Test public void splitOnFirstTest() { String[] r; r = ClasspathMatcher.splitOnFirst("aa:bb:cc", ":"); Assert.assertEquals("aa", r[0]); Assert.assertEquals("bb:cc", r[1]); r = ClasspathMatcher.splitOnFirst("bb:cc", "b"); Assert.assertEquals("", r[0]); Assert.assertEquals("b:cc", r[1]); r = ClasspathMatcher.splitOnFirst("bb:cc", "c"); Assert.assertEquals("bb:", r[0]); Assert.assertEquals("c", r[1]); r = ClasspathMatcher.splitOnFirst("cc:d", "d"); Assert.assertEquals("cc:", r[0]); Assert.assertEquals("", r[1]); } @Test public void haveProtocolTest() { Assert.assertTrue(ClasspathMatcher.hasProtocol("http://some.correct.url:5050/full/path")); Assert.assertTrue(ClasspathMatcher.hasProtocol("http://some.correct.url:5050")); Assert.assertTrue(ClasspathMatcher.hasProtocol("http://some.correct.url/full/path")); Assert.assertTrue(ClasspathMatcher.hasProtocol("http://some.url/full/path")); Assert.assertTrue(ClasspathMatcher.hasProtocol("http://some:5050/full/path")); Assert.assertTrue(ClasspathMatcher.hasProtocol("http://some")); Assert.assertTrue(ClasspathMatcher.hasProtocol("http://aa.cz")); Assert.assertFalse(ClasspathMatcher.hasProtocol("some.correct.url:5050/full/path")); Assert.assertFalse(ClasspathMatcher.hasProtocol("some.correct.url/full/path")); Assert.assertFalse(ClasspathMatcher.hasProtocol("some.correct.url")); //traps Assert.assertFalse(ClasspathMatcher.hasProtocol("httpsome.correct.url:5050://full/path")); Assert.assertFalse(ClasspathMatcher.hasProtocol("httpsome.corr://ect.url:5050/full/path")); Assert.assertFalse(ClasspathMatcher.hasProtocol("httpsome.corr://ect.url")); Assert.assertFalse(ClasspathMatcher.hasProtocol("httpsome/ful://l/path")); } @Test public void extractProtocolTest() { Assert.assertEquals("http", ClasspathMatcher.extractProtocol("http://some.correct.url:5050/full/path")); Assert.assertEquals("http", ClasspathMatcher.extractProtocol("http://some.correct.url:5050")); Assert.assertEquals("http", ClasspathMatcher.extractProtocol("http://some.correct.url/full/path")); Assert.assertEquals("http", ClasspathMatcher.extractProtocol("http://some.url/full/path")); Assert.assertEquals("http", ClasspathMatcher.extractProtocol("http://some:5050/full/path")); Assert.assertEquals("http", ClasspathMatcher.extractProtocol("http://some")); //no :// at all Exception ex = null; try { ClasspathMatcher.extractProtocol("some.correct.url:5050/full/path"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); ex = null; try { ClasspathMatcher.extractProtocol("some.correct.url/full/path"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); ex = null; try { ClasspathMatcher.extractProtocol("some.correct.url"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); //wrongly palced :// - is catched by hasProtocol Assert.assertFalse("http".equals(ClasspathMatcher.extractProtocol("httpsome.correct.url:5050://full/path"))); Assert.assertFalse("http".equals(ClasspathMatcher.extractProtocol("httpsome.corr://ect.url:5050/full/path"))); Assert.assertFalse("http".equals(ClasspathMatcher.extractProtocol("httpsome.corr://ect.url"))); Assert.assertFalse("http".equals(ClasspathMatcher.extractProtocol("httpsome/ful://l/path"))); } @Test public void removeProtocolTest() { Assert.assertEquals("some.correct.url:5050/full/path", ClasspathMatcher.removeProtocol("http://some.correct.url:5050/full/path")); Assert.assertEquals("some.correct.url/full/path", ClasspathMatcher.removeProtocol("http://some.correct.url/full/path")); Assert.assertEquals("some.url/full/path", ClasspathMatcher.removeProtocol("http://some.url/full/path")); Assert.assertEquals("some:5050/full/path", ClasspathMatcher.removeProtocol("http://some:5050/full/path")); Assert.assertEquals("some", ClasspathMatcher.removeProtocol("http://some")); //no :// at all Exception ex = null; try { ClasspathMatcher.removeProtocol("some.correct.url:5050/full/path"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); ex = null; try { ClasspathMatcher.removeProtocol("some.correct.url/full/path"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); ex = null; try { ClasspathMatcher.removeProtocol("some.correct.url"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); //wrongly palced :// - is catched by hasProtocol Assert.assertFalse("some.correct.url:5050://full/path".equals(ClasspathMatcher.removeProtocol("httpsome.correct.url:5050://full/path"))); Assert.assertFalse("some.corr://ect.url:5050/full/path".equals(ClasspathMatcher.removeProtocol("httpsome.corr://ect.url:5050/full/path"))); Assert.assertFalse("some.corr://ect.url".equals(ClasspathMatcher.removeProtocol("httpsome.corr://ect.url"))); Assert.assertFalse("some/ful://l/path".equals(ClasspathMatcher.removeProtocol("httpsome/ful://l/path"))); } @Test public void havePathTest() { Assert.assertTrue(ClasspathMatcher.hasPath("some.correct.url:5050/full/path")); Assert.assertFalse(ClasspathMatcher.hasPath("some.correct.url:5050")); Assert.assertTrue(ClasspathMatcher.hasPath("some.correct.url/full/path")); Assert.assertTrue(ClasspathMatcher.hasPath("some.url/full/path")); Assert.assertTrue(ClasspathMatcher.hasPath("some:5050/full/path")); Assert.assertFalse(ClasspathMatcher.hasPath("some")); //incorrect, but hard to solve Assert.assertTrue(ClasspathMatcher.hasPath("some.correct.url:5050://full/path")); Assert.assertTrue(ClasspathMatcher.hasPath("some.corr://ect.url:5050/full/path")); Assert.assertTrue(ClasspathMatcher.hasPath("some.corr://ect.url")); Assert.assertTrue(ClasspathMatcher.hasPath("some/ful://l/path")); //traps Assert.assertTrue(ClasspathMatcher.hasPath("some.url/full/path/")); Assert.assertTrue(ClasspathMatcher.hasPath("some:5050/full/path/")); Assert.assertTrue(ClasspathMatcher.hasPath("some.url/")); Assert.assertTrue(ClasspathMatcher.hasPath("some:5050/")); Assert.assertFalse(ClasspathMatcher.hasPath("some.url")); Assert.assertFalse(ClasspathMatcher.hasPath("some:5050")); } @Test public void extractPathTest() { Assert.assertEquals("full/path", ClasspathMatcher.extractPath("some.correct.url:5050/full/path")); Exception ex = null; try { ClasspathMatcher.extractPath("some.correct.url:5050"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); ex = null; Assert.assertEquals("full/path", ClasspathMatcher.extractPath("some.correct.url/full/path")); Assert.assertEquals("full/path", ClasspathMatcher.extractPath("some.url/full/path")); Assert.assertEquals("full/path", ClasspathMatcher.extractPath("some:5050/full/path")); try { ClasspathMatcher.extractPath("some"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); ex = null; //correct! Assert.assertEquals("//", ClasspathMatcher.extractPath("some.correct.url:5050///")); //incorrect, but hard to solve Assert.assertEquals("/full/path", ClasspathMatcher.extractPath("some.correct.url:5050://full/path")); Assert.assertEquals("/ect.url:5050/full/path", ClasspathMatcher.extractPath("some.corr://ect.url:5050/full/path")); Assert.assertEquals("/ect.url", ClasspathMatcher.extractPath("some.corr://ect.url")); Assert.assertEquals("ful://l/path", ClasspathMatcher.extractPath("some/ful://l/path")); //traps Assert.assertEquals("full/path/", ClasspathMatcher.extractPath("some.url/full/path/")); Assert.assertEquals("full/path/", ClasspathMatcher.extractPath("some:5050/full/path/")); Assert.assertEquals("", ClasspathMatcher.extractPath("some.url/")); Assert.assertEquals("", ClasspathMatcher.extractPath("some:5050/")); try { ClasspathMatcher.extractPath("some.url"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); ex = null; try { ClasspathMatcher.extractPath("some:5050"); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); } @Test public void splitToPartsTest1() { ClasspathMatcher.Parts p = ClasspathMatcher.splitToParts("*"); Assert.assertEquals("*", p.protocol); Assert.assertEquals("*", p.domain); Assert.assertEquals("*", p.port); Assert.assertEquals("*", p.path); p.compilePartsToPatterns(); } @Test public void splitToPartsTest2() { ClasspathMatcher.Parts p = ClasspathMatcher.splitToParts("https://*.example.com"); Assert.assertEquals("https", p.protocol); Assert.assertEquals("*.example.com", p.domain); Assert.assertEquals("*", p.port); Assert.assertEquals("*", p.path); p.compilePartsToPatterns(); } @Test public void splitToPartsTest3() { ClasspathMatcher.Parts p = ClasspathMatcher.splitToParts("www.example.com"); Assert.assertEquals("*", p.protocol); Assert.assertEquals("www.example.com", p.domain); Assert.assertEquals("*", p.port); Assert.assertEquals("*", p.path); p.compilePartsToPatterns(); } @Test public void splitToPartsTest4() { ClasspathMatcher.Parts p = ClasspathMatcher.splitToParts("www.example.com:8085"); Assert.assertEquals("*", p.protocol); Assert.assertEquals("www.example.com", p.domain); Assert.assertEquals("8085", p.port); Assert.assertEquals("*", p.path); p.compilePartsToPatterns(); } @Test public void splitToPartsTest5() { ClasspathMatcher.Parts p = ClasspathMatcher.splitToParts("*.example.com"); Assert.assertEquals("*", p.protocol); Assert.assertEquals("*.example.com", p.domain); Assert.assertEquals("*", p.port); Assert.assertEquals("*", p.path); p.compilePartsToPatterns(); } @Test public void splitToPartsTest6() { ClasspathMatcher.Parts p = ClasspathMatcher.splitToParts("127.0.0.1"); Assert.assertEquals("*", p.protocol); Assert.assertEquals("127.0.0.1", p.domain); Assert.assertEquals("*", p.port); Assert.assertEquals("*", p.path); p.compilePartsToPatterns(); } @Test public void splitToPartsTest7() { ClasspathMatcher.Parts p = ClasspathMatcher.splitToParts("127.0.0.1:8080"); Assert.assertEquals("*", p.protocol); Assert.assertEquals("127.0.0.1", p.domain); Assert.assertEquals("8080", p.port); Assert.assertEquals("*", p.path); p.compilePartsToPatterns(); } @Test public void splitToPartsTestCorners() { ClasspathMatcher.Parts p1 = ClasspathMatcher.splitToParts("aa://bb.cz:1234/path/x.jnlp"); Assert.assertEquals("aa", p1.protocol); Assert.assertEquals("bb.cz", p1.domain); Assert.assertEquals("1234", p1.port); Assert.assertEquals("path/x.jnlp", p1.path); p1.compilePartsToPatterns(); ClasspathMatcher.Parts p2 = ClasspathMatcher.splitToParts("://*:/"); Assert.assertEquals("", p2.protocol);//yah, protocol, if :// is presented, should be defined Assert.assertEquals("*", p2.domain); Assert.assertEquals("*", p2.port); Assert.assertEquals("*", p2.path); p2.compilePartsToPatterns(); ClasspathMatcher.Parts p3 = ClasspathMatcher.splitToParts("*://*:/:aa//"); Assert.assertEquals("*", p3.protocol); Assert.assertEquals("*", p3.domain); Assert.assertEquals("*", p3.port); Assert.assertEquals(":aa//", p3.path); p3.compilePartsToPatterns(); } @Test public void sourceToRegExStringTest() { Assert.assertEquals(".*", ClasspathMatcher.sourceToRegExString("*")); Assert.assertEquals("^.*\\Q\\E.*$", ClasspathMatcher.sourceToRegExString("**")); Assert.assertEquals("^\\Qabcd\\E$", ClasspathMatcher.sourceToRegExString("abcd")); Assert.assertEquals("^.*\\Qabcd\\E$", ClasspathMatcher.sourceToRegExString("*abcd")); Assert.assertEquals("^\\Qabcd\\E.*$", ClasspathMatcher.sourceToRegExString("abcd*")); } //http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#codebase //examples private static final URL[] urls = { silentUrl("https://a.example.com"), /*0*/ silentUrl("https://a.b.example.com"), silentUrl("http://a.example.com"), silentUrl("http://a.b.example.com"),/*3*/ silentUrl("https://www.example.com"), silentUrl("http://www.example.com "), silentUrl("http://example.com"),/*6*/ silentUrl("http://example.net"), silentUrl("https://www.example.com:8085"), silentUrl("http://www.example.com:8085"),/*9*/ silentUrl("http://www.example.com"), silentUrl("https://a.example.com"), silentUrl("http://a.example.com"),/*12*/ silentUrl("https://a.b.example.com"), silentUrl("http://a.b.example.com"), silentUrl("https://example.com"),/*15*/ silentUrl("http://example.com"), silentUrl("http://example.net"), silentUrl("http://127.0.0.1"),/*18*/ silentUrl("http://127.0.0.1:8080"), silentUrl("http://127.0.0.1:80"), silentUrl("http://localhost"),/*21*/ silentUrl("http://127.0.0.1:8080"), silentUrl("http://127.0.0.1"), silentUrl("http://127.0.0.1:80 ")/*24*/}; private static URL silentUrl(String s) { try { return new URL(s); } catch (MalformedURLException e) { throw new RuntimeException(e); } } @Test public void matchTest1() throws MalformedURLException { ClasspathMatcher p = ClasspathMatcher.compile("*"); Assert.assertTrue(p.match(new URL("http://any.strange/url/path"))); for (URL url : urls) { Assert.assertTrue(p.match(url)); } } @Test public void matchTest2() throws MalformedURLException { ClasspathMatcher p = ClasspathMatcher.compile("https://*.example.com"); Assert.assertTrue(p.match(urls[0])); Assert.assertTrue(p.match(urls[1])); Assert.assertFalse(p.match(urls[2])); Assert.assertFalse(p.match(urls[3])); } @Test public void matchTest3() throws MalformedURLException { ClasspathMatcher p = ClasspathMatcher.compile("www.example.com"); Assert.assertTrue(p.match(urls[4])); Assert.assertTrue(p.match(urls[5])); Assert.assertFalse(p.match(urls[6])); Assert.assertFalse(p.match(urls[7])); } @Test public void matchTest4() throws MalformedURLException { ClasspathMatcher p = ClasspathMatcher.compile("www.example.com:8085"); Assert.assertTrue(p.match(urls[8])); Assert.assertTrue(p.match(urls[9])); Assert.assertFalse(p.match(urls[10])); } @Test public void matchTest5() throws MalformedURLException { ClasspathMatcher p = ClasspathMatcher.compile("*.example.com"); Assert.assertTrue(p.match(urls[11])); Assert.assertTrue(p.match(urls[12])); Assert.assertTrue(p.match(urls[13])); Assert.assertTrue(p.match(urls[14])); //those represent the "dot" issue Assert.assertTrue(p.match(urls[15])); Assert.assertTrue(p.match(urls[16])); Assert.assertFalse(p.match(urls[17])); //reasons for alowing "dot" issue Assert.assertTrue(p.match(new URL("http://www.example.com"))); Assert.assertTrue(p.match(new URL("http://example.com"))); //reason for restricting dost issue Assert.assertFalse(p.match(new URL("http://aaaexample.com"))); } @Test public void wildCardSubdomainDoesNotMatchParentDomainPaths() throws MalformedURLException { ClasspathMatchers p1 = ClasspathMatchers.compile("*.example.com*/*.abc.cde*", true); Assert.assertFalse(p1.matches(new URL("http://aaaexample.com/xyz.abc.cde"))); Assert.assertTrue(p1.matches(new URL("http://www.example.com/.abc.cde"))); Assert.assertTrue(p1.matches(new URL("http://www.example.com/xyz.abc.cde"))); Assert.assertFalse(p1.matches(new URL("http://www.example.com/abc.cde"))); Assert.assertTrue(p1.matches(new URL("http://example.com/xyz.abc.cdeefg"))); Assert.assertTrue(p1.matches(new URL("http://example.com/xyz.abc.cde.efg"))); Assert.assertFalse(p1.matches(new URL("http://example.com/abc.cde.efg"))); Assert.assertFalse(p1.matches(new URL("http://example.com"))); ClasspathMatchers p = ClasspathMatchers.compile("*.example.com*/*.abc.cde*", false); Assert.assertFalse(p.matches(new URL("http://aaaexample.com/xyz.abc.cde"))); Assert.assertTrue(p.matches(new URL("http://www.example.com/.abc.cde"))); Assert.assertTrue(p.matches(new URL("http://www.example.com/xyz.abc.cde"))); Assert.assertTrue(p.matches(new URL("http://www.example.com/abc.cde"))); Assert.assertTrue(p.matches(new URL("http://example.com/xyz.abc.cdeefg"))); Assert.assertTrue(p.matches(new URL("http://example.com/xyz.abc.cde.efg"))); Assert.assertTrue(p.matches(new URL("http://example.com/abc.cde.efg"))); Assert.assertTrue(p.matches(new URL("http://example.com"))); } @Test public void matchTest6() throws MalformedURLException { ClasspathMatcher p = ClasspathMatcher.compile("127.0.0.1"); Assert.assertTrue(p.match(urls[18])); Assert.assertTrue(p.match(urls[19])); Assert.assertTrue(p.match(urls[20])); Assert.assertFalse(p.match(urls[21])); } @Test public void matchTest7() throws MalformedURLException { ClasspathMatcher p = ClasspathMatcher.compile("127.0.0.1:8080"); Assert.assertTrue(p.match(urls[22])); Assert.assertFalse(p.match(urls[23])); Assert.assertFalse(p.match(urls[24])); } //nasty url tests @Test public void googleQueryTest() throws MalformedURLException { String googleQuery = "https://www.google.cz/search?q=icdtea+web&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a#q=icedtea+web&rls=org.mozilla:en-US:official&safe=off"; ClasspathMatcher.Parts p = ClasspathMatcher.splitToParts(googleQuery); Assert.assertEquals("https", p.protocol); Assert.assertEquals("www.google.cz", p.domain); Assert.assertEquals("*", p.port); Assert.assertEquals("search?q=icdtea+web&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a#q=icedtea+web&rls=org.mozilla:en-US:official&safe=off", p.path); ClasspathMatcher cm = ClasspathMatcher.compile(googleQuery); Assert.assertTrue(cm.match(new URL("https://www.google.cz:5050"))); Assert.assertFalse(cm.match(new URL("https://google.cz:5050"))); Assert.assertFalse(cm.match(new URL("http://www.google.cz:5050"))); Assert.assertTrue(cm.match(new URL("https://www.google.cz"))); } @Test public void gitHubQueryTest() throws MalformedURLException { String gitHubQuery = "https://github.com/user-user/what-1.2.3-an-hell/commit/b8ee66ad265002c51f86152e06fbe2e6124b62a3#diff-36dcc9a4b486abb6bffe062260d6d82dR626"; ClasspathMatcher.Parts p = ClasspathMatcher.splitToParts(gitHubQuery); Assert.assertEquals("https", p.protocol); Assert.assertEquals("github.com", p.domain); Assert.assertEquals("*", p.port); Assert.assertEquals("user-user/what-1.2.3-an-hell/commit/b8ee66ad265002c51f86152e06fbe2e6124b62a3#diff-36dcc9a4b486abb6bffe062260d6d82dR626", p.path); ClasspathMatcher cm = ClasspathMatcher.compile(gitHubQuery); Assert.assertTrue(cm.match(new URL("https://github.com:0123"))); Assert.assertFalse(cm.match(new URL("https://www.github.com"))); Assert.assertFalse(cm.match(new URL("http://github.com"))); Assert.assertTrue(cm.match(new URL("https://github.com"))); } @Test public void doubleSlashesTests() throws MalformedURLException { String s1 = "http://some.url//weird/path"; ClasspathMatcher.Parts p1 = ClasspathMatcher.splitToParts(s1); Assert.assertEquals("http", p1.protocol); Assert.assertEquals("some.url", p1.domain); Assert.assertEquals("*", p1.port); Assert.assertEquals("/weird/path", p1.path); ClasspathMatcher cm1 = ClasspathMatcher.compile(s1); Assert.assertTrue(cm1.match(new URL("http://some.url//weird/path"))); Assert.assertTrue(cm1.matchWithPath(new URL("http://some.url//weird/path"))); //path is not ocunted Assert.assertTrue(cm1.match(new URL("http://some.url/weird/path"))); Assert.assertFalse(cm1.matchWithPath(new URL("http://some.url/weird/path"))); String s2 = "https://some.url/weird//path/"; ClasspathMatcher.Parts p2 = ClasspathMatcher.splitToParts(s2); Assert.assertEquals("https", p2.protocol); Assert.assertEquals("some.url", p2.domain); Assert.assertEquals("*", p2.port); Assert.assertEquals("weird//path/", p2.path); } //total trap url @Test public void madUrls() throws MalformedURLException { String trapUrl1 = "*://:&:://%%20"; ClasspathMatcher.Parts p1 = ClasspathMatcher.splitToParts(trapUrl1); Assert.assertEquals("*", p1.protocol); Assert.assertEquals("", p1.domain); Assert.assertEquals("&::", p1.port); Assert.assertEquals("/%%20", p1.path); ClasspathMatcher cm1 = ClasspathMatcher.compile(trapUrl1); //no valid url can match this Assert.assertFalse(cm1.match(new URL("ftp://:0//whatever"))); Assert.assertFalse(cm1.matchWithPath(new URL("ftp://:0//%%20"))); String trapUrl2 = "*://:0//%%20"; ClasspathMatcher.Parts p2 = ClasspathMatcher.splitToParts(trapUrl2); Assert.assertEquals("*", p2.protocol); Assert.assertEquals("", p2.domain); Assert.assertEquals("0", p2.port); Assert.assertEquals("/%%20", p2.path); ClasspathMatcher cm2 = ClasspathMatcher.compile(trapUrl2); Assert.assertTrue(cm2.match(new URL("ftp://:0//whatever"))); Assert.assertFalse(cm2.matchWithPath(new URL("ftp://:0//whatever"))); Assert.assertTrue(cm2.matchWithPath(new URL("ftp://:0//%%20"))); String trapUrl3 = ":0//%%20"; ClasspathMatcher.Parts p3 = ClasspathMatcher.splitToParts(trapUrl3); Assert.assertEquals("*", p3.protocol); Assert.assertEquals("", p3.domain); Assert.assertEquals("0", p3.port); Assert.assertEquals("/%%20", p3.path); ClasspathMatcher cm3 = ClasspathMatcher.compile(trapUrl3); Assert.assertTrue(cm3.match(new URL("ftp://:0//whatever"))); Assert.assertFalse(cm3.matchWithPath(new URL("ftp://:0//whatever"))); Assert.assertTrue(cm3.match(new URL("ftp://:0//%%20"))); } @Test public void matchersTest() throws MalformedURLException { ClasspathMatchers cps1 = ClasspathMatcher.ClasspathMatchers.compile(" aa bb cc "); ArrayList q = cps1.getMatchers(); Assert.assertEquals(3, q.size()); Assert.assertEquals("aa", q.get(0).getParts().domain); Assert.assertEquals("bb", q.get(1).getParts().domain); Assert.assertEquals("cc", q.get(2).getParts().domain); ClasspathMatchers cps2 = ClasspathMatcher.ClasspathMatchers.compile("http://aa.cz ftp://*bb.cz/"); Assert.assertTrue(cps2.matches(new URL("ftp://123.bb.cz/aa"))); Assert.assertFalse(cps2.matches(new URL("http://bb.cz"))); Assert.assertTrue(cps2.matches(new URL("http://aa.cz"))); Assert.assertFalse(cps2.matches(new URL("http://bb.cz"))); } @Test public void testStar() throws MalformedURLException { ClasspathMatchers cps1 = ClasspathMatcher.ClasspathMatchers.compile("*"); Assert.assertTrue(cps1.matches(new URL("http://whatever.anywher/something/at.some"))); Assert.assertTrue(cps1.matches(new URL("http://whatever.anywher/something/at"))); Assert.assertTrue(cps1.matches(new URL("http://whatever.anywher/"))); Assert.assertTrue(cps1.matches(new URL("http://whatever.anywher"))); } @Test public void matchersTestWithPathsNix() throws MalformedURLException { ClasspathMatchers cps1 = ClasspathMatcher.ClasspathMatchers.compile(" aa bb cc ", true); ArrayList q = cps1.getMatchers(); Assert.assertEquals(3, q.size()); Assert.assertEquals("aa", q.get(0).getParts().domain); Assert.assertEquals("bb", q.get(1).getParts().domain); Assert.assertEquals("cc", q.get(2).getParts().domain); ClasspathMatchers cps2 = ClasspathMatcher.ClasspathMatchers.compile("http://aa.cz/xyz ftp://*bb.cz/bcq/dfg/aa*", true); Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz/aa"))); Assert.assertFalse(cps2.matches(new URL("http://bb.cz"))); Assert.assertFalse(cps2.matches(new URL("http://aa.cz"))); Assert.assertFalse(cps2.matches(new URL("http://bb.cz"))); //star Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz/bcq/aa-test.html"))); Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz/bcq/dfg-aa-test.html"))); Assert.assertTrue(cps2.matches(new URL("ftp://123.bb.cz/bcq/dfg/aa-test.html"))); Assert.assertTrue(cps2.matches(new URL("ftp://123.bb.cz/bcq/dfg/aa"))); Assert.assertTrue(cps2.matches(new URL("ftp://123.bb.cz/bcq/dfg/aa/"))); Assert.assertTrue(cps2.matches(new URL("ftp://123.bb.cz/bcq/dfg/aa-files/aaa.jar"))); Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz/bcq\\dfg\\aa-files\\aaa.jar"))); //double quotes may harm Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz//bcq/dfg/aa-files/aaa.jar"))); Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz//bcq/dfg/aa-files//aaa.jar"))); //no star Assert.assertFalse(cps2.matches(new URL("http://bb.cz"))); Assert.assertFalse(cps2.matches(new URL("http://aa.cz"))); Assert.assertTrue(cps2.matches(new URL("http://aa.cz/xyz"))); //double quotes may harm again Assert.assertTrue(cps2.matches(new URL("http://aa.cz/xyz/"))); Assert.assertFalse(cps2.matches(new URL("http://aa.cz//xyz"))); } @Test public void matchersTestWithPathsWin() throws MalformedURLException { ClasspathMatchers cps1 = ClasspathMatcher.ClasspathMatchers.compile(" aa bb cc ", true); ArrayList q = cps1.getMatchers(); Assert.assertEquals(3, q.size()); Assert.assertEquals("aa", q.get(0).getParts().domain); Assert.assertEquals("bb", q.get(1).getParts().domain); Assert.assertEquals("cc", q.get(2).getParts().domain); ClasspathMatchers cps2 = ClasspathMatcher.ClasspathMatchers.compile("http://aa.cz/xyz ftp://*bb.cz/bcq\\dfg\\aa*", true); Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz/aa"))); Assert.assertFalse(cps2.matches(new URL("http://bb.cz"))); Assert.assertFalse(cps2.matches(new URL("http://aa.cz"))); Assert.assertFalse(cps2.matches(new URL("http://bb.cz"))); //star Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz/bcq\\aa-test.html"))); Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz/bcq\\dfg-aa-test.html"))); Assert.assertTrue(cps2.matches(new URL("ftp://123.bb.cz/bcq\\dfg\\aa-test.html"))); Assert.assertTrue(cps2.matches(new URL("ftp://123.bb.cz/bcq\\dfg\\aa"))); Assert.assertTrue(cps2.matches(new URL("ftp://123.bb.cz/bcq\\dfg\\aa\\"))); Assert.assertTrue(cps2.matches(new URL("ftp://123.bb.cz/bcq\\dfg\\aa-files\\aaa.jar"))); Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz/bcq/dfg/aa-files/aaa.jar"))); //double quotes may harm Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz//bcq\\dfg\\aa-files\\aaa.jar"))); Assert.assertFalse(cps2.matches(new URL("ftp://123.bb.cz//bcq\\dfg\\aa-files\\aaa.jar"))); //no star Assert.assertFalse(cps2.matches(new URL("http://bb.cz"))); Assert.assertFalse(cps2.matches(new URL("http://aa.cz"))); Assert.assertTrue(cps2.matches(new URL("http://aa.cz/xyz"))); //double quotes may harm again Assert.assertTrue(cps2.matches(new URL("http://aa.cz/xyz\\"))); Assert.assertFalse(cps2.matches(new URL("http://aa.cz//xyz"))); } @Test public void trickyPathsMatchTes() throws MalformedURLException { ClasspathMatchers cps1 = ClasspathMatcher.ClasspathMatchers.compile("http://aaa.com/some/path", true); ClasspathMatchers cps11 = ClasspathMatcher.ClasspathMatchers.compile("http://aaa.com/some/path", false); ClasspathMatchers cps2 = ClasspathMatcher.ClasspathMatchers.compile("http://aaa.com/some/path/", true); ClasspathMatchers cps22 = ClasspathMatcher.ClasspathMatchers.compile("http://aaa.com/some/path/", false); Assert.assertTrue(cps1.matches(new URL("http://aaa.com/some/path"))); Assert.assertTrue(cps1.matches(new URL("http://aaa.com/some/path/"))); Assert.assertFalse(cps2.matches(new URL("http://aaa.com/some/path"))); Assert.assertTrue(cps2.matches(new URL("http://aaa.com/some/path/"))); Assert.assertTrue(cps11.matches(new URL("http://aaa.com/some/path"))); Assert.assertTrue(cps11.matches(new URL("http://aaa.com/some/path/"))); Assert.assertTrue(cps22.matches(new URL("http://aaa.com/some/path"))); Assert.assertTrue(cps22.matches(new URL("http://aaa.com/some/path/"))); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/UrlUtilsTest.java0000644000000000000000000000013213441742745026641 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java0000644000175000002070000004772513441742745027470 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import net.sourceforge.jnlp.annotations.KnownToFail; import org.junit.Assert; import org.junit.Test; public class UrlUtilsTest { @Test public void testNormalizeUrlAndStripParams() throws Exception { /* Test that URL is normalized (encoded if not already encoded, leading whitespace trimmed, etc) */ assertEquals("http://example.com/%20test%20test", UrlUtils.normalizeUrlAndStripParams(new URL("http://example.com/ test%20test ")).toString()); /* Test that a URL without '?' is left unchanged */ assertEquals("http://example.com/test", UrlUtils.normalizeUrlAndStripParams(new URL("http://example.com/test")).toString()); /* Test that parts of a URL that come after '?' are stripped */ assertEquals("http://example.com/test", UrlUtils.normalizeUrlAndStripParams(new URL("http://example.com/test?test=test")).toString()); /* Test that everything after the first '?' is stripped */ assertEquals("http://example.com/test", UrlUtils.normalizeUrlAndStripParams(new URL("http://example.com/test?http://example.com/?test")).toString()); /* Test normalization + stripping */ assertEquals("http://example.com/%20test%20test", UrlUtils.normalizeUrlAndStripParams(new URL("http://example.com/ test%20test ?test=test")).toString()); } @Test public void testDecodeUrlQuietly() throws Exception { // This is a wrapper over URLDecoder.decode, simple test suffices assertEquals("http://example.com/ test test", UrlUtils.decodeUrlQuietly(new URL("http://example.com/%20test%20test")).toString()); } @Test public void testNormalizeUrl() throws Exception { boolean[] encodeFileUrlPossiblities = {false, true}; // encodeFileUrl flag should have no effect on non-file URLs, but let's be sure. for (boolean encodeFileUrl : encodeFileUrlPossiblities ) { // Test URL with no previous encoding assertEquals("http://example.com/%20test", UrlUtils.normalizeUrl(new URL("http://example.com/ test"), encodeFileUrl).toString()); // Test partially encoded URL with trailing spaces assertEquals("http://example.com/%20test%20test", UrlUtils.normalizeUrl(new URL("http://example.com/ test%20test "), encodeFileUrl).toString()); } // Test file URL with file URL encoding turned off assertFalse("file://example/%20test".equals( UrlUtils.normalizeUrl(new URL("file://example/ test"), false).toString())); // Test file URL with file URL encoding turned on assertEquals("file://example/%20test", UrlUtils.normalizeUrl(new URL("file://example/ test"), true).toString()); // PR1465: Test that RFC2396-compliant URLs are not touched // Example taken from bug report: http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=1465 String rfc2396Valid = "https://example.com/,DSID=64c19c5b657df383835706571a7c7216,DanaInfo=example.com,CT=java+JICAComponents/JICA-sicaN.jar"; assertEquals(rfc2396Valid, UrlUtils.normalizeUrl(new URL(rfc2396Valid)).toString()); } @Test public void testIsValidRFC2396Url() throws Exception { String rfc2396Valid = "https://example.com/,foo=bar+baz/JICA-sicaN.jar"; assertTrue(UrlUtils.isValidRFC2396Url(new URL(rfc2396Valid))); // These should invalidate the URL // See http://www.ietf.org/rfc/rfc2396.txt (2.4.3. Excluded US-ASCII Characters) char[] invalidCharacters = {'<', '>', '%', '"', }; for (char chr : invalidCharacters) { assertFalse("validation failed with '" + chr + "'",UrlUtils.isValidRFC2396Url(new URL(rfc2396Valid + chr))); } //special test for space inisde. Space at the end can be trimmed assertFalse("validation failed with '" + ' ' + "'",UrlUtils.isValidRFC2396Url(new URL("https://example.com/,foo=bar+ba z/JICA-sicaN.jar"))); } @Test public void testNormalizeUrlQuietly() throws Exception { // This is a wrapper over UrlUtils.normalizeUrl(), simple test suffices assertEquals("http://example.com/%20test%20test", UrlUtils.normalizeUrl(new URL("http://example.com/ test%20test ")).toString()); } @Test public void testDecodeUrlAsFile() throws Exception { String[] testPaths = {"/simple", "/ with spaces", "/with /multiple=/ odd characters?"}; for (String testPath : testPaths) { File testFile = new File(testPath); URL notEncodedUrl = testFile.toURI().toURL(); URL encodedUrl = testFile.toURI().toURL(); assertEquals(testFile, UrlUtils.decodeUrlAsFile(notEncodedUrl)); assertEquals(testFile, UrlUtils.decodeUrlAsFile(encodedUrl)); } } @Test public void testNormalizeUrlSlashStrings() throws Exception { String u11 = UrlUtils.sanitizeLastSlash("http://aa.bb/aaa/bbb////"); String u22 = UrlUtils.sanitizeLastSlash("http://aa.bb/aaa/bbb"); assertEquals(u11, u22); assertEquals(u11, "http://aa.bb/aaa/bbb"); String u1 = UrlUtils.sanitizeLastSlash(("http://aa.bb/aaa\\bbb\\")); String u2 = UrlUtils.sanitizeLastSlash(("http://aa.bb/aaa\\bbb")); assertEquals(u1, u2); assertEquals(u1, ("http://aa.bb/aaa\\bbb")); } @Test public void testNormalizeUrlSlashUrls() throws Exception { URL u11 = UrlUtils.sanitizeLastSlash(new URL("http://aa.bb/aaa/bbb////")); URL u22 = UrlUtils.sanitizeLastSlash(new URL("http://aa.bb/aaa/bbb")); assertEquals(u11, u22); assertEquals(u11, new URL("http://aa.bb/aaa/bbb")); URL u1 = UrlUtils.sanitizeLastSlash(new URL("http://aa.bb/aaa\\bbb\\")); URL u2 = UrlUtils.sanitizeLastSlash(new URL("http://aa.bb/aaa\\bbb")); assertEquals(u1, u2); assertEquals(u1, new URL("http://aa.bb/aaa\\bbb")); } @Test public void testEqualsIgnoreLastSlash() throws Exception { URL u11 = (new URL("http://aa.bb/aaa/bbb////")); URL u22 = (new URL("http://aa.bb/aaa/bbb")); assertTrue(UrlUtils.equalsIgnoreLastSlash(u11, u22)); assertTrue(UrlUtils.equalsIgnoreLastSlash(u11, new URL("http://aa.bb/aaa/bbb"))); URL u1 = (new URL("http://aa.bb/aaa\\bbb\\")); URL u2 = (new URL("http://aa.bb/aaa\\bbb")); assertTrue(UrlUtils.equalsIgnoreLastSlash(u1, u2)); assertTrue(UrlUtils.equalsIgnoreLastSlash(u1, new URL("http://aa.bb/aaa\\bbb"))); assertTrue(UrlUtils.equalsIgnoreLastSlash(new URL("http://aa.bb/aaa\\bbb\\"), new URL("http://aa.bb/aaa\\bbb/"))); assertFalse(UrlUtils.equalsIgnoreLastSlash(new URL("http://aa.bb/aaa\\bbb\\"), new URL("http://aa.bb/aaa/bbb/"))); } @Test public void removeFileName1() throws Exception { URL l1 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/hchkr/jar.jar")); assertEquals(l1, new URL("http://aaa.bb/xyz/hchkr")); URL l2 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/hchkr/")); assertEquals(l2, new URL("http://aaa.bb/xyz/hchkr")); URL l3 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/hchkr")); assertEquals(l3, new URL("http://aaa.bb/xyz")); URL l4 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/jar.jar")); assertEquals(l4, new URL("http://aaa.bb/xyz")); URL l5 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/")); assertEquals(l5, new URL("http://aaa.bb/xyz")); URL l6 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz")); assertEquals(l6, new URL("http://aaa.bb")); URL l7 = UrlUtils.removeFileName(new URL("http://aaa.bb/jar.jar")); assertEquals(l7, new URL("http://aaa.bb")); URL l8 = UrlUtils.removeFileName(new URL("http://aaa.bb/")); assertEquals(l8, new URL("http://aaa.bb")); URL l9 = UrlUtils.removeFileName(new URL("http://aaa.bb")); assertEquals(l9, new URL("http://aaa.bb")); } public void removeFileName2() throws Exception { URL l1 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz\\hchkr\\jar.jar")); assertEquals(l1, new URL("http://aaa.bb/xyz\\hchkr")); URL l2 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz\\hchkr\\")); assertEquals(l2, new URL("http://aaa.bb/xyz\\hchkr")); URL l3 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz\\hchkr")); assertEquals(l3, new URL("http://aaa.bb/xyz")); URL l4 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz\\jar.jar")); assertEquals(l4, new URL("http://aaa.bb/xyz")); URL l5 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz\\")); assertEquals(l5, new URL("http://aaa.bb/xyz")); URL l6 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz")); assertEquals(l6, new URL("http://aaa.bb")); URL l7 = UrlUtils.removeFileName(new URL("http://aaa.bb/jar.jar")); assertEquals(l7, new URL("http://aaa.bb")); URL l8 = UrlUtils.removeFileName(new URL("http://aaa.bb/")); assertEquals(l8, new URL("http://aaa.bb")); URL l9 = UrlUtils.removeFileName(new URL("http://aaa.bb")); assertEquals(l9, new URL("http://aaa.bb")); } @Test public void removeFileName3() throws Exception { URL l1 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/hchkr/jar.jar?someParam=some¶m=very\\evil\\")); assertEquals(l1, new URL("http://aaa.bb/xyz/hchkr")); URL l2 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/hchkr/?another=Param¶m=very/evil/")); assertEquals(l2, new URL("http://aaa.bb/xyz/hchkr")); URL l3 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/hchkr?stillSomePArams=aa")); assertEquals(l3, new URL("http://aaa.bb/xyz")); URL l4 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/jar.jar?again=param/bad\\bad/params")); assertEquals(l4, new URL("http://aaa.bb/xyz")); URL l5 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz/?goingOnWith=params/bad/params")); assertEquals(l5, new URL("http://aaa.bb/xyz")); URL l6 = UrlUtils.removeFileName(new URL("http://aaa.bb/xyz?someParam=some")); assertEquals(l6, new URL("http://aaa.bb")); URL l7 = UrlUtils.removeFileName(new URL("http://aaa.bb/jar.jar?someParam=some")); assertEquals(l7, new URL("http://aaa.bb")); URL l8 = UrlUtils.removeFileName(new URL("http://aaa.bb/?someParam=some")); assertEquals(l8, new URL("http://aaa.bb")); } @Test public void testUrlEquals() throws Exception { final URL n1 = null, n2 = null, u1 = new URL("http://example.com"), u2 = u1, u3 = new URL("http://example.com"); Assert.assertTrue("Two nulls should be equal", UrlUtils.urlEquals(n1, n2)); Assert.assertFalse("Null URL should not equal a non-null", UrlUtils.urlEquals(n1, u1)); Assert.assertTrue("URL should equal itself (same reference)", UrlUtils.urlEquals(u1, u2)); Assert.assertTrue("URLs should be equal when different reference but the same URL", UrlUtils.urlEquals(u1, u3)); } @Test(expected = NullPointerException.class) public void verifyNotNullUrlEqualsThrowsExceptionWhenBothArgumentsAreNull() throws Exception { UrlUtils.notNullUrlEquals(null, null); } @Test(expected = NullPointerException.class) public void nverifyNotNullUrlEqualsThrowsExceptionWhenFirstArgumentIsNull() throws Exception { UrlUtils.notNullUrlEquals(null, new URL("ftp://aa.bb")); } @Test(expected = NullPointerException.class) public void verifyNotNullUrlEqualsThrowsExceptionWhenSecondArgumentIsNull() throws Exception { UrlUtils.notNullUrlEquals(new URL("ftp://aa.bb"), null); } @Test public void notNullUrlValuesEqualsCaseSensitiveIssuesTest() throws Exception { final URL u1 = new URL("http://example.com"), u2 = u1, u3 = new URL("HTTP://example.com"); final URL u11 = new URL("http://example.com/path"), u12 = new URL("http://EXAMPLE.com/path"), u13 = new URL("http://example.com/PATH"), u14 = new URL("http://example.com/path2"); final URL u21 = new URL("http://example2.com"); final URL u22 = new URL("ftp://example.com"); Assert.assertTrue(UrlUtils.notNullUrlEquals(u1, u2)); Assert.assertTrue(UrlUtils.notNullUrlEquals(u1, u3)); Assert.assertTrue(UrlUtils.notNullUrlEquals(u11, u12)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u11, u13)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u12, u13)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u11, u14)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u12, u14)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u13, u14)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u1, u21)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u1, u22)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u21, u22)); } @Test //the ports are for some unknown reason ignored from comparsion @KnownToFail public void notNullUrlComapreWithPorts() throws Exception { final URL u1 = new URL("http://example.com:1"), u2 = new URL("http://example.com:1"), u3 = new URL("http://example.com:3"); Assert.assertTrue(UrlUtils.notNullUrlEquals(u1, u2)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u1, u3)); Assert.assertFalse(UrlUtils.notNullUrlEquals(u2, u3)); } @Test public void testCompareNullableStrings_nulls() throws Exception { Assert.assertTrue(UrlUtils.compareNullableStrings(null, null, true)); Assert.assertTrue(UrlUtils.compareNullableStrings(null, null, false)); Assert.assertFalse(UrlUtils.compareNullableStrings(null, "blah", true)); Assert.assertFalse(UrlUtils.compareNullableStrings("blah", null, false)); } @Test public void testCompareNullableStrings_values() throws Exception { Assert.assertTrue(UrlUtils.compareNullableStrings("aaa", "aaa", true)); Assert.assertTrue(UrlUtils.compareNullableStrings("aaa", "aaa", false)); Assert.assertFalse(UrlUtils.compareNullableStrings("aaa", "AAA", false)); Assert.assertTrue(UrlUtils.compareNullableStrings("aaa", "AAA", true)); Assert.assertFalse(UrlUtils.compareNullableStrings("AAA", "aaa", false)); Assert.assertTrue(UrlUtils.compareNullableStrings("AAA", "aaa", true)); Assert.assertFalse(UrlUtils.compareNullableStrings("aaa", "bbb", true)); Assert.assertFalse(UrlUtils.compareNullableStrings("aaa", "BBB", false)); Assert.assertFalse(UrlUtils.compareNullableStrings("BBB", "aaa", false)); } @Test public void sanitizePortTest() throws MalformedURLException { Assert.assertEquals(0, UrlUtils.getSanitizedPort(new URL("http://aaa.cz:0"))); Assert.assertEquals(1, UrlUtils.getSanitizedPort(new URL("https://aaa.cz:1"))); Assert.assertEquals(100, UrlUtils.getSanitizedPort(new URL("ftp://aaa.cz:100"))); //Assert.assertEquals(1001, UrlUtils.getSanitizedPort(new URL("ssh://aaa.cz:1001"))); unknown protocol :( //Assert.assertEquals(22, UrlUtils.getSanitizedPort(new URL("ssh://aaa.cz"))); Assert.assertEquals(80, UrlUtils.getSanitizedPort(new URL("http://aaa.cz"))); Assert.assertEquals(443, UrlUtils.getSanitizedPort(new URL("https://aaa.cz"))); Assert.assertEquals(21, UrlUtils.getSanitizedPort(new URL("ftp://aaa.cz"))); } @Test public void getPortTest() throws MalformedURLException { Assert.assertEquals(1, UrlUtils.getPort(new URL("http://aa.bb:1"))); Assert.assertEquals(10, UrlUtils.getPort(new URL("http://aa.bb:10/aa"))); Assert.assertEquals(1000, UrlUtils.getPort(new URL("http://aa.bb:1000/aa.fs"))); Assert.assertEquals(443, UrlUtils.getPort(new URL("https://aa.bb/aa.fs"))); Assert.assertEquals(80, UrlUtils.getPort(new URL("http://aa.bb"))); Assert.assertEquals(80, UrlUtils.getPort(new URL("http://aa.bb:80/a/b/c"))); } @Test public void getHostAndPortTest() throws MalformedURLException { Assert.assertEquals("aa.bb:2", UrlUtils.getHostAndPort(new URL("http://aa.bb:2"))); Assert.assertEquals("aa.bb:12", UrlUtils.getHostAndPort(new URL("http://aa.bb:12/aa"))); Assert.assertEquals("aa.bb:1002", UrlUtils.getHostAndPort(new URL("http://aa.bb:1002/aa.fs"))); Assert.assertEquals("aa.bb:443", UrlUtils.getHostAndPort(new URL("https://aa.bb/aa.fs"))); Assert.assertEquals("aa.bb:80", UrlUtils.getHostAndPort(new URL("http://aa.bb"))); Assert.assertEquals("aa.bb:80", UrlUtils.getHostAndPort(new URL("http://aa.bb:80/a/b/c"))); } @Test public void ensureSlashTailTest() { Assert.assertEquals("a/", UrlUtils.ensureSlashTail("a")); Assert.assertEquals("aa/a/", UrlUtils.ensureSlashTail("aa/a")); Assert.assertEquals("aa/a/", UrlUtils.ensureSlashTail("aa/a/")); Assert.assertEquals("/aa/a/", UrlUtils.ensureSlashTail("/aa/a/")); Assert.assertEquals("/aa/a/", UrlUtils.ensureSlashTail("/aa/a")); Assert.assertEquals("aa\\a\\", UrlUtils.ensureSlashTail("aa\\a")); Assert.assertEquals("aa\\a\\", UrlUtils.ensureSlashTail("aa\\a\\")); Assert.assertEquals("\\aa\\a\\", UrlUtils.ensureSlashTail("\\aa\\a\\")); Assert.assertEquals("\\aa\\a\\", UrlUtils.ensureSlashTail("\\aa\\a")); Assert.assertEquals("\\aa/a/", UrlUtils.ensureSlashTail("\\aa/a")); Assert.assertEquals("//aa\\a/", UrlUtils.ensureSlashTail("//aa\\a")); Assert.assertEquals("\\aa/a/", UrlUtils.ensureSlashTail("\\aa/a/")); Assert.assertEquals("\\aa/a\\", UrlUtils.ensureSlashTail("\\aa/a\\")); } @Test public void ensureSlashTailTest3() throws MalformedURLException { Assert.assertEquals("http://aa.bb:2/aa/", UrlUtils.ensureSlashTail(new URL("http://aa.bb:2/aa")).toExternalForm()); Assert.assertEquals("http://aa.bb/aa/", UrlUtils.ensureSlashTail(new URL("http://aa.bb/aa/")).toExternalForm()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/optionparser0000644000000000000000000000013213441742745026023 xustar0030 mtime=1552401893.071832756 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/optionparser/0000755000175000002070000000000013441742745026710 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/optionparser/PaxHeaders.7406/OptionParserT0000644000000000000000000000013213441742745030574 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/optionparser/OptionParserTest.java0000644000175000002070000004653413441742745033054 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.optionparser; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import net.sourceforge.jnlp.OptionsDefinitions; import org.junit.Test; import java.util.List; public class OptionParserTest { @Test public void testGetSingleOptionValue() { String[] args = {"-update", "blob"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); String value = parser.getParam(OptionsDefinitions.OPTIONS.UPDATE); assertEquals("blob", value); } @Test public void testGetSingleOptionMultipleValues() { String[] args = {"-arg", "blob", "meow"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(0, values.indexOf("blob")); assertEquals(1, values.indexOf("meow")); assertEquals(2, values.size()); } @Test public void testGetDifferentOptionValues() { String[] args = {"-param", "blob", "-arg", "yelp"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.PARAM); assertEquals(0, values.indexOf("blob")); assertEquals(1, values.size()); values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(0, values.indexOf("yelp")); assertEquals(1, values.size()); } @Test public void testSupportedOptionValueNotBeingUsed() { String[] args = {}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(0, values.size()); } @Test public void testOptionValueWithNoArgument() { String[] args = {"-arg"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(0, values.size()); } @Test public void testOneOptionMultipleTimesMultipleValues() { String[] args = {"-arg", "poke", "blob", "-arg", "meep"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(3, values.size()); assertEquals(0, values.indexOf("poke")); assertEquals(1, values.indexOf("blob")); assertEquals(2, values.indexOf("meep")); } @Test public void testMultipleOptionsMultipleValues() { String[] args = {"-param", "poke", "blob", "-arg", "meep", "feep", "blurp"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.PARAM); assertEquals(2, values.size()); assertEquals(0, values.indexOf("poke")); assertEquals(1, values.indexOf("blob")); values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(3, values.size()); assertEquals(0, values.indexOf("meep")); assertEquals(1, values.indexOf("feep")); assertEquals(2, values.indexOf("blurp")); } @Test public void testCheckOptionExists() { String[] args = {"-headless", "-fish", "-busybee", "boat"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); boolean value = parser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS); assertTrue(value); } @Test public void testCheckOptionExistsAsNotFirstArg() { String[] args = {"-run", "fish", "-castle", "-headless"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); boolean value = parser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS); assertTrue(value); } @Test public void testCheckOptionNotExists() { String[] args = {"-run", "fish", "-castle", "cat"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); boolean value = parser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS); assertFalse(value); } @Test public void testMultipleOptionsWithMainArgAtTheEnd() { String[] args = {"-arg", "-update=green", "-version", "-headless", "-arg", "-about", "-arg", "blah1", "blah2", "blah3", "-noupdate", "-arg", "blah4", "blah5", "blah6", "-headless", "File.jnlp"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(6, values.size()); assertTrue(parser.mainArgExists()); assertEquals("File.jnlp",parser.getMainArg()); assertEquals(0, values.indexOf("blah1")); assertEquals(1, values.indexOf("blah2")); assertEquals(2, values.indexOf("blah3")); assertEquals(3, values.indexOf("blah4")); assertEquals(4, values.indexOf("blah5")); assertEquals(5, values.indexOf("blah6")); } @Test public void testMultipleOptionsWithNoArgsCombinedWithMultipleOptions() { String[] args = {"-arg", "-update=green", "-version", "-arg", "-about", "-arg", "blah1", "blah2", "blah3","-about", "-arg", "blah4", "blah5", "blah6", "File.jnlp", "-headless", "-noupdate"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertTrue(parser.hasOption(OptionsDefinitions.OPTIONS.ABOUT)); } @Test public void testMainArgExists() { String[] args = {"File.jnlp"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertTrue(parser.mainArgExists()); assertEquals("File.jnlp", parser.getMainArg()); } @Test public void testMultipleMainArgsReturnsFirstMainArg() { String[] args = {"File.jnlp", "FileTwo,jnlp", "FileThree.jnlp"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertTrue(parser.mainArgExists()); assertEquals("File.jnlp", parser.getMainArg()); } @Test public void testSameTagMultipleTimesWithMainArg() { String[] args = {"-headless", "-headless","File.jnlp", "-headless", "-headless", "-headless"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertTrue(parser.mainArgExists()); assertEquals("File.jnlp", parser.getMainArg()); assertTrue(parser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS)); } @Test public void testSameTagMultipleTimesWithoutMainArg() { String[] args = {"-headless", "-headless", "-headless", "-headless", "-headless"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertFalse(parser.mainArgExists()); assertEquals("",parser.getMainArg()); assertTrue(parser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS)); } @Test public void testMultipleArgTagSurroundingMainArgAfterNoArgOption() { String[] args = {"-arg", "blue", "green", "red", "-headless", "File.jnlp", "-arg", "yellow", "purple"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(0, values.indexOf("blue")); assertEquals(1, values.indexOf("green")); assertEquals(2, values.indexOf("red")); assertEquals(3, values.indexOf("yellow")); assertEquals(4, values.indexOf("purple")); assertTrue(parser.mainArgExists()); assertEquals("File.jnlp", parser.getMainArg()); assertTrue(parser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS)); } @Test public void testOptionWithDashInMiddleWontBeAltered() { String[] args = {"ar-g", "blue", "green", "red"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(values.size(), 0); } @Test public void testGetParamsWithNoValueHasNoValues() { String[] args = {"-arg"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(0, values.size()); } @Test public void testOnlyFirstDashIsAcceptable() { String[] args = {"-arg", "blue", "a-rg", "-headless", "-arg", "green", "-ar-g"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(4, values.size()); assertEquals(0, values.indexOf("blue")); assertEquals(1, values.indexOf("a-rg")); assertEquals(2, values.indexOf("green")); assertEquals(3, values.indexOf("-ar-g")); } @Test public void testOptionsSyntaxPositive() { assertTrue(OptionParser.stringEqualsOption("-headless", OptionsDefinitions.OPTIONS.HEADLESS)); assertTrue(OptionParser.stringEqualsOption("headless", OptionsDefinitions.OPTIONS.HEADLESS)); assertTrue(OptionParser.stringEqualsOption("--headless", OptionsDefinitions.OPTIONS.HEADLESS)); assertTrue(OptionParser.stringEqualsOption("---headless", OptionsDefinitions.OPTIONS.HEADLESS)); } @Test public void testOptionsSyntaxNegative() { assertFalse(OptionParser.stringEqualsOption(" -headless", OptionsDefinitions.OPTIONS.HEADLESS)); assertFalse(OptionParser.stringEqualsOption("h-eadless", OptionsDefinitions.OPTIONS.HEADLESS)); assertFalse(OptionParser.stringEqualsOption("headless-", OptionsDefinitions.OPTIONS.HEADLESS)); assertFalse(OptionParser.stringEqualsOption("- -headless", OptionsDefinitions.OPTIONS.HEADLESS)); assertFalse(OptionParser.stringEqualsOption("--- ---headless", OptionsDefinitions.OPTIONS.HEADLESS)); assertFalse(OptionParser.stringEqualsOption("- ---headless", OptionsDefinitions.OPTIONS.HEADLESS)); assertFalse(OptionParser.stringEqualsOption("--- -headless", OptionsDefinitions.OPTIONS.HEADLESS)); } @Test public void testOptionWithEqualsParamIsValid() { String[] args = {"-arg=blue"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(1, values.size()); assertEquals(0, values.indexOf("blue")); } @Test public void testMultipleOptionWithEqualsParamIsValid() { String[] args = {"-arg=blue", "-property=red", "-param=green"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(1, values.size()); assertEquals(0, values.indexOf("blue")); values = parser.getParams(OptionsDefinitions.OPTIONS.PROPERTY); assertEquals(1, values.size()); assertEquals(0, values.indexOf("red")); values = parser.getParams(OptionsDefinitions.OPTIONS.PARAM); assertEquals(1, values.size()); assertEquals(0, values.indexOf("green")); } @Test public void testSameOptionWithEqualsParamMultipleTimesIsValid() { String[] args = {"-arg=blue", "-arg=red", "-arg=green"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(3, values.size()); assertEquals(0, values.indexOf("blue")); assertEquals(1, values.indexOf("red")); assertEquals(2, values.indexOf("green")); } @Test public void testParamsCanHaveEqualsSigns() { String[] args = {"-arg", "colour=red", "height=50", "width=222", "circular=true"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(4, values.size()); assertEquals(0, values.indexOf("colour=red")); assertEquals(1, values.indexOf("height=50")); assertEquals(2, values.indexOf("width=222")); assertEquals(3, values.indexOf("circular=true")); } @Test public void testParamsCanHaveDashes() { String[] args = {"-arg", "-red", "-koala", "-panda", "-grizzly"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(4, values.size()); assertEquals(0, values.indexOf("-red")); assertEquals(1, values.indexOf("-koala")); assertEquals(2, values.indexOf("-panda")); assertEquals(3, values.indexOf("-grizzly")); } @Test public void testParamsCanHaveDashesAndEqualsSigns() { String[] args = {"-arg", "-red=colour", "-koala=animal", "-panda=bear", "-grizzly=bear"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(4, values.size()); assertEquals(0, values.indexOf("-red=colour")); assertEquals(1, values.indexOf("-koala=animal")); assertEquals(2, values.indexOf("-panda=bear")); assertEquals(3, values.indexOf("-grizzly=bear")); } @Test public void testMainArgAfterNoArgOption() { String[] args = {"-arg", "-red=colour", "-headless", "File.jnlp", "-arg", "-grizzly=bear"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertEquals("File.jnlp", parser.getMainArg()); } @Test public void testMainArgAfterOneArgOption() { String[] args = {"-arg", "-red=colour", "-update", "200", "File.jnlp", "-arg", "-grizzly=bear"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertEquals("File.jnlp", parser.getMainArg()); } @Test public void testMainArgAfterManyArgsOptionIsNotAccepted() { String[] args = {"-arg", "-red=colour", "-arg", "200", "File.jnlp", "-arg", "-grizzly=bear"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertFalse(parser.mainArgExists()); assertNotEquals("File.jnlp", parser.getMainArg()); } @Test public void testOptionWithMultipleEqualSignsOnlyParsesFirstEquals() { String[] args = {"-arg=grizzly=panda=goldfish=mouse"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); List values = parser.getParams(OptionsDefinitions.OPTIONS.ARG); assertEquals(1, values.size()); assertEquals(0, values.indexOf("grizzly=panda=goldfish=mouse")); } @Test public void testGetParam() { String[] args = {"-arg", "blue"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); String value = parser.getParam(OptionsDefinitions.OPTIONS.ARG); assertEquals("blue", value); } @Test public void testGetParamWithManyParams() { String[] args = {"-arg", "blue", "red", "green"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); String value = parser.getParam(OptionsDefinitions.OPTIONS.ARG); assertEquals("blue", value); } @Test public void testGetParamWithNoParams() { String[] args = {"-arg"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); String value = parser.getParam(OptionsDefinitions.OPTIONS.ARG); assertEquals("", value); } @Test public void testGetNumberOfOptions() { String[] args = {"-arg", "-version", "-param", "-property", "-update"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertEquals(5, parser.getNumberOfOptions()); } @Test public void testGetNumberOfOptionsWithOtherOptions() { String[] args = {"-arg", "-version", "-param", "-property", "-update", "-set", "-reset"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); assertEquals(5, parser.getNumberOfOptions()); } @Test public void testEvenNumberSupportsEqualsChar() { String[] args = {"-set", "yes", "no", "blue=red", "green", "orange", "yellow=purple=roseyred"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); List values = parser.getParams(OptionsDefinitions.OPTIONS.SET); assertEquals("yes", values.get(0)); assertEquals("no", values.get(1)); assertEquals("blue", values.get(2)); assertEquals("red", values.get(3)); assertEquals("green", values.get(4)); assertEquals("orange", values.get(5)); assertEquals("yellow", values.get(6)); assertEquals("purple=roseyred", values.get(7)); } @Test(expected = UnevenParameterException.class) public void testEvenNumberSupportsEqualsCharThrowsExceptionWhenParametersIsUneven() { String[] args = {"-set", "yes", "no", "blue=red", "green"}; OptionParser parser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); } }icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/lockingfile0000644000000000000000000000013213441742745025564 xustar0030 mtime=1552401893.080832738 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/0000755000175000002070000000000013441742745026451 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/PaxHeaders.7406/NonWindowsLock0000644000000000000000000000013213441742745030502 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/NonWindowsLockedFile.java0000644000175000002070000000126313441742745033345 0ustar00jvanekmock00000000000000/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package net.sourceforge.jnlp.util.lockingfile; import org.junit.AfterClass; import org.junit.BeforeClass; /** * * @author jvanek */ public class NonWindowsLockedFile extends WindowsLockedFileTest { private static String os; @BeforeClass public static void smuggleOs() { os = System.getProperty("os.name"); System.setProperty("os.name", "No Windows for itw"); } @AfterClass public static void restoreOs() { System.setProperty("os.name", os); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/PaxHeaders.7406/WindowsLockedF0000644000000000000000000000013213441742745030446 xustar0030 mtime=1552401893.080832738 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/WindowsLockedFileTest.java0000644000175000002070000000350413441742745033532 0ustar00jvanekmock00000000000000/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package net.sourceforge.jnlp.util.lockingfile; import java.io.File; import java.io.IOException; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; /** * * @author jvanek */ public class WindowsLockedFileTest { private static String os; @BeforeClass public static void smuggleOs() { os = System.getProperty("os.name"); System.setProperty("os.name", "Windows for itw"); } @AfterClass public static void restoreOs() { System.setProperty("os.name", os); } @Test public void testLockUnlockOkExists() throws IOException { File f = File.createTempFile("itw", "lockingFile"); f.deleteOnExit(); LockedFile lf = LockedFile.getInstance(f); lf.lock(); lf.unlock(); } @Test public void testLockUnlockOkNotExists() throws IOException { File f = File.createTempFile("itw", "lockingFile"); f.delete(); LockedFile lf = LockedFile.getInstance(f); lf.lock(); lf.unlock(); } @Test public void testLockUnlockNoOkNotExists() throws IOException { File parent = File.createTempFile("itw", "lockingFile"); parent.deleteOnExit(); File f = new File(parent, "itwLcokingRelict"); f.delete(); parent.setReadOnly(); LockedFile lf = LockedFile.getInstance(f); lf.lock(); lf.unlock();; } @Test public void testLockUnlockNotOkExists() throws IOException { File f = new File("/some/deffinitley/not/exisitng/file.itw"); LockedFile lf = LockedFile.getInstance(f); lf.lock(); lf.unlock(); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/PaxHeaders.7406/LockingReaderW0000644000000000000000000000013213441742745030424 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/LockingReaderWriterTest.java0000644000175000002070000001634613441742745034074 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.util.lockingfile; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Before; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.junit.Assert; import org.junit.Test; public class LockingReaderWriterTest { private static File storagefile; private static TestStringReaderWriter newInstance() { return new TestStringReaderWriter(storagefile); } @Before public void setUp() throws IOException { storagefile = File.createTempFile("foo", "bar"); } @Test public void testSimpleActions() throws IOException { TestStringReaderWriter storage = newInstance(); storage.add("teststring"); assertTrue(storage.contains("teststring")); storage.remove("teststring"); assertFalse(storage.contains("teststring")); } @Test public void testInterleavedActions() throws IOException { TestStringReaderWriter storage1 = newInstance(); TestStringReaderWriter storage2 = newInstance(); storage1.add("teststring"); assertTrue(storage2.contains("teststring")); storage2.remove("teststring"); assertFalse(storage1.contains("teststring")); } static class TestThread extends Thread { String testString; int iterations; Throwable error = null; TestThread(String testString, int iterations) { this.testString = testString; this.iterations = iterations; } @Override public void run() { try { TestStringReaderWriter storage = newInstance(); for (int i = 0; i < iterations; i++) { assertTrue(storage.contains(this.testString)); storage.add(this.testString); storage.remove(this.testString); assertTrue(storage.contains(this.testString)); } } catch (Throwable error) { error.printStackTrace(); this.error = error; } } } private void concurrentReadWrites(int threadAmount, int iterations, String testString) throws InterruptedException { TestStringReaderWriter storage = newInstance(); storage.add(testString); List testThreads = new ArrayList(); for (int i = 0; i < threadAmount; i++) { TestThread thread = new TestThread(testString, iterations); testThreads.add(thread); thread.start(); } for (int i = 0; i < threadAmount; i++) { testThreads.get(i).join(); } assertTrue(storage.contains(testString)); storage.remove(testString); // So long as number adds == number writes, we should be left with // nothing at end. assertFalse(storage.contains(testString)); } // Long testing string, the contents are not important private String makeLongTestString() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(Integer.toString(i)); } return sb.toString(); } @Test public void testManyReadWrite() throws Exception { int oneThread = 1; String shortString = "teststring"; // This was causing 'too many open files' because FileUtils#getFileLock // leaks file descriptors. No longer used. concurrentReadWrites(oneThread, 500 /* iterations */, shortString); } @Test public void testManyThreads() throws Exception { int threadAmount = 25; String shortString = "teststring"; String longString = makeLongTestString(); concurrentReadWrites(threadAmount, 10 /* per-thread iterations */, shortString); concurrentReadWrites(threadAmount, 2 /* per-thread iterations */, longString); } /** * Concrete implementation to aid in testing LockingReaderWriter */ public static class TestStringReaderWriter extends LockingReaderWriter { private List cachedContents = new ArrayList(); public TestStringReaderWriter(File file) { super(file); } @Override public void writeContent(BufferedWriter writer) throws IOException { for (String string : cachedContents) { writer.write(string); writer.newLine(); } } @Override protected void readLine(String line) { this.cachedContents.add(line); } @Override protected void readContents() throws IOException { cachedContents.clear(); super.readContents(); } /* * Atomic container abstraction methods. */ synchronized public void add(final String line) { doLocked(new Runnable() { public void run() { try { readContents(); cachedContents.add(line); writeContents(); } catch (IOException ex) { throw new StorageIoException(ex); } } }); } synchronized public boolean contains(final String line) { final boolean[] doesContain = { false }; doLocked(new Runnable() { public void run() { try { readContents(); doesContain[0] = cachedContents.contains(line); } catch (IOException e) { throw new StorageIoException(e); } } }); return doesContain[0]; } synchronized public boolean remove(final String line) { final boolean[] didRemove = { false }; doLocked(new Runnable() { public void run() { try { readContents(); didRemove[0] = cachedContents.remove(line); writeContents(); } catch (IOException e) { throw new StorageIoException(e); } } }); return didRemove[0]; } } }icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/PropertiesFileTest.java0000644000000000000000000000013213441742745030012 xustar0030 mtime=1552401893.070832758 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PropertiesFileTest.java0000644000175000002070000001322213441742745030622 0ustar00jvanekmock00000000000000/* PropertiesFileTest.java Copyright (C) 2012 Thomas Meyer This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.nio.file.Files; import org.junit.Before; import org.junit.Test; public class PropertiesFileTest { private PropertiesFile propertiesFile; @Before public void setup() throws IOException { File lru = Files.createTempFile("properties_file", ".tmp").toFile(); lru.createNewFile(); lru.deleteOnExit(); propertiesFile = new PropertiesFile(lru); } @Test public void testSetProperty() { propertiesFile.setProperty("key", "value"); assertTrue(propertiesFile.containsKey("key") && propertiesFile.containsValue("value")); } @Test public void testGetProperty() { propertiesFile.setProperty("key", "value"); String v = propertiesFile.getProperty("key"); assertEquals("value", v); } @Test public void testGetDefaultProperty() { String v = propertiesFile.getProperty("key", "default"); assertEquals("default", v); } @Test public void testStore() throws IOException { String key = "key"; String value = "value"; propertiesFile.setProperty(key, value); try { propertiesFile.lock(); propertiesFile.store(); } finally { propertiesFile.unlock(); } File f = propertiesFile.getStoreFile(); String output = new String(Files.readAllBytes(f.toPath())); assertTrue(output.contains(key + "=" + value)); } @Test public void testReloadAfterStore() { try { boolean reloaded; propertiesFile.lock(); // 1. clear entries + store clearPropertiesFile(); // 2. load from file reloaded = propertiesFile.load(); assertTrue("File was not reloaded!", reloaded); // 3. add some entries and store fillProperties(10); propertiesFile.store(); reloaded = propertiesFile.load(); assertTrue("File was not reloaded!", reloaded); } finally { propertiesFile.unlock(); } } private void fillProperties(int noEntries) { for(int i = 0; i < noEntries; i++) { propertiesFile.setProperty(String.valueOf(i), String.valueOf(i)); } } private void clearPropertiesFile() { try { propertiesFile.lock(); // clear cache + store file propertiesFile.clear(); propertiesFile.store(); } finally { propertiesFile.unlock(); } } @Test public void testLoad() throws InterruptedException { try { propertiesFile.lock(); propertiesFile.setProperty("key", "value"); propertiesFile.store(); propertiesFile.setProperty("shouldNotRemainAfterLoad", "def"); propertiesFile.load(); assertFalse(propertiesFile.contains("shouldNotRemainAfterLoad")); } finally { propertiesFile.unlock(); } } @Test public void testLoadWithNoChanges() throws InterruptedException { try { propertiesFile.lock(); propertiesFile.setProperty("key", "value"); propertiesFile.store(); Thread.sleep(1000l); assertFalse(propertiesFile.load()); } finally { propertiesFile.unlock(); } } @Test public void testLock() throws IOException { try { propertiesFile.lock(); assertTrue(propertiesFile.isHeldByCurrentThread()); } finally { propertiesFile.unlock(); } } @Test public void testUnlock() throws IOException { try { propertiesFile.lock(); } finally { propertiesFile.unlock(); } assertTrue(!propertiesFile.isHeldByCurrentThread()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/logging0000644000000000000000000000013213441742745024724 xustar0030 mtime=1552401893.114832667 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/0000755000175000002070000000000013441742745025611 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/JavaConsoleTest.ja0000644000000000000000000000013213441742745030361 xustar0030 mtime=1552401893.086832725 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/JavaConsoleTest.java0000644000175000002070000001170713441742745031526 0ustar00jvanekmock00000000000000/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package net.sourceforge.jnlp.util.logging; import java.util.Date; import java.util.TimeZone; import net.sourceforge.jnlp.util.logging.headers.PluginMessage; import org.junit.Assert; import org.junit.Test; public class JavaConsoleTest { //note this time is in EST timezone, and so is expecting the string output below private static final String TEST_TIME = "Tue Nov 19 09:43:50 "+TimeZone.getTimeZone("EST").getDisplayName(false, TimeZone.SHORT)+" 2013"; private static final String S1 = "plugindebug 1384850630162925 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG]["+TEST_TIME+"][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1204] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: PIPE: plugin read: plugin PluginProxyInfo reference 1 http://www.walter-fendt.de:80"; private static final String S2 = "plugindebugX 1384850630162954 [jvanek][ITW-Cplugindebug 1384850630163008 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG]["+TEST_TIME+"][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1124] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: parts[0]=plugin, parts[1]=PluginProxyInfo, reference, parts[3]=1, parts[4]=http://www.walter-fendt.de:80 -- decoded_url=http://www.walter-fendt.de:80"; private static final String S3 = "preinit_pluginerror 1384850630163298 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG]["+TEST_TIME+"][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1134] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: Proxy info: plugin PluginProxyInfo reference 1 DIRECT"; private static final String S4 = "plugindebugX blob [jvanek][ITW-Cplugindebug 1384850630163008 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG]["+TEST_TIME+"][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1124] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: parts[0]=plugin, parts[1]=PluginProxyInfo, reference, parts[3]=1, parts[4]=http://www.walter-fendt.de:80 -- decoded_url=http://www.walter-fendt.de:80"; @Test public void CreatePluginHeaderTestOK() throws Exception{ PluginMessage p1 = new PluginMessage(S1); PluginMessage p2 = new PluginMessage(S2); PluginMessage p3 = new PluginMessage(S3); Assert.assertFalse(p1.wasError); Assert.assertFalse(p2.wasError); Assert.assertFalse(p3.wasError); Assert.assertTrue(p1.header.isC); Assert.assertTrue(p2.header.isC); Assert.assertTrue(p3.header.isC); Assert.assertEquals(OutputController.Level.MESSAGE_DEBUG, p1.header.level); Assert.assertEquals(OutputController.Level.WARNING_ALL, p2.header.level); Assert.assertEquals(OutputController.Level.ERROR_ALL, p3.header.level); Assert.assertTrue(p1.header.date.toString().contains(TEST_TIME) && p1.header.date.toString().contains("2013")); Assert.assertTrue(p2.header.date.toString().contains("ITW-C-PLUGIN")); Assert.assertTrue(p3.header.date.toString().contains(TEST_TIME) && p3.header.date.toString().contains("2013")); Assert.assertTrue(p1.header.caller.contains("/home/jvanek")); Assert.assertTrue(p3.header.caller.contains("/home/jvanek")); Assert.assertTrue(p1.header.user.equals("jvanek")); Assert.assertTrue(p2.header.user.equals("jvanek")); Assert.assertTrue(p3.header.user.equals("jvanek")); Assert.assertTrue(p1.header.thread1.equals("140513434003264")); Assert.assertTrue(p1.header.thread2.equals("0x7fcbd531f8c0")); Assert.assertTrue(p2.header.thread1.equals("19")); Assert.assertTrue(p2.header.thread2.equals("43")); Assert.assertTrue(p3.header.thread1.equals("140513434003264")); Assert.assertTrue(p3.header.thread2.equals("0x7fcbd531f8c0")); Assert.assertTrue(p1.restOfMessage.equals(" PIPE: plugin read: plugin PluginProxyInfo reference 1 http://www.walter-fendt.de:80")); Assert.assertEquals("0 EST 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1124] " + "ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: parts[0]=plugin, parts[1]=PluginProxyInfo, reference, parts[3]=1, " + "parts[4]=http://www.walter-fendt.de:80 -- decoded_url=http://www.walter-fendt.de:80", p2.restOfMessage); Assert.assertTrue(p3.restOfMessage.equals("Proxy info: plugin PluginProxyInfo reference 1 DIRECT")); } @Test public void CreatePluginHeaderTestNotOK()throws Exception{ PluginMessage p4 = new PluginMessage(S4); Assert.assertTrue(p4.wasError); Assert.assertTrue(p4.header.isC); Assert.assertEquals(OutputController.Level.WARNING_ALL, p4.header.level); Assert.assertTrue(p4.header.date.toString().contains(new Date().toString().substring(0, 16))); //means no Tue Nov 19 09:43:50 :) Assert.assertTrue(p4.header.thread1.equals("unknown")); Assert.assertTrue(p4.header.thread2.equals("unknown")); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/FileLogTest.java0000644000000000000000000000013213441742745030025 xustar0030 mtime=1552401893.114832667 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/FileLogTest.java0000644000175000002070000001677113441742745030651 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.util.StreamUtils; import net.sourceforge.jnlp.util.logging.filelogs.LogBasedFileLog; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class FileLogTest { private static final File[] loggingTargets = new File[12]; private static final String line1 = "I'm logged line one"; private static final String line2 = "I'm logged line two"; private static final String line3 = "I'm logged line three"; private static final RulesFolowingClosingListener.ContainsRule r1 = new RulesFolowingClosingListener.ContainsRule(line1); private static final RulesFolowingClosingListener.ContainsRule r2 = new RulesFolowingClosingListener.ContainsRule(line2); private static final RulesFolowingClosingListener.ContainsRule r3 = new RulesFolowingClosingListener.ContainsRule(line3); @BeforeClass public static void prepareTmpFiles() throws IOException { for (int i = 0; i < loggingTargets.length; i++) { loggingTargets[i] = File.createTempFile("fileLogger", "iteTest"); loggingTargets[i].deleteOnExit(); } //delete first half of the files, logger should handle both casses for (int i = 0; i < loggingTargets.length / 2; i++) { loggingTargets[i].delete(); } } @AfterClass public static void cleanTmpFiles() throws IOException { for (int i = 0; i < loggingTargets.length; i++) { loggingTargets[i].delete(); } } @Test public void isAppendingLoggerLoggingOnNotExisitngFile() throws Exception { int i = 0; LogBasedFileLog l = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l.log(line1); String s = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r1.evaluate(s)); } @Test public void isRewritingLoggerLoggingOnNotExisitngFile() throws Exception { int i = 1; LogBasedFileLog l = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l.log(line1); String s = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r1.evaluate(s)); } @Test public void isRewritingLoggerRewritingOnNotExisitngFile() throws Exception { int i = 2; LogBasedFileLog l1 = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l1.log(line2); String s1 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s1)); l1.close(); LogBasedFileLog l2 = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l2.log(line3); String s2 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertFalse(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s2)); } @Test public void isAppendingLoggerAppendingOnNotExisitngFile() throws Exception { int i = 4; LogBasedFileLog l1 = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l1.log(line2); String s1 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s1)); l1.close(); LogBasedFileLog l2 = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l2.log(line3); String s2 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s2)); } //************ @Test public void isAppendingLoggerLoggingOnExisitngFile() throws Exception { int i = 6; LogBasedFileLog l = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l.log(line1); String s = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r1.evaluate(s)); } @Test public void isRewritingLoggerLoggingOnExisitngFile() throws Exception { int i = 7; LogBasedFileLog l = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l.log(line1); String s = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r1.evaluate(s)); } @Test public void isRewritingLoggerRewritingOnExisitngFile() throws Exception { int i = 8; LogBasedFileLog l1 = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l1.log(line2); String s1 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s1)); l1.close(); LogBasedFileLog l2 = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l2.log(line3); String s2 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertFalse(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s2)); } @Test public void isAppendingLoggerAppendingOnExisitngFile() throws Exception { int i = 10; LogBasedFileLog l1 = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l1.log(line2); String s1 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s1)); l1.close(); LogBasedFileLog l2 = new LogBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l2.log(line3); String s2 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s2)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/OutputControllerTe0000644000000000000000000000013213441742745030561 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/OutputControllerTest.java0000644000175000002070000004012213441742745032657 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.PrintStream; import java.util.Random; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.util.StreamUtils; import net.sourceforge.jnlp.util.logging.filelogs.WriterBasedFileLog; import org.junit.Assert; import org.junit.After; import org.junit.Before; import org.junit.Test; public class OutputControllerTest { private static final String line1 = "I'm logged line one"; private static final String line2 = "I'm logged line two"; private static final String line3 = "I'm logged line three"; private static final String line4 = "I'm logged line four"; private static final String line5 = "I'm logged line five"; private static final String line6 = "I'm logged line six"; private static final RulesFolowingClosingListener.ContainsRule r1 = new RulesFolowingClosingListener.ContainsRule(line1); private static final RulesFolowingClosingListener.ContainsRule r2 = new RulesFolowingClosingListener.ContainsRule(line2); private static final RulesFolowingClosingListener.ContainsRule r3 = new RulesFolowingClosingListener.ContainsRule(line3); private static final RulesFolowingClosingListener.ContainsRule r4 = new RulesFolowingClosingListener.ContainsRule(line4); private static final RulesFolowingClosingListener.ContainsRule r5 = new RulesFolowingClosingListener.ContainsRule(line5); private static final RulesFolowingClosingListener.ContainsRule r6 = new RulesFolowingClosingListener.ContainsRule(line6); private static class AccessiblePrintStream extends PrintStream { public AccessiblePrintStream(ByteArrayOutputStream out) { super(out); } public ByteArrayOutputStream getOut() { return (ByteArrayOutputStream) out; } } @Before public void setUp() { LogConfig.resetLogConfig(); } @After public void tearDown() { LogConfig.resetLogConfig(); } @Test public void isLoggingStdStreams() throws Exception { ByteArrayOutputStream os1 = new ByteArrayOutputStream(); ByteArrayOutputStream os2 = new ByteArrayOutputStream(); OutputController oc = new OutputController(new PrintStream(os1), new PrintStream(os2)); LogConfig.getLogConfig().setEnableLogging(false); LogConfig.getLogConfig().setLogToFile(false); LogConfig.getLogConfig().setLogToStreams(true); LogConfig.getLogConfig().setLogToSysLog(false); oc.log(OutputController.Level.MESSAGE_DEBUG, line1); oc.log(OutputController.Level.ERROR_DEBUG, line1); oc.flush(); Assert.assertFalse(r1.evaluate(os1.toString("utf-8"))); Assert.assertFalse(r1.evaluate(os2.toString("utf-8"))); oc.log(OutputController.Level.MESSAGE_ALL, line1); oc.log(OutputController.Level.ERROR_DEBUG, line1); oc.flush(); Assert.assertTrue(r1.evaluate(os1.toString("utf-8"))); Assert.assertFalse(r1.evaluate(os2.toString("utf-8"))); oc.log(OutputController.Level.ERROR_ALL, line1); oc.flush(); Assert.assertTrue(r1.evaluate(os2.toString("utf-8"))); LogConfig.getLogConfig().setEnableLogging(true); oc.log(OutputController.Level.MESSAGE_DEBUG, line2); oc.flush(); Assert.assertTrue(r2.evaluate(os1.toString("utf-8"))); Assert.assertFalse(r2.evaluate(os2.toString("utf-8"))); oc.log(OutputController.Level.ERROR_DEBUG, line2); oc.flush(); Assert.assertTrue(r2.evaluate(os1.toString("utf-8"))); Assert.assertTrue(r2.evaluate(os2.toString("utf-8"))); oc.log(OutputController.Level.ERROR_DEBUG, line3); oc.flush(); Assert.assertFalse(r3.evaluate(os1.toString("utf-8"))); Assert.assertTrue(r3.evaluate(os2.toString("utf-8"))); oc.log(OutputController.Level.MESSAGE_DEBUG, line3); oc.flush(); Assert.assertTrue(r3.evaluate(os1.toString("utf-8"))); Assert.assertTrue(r3.evaluate(os2.toString("utf-8"))); LogConfig.getLogConfig().setEnableLogging(false); oc.log(OutputController.Level.WARNING_DEBUG, line4); oc.flush(); Assert.assertFalse(r4.evaluate(os1.toString("utf-8"))); Assert.assertFalse(r4.evaluate(os2.toString("utf-8"))); oc.log(OutputController.Level.WARNING_ALL, line5); oc.flush(); Assert.assertTrue(r5.evaluate(os1.toString("utf-8"))); Assert.assertTrue(r5.evaluate(os2.toString("utf-8"))); LogConfig.getLogConfig().setEnableLogging(true); oc.log(OutputController.Level.WARNING_DEBUG, line4); oc.flush(); Assert.assertTrue(r4.evaluate(os1.toString("utf-8"))); Assert.assertTrue(r4.evaluate(os2.toString("utf-8"))); } private static final Random random = new Random(); private int delayable = 0; private class IdedRunnable implements Runnable { private final int id; private final OutputController oc; private boolean done = false; private final int iterations; public IdedRunnable(int id, OutputController oc, int iterations) { this.id = id; this.oc = oc; this.iterations = iterations; } @Override public void run() { for (int i = 0; i < iterations; i++) { try { //be sure this pattern is kept in assers oc.log(OutputController.Level.WARNING_ALL, "thread " + id + " line " + i); Thread.sleep(random.nextInt(delayable)); } catch (Exception ex) { throw new RuntimeException(ex); } } done = true; } public boolean isDone() { return done; } } /** * todo - include syslog once implemented */ @Test public void isParalelLogingWorking() throws Exception { LogConfig.getLogConfig().setEnableLogging(true); LogConfig.getLogConfig().setLogToStreams(true); LogConfig.getLogConfig().setLogToSysLog(false); String s = ""; //this was tested with 1-100 iterations and 100 threads. But can couse OutOfMemoryError int maxi = 90; int minits = 70; int maxt = 10; //tested with delayable 1-10, but took minutes then for (delayable = 1; delayable < 1; delayable++) { for (int iterations = minits; iterations < maxi; iterations++) { for (int threads = 1; threads < maxt; threads++) { LogConfig.getLogConfig().setLogToFile(false); System.gc(); ByteArrayOutputStream os1 = new ByteArrayOutputStream(); ByteArrayOutputStream os2 = new ByteArrayOutputStream(); OutputController oc = new OutputController(new PrintStream(os1), new PrintStream(os2)); File f = File.createTempFile("replacedFilelogger", "itwTest"); f.deleteOnExit(); oc.setFileLog(new WriterBasedFileLog(f.getAbsolutePath(), false)); LogConfig.getLogConfig().setLogToFile(true); ThreadGroup tg = new ThreadGroup("TerribleGroup"); IdedRunnable[] idedRunnables = new IdedRunnable[threads]; Thread[] xt = new Thread[threads]; for (int i = 0; i < threads; i++) { Thread.sleep(random.nextInt(delayable)); idedRunnables[i] = new IdedRunnable(i, oc, iterations); xt[i] = new Thread(tg, idedRunnables[i], "iterations = " + iterations + "; threads = " + threads + "; delayable = " + delayable); xt[i].start(); } while (true) { boolean ok = true; for (IdedRunnable idedRunnable : idedRunnables) { if (!idedRunnable.isDone()) { ok = false; break; } } if (ok) { break; } } oc.flush(); String s1 = os1.toString("utf-8"); String s2 = os2.toString("utf-8"); String s3 = StreamUtils.readStreamAsString(new FileInputStream(f), true); for (int i = minits; i < maxi; i++) { for (int t = 0; t < maxt; t++) { //be sure this pattern is kept in IdedRunnable String expected = "thread " + t + " line " + i; if (i >= iterations || t >= threads) { Assert.assertFalse(s1.contains(expected)); Assert.assertFalse(s2.contains(expected)); Assert.assertFalse(s3.contains(expected)); } else { Assert.assertTrue(s1.contains(expected)); Assert.assertTrue(s2.contains(expected)); Assert.assertTrue(s3.contains(expected)); } } } tg.destroy(); } } } } @Test public void isChangingOfStreasmWorking() throws Exception { LogConfig.getLogConfig().setEnableLogging(true); LogConfig.getLogConfig().setLogToFile(false); LogConfig.getLogConfig().setLogToStreams(true); LogConfig.getLogConfig().setLogToSysLog(false); ByteArrayOutputStream os1 = new ByteArrayOutputStream(); ByteArrayOutputStream os2 = new ByteArrayOutputStream(); OutputController oc = new OutputController(new PrintStream(os1), new PrintStream(os2)); oc.log(OutputController.Level.MESSAGE_ALL, line1); oc.log(OutputController.Level.ERROR_ALL, line1); oc.flush(); ByteArrayOutputStream os3 = new ByteArrayOutputStream(); ByteArrayOutputStream os4 = new ByteArrayOutputStream(); oc.setOut(new PrintStream(os3)); oc.log(OutputController.Level.MESSAGE_ALL, line2); oc.log(OutputController.Level.ERROR_ALL, line2); oc.flush(); oc.setErr(new PrintStream(os4)); oc.log(OutputController.Level.MESSAGE_ALL, line3); oc.log(OutputController.Level.ERROR_ALL, line3); oc.flush(); Assert.assertTrue(r1.evaluate(os1.toString("utf-8"))); Assert.assertTrue(r1.evaluate(os2.toString("utf-8"))); Assert.assertFalse(r1.evaluate(os3.toString("utf-8"))); Assert.assertFalse(r1.evaluate(os4.toString("utf-8"))); Assert.assertFalse(r2.evaluate(os1.toString("utf-8"))); Assert.assertTrue(r2.evaluate(os2.toString("utf-8"))); Assert.assertTrue(r2.evaluate(os3.toString("utf-8"))); Assert.assertFalse(r2.evaluate(os4.toString("utf-8"))); Assert.assertFalse(r3.evaluate(os1.toString("utf-8"))); Assert.assertFalse(r3.evaluate(os2.toString("utf-8"))); Assert.assertTrue(r3.evaluate(os3.toString("utf-8"))); Assert.assertTrue(r3.evaluate(os4.toString("utf-8"))); LogConfig.getLogConfig().setLogToStreams(false); oc.log(OutputController.Level.MESSAGE_ALL, line4); oc.log(OutputController.Level.ERROR_ALL, line4); Assert.assertFalse(r4.evaluate(os1.toString("utf-8"))); Assert.assertFalse(r4.evaluate(os2.toString("utf-8"))); Assert.assertFalse(r4.evaluate(os3.toString("utf-8"))); Assert.assertFalse(r4.evaluate(os4.toString("utf-8"))); } @Test public void isFileLoggerWorking() throws Exception { String s1 = ""; String s2 = ""; LogConfig.getLogConfig().setEnableLogging(true); LogConfig.getLogConfig().setLogToFile(false); LogConfig.getLogConfig().setLogToStreams(false); LogConfig.getLogConfig().setLogToSysLog(false); ByteArrayOutputStream os1 = new ByteArrayOutputStream(); ByteArrayOutputStream os2 = new ByteArrayOutputStream(); OutputController oc = new OutputController(new PrintStream(os1), new PrintStream(os2)); File f1 = File.createTempFile("replacedFilelogger", "itwTest"); File f2 = File.createTempFile("replacedFilelogger", "itwTest"); f1.deleteOnExit(); f2.deleteOnExit(); oc.setFileLog(new WriterBasedFileLog(f1.getAbsolutePath(), false)); LogConfig.getLogConfig().setLogToFile(true); oc.log(OutputController.Level.MESSAGE_ALL, line1); oc.log(OutputController.Level.ERROR_ALL, line2); oc.log(OutputController.Level.MESSAGE_ALL, line3); oc.flush(); s1 = StreamUtils.readStreamAsString(new FileInputStream(f1), true); s2 = StreamUtils.readStreamAsString(new FileInputStream(f2), true); Assert.assertTrue(r1.evaluate(s1)); Assert.assertFalse(r1.evaluate(s2)); Assert.assertTrue(r2.evaluate(s1)); Assert.assertFalse(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s1)); Assert.assertFalse(r3.evaluate(s2)); oc.setFileLog(new WriterBasedFileLog(f2.getAbsolutePath(), false)); oc.log(OutputController.Level.ERROR_ALL, line5); oc.log(OutputController.Level.MESSAGE_ALL, line5); oc.flush(); s1 = StreamUtils.readStreamAsString(new FileInputStream(f1), true); s2 = StreamUtils.readStreamAsString(new FileInputStream(f2), true); Assert.assertTrue(r1.evaluate(s1)); Assert.assertFalse(r1.evaluate(s2)); Assert.assertTrue(r2.evaluate(s1)); Assert.assertFalse(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s1)); Assert.assertFalse(r3.evaluate(s2)); Assert.assertFalse(r5.evaluate(s1)); Assert.assertTrue(r5.evaluate(s2)); LogConfig.getLogConfig().setLogToFile(false); oc.log(OutputController.Level.ERROR_ALL, line6); oc.log(OutputController.Level.MESSAGE_ALL, line6); oc.flush(); s1 = StreamUtils.readStreamAsString(new FileInputStream(f1), true); s2 = StreamUtils.readStreamAsString(new FileInputStream(f2), true); Assert.assertFalse(r6.evaluate(s1)); Assert.assertFalse(r6.evaluate(s2)); } /** * add syslog once implemented */ @Test public void isSysLoggerWorking() throws Exception { } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/TeeOutputStreamTes0000644000000000000000000000013213441742745030512 xustar0030 mtime=1552401893.077832744 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/TeeOutputStreamTest.java0000644000175000002070000000617713441742745032441 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.util.logging; import org.junit.Before; import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.nio.charset.Charset; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.WindowsIssue; import static org.junit.Assert.assertTrue; public class TeeOutputStreamTest { private PrintStream teePrintStream; private TeeOutputStream tos; @Before public void setup() { teePrintStream = new PrintStream(new ByteArrayOutputStream(), true); tos = new TeeOutputStream(teePrintStream, false); } @Test public void testPrintLn() throws IOException { String s = "HelфН хЅНlo \n World!"; tos.println(s); //println should be immediately flushed assertTrue(tos.getByteArrayOutputStream().toString().isEmpty()); } @Test @WindowsIssue public void testPrint() throws IOException { if (Charset.defaultCharset().toString().toLowerCase().startsWith("windows")) { String s = "У†У†У†У†У†Hello!\r"; tos.print(s); assertTrue(tos.getByteArrayOutputStream().toString().equals(s)); } else { String s = "рЄЈрЄЎрЄИрЅрЄЄHello!\r"; //first five symbols are printed as "?" by windows' default character encoding tos.print(s); assertTrue(tos.getByteArrayOutputStream().toString().equals(s)); } } @Test @WindowsIssue public void testWriteByteArrayString() throws IOException { if (Charset.defaultCharset().toString().toLowerCase().startsWith("windows")) { String s = "He\n\n\\llo chУ o"; tos.write(s.getBytes(), 0, s.getBytes().length); assertTrue(tos.getByteArrayOutputStream().toString().equals(s)); } else { String s = "He\n\n\\llo chaЭ€o"; //grave accent as "?" by windows' default character encoding tos.write(s.getBytes(), 0, s.getBytes().length); assertTrue(tos.getByteArrayOutputStream().toString().equals(s)); } } @Test @WindowsIssue @KnownToFail public void testWriteByteArrayString2() throws IOException { //last character missing String s = "He\n\n\\llo chaЭ€o"; //grave accent as "?" by windows' default character encoding tos.write(s.getBytes("utf-8"), 0, s.getBytes().length); assertTrue(tos.getByteArrayOutputStream().toString("utf-8").equals(s)); } @Test public void testWriteByte() throws IOException { byte b = 5; tos.write(b); assertTrue(byteArrayEquals(b, tos.getByteArrayOutputStream().toByteArray())); } @Test public void testFlush() throws IOException { String s = "Hello"; tos.print(s); assertTrue(!tos.getByteArrayOutputStream().toString().isEmpty()); tos.flush(); assertTrue(tos.getByteArrayOutputStream().toString().isEmpty()); } private boolean byteArrayEquals(byte b, byte[] arr) { for (byte i : arr) { if (b != i) { return false; } } return true; } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/PrintStreamLoggerT0000644000000000000000000000013213441742745030460 xustar0030 mtime=1552401893.077832744 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/PrintStreamLoggerTest.java0000644000175000002070000001141013441742745032721 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import org.junit.Assert; import org.junit.Test; public class PrintStreamLoggerTest { private static String line1 = "I'm logged line one"; private static String line2 = "I'm logged line two"; private static RulesFolowingClosingListener.ContainsRule r1 = new RulesFolowingClosingListener.ContainsRule(line1); private static RulesFolowingClosingListener.ContainsRule r2 = new RulesFolowingClosingListener.ContainsRule(line2); private static class AccessiblePrintStream extends PrintStream{ public AccessiblePrintStream(ByteArrayOutputStream out) { super(out); } public ByteArrayOutputStream getOut() { return (ByteArrayOutputStream) out; } } @Test public void isLoggingAtAll() throws Exception { int i = 0; ByteArrayOutputStream output = new ByteArrayOutputStream(); PrintStreamLogger l = new PrintStreamLogger(new PrintStream(output)); l.log(line1); Assert.assertTrue(r1.evaluate(output.toString("utf-8"))); l.log(line2); Assert.assertTrue(r1.evaluate(output.toString("utf-8"))); Assert.assertTrue(r2.evaluate(output.toString("utf-8"))); } @Test public void isReturningStream() throws Exception { int i = 0; ByteArrayOutputStream output = new ByteArrayOutputStream(); AccessiblePrintStream ps = new AccessiblePrintStream(output); PrintStreamLogger l = new PrintStreamLogger(ps); l.log(line1); Assert.assertTrue(r1.evaluate(output.toString("utf-8"))); AccessiblePrintStream got = (AccessiblePrintStream) l.getStream(); Assert.assertTrue(r1.evaluate(got.getOut().toString("utf-8"))); l.log(line2); Assert.assertTrue(r1.evaluate(output.toString("utf-8"))); Assert.assertTrue(r2.evaluate(output.toString("utf-8"))); Assert.assertTrue(r1.evaluate(got.getOut().toString("utf-8"))); Assert.assertTrue(r2.evaluate(got.getOut().toString("utf-8"))); Assert.assertTrue(got == ps); } @Test public void isSettingStream() throws Exception { int i = 0; ByteArrayOutputStream output1 = new ByteArrayOutputStream(); ByteArrayOutputStream output2 = new ByteArrayOutputStream(); AccessiblePrintStream ps = new AccessiblePrintStream(output1); PrintStreamLogger l = new PrintStreamLogger(ps); l.log(line1); Assert.assertTrue(r1.evaluate(output1.toString("utf-8"))); AccessiblePrintStream set = new AccessiblePrintStream(output2); l.setStream(set); l.log(line2); Assert.assertFalse(r1.evaluate(output2.toString("utf-8"))); Assert.assertTrue(r2.evaluate(output2.toString("utf-8"))); Assert.assertFalse(r1.evaluate(set.getOut().toString("utf-8"))); Assert.assertTrue(r2.evaluate(set.getOut().toString("utf-8"))); Assert.assertTrue(set != ps); Assert.assertTrue(set == l.getStream()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/WriterBasedFileLog0000644000000000000000000000013213441742745030401 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/logging/WriterBasedFileLogTest.java0000644000175000002070000001713213441742745032775 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener; import net.sourceforge.jnlp.util.StreamUtils; import net.sourceforge.jnlp.util.logging.filelogs.WriterBasedFileLog; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class WriterBasedFileLogTest { private static final File[] loggingTargets = new File[12]; private static final String line1 = "I'm logged line one"; private static final String line2 = "I'm logged line two"; private static final String line3 = "I'm logged line three"; private static final RulesFolowingClosingListener.ContainsRule r1 = new RulesFolowingClosingListener.ContainsRule(line1); private static final RulesFolowingClosingListener.ContainsRule r2 = new RulesFolowingClosingListener.ContainsRule(line2); private static final RulesFolowingClosingListener.ContainsRule r3 = new RulesFolowingClosingListener.ContainsRule(line3); @BeforeClass public static void prepareTmpFiles() throws IOException { for (int i = 0; i < loggingTargets.length; i++) { loggingTargets[i] = File.createTempFile("WriterBasedFileLogger", "iteTest"); loggingTargets[i].deleteOnExit(); } //delete first half of the files, logger should handle both casses for (int i = 0; i < loggingTargets.length / 2; i++) { loggingTargets[i].delete(); } } @AfterClass public static void cleanTmpFiles() throws IOException { for (int i = 0; i < loggingTargets.length; i++) { loggingTargets[i].delete(); } } @Test public void isAppendingLoggerLoggingOnNotExisitngFile() throws Exception { int i = 0; WriterBasedFileLog l = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l.log(line1); String s = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r1.evaluate(s)); } @Test public void isRewritingLoggerLoggingOnNotExisitngFile() throws Exception { int i = 1; WriterBasedFileLog l = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l.log(line1); String s = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r1.evaluate(s)); } @Test public void isRewritingLoggerRewritingOnNotExisitngFile() throws Exception { int i = 2; WriterBasedFileLog l1 = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l1.log(line2); String s1 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s1)); l1.close(); WriterBasedFileLog l2 = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l2.log(line3); String s2 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertFalse(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s2)); } @Test public void isAppendingLoggerAppendingOnNotExisitngFile() throws Exception { int i = 4; WriterBasedFileLog l1 = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l1.log(line2); String s1 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s1)); l1.close(); WriterBasedFileLog l2 = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l2.log(line3); String s2 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s2)); } //************ @Test public void isAppendingLoggerLoggingOnExisitngFile() throws Exception { int i = 6; WriterBasedFileLog l = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l.log(line1); String s = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r1.evaluate(s)); } @Test public void isRewritingLoggerLoggingOnExisitngFile() throws Exception { int i = 7; WriterBasedFileLog l = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l.log(line1); String s = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r1.evaluate(s)); } @Test public void isRewritingLoggerRewritingOnExisitngFile() throws Exception { int i = 8; WriterBasedFileLog l1 = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l1.log(line2); String s1 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s1)); l1.close(); WriterBasedFileLog l2 = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), false); l2.log(line3); String s2 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertFalse(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s2)); } @Test public void isAppendingLoggerAppendingOnExisitngFile() throws Exception { int i = 10; WriterBasedFileLog l1 = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l1.log(line2); String s1 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s1)); l1.close(); WriterBasedFileLog l2 = new WriterBasedFileLog(loggingTargets[i].getAbsolutePath(), true); l2.log(line3); String s2 = StreamUtils.readStreamAsString(new FileInputStream(loggingTargets[i]), true); Assert.assertTrue(r2.evaluate(s2)); Assert.assertTrue(r3.evaluate(s2)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/docprovider0000644000000000000000000000013213441742745025616 xustar0030 mtime=1552401893.076832746 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/0000755000175000002070000000000013441742745026503 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/PaxHeaders.7406/ReadAutorsTest0000644000000000000000000000013113441742745030526 xustar0029 mtime=1552401893.07483275 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/ReadAutorsTest.java0000644000175000002070000001742213441742745032265 0ustar00jvanekmock00000000000000/* ReadAutorsTest.java Copyright (C) 2017 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider; import java.io.IOException; import java.io.StringReader; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.HtmlFormatter; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.ManFormatter; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.PlainTextFormatter; import static org.junit.Assert.assertEquals; import org.junit.Test; public class ReadAutorsTest { public static final String NEWLINE = System.getProperty("line.separator"); public static final String HTMLNEWLINE = "
"; public static final String MANNEWLINE = ".br"; private static final String ANTISPAM_EMAIL="t e s t @ t e s t . t e s t"; public static final String TESTTEXT = "NAME SURNAME " + NEWLINE + "<><><>"; public static final String BRACKETSTESTREPLACED = "NAME SURNAME <test@test.test>" + NEWLINE + "<><><>"; public static final String BRACKETSTESTREPLACEDHTML = "NAME SURNAME" + HTMLNEWLINE + NEWLINE + "" + HTMLNEWLINE + NEWLINE; public static final String BRACKETSTESTREPLACEDMAN = "NAME SURNAME " + NEWLINE + MANNEWLINE + NEWLINE + "<><><>" + NEWLINE + MANNEWLINE + NEWLINE; public static final String BRACKETSTESTREPLACEDPLAIN = TESTTEXT + NEWLINE; public static final String FILESTREAM = "This is autor list." + NEWLINE + "This is random text." + NEWLINE + NEWLINE + "NAME SURNAME " + NEWLINE + "NAME SURNAME " + NEWLINE + "NAME SURNAME " + NEWLINE + "NAME SURNAME " + NEWLINE + "NAME SURNAME " + NEWLINE + "NAME SURNAME " + NEWLINE + NEWLINE + "This is list with links" + NEWLINE + "OpenJDK " + NEWLINE + "OpenJDK " + NEWLINE; public static final String FILESTREAMHTML = "This is autor list." + HTMLNEWLINE + NEWLINE + "This is random text." + HTMLNEWLINE + NEWLINE + HTMLNEWLINE + NEWLINE + "NAME SURNAME" + HTMLNEWLINE + NEWLINE + "NAME SURNAME" + HTMLNEWLINE + NEWLINE + "NAME SURNAME" + HTMLNEWLINE + NEWLINE + "NAME SURNAME" + HTMLNEWLINE + NEWLINE + "NAME SURNAME" + HTMLNEWLINE + NEWLINE + "NAME SURNAME" + HTMLNEWLINE + NEWLINE + HTMLNEWLINE + NEWLINE + "This is list with links" + HTMLNEWLINE + NEWLINE + "OpenJDK http://openjdk.java.net/" + HTMLNEWLINE + NEWLINE + "OpenJDK http://openjdk.java.net/" + HTMLNEWLINE + NEWLINE; public static final String FILESTREAMPLAIN = "This is autor list." + NEWLINE + "This is random text." + NEWLINE + "NAME SURNAME " + "NAME SURNAME " + "NAME SURNAME " + "NAME SURNAME " + "NAME SURNAME " + "NAME SURNAME " + NEWLINE + "This is list with links" + NEWLINE + "OpenJDK " + NEWLINE + "OpenJDK " + NEWLINE; @Test public void replaceBracketsWithEntitiesHtml() throws IOException { TextsProvider tp = new TextsProvider("utf-8", new HtmlFormatter(), true, true) { @Override public String getId() { return "test1"; } }; String output = tp.readAuthorsImpl(new StringReader(TESTTEXT)); assertEquals(BRACKETSTESTREPLACEDHTML, output); } @Test public void replaceBracketsWithEntitiesMan() throws IOException { TextsProvider tp = new TextsProvider("utf-8", new ManFormatter(), true, true) { @Override public String getId() { return "test2"; } }; String output = tp.readAuthorsImpl(new StringReader(TESTTEXT)); assertEquals(BRACKETSTESTREPLACEDMAN, output); } @Test public void replaceBracketsWithEntitiesPlain() throws IOException { TextsProvider tp = new TextsProvider("utf-8", new PlainTextFormatter(), true, true) { @Override public String getId() { return "test3"; } }; String output = tp.readAuthorsImpl(new StringReader(TESTTEXT)); assertEquals(BRACKETSTESTREPLACEDPLAIN, output); } @Test public void newLineTestHtml() throws IOException { TextsProvider tp = new TextsProvider("utf-8", new HtmlFormatter(), true, true) { @Override public String getId() { return "test4"; } }; String output = tp.readAuthorsImpl(new StringReader(FILESTREAM)); assertEquals(FILESTREAMHTML, output); } @Test public void newLineTestPlainText() throws IOException { TextsProvider tp = new TextsProvider("utf-8", new PlainTextFormatter(), true, true) { @Override public String getId() { return "test5"; } }; String output = tp.readAuthorsImpl(new StringReader(FILESTREAM)); assertEquals(FILESTREAMPLAIN, output); } @Test public void replaceLtGtTest() throws IOException { TextsProvider tp = new TextsProvider("utf-8", new HtmlFormatter(), true, true) { @Override public String getId() { return "test6"; } }; String output = tp.getFormatter().replaceLtGtCharacters(TESTTEXT); assertEquals(BRACKETSTESTREPLACED, output); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/PaxHeaders.7406/formatters0000644000000000000000000000013213441742745030004 xustar0030 mtime=1552401893.076832746 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/0000755000175000002070000000000013441742745030671 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/PaxHeaders.7406/for0000644000000000000000000000013213441742745030572 xustar0030 mtime=1552401893.077832744 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/0000755000175000002070000000000013441742745033057 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PaxHeade0000644000000000000000000000033713441742745031235 xustar00133 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatterTest.java 30 mtime=1552401893.076832746 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/Replacin0000644000175000002070000001272213441742745034543 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider.formatters.formatters; import org.junit.Assert; import org.junit.Test; public class ReplacingTextFormatterTest { Formatter tr = new ReplacingTextFormatter() { @Override public String wrapParagraph(String s) { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getHeaders(String id, String encoding) { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getNewLine() { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getBoldOpening() { return "OPEN"; } @Override public String getBoldClosing() { return "CLOSE"; } @Override public String getBreakAndBold() { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getCloseBoldAndBreak() { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getBoldCloseNwlineBoldOpen() { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getTitle(String name) { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getUrl(String url, String appearence) { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getOption(String key, String value) { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getSeeAlso(String s) { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getTail() { throw new UnsupportedOperationException("Not supported yet."); } @Override public String getFileSuffix() { throw new UnsupportedOperationException("Not supported yet."); } }; @Test public void upperCaseNoSpaces() { String s = tr.process("aaa bbb ccc"); Assert.assertEquals("aaa OPEN bbb CLOSE ccc", s); } @Test public void lowercaseNoSpaces() { String s = tr.process("aaa bbb ccc"); Assert.assertEquals("aaa OPEN bbb CLOSE ccc", s); } @Test public void lowercaseSpaces() { String s = tr.process("aaa < b > bbb < / b > ccc"); Assert.assertEquals("aaa OPEN bbb CLOSE ccc", s); } @Test public void uppercaseSpaces() { String s = tr.process("aaa < B > bbb < / B > ccc"); Assert.assertEquals("aaa OPEN bbb CLOSE ccc", s); } @Test public void mixedCases1() { String s = tr.process("aaa bbb ccc"); Assert.assertEquals("aaa OPEN bbb CLOSE ccc", s); } @Test public void mixedSpace2() { String s = tr.process("aaa bbb ccc"); Assert.assertEquals("aaa OPEN bbb CLOSE ccc", s); } @Test public void illegal1() { String s = tr.process("aaa bbb ccc"); Assert.assertFalse(s.contains("OPEN")); Assert.assertTrue(s.contains("CLOSE")); } @Test public void illegal2() { String s = tr.process(" ccc "); Assert.assertFalse(s.contains("CLOSE")); Assert.assertTrue(s.contains("OPEN")); } }icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PaxHeade0000644000000000000000000000032213441742745031227 xustar00120 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/FormatterTest.java 30 mtime=1552401893.077832744 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/Formatte0000644000175000002070000000730613441742745034571 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider.formatters.formatters; import org.junit.Assert; import org.junit.Test; public class FormatterTest { @Test public void testNoNewLinesPlain() { PlainTextFormatter f = new PlainTextFormatter(); String s = f.getNewLine(0); Assert.assertEquals("", s); } @Test public void testOneNewLinesPlain() { PlainTextFormatter f = new PlainTextFormatter(); String s = f.getNewLine(1); Assert.assertEquals(f.getNewLine(), s); } @Test public void testXNewLinesPlain() { PlainTextFormatter f = new PlainTextFormatter(); final int x = 10; String s = f.getNewLine(x); String[] a = s.replace(f.getNewLine(), "X" + f.getNewLine()).split("" + f.getNewLine() + ""); Assert.assertEquals(x, a.length); } @Test public void testNoNewLinesHtml() { HtmlFormatter f = new HtmlFormatter(); String s = f.getNewLine(0); Assert.assertEquals("", s); } @Test public void testOneNewLinesHtml() { HtmlFormatter f = new HtmlFormatter(); String s = f.getNewLine(1); Assert.assertEquals(f.getNewLine(), s); } @Test public void testXNewLinesHtml() { HtmlFormatter f = new HtmlFormatter(); final int x = 10; String s = f.getNewLine(x); String[] a = s.split("(?mi)br"); Assert.assertEquals(x + 1, a.length);//br is in middleof element } @Test public void testNoNewLinesMan() { ManFormatter f = new ManFormatter(); String s = f.getNewLine(0); Assert.assertEquals("", s); } @Test public void testOneNewLinesMan() { ManFormatter f = new ManFormatter(); String s = f.getNewLine(1); Assert.assertEquals(f.getNewLine(), s); } @Test public void testXNewLinesMan() { ManFormatter f = new ManFormatter(); final int x = 10; String s = f.getNewLine(x); String[] a = s.split("(?m)\\.br"); Assert.assertEquals(x + 1, a.length);//br is in middleof element } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/FileUtilsTest.java0000644000000000000000000000013213441742745026756 xustar0030 mtime=1552401893.073832752 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/FileUtilsTest.java0000644000175000002070000001415613441742745027575 0ustar00jvanekmock00000000000000/* FileUtilsTest.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import java.io.File; import java.nio.file.Files; import java.nio.file.attribute.AclEntry; import java.nio.file.attribute.AclFileAttributeView; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.runtime.JNLPRuntime; import org.junit.Test; import static org.junit.Assert.*; public class FileUtilsTest { public static final List INVALID_PATH = Arrays.asList(new Character[]{':', '*', '?', '"', '<', '>', '|', '[', ']', '\'', ';', '=', ','}); public static final List INVALID_NAME = new ArrayList<>(INVALID_PATH); static { INVALID_NAME.add(0, '\\'); INVALID_NAME.add(0, '/'); } @Test public void testSanitizePath() throws Exception { for (char ch : INVALID_PATH) { String str = "/tmp/test" + ch + "path"; String sanitized = FileUtils.sanitizePath(str); assertFalse(ch + " should be sanitized from " + sanitized, ch != File.separatorChar && sanitized.contains(Character.toString(ch))); assertEquals("/tmp/test_path", sanitized); } } @Test public void testSanitizeMoreDoubleDots() throws Exception { String str = "C:/some:dir/some:file"; String sanitized = FileUtils.sanitizePath(str); if (JNLPRuntime.isWindows()) { assertEquals("C:/some_dir/some_file", sanitized); } else { assertEquals("C_/some_dir/some_file", sanitized); } } @Test public void testSanitizePathWindowsLinuxSlashes() throws Exception { String str = "C:/some.dir/some.file"; String sanitized = FileUtils.sanitizePath(str); if (JNLPRuntime.isWindows()) { assertEquals("C:/some.dir/some.file", sanitized); } else { assertEquals("C_/some.dir/some.file", sanitized); } } @Test public void testSanitizePathWindowsWinSlashes() throws Exception { String str = "C:\\some.dir\\some.file"; String sanitized = FileUtils.sanitizePath(str); if (JNLPRuntime.isWindows()) { assertEquals("C:/some.dir/some.file", sanitized); } else { assertEquals("C_/some.dir/some.file", sanitized); } } @Test public void testSanitizeFilename() throws Exception { for (char ch : INVALID_PATH) { String str = "file" + ch + "name"; String sanitized = FileUtils.sanitizeFileName(str); assertFalse(ch + " should be sanitized from " + sanitized, sanitized.contains(Character.toString(ch))); assertEquals("file_name", sanitized); } } @Test public void testSanitizeFilenameSlashes() throws Exception { for (char ch : new char[]{'/', '\\'}) { String str = "file" + ch + "name"; String sanitized = FileUtils.sanitizeFileName(str); assertFalse(ch + " should be sanitized from " + sanitized, sanitized.contains(Character.toString(ch))); assertEquals("file_name", sanitized); } } @Test public void testCreateParentDir() throws Exception { final File tmpdir = new File(System.getProperty("java.io.tmpdir")), testParent = new File(tmpdir, "itw_test_create_parent_dir"), testChild = new File(testParent, "test_child_dir"); testChild.deleteOnExit(); testParent.deleteOnExit(); FileUtils.createParentDir(testChild); assertTrue(tmpdir.isDirectory()); assertTrue(testParent.isDirectory()); assertFalse(testChild.exists()); } @Test public void testCreateRestrictedFile() throws Exception { if (!JNLPRuntime.isWindows()) { return; } final File tmpdir = new File(System.getProperty("java.io.tmpdir")), testfile = new File(tmpdir, "itw_test_create_restricted_file"); if (testfile.exists()) { assertTrue(testfile.delete()); } testfile.deleteOnExit(); FileUtils.createRestrictedFile(testfile, true); boolean hasOwner = false; AclFileAttributeView view = Files.getFileAttributeView(testfile.toPath(), AclFileAttributeView.class); for (AclEntry ae : view.getAcl()) { if (view.getOwner().getName().equals(ae.principal().getName())) { assertFalse("Duplicate owner entry", hasOwner); hasOwner = true; assertEquals("Owner must have all perimissions",14, ae.permissions().size()); } } assertTrue("No owner entry", hasOwner); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/ImageResourcesTest.java0000644000000000000000000000013213441742745027773 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/ImageResourcesTest.java0000644000175000002070000000462113441742745030606 0ustar00jvanekmock00000000000000/* ImageResourcesTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.awt.Image; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; public class ImageResourcesTest { @Before public void setUp() { ImageResources.INSTANCE.clearCache(); } @After public void tearDown() { ImageResources.INSTANCE.clearCache(); } @Test public void testApplicationImages() { List images = ImageResources.INSTANCE.getApplicationImages(); assertNotNull(images); assertTrue(images.size() > 0); for (Image image : images) { assertNotNull(image); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/HttpUtilsTest.java0000644000000000000000000000013213441742745027016 xustar0030 mtime=1552401893.076832746 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/HttpUtilsTest.java0000644000175000002070000002316313441742745027633 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.util.logging.OutputController; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class HttpUtilsTest { private static PrintStream[] backedUpStream = new PrintStream[4]; private static ByteArrayOutputStream currentErrorStream; @BeforeClass //keeping silent outputs from launched jvm public static void redirectErr() throws IOException { for (int i = 0; i < backedUpStream.length; i++) { if (backedUpStream[i] == null) { switch (i) { case 0: backedUpStream[i] = System.out; break; case 1: backedUpStream[i] = System.err; break; case 2: backedUpStream[i] = OutputController.getLogger().getOut(); break; case 3: backedUpStream[i] = OutputController.getLogger().getErr(); break; } } } currentErrorStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(currentErrorStream)); System.setErr(new PrintStream(currentErrorStream)); OutputController.getLogger().setOut(new PrintStream(currentErrorStream)); OutputController.getLogger().setErr(new PrintStream(currentErrorStream)); } @AfterClass public static void redirectErrBack() throws IOException { ServerAccess.logErrorReprint(currentErrorStream.toString("utf-8")); System.setOut(backedUpStream[0]); System.setErr(backedUpStream[1]); OutputController.getLogger().setOut(backedUpStream[2]); OutputController.getLogger().setErr(backedUpStream[3]); } @Test public void consumeAndCloseConnectionSilentlyTest() throws IOException { redirectErr(); try{ Exception exception = null; try { HttpUtils.consumeAndCloseConnectionSilently(new HttpURLConnection(null) { @Override public void disconnect() { throw new UnsupportedOperationException("Not supported yet."); } @Override public boolean usingProxy() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void connect() throws IOException { throw new UnsupportedOperationException("Not supported yet."); } }); } catch (Exception ex) { ServerAccess.logException(ex); exception = ex; } Assert.assertNull("no exception expected - was" + exception, exception); try { HttpUtils.consumeAndCloseConnectionSilently(new HttpURLConnection(new URL("http://localhost/blahblah")) { @Override public void disconnect() { throw new UnsupportedOperationException("Not supported yet."); } @Override public boolean usingProxy() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void connect() throws IOException { throw new UnsupportedOperationException("Not supported yet."); } }); } catch (Exception ex) { ServerAccess.logException(ex); exception = ex; } Assert.assertNull("no exception expected - was" + exception, exception); ServerLauncher serverLauncher =ServerAccess.getIndependentInstance(System.getProperty("user.dir"), ServerAccess.findFreePort()); try{ try { HttpUtils.consumeAndCloseConnectionSilently(new HttpURLConnection(serverLauncher.getUrl("definitelyNotExisitnfFileInHappyMemoryOfAdam")) { //:) @Override public void disconnect() { } @Override public boolean usingProxy() { return false; } @Override public void connect() throws IOException { } }); } catch (Exception ex) { ServerAccess.logException(ex); exception = ex; } Assert.assertNull("no exception expected - was" + exception, exception); }finally{ try{ serverLauncher.stop(); }catch(Exception ex){ ServerAccess.logException(ex); } } }finally{ redirectErrBack(); } } @Test public void consumeAndCloseConnectionTest() throws IOException { redirectErr(); try{ Exception exception = null; try { HttpUtils.consumeAndCloseConnection(new HttpURLConnection(null) { @Override public void disconnect() { throw new UnsupportedOperationException("Not supported yet."); } @Override public boolean usingProxy() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void connect() throws IOException { throw new UnsupportedOperationException("Not supported yet."); } }); } catch (Exception ex) { ServerAccess.logException(ex); exception = ex; } Assert.assertNotNull("exception expected - wasnt" + exception, exception); try { HttpUtils.consumeAndCloseConnection(new HttpURLConnection(new URL("http://localhost/blahblah")) { @Override public void disconnect() { throw new UnsupportedOperationException("Not supported yet."); } @Override public boolean usingProxy() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void connect() throws IOException { throw new UnsupportedOperationException("Not supported yet."); } }); } catch (Exception ex) { ServerAccess.logException(ex); exception = ex; } Assert.assertNotNull("exception expected - wasnt" + exception, exception); ServerLauncher s =ServerAccess.getIndependentInstance(System.getProperty("user.dir"), ServerAccess.findFreePort()); try{ try { HttpUtils.consumeAndCloseConnection(new HttpURLConnection(s.getUrl("blahblahblah")) { @Override public void disconnect() { } @Override public boolean usingProxy() { return false; } @Override public void connect() throws IOException { } }); } catch (Exception ex) { ServerAccess.logException(ex); exception = ex; } Assert.assertNotNull(" exception expected - wasnt" + exception, exception); }finally{ try{ s.stop(); }catch(Exception ex){ ServerAccess.logException(ex); } } }finally{ redirectErrBack(); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/replacements0000644000000000000000000000013213441742745025760 xustar0030 mtime=1552401893.115832665 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/replacements/0000755000175000002070000000000013441742745026645 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/replacements/PaxHeaders.7406/BASE64Encoder0000644000000000000000000000013213441742745030144 xustar0030 mtime=1552401893.115832665 30 atime=1552402157.258253434 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/replacements/BASE64EncoderTest.java0000644000175000002070000001561013441742745032537 0ustar00jvanekmock00000000000000/* BASE64EncoderTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.replacements; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.runtime.JNLPRuntime; import org.junit.Assert; import org.junit.Test; /** * Test various corner cases of the parser */ public class BASE64EncoderTest { static final String sSrc = "abcdefgHIJKLMNOPQrstuvwxyz1234567890\r\n" + "-=+_))(**&&&^^%%$$##@@!!~{}][\":'/\\.,><\n" + "+Ф›ХЁФ›ФХ™ХОУНУЁУ­УЉ=ХЏ/УКФ›Х™ХЅХЁФХˆУЉУ­УЁФ"; static final Byte[] part1 = {89, 87, 74, 106, 90, 71, 86, 109, 90, 48, 104, 74, 83, 107, 116, 77, 84, 85, 53, 80, 85, 70, 70, 121, 99, 51, 82, 49, 100, 110, 100, 52, 101, 88, 111, 120, 77, 106, 77, 48, 78, 84, 89, 51, 79, 68, 107, 119, 68, 81, 111, 116, 80, 83, 116, 102, 75, 83, 107, 111, 75, 105, 111, 109, 74, 105, 90, 101, 88, 105, 85, 108, 74, 67, 81, 106}; static final Byte[] part2 = {73, 48, 66, 65, 73, 83, 70, 43, 101, 51, 49, 100, 87, 121, 73, 54, 74, 121, 57, 99, 76, 105, 119, 43, 80, 65, 111, 114, 120, 74, 118, 70, 111, 99, 83, 98, 120, 73, 51, 70, 109, 99, 87, 43, 119, 55, 51, 68, 111, 99, 79, 116, 119, 54, 107, 57, 120, 97, 56, 118, 119, 55, 114, 69, 109, 56, 87, 90, 120, 97, 88, 70, 111, 99, 83, 80}; static final Byte[] part3 = {120, 89, 106, 68, 113, 99, 79, 116, 119, 54, 72, 69, 106, 81, 61, 61}; private static List getBASE64LineEnding() { if (JNLPRuntime.isWindows()) { return Arrays.asList(new Byte[]{13, 10}); } else { return Arrays.asList(new Byte[]{10}); } } static final List encoded = new ArrayList(); private static final String sunClassD = "sun.misc.BASE64Decoder"; static { encoded.addAll(Arrays.asList(part1)); encoded.addAll(getBASE64LineEnding()); encoded.addAll(Arrays.asList(part2)); encoded.addAll(getBASE64LineEnding()); encoded.addAll(Arrays.asList(part3)); encoded.addAll(getBASE64LineEnding()); } @Test public void testEmbededBase64Encoder() throws Exception { final byte[] data = sSrc.getBytes("utf-8"); // ByteArrayOutputStream out1 = new ByteArrayOutputStream(); // sun.misc.BASE64Encoder e1 = new sun.misc.BASE64Encoder(); // e1.encode(data, out1); // byte[] encoded1 = out1.toByteArray(); // ServerAccess.logErrorReprint(Arrays.toString(encoded1)); ByteArrayOutputStream out2 = new ByteArrayOutputStream(); BASE64Encoder e2 = new BASE64Encoder(); e2.encodeBuffer(data, out2); byte[] encoded2 = out2.toByteArray(); Assert.assertEquals(encoded, byteArrayToByteList(encoded2)); // ServerAccess.logErrorReprint(Arrays.toString(encoded2)); } @Test /* * This test will fail, in case taht sun.misc.BASE64Decoder will be removed from builders java */ public void testEmbededBase64EncoderAgainstSunOne() throws Exception { final byte[] data = sSrc.getBytes("utf-8"); ByteArrayOutputStream out2 = new ByteArrayOutputStream(); BASE64Encoder e2 = new BASE64Encoder(); e2.encodeBuffer(data, out2); byte[] encoded2 = out2.toByteArray(); Object decoder = createInsatnce(sunClassD); byte[] decoded = (byte[]) (getAndInvokeMethod(decoder, "decodeBuffer", new String(encoded2, "utf-8"))); Assert.assertArrayEquals(data, decoded); Assert.assertEquals(sSrc, new String(decoded, "utf-8")); } @Test public void testEmbededBase64EncoderAgainstEbededDecoder() throws Exception { final byte[] data = sSrc.getBytes("utf-8"); ByteArrayOutputStream out2 = new ByteArrayOutputStream(); BASE64Encoder e2 = new BASE64Encoder(); e2.encodeBuffer(data, out2); byte[] encoded2 = out2.toByteArray(); BASE64Decoder decoder = new BASE64Decoder(); byte[] decoded = decoder.decodeBuffer(new String(encoded2, "utf-8")); Assert.assertArrayEquals(data, decoded); Assert.assertEquals(sSrc, new String(decoded, "utf-8")); } static Object createInsatnce(String ofCalss) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class classDefinition = Class.forName(ofCalss); return classDefinition.newInstance(); } static Object getAndInvokeMethod(Object instance, String methodName, Object... params) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class[] cs = new Class[params.length]; for (int i = 0; i < params.length; i++) { Object object = params[i]; cs[i] = object.getClass(); if (object instanceof OutputStream) { cs[i] = OutputStream.class; } } Method m = instance.getClass().getMethod(methodName, cs); return m.invoke(instance, params); } private static List byteArrayToByteList(byte[] encoded2) { List r = new ArrayList<>(encoded2.length); for (byte b : encoded2) { r.add(b); } return r; } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/replacements/PaxHeaders.7406/BASE64Decoder0000644000000000000000000000013213441742745030132 xustar0030 mtime=1552401893.081832735 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/replacements/BASE64DecoderTest.java0000644000175000002070000001001713441742745032521 0ustar00jvanekmock00000000000000/* BASE64EncoderTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.replacements; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import org.junit.Assert; import org.junit.Test; /** * Test various corner cases of the parser */ public class BASE64DecoderTest { private static final String sunClassE = "sun.misc.BASE64Encoder"; @Test public void testEmbededBase64Decoder() throws Exception { final byte[] data = getData(); ByteArrayOutputStream out2 = new ByteArrayOutputStream(); BASE64Decoder e2 = new BASE64Decoder(); e2.decodeBuffer(new ByteArrayInputStream(data), out2); byte[] decoded = out2.toByteArray(); Assert.assertEquals(BASE64EncoderTest.sSrc, new String(decoded, "utf-8")); } @Test /* * This test will fail, in case taht sun.misc.BASE64Encoder will be removed from builders java */ public void testEmbededBase64DecoderAgainstSunOne() throws Exception { final byte[] data = getData(); ByteArrayOutputStream out2 = new ByteArrayOutputStream(); BASE64Decoder e2 = new BASE64Decoder(); e2.decodeBuffer(new ByteArrayInputStream(data), out2); byte[] encoded2 = out2.toByteArray(); Object encoder = BASE64EncoderTest.createInsatnce(sunClassE); ByteArrayOutputStream out = new ByteArrayOutputStream(); BASE64EncoderTest.getAndInvokeMethod(encoder, "encodeBuffer", encoded2, out); Assert.assertArrayEquals(data, out.toByteArray()); Assert.assertArrayEquals(getData(), out.toByteArray()); } @Test public void testEmbededBase64DecoderAgainstEmbededEncoder() throws Exception { final byte[] data = getData(); ByteArrayOutputStream out2 = new ByteArrayOutputStream(); BASE64Decoder e2 = new BASE64Decoder(); e2.decodeBuffer(new ByteArrayInputStream(data), out2); byte[] encoded2 = out2.toByteArray(); BASE64Encoder encoder = new BASE64Encoder(); ByteArrayOutputStream out = new ByteArrayOutputStream(); encoder.encodeBuffer(encoded2, out); Assert.assertArrayEquals(data, out.toByteArray()); Assert.assertArrayEquals(getData(), out.toByteArray()); } private byte[] getData() { byte[] r = new byte[BASE64EncoderTest.encoded.size()]; for (int i = 0; i < BASE64EncoderTest.encoded.size(); i++) { r[i]=BASE64EncoderTest.encoded.get(i); } return r; } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/TimedHashMapTest.java0000644000000000000000000000013213441742745027362 xustar0030 mtime=1552401893.080832738 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/TimedHashMapTest.java0000644000175000002070000001605613441742745030202 0ustar00jvanekmock00000000000000/* TimedHashMapTest.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Test; public class TimedHashMapTest { private TimedHashMap testMap; private Object o1, o2, o3, o4; @Before public void resetTestMap() { testMap = new TimedHashMap<>(); o1 = new Object(); o2 = new Object(); o3 = new Object(); o4 = new Object(); } @Test public void testPutAndGet() { testMap.put(o1, o2); testMap.put(o2, o4); testMap.put(o3, o4); assertEquals("map[o1] != o2", o2, testMap.get(o1)); assertEquals("map[o2] != o4", o4, testMap.get(o2)); assertEquals("map[o3] != o4", o4, testMap.get(o3)); testMap.put(o1, o3); assertEquals("map[o1] != o3", o3, testMap.get(o1)); } @Test public void testEntryExpiry() throws Exception { testMap.setTimeout(0, TimeUnit.NANOSECONDS); // immediate expiry testMap.put(o1, o2); Thread.sleep(5); // so we don't manage to put and get in the same nanosecond assertNull("map[o1] should have expired", testMap.get(o1)); } @Test(expected = NullPointerException.class) public void testPutNullKey() { testMap.put(null, o1); } @Test public void testPutNullValue() { testMap.put(o1, null); assertNull("map[o1] != null", testMap.get(o1)); assertTrue("testMap should contain the key o1", testMap.containsKey(o1)); } @Test public void testContainsKey() { testMap.put(o1, o2); assertTrue("testMap should contain the key o1", testMap.containsKey(o1)); } @Test public void testSize() { assertEquals(0, testMap.size()); testMap.put(o1, o2); assertEquals(1, testMap.size()); } @Test public void testIsEmpty() { assertTrue("map should be empty", testMap.isEmpty()); testMap.put(o1, o2); assertFalse("map should not be empty", testMap.isEmpty()); } @Test public void testContainsValue() { assertFalse("map should not contain o2", testMap.containsValue(o2)); testMap.put(o1, o2); assertTrue("map does not contain o2", testMap.containsValue(o2)); } @Test public void testContainsValueNull() { assertFalse("map should not contain null value", testMap.containsValue(null)); testMap.put(o1, null); assertTrue("map does not contain null value", testMap.containsValue(null)); } @Test public void testRemove() { testMap.put(o1, o2); o3 = testMap.remove(o1); assertEquals("o2 != o3", o2, o3); assertFalse("map should not contain o1", testMap.containsKey(o1)); } @Test public void testRemoveFromEmpty() { o2 = testMap.remove(o1); assertNull("o2 should be null", o2); } @Test public void testPutAll() { final Map newMap = new HashMap<>(); newMap.put(o1, o2); newMap.put(o3, o4); testMap.putAll(newMap); assertTrue("map should contain key o1", testMap.containsKey(o1)); assertTrue("map should contain value o2", testMap.containsValue(o2)); assertTrue("map should contain key o3", testMap.containsKey(o3)); assertTrue("map should contain value o4", testMap.containsValue(o4)); assertEquals("map[o1] != o2", o2, testMap.get(o1)); assertEquals("map[o3] != o4", o4, testMap.get(o3)); assertEquals(2, testMap.size()); } @Test public void testClear() { testMap.put(o1, o2); testMap.clear(); assertEquals(0, testMap.size()); assertFalse("map should not contain key o1", testMap.containsKey(o1)); assertFalse("map should not contain value o2", testMap.containsValue(o2)); } @Test public void testKeySet() { testMap.put(o1, o2); Set keys = testMap.keySet(); assertNotNull("keyset should not be null", keys); assertTrue("keyset should contain o1", keys.contains(o1)); assertEquals(1, keys.size()); } @Test public void testValues() { testMap.put(o1, o2); Collection values = testMap.values(); assertNotNull("values collection should not be null", values); assertTrue("values collection should contain o2", values.contains(o2)); assertEquals(1, values.size()); } @Test public void testEntrySet() { testMap.put(o1, o2); testMap.put(o3, o4); Set> entrySet = testMap.entrySet(); assertNotNull("entryset should not be null", entrySet); assertEquals(2, entrySet.size()); for (final Map.Entry entry : entrySet) { final Object key = entry.getKey(); final Object value = entry.getValue(); if (key.equals(o1)) { assertEquals("entry with key o1 should have value o2", o2, value); } if (key.equals(o3)) { assertEquals("entry with key o3 should have value o4", o4, value); } } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/PaxHeaders.7406/MD5SumWatcherTest.java0000644000000000000000000000013113441742745027445 xustar0029 mtime=1552401893.07483275 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/util/MD5SumWatcherTest.java0000644000175000002070000000754213441742745030266 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileNotFoundException; import java.util.Arrays; import org.junit.After; import org.junit.Before; import org.junit.Test; public class MD5SumWatcherTest { private File file; private MD5SumWatcher watcher; @Before public void createNewFile() throws Exception { file = File.createTempFile("md5sumwatchertest", "tmp"); file.deleteOnExit(); watcher = new MD5SumWatcher(file); } @After public void deleteTempFile() throws Exception { if (file.exists()) { file.delete(); } } @Test public void testNonExistentFile() { file.delete(); file.mkdirs(); watcher = new MD5SumWatcher(file); boolean gotException = false; try { watcher.update(); } catch (final Exception e) { gotException = true; assertTrue("Should have received FileNotFoundException", e instanceof FileNotFoundException); } assertTrue("Should have received FileNotFoundException", gotException); } @Test public void testNoFileChangeGivesSameMd5() throws Exception { byte[] sum = watcher.getSum(); byte[] sum2 = watcher.getSum(); assertTrue("MD5 sums should be the same. first: " + Arrays.toString(sum) + ", second: " + Arrays.toString(sum2), Arrays.equals(sum, sum2)); } @Test public void testSavingToFileChangesMd5() throws Exception { byte[] original = watcher.getSum(); FileUtils.saveFile("some test content\n", file); byte[] changed = watcher.getSum(); assertFalse("MD5 sum should have changed, but was constant as " + Arrays.toString(original), Arrays.equals(original, changed)); } @Test public void testUnchangedContentUpdate() throws Exception { assertFalse("update() should return false", watcher.update()); } @Test public void testChangedContentUpdate() throws Exception { FileUtils.saveFile("some test content\n", file); final boolean changed = watcher.update(); assertTrue("update() should return true", changed); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/tools0000644000000000000000000000013213441742745023461 xustar0030 mtime=1552401893.071832756 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/0000755000175000002070000000000013441742745024346 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/PaxHeaders.7406/ico0000644000000000000000000000013213441742745024233 xustar0030 mtime=1552401893.068832762 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/0000755000175000002070000000000013441742745025120 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/PaxHeaders.7406/impl0000644000000000000000000000013213441742745025174 xustar0030 mtime=1552401893.068832762 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/0000755000175000002070000000000013441742745026061 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/PaxHeaders.7406/resources0000644000000000000000000000013213441742745027206 xustar0030 mtime=1552401893.113832669 30 atime=1552410887.112183445 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/0000755000175000002070000000000013441742745030073 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico4-b0000644000000000000000000000013213441742745030263 xustar0030 mtime=1552401893.084832729 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico4-bmp-noTrans.ico0000644000175000002070000000047613441742745033632 0ustar00jvanekmock00000000000000(( џџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico24-0000644000000000000000000000013213441742745030203 xustar0030 mtime=1552401893.083832731 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico24-bmp-noTrans.ico0000644000175000002070000000157613441742745033716 0ustar00jvanekmock00000000000000h( џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/favico0000644000000000000000000000013213441742745030455 xustar0030 mtime=1552401893.082832733 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/favicon3.ico0000644000175000002070000000217613441742745032305 0ustar00jvanekmock00000000000000 h(  џџџџџџџџџџџџџџџџџџџџќў§џџџџџџјќџџћџџџџџџ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљ§§џџџџџегбџWО•џfП™џштфџџџџџќ§ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ§ќџџџџџбгбџ!М~џџ›џћ–џ8Жƒџъпуџџџџџ§§ќџџџџџџџџџџџџџџџџџџџџџћ§ћџџџџџцкоџ0Ц‰џџЌџџЃџџЈџџІџDЙˆџѓхщџџџџџў§§џџџџџџџџџџџџџўўўџџџџџјёіџSП”џхџЂlџЬџИwџЇmџ ц‹џbБŽџўєјџўџџџџџџџџџџџџџџџќў§џџџџџЗІџnGџџџŠZџ^<џџџ‚RџЄНЏџџџџџњ§ќџџџџџ§ў§џџџџџйтоџ&S=џџџџе‡џЂgџџџџ9mVџ№№яџџџџџўўўџќ§ќџџџџџŠЊ™џџџџcBџџІџі—џ5&џџџ+џЋЩЛџџџџџќ§ќџџџџџўўўџJr]џџ џˆVџџЄџ§žџ џŸџя—џdCџ џџrЃџџџџџќў§џџџџџђщьџ3ІvџФzџъ–џџЇџ ўџўžџ §џџžџџЇџхџРxџYГ‹џџј§џ§џџџџџџџќьђџ@Ж‡џџЉџџžџ ќ›џџџџџџџўœџ ќ›џ џЁџџЁџjУœџџћџџћџўџќў§џџџџџ„­˜џыџџЂџ§œџџџџџџџџџќ›џџЄџм‡џГУКџџџџџќ§ќџўўўџџџџџюцъџ=Б€џџ›џџЃџўџ§џўџўџџЅџј’џ^ЏŽџџіћџќџџџџџџџџџџџќ§§џџџџџрллџAЊ}џхџџœџџžџџџџšџл…џ]Љˆџєьюџџџџџќўўџџџџџџџџџџџџџќ§§џџџџџіъ№џžЙЋџUЙџ<ХŽџHЦџeН–џВТЙџџѕњџџџџџ§§§џџџџџџџџџџџџџџџџџџџџџ§§§џўџџџџџџџџѕћџјыёџ§яѕџџћџџџџџџџџџџўўўџџџџџџџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico8-p0000644000000000000000000000013213441742745030305 xustar0030 mtime=1552401893.113832669 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico8-png-trans.ico0000644000175000002070000000015413441742745033340 0ustar00jvanekmock00000000000000V‰PNG  IHDRѓџaIDAT8c`ŒXФў“Ђ‡‰RŒ0, Ёxј”ЈIENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico32-0000644000000000000000000000013213441742745030202 xustar0030 mtime=1552401893.112832671 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico32-png-trans.ico0000644000175000002070000000017513441742745033420 0ustar00jvanekmock00000000000000 g‰PNG  IHDRѓџa.IDAT8cќџџ?%€‰"нƒТtFFFМђџџFЊК`д€aaуаЯL0О ,Й$IENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico1-p0000644000000000000000000000013213441742745030276 xustar0030 mtime=1552401893.112832671 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico1-png-trans.ico0000644000175000002070000000015413441742745033331 0ustar00jvanekmock00000000000000V‰PNG  IHDRѓџaIDAT8c`ŒXФў“Ђ‡‰RŒ0, Ёxј”ЈIENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/favico0000644000000000000000000000013213441742745030455 xustar0030 mtime=1552401893.111832673 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/favicon2.ico0000644000175000002070000000706613441742745032307 0ustar00jvanekmock00000000000000h& ЈŽ( @џџџђЦz<jjП}$*oЬДЂtcYЈабщ–œб—T#Z(J@?ГИy^^їFޘhu­EW2"пЬНИЙзЅyVъъъЬ‚KC…:](BBа’;Вh4УЄ‘b@o+(ммќЧЯв‡xm­\ L%o3 šIооо”іі№ЦšzТФХЈrGЕ‰ ЕŽjn'л|3ЯЧРОzU=P†[BРВЇ@@Ріі§‚FВp@‹1Є](›CŠ?эђі №чЁUГаЮЬY9*‚qg‹‡;…*Xg1 ўўїo/яяяy,‘? ƒ1–Cцццтттi,ЪА’:њњњLшяєв@@Кббб„™Y$ээєё­Œ<†6Jw0љљђєњўШ”?ЎnA5эычŽ‚-‡2ˆјћ§ъ§§§јјјёёёэээˆ]@šЭЭЭMS R—J‰9ыыьVŽ;эŸ’Oˆ5Œ:‡9@@Е§џџЏJŒ?№№№щщщœ˜U$ь–KWz-‰:ˆ;™I ЁVыыыђэъ–•“‰ƒ†2†5‡6‹:ˆ9‡9‡:Бp@Ўn@<#tAЗЗИd•>˜aЁЂАYYy_Ўw‚œ…„hUlЃЖD ‡­—6Ž‘ˆ;7“ЕDЌQ9|ko) SEГX3‡9ЉЈr‹1M'*N HžЊQuЅv&nO$-GiczŸZ"q–0L5 ?%JЏЋC^Š/:R4jfg PWŒ2F. s‰™ В‰]={}€pTsЃДБЄ’@K~›š\sЃЃЃ”BbЇe ВВmx+8–`Vƒ[(ІI†!,€€€€€€€€€€€€€€€џџ( @€џџџEFюЬ\НЇ–‹d-Fžјэ‚tnŠ099ЁpqЙбббGДt@2mŽO@щТЂџщЩЖ‹lКддўedё‘ЁHTZІ‹‹ШКККiSHъщщвŸxg,]:'š…8#ЃЈЊJ \БO |ЊxZvdYœc4вСБ›CгшлдW,uO4ЃСРЯййфxЌЋ№‰J_H˜œРž…$$˜x7‹zёєіЬЕЄT ­h1И~RЛЏЅA ЎNŸ\&Ц—tБББТc91ZZ№ЯЯђklЦQQБД…_ЅH њњётуо щ•PякЩОO …СЩЦИРХq/”6Љo?€,–%w“L`!ВV Шƒ8Ž>&о­йййR% zj`№№юrUCRЅHKДЊ ЪЫЮŠ;УWЛД­И‘sтжЯЩБœттчЮањњњњY* ПОО_,MёоЯœEѕž<‘>Сœ|„щэя\&ЊЎЏƒzsНЦЬади e:ђљќчоооy/ВQ­ДЖГ~_џџњпзчФФФЗЗЗЌKƒ0v`TD ^ФЪЯ‘q(љџџžm.їїїэлЯNk(|4КНРгœsхркK†5МУШМИЕУхшъчйаЕхххF5гдеb*ЦЦЦЛž…ЊŒ†•Йm:™>ђђђ“Lуяя№сстект_&ОŽe‚cJЉzV‡ ‰ќќ§ьььY$lTE|(‡9ФЩЩžDщзЯПƒ5Œ?•AА€]Q\!КOяѓѕРХШ­­­ž`3В„bяЫЮЯєNЦЩЬŠ7>šEѓєєЏNЖr>цхщВ жикx2’>ЕЗЙІхсн™ŽCIKW!^('-БP.uuЎЎЎЁ}}}}}}}}}}}}“фKKKKKKфxкЈЈћЬћYчЉЉЉЉЉЉЉЉЉжмdЙ]я1fкњЈћФЬŸчЯччччччЯжmDV›]1є1яfкЂњ?ќ…ДЯЯЯЯЯЯЯqЯЯr™]›яє1яžюŒ?ЂЂЂ…ќ…ЄqЯЯЯЯЯqЯбИ››1є1žЗу?ЂЂњ?ќ… qЯЯЯЯЯqc&|]ї11яяеРттЏ?ЂЂЂњЬќ…ЄqЯЯЯЯЯЯџ^›яєяfгвтЌ›кЂЂЂњЂ…ќДЯqЯЯЯЯщИї]єяЏŒвe››ћnЂњњњЂ……ŸчqЯЯЯбI›ї1явввтfƒ]mnБhЈЂњ?ќћ;qЯЯЯm]іяЏввŒвт-]ы`ЭљЈЈх7ЦŽqЯЯ–%]їžЗРввввЗШї]ђыU@)Јn˜†0лЯqЯ–››1дтвввгї]ђcМTУ< $zЬŸqqO'їіюввввŒтЏШ]ЯЯЮЛъѓ8iљЬќc~ЩїіbввввР]]qЉ\tн ЪаiЂ…Y,#"L5JRвтдШї]ЉЉ9нЫСцinк Н2’xЏШї]МП+‹=Ы=Њ‡/ЬчHWQ ЪžШїї]М*й(9С=>‘Ak!ЂМ‚XАyMƒШШ›ђЉўў§CЇ‹Š4€œјЂзоЫЪ’Ы :К qЯЯЯ—>ѕCЉшињЈ_BpОyjPw3jPЯЯЯЯўсvўЯЯбФEЋГ  ЫjjОТЯЯЯЯЉSрЉЯЯ,ёљ[ЅyъЫЫЫjГЯЯЯЯЯЯЉЯЯЯиclNЊjЫЫЫЕЯЯЯЯЯЯЯЯЯЯЯЃЖšъyЫЫЫЫСg{ЯЯЯЯЯЯЯЯЯЯшЉ6s№ЪъЫЫЫЫ”{ЯЯЯЯЯЯЯЯЯЯВЧЊЫЪЫЫЫjGГЯЯЯЯЯЯЯЯqЯМao‰y ЫЫЫЫ”G ЯЯЯЯЯЯЯЯqc€ХˆСЪЫЫЫСgп ђЯЯЯЯЯЯЯЯжZьЅэъЫЫjА•{y ўўўў\\\\Z{­ ЫА•ъFFFFFFFІ„С€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€џџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico8-b0000644000000000000000000000013113441742745030266 xustar0029 mtime=1552401893.06983276 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico8-bmp-trans.ico0000644000175000002070000000257613441742745033344 0ustar00jvanekmock00000000000000h( џџџџџџ№№№№№№№№№џџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico32-0000644000000000000000000000013113441742745030201 xustar0029 mtime=1552401893.06983276 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico32-bmp-trans.ico0000644000175000002070000000217613441742745033415 0ustar00jvanekmock00000000000000 h(  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№№№№№№№џџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico1-b0000644000000000000000000000013213441742745030260 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico1-bmp-trans.ico0000644000175000002070000000030613441742745033322 0ustar00jvanekmock00000000000000А( џџџџџџ№№№№№№№№№џџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico4-b0000644000000000000000000000013213441742745030263 xustar0030 mtime=1552401893.072832754 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico4-bmp-trans.ico0000644000175000002070000000047613441742745033335 0ustar00jvanekmock00000000000000(( џџџџџџ№№№№№№№№№џџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico24-0000644000000000000000000000013213441742745030203 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico24-bmp-trans.ico0000644000175000002070000000157613441742745033421 0ustar00jvanekmock00000000000000h( џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№№№№№№№џџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/favico0000644000000000000000000000013213441742745030455 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/favicon4.ico0000644000175000002070000030505713441742745032312 0ustar00jvanekmock00000000000000 ё.F€€ (7/@@ (B_7  Ј‡y‰PNG  IHDR\rЈf.ИIDATxкэ œUЕџO-нгГЯd2Y В€ˆ ў]~žBžыџЙќ]ЌBрЙ F@QA}Ъ*|H6Bp <ѕяіќKХч_eйLL ™ЌГO/U]ѕю­ЅћvuUuUwUouОŸTz›юъЊЎѓЛчœ{юН YИZAj ‚D‰0(aP$Т  H„A@ƒ€ A" ‚D‰0(aP$Т  H„A@ƒ€ A" ‚D‰0(aP$Т  H„A@ƒ€ A" ‚D‰0(aP$Т  H„A@ƒ€ A" ‚D‰0(aP$Т  H„A@ƒ€ A" ‚D‰0(aP$Т  H„A@ƒ€ A" ‚D‰0(aP$Т  H„A@ƒ€4§—м;/+ЦЮЩђТk^œGŸ“Eё4§WѕqБKћcUЭ=Ї=TT•“ГcњѓфYх8Џ(ЏЧC‚"я„ЌђЧб;ЮнYыc Єс˜zљЖ+$!~1јW+МаЋЖФ:Е ЮЗЊпWщen1њмумkЦsцŸЈЙ;фŸ."D$FЩі2ŸЭў…мўpќЮ?ЉѕЙЈЄюб >–јo9MMФ5cWMу4фs…Ц­шїѓ^™€љ9кkФsф—x9Л3ІHзŽЌ]ЙЇжчЪ/(Hн1уВЭяШФfэяQZ[Іц^0 AUЃд еFtc5Ь—>V,ŸчSXaіGФр0ё~оHb€€д3ПpяќtKыuщЮюB<жЂЕд !P Zv‡їхŒк4ив" ВbRєйP(цЫњѓ*/Ы{EYКz|эŠ­Е>Зn  5eк—Ж_•jыќdЖЃmNС 9›r2hА‚з˜ї2yЊˆ€ё'+#ЂœЙnbэђ›j}Ўэ@@jТд/џpkЊЇwБ* BюIПl!А5jŸ"`&U‹б;Š@ўЕТа4!2™OOоЕМЎ<Єj |qгќбжž­Rwз›чЕk/gГИ ЕХЕљћт  А|‘иzљћЖIJВёrіi^’?4љНх{k§{  UЂяЋ;~™юэ}7Ф№­Ц …Ръ Xџ^ QД$"лНPь Јр ф_зnU1“Й|ђЮк‡(HЈЬјђпяыџ4ФAЫЁ[l,ЎВ­(ХТр%$pO–+р3Px|Ќ7РIйЇгkПО–П  '^Бљ]УSfьPлP`Ÿ*”%~МЂРвч>лAьZnц§оD\Cѓo8…цЄгk  гџЕПJѕѕНKsїСj˜ц]§N‘А­'јђ‚Ђ$Ђѕ{yЬx Ь§dе”(IЇжBPР8ёŠћо5в7c‡вžш0/ЌBћe„}жт”с јЛœ€MХ ]Я@Q>€оч H8lCыgP#@@aжW~pћјєŸб[}ц‚‡ќE–Ъ^єl;ћа"^Bу+лФ ф„AЕ†ђѓР„Ь~ ФУx)Ћ&‰МКš"€€TФ\кЕ7eњУrOч /xЯ…bр&Ж9Цх.ђ”D€нWnь€]RА№VujЭйїyХ%Ч–p`$sЧ9=ењ§PВ9ёЫ[WїЯМ‹km‰гЧjЁПŸЧF | [nРкт‚Ли хŒW@T”Д)+Ж>Р5`їэbќ… eŸNпЙЄ*Н(HYЬМіЧїON›vŽоЏoџ7Ж‚`1P7!Ј™И&Ы<ею[ЄK“w-Л9ьпёMпЗЙ_юэš{ТЁj/џrB`ё >“ Xз>“%› }YЮЊœ”г^yŽ‹ёкћNшфтѓЕэwlВЏT>РЅWРKBаЮ  ЗŠ*gn?'іo‰€xfсU›™9їoаз\~pВ{›ф\ў%ћ7 Г7 fP“(уPS’JЖУФјŸ'/?HЖ?Iї,}ЌдБ$>Й§ BBxG–пЌ |?зуˆ7œШчПП5риzлѕ 0Чч”,сPрQ œцoŠ€xbръmЋGfЭЙ›ksƒwмZім]1p;o@Ё?’„ьHŠџ yсdлNŒ§ў Ž/vбі{ШЭйРs=\"\Bд7"e…EB`—tљ{E?Ђ$Э ГW)ЩРзюџЪшь9зRWк)Я—яъГЩЪч[Ÿpј{3N'FŸ=:AŒ>Iн{jє?#лuФш_ ыXХхkЏEОŠ[: жа’а… • B œ]{Л„ s\ezМ,џgъЮЅ ыxQWf_їу&gЯ>Ї№йb`эИH œМ;! ю}v( ђс1P&%™<ѓ;В]эХ­qщmп„д№—ˆp@g!KtшЎ­ИВ‰цaж!(6fѓІoяЈЖЃЛѓ^c JFyp dвт&Яn&Fq-_\~ЧЄFž9еЊЗкФ"EтДїпнGnуDDћ„`€^@˜=(ˆ-SoњеЅЏ{VЩ?ДxТжЌžыhзwJщ•Œгgw“эbјЗжњјYФsОН вcѓs" ƒBŒПС рzКђBB. ЬКЄˆiФјГS{ пЕЇЯ.Ž/|Т* 1ќЬўaг№їэМjЛљ~pк;РХ;€ы› ќдrŸо БK) џІ_уЗoљ/–‚ОP Š„@R4У—Žв‡єПeФ№џo­л n"@яS!рgЮ#bа›яЯtЌ €B`Ы’mМ!“9+љНх}L(HŽi7џњ€bmљ]P˜Оћvb`\лвСШьUV&ЩГˆсЖжЧьёьo4йу$šGа6„“NHД8{>У^’ОКkй—‚>žH @ьЂэo#7o2~˜y‰ќjpx]VŠ'ѕYe‡П9FЖ§Ц§!В™ЫIэГыЊRNОъоЧf ќ•ыnKјzЃ%,PŒ>|іuњ'Д/Еч-мЁyэ_sёўZsЙh‰Сфа.ШfD7Ž~ірЇЯђюИ/gM­ О(Јi€љЙљйЮ"л\cы ›XУЏE…ƒ ˆ)“эЩ ŠYЪсДщz*‚Э;Ш*к} ЄCZEю3dћ@= ЁWФeп§Џ6Ї.\ŒP`V(фE8ј…Їп1н8YPX@T* ˆКЃ_Bn>EЖЗ@ѓ|)шхpЈƒŸqлШ2-?яѓJАNЭG/XкъO>ˆЖњ4Фyc3Ићnˆ‹o~2c†рQN<јО“§‡tЂлƒŸ(ЄЎР0њ+ШіЈmь^ЏаKуd{|дШSуWћ нў{vђlІљЂ(ВЂ%љRћ†щќ;љWжњФTqйK y|ЛnЄE@TA "Рu/єDEŒ §7ШіЯ€FяZBћ0йnr*Њ1?gЪ†Бѓ>wЄ˜Зc)˜xіШущУфс[šНеЗ"~єE ќŠРЎ…^€9™]@ЇOЗ‰ 7 jѓЁ594ЉјK`Ф`ЮПџфџЅчЬњjєŽ_ъŠ`\…дО!˜xё}f=йЧEЕ>рZ .ОqЄTnНоE€k'Ђ;cИЮЙžТŽxM'F2o`k6ƒ]'tŒЧN™Е рYѓзї™TЅ,1ќУ~e”ŠЬ{ъЙ„7lФХ7 œъЩЗ˜"?§TрZњьУfšБІУЭПє.ЛКёBš:ЁEћЩг efѓ$Нї?;ž†бg‚<–оI Q­ЏжˆKn&ю)0nЏ"@N<зaк›шхšрВM†П‘lѓЋЙпЈ"tЖ@зыfŸ0Ц‘0†_`єvWе+ bњШ8Œџѕ ЊШЪъmФ^­—м:YЦ№)\љ%z:@˜j іsˆ#05шя_`\§3ЋЕЯЈУ“–Пѓs@ьhБ7|іW№œи}ЦwЅIЦгЃ–шsC<ч;jоАЫ>‘l ‰PїCnN #|FnЬR`bќ;ШЭ‡о—YRKyЪђ-Џ=dyŽV_Међ[їпt‰ЧŽгfшnП“с[N=’cЯ‚фtљ-ˆ+я^щБэP`иeˆqаИо оЂ}Ў]РЇLˆсžмм•эP#ЇЦМ‹lД”дгŒЏ~g  DWКщƒ‡Ф‰Н$юя/4r;У/јѕ9ѓхДшП_i4ѕ9яKj}\ѕ†ИтЎ] ЇцГ^Ўp=М>Ї@лLлю@1љЮфкe_ њУнЇЕьЇћ|+[хЖГžbL#wAGАе§X‘Ф§нgЬеюk†юjј\QЈo>–FгšёgЅЌљR]ЮжS+Фѓж €<Й”,—7ј D A~‹NQOWˆЉєe“w.П)шує"6Zая€ї.=кє4йю!ж=A\˜ЂАŠl‹Ш6ру˜CƒЦ§=o›\L(0~оДjУ/z‰мKƒбЇ_aŸ…ц~е~qхїŸ ­џщyУЎ\И)4p №ёю"Шм|v( N ъГе/*PiъAzЮЁ3‘7ўЂVПа№Йќ Йњžєa8ўд+^vGѓ04Бъ4нѕˆИjУRлsЦpmфЗшъaЪi…y€Ќ"gn§X}N fдыoїXŸ]ЙхкZŽ}Џ&ЦyY К „žGh?ešћПЅеg Ÿў(ь  бgСиžc~wM?†NUu~„ vСІШfvЉJV,0ј D@PыхAшџ_ф/ŒѕWh~@ЮNпvЮє0ŽЇ"0ЪwWЛ|N†l›ЩvЙ8†УљIъУCњ шyњCъЮЕЬъ‚Žгf:?Чх|œсS†ˆЫ?ЙЏтŸˆц V5“gЧЛ`ѓ(ђs Ъ­† h@G ЦЛєЗв€ŒєXъі%oу˜ЪОЩE§8ЛќєJКFіsїMач2˜ŠMњuНщDшšv.ЦЯ!kќє5вКРБ'РфрX‡Hџя5гЈРиъ-Ф№ŸEщж ивz% ђћMŸ­їq@,™Кlbm№ @Šя‹ЯhЭž{З п'ŒјЎŽд’~gЬЁ5V˜№c œqљйŒП@ЈФјп вH*ЌУЃy‚Ÿ’эѓФ.мJŒ_!-ПвZhР!ˆ јўр{ф sуGCыqђѕС†ё?Хё>~…XТ„^огѕЦ9›в–kёйl?лђгЉ:йVŸў}ŒпJCv#j=[Њz31PЮо€ƒш@˜~К>‡ˆ$‡џS< €‘дкfyUј›ЩеЋŒ…KЩіpшM …>‰)qПокѓE™ŽДќф”bќ{Њiќ,єšЁ„~ЋžТE=[ƒSИ:ЃА.b:НiђіЅЋТ:NO`cќZцKCУЧ8їз“/(Hњф[ЦрЭ„ŸејSЃ)8њћНN}ќеІюФРuмJ•D€KпѓD]Z“уѓFжЎмжё–у?JЖ4kІЗ^1CБГeuї? p->s?їч~ujќVищЭ6VћњbfЂrАV ˆЉ œєzр2ђсд­сЙџ%Рbќ‘šя­9сŠmЋЄгЌчbBX[kмO~щБК6~;Јw@­4B˜& ЕЮy*ˆ€pђы@H†ыўSРbќє‡xS#gr—n§љUs#v$4Ы.ењsmќN˜Ѓ@ї‚О†ТƒЦѓ%‰1ЋAEЖзBЅеš!‹?џеjцІљЊб7Ж`œ,s!Т‡ШЩ§Hи_q†Кџнoœ§ЂиCЄ№књSAšЧј§@ЫЭгvfX" Фя§ЧЬнЫџ)ьU$LWх‚:JЮаFьИ~Зuќ(4Х§‚qŸ'ІЩІP‡‡Х”››gvЗhFяЃѕ—ЧвpєёШu CxQхКчœT лNшЂ–Д ќЕrљ cЇcђЉ‘гi‚X3l#]qЇЎ†[Ёгx+§НГr}ќ.РЖўтффш+ПљЇRZy4рœ Eа"kл)oЛxQ5ОzУ{™мќЙк.иЕђЁЂАєеkы"бйwЭOžOžѕ*=›_,NюkjќШcяўх‰§§зj§LW"ЮХA‰p*ДДŸ$пїЉЊ4О9C#ЩZrгK.ўхе:gЦ`"Я•oUІф"a2pУƒ?œ˜sЖfд]~ІАю"9vфБїќ*gќ,žЛКђBb­ыф-ŸЎк\ UПtJpšTЂљ„ЊЌЬЙ~ЧRs>І[o'|qќŸ˜?ђЛїв–џыЎ%~ŒЧu>дСD&ME%"Р‹УђжЯіVѓыVЭ›hJ№P'4YxЭЖ‹†ц/ј>g”ѓY чі[тџ–фј‘пуŸVТј­пхjаћТ1Oхˆ­лgЪїў[UНЭjЬ м,†oG гcЭћъЖ‹FцЭЛ›…мўpHvpщcœљгІѕ_Wvq?ц ЦЏ-п’7_TѕмS˜Г—;9h#bЮxєёrН‚y_нzбШмywг*?._Р_R:Идбgўє5гЇ}уP9ћЕ‚y‚ё*МјЄ|яEoЈХW хi-€FСЗWА№ЊM ŽЭ]јŸˆ‰ьPоRа ФјЯњЩi3І]8шƒРwЪГзїїZƒэqщUgц œ ?уњ0WTŠ]ИѕI3ЏзЏ!^^XPЪЫ(KДEy~ЮИs"@?ŽЗїP@$ЦŸX0U7hЮ‡уя§ЧЎOМ№ЕeпЏѕ1”ы lЁ=C ЛЄœ€rZЬ]XМ№$ё\Н п .ПcdЅљ†э* ЂPуo™п—sї9sя"њшкНћšн_]|m­СhаŸК*ѓih ZEО…и&ф[К kˆр8ке—ˆKПKŒ?=пЖu7EР)agtB|`Šо}Я €иѕ$іќэО+>јŽZC%^С­Є!Sу_Ћ5Єžœуу ЇzѕЙФ.)mXйцє>Я?†Иф–]Ф͘_dЬ\БСsPъo8?Лnhт'ѕ‘жП];fУцѕћ%@{–NчѕЇ=їŽоzЮљЕ>Ž `BЉ‹•C ъЫЃщН2ъЃ бa*œE€†ыЄu+lsžЌP\rѓГ™<еЮи‹ ђs!'DRт'Mqj‡ў€uёYpЩ(ћг>zW[‰Зй–ф6<ƒO‘э-рОИlНуЉш+,ШyдsrYКЇpМ,­?зvuс’(.ОљH^шкšГЦЯ;‰€г{šSbsЉёЗ3Б|оИНцЦџМВуiіc›RДѓЅч hЕ!ѕfA§ ‚9yMW;2j2Œж_ЛЊl@k„‰АМшКqЕ>ті/ЩcлKЙќN@>9шђѓя›‡–“ћo‹[2њю` в/AjяqЇН4­˜0‚@ч€ЄЙƒnЈ}kAГљO‘эЎ:š+sˆ\5=ФCЗЦў…œ­р6-ј€rјYъZˆœ›СГCrа6Аx 5ў…§РЕХlКєР9` Јы?ў—§^іиєBРbˆЭЈгЉНч[ я-PІгŽя5ЖКœ7в(ЭО…и(ЙвЅ€кнэФ И˜§ GЋЯ§ПЋCџX`'че g‘АЋh4(\k тѓњ€‹‹.]zі^@ю9CЦŸиЪxЦЯюЉаVщb?oj6 ƒ0љАЗšы Ќ—–нуёJ@Љв$иdџэ`@СШCЮсƒ—ЈЃЖЋcƒ†ь,vЦ/”&)жŒСTрD§˜LWОРѕ/a@†Иўд§/\Ѕ9"}Ј'D _š€bУЗ­С}ЛДnYЎ‡ТI†дc/іЈ)ъё6"Pž`+$оK‡MЗŒђ”х5ЮeюWME„о6ˆиЃявЫћ ”Щ LІCЎgг­ВЯй ˜|њ€_зП(M†‘Ё ншзГfЃєŽWр Т; ўg2ј$ш] >cz^@щвaa'ЙXПЊб]ВŠl‹€YjЛ\Фйн LicNВУ—щdі k[H 4 ф:>ц4њ4љGmдж№ˆфЎ}Юђс9зByщQcЮЧјEyЗq^J‡y!I>ћi§ŠP“1†‡@+ь^†йzBрЕ>~їлЙђ;зœН@ўuѓ–Кў“OНцсšDЊз йШХ§&™ cFa@Ж5$ аЋГHP^љ э№Rфg$ SщpЌuЉМщ‚Кщƒ5B„ЫЩ6‹&ћєxпx‘ЯŸиJМe, Љч™ЭЛRЈN=5ЊeGœБ5~њsЅFKОЋ аV bрa`т х•?“амQ™юМŸвсXbЇМљу‹j}ВэшўьжГфўž‡ НЕ;wЖ{`œQ/^€šU4з_MЫЕ>DГзхsИŒzГaoќфG’гРЩЉJˆфк.sgG@_Š[пЩё]dлc›ј+хЮћ*цcВМ§s1ЈSІ]ОхќёОщ@ф9ГROЃ/€’йuВУЩZžtXkMКDc–mлjF5= œcх_љ —š;?*э єщј.ŽЕ?(oљTU—#їJЮјžcKu5Œћn^5|* UЉ­˜'Јк№^Ї„t6 Њ”2ЎЙђ€м_JkkXP v$%AйѓАwоoщpЂgЎ|пЧы.юьПlЫy}г6jЦoœФ‚Vм!БWЪ P32Єž%qVЉѕ!њХЬ\сA8Е*tКwЧСMjzDћ%€5дЛу˜?jнYvЯo“RООJ‡cmƒђіЯзlY$'ЈёO™Ж‘Ѓ^?гвсdў~DKў58t}ƒфЊњb–ЭŠЇ…uHьЏЪњЌ?A €>Ќа‚rшo яѕюЮ;t:–Зtю”З]ВЈж'ŸЅїKм—ъъYС |ўфДю.^@NьМypфƒ5ыђ šС|0iX6~–гSSfЅh•€Rі>ъ!ІЗ†K‡[{жШ[?W7IІюЫИ?глГиtDmOL…"ƒїщ“4пЈ(ЊДw(ЋŒЇ›q\/˜bА1ЪaгтŸ ^ п€vћi€‚n@ђхhќс8 EіяП$юGŠ1`џyлМ@лдЅђіKjцє_rяМ‰ію?Ј­-§lЖ^џЎ–0РЭ  8„э‡o?t§т‹B+п?~“AУ„@/?Ў›а/L˜•’ЪЊdѕипbФ €ёEUЇя ПЄ—АЛz6"а6u|џšš\SжlY™lяК[‹ =NgOјїl‚\2=>vх{:™sL[п.›EЁзMŠќlлi*ЎR‰НKЩі^ЈpОB59d;тЏBHа a`вэЫ*{uђ˜{RЏф` ‹Дію”№ХEеўКПА§цtgччЕщwЕђeЕРр Н€Йі,2Ё(ЊкshџЛ|{хoЌћ7BЎ ўЇОЎ6цЌЛ“эg20УЫO ~W)Љ'џlŒЛBА р\}z„Вћ7EЭЙ‰вaБ5™}шЧe‹Т §ђ=“mKœf5јВМpJЦџХа §WЗят;=ЬiрЈ(аыѓ™zlІ,~EdšјK3.ХУЩAб.œeЎпщипA|к9ІїщhяkŸЖF~рвадŽЯl].wЕЏƒ˜ШОйк;xЬп8yvЁ76ytќkяыїђН0,( SЈ…аљгiўjЇёкŽ z˜)Ш)Д&пœwВ*sNjqПuЁЯрр[DД".VlЋ­(ћџ?Ј#/л‹”6јЂšёўѓыЁzэ—ўрwйDЫ[йВом­Ћ`Š‚‡„ ё1jZVћ‡,|щлЋvћљŽ† љhЮѕђjMћј{КŽ[эЯПœв3џ.Ц]ЁЬ% ‰d’‘‹жЈЦK}?­6@ЫXŒ™їИ0ЈЅt˜Ktя–w\Н шѓиuЩЖЫ3‰жЏЋЄеЯАœсBўЄ8z–ЄЧœ.›P€іїѓћŽо8~ћ’ЫЫ§Юи[qЈы?yФxŠ$ЅuЫs ЎU~zцвтšшBЃХ"PЊjЗщ2ЄЦдв5om{krЫe{+=‡]—lН<oНZё]љЄžЏ;ЧљюМЯ„ vџра3“7§кJППŸђPЄЙP“Ч]]џЪ€’Дўo0їgOa€‰ВџL8Р;q˜,”7Œ_`„€Я{њѓ1Uˆw>&№БЋ“[.}ФяЩkПxћІl,ўaвтwА~<{^‚ЬgЉC“)љШФЋ‚Ќ|3ц*ќ’ѕwBššѕЇЃ§JuEА”@ЎЫЕшТ"Бh˜уѕ;ЋЧ^dƒІиT šЯ КqqŒф^7D (Д%Aˆђœј"љœažЖ'7]В•нwћgЖ]ЊђмkA8SХЙРжikфц k№v^ч=!H!пYШЈђ‘eaєec’0"ЈYPЧXТЯР@–ж­(˜|ЧNЫ‚П{jдСЇˆ!XђЌ№ŒЁ>_(Œp4Џ`>жЇЎu G€Ij˜wmмr‹@{…ЁsТ‚РМп ањ~хР№†є,YцѕIТf†Ф§GhйxШ@нџхo`їlыZš‹ƒј>ŒсН ~€ŽYЖT R#V9ж НЕч™М€љš&КhяууРг)љZЇв^ƒтж;gдЮб А„lkn›Д†Ь Ѕ ›W†ŸNнqЮыЋq™%лt!KO#ШЦ@Mы6cѕ6ƒ€З((Ўr_Й€Ђ{…lЩvHsmrЅУV/иаРСввѓ‰.ввOŽЖі<ћ­­КG/Р|QB9щ^€ѕ3 CхршHњЛgW=Qgд—oЌ$l|2уФƒfgјGјai§Š^ыю“Kф"{‚мœ^щёЉ“Gѕ.C:ЄX•Е&І“ї€мЖOб[цж^н№[КЩm‹Ѕу7oKx~‚EЁ€Ъ|ЪёЩ”2œ 4щчЌ$lpшќ~tnH.|р„o‘жПh'7(\„043ВkиЙcbŒ˜зМц`Н€тїqьIЗuѕmzш1Ldдь‘‰P’~~С.У…ŽђЇcЁЬ†%Lрei§ЙЖ3oЛЖжХBЁРј-†jмЈЬy№цЈЬћmМp~_щP€э їRВšЋ уg1ц_ %~SЄPIx<Ј‰@Бб.МАNZЗТvVч’‹лќфхPЪ (ъcїфЖооН?Ё`•?2КbђЎeл‚:AbxmtxэŒZФ UЯ9.ыЌpIiУJЧR{O­EЉ‘‚О в `Ÿsђ,ЭЦѓЁ€ѕ=ŠЊђ‡GъжјYŒЂЫЛ ыЭэ—г.F ЈpТi§ ЧСvžнХRѓјЁz^ћ9ЬўJ†–["кmЃCчПeХц ŽПоэ2Ќ8‘‹ƒ6М7M“р\u€чЅѕ+]Їнї#є‚z‚ъz Ф ‹фпŸ’JCUUлЦFЪјYА€Ј>аzТЬхМЋ#*№тIЄѕЩэ{yJ"PЪ Ш_ /РЮјs ИŸPРF5л61zAЃ?‹uёWЄzаЎp­œc.ђА€”6œ[rЩ=_@ 4бT‰@ *Ш}~>РIйбіф№Žоvў?*>Ю: ˆЊVтkЖќе^”6œчiХ-п`DЁPљ^€5Аћ Ё€M>@Hež™Мёcы­WА€Ј:hЦŸ-6аp€\Р1тњŸћ’—яXбHпГЃ џgы0Џћ JфTP[’“ЗŒоКєвJЮK#€DaB.ЄёУFе+TWјиiУJЯSьUмвЯAŸNЉ<ьМ€мZМ€ЂA:PlШ^BЫ~‰Ы˜џ#kЯнSщ9i$pЮ !Ц?ВYЦ Њ'BŒФ§ч•ŒћYћб+q+ѕP,œœї8ƒgюѓ~ЦђsBТŠˆЂШ-щфUЃЗ-џNPчЂбР.У€Pdнј Vёъ/ю–6Ўђ=­^ ЊoxЁœЂЁЂžyоИБOšЕњЬ!Ybњ‚ЁмgЊЊ–~6yлтy\Џ шl>ЃћЕ!тХЕј! /$ЅMЋЫšX7ЗЏl!$!ШМЇ(PST™Яfџ;.ЇWŽЌ])wп+81ЉO’Чѕ˜пЉ?Lр:sжЉФѕї”єГъЬЇuб B’ AЮСрЭћ–rпЌ:"dх'o_К*Ьcn0Iш:! SЂEВ\ѕ€ДќРупx~YЦoь)|Œѓ+d{?”ЈаD 7!'ѓ нBм‘XBUMЃџЕ doПs…яIFWрˆœuˆ: И5„#OZўxEЦoьЉК0bАˆlє~ё…х’ЬŸOkЮ@3x™Sе}МЂьEйќоr4њ`–ЖЦJBГ‹іёs^Œ‚тіsдэпИЊ"у7іT[ W“ztЕШжGЖђЭZCтxщ-МВ—ќ?B?ФƒњуЩя-п[ыуif"Ш)P†_"сЄЄ?Ў…PЗŸДќrЦoь AќЙА€ЦњtžKc5,УЎІ№ёнђц‹]A )›(єЈЩ!Ѓ{Яˆѕk%bЫƒђНљ*ђёBгўpHuhж…KT:[яа^л™{Њ*<Џ‚ј‚|я…ЁЌ €‚ї‘›-ашљК2/‰ѓеŒѓФU>6LZўгхMЋ‰їэ@@ХЈ&М*RддˆfјЭшOИdсЋ"БФNyѓ'…}м(H(#EЯ‡zNвЉЙ'ш3єj†яbДеAL‚аrМљпЊ2ы4 *u)ДЕЇ+WЅш x6l БОињ|п'OєЙ€TMTuЙр…ЊяœаIЃŸ8LZќуњruЎ е1Б„ј;IЋZЌя RUФ_Г8ўаж/r‰nа—”j№4‹OщаŠН\­>€­ЁжJ„ј01ўO’VПf‹Ь  5Aјр—Џ†ёСKеЌдУХлыžCžlбз‡Єˆ wq cюЕŠp hЛ.&žЪY„{œџa?џc@џdAџfBџhCџjDџlEџnFџoGџrHџsIџuJџwKџyLџ{Mџ}Nџ‚Qћ‹Uм‘Y‡{Mџa?џc@џdAџfBџhCџjDџlEџnFџoGџrHџsIџuJџwKџyLџ{Mџ}Nџ~Oџ€Oџ‚Qџ†RўXЯ—[<}MyuIѓ†RџVџž_џž_џž_џŸ_џŸ_џ–ZџŽWџyLџnFџhCџjDџlEџnFџoGџrHџsIџuJџwKџyLџ{Mџ}Nџ~Oџ€Oџ‚Qџ„Qџ†RџˆSџ’Xм™\<Јd|ЂaѓЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЅbџ˜\џOџnFџoGџrHџsIџuJџwKџyLџ{Mџ}Nџ~Oџ€Oџ‚Qџ„Qџ†RџˆSџŠTџ‹Uџ”Zм›]ЈdpЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇcџ”ZџyLџsIџuJџwKџyLџ{Mџ}Nџ~Oџ€Oџ‚Qџ„Qџ†RџˆSџŠTџ‹UџVџXўš]‡ЈdWЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ™]џ{MџwKџyLџ{Mџ}Nџ~Oџ€Oџ‚Qџ„Qџ†RџˆSџŠTџ‹UџVџWџ‘Xџ˜\чž_ЈdЈdмЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ—[џ|Nџ{Mџ}Nџ~Oџ€Oџ‚Qџ„Qџ†RџˆSџŠTџ‹UџVџWџ‘Xџ“Yџ˜\іŸ_WЈdpЈdРЈdмЈdяЈeяЉgџЉhўЉhяЊi№ЉjбЈiБІi YЈdЏЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇcџ‹Uџ}Nџ~Oџ€Oџ‚Qџ„Qџ†RџˆSџŠTџ‹UџVџWџ‘Xџ“Yџ•Zџ˜[ўŸ`WЈdWЈdмЈdўЈdџЈdџЈdџЈeџЉfџЉhџЊiџЊjџЋlџЋmџЌnџЌpџЌoћЊmбЅk ZЈdpЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ›]џPџ€Oџ‚Qџ„Qџ†RџˆSџŠTџ‹UџVџWџ‘Xџ“Yџ•Zџ—[џ™\ў `WЈdpЈdяЈdџЈdџЈdџЈdџЈdџЈdџЉfџЉgџЉiџЊjџЋkџЋmџЋnџЌpџ­pџ­rџ­sџЎtџ­q№Іn tЈdЈdмЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЄbџˆSџ‚Qџ„Qџ†RџˆSџŠTџ‹UџVџWџ‘Xџ“Yџ•Zџ—[џ˜\џ›]ўЁaWЈdЈdЯЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈeџЉgџЉhџЊiџЊkџЊlџЌnџЌnџЌpџ­qџЎsџЏtџЏuџЏvџБxџЎsщЄn@Јd‡ЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇdџ‰Uџ„Qџ†RџˆSџŠTџ‹UџVџWџ‘Xџ“Yџ•Zџ—[џ˜\џš]џ^ўЃa<ЈdWЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈeџЈfџЉhџЊiџЊjџЊkџЋmџЌnџЌpџЌqџ­rџЎtџЏtџАvџАwџБyџБzџВyўЉq ЂЈd<ЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ“Yџ†RџˆSџŠTџ‹UџVџWџ‘Xџ“Yџ•Zџ—[џ˜\џš]џœ^џ `іЈdWЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈeџЉgџЉhџЊiџЋkџЊlџЌnџЌoџ­pџ­rџЎsџЎtџЏvџАwџБxџВyџВzџВ|џД~џ­u дЈdЏЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ”YџˆSџŠTџ‹UџVџWџ‘Xџ“Yџ•Zџ—[џ˜\џš]џœ^џž_џЂaЯЈdWЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈeџЈfџЉhџЊiџЊjџЋlџЋmџЌnџЌpџ­qџЎsџЏtџЏuџЏvџБxџБyџВzџГ|џД}џД~џЕџАx рЈdWЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ•ZџŠTџ‹UџVџWџ‘Xџ“Yџ•Zџ—[џ˜\џš]џœ^џž_џ `џЅbWЈd<ЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈeџЉgџЉhџЊiџЋkџЋmџЋnџЌpџ­pџ­rџЎsџЏtџАvџАwџБyџБzџВ{џГ}џД~џЕџЖ€џИ‚џАy рЈdРЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ’Xџ‹UџVџWџ‘Xџ“Yџ•Zџ—[џ˜\џš]џœ^џž_џ `џЃbяЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЉfџЉhџЊiџЊjџЋlџЋmџЌnџЌpџ­qџЎsџЏtџЏuџАwџБxџВyџВ{џВ|џД~џДџЖ€џЗџИ‚ џИ„ џ­r пЈdpЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇdџXџVџWџ‘Xџ“Yџ•Zџ—[џ˜\џš]џœ^џž_џ `џЂaџЅcpЈdРЈdџЈdџЈdџЈdџЈdџЈdџЃaџ„RџmFџ]=џaAџfDџiGџmLџ{TџŒ^џœfџЌpџЌqџ­rџЎsџЏtџАvџАwџБyџВzџГ|џД}џД~џЕџЖџЗ‚ џЙ„ џК… џК† џЌo ФЈdЈdЯЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџІcџWџWџ‘Xџ“Yџ•Zџ—[џ˜\џš]џœ^џž_џ `џЂaџЄbяЈdЈdўЈdџЈdџЈdџЈdџЈdџ}Nџ[<џZ<џ^>џa@џeCџhGџmKџqNџuRџyVџ~Yџ†_џ—gџЋrџЏtџЏuџАwџБxџВyџВ{џГ|џД~џЕџЖџИ‚џИƒ џЙ„ џК… џЛ‡ џЛ† џЉpЈd‡ЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЃbџWџ‘Xџ“Yџ•Zџ—[џ˜\џš]џœ^џž_џ `џЂaџЃbџЇc<ЈdЏЈdџЈdџЈdџЈdџЂaџhCџW:џ[<џ^>џa@џeCџiEџnIџqMџvQџ„XшŒ\ž^ sƒQ Ѕk ZЋp вЏvўБyџВzџГ|џД}џЕџЖ€џЗџИ‚ џИ„ џЙ… џЛ‡ џМˆ џН‰ џК„ ўІl?Јd<ЈdчЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ_џ‘Xџ“Yџ•Zџ—[џ˜\џš]џœ^џž_џ `џЂaџЃbџЇcЯЈdіЈdџЈdџЈdџЂaџc@џW:џ[<џ^>џb@џfBџiDџmFџqGџtIџŠUœЄk!Њq ФВyўГ|џД~џЕџЖџЗ‚џЙ„ џК… џК† џМ‡ џМˆ џНŠ џО‹ џЕ~ ђЈdЏЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ•Zџ“Yџ•Zџ—[џ˜\џš]џœ^џž_џ `џЂaџЃbџІcіЈd<ЈdџЈdџЈdџЈdџiDџW:џ[<џ_>џb@џfBџjDџmFџqGџuIџˆSРЄn@АxёЕџЖ€џЗџИ‚ џЙ„ џК… џЛ‡ џМˆ џНŠ џО‹ џПŒ џП џЏ{ШЈdpЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdчЈdРЈdРЈdœЈdpЈdpЈdpЈdpЈdpЈdpЈdœЈdРЈdЯЈdяЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџІcџ“Yџ•Zџ—[џ˜\џš]џœ^џž_џ `џЂaџЃbџІcџЇdЈdpЈdџЈdџЈdџƒQџX;џ[<џ_>џc@џfBџjDџnFџqHџuJџyKџ‘X<Ћt ЕЖџЗ‚џЙ„ џК… џЛ† џМˆ џН‰ џНŠ џОŒ џП џР џС џІx`ЈdЈdмЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdчЈdРЈdpЈdЈdЈd‡ЈdмЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџŸ_џ•Zџ—[џ˜\џš]џœ^џž_џ `џЂaџЃbџІcџЇdpЈdРЈdџЈdџЃaџ]=џ\<џ_>џc@џgBџjDџnFџrHџuJџyLџ|MџІrwЗ ўЙ„ џК… џЛ‡ џМˆ џНŠ џО‹ џП џРŽ џР џС џМ‹ їЈdЏЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdчЈdЏЈdWЈdpЈdмЈdџЈdџЈdџЈdџЈdџЈdџЈdџ—[џ—[џ˜\џš]џœ^џž_џ `џЂaџЃbџІcџЇdœЈdРЈdџЈdџŠUџ\=џ`?џc@џgBџkDџnFџrHџuJџyLџ}NџPџЇorЗ §Л† џМˆ џН‰ џНŠ џПŒ џП џР џС џС‘ џТ“ џЛ… џЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdмЈd‡ЈdЈdЈdРЈdџЈdџЈdџЈdџЈdџЃaџ—[џ˜\џš]џœ^џž_џ `џЂaџЃbџІcџЇdРЈdРЈdџЈdџjDџ`?џdAџgCџkDџoFџrHџvJџzLџ}NџPџ„Rџ—[<Ђo"З љМˆ џНŠ џО‹ џП џРŽ џР џС‘ џТ’ џУ“ џУ• џГwџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdœЈdЈd<ЈdяЈdџЈdџЈdџЈdџ™\џ˜\џš]џœ^џž_џ `џЂaџЃbџІcџЇdРЈdЏЈdџЃbџ`?џdAџhCџkEџoFџsHџvJџzLџ}NџPџ…Rџ‰Tџ—[œЃp"И‚ љНŠ џПŒ џП џР џС џТ’ џТ“ џУ• џФ• џУ” џЌkџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdмЈd<ЈdЏЈdўЈdџЈdџЅcџ˜\џš]џœ^џž_џ `џЂaџЃbџІcџЇdРЈdpЈdџ–[џdAџhCџlEџoGџsIџvJџzLџ~Nџ‚Pџ…Rџ‰TџŒVџ“YћЁr#Л† §ПŒ џП џР џС‘ џТ’ џУ“ џФ• џФ– џХ˜џР џЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdћЈdЏЈdЈdWЈdўЈdџЈdџš]џš]џœ^џž_џ `џЂaџЃbџІcџЇdРЈdџ“YџhCџlEџoGџsIџwKџ{Mџ~Nџ‚Pџ…Rџ‰TџVџ‘Xџ”Zџ_РЈdЂЈdјЕzџП џР џС џС‘ џТ“ џУ” џФ• џХ—џХ˜џЦ™џЗ џЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdœЈdWЈdўЈdџЄbџš]џœ^џž_џ `џЂaџЃbџІcџЇdpЈdмˆSџlEџpGџtIџwKџ{Mџ~Oџ‚Qџ†RџŠTџVџ‘Xџ”Zџ˜\џœ^џЂaЏЈdWЈdмЈdўЈdџЈdџЈdџБtџПŒ џС џТ’ џУ“ џУ• џФ– џХ˜џЦ™џЦšџЧœџЎnџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdpЈdWЈdўЈdџœ^џœ^џž_џ `џЂaџЃbџІcџЇd<Јdp’XџpGџtIџwKџ{MџOџƒQџ†SџŠTџVџ‘Xџ•Zџ˜\џœ^џ `џЃbџЇcяЈdpЈdWЈdœЈdмЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЌlџР џТ’ џУ“ џФ• џХ—џХ˜џЦ™џЧ›џШџУ“џЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdpЈdpЈdџЂaџœ^џž_џ `џЂaџЃbџІcћš\ѓtIџxKџ|MџOџƒQџ†SџŠTџŽVџ‘Xџ•Zџ™\џœ^џ `џЄbџЇdџЈdџЈdџЈdџЈdяЈdяЈdяЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЋiџНŠ џУ• џФ–џХ—џХ˜џЦšџЧœџШџЩžџЙ‚ џЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdpЈdРЇdџœ^џž_џ `џЂaџЃbџЇcЯЈdJ{Lџ|Mџ€OџƒQџ‡SџŠUџŽWџ’Xџ–Zџ™\џ^џ `џЄbџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЊgџПŒ џФ– џХ˜џЦ™џЧ›џЧœџШžџЩ џЪЁџЎpџЈdџЈdџЈdџЈdџЈdяЈdpЈdWЈd‡ЈdРЈdРЈdяЈdяЈdяЈdяЈdяЈdяЈdяЈdчЈdРЈdЏЈdpЈdќŸ`џž_џ `џЂaџЃbџЇcWVœ€OџƒQџ‡Sџ‹UџWџ’Yџ–[џ™\џ^џЁ`џЅbџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџК„ џХ˜џЦ™џЧ›џШџЩžџЩ џЪЁџХ—џЈdџЈdџЈdяЈdpЈdЈd‡ЈdЯЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdЏЈd<ЈdpЅcџž_џ `џЂaџЄbяŽVмˆSџ‹UџWџ’Yџ–[џš]џž_џЁ`џЅbџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџК… џЦšџЧ›џШџЩžџЪ џЪЁџЫЃџЗ€ јЈdpЈd<ЈdЏЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdчЈdpЇcѓž_џ `џЂaџЅcp“YмWџ“Yџ—[џš]џž_џЁaџЅbџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЛ† џЧœџШџЩŸџЪ џЫЂџЫЃџХšљЂ}*%ЈdЈdœЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈd<ЇdЂЁ`џ `џЃbяš]Р—[џš]џž_џЂaџЅcџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЖ} џШžџЩŸџЪЁџЫЂџЬЄџЭЅџФœѕЈd<ЈdЯЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdЏЄbў `ўЅb<Ё`žЂa§ЃbџІcџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdч­x­ЧœўЪЁџЫЃџЬЄџЭЅџЮЇџУ  щzщчЈdpЈdчЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇcџЅcмЅbнЃbœЈd<ЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdмЈd<Ў…ЂЪЁџЫЃџЬЄџЭІџЮЇџЯЉџФЁ#щ{ъшЈdœЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇcџЄbџЁ`џ `мЈd‡ЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdћЈdЏЈdЏ…ЋЫЃџЬЄџЭІџЮЇџЯЉџЯЊџФЃ$щ}ъщЈdЈdЏЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇcџЄbџЁ`џ^џš]џœ^ЯЈdИЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdмЈdWЏ…ЋЬЄџЭЅџЮЇџЯЉџЯЊџаЌџО•цЈd<ЈdЯЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇcџЄbџЁ`џ^џš]џ—[џ“Yџš]‡ЈdШЈdœЈdчЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdћЈdЯЈd‡ЗˆоЭЅџЮЇџЯЉџЯЊџаЋџб­џП—чЈdpЈdмЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇcџЄbџЁ`џ^џš]џ—[џ“YџXџWћ˜\ЈdœЈdмЈdЈd‡ЈdЯЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdяЈdЯЈdœЈd<М‘хЭІџЮЈџЯЉџаЋџбЌџвЎџС–ђЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇcџЄbџЁ`џ^џš]џ—[џ“YџXџVџŠTџ‘YРЈdЏЈdіЈdWЈd<ЈdpЈdpЈdpЈdОѓЮЇџЯЉџаЋџаЌџбЎџвЏ џУ”џЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdяЈdяЈdяЈdяЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЇcџЄbџЁ`џ^џš]џ—[џ“YџXџVџŠTџ†Sџ™_§Ѓk!ЈdмЈdџЈdРЁ}*%Ц›ўЯЉџЯЊџаЋџб­џвЎџвЏ џУ”џЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdРЈd‡ЈdWЈdpЈdЯЈdћЈdџЈdџЈdџЈdџЇcџЄbџЁ`џ^џš]џ—[џ“YџXџVџŠTџ†SџƒQџfџЈm  ЈdмЈdџЈdіЈdpЈd<ЈdРЈdћЊhџЬЄџЯЉџаЋџаЌџб­џвЎџвЏ џЦ™џЋiџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdмЈd‡ЈdœЈdћЈdџЇcџЄbџЁ`џ^џš]џ—[џ“YџXџVџŠTџ†SџƒQџ€OџœiџЎrїЈdœЈdџЈdџЈdчЈd<ЈdЈdœЈdіЈdџЈdџЈdџЈdџЏq џЯЉџЯЉџаЋџаЌџбЎџвЎџвЏ џЫЂџЋiџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdчЈd‡ЇcЯЄbџЁ`џ^џš]џ—[џ“YџXџVџŠTџ†SџƒQџ€Oџ}NџlџЏtџЃk!Јd‡ЈdўЈdџЈdџЈdтЈdpЈd<ЈdœЈdчЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЖ~ џЯЉџЯЊџаЋџаЌџб­џвЎџвЏ џЫЂџЋiџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdЯЈd<Єbœ^џš]џ—[џ“YџXџVџŠTџ†SџƒQџ€Oџ}Nџ{PџЅqџЎtџЇl ‹Јd<ЈdіЈdџЈdџЈdџЈdљЈdЏЈd<ЈdpЈdРЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџРџЯЉџЯЊџаЋџаЌџб­џбЎџвЎџЪЁџАr џЈdџЈdџЈdџЈdџЈdћЈdЏЈdŸ_Р—[џ“YџXџVџŠTџ†SџƒQџ€Oџ}NџzLџyVџЎuџЏtџЉmУЈdРЈdџЈdџЈdџЈdџЈdџЈdіЈdРЈdpЈdЈdpЈdРЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЧ›џЯЉџЯЉџаЋџаЋџаЌџб­џб­џЯЉџАr џЈdџЈdіЈdœ–[іXџVџŠTџ†SџƒQџ€Oџ}NџzLџvJџŠeџЏuџЎtџЋo№ЈdWЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdіЈdчЈdРЈdИЈdpЈdpЈdpЈdpЈdpЈdpЈdpЈdЏЈdРЈdмЈdяЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЊhџЫЃџЯЉџЯЉџЯЊџаЋџаЋџаЌџаЌџаЌџЗ€ќЈd<™]œVџŠTџ†SџƒQџ€Oџ}NџzLџvJџuRџІsџЏuџЎsџЌpїЈd‡ЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџБt џЮЇџЮЇџЯЉџЯЉџЯЉџЯЊџЯЊџЯЊџаЋџОŒўЈd‡š]ŠTџ†SџƒQџ€Oџ}NџzLџvJџsJџŠeџАvџЎtџ­sџ­qџЈdœЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЏp џЦ›ќЮЇџЮЇџЮЈџЯЉџЯЉџЯЉџЯЉџЯЉџХ˜џЊiг†SџƒQџ€Oџ}NџzLџvJџsIџzXџЏvџЏuџЏtџЎsџ­qџЈdWЈdмЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdчЈdœЈdІz SЪЂўЭІџЮЇџЮЇџЮЇџЮЇџЮЇџЮЇџЮЇџЫЃџБu љЈdW–[ƒQџ€Oџ}NџzLџvJџsIџvQџЉuџЏvџЏuџЎtџ­rџ­pџЈd‡ЈdмЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdћЈdЯЈd‡ЈdЇ€&dЪЁўЭЅџЭЅџЭІџЭІџЭІџЭІџЭЅџЭЅџЭЅџК„ џЈdа‘Xœ€Oџ}NџzLџvJџsIџuNџЉuџАwџАvџЏtџЎsџ­qџЌpџЈdWЈdЏЈdчЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdяЈdРЈd‡ЈdЇ€%dЩ ўЬЄџЬЄџЬЄџЬЄџЬЄџЬЄџЫЃџЫЃџЫЃџХ—џЎoљЈd‚„Qћ}NџzLџvJџsIџ}Qџ­wџБyџАwџЏuџЏtџЎsџ­qџЌpџЈdpЈd‡ЈdРЈdРЈdяЈdяЈdяЈdяЈdяЈdяЈdяЈdяЈdяЈdяЈdяЈdРЈdРЈd‡ЈdpЇ~"dЩŸўЫЃџЫЃџЫЃџЫЃџЫЃџЫЂџЫЂџЪЁџЪЁџЪ џЛ… џЊhъЈdHVР}NџzLџvJџsIџ”bџВzџБyџБxџЏvџЏuџЎtџ­rџ­pџЋnўІ~#dШžўЪЁџЪЁџЪЁџЪЁџЪЁџЪ џЪ џЩ џЩŸџЩžџЦšџДy ўЈdФЈd-Wœ}NџzLџvJџSџЌsџВ{џБzџБyџАwџЏvџЎtџ­sџ­qџЌpџЊl№І~#dЧœўЩ џЩ џЩ џЩŸџЩžџЩžџШžџШžџШџЧœџЧ›џУ”џГy ўЈdРЈdWœ}Nџ}NџŒWџЈoџГ|џВ|џВzџБyџБxџЏvџЏuџЎtџ­rџЌqџЌpџЈjБЄ{#EТ”љШžџШžџШžџШџШџШџЧœџЧ›џЧ›џЦšџЦ™џХ˜џТ’ џЖ~ џЋkнЈdp•ZŽVъWџ hџАuџЕ~џД~џГ}џВ{џБzџБyџАwџЏvџЎtџ­sџ­qџЌpџЌnџІh >Ёz%$ОѓЧœџЧœџЧœџЧ›џЧ›џЦšџЦšџЦ™џХ˜џХ˜џХ—џФ– џФ• џУ• џО‹ џЕ{ ќ­q йЈd‡ЈdЈdWЌn вЎrўГxџЗџЗџЖ€џЕџД~џВ|џВzџБyџБxџЏvџЏuџЎtџ­rџ­qџЌpџЋl№Ж‡йЦšџЦšџЦ™џЦ™џЦ™џХ˜џХ˜џХ—џФ– џФ–џФ• џУ• џУ“ џТ“ џТ’ џС џР џЛ‡ џЙƒ ўИ„ ђИƒ ђЗ‚ ђЖ ђК„ џЛ‡ џК… џЙ„ џИ‚ џИ‚џЖ€џЕџД~џГ|џВ{џБzџБyџАwџЏvџЎtџ­sџ­qџ­pџЌoџІh Y­€ЉУ•ўХ˜џХ˜џХ˜џХ—џФ– џФ–џФ• џУ• џУ“ џТ“ џТ’ џС‘ џС џР џР џП џПŒ џО‹ џНŠ џН‰ џМˆ џЛ‡ џК… џЙ„ џИƒ џЗ‚џЖџЕџД~џГ}џГ|џВzџБyџБxџЏvџЏuџЎtџ­rџЌqџЌpџЉkТЄxDПŽјФ– џФ– џФ• џФ• џУ• џУ“ џТ“ џТ’ џТ’ џС‘ џС џР џРŽ џП џПŒ џО‹ џНŠ џН‰ џМˆ џЛ‡ џК… џЙ„ џЙ„ џЗ‚џЖџЖ€џЕџД~џВ|џВzџВyџБxџАwџЏvџЎtџ­sџ­qџЌpџЊlоВЪУ• џУ” џУ“ џТ“ џТ’ џТ’ џС‘ џС џР џР џП џП џПŒ џО‹ џНŠ џН‰ џМˆ џЛ‡ џК† џЙ„ џЙ„ џЗ‚ џЗџЖ€џДџД~џГ|џВ{џБzџБyџАwџАvџЏtџЎsџ­rџЌqџЊlоЃxDКˆ ѓТ’ џТ’ џС‘ џС џР џР џРŽ џП џП џОŒ џО‹ џНŠ џМˆ џМˆ џЛ‡ џК… џЙ„ џЙ„ џЗ‚ џЗџЖ€џДџД~џГ}џВ{џВzџБyџБxџЏvџЏuџЏtџЎsџ­qџЉkТЈy{К‡ ђР џР џРŽ џП џП џПŒ џО‹ џНŠ џНŠ џМˆ џМˆ џЛ‡ џК… џЙ„ џЙ„ џЗ‚ џЗџЖ€џЕџД~џГ}џГ|џВzџБyџБxџАwџЏuџЎtџ­sџЌo№Іi ZЃuCВ~жНŠ ўПŒ џО‹ џНŠ џНŠ џН‰ џМˆ џМ‡ џЛ† џЙ… џЙ„ џЙ„ џЗ‚ џЗџЖ€џЕџД~џГ}џГ|џВzџВyџБxџАwџЏvџЏtџЌp№Їl ŸЇvyБ}жИƒ јМˆ џМˆ џЛ‡ џК† џЙ… џЙ„ џИƒ џЗ‚џЗџЖ€џЕџД~џД}џГ|џВzџВyџБyџАwџЎtћЋoвЅk ZЂp"ЇtxЎyЧБ{ сД} ёД} їЗ‚џЖџЖ€џДџД~џГ}џВzўЏvёЎuёЊq ФЈn ŒЅj >џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќџџџџџџџџџџџџџр?џџџџџџџџџџџџџџџџџџџџџџџќџџџџџџџџџџџ№џџџџџџџџџџР?џџџџџџџџџџџџџџџџџџџќџџџџџџџјџџјџџџџрџџрџџџ€џџ€џџџџџџќўџџј?ќџџрјџџРјџџ№ќр?јр€рррРР?јР?ўџќРџџџџРРџ€џџџ№Р?џР?џџџќР?џрџџџџџР?џ№џџџџџ€рџр?џџџџџРрџџџџџџџрр№џџџџџџ№№џџџџџџј№?џџјџќјџџџџќќџџј?ўўџџРўџџџџџ€џќџ?џР№џџџ№€?€џџџќР>џяџџр?џчџРџ№?џёџџџџјџјџџџџџјќџќ?џџџџрџ€џўџџџџџџрџџџџџјџџ№џџ€џџР?џџјџџрџјџџџќџџ№џџџќџџќџџџќџџџџџџўџџџР?џџќџџџј<џџќџџџџўџџќџџџџјџџџџјџџџџџџџџџ€џ№џџџџџџџџџРџрџџџџџџџџџрџ€џџџџџџџџџ№~џџџџџџџџџќџџџџџџџџџў?џџџџџџџџџџџџџџџџџџџџРџџџџџџџџџџџрџџџџџџџџџџџјџџџџџџџџџџџўџџџџџџџџџџџџР?џџџџџџџџџџџџјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(@€ OџeBџmJџuRџ…[џžiџЎtџЏvџБyџВ|џЕџЗџИ„ џЛ† џ­u ЦЈdpЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџ“Yџ’Xџ•Zџ™\џœ^џ `џЅcЯЈdћЈdџ‡SџW:џ^>џeBџmFџxNў[‰@жЛЃk!Њp ФБyўД~џЖ€џИ‚ џК… џМˆ џНŠ џЈswЈdЈdмЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџІcџ“Yџ•Zџ™\џœ^џ `џЄbћЈd<Јdџ^џ]=џ_>џfBџmFџuIџVœЄk!Бy ёЗџЙ„ џЛ‡ џНŠ џПŒ џНŠ ќЁv#ЈdЏЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdяЈdРЈdœЈdpЈddЈd<ЈdpЈd‡ЈdРЈdіЈdџЈdџЈdџЈdџ `џ•Zџ™\џœ^џ `џЄbџЈd<ЈdpЈdџvJџ`?џgBџnFџuJџ|Mџ“YpБy чК… џМˆ џО‹ џП џС џЙ‚ §ЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdіЈdЏЈdWЈd<ЈdРЈdўЈdџЈdџ™\џ™\џœ^џ `џЄbџЈdpЈdpЈdџdAџgCџoFџvJџ}Nџ„Rџ–[œ­t ЩНŠ џПŒ џР џТ’ џУ• џГw џЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdЯЈd<ЈdЈdчЈdџЅcџ™\џœ^џ `џЄbџЈdpЈd›]џhCџoGџvJџ~Nџ…RџŒVџ•ZћЁ`Јd–З §П џС џУ“ џФ– џФ–џЌkџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdћЈdœЈdРЈdџœ^џœ^џ `џЄbџЈdp—[ѓpGџwKџ~Oџ…RџVџ”Zџ›]џЃaіЈdpЈd<Јd‡ЈdвЈdћЈdџЈdџЗ џС‘ џУ• џХ—џЦšџР џЈdџЈdџЈdџЈdџЈdџЈdяЈd‡ЈdЯЄbџœ^џ `џЄbџЁ`yxKџOџ†SџVџ”Zџœ^џЃaџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџДyџФ• џХ˜џЧ›џШžџЗ џЈdџЈdџЈdяЈdpЈdЈdpЈdœЈdРЈdРЈdРЈdРЈdpЈd<Їdљ^џ `џЅbч“YК‡SџŽWџ•Zџœ^џЃbџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџГwџЦ™џЧœџЩŸџЩžџЌlњЈdpЈdЈdœЈdмЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdіЈdЏЈdЈdpЁ`џ `џІcpœ^Ф–[џ^џЄbџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџГx џШџЩ џЫЃџМ‘хЈdpЈdмЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈd‡ЄbђЂaяЄbЕІc§ЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЌsЊЧœўЫЃџЭІџН“цЈdœЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџІcџЃaШЄbЅЄb<Јd<ЈdмЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdжЈd<І~#dЩ ўЭІџЯЉџО”шЈdЈdЏЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџІcџ `џ™\џ›]œЈdвЈd<ЈdЯЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdіЈdЯЈd‡Ў€ЃЭЅџЮЈџаЋџР–ыЈdЯЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџІcџ `џ™\џ“YџŽWў–[ЈdWЈdяЈdWЈdWЈdpЈdpЈdJА†ЌЮЇџЯЊџб­џУ“џЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdмЈdРЈdРЈdЯЈdіЈdџЈdџЈdџІcџ `џ™\џ“YџŒVџ†RџЄjвЈdWЈdўЈdЯЈdЈd<ЈdШЈdћНŠџЯЉџаЋџбЎџУ“џЈdџЈdџЈdџЈdџЈdџЈdџЈdўЈdмЈd‡Јd<ЈdмІcџ `џ™\џ“YџŒVџ†Rџ€Pџ­sќЈd<ЈdіЈdўЈdЯЈdWЈdWЈdРЈdіЈdџЈdџЈdџЈdџФ–џЯЉџаЋџб­џХ˜џЋiџЈdџЈdџЈdћЈdœЃbœ™\џ“YџŒVџ†Rџ€Oџ~VџЏuџЅj >ЈdЈdЯЈdџЈdџЈdћЈdЯЈdœЈdpЈdЈdЈdpЈd‡ЈdРЈdыЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЊhџЩŸџЯЉџЯЊџаЋџЩžџЋiјЈdp˜[тŒVџ†Rџ€OџyLџ–hџЏtџЇj ŠЈd<ЈdтЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЏp џЫЂџЮЇџЯЉџЯЉџЭЅџЎsа—\‡†Rџ€OџyLџxRџЏvџЎtџЉkТЈd<ЈdЯЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdіЈdЏЋxЪЁўЭІџЭІџЭІџЭІџЗ‚ѕЈdH“Yœ€OџyLџwNџЉtџЏvџ­sџЉkТЈdWЈdЏЈdчЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdіЈdяЈdРЈd‡ЈdІ~"dЩŸўЫЃџЫЃџЫЃџЫЃџТ’ўЌlй†RіyLџSџЊtџАwџЏtџ­rџЈkТЈd<ЈdpЈdpЈd<І~#dЧўЪ џЩ џЩ џЩžџШžџЗ€ §ЉiЄ‹UмOџ•dџВzџБyџЏvџЎtџЌqџЇi‰Ї|bС“љШџЧœџЧ›џЧ›џЦ™џХ˜џК„ ќЎwЦЈdJЃabeѓЇqџД|џД}џВzџБxџЏuџ­rџЌnўІh  z%$НѓЦ™џХ˜џХ˜џФ– џФ• џУ“ џТ’ џС џК„ ўИ„ ђЗ‚ ђИ‚ ќЙ… џИƒ џЖџД~џВ{џБyџАvџЎtџЌqџЉjТВ‚ЪФ• џУ• џУ“ џТ“ џС‘ џР џП џПŒ џНŠ џМˆ џК… џЙ„ џЖџЕџВ|џВyџАwџЏtџ­rџЋmїЅyaКˆ ѓС‘ џС џР џП џО‹ џНŠ џМ‡ џК… џЙ„ џЗџДџГ}џВzџБxџЏuџ­sџЊmоІh ЈwzД€тН‰ ўНŠ џМˆ џЛ‡ џЙ… џИƒ џЗџЕџГ}џВzџБyџАvџЌp№Іj sЇuxЎyЧБz сГ| ёВz ёБy ёАxёЏvёЋq гЈn ЁЅj >џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРџџџџџўџџџџџјџџџџрўџџРјџр?ўРјРр€Р€|џј€џў?€?џџ€€џџџС€џРсРќср№ѓ№РѓјО€?сџР?Уџџ?рџјџР№џрќџрџџрџрџрџџ‡џРџџџџ€џџџџР?џџџџ№џџџџјџџџџўџџџџџџРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ( @ zLWuIРtIчvJя}Mя‰TР’YWЈdpЁ`№ЄbџІcџŸ`џVџyLџyLџPџ‹Vћš]pЈdœЈdмЉfяЉiнЈk ŸЈd<ЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџ”ZџPџˆTџWџž^œЈdЈdіЈdџЈdџЊiџЌpџЏtџАwћЅo\ЈdРЈdўЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџœ^џˆTџWџ—[џЃa‡ЈdѓЂaџ„RџˆVџšeџ­rџБxџД}џЗўЇi YЈdWЈdіЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџž_џWџ—[џ `ћЈdp^џ^=џgCџ~Oі”`|ЇjААvќЖ€џК† џЙ… јЅn?ЈdЯЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdяЈdяЈdяЈdџЈdџЈdџ›]џ—[џŸ_џЇcpЈdРrHџhCџwKџ‘XРЈdБy ъМˆ џРŽ џЗ џЈdџЈdџЈdџЈdџЈdџЈdџЈdчЈdœЈd<Јd‡ЈdяЇdџ˜\џŸ_џЇcЏЈdprHџyKџ‡Sџ™\іІcЈd<ЈdУИ џС џФ– џАrџЈdџЈdџЈdўЈdРЈd<ЈdШЁ`џŸ_џЇc’‡Sѕ‰Tџ—[џІcџЈdџЈdџЈdџЈdџЈdџИ џХ˜џЧ›џЊhўЈdРЈdЈd<ЈdœЈdРЈdяЈdяЈdмЈdœЈdЅbьŸ_џЇc< `=œ^їЇdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЙ‚ ўЩ џМшЈd‡ЈdяЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdўІcœЂaTЃbиЈd“ЈdЈdЈdРЈdўЈdџЈdџЈdџЈdџЈdяЈdœЈdЕ‡ЯЭЅџП”ъЈdœЈdћЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЅbџ—[џ—\WЈdЯЈd’ЈdWЈdpЈdpЈdWОŒўЯЉџТ’џЈdџЈdџЈdџЈdўЈdчЈdРЈdœЈdРЈdћЅbџ—[џŠUџžhъЈdЯЈdћЈdЏЈdpЈdЈdWЈd‡ЈdЯЈdћЈdџЈdџХ˜џЯЉџФ•џЋiќЈdœЈdІcš\іŠUџ~QџЌtўЈdpЈdчЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЈdџЊhўХ˜ќЭІџЦšўЌvЅ”ZР}NџkџЎtџЈdЈd‡ЈdРЈdРЈdяЈdЯЈdРЈdœЈdWЁz%$Т–љЪ џЧœџЗƒэІoLX=ŠUїЂnџБxџ­rџЁw #Р‘љЦ™џХ˜џТ’ џЖ‚ ыА}ШЏ{ШАyќЕџВzџЏuџЋm№Б€ЪТ’ џР џПŒ џМˆ џК… џЖ€џГ|џАwџЌoїІh >ЃtB­yЗЖ ђЖ€ ќЖ€џБyќЎsёЈl ŸІh џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№џџРрџ€>€Р?№€р€€ ˜№Ср‡јџџџџРџџрџџџџџџџџџџџџџџџџџџџџџџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico4-p0000644000000000000000000000013213441742745030301 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico4-png-trans.ico0000644000175000002070000000015413441742745033334 0ustar00jvanekmock00000000000000V‰PNG  IHDRѓџaIDAT8c`ŒXФў“Ђ‡‰RŒ0, Ёxј”ЈIENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico24-0000644000000000000000000000013113441742745030202 xustar0029 mtime=1552401893.07483275 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico24-png-trans.ico0000644000175000002070000000017513441742745033421 0ustar00jvanekmock00000000000000g‰PNG  IHDRѓџa.IDAT8cќџџ?%€‰"нƒТtFFFМђџџFЊК`д€aaуаЯL0О ,Й$IENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/favico0000644000000000000000000000013213441742745030455 xustar0030 mtime=1552401893.073832752 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/favicon6.ico0000644000175000002070000000137213441742745032305 0ustar00jvanekmock00000000000000ф‰PNG  IHDRѓџaЋIDAT8e“Oh\UХпНяЭK3гІ™fњ'1*‚ZЛ’‚еЊhР‚RХ"Šb‘*эОИЫЂвЌ\ЕEАH‘ ˆ0‘VDЊ-†jƒк,dfвъ$3О{‹7)§-/їœsљюwL’шcФ9ŒМ­V›$IщЏ8HŠ;’0ГuЩњ1ФpЮГR_eіЪЇ,0ƒUqVЁД:ЪXКŸ'кOкoн €IвКx~ў:ЇЏЄњшE6ƒCѕљўђЫМ=q’С-eЄ€™ЧbŒ23ъ‹ N\zž‘ч.аGŽ: 0њL,ЗWШg^ч№ОI6РуDрѓяO0№Ш2ЊДcЇКС­ Њй&кЛЮђЭO_žЮ™чжr Бсk†‡2rrЄH/՘Ш№и Ь@Ю а -Э[ќќнFжъe*оƒ"& FœŸвИбЯЕoh4Ф†+ ЊЕ ‹?nуио%Žюќ‡щуe2Ы@рœбnfœ:TтНћўeъщ›Иц\Q‚<ф’ЄЯNЉЏŠ $№zъ­э:ЃЭ:йкЎёнC‚DjtgŸf8'IЪC.B ’Є?~гc/ R Jzџ—Нsz‡РЩ‘ ŸшРс=j4›*О? I БxХ™™ДяШ †6 М^Њiя5зж{ѕтфfMŸџЄ›о‘$™ 03VoЖљшђkфуГЬŸ/Гхcm)вjЄм§Ф2ўв+М;qŠЌ\ьЦэMШcNтўќ}‘sKЯ0ЖчЋdЄdDVXјъq>8Эжс 1Њл™€оyцЎЮёйп/0:ёџхbyіaоМџ юКЗFˆпэСEЉ:8WbюъЏ\ЌO’иЯŽM22Кэv@/wDœyBМ/:ллР^ўФsžК†!ёIENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico4-p0000644000000000000000000000013213441742745030301 xustar0030 mtime=1552401893.076832746 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico4-png-noTrans.ico0000644000175000002070000000020013441742745033621 0ustar00jvanekmock00000000000000j‰PNG  IHDRѓџa1IDAT8cќџџџ %š‡,шŒŒŒx5 йР{aд€С`FB"5o МZ рЌIENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico24-0000644000000000000000000000013213441742745030203 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico24-png-noTrans.ico0000644000175000002070000000020013441742745033703 0ustar00jvanekmock00000000000000j‰PNG  IHDRѓџa1IDAT8cќџџџ %š‡,шŒŒŒx5 йР{aд€С`FB"5o МZ рЌIENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/favico0000644000000000000000000000013113441742745030454 xustar0029 mtime=1552401893.07483275 30 atime=1552402157.257253436 30 ctime=1552410887.066183553 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/favicon5.ico0000644000175000002070000000257613441742745032313 0ustar00jvanekmock00000000000000h(   +5&&S=^<cBdCnG9mVJr]‚RˆVŠZЂgЂlЇm3ІvAЊ}rЃ]Љˆ=Б€Иw8Жƒ^ЏŽ@Ж‡!М~bБŽРxYГ‹ŠЊ™„­˜DЙˆФzUЙWО•SП”0Ц‰eН–Ь<ХŽfП™ЗІHЦžЙЋjУœе‡ЄНЏл…м‡ВТЙГУКх ц‹хЋЩЛхыъ–я—ј’і—бгбегбћ– ќ› ќ›ќ› §§œџšџ›џ›§§žўœџœџ ўўўџžўžўџЁџџџžџž џŸ џЁџЃџІџЂџЄџЃџЅџЄџЉџІџЇџЇрллџЌџЈцкойтоъпуштфѓхщюцъђщьіъ№єьюјыёќьђ№№я§яѕјёіўєјџѕњџѕћџіћџјќџј§џћџћ§ћњ§ќљ§§ќ§ќ§§ќќ§§§§§ў§§ќў§§ў§ќўўўўўћџўќџџ§џџўџџџџџ›››››“›ˆŠ›‘››››››››››L06y›Ž›››››››Ž›K'UM$x››››››‹›v2thui-z›’›››–›ƒ1C4#B(„š›››“›7 <›Œ›”›w;›–Ž›+ pJD›Ž›– nWfH ›“›|.Gq[_QerE)*‰™›€&odOcbbXNga:Š—“›,FjRcbbbPk>@›Ž–›{"Tl\V]`mI%‡˜›››sAY^ZS=!~›•››››}9/583?…›‘›››››‘𛆂Л›–›››icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico8-p0000644000000000000000000000013213441742745030305 xustar0030 mtime=1552401893.079832739 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico8-png-noTrans.ico0000644000175000002070000000020013441742745033625 0ustar00jvanekmock00000000000000j‰PNG  IHDRѓџa1IDAT8cќџџџ %š‡,шŒŒŒx5 йР{aд€С`FB"5o МZ рЌIENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico32-0000644000000000000000000000013213441742745030202 xustar0030 mtime=1552401893.078832742 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico32-png-noTrans.ico0000644000175000002070000000020013441742745033702 0ustar00jvanekmock00000000000000j‰PNG  IHDRѓџa1IDAT8cќџџџ %š‡,шŒŒŒx5 йР{aд€С`FB"5o МZ рЌIENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico1-p0000644000000000000000000000013213441742745030276 xustar0030 mtime=1552401893.078832742 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico1-png-noTrans.ico0000644000175000002070000000020013441742745033616 0ustar00jvanekmock00000000000000j‰PNG  IHDRѓџa1IDAT8cќџџџ %š‡,шŒŒŒx5 йР{aд€С`FB"5o МZ рЌIENDЎB`‚icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/favico0000644000000000000000000000013213441742745030455 xustar0030 mtime=1552401893.077832744 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/favicon1.ico0000644000175000002070000001306613441742745032303 0ustar00jvanekmock00000000000000h&  ЈŽ(   ilmnoqrstuvwxyz{z|~xszy~€‚ƒƒ„†Š‹ŽŠ„ ™›š˜ •Œ’œ $Ѓ Ѕ ЅЇ ­)Џ.А/А3З:З?$€$+ƒ+ –&+-.‘.,–-5‰5:Œ:$Ј+#Ћ4#Б5$К6!КE"ЛI0НG)ТS)ЧU,ХZ2УJ0ХJ0ЭI7дS;аX>в_>л\/Шc6Яj5вm>зrD–DK—KL•LXXZЁZdЂdo­osЕs{А{AоcBоcJпoFрhHсkKфpLщrQъ{Tщ{Mц‚VьTэ‡QюŠW№€Yѓ…^іŠbћ–a§“gџ›kџžkџŸmџЄtџГ…Й……К…ŒПŒ“О“Щ•С••Э•™Ч™ЇЫЇЋЬЋЃвЃГдГБиБЛмЛПнПбцбоэос№сыєыѓљѓјњјќ§ќџџџ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹v9?‹‹‹‹‹‹‹‹‹‹‹…9?~‰‹‹‹‹‹‹‹€ 2 {‰‹‹‹‹z$A‡‹‹y))K~‹‹h3%,/_%y‹‹Y,-69d]‹‹Z6EEEh [‹‹VHHRHo$)V‹‹]…‹‹‹‹‡vY:9Vz‡‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹( @   џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџПнПџПнПџ+ƒ+џ+ƒ+џ:Œ:џ:Œ:џЇЫЇџЇЫЇџќ§ќџќ§ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџПнПџПнПџ+ƒ+џ+ƒ+џ:Œ:џ:Œ:џЇЫЇџЇЫЇџќ§ќџќ§ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБиБџБиБџsџsџ„ џ„ џvџvџnџnџ$€$џ$€$џ™Ч™џ™Ч™џјњјџјњјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБиБџБиБџsџsџ„ џ„ џvџvџnџnџ$€$џ$€$џ™Ч™џ™Ч™џјњјџјњјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃвЃџЃвЃџxџxџ€џ€џœ џœ џvџvџwџwџsџsџmџmџzџzџŒПŒџŒПŒџѓљѓџѓљѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃвЃџЃвЃџxџxџ€џ€џœ џœ џvџvџwџwџsџsџmџmџzџzџŒПŒџŒПŒџѓљѓџѓљѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•Э•џ•Э•џzџzџŽџŽџџџ#Б5џ#Б5џwџwџyџyџuџuџrџrџnџnџiџiџyџyџыєыџыєыџџџџџџџџџџџџџџџџџџџџџџџџџ•Э•џ•Э•џzџzџŽџŽџџџ#Б5џ#Б5џwџwџyџyџuџuџrџrџnџnџiџiџyџyџыєыџыєыџџџџџџџџџџџџџџџџџЛмЛџЛмЛџƒџƒџ™џ™џšџšџ›џ›џ2УJџ2УJџzџzџ|џ|џyџyџuџuџqџqџnџnџiџiџЋЬЋџЋЬЋџџџџџџџџџџџџџџџџџЛмЛџЛмЛџƒџƒџ™џ™џšџšџ›џ›џ2УJџ2УJџzџzџ|џ|џyџyџuџuџqџqџnџnџiџiџЋЬЋџЋЬЋџџџџџџџџџџџџџџџџџ…К…џ…К…џ˜ џ˜ џЃџЃџ Ѕџ Ѕџ Ѕџ Ѕџ>в_џ>в_џ{џ{џџџ|џ|џxџxџuџuџqџqџlџlџ“О“џ“О“џџџџџџџџџџџџџџџџџ…К…џ…К…џ˜ џ˜ џЃџЃџ Ѕџ Ѕџ Ѕџ Ѕџ>в_џ>в_џ{џ{џџџ|џ|џxџxџuџuџqџqџlџlџ“О“џ“О“џџџџџџџџџџџџџџџџџo­oџo­oџЇ џЇ џ­)џ­)џА/џА/џА3џА3џJпoџJпoџџџƒџƒџџџ|џ|џxџxџtџtџoџoџ{А{џ{А{џџџџџџџџџџџџџџџџџo­oџo­oџЇ џЇ џ­)џ­)џА/џА/џА3џА3џJпoџJпoџџџƒџƒџџџ|џ|џxџxџtџtџoџoџ{А{џ{А{џџџџџџџџџџџџџџџџџZЁZџZЁZџЗ:џЗ:џЗ?џЗ?џ!КEџ!КEџ"ЛIџ"ЛIџTщ{џTщ{џ€џ€џ†џ†џ‚џ‚џџџ{џ{џxџxџtџtџdЂdџdЂdџџџџџџџџџџџџџџџџџZЁZџZЁZџЗ:џЗ:џЗ?џЗ?џ!КEџ!КEџ"ЛIџ"ЛIџTщ{џTщ{џ€џ€џ†џ†џ‚џ‚џџџ{џ{џxџxџtџtџdЂdџdЂdџџџџџџџџџџџџџџџџџD–DџD–Dџ)ЧUџ)ЧUџ)ТSџ)ТSџ,ХZџ,ХZџ/Шcџ/ШcџW№€џW№€џƒџƒџŠџŠџ†џ†џ‚џ‚џ~џ~џ{џ{џxџxџL•LџL•LџџџџџџџџџџџџџџџџџD–DџD–Dџ)ЧUџ)ЧUџ)ТSџ)ТSџ,ХZџ,ХZџ/Шcџ/ШcџW№€џW№€џƒџƒџŠџŠџ†џ†џ‚џ‚џ~џ~џ{џ{џxџxџL•LџL•Lџџџџџџџџџџџџџџџџџ.‘.џ.‘.џ5вmџ5вmџ6Яjџ6Яjџ>зrџ>зrџMц‚џMц‚џ^іŠџ^іŠџ‹џ‹џ‚џ‚џƒџƒџ„џ„џ‚џ‚џ~џ~џ~џ~џ5‰5џ5‰5џџџџџџџџџџџџџџџџџ.‘.џ.‘.џ5вmџ5вmџ6Яjџ6Яjџ>зrџ>зrџMц‚џMц‚џ^іŠџ^іŠџ‹џ‹џ‚џ‚џƒџƒџ„џ„џ‚џ‚џ~џ~џ~џ~џ5‰5џ5‰5џџџџџџџџџџџџџџџџџ$џ$џQюŠџQюŠџTэ‡џTэ‡џbћ–џbћ–џkџžџkџžџgџ›џgџ›џmџЄџmџЄџVьџVьџ0ХJџ0ХJџ •џ •џ|џ|џ~џ~џџџ~џ~џџџџџџџџџџџџџџџџџ$џ$џQюŠџQюŠџTэ‡џTэ‡џbћ–џbћ–џkџžџkџžџgџ›џgџ›џmџЄџmџЄџVьџVьџ0ХJџ0ХJџ •џ •џ|џ|џ~џ~џџџ~џ~џџџџџџџџџџџџџџџџџ –&џ –&џtџГџtџГџkџŸџkџŸџa§“џa§“џYѓ…џYѓ…џQъ{џQъ{џKфpџKфpџHсkџHсkџFрhџFрhџLщrџLщrџAоcџAоcџ$К6џ$К6џŠџŠџџџџџџџџџџџџџџџџџџџ –&џ –&џtџГџtџГџkџŸџkџŸџa§“џa§“џYѓ…џYѓ…џQъ{џQъ{џKфpџKфpџHсkџHсkџFрhџFрhџLщrџLщrџAоcџAоcџ$К6џ$К6џŠџŠџџџџџџџџџџџџџџџџџџџЩџЩџ$Ј+џ$Ј+џ#Ћ4џ#Ћ4џ0НGџ0НGџ;аXџ;аXџBоcџBоcџ>л\џ>л\џ7дSџ7дSџ0ЭIџ0ЭIџЏ.џЏ.џ’џ’џ,–-џ,–-џsЕsџsЕsџбцбџбцбџџџџџџџџџџџџџџџџџЩџЩџ$Ј+џ$Ј+џ#Ћ4џ#Ћ4џ0НGџ0НGџ;аXџ;аXџBоcџBоcџ>л\џ>л\џ7дSџ7дSџ0ЭIџ0ЭIџЏ.џЏ.џ’џ’џ,–-џ,–-џsЕsџsЕsџбцбџбцбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс№сџс№сџГдГџГдГџ…Й…џ…Й…џXXџXXџ+-џ+-џŒџŒџK—KџK—Kџ•С•џ•С•џоэоџоэоџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс№сџс№сџГдГџГдГџ…Й…џ…Й…џXXџXXџ+-џ+-џŒџŒџK—KџK—Kџ•С•џ•С•џоэоџоэоџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico8-b0000644000000000000000000000013213441742745030267 xustar0030 mtime=1552401893.073832752 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico8-bmp-noTrans.ico0000644000175000002070000000257613441742745033641 0ustar00jvanekmock00000000000000h( џџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico32-0000644000000000000000000000013213441742745030202 xustar0030 mtime=1552401893.072832754 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico32-bmp-noTrans.ico0000644000175000002070000000217613441742745033712 0ustar00jvanekmock00000000000000 h(  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/PaxHeaders.7406/ico1-b0000644000000000000000000000013213441742745030260 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/ico1-bmp-noTrans.ico0000644000175000002070000000030613441742745033617 0ustar00jvanekmock00000000000000А( џџџџџџџџџ№№№№№№№№№џџџџџџџџicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/PaxHeaders.7406/ImageInputStream0000644000000000000000000000013213441742745030412 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/ImageInputStreamIcoTest.java0000644000175000002070000002440113441742745033436 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools.ico.impl; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import org.junit.Assert; import org.junit.Test; public class ImageInputStreamIcoTest { private ImageInputStreamIco loadIco(String id) throws IOException, IcoException { try (InputStream is = this.getClass().getResourceAsStream("resources/" + id)) { Assert.assertNotNull(is); ImageInputStreamIco i = new ImageInputStreamIco(ImageIO.createImageInputStream(is)); Assert.assertNotNull(i); return i; } } private void checkColors(Color middle, Color corners, BufferedImage x) { checkMiddle(middle, x); checkUpLeft(corners, x); checkBottomRight(corners, x); checkBottomLeft(corners, x); checkTopRight(corners, x); } private void checkTopRight(Color corners, BufferedImage x) { Assert.assertEquals(corners, new Color(x.getRGB(x.getWidth() - 1, 0))); } private void checkBottomLeft(Color corners, BufferedImage x) { Assert.assertEquals(corners, new Color(x.getRGB(0, x.getHeight() - 1))); } private void checkBottomRight(Color corners, BufferedImage x) { Assert.assertEquals(corners, new Color(x.getRGB(x.getWidth() - 1, x.getHeight() - 1))); } private void checkUpLeft(Color corners, BufferedImage x) { Assert.assertEquals(corners, new Color(x.getRGB(0, 0))); } private void checkMiddle(Color middle, BufferedImage x) { Assert.assertEquals(middle, new Color(x.getRGB(x.getWidth() / 2, x.getHeight() / 2))); } @Test public void twhoPlanesDifferentSizesDifferentTransaprencies() throws IOException, IcoException { ImageInputStreamIco i = loadIco("favicon1.ico"); Assert.assertEquals(2, i.getImages().size()); int ii = 0; for (BufferedImage x : i.getImages()) { ii++; Assert.assertEquals(ii * 16, x.getWidth()); Assert.assertEquals(ii * 16, x.getHeight()); } Color lwhite = new Color(252, 253, 252); checkColors(new Color(0, 128, 0), lwhite, i.getImage(0)); checkColors(new Color(0, 131, 0), Color.white, i.getImage(1)); } @Test public void strangeStrips() throws IOException, IcoException { ImageInputStreamIco i = loadIco("favicon2.ico"); Assert.assertEquals(2, i.getImages().size()); int ii = 0; for (BufferedImage x : i.getImages()) { ii++; Assert.assertEquals(ii * 16, x.getWidth()); Assert.assertEquals(ii * 16, x.getHeight()); } BufferedImage x = i.getImage(0); checkMiddle(new Color(67, 75, 130), x); checkUpLeft(Color.black, x); checkBottomRight(new Color(208, 66, 66), x); checkBottomLeft(Color.black, x); checkTopRight(Color.black, x); x = i.getImage(1); checkMiddle(new Color(64, 79, 142), x); checkUpLeft(Color.black, x); checkBottomRight(new Color(254, 212, 212), x); checkBottomLeft(Color.black, x); checkTopRight(Color.black, x); } @Test public void strangePng() throws IOException, IcoException { ImageInputStreamIco i = loadIco("favicon3.ico"); Assert.assertEquals(1, i.getImages().size()); int ii = 0; for (BufferedImage x : i.getImages()) { ii++; Assert.assertEquals(ii * 16, x.getWidth()); Assert.assertEquals(ii * 16, x.getHeight()); } checkColors(new Color(151, 246, 24), Color.white, i.getImage(0)); } @Test public void bmpsMixedWithPngAndTransaprencyAndLAyersFromBiggestToSmallest() throws IOException, IcoException { ImageInputStreamIco i = loadIco("favicon4.ico"); Assert.assertEquals(4, i.getImages().size()); int index = 0; //1 256 //2 128 //3 64 //4 32 for (BufferedImage x : i.getImages()) { index++; Assert.assertEquals((int) Math.pow(2, 9 - index), x.getWidth()); Assert.assertEquals((int) Math.pow(2, 9 - index), x.getHeight()); } checkColors(new Color(0, 0, 0, 255), new Color(0, 0, 0, 255), i.getImage(0)); checkMiddle(new Color(0, 0, 0, 255), i.getImage(1)); checkUpLeft(new Color(255, 255, 255, 255), i.getImage(1)); checkBottomRight(new Color(0, 0, 0, 255), i.getImage(1)); checkBottomLeft(new Color(0, 0, 0, 255), i.getImage(1)); checkTopRight(new Color(254, 63, 0, 255), i.getImage(1)); checkColors(new Color(0, 0, 0, 255), new Color(0, 0, 0, 255), i.getImage(2)); checkColors(new Color(0, 0, 0, 255), new Color(0, 0, 0, 255), i.getImage(3)); Assert.assertEquals(new Color(5, 100, 168), new Color(i.getImage(3).getRGB(21, 21))); Assert.assertEquals(new Color(5, 100, 168), new Color(i.getImage(2).getRGB(42, 42))); Assert.assertEquals(new Color(5, 100, 168), new Color(i.getImage(1).getRGB(94, 94))); Assert.assertEquals(new Color(5, 100, 168), new Color(i.getImage(0).getRGB(188, 188))); } @Test public void notHonoredTahta256is0() throws IOException, IcoException { ImageInputStreamIco i = loadIco("favicon5.ico"); Assert.assertEquals(1, i.getImages().size()); int ii = 0; for (BufferedImage x : i.getImages()) { ii++; Assert.assertEquals(ii * 16, x.getWidth()); Assert.assertEquals(ii * 16, x.getHeight()); } checkColors(new Color(151, 246, 24), Color.white, i.getImage(0)); } @Test public void corruptedHeader() throws IOException, IcoException { ImageInputStreamIco i = loadIco("favicon5.ico"); Assert.assertEquals(1, i.getImages().size()); int ii = 0; for (BufferedImage x : i.getImages()) { ii++; Assert.assertEquals(ii * 16, x.getWidth()); Assert.assertEquals(ii * 16, x.getHeight()); } checkColors(new Color(151, 246, 24), Color.white, i.getImage(0)); } @Test public void corruptedHeader2() throws IOException, IcoException { ImageInputStreamIco i = loadIco("favicon6.ico"); Assert.assertEquals(1, i.getImages().size()); int ii = 0; for (BufferedImage x : i.getImages()) { ii++; Assert.assertEquals(ii * 16, x.getWidth()); Assert.assertEquals(ii * 16, x.getHeight()); } checkColors(new Color(151, 246, 24), Color.white, i.getImage(0)); } @Test public void allPalletesFormats() throws IOException, IcoException { String[] bitesPalletes = new String[]{"1", "4", "8", "24", "32"}; String[] compressions = new String[]{"bmp", "png"}; String[] trans = new String[]{"noTrans", "trans"}; for (String palette : bitesPalletes) { for (String comp : compressions) { for (String tran : trans) { String name = "ico" + palette + "-" + comp + "-" + tran + ".ico"; ImageInputStreamIco i = loadIco(name); Assert.assertEquals(1, i.getImages().size()); Assert.assertEquals(16, i.getImage(0).getWidth()); Assert.assertEquals(16, i.getImage(0).getHeight()); if (tran.equals(trans[0])) { checkColors(Color.black, Color.white, i.getImage(0)); } else if (tran.equals(trans[1])) { if (comp.equals(compressions[0])) { if (palette.equals("24") || palette.equals("32")) { checkColors(Color.black, new Color(255, 255, 255, 255), i.getImage(0)); } else { checkColors(Color.black, new Color(0, 0, 0, 255), i.getImage(0)); } } else if (comp.equals(compressions[1])) { if (palette.equals("24") || palette.equals("32")) { checkColors(Color.black, new Color(255, 255, 255, 255), i.getImage(0)); } else { checkColors(Color.black, new Color(0, 0, 0, 255), i.getImage(0)); } } else { throw new RuntimeException("Invlaid compression: " + comp); } } else { throw new RuntimeException("Invlaid transaprency: " + tran); } } } } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/PaxHeaders.7406/JarCertVerifierTest.java0000644000000000000000000000013213441742745030267 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/tools/JarCertVerifierTest.java0000644000175000002070000007134313441742745031107 0ustar00jvanekmock00000000000000/* JarCertVerifierTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools; import static net.sourceforge.jnlp.runtime.Translator.R; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.security.CodeSigner; import java.util.Date; import java.util.List; import java.util.Vector; import java.util.jar.JarEntry; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.tools.JarCertVerifier.VerifyResult; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class JarCertVerifierTest { @Test public void testIsMetaInfFile() { final String METAINF = "META-INF"; assertFalse(JarCertVerifier.isMetaInfFile("some_dir/" + METAINF + "/filename")); assertFalse(JarCertVerifier.isMetaInfFile(METAINF + "filename")); assertTrue(JarCertVerifier.isMetaInfFile(METAINF + "/filename")); } class JarCertVerifierEntry extends JarEntry { CodeSigner[] signers; public JarCertVerifierEntry(String name, CodeSigner[] codesigners) { super(name); signers = codesigners; } public JarCertVerifierEntry(String name) { this(name, null); } public CodeSigner[] getCodeSigners() { return signers == null ? null : signers.clone(); } } // Empty list to be used with JarCertVerifier constructor. private static final List emptyJARDescList = new Vector(); private static final String DNPARTIAL = ", OU=JarCertVerifier Unit Test, O=IcedTea, L=Toronto, ST=Ontario, C=CA"; private static CodeSigner alphaSigner, betaSigner, charlieSigner, expiredSigner, expiringSigner, notYetValidSigner, expiringAndNotYetValidSigner; @BeforeClass public static void setUp() throws Exception { Date currentDate = new Date(); Date pastDate = new Date(currentDate.getTime() - (1000L * 24L * 60L * 60L) - 1000L); // 1 day and 1 second in the past Date futureDate = new Date(currentDate.getTime() + (1000L * 24L * 60L * 60L)); // 1 day in the future alphaSigner = CodeSignerCreator.getOneCodeSigner("CN=Alpha Signer" + DNPARTIAL, currentDate, 365); betaSigner = CodeSignerCreator.getOneCodeSigner("CN=Beta Signer" + DNPARTIAL, currentDate, 365); charlieSigner = CodeSignerCreator.getOneCodeSigner("CN=Charlie Signer" + DNPARTIAL, currentDate, 365); expiredSigner = CodeSignerCreator.getOneCodeSigner("CN=Expired Signer" + DNPARTIAL, pastDate, 1); expiringSigner = CodeSignerCreator.getOneCodeSigner("CN=Expiring Signer" + DNPARTIAL, currentDate, 1); notYetValidSigner = CodeSignerCreator.getOneCodeSigner("CN=Not Yet Valid Signer" + DNPARTIAL, futureDate, 365); expiringAndNotYetValidSigner = CodeSignerCreator.getOneCodeSigner("CN=Expiring and Not Yet Valid Signer" + DNPARTIAL, futureDate, 3); } @Test public void testNoManifest() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); VerifyResult result = jcv.verifyJarEntryCerts("", false, null); Assert.assertEquals("No manifest should be considered unsigned.", VerifyResult.UNSIGNED, result); Assert.assertEquals("No manifest means no signers in the verifier.", 0, jcv.getCertsList().size()); } @Test public void testNoSignableEntries() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("OneDirEntry/")); entries.add(new JarCertVerifierEntry("META-INF/MANIFEST.MF")); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("No signable entry (only dirs/manifests) should be considered trivially signed.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("No signable entry (only dirs/manifests) means no signers in the verifier.", 0, jcv.getCertsList().size()); } @Test public void testSingleEntryNoSigners() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstEntryWithoutSigner")); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("One unsigned entry should be considered unsigned.", VerifyResult.UNSIGNED, result); Assert.assertEquals("One unsigned entry means no signers in the verifier.", 0, jcv.getCertsList().size()); } @Test public void testManyEntriesNoSigners() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstEntryWithoutSigner")); entries.add(new JarCertVerifierEntry("secondEntryWithoutSigner")); entries.add(new JarCertVerifierEntry("thirdEntryWithoutSigner")); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Many unsigned entries should be considered unsigned.", VerifyResult.UNSIGNED, result); Assert.assertEquals("Many unsigned entries means no signers in the verifier.", 0, jcv.getCertsList().size()); } @Test public void testSingleEntrySingleValidSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] signers = { alphaSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByOne", signers)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("One signed entry should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("One signed entry means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("One signed entry means one signer in the verifier.", jcv.getCertsList().contains(alphaSigner.getSignerCertPath())); } @Test public void testManyEntriesSingleValidSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] signers = { alphaSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByOne", signers)); entries.add(new JarCertVerifierEntry("secondSignedByOne", signers)); entries.add(new JarCertVerifierEntry("thirdSignedByOne", signers)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries signed by one signer should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("Three entries signed by one signer means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("Three entries signed by one signer means one signer in the verifier.", jcv.getCertsList().contains(alphaSigner.getSignerCertPath())); } @Test public void testSingleEntryMultipleValidSigners() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] signers = { alphaSigner, betaSigner, charlieSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByThree", signers)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("One entry signed by three signers should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("One entry signed by three means three signers in the verifier.", 3, jcv.getCertsList().size()); Assert.assertTrue("One entry signed by three means three signers in the verifier.", jcv.getCertsList().contains(alphaSigner.getSignerCertPath()) && jcv.getCertsList().contains(betaSigner.getSignerCertPath()) && jcv.getCertsList().contains(charlieSigner.getSignerCertPath())); } @Test public void testManyEntriesMultipleValidSigners() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] signers = { alphaSigner, betaSigner, charlieSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByThree", signers)); entries.add(new JarCertVerifierEntry("secondSignedByThree", signers)); entries.add(new JarCertVerifierEntry("thirdSignedByThree", signers)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries signed by three signers should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("Three entries signed by three means three signers in the verifier.", 3, jcv.getCertsList().size()); Assert.assertTrue("Three entries signed by three means three signers in the verifier.", jcv.getCertsList().contains(alphaSigner.getSignerCertPath()) && jcv.getCertsList().contains(betaSigner.getSignerCertPath()) && jcv.getCertsList().contains(charlieSigner.getSignerCertPath())); } @Test public void testOneCommonSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] alphaSigners = { alphaSigner }; CodeSigner[] betaSigners = { alphaSigner, betaSigner }; CodeSigner[] charlieSigners = { alphaSigner, charlieSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByOne", alphaSigners)); entries.add(new JarCertVerifierEntry("secondSignedByTwo", betaSigners)); entries.add(new JarCertVerifierEntry("thirdSignedByTwo", charlieSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries signed by at least one common signer should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("Three entries signed completely by only one signer means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("Three entries signed completely by only one signer means one signer in the verifier.", jcv.getCertsList().contains(alphaSigner.getSignerCertPath())); } @Test public void testNoCommonSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] alphaSigners = { alphaSigner }; CodeSigner[] betaSigners = { betaSigner }; CodeSigner[] charlieSigners = { charlieSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByAlpha", alphaSigners)); entries.add(new JarCertVerifierEntry("secondSignedByBeta", betaSigners)); entries.add(new JarCertVerifierEntry("thirdSignedByCharlie", charlieSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries signed by no common signers should be considered unsigned.", VerifyResult.UNSIGNED, result); Assert.assertEquals("Three entries signed by no common signers means no signers in the verifier.", 0, jcv.getCertsList().size()); } @Test public void testFewButNotAllCommonSigners() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] alphaSigners = { alphaSigner }; CodeSigner[] betaSigners = { betaSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByAlpha", alphaSigners)); entries.add(new JarCertVerifierEntry("secondSignedByAlpha", alphaSigners)); entries.add(new JarCertVerifierEntry("thirdSignedByBeta", betaSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("First two entries signed by alpha signer, third entry signed by beta signer should be considered unisgned.", VerifyResult.UNSIGNED, result); Assert.assertEquals("Three entries signed by some common signers but not all means no signers in the verifier.", 0, jcv.getCertsList().size()); } @Test public void testNotAllEntriesSigned() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] alphaSigners = { alphaSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByAlpha", alphaSigners)); entries.add(new JarCertVerifierEntry("secondSignedByAlpha", alphaSigners)); entries.add(new JarCertVerifierEntry("thirdUnsigned")); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("First two entries signed by alpha signer, third entry not signed, should be considered unisgned.", VerifyResult.UNSIGNED, result); Assert.assertEquals("First two entries signed by alpha signer, third entry not signed, means no signers in the verifier.", 0, jcv.getCertsList().size()); } @Test public void testSingleEntryExpiredSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] expiredSigners = { expiredSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByExpired", expiredSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("One entry signed by expired cert, should be considered signed but not okay.", VerifyResult.SIGNED_NOT_OK, result); Assert.assertEquals("One entry signed by expired cert means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("One entry signed by expired cert means one signer in the verifier.", jcv.getCertsList().contains(expiredSigner.getSignerCertPath())); } @Test public void testManyEntriesExpiredSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] expiredSigners = { expiredSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByExpired", expiredSigners)); entries.add(new JarCertVerifierEntry("secondSignedBExpired", expiredSigners)); entries.add(new JarCertVerifierEntry("thirdSignedByExpired", expiredSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries signed by expired cert, should be considered signed but not okay.", VerifyResult.SIGNED_NOT_OK, result); Assert.assertEquals("Three entries signed by expired cert means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("Three entries signed by expired cert means one signer in the verifier.", jcv.getCertsList().contains(expiredSigner.getSignerCertPath())); } @Test public void testSingleEntryExpiringSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] expiringSigners = { expiringSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByExpiring", expiringSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("One entry signed by expiring cert, should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("One entry signed by expiring cert means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("One entry signed by expiring cert means one signer in the verifier.", jcv.getCertsList().contains(expiringSigner.getSignerCertPath())); } @Test public void testManyEntriesExpiringSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] expiringSigners = { expiringSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByExpiring", expiringSigners)); entries.add(new JarCertVerifierEntry("secondSignedBExpiring", expiringSigners)); entries.add(new JarCertVerifierEntry("thirdSignedByExpiring", expiringSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries signed by expiring cert, should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("Three entries signed by expiring cert means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("Three entries signed by expiring cert means one signer in the verifier.", jcv.getCertsList().contains(expiringSigner.getSignerCertPath())); } @Test public void testSingleEntryNotYetValidSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] notYetValidSigners = { notYetValidSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByNotYetValid", notYetValidSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("One entry signed by cert that is not yet valid, should be considered signed but not okay.", VerifyResult.SIGNED_NOT_OK, result); Assert.assertEquals("One entry signed by cert that is not yet valid means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("One entry signed by cert that is not yet valid means one signer in the verifier.", jcv.getCertsList().contains(notYetValidSigner.getSignerCertPath())); } @Test public void testManyEntriesNotYetValidSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] notYetValidSigners = { notYetValidSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByNotYetValid", notYetValidSigners)); entries.add(new JarCertVerifierEntry("secondSignedByNotYetValid", notYetValidSigners)); entries.add(new JarCertVerifierEntry("thirdSignedByNotYetValid", notYetValidSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries signed by cert that is not yet valid, should be considered signed but not okay.", VerifyResult.SIGNED_NOT_OK, result); Assert.assertEquals("Three entries signed by cert that is not yet valid means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("Three entries signed by cert that is not yet valid means one signer in the verifier.", jcv.getCertsList().contains(notYetValidSigner.getSignerCertPath())); } @Test public void testSingleEntryExpiringAndNotYetValidSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] expiringAndNotYetValidSigners = { expiringAndNotYetValidSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByExpiringNotYetValid", expiringAndNotYetValidSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("One entry signed by cert that is not yet valid but also expiring, should be considered signed but not okay.", VerifyResult.SIGNED_NOT_OK, result); Assert.assertEquals("One entry signed by cert that is not yet valid but also expiring means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("One entry signed by cert that is not yet valid but also expiring means one signer in the verifier.", jcv.getCertsList().contains(expiringAndNotYetValidSigner.getSignerCertPath())); } @Test public void testManyEntryExpiringAndNotYetValidSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] expiringAndNotYetValidSigners = { expiringAndNotYetValidSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByExpiringNotYetValid", expiringAndNotYetValidSigners)); entries.add(new JarCertVerifierEntry("secondSignedByExpiringNotYetValid", expiringAndNotYetValidSigners)); entries.add(new JarCertVerifierEntry("thirdSignedByExpiringNotYetValid", expiringAndNotYetValidSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries signed by cert that is not yet valid but also expiring, should be considered signed but not okay.", VerifyResult.SIGNED_NOT_OK, result); Assert.assertEquals("Three entries signed by cert that is not yet valid but also expiring means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("Three entries signed by cert that is not yet valid but also expiring means one signer in the verifier.", jcv.getCertsList().contains(expiringAndNotYetValidSigner.getSignerCertPath())); Assert.assertTrue("Three entries signed by cert that is not yet valid but also expiring means expiring issue should be in details list.", jcv.getDetails(expiringAndNotYetValidSigner.getSignerCertPath()).contains(R("SHasExpiringCert"))); } @Test public void testSingleEntryOneExpiredOneValidSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] oneExpiredOneValidSigner = { expiredSigner, alphaSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByTwo", oneExpiredOneValidSigner)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("One entry signed by one expired cert and another valid cert, should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("One entry signed by one expired cert and another valid cert means two signers in the verifier.", 2, jcv.getCertsList().size()); Assert.assertTrue("One entry signed by one expired cert and another valid cert means two signers in the verifier.", jcv.getCertsList().contains(expiredSigner.getSignerCertPath()) && jcv.getCertsList().contains(alphaSigner.getSignerCertPath())); } @Test public void testManyEntriesOneExpiredOneValidSigner() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] oneExpiredOneValidSigner = { expiredSigner, alphaSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByTwo", oneExpiredOneValidSigner)); entries.add(new JarCertVerifierEntry("secondSignedByTwo", oneExpiredOneValidSigner)); entries.add(new JarCertVerifierEntry("thirdSignedByTwo", oneExpiredOneValidSigner)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries signed by one expired cert and another valid cert, should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("Three entries signed by one expired cert and another valid cert means two signers in the verifier.", 2, jcv.getCertsList().size()); Assert.assertTrue("Three entries signed by one expired cert and another valid cert means two signers in the verifier.", jcv.getCertsList().contains(expiredSigner.getSignerCertPath()) && jcv.getCertsList().contains(alphaSigner.getSignerCertPath())); } @Test public void testSomeExpiredEntries() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] oneExpiredOneValidSigners = { expiredSigner, alphaSigner }; CodeSigner[] expiredSigners = { expiredSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("firstSignedByTwo", oneExpiredOneValidSigners)); entries.add(new JarCertVerifierEntry("secondSignedByTwo", oneExpiredOneValidSigners)); entries.add(new JarCertVerifierEntry("thirdSignedByExpired", expiredSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Two entries signed by one expired and one valid cert, third signed by just expired cert, should be considered signed but not okay.", VerifyResult.SIGNED_NOT_OK, result); Assert.assertEquals("Two entries signed by one expired and one valid cert, third signed by just expired cert means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("Two entries signed by one expired and one valid cert, third signed by just expired cert means one signer in the verifier.", jcv.getCertsList().contains(expiredSigner.getSignerCertPath())); } @Test public void testManyInvalidOneValidStillSignedOkay() throws Exception { JarCertVerifier jcv = new JarCertVerifier(null); CodeSigner[] oneExpiredOneValidSigners = { alphaSigner, expiredSigner }; CodeSigner[] oneNotYetValidOneValidSigners = { alphaSigner, notYetValidSigner }; CodeSigner[] oneExpiringSigners = { alphaSigner, expiringSigner }; Vector entries = new Vector(); entries.add(new JarCertVerifierEntry("META-INF/MANIFEST.MF")); entries.add(new JarCertVerifierEntry("firstSigned", oneExpiredOneValidSigners)); entries.add(new JarCertVerifierEntry("secondSigned", oneNotYetValidOneValidSigners)); entries.add(new JarCertVerifierEntry("thirdSigned", oneExpiringSigners)); entries.add(new JarCertVerifierEntry("oneDir/")); entries.add(new JarCertVerifierEntry("oneDir/fourthSigned", oneExpiredOneValidSigners)); VerifyResult result = jcv.verifyJarEntryCerts("", true, entries); Assert.assertEquals("Three entries sharing valid cert and others with issues, should be considered signed and okay.", VerifyResult.SIGNED_OK, result); Assert.assertEquals("Three entries sharing valid cert and others with issues means one signer in the verifier.", 1, jcv.getCertsList().size()); Assert.assertTrue("Three entries sharing valid cert and others with issues means one signer in the verifier.", jcv.getCertsList().contains(alphaSigner.getSignerCertPath())); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/templates0000644000000000000000000000013213441742745024317 xustar0030 mtime=1552401893.110832675 30 atime=1552410887.112183445 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/0000755000175000002070000000000013441742745025204 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template5.jnlp0000644000000000000000000000013213441742745027161 xustar0030 mtime=1552401893.110832675 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template5.jnlp0000644000175000002070000000061613441742745027774 0ustar00jvanekmock00000000000000 * * main-class='*' /> icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template3.jnlp0000644000000000000000000000013213441742745027157 xustar0030 mtime=1552401893.067832765 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template3.jnlp0000644000175000002070000000051613441742745027771 0ustar00jvanekmock00000000000000 RedHat Sample Test icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template7.jnlp0000644000000000000000000000013113441742745027162 xustar0029 mtime=1552401893.06983276 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template7.jnlp0000644000175000002070000000057713441742745030004 0ustar00jvanekmock00000000000000 Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/EFBBBF.jnlp0000644000000000000000000000013113441742745026166 xustar0029 mtime=1552401893.06983276 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/EFBBBF.jnlp0000644000175000002070000000455513441742745027010 0ustar00jvanekmock00000000000000яЛП EFBBBF bytes starting with file IcedTea File starting with xml BOM EFBBBF bytes icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template9.jnlp0000644000000000000000000000013213441742745027165 xustar0030 mtime=1552401893.072832754 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template9.jnlp0000644000175000002070000000071613441742745030001 0ustar00jvanekmock00000000000000 Sample RedHat This is a sample to test a bug icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template1.jnlp0000644000000000000000000000013213441742745027155 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template1.jnlp0000644000175000002070000000051613441742745027767 0ustar00jvanekmock00000000000000 Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template8.jnlp0000644000000000000000000000013213441742745027164 xustar0030 mtime=1552401893.073832752 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template8.jnlp0000644000175000002070000000050313441742745027772 0ustar00jvanekmock00000000000000 Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template0.jnlp0000644000000000000000000000013213441742745027154 xustar0030 mtime=1552401893.072832754 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template0.jnlp0000644000175000002070000000072013441742745027763 0ustar00jvanekmock00000000000000 Sample Test RedHat random tag test ]]> icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template6.jnlp0000644000000000000000000000013213441742745027162 xustar0030 mtime=1552401893.082832733 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template6.jnlp0000644000175000002070000000053013441742745027770 0ustar00jvanekmock00000000000000 Test Sample RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template4.jnlp0000644000000000000000000000013213441742745027160 xustar0030 mtime=1552401893.077832744 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template4.jnlp0000644000175000002070000000044113441742745027767 0ustar00jvanekmock00000000000000 * * icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/PaxHeaders.7406/template2.jnlp0000644000000000000000000000013213441742745027156 xustar0030 mtime=1552401893.070832758 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/templates/template2.jnlp0000644000175000002070000000051113441742745027763 0ustar00jvanekmock00000000000000 Sample Test * icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/splashscreen0000644000000000000000000000013213441742745025013 xustar0030 mtime=1552401893.099832698 30 atime=1552410887.112183445 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/0000755000175000002070000000000013441742745025700 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/SplashScreenTest.j0000644000000000000000000000013213441742745030475 xustar0030 mtime=1552401893.099832698 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashScreenTest.java0000644000175000002070000001610113441742745031774 0ustar00jvanekmock00000000000000/* SplashScreenTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen; import java.awt.BorderLayout; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import javax.swing.JDialog; import net.sourceforge.jnlp.JNLPSplashScreen; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.TextOutlineRendererTest; import net.sourceforge.jnlp.splashscreen.parts.InfoItem; import net.sourceforge.jnlp.splashscreen.parts.InformationElement; import org.junit.Assert; import org.junit.Test; public class SplashScreenTest extends JDialog { static int width = JNLPSplashScreen.DEF_WIDTH; static int height = JNLPSplashScreen.DEF_HEIGHT; static SplashPanel panel; private static boolean swap = true; private static InformationElement ie = new InformationElement(); public SplashScreenTest() { setSize(width - getInsets().left - getInsets().right, height - getInsets().bottom - getInsets().top); // Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); // int x = (int) ((dimension.getWidth() - getWidth()) / 2); // int y = (int) ((dimension.getHeight() - getHeight()) / 2); //setLocation(x, y); setLocationRelativeTo(null); this.pack(); panel = SplashUtils.getSplashScreen(width, height, SplashUtils.SplashReason.APPLET); ie.setHomepage("http://someones.org/amazing?page"); ie.setTitle("Testing information title"); ie.setvendor("IcedTea-Web team"); ie.addDescription("Testing null description"); ie.addDescription("tsting twoline des ...break\ncription of kind short", InfoItem.descriptionKindShort); panel.setInformationElement(ie); panel.setVersion("1.2-re45fdg"); setLayout(new BorderLayout()); getContentPane().add(panel.getSplashComponent(), BorderLayout.CENTER); addComponentListener(new ComponentListener() { @Override public void componentShown(ComponentEvent e) { } @Override public void componentResized(ComponentEvent e) { //panel.getSplashComponent().setSize(getWidth(), getHeight()); //panel.adjustForSize(getWidth(), getHeight()); } @Override public void componentMoved(ComponentEvent e) { } @Override public void componentHidden(ComponentEvent e) { } }); } @Test public void splashScreenTestsExists() { //to silence junit,and test is that thsi class was instantiated ;) Assert.assertTrue(true); } @Test public void splashScreenTestsPaint0() { //to silence junit,and test is that thsi class was instantiated ;) panel.setSplashWidth(width); panel.setSplashHeight(height); panel.adjustForSize(); BufferedImage buf = new BufferedImage(panel.getSplashWidth(), panel.getSplashHeight(), BufferedImage.TYPE_INT_ARGB); panel.setPercentage(0); panel.paintTo(buf.createGraphics()); // TextOutlineRendererTest.save(buf,"s0"); } @Test public void splashScreenTestsPaint50() { //to silence junit,and test is that thsi class was instantiated ;) panel.setSplashWidth(width); panel.setSplashHeight(height); panel.adjustForSize(); BufferedImage buf = new BufferedImage(panel.getSplashWidth(), panel.getSplashHeight(), BufferedImage.TYPE_INT_ARGB); panel.setPercentage(50); panel.paintTo(buf.createGraphics()); // TextOutlineRendererTest.save(buf,"s50"); } @Test public void splashScreenTestsPaint100() { //to silence junit,and test is that thsi class was instantiated ;) panel.setSplashWidth(width); panel.setSplashHeight(height); panel.adjustForSize(); BufferedImage buf = new BufferedImage(panel.getSplashWidth(), panel.getSplashHeight(), BufferedImage.TYPE_INT_ARGB); panel.setPercentage(100); panel.paintTo(buf.createGraphics()); // TextOutlineRendererTest.save(buf,"s100"); } public static void main(String args[]) { SplashScreenTest app = new SplashScreenTest(); app.setSize(800, 600); app.setVisible(true); app.addWindowListener( new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); panel.startAnimation(); try { Thread.sleep(10000); } catch (Exception e) { } //not needed //panel.stopAnimation(); if (swap) { SplashErrorPanel r = SplashUtils.getErrorSplashScreen(panel.getSplashWidth(), panel.getSplashHeight(), SplashUtils.SplashReason.APPLET, null); r.setInformationElement(ie); app.remove(panel.getSplashComponent()); r.setPercentage(panel.getPercentage()); r.adjustForSize(); r.setLoadingException(new RuntimeException(":)")); panel = r; panel.setVersion("1.2-re45fdg"); app.add(panel.getSplashComponent()); app.validate(); app.pack(); app.setVisible(true); try { Thread.sleep(10000); } catch (Exception e) { } } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/parts0000644000000000000000000000013213441742745026144 xustar0030 mtime=1552401893.110832675 30 atime=1552410887.112183445 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/0000755000175000002070000000000013441742745027031 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/InformationE0000644000000000000000000000013213441742745030536 xustar0030 mtime=1552401893.110832675 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/InformationElementTest.java0000644000175000002070000003331613441742745034341 0ustar00jvanekmock00000000000000/* InformationElementTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /** http://docs.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html */ package net.sourceforge.jnlp.splashscreen.parts; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.ParseException; import net.sourceforge.jnlp.ParserSettings; import org.junit.Assert; import org.junit.Test; /** * */ public class InformationElementTest { private static class TestDescriptionInfoItem extends DescriptionInfoItem { public TestDescriptionInfoItem(String value, String kind) { super(value, kind); } public String toXml() { if (kind == null) { return new TestInfoItem(type, value).toXml(); } return "<" + type + " kind=\"" + kind + "\">" + value + ""; } } private static class TestInfoItem extends InfoItem { public TestInfoItem(String type, String value) { super(type, value); } public String toXml() { if (type.equals(homepage)) { return "<" + type + " " + homepageHref + "=\"" + value + "\"/>"; } return "<" + type + ">" + value + ""; } } private final static TestInfoItem title = new TestInfoItem(InfoItem.title, "title exp"); private final static TestInfoItem vendor = new TestInfoItem(InfoItem.vendor, "vendor exp"); private final static TestInfoItem homepage = new TestInfoItem(InfoItem.homepage, "http://homepage.exp"); private final static TestDescriptionInfoItem oneLineD = new TestDescriptionInfoItem("One Line", DescriptionInfoItem.descriptionKindOneLine); private final static TestDescriptionInfoItem toolTipD = new TestDescriptionInfoItem("Tooltip", DescriptionInfoItem.descriptionKindToolTip); private final static TestDescriptionInfoItem short1D = new TestDescriptionInfoItem("short1", DescriptionInfoItem.descriptionKindShort); private final static TestDescriptionInfoItem short2D = new TestDescriptionInfoItem("short2", DescriptionInfoItem.descriptionKindShort); private final static TestDescriptionInfoItem noKindD = new TestDescriptionInfoItem("noKind", null); private static final String testJnlpheader = "\n" + "\n" + " \n"; private static final String testJnlpFooter = " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + ""; @Test public void testSetGetTitle() { InformationElement ie = new InformationElement(); Assert.assertNull("After creation value must be null", ie.getTitle()); ie.setTitle(title.getValue()); Assert.assertNotNull("After assigmentvalue must NOT be null", ie.getTitle()); Assert.assertTrue("After assigment value must be included in output", ie.getTitle().contains(title.getValue())); } @Test public void testSetGetvendor() { InformationElement ie = new InformationElement(); Assert.assertNull("After creation value must be null", ie.getVendor()); ie.setvendor(vendor.getValue()); Assert.assertNotNull("After assigmentvalue must NOT be null", ie.getVendor()); Assert.assertTrue("After assigment value must be included in output", ie.getVendor().contains(vendor.getValue())); } @Test public void testSetGetHomepage() { InformationElement ie = new InformationElement(); Assert.assertNull("After creation value must be null", ie.getHomepage()); ie.setHomepage(homepage.getValue()); Assert.assertNotNull("After assigmentvalue must NOT be null", ie.getHomepage()); Assert.assertTrue("After assigment value must be included in output", ie.getHomepage().contains(homepage.getValue())); } @Test public void addDescriptionTest() { InformationElement ie = new InformationElement(); Assert.assertNotNull("Descriptions should never be null", ie.getDescriptions()); Assert.assertEquals("Descriptions should be empty", 0, ie.getDescriptions().size()); ie.addDescription(toolTipD.getValue(), toolTipD.getKind()); Assert.assertNotNull("Descriptions should never be null", ie.getDescriptions()); Assert.assertEquals("Descriptions should be empty", 1, ie.getDescriptions().size()); ie.addDescription(short1D.getValue(), short1D.getKind()); Assert.assertNotNull("Descriptions should never be null", ie.getDescriptions()); Assert.assertEquals("Descriptions should be empty", 2, ie.getDescriptions().size()); ie.addDescription(short2D.getValue(), short2D.getKind()); Assert.assertNotNull("Descriptions should never be null", ie.getDescriptions()); Assert.assertEquals("Descriptions should reamin same", 2, ie.getDescriptions().size()); ie.addDescription(oneLineD.getValue(), oneLineD.getKind()); Assert.assertNotNull("Descriptions should never be null", ie.getDescriptions()); Assert.assertEquals("Descriptions should be ", 3, ie.getDescriptions().size()); ie.addDescription(noKindD.getValue(), noKindD.getKind()); Assert.assertNotNull("Descriptions should never be null", ie.getDescriptions()); Assert.assertEquals("Descriptions should be ", 4, ie.getDescriptions().size()); } public void getBestMatchingDescriptionForSplashTest() { InformationElement ie = new InformationElement(); Assert.assertNull(ie.getBestMatchingDescriptionForSplash()); ie.addDescription(toolTipD.getValue(), toolTipD.getKind()); Assert.assertNull(ie.getBestMatchingDescriptionForSplash()); ie.addDescription(short1D.getValue(), short1D.getKind()); Assert.assertNull(ie.getBestMatchingDescriptionForSplash()); ie.addDescription(noKindD.getValue(), noKindD.getKind()); Assert.assertNotNull(ie.getBestMatchingDescriptionForSplash()); Assert.assertEquals(ie.getBestMatchingDescriptionForSplash().getValue(), (noKindD.getValue())); ie.addDescription(oneLineD.getValue(), oneLineD.getKind()); Assert.assertNotNull(ie.getBestMatchingDescriptionForSplash()); Assert.assertEquals(ie.getBestMatchingDescriptionForSplash().getValue(), (oneLineD.getValue())); ie.addDescription(short2D.getValue(), short2D.getKind()); Assert.assertNotNull(ie.getBestMatchingDescriptionForSplash()); Assert.assertEquals(ie.getBestMatchingDescriptionForSplash().getValue(), (oneLineD.getValue())); } public void getLongestDescriptionForSplashTest() { InformationElement ie = new InformationElement(); Assert.assertNull(ie.getLongestDescriptionForSplash()); ie.addDescription(toolTipD.getValue(), toolTipD.getKind()); Assert.assertNotNull(ie.getLongestDescriptionForSplash()); Assert.assertEquals(ie.getLongestDescriptionForSplash().getValue(), (toolTipD.getValue())); ie.addDescription(oneLineD.getValue(), oneLineD.getKind()); Assert.assertNotNull(ie.getLongestDescriptionForSplash()); Assert.assertEquals(ie.getLongestDescriptionForSplash().getValue(), (oneLineD.getValue())); ie.addDescription(noKindD.getValue(), noKindD.getKind()); ie.addDescription(oneLineD.getValue(), oneLineD.getKind());//disturb Assert.assertNotNull(ie.getLongestDescriptionForSplash()); Assert.assertEquals(ie.getLongestDescriptionForSplash().getValue(), (noKindD.getValue())); ie.addDescription(short1D.getValue(), short1D.getKind()); ie.addDescription(toolTipD.getValue(), toolTipD.getKind());//disturb Assert.assertNotNull(ie.getLongestDescriptionForSplash()); Assert.assertEquals(ie.getLongestDescriptionForSplash().getValue(), (short1D.getValue())); } @Test public void getDescriptionTest() { getBestMatchingDescriptionForSplashTest(); } @Test public void getHeaderTest() { InformationElement ie = new InformationElement(); Assert.assertNotNull("Header should never be null", ie.getHeader()); Assert.assertEquals(0, ie.getHeader().size()); ie.setvendor(vendor.getValue()); Assert.assertEquals(1, ie.getHeader().size()); ie.setTitle(title.getValue()); Assert.assertEquals(2, ie.getHeader().size()); ie.setHomepage(homepage.getValue()); Assert.assertEquals(3, ie.getHeader().size()); ie.setTitle(homepage.getValue()); Assert.assertEquals(3, ie.getHeader().size()); ie.addDescription(toolTipD.getValue()); Assert.assertEquals(3, ie.getHeader().size()); ie.addDescription(oneLineD.getValue()); Assert.assertEquals(3, ie.getHeader().size()); } @Test public void createFromJNLP() throws UnsupportedEncodingException, ParseException { ParserSettings parser = new ParserSettings(); JNLPFile jnlpFile0 = null; InformationElement ie0 = InformationElement.createFromJNLP(jnlpFile0); Assert.assertNotNull(ie0); String exJnlp1 = "this is invalid jnlp"; Exception ex = null; JNLPFile jnlpFile1 = null; try { jnlpFile1 = new JNLPFile(new ByteArrayInputStream(exJnlp1.getBytes("utf-8")), parser); } catch (Exception eex) { ex = eex; } Assert.assertNotNull(ex); InformationElement ie1 = InformationElement.createFromJNLP(jnlpFile1); Assert.assertNotNull(ie1); //title, vendor and homepage are obligatory.. not so much to test String exJnlp2 = testJnlpheader + title.toXml() + "\n" + homepage.toXml() + "\n" + vendor.toXml() + "\n" + testJnlpFooter; JNLPFile jnlpFile2 = new JNLPFile(new ByteArrayInputStream(exJnlp2.getBytes("utf-8")), parser); InformationElement ie2 = InformationElement.createFromJNLP(jnlpFile2); Assert.assertNotNull(ie2); Assert.assertEquals(3, ie2.getHeader().size()); Assert.assertEquals(0, ie2.getDescriptions().size()); String exJnlp3 = testJnlpheader + title.toXml() + "\n" + homepage.toXml() + "\n" + vendor.toXml() + "\n" + toolTipD.toXml() + "\n" + testJnlpFooter; JNLPFile jnlpFile3 = new JNLPFile(new ByteArrayInputStream(exJnlp3.getBytes("utf-8")), parser); InformationElement ie3 = InformationElement.createFromJNLP(jnlpFile3); Assert.assertNotNull(ie3); Assert.assertEquals(3, ie3.getHeader().size()); Assert.assertEquals(1, ie3.getDescriptions().size()); String exJnlp4 = testJnlpheader + title.toXml() + "\n" + homepage.toXml() + "\n" + vendor.toXml() + "\n" + noKindD.toXml() + "\n" + testJnlpFooter; JNLPFile jnlpFile4 = new JNLPFile(new ByteArrayInputStream(exJnlp4.getBytes("utf-8")), parser); InformationElement ie4 = InformationElement.createFromJNLP(jnlpFile4); Assert.assertNotNull(ie4); Assert.assertEquals(3, ie4.getHeader().size()); Assert.assertEquals(1, ie4.getDescriptions().size()); String exJnlp5 = testJnlpheader + title.toXml() + "\n" + homepage.toXml() + "\n" + vendor.toXml() + "\n" + noKindD.toXml() + "\n" + toolTipD.toXml() + "\n" + testJnlpFooter; JNLPFile jnlpFile5 = new JNLPFile(new ByteArrayInputStream(exJnlp5.getBytes("utf-8")), parser); InformationElement ie5 = InformationElement.createFromJNLP(jnlpFile5); Assert.assertNotNull(ie5); Assert.assertEquals(3, ie5.getHeader().size()); Assert.assertEquals(2, ie5.getDescriptions().size()); } @Test public void toXml() { TestInfoItem i1 = new TestInfoItem("aa", "bb"); Assert.assertTrue(i1.toXml().contains("aa")); Assert.assertTrue(i1.toXml().contains("bb")); Assert.assertTrue(i1.toXml().length() > 4); JEditorPaneBasedExceptionDialogTest.assertMarkup(i1.toXml()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/DescriptionI0000644000000000000000000000013213441742745030540 xustar0030 mtime=1552401893.066832766 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/DescriptionInfoItemTest.java0000644000175000002070000001344413441742745034460 0ustar00jvanekmock00000000000000/* DescriptionInfoItemTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; import net.sourceforge.jnlp.ServerAccess; import org.junit.Assert; import org.junit.Test; public class DescriptionInfoItemTest { private static final DescriptionInfoItem[] d = {new DescriptionInfoItem("Firm 1", null), new DescriptionInfoItem("Firm 2", null), new DescriptionInfoItem("Firm 3", "k1"), new DescriptionInfoItem("Firm 4", "k2"), new DescriptionInfoItem("Firm 6", "k1")}; @Test public void setGetTest() { DescriptionInfoItem di = new DescriptionInfoItem("a", "b"); Assert.assertEquals("a", di.getValue()); Assert.assertEquals("b", di.getKind()); Assert.assertEquals(InfoItem.description, di.getType()); di.setKind("q"); Assert.assertEquals("q", di.getKind()); } @Test public void isOfSameKindTests() { boolean[] results = new boolean[]{true, true, false, false, false, true, true, false, false, false, false, false, true, false, true, false, false, false, true, false, false, false, true, false, true}; int x = -1; for (int i = 0; i < d.length; i++) { DescriptionInfoItem d1 = d[i]; for (int j = 0; j < d.length; j++) { x++; DescriptionInfoItem d2 = d[j]; ServerAccess.logOutputReprint(x + ": " + i + "x" + j + " " + d1.toString() + "x" + d2.toString() + "- same kind - " + d1.isOfSameKind(d2)); Assert.assertEquals(results[x], d1.isOfSameKind(d2)); } } } @Test public void isSameTest() { boolean[] results = new boolean[]{true, true, false, false, false, true, true, false, false, false, false, false, true, false, true, false, false, false, true, false, false, false, true, false, true }; int x = -1; for (int i = 0; i < d.length; i++) { DescriptionInfoItem d1 = d[i]; for (int j = 0; j < d.length; j++) { x++; DescriptionInfoItem d2 = d[j]; ServerAccess.logOutputReprint(x + ": " + i + "x" + j + " " + d1.toString() + "x" + d2.toString() + "- same - " + d1.isSame(d2)); Assert.assertEquals(results[x], d1.isSame(d2)); } } } @Test public void equalsTest() { boolean[] results = new boolean[]{true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, true }; int x = -1; for (int i = 0; i < d.length; i++) { DescriptionInfoItem d1 = d[i]; for (int j = 0; j < d.length; j++) { x++; DescriptionInfoItem d2 = d[j]; ServerAccess.logOutputReprint(x + ": " + i + "x" + j + ", " + d1.toString() + " x " + d2.toString() + "- equals - " + d1.equals(d2)); Assert.assertEquals(results[x], d1.equals(d2)); } } } @Test public void toStringTest() { DescriptionInfoItem d1 = new DescriptionInfoItem("Firm 3", null); Assert.assertTrue(d1.toString().contains(d1.getValue())); Assert.assertTrue(d1.toString().contains(d1.getType())); Assert.assertTrue(d1.toString().contains("null")); DescriptionInfoItem dd = new DescriptionInfoItem("Firm 3", "k1"); Assert.assertTrue(dd.toString().contains(dd.getValue())); Assert.assertTrue(dd.toString().contains(dd.getType())); Assert.assertTrue(dd.toString().contains(dd.getKind())); } @Test public void toNiceStringTest() { DescriptionInfoItem d1 = new DescriptionInfoItem("Firm 3", null); Assert.assertTrue(d1.toNiceString().contains(d1.getValue())); Assert.assertTrue(d1.toNiceString().contains(InfoItem.SPLASH + d1.getType()) || !d1.toNiceString().contains(InfoItem.SPLASH)); DescriptionInfoItem dd = new DescriptionInfoItem("Firm 3", "k1"); Assert.assertTrue(dd.toNiceString().contains(dd.getValue())); Assert.assertTrue(dd.toNiceString().contains(InfoItem.SPLASH + dd.getType()) || !d1.toNiceString().contains(InfoItem.SPLASH)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/BasicCompone0000644000000000000000000000032413441742745030511 xustar00122 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/BasicComponentErrorSplashScreenTest.java 30 mtime=1552401893.071832756 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/BasicComponentErrorSplashScr0000644000175000002070000001117113441742745034516 0ustar00jvanekmock00000000000000/* BasicComponentSplashScreenTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; import java.awt.Graphics; import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; import org.junit.Assert; import org.junit.Test; public class BasicComponentErrorSplashScreenTest { @Test public void createAditionalInfoTest() { BasicComponentSplashScreenImpl tested = new BasicComponentSplashScreenImpl(); String v = "2.118x08"; tested.setVersion(v); tested.setSplashReason(SplashReason.APPLET); String s1 = tested.createAditionalInfoTest(); Assert.assertNotNull("Not null input must result to something", s1); Assert.assertTrue("Not null input must have version value", s1.contains(v)); Assert.assertTrue("Not null input must have version string", s1.contains("version")); Assert.assertTrue("Not null input must have version string", s1.contains(SplashReason.APPLET.toString())); tested.setVersion(null); tested.setSplashReason(null); String s2 = tested.createAditionalInfoTest(); Assert.assertNull("Not null input must result to something", s2); tested.setSplashReason(null); tested.setVersion(v); Exception ex = null; try { String s3 = tested.createAditionalInfoTest(); } catch (Exception exx) { ex = exx; } Assert.assertNotNull("Null reason vith set version must causes exception", ex); } @Test public void setGetError() { BasicComponentSplashScreenImpl tested = new BasicComponentSplashScreenImpl(); Exception ex = new Exception("ujuj"); tested.setLoadingException(ex); Assert.assertEquals(ex, tested.getLoadingException()); } private class BasicComponentSplashScreenImpl extends BasicComponentErrorSplashScreen { public BasicComponentSplashScreenImpl() { } @Override public void paintComponent(Graphics g) { throw new UnsupportedOperationException("Not supported yet."); } @Override public void paintTo(Graphics g) { throw new UnsupportedOperationException("Not supported yet."); } @Override public void adjustForSize() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void startAnimation() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void stopAnimation() { throw new UnsupportedOperationException("Not supported yet."); } public String createAditionalInfoTest() { return super.createAditionalInfo(); } @Override public void setPercentage(int done) { throw new UnsupportedOperationException("Not supported yet."); } @Override public int getPercentage() { throw new UnsupportedOperationException("Not supported yet."); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/JEditorPaneB0000644000000000000000000000032413441742745030415 xustar00122 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialogTest.java 30 mtime=1552401893.081832735 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDia0000644000175000002070000002044313441742745034357 0ustar00jvanekmock00000000000000/* JeditorPaneBasedExceptionDialog.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import net.sourceforge.jnlp.runtime.Translator; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class JEditorPaneBasedExceptionDialogTest { private static RuntimeException eex = new RuntimeException("ex2"); private static Exception ex = new Exception("ex1", eex); private static String ai = "Another info"; private static InformationElement ec = new InformationElement(); private static List l = new ArrayList(3); @BeforeClass public static void fillLists() { ec.setHomepage("item 1"); ec.setTitle("item 2"); ec.setvendor("item 3"); ec.addDescription("item 4"); l = JEditorPaneBasedExceptionDialog.infoElementToList(ec); } static void assertHtml(String s) { Assert.assertTrue("result of getText must be marked html", s.contains("html")); Assert.assertTrue("result of getText must be marked html", s.contains("body")); assertMarkup(s); } static void assertMarkup(String s) { Assert.assertTrue("result of getText must be marked in by html markup", s.contains("<") && s.contains(">")); Assert.assertTrue("result of getText must be marked in by html markup", s.contains("")); } private void assertAI(String s, boolean b) { if (b) { Assert.assertTrue("result of getText must contains annother info", s.contains(ai)); } else { Assert.assertFalse("result of getText must NOT contains annother info", s.contains(ai)); } } private void assertLL(String s, boolean b) { for (String i : l) { if (b) { Assert.assertTrue("result of getText must contains info list", s.contains(i)); } else { Assert.assertFalse("result of getText must NOT contains info list", s.contains(i)); } } } private void assertFullException(String s, boolean b) { if (b) { Assert.assertTrue("result of getText must contains complete exception", s.contains(ex.getMessage())); Assert.assertTrue("result of getText must contains complete exception", s.contains(eex.getMessage())); } else { Assert.assertFalse("result of getText must contains not complete exception", s.contains(ex.getMessage())); Assert.assertFalse("result of getText must contains not complete exception", s.contains(eex.getMessage())); } } @Test public void getTextTest() { String s1 = JEditorPaneBasedExceptionDialog.getText(ex, l, ai, new Date()); String s2 = JEditorPaneBasedExceptionDialog.getText(ex, l, null, new Date()); String s3 = JEditorPaneBasedExceptionDialog.getText(ex, null, ai, new Date()); String s4 = JEditorPaneBasedExceptionDialog.getText(null, l, ai, new Date()); assertHtml(s1); assertHtml(s2); assertHtml(s3); assertHtml(s4); assertAI(s1, true); assertAI(s2, false); assertAI(s3, true); assertAI(s4, true); assertLL(s1, true); assertLL(s2, true); assertLL(s3, false); assertLL(s4, true); assertFullException(s1, true); assertFullException(s2, true); assertFullException(s3, true); assertFullException(s4, false); JEditorPaneBasedExceptionDialog d1 = new JEditorPaneBasedExceptionDialog(null, false, ex, ec, ai); JEditorPaneBasedExceptionDialog d2 = new JEditorPaneBasedExceptionDialog(null, false, ex, ec, null); JEditorPaneBasedExceptionDialog d3 = new JEditorPaneBasedExceptionDialog(null, false, ex, null, ai); JEditorPaneBasedExceptionDialog d4 = new JEditorPaneBasedExceptionDialog(null, false, null, ec, ai); Assert.assertTrue("message from dialog must be same as pattern", d1.getMessage().equals(s1)); Assert.assertTrue("message from dialog must be same as pattern", d2.getMessage().equals(s2)); Assert.assertTrue("message from dialog must be same as pattern", d3.getMessage().equals(s3)); Assert.assertTrue("message from dialog must be same as pattern", d4.getMessage().equals(s4)); } @Test public void getExceptionStackTraceAsString() { String t1 = JEditorPaneBasedExceptionDialog.getExceptionStackTraceAsString(ex); assertFullException(t1, true); String t2 = JEditorPaneBasedExceptionDialog.getExceptionStackTraceAsString(null); Assert.assertNotNull("For null empty result must not be null", t2); Assert.assertEquals("null input must result to empty string", "", t2); } @Test public void getExceptionStackTraceAsStrings() { String[] t1 = JEditorPaneBasedExceptionDialog.getExceptionStackTraceAsStrings(ex); assertFullException(Arrays.toString(t1), true); String[] t2 = JEditorPaneBasedExceptionDialog.getExceptionStackTraceAsStrings(null); Assert.assertNotNull("For null empty result must not be null", t2); Assert.assertArrayEquals("null input must result to empty array", new String[0], t2); } @Test public void formatListInfoList() { String t1 = JEditorPaneBasedExceptionDialog.formatListInfoList(l); assertMarkup(t1); assertLL(t1, true); String t2 = JEditorPaneBasedExceptionDialog.formatInfo(null); Assert.assertNotNull("For null empty result must not be null", t2); Assert.assertEquals("null input must result to empty string", "", t2); } @Test public void formatInfo() { String s = "SOME STRING"; String t1 = JEditorPaneBasedExceptionDialog.formatInfo(s); assertMarkup(t1); Assert.assertTrue("Marked text must contains source", t1.contains(s)); String t2 = JEditorPaneBasedExceptionDialog.formatInfo(null); Assert.assertNotNull("For null empty result must not be null", t2); Assert.assertEquals("null input must result to empty string", "", t2); } @Test public void infoElementToListTets() { List tl = JEditorPaneBasedExceptionDialog.infoElementToList(ec); Assert.assertTrue("Transformed elemetn must contains all items ", tl.contains(l.get(0))); Assert.assertTrue("Transformed elemetn must contains all items ", tl.contains(l.get(1))); Assert.assertTrue("Transformed elemetn must contains all items ", tl.contains(l.get(2))); Assert.assertTrue("Transformed elemetn must contains all items ", tl.contains(l.get(3))); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/InfoItemTest0000644000000000000000000000013213441742745030516 xustar0030 mtime=1552401893.076832746 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/InfoItemTest.java0000644000175000002070000001060013441742745032243 0ustar00jvanekmock00000000000000/* InfoItemTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; import org.junit.Assert; import org.junit.Test; /** *The optional kind="splash" attribute may be used in an icon element to indicate that the image is to be used as a "splash" screen during the launch of an application. If the JNLP file does not contain an icon element with kind="splash" attribute, Java Web Start will construct a splash screen using other items from the information Element. *If the JNLP file does not contain any icon images, the splash image will consist of the application's title and vendor, as taken from the JNLP file. * * items not used inside */ public class InfoItemTest { @Test public void testGettersSetters() { InfoItem ii = new InfoItem("a", "b"); Assert.assertEquals("a", ii.getType()); Assert.assertEquals("b", ii.getValue()); ii.setType("c"); Assert.assertEquals("c", ii.getType()); ii.setValue("d"); Assert.assertEquals("d", ii.getValue()); } @Test public void TestIsOfSameType() { InfoItem i1 = new InfoItem("a", "b"); InfoItem i2 = new InfoItem("a", "c"); InfoItem i3 = new InfoItem("b", "a"); Assert.assertTrue(i1.isofSameType(i2)); Assert.assertFalse(i1.isofSameType(i3)); Assert.assertFalse(i2.isofSameType(i3)); DescriptionInfoItem d1 = new DescriptionInfoItem("a", InfoItem.descriptionKindToolTip); InfoItem id1 = new InfoItem(InfoItem.description, "a"); Assert.assertTrue(id1.isofSameType(d1)); } @Test public void testEquals() { InfoItem i1 = new InfoItem("a", "b"); InfoItem i11 = new InfoItem("a", "b"); InfoItem i2 = new InfoItem("a", "c"); InfoItem i3 = new InfoItem("b", "a"); Assert.assertFalse(i1.equals(i2)); Assert.assertFalse(i1.equals(i3)); Assert.assertFalse(i2.equals(i3)); Assert.assertTrue(i1.equals(i11)); DescriptionInfoItem d1 = new DescriptionInfoItem("a", InfoItem.descriptionKindToolTip); InfoItem id1 = new InfoItem(InfoItem.description, "a"); Assert.assertTrue(id1.equals(d1)); } @Test public void toStringTest() { InfoItem i1 = new InfoItem("aa", "bb"); Assert.assertTrue(i1.toString().contains("aa")); Assert.assertTrue(i1.toString().contains("bb")); Assert.assertTrue(i1.toString().length() > 4); } @Test public void toNiceString() { InfoItem i1 = new InfoItem("aaa", "bbb"); Assert.assertTrue(i1.toNiceString().contains(InfoItem.SPLASH + "aaa") || !i1.toNiceString().contains(InfoItem.SPLASH)); Assert.assertTrue(i1.toNiceString().contains("bbb")); Assert.assertFalse(i1.toNiceString().equals(i1.toString())); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/BasicCompone0000644000000000000000000000031613441742745030512 xustar00117 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/BasicComponentSplashScreenTest.java 29 mtime=1552401893.06983276 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/BasicComponentSplashScreenTe0000644000175000002070000001052213441742745034464 0ustar00jvanekmock00000000000000/* BasicComponentSplashScreenTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; import java.awt.Graphics; import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; import org.junit.Assert; import org.junit.Test; public class BasicComponentSplashScreenTest { @Test public void createAditionalInfoTest() { BasicComponentSplashScreenImpl tested = new BasicComponentSplashScreenImpl(); String v = "2.118x08"; tested.setVersion(v); tested.setSplashReason(SplashReason.APPLET); String s1 = tested.createAditionalInfoTest(); Assert.assertNotNull("Not null input must result to something", s1); Assert.assertTrue("Not null input must have version value", s1.contains(v)); Assert.assertTrue("Not null input must have version string", s1.contains("version")); Assert.assertTrue("Not null input must have version string", s1.contains(SplashReason.APPLET.toString())); tested.setVersion(null); tested.setSplashReason(null); String s2 = tested.createAditionalInfoTest(); Assert.assertNull("Not null input must result to something", s2); tested.setSplashReason(null); tested.setVersion(v); Exception ex = null; try { String s3 = tested.createAditionalInfoTest(); } catch (Exception exx) { ex = exx; } Assert.assertNotNull("Null reason vith set version must causes exception", ex); } private class BasicComponentSplashScreenImpl extends BasicComponentSplashScreen { public BasicComponentSplashScreenImpl() { } @Override public void paintComponent(Graphics g) { throw new UnsupportedOperationException("Not supported yet."); } @Override public void paintTo(Graphics g) { throw new UnsupportedOperationException("Not supported yet."); } @Override public void adjustForSize() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void startAnimation() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void stopAnimation() { throw new UnsupportedOperationException("Not supported yet."); } public String createAditionalInfoTest() { return super.createAditionalInfo(); } @Override public void setPercentage(int done) { throw new UnsupportedOperationException("Not supported yet."); } @Override public int getPercentage() { throw new UnsupportedOperationException("Not supported yet."); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/impls0000644000000000000000000000013213441742745026137 xustar0030 mtime=1552401893.066832766 30 atime=1552410887.112183445 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/0000755000175000002070000000000013441742745027024 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/PaxHeaders.7406/defaultsplas0000644000000000000000000000013213441742745030626 xustar0030 mtime=1552401893.109832677 30 atime=1552410887.112183445 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/0000755000175000002070000000000013441742745033370 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000032513441742745030724 xustar00123 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubicTest.java 30 mtime=1552401893.109832677 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatC0000644000175000002070000002401513441742745034142 0ustar00jvanekmock00000000000000/* NatCubicTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.NatCubic; import java.awt.Polygon; import org.junit.Assert; import org.junit.Test; public class NatCubicTest { @Test public void setGetTests() { Polygon p1 = new Polygon(); p1.addPoint(10, 23); p1.addPoint(12, -31); NatCubic cc = new NatCubic(); Assert.assertNotNull(cc.getSourcePolygon()); Assert.assertNull(cc.getResult()); Exception ex = null; try { cc.calcualteAndSaveResult(); } catch (Exception eex) { ex = eex; } Assert.assertNotNull(ex); Assert.assertNull(cc.getResult()); Assert.assertTrue(cc.isWithPoints()); cc.setSourcePolygon(p1); Assert.assertNotNull(cc.getSourcePolygon()); Assert.assertEquals(p1, cc.getSourcePolygon()); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); Assert.assertTrue(cc.isWithPoints()); cc.setWithPoints(false); Assert.assertFalse(cc.isWithPoints()); cc.resetResult(); Assert.assertNull(cc.getResult()); } static int[] xs = {0, 100, 100, 0}; static int[] ys = {0, 0, 100, 1000}; static NatCubic getTestInstance() { NatCubic cc = new NatCubic(); cc.addPoint(xs[0], ys[0]); cc.addPoint(xs[1], ys[1]); cc.addPoint(xs[2], ys[2]); cc.addPoint(xs[3], ys[3]); return cc; } @Test public void basicComputation() { NatCubic b = new NatCubic(); b.addPoint(10, 10); b.addPoint(50, 20); b.addPoint(-10, -10); b.calcualteAndSaveResult(); Assert.assertTrue(b.pts.npoints < b.result.npoints / 5); Assert.assertFalse(b.result.xpoints[0] == b.result.xpoints[b.result.npoints - 1]); Assert.assertFalse(b.result.ypoints[0] == b.result.ypoints[b.result.npoints - 1]); } @Test public void addPoint() { NatCubic cc = new NatCubic(); Assert.assertEquals(0, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); Exception ex = null; try { cc.calcualteAndSaveResult(); } catch (Exception eex) { ex = eex; } Assert.assertNotNull(ex); Assert.assertNull(cc.getResult()); cc.addPoint(10, 10); Assert.assertEquals(1, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); ex = null; try { cc.calcualteAndSaveResult(); } catch (Exception eex) { ex = eex; } Assert.assertNotNull(ex); Assert.assertNull(cc.getResult()); cc.addPoint(10, 10); Assert.assertEquals(2, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.addPoint(100, 100); Assert.assertEquals(3, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); } @Test public void setPointTest1() { NatCubic cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.setSelection(-1); cc.setPoint(10, 10); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.setSelection(4); cc.setPoint(10, 10); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.setSelection(3); cc.setPoint(10, 20); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); Assert.assertEquals(20, cc.getSourcePolygon().ypoints[3]); Assert.assertEquals(10, cc.getSourcePolygon().xpoints[3]); } @Test public void removePoint2() { NatCubic cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.removePoint(-1); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.removePoint(4); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.removePoint(3); Assert.assertEquals(3, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); } public void removePoint1() { NatCubic cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.setSelection(-1); cc.removePoint(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.setSelection(4); cc.removePoint(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.setSelection(0); cc.removePoint(); Assert.assertEquals(3, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i + 1], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i + 1], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000032713441742745030726 xustar00125 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/MovingTextTest.java 30 mtime=1552401893.066832766 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Movi0000644000175000002070000001502313441742745034226 0ustar00jvanekmock00000000000000/* MovingTextTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import org.junit.Assert; import org.junit.Test; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.TextWithWaterLevel; public class MovingTextTest { @Test public void setGetTest() { BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bi.createGraphics(); Font f1 = g2d.getFont().deriveFont(Font.ITALIC); Font f2 = g2d.getFont().deriveFont(Font.BOLD); String s = "Watter"; MovingText tw = new MovingText(s, f1); Assert.assertEquals(-1, tw.getHeight()); Assert.assertEquals(-1, tw.getWidth()); Assert.assertEquals(f1, tw.getFont()); Assert.assertNull(tw.getImg()); Assert.assertEquals(s, tw.getText()); Assert.assertEquals(Color.BLACK, tw.getTextOutline()); Assert.assertEquals(Color.blue, tw.getWaterColor()); Assert.assertEquals(Color.white, tw.getBgColor()); Assert.assertEquals(0, tw.getPercentageOfWater()); tw.setBgColor(Color.yellow); tw.setWaterColor(Color.orange); tw.setPercentageOfWater(20); Assert.assertEquals(Color.orange, tw.getWaterColor()); Assert.assertEquals(Color.yellow, tw.getBgColor()); Assert.assertEquals(20, tw.getPercentageOfWater()); } private static int getAvgColor(Color c) { Assert.assertEquals(c.getRed(), c.getBlue()); Assert.assertEquals(c.getRed(), c.getGreen()); return c.getRed(); } private static int getAvgColor(int i) { return getAvgColor(new Color(i)); } private static int getAvgColor(BufferedImage m, int x, int y) { return getAvgColor(m.getRGB(x, y)); } @Test public void getBackground() { MovingText ifc = getInstance(); BufferedImage bic = ifc.getBackground(); int w = bic.getWidth(); int h = bic.getHeight(); ifc.setPercentageOfWater(0); bic = ifc.getBackground(); Assert.assertTrue(getAvgColor(bic, 3 * w / 4, h / 2) > getAvgColor(bic, 2 * w / 4, h / 2)); Assert.assertTrue(getAvgColor(bic, w / 4, h / 2) < getAvgColor(bic, 2 * w / 4, h / 2)); Assert.assertEquals(new Color(bic.getRGB(w - w / 4, 2 * h / 3)), new Color(bic.getRGB(w - w / 4, h / 3))); ifc.setPercentageOfWater(w / 2); bic = ifc.getBackground(); Assert.assertTrue(getAvgColor(bic, 3 * w / 4, h / 2) > getAvgColor(bic, 2 * w / 4, h / 2)); Assert.assertTrue(getAvgColor(bic, w / 4, h / 2) > getAvgColor(bic, 2 * w / 4, h / 2)); Assert.assertEquals(new Color(bic.getRGB(w - w / 3, 2 * h / 3)), new Color(bic.getRGB(w - w / 3, h / 3))); ifc.setPercentageOfWater(w); bic = ifc.getBackground(); Assert.assertTrue(getAvgColor(bic, 3 * w / 4, h / 2) < getAvgColor(bic, 2 * w / 4, h / 2)); Assert.assertTrue(getAvgColor(bic, w / 4, h / 2) > getAvgColor(bic, 2 * w / 4, h / 2)); Assert.assertEquals(new Color(bic.getRGB(w - w / 4, h / 3)), new Color(bic.getRGB(w - w / 4, h / 2))); } private MovingText getInstance() { BufferedImage bi1 = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB); Font f = bi1.createGraphics().getFont().deriveFont(Font.BOLD, 130); MovingText ifc = new MovingText("O O", f); return ifc; } private static void assertNotEquals(Object o1, Object o2) { Assert.assertFalse(o1.equals(o2)); } @Test public void cutToTest() { MovingText ifc = getInstance(); BufferedImage bic = ifc.getBackground(); int w = bic.getWidth(); int h = bic.getHeight(); bic = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); ifc.cutTo(bic.createGraphics(), 0, h); Color cc = new Color(0, 0, 0); assertNotEquals(cc, new Color(bic.getRGB((int) (w * TextWithWaterLevelTest.firstLetterMiddleWidth), (int) (h * TextWithWaterLevelTest.firstLetterLowerHeight)))); assertNotEquals(cc, new Color(bic.getRGB((int) (w * TextWithWaterLevelTest.secondLetterLeftWidth), (int) (h * TextWithWaterLevelTest.secondLetterMiddleHeight)))); assertNotEquals(cc, new Color(bic.getRGB((int) (w * TextWithWaterLevelTest.firstLetterMiddleWidth), (int) (h * TextWithWaterLevelTest.firstLetterUpperHeight)))); assertNotEquals(cc, new Color(bic.getRGB((int) (w * TextWithWaterLevelTest.secondLetterRightWidth), (int) (h * TextWithWaterLevelTest.secondLetterUpperHeight)))); //well this should be acctually rgba 0,0,0,0 but somehow this was no passig //you can confirm with: //ImageFontCutterTest.save(bic, "halfFiledOus") Assert.assertEquals(cc, new Color(bic.getRGB(137, 127))); Assert.assertEquals(cc, new Color(bic.getRGB(137, 2))); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000034013441742745030721 xustar00134 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextOutlineRendererTest.java 30 mtime=1552401893.068832762 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Text0000644000175000002070000001322313441742745034240 0ustar00jvanekmock00000000000000/* TextOutlineRendererTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import net.sourceforge.jnlp.annotations.WindowsIssue; import net.sourceforge.jnlp.runtime.JNLPRuntime; import org.junit.Assert; import org.junit.Test; public class TextOutlineRendererTest { final int imageSize = 100; final int zero = 0; @Test public void getSetTest() { BufferedImage bi = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bi.createGraphics(); Font f1 = g2d.getFont().deriveFont(Font.ITALIC); Font f2 = g2d.getFont().deriveFont(Font.BOLD); String s = "Hello"; TextOutlineRenderer ifc = new TextOutlineRenderer(f1, s); Assert.assertEquals(-1, ifc.getHeight()); Assert.assertEquals(-1, ifc.getWidth()); Assert.assertEquals(f1, ifc.getFont()); Assert.assertNull(ifc.getImg()); Assert.assertEquals(s, ifc.getText()); Assert.assertEquals(Color.BLACK, ifc.getTextOutline()); ifc.setImg(bi); Assert.assertEquals(imageSize, ifc.getHeight()); Assert.assertEquals(imageSize, ifc.getWidth()); Assert.assertEquals(f1, ifc.getFont()); Assert.assertEquals(bi, ifc.getImg()); Assert.assertEquals(s, ifc.getText()); Assert.assertEquals(Color.BLACK, ifc.getTextOutline()); TextOutlineRenderer xfc = new TextOutlineRenderer(f1, s, Color.red); xfc.setImg(bi); xfc.setFont(f2); String ss = "HelloHello"; Assert.assertEquals(imageSize, xfc.getHeight()); Assert.assertEquals(imageSize, xfc.getWidth()); Assert.assertEquals(f2, xfc.getFont()); Assert.assertEquals(bi, xfc.getImg()); Assert.assertEquals(s, xfc.getText()); Assert.assertEquals(Color.red, xfc.getTextOutline()); xfc.setTextOutline(Color.white); Assert.assertEquals(Color.white, xfc.getTextOutline()); } @Test @WindowsIssue //hardcoded values cannot be metrified, the solution to find the centre is unknown. public void cutToTest() { BufferedImage bi1 = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d1 = bi1.createGraphics(); g2d1.setColor(Color.red); g2d1.fillRect(zero, zero, imageSize, imageSize); BufferedImage bi2 = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d2 = bi2.createGraphics(); g2d2.setColor(Color.blue); g2d2.fillRect(zero, zero, imageSize, imageSize); TextOutlineRenderer ifc = new TextOutlineRenderer(g2d1.getFont().deriveFont(Font.BOLD, 130), "O"); ifc.setImg(bi1); ifc.cutTo(g2d2, -5, imageSize); Color c2 = null; Color c3 = null; Color c5 = null; Color c1 = new Color(bi2.getRGB(1, 1)); Color c4 = new Color(bi2.getRGB(70, 70)); if (JNLPRuntime.isWindows()) { c2 = new Color(bi2.getRGB(45, 54)); c3 = new Color(bi2.getRGB(27, 27)); c5 = new Color(bi2.getRGB(20, 52)); } else { c2 = new Color(bi2.getRGB(50, 50)); c3 = new Color(bi2.getRGB(30, 30)); c5 = new Color(bi2.getRGB(26, 52)); } Assert.assertEquals(Color.blue, c1); Assert.assertEquals(Color.blue, c2); Assert.assertEquals(Color.red, c3); Assert.assertEquals(Color.red, c4); Assert.assertEquals(Color.black, c5); } public static void save(BufferedImage bi1, String string) { try { String name = string; if (name == null || name.trim().length() <= 0) { name = "testImage"; } ImageIO.write(bi1, "png", new File(System.getProperty("user.home") + "/Desktop/" + name + ".png")); } catch (Exception ex) { ex.printStackTrace(); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000033013441742745030720 xustar00126 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainterTest.java 30 mtime=1552401893.068832762 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Base0000644000175000002070000001257013441742745034172 0ustar00jvanekmock00000000000000/* BasePainterTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.image.BufferedImage; import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; import net.sourceforge.jnlp.splashscreen.impls.DefaultSplashScreen2012; import org.junit.Assert; import org.junit.Test; public class BasePainterTest { @Test public void scaleTest() { Assert.assertEquals(10, BasePainter.scale(2, 4, 5), 0.1d); Assert.assertEquals(4, BasePainter.scale(4, 2, 8), 0.1d); } @Test public void getRatioTest() { Assert.assertEquals(2, BasePainter.getRatio(2, 4), 0.1d); Assert.assertEquals(0.5, BasePainter.getRatio(4, 2), 0.1d); } @Test public void incLevel2Test() { BasePainter bp = new BasePainter(new DefaultSplashScreen2012(100, 100, SplashReason.APPLET)); int l1 = bp.getWaterLevel(); int l2 = bp.getAnimationsPosition(); bp.increaseAnimationPosition(); Assert.assertFalse(l2 == bp.getAnimationsPosition()); Assert.assertTrue(l1 == bp.getWaterLevel()); } @Test public void adjustForSizeTest() { BasePainter bp = new BasePainter(new DefaultSplashScreen2012(100, 100, SplashReason.APPLET)); bp.adjustForSize(100, 100); Assert.assertNotNull(bp.prerenderedStuff); BufferedImage i1 = bp.prerenderStill(); Assert.assertEquals(100, i1.getWidth()); Assert.assertEquals(100, i1.getHeight()); bp.adjustForSize(20, 20); Assert.assertNotNull(bp.prerenderedStuff); Assert.assertEquals(20, bp.prerenderedStuff.getWidth()); Assert.assertEquals(20, bp.prerenderedStuff.getHeight()); Assert.assertFalse(i1.getWidth() == bp.prerenderedStuff.getWidth()); Assert.assertFalse(i1.getHeight() == bp.prerenderedStuff.getHeight()); } @Test public void adjustForSizeTest2() { BasePainter bp = new BasePainter(new DefaultSplashScreen2012(0, 0, SplashReason.APPLET), false); Assert.assertNull(bp.prerenderedStuff); bp.master.setSplashHeight(10); bp.master.setSplashWidth(10); BufferedImage i1 = bp.prerenderStill(); Assert.assertEquals(10, i1.getWidth()); Assert.assertEquals(10, i1.getHeight()); bp.adjustForSize(20, 20); Assert.assertNotNull(bp.prerenderedStuff); Assert.assertEquals(20, bp.prerenderedStuff.getWidth()); Assert.assertEquals(20, bp.prerenderedStuff.getHeight()); Assert.assertFalse(i1.getWidth() == bp.prerenderedStuff.getWidth()); Assert.assertFalse(i1.getHeight() == bp.prerenderedStuff.getHeight()); } @Test public void stripCommitFromVersion() { Assert.assertEquals("1.4", BasePainter.stripCommitFromVersion("1.4")); Assert.assertEquals("1.4.2", BasePainter.stripCommitFromVersion("1.4.2")); Assert.assertEquals("1.4pre", BasePainter.stripCommitFromVersion("1.4pre")); Assert.assertEquals("1.4", BasePainter.stripCommitFromVersion("1.4+657tgkhyu4iy5")); Assert.assertEquals("1.4.2", BasePainter.stripCommitFromVersion("1.4.2+887tgjh07tftvhjj")); Assert.assertEquals("1.4pre+0977tyugg", BasePainter.stripCommitFromVersion("1.4pre+0977tyugg")); Assert.assertEquals("1.4pre+", BasePainter.stripCommitFromVersion("1.4pre+")); Assert.assertEquals("1.4pre+foo+", BasePainter.stripCommitFromVersion("1.4pre+foo+")); Assert.assertEquals("1.4pre+foo+bar", BasePainter.stripCommitFromVersion("1.4pre+foo+bar")); Assert.assertEquals("1.4", BasePainter.stripCommitFromVersion("1.4+")); Assert.assertEquals("1.4", BasePainter.stripCommitFromVersion("1.4+foo+")); Assert.assertEquals("1.4", BasePainter.stripCommitFromVersion("1.4+foo+bar")); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000032213441742745030721 xustar00120 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/CubicTest.java 30 mtime=1552401893.070832758 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Cubi0000644000175000002070000000455613441742745034207 0ustar00jvanekmock00000000000000/* CubicTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.Cubic; import org.junit.Assert; import org.junit.Test; /** this class represents a cubic polynomial */ /* Part of NatCubic implementation, inspire by http://www.cse.unsw.edu.au/~lambert/*/ public class CubicTest { @Test public void cubicTest() { Cubic c1 = new Cubic(1, 2, 3, 4); Assert.assertTrue(new Float(1).equals(c1.a)); Assert.assertTrue(new Float(2).equals(c1.b)); Assert.assertTrue(new Float(3).equals(c1.c)); Assert.assertTrue(new Float(4).equals(c1.d)); Assert.assertTrue(new Float(586).equals(c1.eval(5))); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000033713441742745030727 xustar00133 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextWithWaterLevelTest.java 30 mtime=1552401893.072832754 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Text0000644000175000002070000001373213441742745034245 0ustar00jvanekmock00000000000000/* TextWithWaterLevelTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import org.junit.Assert; import org.junit.Test; public class TextWithWaterLevelTest { static final double firstLetterMiddleWidth = 0.1947565543; static final double firstLetterLowerHeight = 0.934210526; static final double secondLetterLeftWidth = 0.63670412; static final double secondLetterMiddleHeight = 0.723684211; static final double firstLetterUpperHeight = 0.43902439; static final double secondLetterRightWidth = 0.917602996; static final double secondLetterUpperHeight = 0.559210526; @Test public void setGetTest() { BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bi.createGraphics(); Font f1 = g2d.getFont().deriveFont(Font.ITALIC); Font f2 = g2d.getFont().deriveFont(Font.BOLD); String s = "Watter"; TextWithWaterLevel tw = new TextWithWaterLevel(s, f1); Assert.assertEquals(-1, tw.getHeight()); Assert.assertEquals(-1, tw.getWidth()); Assert.assertEquals(f1, tw.getFont()); Assert.assertNull(tw.getImg()); Assert.assertEquals(s, tw.getText()); Assert.assertEquals(Color.BLACK, tw.getTextOutline()); Assert.assertEquals(Color.blue, tw.getWaterColor()); Assert.assertEquals(Color.white, tw.getBgColor()); Assert.assertEquals(0, tw.getPercentageOfWater()); tw.setBgColor(Color.yellow); tw.setWaterColor(Color.orange); tw.setPercentageOfWater(20); Assert.assertEquals(Color.orange, tw.getWaterColor()); Assert.assertEquals(Color.yellow, tw.getBgColor()); Assert.assertEquals(20, tw.getPercentageOfWater()); } @Test public void getBackground() { TextWithWaterLevel ifc = getInstance(); ifc.setCachedPolygon(null); ifc.setPercentageOfWater(50); BufferedImage bic = ifc.getBackground(); int w = bic.getWidth(); int h = bic.getHeight(); Assert.assertEquals(Color.blue, new Color(bic.getRGB(w / 2, 2 * h / 3))); Assert.assertEquals(Color.white, new Color(bic.getRGB(w / 2, h / 3))); ifc.setCachedPolygon(null); ifc.setPercentageOfWater(5); bic = ifc.getBackground(); Assert.assertEquals(Color.white, new Color(bic.getRGB(w / 2, 2 * h / 3))); Assert.assertEquals(Color.white, new Color(bic.getRGB(w / 2, h / 3))); ifc.setCachedPolygon(null); ifc.setPercentageOfWater(95); bic = ifc.getBackground(); Assert.assertEquals(Color.blue, new Color(bic.getRGB(w / 2, 2 * h / 3))); Assert.assertEquals(Color.blue, new Color(bic.getRGB(w / 2, h / 3))); } private TextWithWaterLevel getInstance() { BufferedImage bi1 = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB); Font f = bi1.createGraphics().getFont().deriveFont(Font.BOLD, 130); TextWithWaterLevel ifc = new TextWithWaterLevel("O O", f); return ifc; } @Test public void cutToTest() { TextWithWaterLevel ifc = getInstance(); ifc.setPercentageOfWater(50); BufferedImage bic = ifc.getBackground(); int w = bic.getWidth(); int h = bic.getHeight(); bic = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); ifc.cutTo(bic.createGraphics(), 0, h); Assert.assertEquals(Color.blue, new Color(bic.getRGB((int) (w * firstLetterMiddleWidth), (int) (h * firstLetterLowerHeight)))); Assert.assertEquals(Color.blue, new Color(bic.getRGB((int) (w * secondLetterLeftWidth), (int) (h * secondLetterMiddleHeight)))); Assert.assertEquals(Color.white, new Color(bic.getRGB((int) (w * firstLetterMiddleWidth), (int) (h * firstLetterUpperHeight)))); Assert.assertEquals(Color.white, new Color(bic.getRGB((int) (w * secondLetterRightWidth), (int) (h * secondLetterUpperHeight)))); //well this should be acctually rgba 0,0,0,0 but somehow this was no passig //you can confirm with: //ImageFontCutterTest.save(bic, "halfFiledOus") Assert.assertEquals(new Color(0, 0, 0), new Color(bic.getRGB(137, 127))); Assert.assertEquals(new Color(0, 0, 0), new Color(bic.getRGB(137, 2))); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000033113441742745030721 xustar00127 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ControlCurveTest.java 30 mtime=1552401893.071832756 30 atime=1552402157.257253436 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Cont0000644000175000002070000003017413441742745034223 0ustar00jvanekmock00000000000000/* ControlCurveTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; /** This class represents a curve defined by a sequence of control points */ /* Part of NatCubic implementation, inspire by http://www.cse.unsw.edu.au/~lambert/*/ import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.ControlCurve; import java.awt.*; import org.junit.Assert; import org.junit.Test; public class ControlCurveTest { @Test public void setGetTests() { Polygon p1 = new Polygon(); Polygon p2 = new Polygon(); Polygon p3 = new Polygon(); ControlCurve cc = new ControlCurve(); Assert.assertNotNull(cc.getSourcePolygon()); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); Assert.assertTrue(cc.isWithPoints()); cc.setSourcePolygon(p1); Assert.assertNotNull(cc.getSourcePolygon()); Assert.assertEquals(p1, cc.getSourcePolygon()); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); Assert.assertTrue(cc.isWithPoints()); cc.setWithPoints(false); Assert.assertFalse(cc.isWithPoints()); cc = new ControlCurve(p2); Assert.assertNotNull(cc.getSourcePolygon()); Assert.assertEquals(p2, cc.getSourcePolygon()); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.setWithPoints(false); Assert.assertFalse(cc.isWithPoints()); cc.setSourcePolygon(p3); Assert.assertNotNull(cc.getSourcePolygon()); Assert.assertEquals(p3, cc.getSourcePolygon()); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.setWithPoints(false); Assert.assertFalse(cc.isWithPoints()); cc.setWithPoints(true); Assert.assertTrue(cc.isWithPoints()); } @Test public void sqrTest() { Assert.assertEquals(25, ControlCurve.sqr(5)); } static int[] xs = {0, 100, 100, 0}; static int[] ys = {0, 0, 100, 1000}; static ControlCurve getTestInstance() { ControlCurve cc = new ControlCurve(); cc.addPoint(xs[0], ys[0]); cc.addPoint(xs[1], ys[1]); cc.addPoint(xs[2], ys[2]); cc.addPoint(xs[3], ys[3]); return cc; } @Test public void selectPointTest() { ControlCurve cc = getTestInstance(); int i = cc.selectPoint(-50, -50); Assert.assertEquals(-1, i); i = cc.selectPoint(-3, 3); Assert.assertEquals(0, i); i = cc.selectPoint(97, 97); Assert.assertEquals(2, i); i = cc.selectPoint(100, 50); Assert.assertEquals(-1, i); } @Test public void addPoint() { ControlCurve cc = new ControlCurve(); Assert.assertEquals(0, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.addPoint(10, 10); Assert.assertEquals(1, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.addPoint(10, 10); Assert.assertEquals(2, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.addPoint(100, 100); Assert.assertEquals(3, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); } @Test public void setPointTest1() { ControlCurve cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.setSelection(-1); cc.setPoint(10, 10); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.setSelection(4); cc.setPoint(10, 10); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.setSelection(3); cc.setPoint(10, 20); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); Assert.assertEquals(20, cc.getSourcePolygon().ypoints[3]); Assert.assertEquals(10, cc.getSourcePolygon().xpoints[3]); } @Test public void setPointTest2() { ControlCurve cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.setPoint(-1, 10, 10); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.setPoint(4, 10, 10); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.setPoint(3, 10, 20); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); Assert.assertEquals(20, cc.getSourcePolygon().ypoints[3]); Assert.assertEquals(10, cc.getSourcePolygon().xpoints[3]); } @Test public void removePoint2() { ControlCurve cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.removePoint(-1); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.removePoint(4); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.removePoint(3); Assert.assertEquals(3, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); } public void removePoint1() { ControlCurve cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.setSelection(-1); cc.removePoint(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.setSelection(4); cc.removePoint(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); cc.setSelection(0); cc.removePoint(); Assert.assertEquals(3, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i + 1], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i + 1], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNull(cc.getResult()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000033013441742745030720 xustar00126 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/SplinesDefsTest.java 30 mtime=1552401893.081832735 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Spli0000644000175000002070000000623213441742745034225 0ustar00jvanekmock00000000000000/* SplinesDefsTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.SplinesDefs; import java.awt.Point; import java.awt.Polygon; import org.junit.Assert; import org.junit.Test; public class SplinesDefsTest { private static Point[] testArray = { new Point(0, 0), new Point(100, 0), new Point(100, 100), new Point(0, 100) }; @Test public void polygonizeControlPointsTest() { Polygon p = SplinesDefs.polygonizeControlPoints(testArray, 1d, 1d); Assert.assertTrue(p.contains(50, 50)); Assert.assertFalse(p.contains(150, 150)); Assert.assertFalse(p.contains(-50, -50)); p = SplinesDefs.polygonizeControlPoints(testArray, 0.5d, 0.5d); Assert.assertTrue(p.contains(20, 20)); Assert.assertFalse(p.contains(75, 75)); Assert.assertFalse(p.contains(-25, -25)); p = SplinesDefs.polygonizeControlPoints(testArray, 2d, 2d); Assert.assertTrue(p.contains(150, 150)); Assert.assertFalse(p.contains(250, 250)); Assert.assertFalse(p.contains(-50, -50)); } @Test public void testApi() { double x = 1d; Polygon[] p = {SplinesDefs.getMainLeaf(x, x), SplinesDefs.getMainLeaf(x, x), SplinesDefs.getSecondLeaf(x, x), }; for (Polygon polygon : p) { Assert.assertNotNull(polygon); Assert.assertTrue(polygon.npoints > 5); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000033313441742745030723 xustar00129 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubicClosedTest.java 30 mtime=1552401893.075832748 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatC0000644000175000002070000002414513441742745034146 0ustar00jvanekmock00000000000000/* NatCubicClosedTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.NatCubicClosed; import java.awt.Polygon; import org.junit.Assert; import org.junit.Test; public class NatCubicClosedTest { @Test public void setGetTests() { Polygon p1 = new Polygon(); p1.addPoint(10, 23); p1.addPoint(12, -31); NatCubicClosed cc = new NatCubicClosed(); Assert.assertNotNull(cc.getSourcePolygon()); Assert.assertNull(cc.getResult()); Exception ex = null; try { cc.calcualteAndSaveResult(); } catch (Exception eex) { ex = eex; } Assert.assertNotNull(ex); Assert.assertNull(cc.getResult()); Assert.assertTrue(cc.isWithPoints()); cc.setSourcePolygon(p1); Assert.assertNotNull(cc.getSourcePolygon()); Assert.assertEquals(p1, cc.getSourcePolygon()); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); Assert.assertTrue(cc.isWithPoints()); cc.setWithPoints(false); Assert.assertFalse(cc.isWithPoints()); cc.resetResult(); Assert.assertNull(cc.getResult()); } static int[] xs = {0, 100, 100, 0}; static int[] ys = {0, 0, 100, 1000}; static NatCubicClosed getTestInstance() { NatCubicClosed cc = new NatCubicClosed(); cc.addPoint(xs[0], ys[0]); cc.addPoint(xs[1], ys[1]); cc.addPoint(xs[2], ys[2]); cc.addPoint(xs[3], ys[3]); return cc; } @Test public void basicComputation() { NatCubicClosed b = new NatCubicClosed(); b.addPoint(10, 10); b.addPoint(50, 20); b.addPoint(-10, -10); b.calcualteAndSaveResult(); Assert.assertTrue(b.pts.npoints < b.result.npoints / 5); Assert.assertEquals(b.result.xpoints[0], b.result.xpoints[b.result.npoints - 1]); Assert.assertEquals(b.result.ypoints[0], b.result.ypoints[b.result.npoints - 1]); } @Test public void addPoint() { NatCubicClosed cc = new NatCubicClosed(); Assert.assertEquals(0, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); Exception ex = null; try { cc.calcualteAndSaveResult(); } catch (Exception eex) { ex = eex; } Assert.assertNotNull(ex); Assert.assertNull(cc.getResult()); cc.addPoint(10, 10); Assert.assertEquals(1, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); ex = null; try { cc.calcualteAndSaveResult(); } catch (Exception eex) { ex = eex; } Assert.assertNotNull(ex); Assert.assertNull(cc.getResult()); cc.addPoint(10, 10); Assert.assertEquals(2, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.addPoint(100, 100); Assert.assertEquals(3, cc.getSourcePolygon().npoints); Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); } @Test public void setPointTest1() { NatCubicClosed cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.setSelection(-1); cc.setPoint(10, 10); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.setSelection(4); cc.setPoint(10, 10); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.setSelection(3); cc.setPoint(10, 20); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); Assert.assertEquals(20, cc.getSourcePolygon().ypoints[3]); Assert.assertEquals(10, cc.getSourcePolygon().xpoints[3]); } @Test public void removePoint2() { NatCubicClosed cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.removePoint(-1); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.removePoint(4); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.removePoint(3); Assert.assertEquals(3, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); } public void removePoint1() { NatCubicClosed cc = getTestInstance(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.setSelection(-1); cc.removePoint(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.setSelection(4); cc.removePoint(); Assert.assertEquals(4, cc.getSourcePolygon().npoints); for (int i = 0; i < 4; i++) { Assert.assertEquals(ys[i], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i], cc.getSourcePolygon().xpoints[i]); } Assert.assertNotNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); cc.setSelection(0); cc.removePoint(); Assert.assertEquals(3, cc.getSourcePolygon().npoints); for (int i = 0; i < 3; i++) { Assert.assertEquals(ys[i + 1], cc.getSourcePolygon().ypoints[i]); Assert.assertEquals(xs[i + 1], cc.getSourcePolygon().xpoints[i]); } Assert.assertNull(cc.getResult()); cc.calcualteAndSaveResult(); Assert.assertNotNull(cc.getResult()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxH0000644000000000000000000000033013441742745030720 xustar00127 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainterTest.java 29 mtime=1552401893.06983276 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Erro0000644000175000002070000001116413441742745034225 0ustar00jvanekmock00000000000000/* ErrorPainterTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.ErrorPainter; import java.awt.Color; import java.awt.image.BufferedImage; import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; import net.sourceforge.jnlp.splashscreen.impls.DefaultSplashScreen2012; import org.junit.Assert; import org.junit.Test; public final class ErrorPainterTest { @Test public void interpolTest() { Assert.assertEquals(15, ErrorPainter.interpol(4, 2, 10, 20), 0.1d); Assert.assertEquals(-15, ErrorPainter.interpol(4, 2, -20, -10), 0.1d); Assert.assertEquals(30, ErrorPainter.interpol(2, 4, 10, 20), 0.1d); } @Test public void interpolColorTest() { Color c1 = new Color(0, 0, 0); Color c2 = new Color(200, 200, 200); Color c3 = new Color(100, 100, 100); Color c4 = ErrorPainter.interpolateColor(4, 2, c1, c2); Assert.assertEquals(c3, c4); } // public static void main(String[] a) { // Color c1 = new Color(250, 50, 0, 50); // Color c2 = new Color(0, 0, 250, 100); // for (int i = 0; i < 21; i++) { // Color q = ErrorPainter.interpolateColor(20, i, c1, c2); // System.out.println(q.toString()); // System.out.println(q.getAlpha()); // } // } @Test public void adjustForSizeTest() { ErrorPainter bp = new ErrorPainter(new DefaultSplashScreen2012(100, 100, SplashReason.APPLET)); bp.master.setSplashHeight(100); bp.master.setSplashWidth(100); bp.adjustForSize(100, 100); Assert.assertNotNull(bp.prerenderedStuff); BufferedImage i1 = bp.prerenderStill(); Assert.assertEquals(100, i1.getWidth()); Assert.assertEquals(100, i1.getHeight()); bp.adjustForSize(20, 20); Assert.assertNotNull(bp.prerenderedStuff); Assert.assertEquals(20, bp.prerenderedStuff.getWidth()); Assert.assertEquals(20, bp.prerenderedStuff.getHeight()); Assert.assertFalse(i1.getWidth() == bp.prerenderedStuff.getWidth()); Assert.assertFalse(i1.getHeight() == bp.prerenderedStuff.getHeight()); } @Test public void adjustForSizeTest2() { ErrorPainter bp = new ErrorPainter(new DefaultSplashScreen2012(0, 0, SplashReason.APPLET), false); Assert.assertNull(bp.prerenderedStuff); bp.master.setSplashHeight(10); bp.master.setSplashWidth(10); BufferedImage i1 = bp.prerenderStill(); Assert.assertEquals(10, i1.getWidth()); Assert.assertEquals(10, i1.getHeight()); bp.adjustForSize(20, 20); Assert.assertNotNull(bp.prerenderedStuff); Assert.assertEquals(20, bp.prerenderedStuff.getWidth()); Assert.assertEquals(20, bp.prerenderedStuff.getHeight()); Assert.assertFalse(i1.getWidth() == bp.prerenderedStuff.getWidth()); Assert.assertFalse(i1.getHeight() == bp.prerenderedStuff.getHeight()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/ErrorSplashScreenT0000644000000000000000000000013213441742745030543 xustar0030 mtime=1552401893.065832769 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashScreenTest.java0000644000175000002070000001444013441742745033012 0ustar00jvanekmock00000000000000/* SplashScreenTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen; import java.awt.BorderLayout; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import javax.swing.JDialog; import net.sourceforge.jnlp.JNLPSplashScreen; import net.sourceforge.jnlp.splashscreen.parts.InfoItem; import net.sourceforge.jnlp.splashscreen.parts.InformationElement; import org.junit.Assert; import org.junit.Test; public class ErrorSplashScreenTest extends JDialog { static int width = JNLPSplashScreen.DEF_WIDTH; static int height = JNLPSplashScreen.DEF_HEIGHT; static SplashErrorPanel panel; public ErrorSplashScreenTest() { setSize(width - getInsets().left - getInsets().right, height - getInsets().bottom - getInsets().top); // Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); // int x = (int) ((dimension.getWidth() - getWidth()) / 2); // int y = (int) ((dimension.getHeight() - getHeight()) / 2); //setLocation(x, y); setLocationRelativeTo(null); this.pack(); Exception ex = new Exception("Hi there"); panel = SplashUtils.getErrorSplashScreen(width, height, SplashUtils.SplashReason.JAVAWS, ex); InformationElement ie = new InformationElement(); ie.setHomepage("http://someones.org/amazing?page"); ie.setTitle("Testing information title"); ie.setvendor("IcedTea-Web team"); ie.addDescription("Testing null description"); ie.addDescription("tsting twoline des ...break\ncription of kind short", InfoItem.descriptionKindShort); panel.setInformationElement(ie); panel.setVersion("1.2-re45fdg"); setLayout(new BorderLayout()); getContentPane().add(panel.getSplashComponent(), BorderLayout.CENTER); addComponentListener(new ComponentListener() { @Override public void componentShown(ComponentEvent e) { } @Override public void componentResized(ComponentEvent e) { //panel.getSplashComponent().setSize(getWidth(), getHeight()); //panel.adjustForSize(getWidth(), getHeight()); } @Override public void componentMoved(ComponentEvent e) { } @Override public void componentHidden(ComponentEvent e) { } }); } @Test public void splashScreenTestsExists() { //to silence junit,and test is that thsi class was instantiated ;) Assert.assertTrue(true); } @Test public void splashScreenTestsPaint0() { //to silence junit,and test is that thsi class was instantiated ;) panel.setSplashWidth(width); panel.setSplashHeight(height); panel.adjustForSize(); BufferedImage buf = new BufferedImage(panel.getSplashWidth(), panel.getSplashHeight(), BufferedImage.TYPE_INT_ARGB); panel.setPercentage(0); panel.paintTo(buf.createGraphics()); //ImageFontCutterTest.save(buf,"e0"); } @Test public void splashScreenTestsPaint50() { //to silence junit,and test is that thsi class was instantiated ;) panel.setSplashWidth(width); panel.setSplashHeight(height); panel.adjustForSize(); BufferedImage buf = new BufferedImage(panel.getSplashWidth(), panel.getSplashHeight(), BufferedImage.TYPE_INT_ARGB); panel.setPercentage(50); panel.paintTo(buf.createGraphics()); // ImageFontCutterTest.save(buf,"e50"); } @Test public void splashScreenTestsPaint100() { //to silence junit,and test is that thsi class was instantiated ;) panel.setSplashWidth(width); panel.setSplashHeight(height); panel.adjustForSize(); BufferedImage buf = new BufferedImage(panel.getSplashWidth(), panel.getSplashHeight(), BufferedImage.TYPE_INT_ARGB); panel.setPercentage(100); panel.paintTo(buf.createGraphics()); // ImageFontCutterTest.save(buf,"e100"); } public static void main(String args[]) { ErrorSplashScreenTest app = new ErrorSplashScreenTest(); app.setSize(800, 600); app.setVisible(true); app.addWindowListener( new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); panel.setPercentage(30); //panel.startAnimation(); try { Thread.sleep(10000); } catch (Exception e) { } panel.stopAnimation(); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/SplashUtilsTest.ja0000644000000000000000000000013213441742745030517 xustar0030 mtime=1552401893.080832738 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashUtilsTest.java0000644000175000002070000002530613441742745031664 0ustar00jvanekmock00000000000000/* SplashUtils.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen; import java.lang.reflect.Field; import java.util.Collections; import java.util.HashMap; import java.util.Map; import net.sourceforge.jnlp.runtime.AppletEnvironment; import net.sourceforge.jnlp.runtime.AppletInstance; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.splashscreen.impls.*; import org.junit.Assert; import org.junit.Test; public class SplashUtilsTest { @Test public void determineCallerTest() { modifyRuntime(false); SplashPanel p1 = SplashUtils.getSplashScreen(100, 100); Assert.assertEquals(SplashUtils.SplashReason.APPLET, p1.getSplashReason()); modifyRuntime(true); SplashPanel p2 = SplashUtils.getSplashScreen(100, 100); Assert.assertEquals(SplashUtils.SplashReason.JAVAWS, p2.getSplashReason()); } @SuppressWarnings("unchecked") public static Map getEnvironment() throws Exception { Class[] classes = Collections.class.getDeclaredClasses(); Map env = System.getenv(); for (Class cl : classes) { if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) { Field field = cl.getDeclaredField("m"); field.setAccessible(true); Object obj = field.get(env); Map map = (Map) obj; return map; } } return null; } @SuppressWarnings("unchecked") public static void fakeEnvironment(Map newenv) throws Exception { Class[] classes = Collections.class.getDeclaredClasses(); Map env = System.getenv(); for (Class cl : classes) { if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) { Field field = cl.getDeclaredField("m"); field.setAccessible(true); Object obj = field.get(env); Map map = (Map) obj; map.clear(); map.putAll(newenv); } } } @Test public void testGetSplashScreen1() throws Exception { Map fake1 = new HashMap(); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.APPLET); Assert.assertTrue(sa instanceof DefaultSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS); Assert.assertTrue(sw instanceof DefaultSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } @Test public void testGetSplashScreen2() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.DEFAULT); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, SplashUtils.DEFAULT); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.APPLET); Assert.assertTrue(sa instanceof DefaultSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS); Assert.assertTrue(sw instanceof DefaultSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } @Test public void testGetSplashScreen3() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.NONE); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, SplashUtils.DEFAULT); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.APPLET); Assert.assertTrue(sa instanceof DefaultSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS); Assert.assertTrue(sw == null); } finally { fakeEnvironment(original); } } @Test public void testGetSplashScreen4() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.DEFAULT); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, SplashUtils.NONE); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.APPLET); Assert.assertTrue(sa == null); SplashPanel sw = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS); Assert.assertTrue(sw instanceof DefaultSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } @Test public void testGetSplashScreen5() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.NONE); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, SplashUtils.NONE); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.APPLET); Assert.assertTrue(sa == null); SplashPanel sw = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS); Assert.assertTrue(sw == null); } finally { fakeEnvironment(original); } } @Test public void testGetSplashScreen6() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.DEFAULT); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, "fgdthyfjtuk"); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.APPLET); Assert.assertTrue(sa instanceof DefaultSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS); Assert.assertTrue(sw instanceof DefaultSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } @Test public void testGetSplashScreen7() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, "egtrutkyukl"); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.APPLET); Assert.assertTrue(sa instanceof DefaultSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS); Assert.assertTrue(sw instanceof DefaultSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } static void modifyRuntime(boolean b) { try{ setStatic(JNLPRuntime.class.getDeclaredField("isWebstartApplication"), b); }catch(Exception ex){ throw new RuntimeException(ex); } } static void setStatic(Field field, Object newValue) throws Exception { field.setAccessible(true); field.set(null, newValue); } @Test public void assertNulsAreOkInShow() { SplashUtils.showError(null, (AppletEnvironment)null); SplashUtils.showError(null, (AppletInstance)null); SplashUtils.showError(null, (SplashController)null); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/ErrorSplashUtilsTe0000644000000000000000000000013213441742745030571 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashUtilsTest.java0000644000175000002070000002235613441742745032700 0ustar00jvanekmock00000000000000/* SplashUtils.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen; import java.util.HashMap; import java.util.Map; import net.sourceforge.jnlp.splashscreen.impls.*; import org.junit.Assert; import org.junit.Test; public class ErrorSplashUtilsTest { private void fakeEnvironment(Map original) throws Exception { SplashUtilsTest.fakeEnvironment(original); } private Map getEnvironment() throws Exception { return SplashUtilsTest.getEnvironment(); } @Test public void determineCallerTest() { SplashUtilsTest.modifyRuntime(false); SplashPanel p1 = SplashUtils.getErrorSplashScreen(100, 100,null); Assert.assertEquals(SplashUtils.SplashReason.APPLET, p1.getSplashReason()); SplashUtilsTest.modifyRuntime(true); SplashPanel p2 = SplashUtils.getErrorSplashScreen(100, 100,null); Assert.assertEquals(SplashUtils.SplashReason.JAVAWS, p2.getSplashReason()); } @Test public void testgetErrorSplashScreen1() throws Exception { Map fake1 = new HashMap(); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.APPLET, null); Assert.assertTrue(sa instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS, new Exception("oj")); Assert.assertTrue(sw instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } @Test public void testgetErrorSplashScreen2() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.DEFAULT); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, SplashUtils.DEFAULT); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.APPLET, new Exception("oj")); Assert.assertTrue(sa instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS, null); Assert.assertTrue(sw instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } @Test public void testgetErrorSplashScreen3() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.NONE); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, SplashUtils.DEFAULT); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.APPLET, null); Assert.assertTrue(sa instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS, new Exception("oj")); Assert.assertTrue(sw == null); } finally { fakeEnvironment(original); } } @Test public void testgetErrorSplashScreen4() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.DEFAULT); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, SplashUtils.NONE); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.APPLET, new Exception("oj")); Assert.assertTrue(sa == null); SplashPanel sw = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS, new Exception("oj")); Assert.assertTrue(sw instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } @Test public void testgetErrorSplashScreen5() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.NONE); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, SplashUtils.NONE); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.APPLET, null); Assert.assertTrue(sa == null); SplashPanel sw = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS, null); Assert.assertTrue(sw == null); } finally { fakeEnvironment(original); } } @Test public void testgetErrorSplashScreen6() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, SplashUtils.DEFAULT); fake1.put(SplashUtils.ICEDTEA_WEB_PLUGIN_SPLASH, "fgdthyfjtuk"); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.APPLET, new Exception("oj")); Assert.assertTrue(sa instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS, new Exception("oj")); Assert.assertTrue(sw instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } @Test public void testgetErrorSplashScreen7() throws Exception { Map fake1 = new HashMap(); fake1.put(SplashUtils.ICEDTEA_WEB_SPLASH, "egtrutkyukl"); Map original = getEnvironment(); Assert.assertNotNull(original); try { fakeEnvironment(fake1); SplashPanel sa = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.APPLET, null); Assert.assertTrue(sa instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sa.getSplashReason() == SplashUtils.SplashReason.APPLET); SplashPanel sw = SplashUtils.getErrorSplashScreen(100, 100, SplashUtils.SplashReason.JAVAWS, null); Assert.assertTrue(sw instanceof DefaultErrorSplashScreen2012); Assert.assertTrue(sw.getSplashReason() == SplashUtils.SplashReason.JAVAWS); } finally { fakeEnvironment(original); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/security0000644000000000000000000000013213441742745024170 xustar0030 mtime=1552401893.068832762 30 atime=1552410887.112183445 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/0000755000175000002070000000000013441742745025055 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/PaxHeaders.7406/policyeditor0000644000000000000000000000013013441742745026674 xustar0028 mtime=1552401893.0988327 30 atime=1552410887.112183445 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/0000755000175000002070000000000013441742745027563 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEdi0000644000000000000000000000031113441742745030556 xustar00113 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorParsingTest.java 28 mtime=1552401893.0988327 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorParsingTest.j0000644000175000002070000003251213441742745034533 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import java.io.File; import java.util.Collection; import java.util.Collections; import java.util.Map; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.PlainTextFormatter; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import sun.security.provider.PolicyParser; public class PolicyEditorParsingTest { private static final Collection EMPTY_PRINCIPALS = Collections.emptyList(); private static final String EXAMPLE_CODEBASE = "http://example.com"; private static final PolicyIdentifier DEFAULT_IDENTIFIER = new PolicyIdentifier(null, EMPTY_PRINCIPALS, null); private static final PolicyIdentifier EXAMPLE_IDENTIFIER = new PolicyIdentifier(null, EMPTY_PRINCIPALS, EXAMPLE_CODEBASE); private File file; private PolicyFileModel policyFileModel = new PolicyFileModel(); private Map permissions; private static final String LINEBREAK = PlainTextFormatter.getLineSeparator(); private static final String READ_PERMISSION = "permission java.io.FilePermission \"${user.home}\", \"read\";"; private static final String WRITE_PERMISSION = "permission java.io.FilePermission \"${user.home}\", \"write\";"; private static final String COMMENT_HEADER = "/* TEST COMMENT */" + LINEBREAK; private static final String NORMAL_POLICY = "grant {" + LINEBREAK + "\t" + READ_PERMISSION + LINEBREAK + "};" + LINEBREAK; private static final String NORMAL_POLICY_CRLF = "grant {" + "\r\n" + "\t" + READ_PERMISSION + "\r\n" + "};" + "\r\n"; private static final String NORMAL_POLICY_LF = "grant {" + "\n" + "\t" + READ_PERMISSION + "\n" + "};" + "\n"; private static final String NORMAL_POLICY_MIXED_ENDINGS = "grant {" + "\n\n" + "\t" + READ_PERMISSION + "\r\n" + "};" + "\n"; private static final String NORMAL_POLICY_WITH_HEADER = COMMENT_HEADER + NORMAL_POLICY; private static final String CODEBASE_POLICY = "grant codeBase \"http://example.com\" {" + LINEBREAK + "\t" + READ_PERMISSION + LINEBREAK + "};" + LINEBREAK; private static final String MULTIPLE_PERMISSION_POLICY = "grant {" + LINEBREAK + "\t" + READ_PERMISSION + LINEBREAK + "\t" + WRITE_PERMISSION + LINEBREAK + "};" + LINEBREAK; private static final String COMMENT_BLOCKED_PERMISSION = "grant {" + LINEBREAK + "\t/*" + READ_PERMISSION + "*/" + LINEBREAK + "};" + LINEBREAK; private static final String COMMENT_BLOCKED_POLICY = "/*" + NORMAL_POLICY + "*/" + LINEBREAK; private static final String COMMENTED_PERMISSION = "grant {" + LINEBREAK + "\t//" + READ_PERMISSION + LINEBREAK + "};" + LINEBREAK; private static final String COMMENT_AFTER_PERMISSION = "grant {" + LINEBREAK + "\t" + READ_PERMISSION + " // comment" + LINEBREAK + "};" + LINEBREAK; private static final String MISSING_WHITESPACE_POLICY = "grant { " + READ_PERMISSION + " };"; private static final String MULTIPLE_PERMISSIONS_PER_LINE = "grant {" + LINEBREAK + "\t" + READ_PERMISSION + " " + WRITE_PERMISSION + LINEBREAK + "};" + LINEBREAK; @Before public void createTempFile() throws Exception { file = File.createTempFile("PolicyEditor", ".policy"); file.deleteOnExit(); } private void setupTest(final String policyContents, final PolicyIdentifier identifier) throws Exception { FileUtils.saveFile(policyContents, file); policyFileModel = new PolicyFileModel(file.getCanonicalFile()); policyFileModel.openAndParsePolicyFile(); policyFileModel.addIdentifier(DEFAULT_IDENTIFIER); policyFileModel.addIdentifier(identifier); permissions = policyFileModel.getCopyOfPermissions().get(identifier); } @Test public void testNormalPolicy() throws Exception { setupTest(NORMAL_POLICY, DEFAULT_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testNormalPolicyWithCRLFEndings() throws Exception { // This is the same test as testNormalPolicy on systems where the line separator is \r\n setupTest(NORMAL_POLICY_CRLF, DEFAULT_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testNormalPolicyWithLFEndings() throws Exception { // This is the same test as testNormalPolicy on systems where the line separator is \n setupTest(NORMAL_POLICY_LF, DEFAULT_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testNormalPolicyWithMixedEndings() throws Exception { // This is the same test as testNormalPolicy on systems where the line separator is \n setupTest(NORMAL_POLICY_MIXED_ENDINGS, DEFAULT_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testCommentHeaders() throws Exception { setupTest(COMMENT_HEADER, DEFAULT_IDENTIFIER); for (final PolicyEditorPermissions perm : permissions.keySet()) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } @Test public void testCommentBlockedPermission() throws Exception { setupTest(COMMENT_BLOCKED_PERMISSION, DEFAULT_IDENTIFIER); for (final PolicyEditorPermissions perm : permissions.keySet()) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } @Test public void testCommentBlockedPolicy() throws Exception { setupTest(COMMENT_BLOCKED_POLICY, DEFAULT_IDENTIFIER); for (final PolicyEditorPermissions perm : permissions.keySet()) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } @Test public void testCommentedLine() throws Exception { setupTest(COMMENTED_PERMISSION, DEFAULT_IDENTIFIER); for (final PolicyEditorPermissions perm : permissions.keySet()) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } @Test public void testMultiplePermissions() throws Exception { setupTest(MULTIPLE_PERMISSION_POLICY, DEFAULT_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); assertTrue("Permissions should include WRITE_LOCAL_FILES", permissions.get(PolicyEditorPermissions.WRITE_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES) && !perm.equals(PolicyEditorPermissions.WRITE_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testMultiplePermissionsPerLine() throws Exception { setupTest(MULTIPLE_PERMISSIONS_PER_LINE, DEFAULT_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); assertTrue("Permissions should include WRITE_LOCAL_FILES", permissions.get(PolicyEditorPermissions.WRITE_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES) && !perm.equals(PolicyEditorPermissions.WRITE_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testMissingWhitespace() throws Exception { setupTest(MISSING_WHITESPACE_POLICY, DEFAULT_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testPolicyWithCodebase() throws Exception { setupTest(CODEBASE_POLICY, EXAMPLE_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testCodebaseTrailingSlashesDoNotMatch() throws Exception { // note the trailing '/' - looks like the same URL but is not. JDK PolicyTool considers these as // different codeBases, so so does PolicyEditor setupTest(CODEBASE_POLICY, EXAMPLE_IDENTIFIER); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testCommentAfterPermission() throws Exception { setupTest(COMMENT_AFTER_PERMISSION, DEFAULT_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } @Test public void testNormalPolicyWithHeader() throws Exception { setupTest(NORMAL_POLICY_WITH_HEADER, DEFAULT_IDENTIFIER); assertTrue("Permissions should include READ_LOCAL_FILES", permissions.get(PolicyEditorPermissions.READ_LOCAL_FILES)); for (final PolicyEditorPermissions perm : permissions.keySet()) { if (!perm.equals(PolicyEditorPermissions.READ_LOCAL_FILES)) { assertFalse("Permission " + perm + " should not be granted", permissions.get(perm)); } } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/Permissio0000644000000000000000000000013213441742745030650 xustar0030 mtime=1552401893.064832771 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PermissionTypeTest.java0000644000175000002070000000453013441742745034262 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import static org.junit.Assert.assertTrue; import org.junit.Test; public class PermissionTypeTest { @Test public void testFromString() throws Exception { final PermissionType file = PermissionType.fromString("java.io.FilePermission"); final PermissionType none = PermissionType.fromString(""); final PermissionType garbage = PermissionType.fromString("garbagedata"); assertTrue("java.io.FilePermission should match FILE_PERMISSION", file.equals(PermissionType.FILE_PERMISSION)); assertTrue("empty string should match NONE", none.equals(PermissionType.NONE)); assertTrue("nonexistent target should match NONE", garbage.equals(PermissionType.NONE)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEdi0000644000000000000000000000013213441742745030557 xustar0030 mtime=1552401893.067832765 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java0000644000175000002070000005707713441742745033714 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import static net.sourceforge.jnlp.security.policyeditor.PolicyEditor.identifierFromCodebase; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.util.optionparser.OptionParser; import net.sourceforge.jnlp.util.optionparser.UnevenParameterException; import org.junit.Before; import org.junit.Test; import sun.security.provider.PolicyParser; public class PolicyEditorTest { private String tempFilePath; private PolicyEditor editor; @Before public void setNewTempfile() throws Exception { tempFilePath = File.createTempFile("policyeditor", null).getCanonicalPath(); editor = new PolicyEditor(tempFilePath); editor.openPolicyFileSynchronously(); } @Test public void testInitialCodebase() throws Exception { final Collection initialCodebases = editor.getCodebases(); assertTrue("Editor should have one codebase to begin with", initialCodebases.size() == 1); assertTrue("Editor's initial codebase should be \"\" (empty string)", initialCodebases.toArray(new String[initialCodebases.size()])[0].equals("")); } @Test public void testAddCodebase() throws Exception { final String urlString = "http://example.com"; final PolicyIdentifier identifier = identifierFromCodebase(urlString); editor.addNewEntry(identifier); final Collection codebases = editor.getCodebases(); assertTrue("Editor should have default codebase", codebases.contains("")); assertTrue("Editor should have http://example.com", codebases.contains(urlString)); assertTrue("Editor should only have two codebases", codebases.size() == 2); } @Test public void addMultipleCodebases() throws Exception { final Set toAdd = new HashSet<>(); toAdd.add("http://example.com"); toAdd.add("http://icedtea.classpath.org"); for (final String cb : toAdd) { editor.addNewEntry(identifierFromCodebase(cb)); } final Collection codebases = editor.getCodebases(); assertTrue("Editor should have default codebase", codebases.contains("")); for (final String codebase : toAdd) { assertTrue("Editor should have " + codebase, codebases.contains(codebase)); } } @Test public void testAddInvalidUrlCodebase() throws Exception { final String invalidUrl = "url.com"; // missing protocol -> invalid editor.addNewEntry(identifierFromCodebase(invalidUrl)); final Collection codebases = editor.getCodebases(); assertTrue("Editor should have default codebase", codebases.contains("")); assertTrue("Editor should only have default codebase", codebases.size() == 1); } @Test public void testRemoveCodebase() throws Exception { final String urlString = "http://example.com"; final PolicyIdentifier identifier = identifierFromCodebase(urlString); editor.addNewEntry(identifier); final Collection codebases = editor.getCodebases(); assertTrue("Editor should have default codebase", codebases.contains("")); assertTrue("Editor should have http://example.com", codebases.contains(urlString)); assertEquals("Editor should only have two codebases", codebases.size(), 2); editor.removeIdentifier(identifier); final Collection afterRemove = editor.getCodebases(); assertTrue("Editor should have default codebase", afterRemove.contains("")); assertFalse("Editor should not have http://example.com. Contained: " + afterRemove, afterRemove.contains(urlString)); assertEquals("Editor should only have one codebase", afterRemove.size(), 1); } @Test public void testRenameCodebase() throws Exception { final String originalUrl = "http://example.com"; final String renamedUrl = "http://example.com/example"; final PolicyEditorPermissions clipBoard = PolicyEditorPermissions.CLIPBOARD; final PolicyIdentifier identifier = identifierFromCodebase(originalUrl); editor.addNewEntry(identifier); editor.setPermission(identifier, clipBoard, Boolean.TRUE); final Collection beforeRenameCodebases = editor.getCodebases(); assertTrue("Editor should contain " + originalUrl, beforeRenameCodebases.contains(originalUrl)); assertTrue(originalUrl + " should have " + clipBoard, editor.getPermissions(identifier).get(clipBoard)); editor.modifyCodebase(identifier, renamedUrl); final Collection afterRenamedCodebases = editor.getCodebases(); assertFalse("Editor should not contain old codebase: " + originalUrl, afterRenamedCodebases.contains(originalUrl)); assertTrue("Editor should contain new codebase name: " + renamedUrl, afterRenamedCodebases.contains(renamedUrl)); final PolicyIdentifier renamedIdentifier = identifierFromCodebase(renamedUrl); assertTrue("Renamed " + renamedUrl + " should have " + clipBoard, editor.getPermissions(renamedIdentifier).get(clipBoard)); } @Test public void testCopyPasteCodebase() throws Exception { final String copyUrl = "http://example.com"; final String pasteUrl = "http://example.com/example"; final PolicyEditorPermissions clipBoard = PolicyEditorPermissions.CLIPBOARD; final PolicyIdentifier identifier = identifierFromCodebase(copyUrl); editor.addNewEntry(identifier); editor.setPermission(identifier, clipBoard, Boolean.TRUE); final Collection beforePasteCodebases = editor.getCodebases(); assertTrue("Editor should contain original codebase: " + copyUrl, beforePasteCodebases.contains(copyUrl)); assertTrue(copyUrl + " should have " + clipBoard, editor.getPermissions(identifier).get(clipBoard)); editor.copyEntry(identifier); final PolicyIdentifier pastedIdentifier = identifierFromCodebase(pasteUrl); editor.pasteEntry(pastedIdentifier); final Collection afterPasteCodebases = editor.getCodebases(); assertTrue("Editor should still contain original codebase: " + copyUrl, afterPasteCodebases.contains(copyUrl)); assertTrue("Editor should also contain pasted codebase:" + pasteUrl, afterPasteCodebases.contains(pasteUrl)); assertTrue(copyUrl + " should have " + clipBoard, editor.getPermissions(identifier).get(clipBoard)); assertTrue(pasteUrl + " should have " + clipBoard, editor.getPermissions(pastedIdentifier).get(clipBoard)); } @Test public void testAddCustomPermissionNoActions() throws Exception { final String codebase = "http://example.com"; final CustomPolicyViewer.DisplayablePermission customPermission = new CustomPolicyViewer.DisplayablePermission("java.lang.RuntimePermission", "createClassLoader"); final PolicyIdentifier identifier = identifierFromCodebase(codebase); editor.addCustomPermission(identifier, customPermission); assertTrue("Editor custom permissions should include " + customPermission + " but did not", editor.getCustomPermissions(identifier).contains(customPermission)); } @Test public void testAddCustomPermissionEmptyActions() throws Exception { final String codebase = "http://example.com"; final CustomPolicyViewer.DisplayablePermission customPermission = new CustomPolicyViewer.DisplayablePermission("java.lang.RuntimePermission", "createClassLoader", ""); final PolicyIdentifier identifier = identifierFromCodebase(codebase); editor.addCustomPermission(identifier, customPermission); assertTrue("Editor custom permissions should include " + customPermission + " but did not", editor.getCustomPermissions(identifier).contains(customPermission)); } @Test public void testClearCustomPermissionsNoActions() throws Exception { final String codebase = "http://example.com"; final CustomPolicyViewer.DisplayablePermission customPermission = new CustomPolicyViewer.DisplayablePermission("java.lang.RuntimePermission", "createClassLoader"); final PolicyIdentifier identifier = identifierFromCodebase(codebase); editor.addCustomPermission(identifier, customPermission); assertTrue("Editor custom permissions should include " + customPermission + " but did not", editor.getCustomPermissions(identifier).contains(customPermission)); editor.clearCustomPermissions(identifier); assertEquals(0, editor.getCustomPermissions(identifier).size()); } @Test public void testClearCustomPermissionsEmptyActions() throws Exception { final String codebase = "http://example.com"; final CustomPolicyViewer.DisplayablePermission customPermission = new CustomPolicyViewer.DisplayablePermission("java.lang.RuntimePermission", "createClassLoader", ""); final PolicyIdentifier identifier = identifierFromCodebase(codebase); editor.addCustomPermission(identifier, customPermission); assertTrue("Editor custom permissions should include " + customPermission + " but did not", editor.getCustomPermissions(identifier).contains(customPermission)); editor.clearCustomPermissions(identifier); assertEquals(0, editor.getCustomPermissions(identifier).size()); } @Test public void testReturnedCodebasesIsCopy() throws Exception { final Collection original = editor.getCodebases(); original.add("some invalid value"); original.remove(""); final Collection second = editor.getCodebases(); assertTrue("Editor should have default codebase", second.contains("")); assertEquals("Editor should only have default codebase", 1, second.size()); } @Test public void testReturnedPermissionsMapIsCopy() throws Exception { final Map original = editor.getPermissions(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { original.put(perm, true); } final Map second = editor.getPermissions(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); for (final Map.Entry entry : second.entrySet()) { assertFalse("Permission " + entry.getKey() + " should be false", entry.getValue()); } } @Test public void testReturnedCustomPermissionsSetIsCopy() throws Exception { final Collection original = editor.getCustomPermissions(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); assertTrue("There should not be any custom permissions to start", original.isEmpty()); original.add(new CustomPolicyViewer.DisplayablePermission("java.io.FilePermission", "*", "write")); final Collection second = editor.getCustomPermissions(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); assertTrue("The custom permission should not have been present", second.isEmpty()); } @Test public void testDefaultPermissionsAllFalse() throws Exception { final Map defaultMap = editor.getPermissions(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); final PolicyIdentifier exampleIdentifier = identifierFromCodebase("http://example.com"); editor.addNewEntry(exampleIdentifier); final Map addedMap = editor.getPermissions(exampleIdentifier); for (final Map.Entry entry : defaultMap.entrySet()) { assertFalse("Permission " + entry.getKey() + " should be false", entry.getValue()); } for (final Map.Entry entry : addedMap.entrySet()) { assertFalse("Permission " + entry.getKey() + " should be false", entry.getValue()); } } @Test public void testAllPermissionsRepresented() throws Exception { final Map defaultMap = editor.getPermissions(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); final PolicyIdentifier exampleIdentifier = identifierFromCodebase("http://example.com"); editor.addNewEntry(exampleIdentifier); final Map addedMap = editor.getPermissions(exampleIdentifier); assertTrue("Default codebase permissions keyset should be the same size as enum values set", defaultMap.keySet().size() == PolicyEditorPermissions.values().length); assertTrue("Added codebase permissions keyset should be the same size as enum values set", addedMap.keySet().size() == PolicyEditorPermissions.values().length); for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { assertTrue("Permission " + perm + " should be in the editor's codebase keyset", defaultMap.keySet().contains(perm)); } for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { assertTrue("Permission " + perm + " should be in the editor's codebase keyset", addedMap.keySet().contains(perm)); } } @Test public void testCodebaseTrailingSlashesDoNotMatch() throws Exception { final Set toAdd = new HashSet<>(); toAdd.add("http://example.com"); toAdd.add("http://example.com/"); for (final String cb : toAdd) { editor.addNewEntry(identifierFromCodebase(cb)); } final Collection codebases = editor.getCodebases(); assertTrue("Editor should have default codebase", codebases.contains("")); for (final String codebase : toAdd) { assertTrue("Editor should have " + codebase, codebases.contains(codebase)); } } @Test public void testFilePathArgumentMainArg() { String[] args = new String[] { "foo" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); String result = PolicyEditor.getFilePathArgument(optionParser); assertTrue(result.equals("foo")); } @Test public void testFilePathArgumentMainArg2() { String[] args = new String[] { "-codebase", "http://example.com", "foo" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); String result = PolicyEditor.getFilePathArgument(optionParser); assertTrue(result.equals("foo")); } @Test public void testFilePathArgumentFileSwitch() { String[] args = new String[] { "-file", "foo" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); String result = PolicyEditor.getFilePathArgument(optionParser); assertTrue(result.equals("foo")); } @Test public void testFilePathArgumentFileSwitch2() { String[] args = new String[] { "-codebase", "http://example.com", "-file", "foo" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); String result = PolicyEditor.getFilePathArgument(optionParser); assertTrue(result.equals("foo")); } @Test public void testFilePathArgumentDefaultFileSwitch() throws URISyntaxException { String[] args = new String[] { "-defaultfile" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); String result = PolicyEditor.getFilePathArgument(optionParser); assertTrue(result.equals(new File(new URI(PathsAndFiles.JAVA_POLICY.getFullPath())).getAbsolutePath())); } @Test public void testFilePathArgumentDefaultFileSwitch2() throws URISyntaxException { String[] args = new String[] { "-codebase", "http://example.com", "-defaultfile" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); String result = PolicyEditor.getFilePathArgument(optionParser); assertTrue(result.equals(new File(new URI(PathsAndFiles.JAVA_POLICY.getFullPath())).getAbsolutePath())); } @Test(expected = IllegalArgumentException.class) public void testMainArgAndFileSwitch() { String[] args = new String[] { "-file", "foo", "bar" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getFilePathArgument(optionParser); } @Test(expected = IllegalArgumentException.class) public void testMainArgAndFileSwitch2() { String[] args = new String[] { "bar", "-file", "foo" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getFilePathArgument(optionParser); } @Test(expected = IllegalArgumentException.class) public void testDefaultFileSwitchAndMainArg() { String[] args = new String[] { "-defaultfile", "foo" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getFilePathArgument(optionParser); } @Test(expected = IllegalArgumentException.class) public void testDefaultFileSwitchAndMainArg2() { String[] args = new String[] { "foo", "-defaultfile" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getFilePathArgument(optionParser); } @Test(expected = IllegalArgumentException.class) public void testDefaultFileSwitchAndMainArgAndFileSwitch() { String[] args = new String[] { "-defaultfile", "-file", "foo" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getFilePathArgument(optionParser); } @Test(expected = IllegalArgumentException.class) public void testDefaultFileSwitchAndMainArgAndFileSwitch2() { String[] args = new String[] { "-file", "foo", "-defaultfile" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getFilePathArgument(optionParser); } @Test public void testGetCodebaseArgument() { String[] args = new String[] { "-codebase", "http://example.com" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); String result = PolicyEditor.getCodebaseArgument(optionParser); assertTrue(result.equals("http://example.com")); } @Test(expected = IllegalArgumentException.class) public void testGetCodebaseArgument2() { String[] args = new String[] { "-codebase", "" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getCodebaseArgument(optionParser); } @Test(expected = IllegalArgumentException.class) public void testGetCodebaseArgument3() { String[] args = new String[] { "-codebase", "example.com" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getCodebaseArgument(optionParser); } @Test(expected = IllegalArgumentException.class) public void testGetCodebaseArgumentWhenNotProvided() { String[] args = new String[] { "-codebase" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); String result = PolicyEditor.getCodebaseArgument(optionParser); } @Test public void testGetPrincipalsArgument() { String[] args = new String[] { "-principals", "aa=bb" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); Set result = PolicyEditor.getPrincipalsArgument(optionParser); assertTrue(result.size() == 1); assertTrue(result.contains(new PolicyParser.PrincipalEntry("aa", "bb"))); } @Test public void testGetPrincipalsArgument2() { String[] args = new String[] { "-principals", "aa", "bb" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); Set result = PolicyEditor.getPrincipalsArgument(optionParser); assertTrue(result.size() == 1); assertTrue(result.contains(new PolicyParser.PrincipalEntry("aa", "bb"))); } @Test(expected = UnevenParameterException.class) public void testGetPrincipalsArgumentWhenUnevenArgumentsProvided() { String[] args = new String[] { "-principals", "aa=bb", "cc" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getPrincipalsArgument(optionParser); } @Test public void testGetPrincipalsArgumentWhenNotProvided() { String[] args = new String[] { "-principals" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); Set result = PolicyEditor.getPrincipalsArgument(optionParser); assertTrue(result.isEmpty()); } @Test public void testGetSignedByArgument() { String[] args = new String[] { "-signedby", "foo" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); String result = PolicyEditor.getSignedByArgument(optionParser); assertTrue(result.equals("foo")); } @Test(expected = IllegalArgumentException.class) public void testGetSignedByArgumentWhenNotProvided() { String[] args = new String[] { "-signedby" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); PolicyEditor.getSignedByArgument(optionParser); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyFil0000644000000000000000000000013213441742745030570 xustar0030 mtime=1552401893.070832758 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyFileModelTest.java0000644000175000002070000003436613441742745034322 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import net.sourceforge.jnlp.util.FileUtils; import org.junit.Before; import org.junit.Test; import sun.security.provider.PolicyParser; import java.io.File; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; /** * See PolicyEditorParsingTest, which covers PolicyFileModel#openAndParsePolicyFile(), * PolicyFileModel.parsePolicyString(), PolicyFileModel#savePolicyFile() */ public class PolicyFileModelTest { private static final String EXAMPLE_CODEBASE = "http://example.com"; private static final String EXAMPLE_CA = "someCA"; private static final Collection EMPTY_PRINCIPALS = Collections.emptyList(); private static final PolicyIdentifier EXAMPLE_IDENTIFIER = new PolicyIdentifier(EXAMPLE_CA, EMPTY_PRINCIPALS, EXAMPLE_CODEBASE); private static final PolicyIdentifier INVALID_IDENTIFIER = new PolicyIdentifier(null, EMPTY_PRINCIPALS, "invalidURL"); private static final String LINEBREAK = System.getProperty("line.separator"); private static final String EXAMPLE_POLICY_1 = "grant {" + LINEBREAK + "\tpermission some.java.permission \"somePermission\";" + LINEBREAK + "};" + LINEBREAK; private static final String EXAMPLE_POLICY_2 = "grant {" + LINEBREAK + "\tpermission some.other.java.permission \"somePermission\";" + LINEBREAK + "};" + LINEBREAK; private String tempFilePath; private PolicyFileModel model; @Before public void setNewTempfile() throws Exception { tempFilePath = File.createTempFile("policyeditor", null).getCanonicalPath(); model = new PolicyFileModel(); model.setFile(new File(tempFilePath)); } @Test public void testSetGetFile() throws Exception { assertEquals(new File(tempFilePath), model.getFile()); } @Test public void testSetFileNull() throws Exception { model.setFile(null); assertEquals(null, model.getFile()); } @Test(expected = NullPointerException.class) public void testOpenAndParsePolicyFileWithFileNull() throws Exception { model.setFile(null); assertEquals(null, model.getFile()); model.openAndParsePolicyFile(); } @Test(expected = NullPointerException.class) public void testSavePolicyFileWithFileNull() throws Exception { model.setFile(null); assertEquals(null, model.getFile()); model.savePolicyFile(); } @Test public void testHasChangedIsFalseInitially() throws Exception { assertFalse("Model should not report changes made initially", model.hasChanged()); } @Test public void testFileHasChangedWithChange() throws Exception { assertFalse("Model should not report changes made initially", model.hasChanged()); FileUtils.saveFile(EXAMPLE_POLICY_1, new File(tempFilePath)); model.openAndParsePolicyFile(); FileUtils.saveFile(EXAMPLE_POLICY_2, new File(tempFilePath)); assertTrue("File should be marked changed after being externally modified", model.hasChanged()); } @Test public void testAddIdentifier() throws Exception { assertEquals("Should not have any identifiers initially", Collections.emptySet(), model.getIdentifiers()); model.addIdentifier(EXAMPLE_IDENTIFIER); assertEquals("Should have the identifier", Collections.singleton(EXAMPLE_IDENTIFIER), model.getIdentifiers()); } @Test public void testRemoveIdentifier() throws Exception { assertEquals("Should not have any identifiers initially", Collections.emptySet(), model.getIdentifiers()); model.addIdentifier(EXAMPLE_IDENTIFIER); assertEquals("Should have the identifier " + EXAMPLE_IDENTIFIER, Collections.singleton(EXAMPLE_IDENTIFIER), model.getIdentifiers()); model.removeIdentifier(EXAMPLE_IDENTIFIER); assertEquals("Should not have any identifiers after removed", Collections.emptySet(), model.getIdentifiers()); } @Test public void testClearPermissions() throws Exception { assertEquals("Should not have any identifiers initially", Collections.emptySet(), model.getIdentifiers()); model.addIdentifier(EXAMPLE_IDENTIFIER); final PolicyEditorPermissions permission = PolicyEditorPermissions.CLIPBOARD; model.setPermission(EXAMPLE_IDENTIFIER, permission, true); assertTrue("Expected permission " + permission, model.getPermission(EXAMPLE_IDENTIFIER, permission)); model.clearPermissions(); assertFalse("Expected no permission " + permission, model.getPermission(EXAMPLE_IDENTIFIER, permission)); assertEquals("Expected no permissions ", Collections.>emptyMap(), model.getCopyOfPermissions()); } @Test public void testSettersAndGettersForPermission() throws Exception { assertEquals("Should not have any identifiers initially", Collections.emptySet(), model.getIdentifiers()); model.addIdentifier(EXAMPLE_IDENTIFIER); final PolicyEditorPermissions permission = PolicyEditorPermissions.CLIPBOARD; model.setPermission(EXAMPLE_IDENTIFIER, permission, true); assertTrue("Expected permission " + permission, model.getPermission(EXAMPLE_IDENTIFIER, permission)); } @Test public void testClearCustomCodebase() throws Exception { assertEquals("Should not have any identifiers initially", Collections.emptySet(), model.getIdentifiers()); model.addIdentifier(EXAMPLE_IDENTIFIER); final PolicyParser.PermissionEntry customPermission = new CustomPolicyViewer.DisplayablePermission(PermissionType.FILE_PERMISSION, PermissionTarget.USER_HOME, PermissionActions.FILE_ALL); final Collection customPermissions = Collections.singleton(customPermission); model.addCustomPermissions(EXAMPLE_IDENTIFIER, customPermissions); assertEquals("Expected custom permission", customPermissions, model.getCopyOfCustomPermissions().get(EXAMPLE_IDENTIFIER)); model.clearCustomIdentifier(EXAMPLE_IDENTIFIER); final Set result = model.getCopyOfCustomPermissions().get(EXAMPLE_IDENTIFIER); assertTrue("Custom permissions were expected to be empty, was: " + result, result.isEmpty()); } @Test public void testClearCustomPermission() throws Exception { assertEquals("Should not have any identifiers initially", Collections.emptySet(), model.getIdentifiers()); model.addIdentifier(EXAMPLE_IDENTIFIER); final PolicyParser.PermissionEntry customPermission = new CustomPolicyViewer.DisplayablePermission(PermissionType.FILE_PERMISSION, PermissionTarget.USER_HOME, PermissionActions.FILE_ALL); final Collection customPermissions = Collections.singleton(customPermission); model.addCustomPermissions(EXAMPLE_IDENTIFIER, customPermissions); assertEquals("Expected custom permission", customPermissions, model.getCopyOfCustomPermissions().get(EXAMPLE_IDENTIFIER)); model.clearCustomPermissions(); assertEquals("Custom permissions were expected to be empty", null, model.getCopyOfCustomPermissions().get(EXAMPLE_IDENTIFIER)); final Map> result = model.getCopyOfCustomPermissions(); assertTrue("All identifier custom permissions were expected to be empty, was: " + result, result.isEmpty()); } @Test public void testAddCustomPermissions() throws Exception { assertEquals("Should not have any identifiers initially", Collections.emptySet(), model.getIdentifiers()); model.addIdentifier(EXAMPLE_IDENTIFIER); final PolicyParser.PermissionEntry customPermission = new CustomPolicyViewer.DisplayablePermission(PermissionType.FILE_PERMISSION, PermissionTarget.USER_HOME, PermissionActions.FILE_ALL); final Collection customPermissions = Collections.singleton(customPermission); model.addCustomPermissions(EXAMPLE_IDENTIFIER, customPermissions); assertEquals("Expected file/user home/all-actions permission ", customPermissions, model.getCopyOfCustomPermissions().get(EXAMPLE_IDENTIFIER)); final CustomPolicyViewer.DisplayablePermission customPermission2 = new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY); final Collection customPermissions2 = Collections.singleton(customPermission2); model.addCustomPermissions(EXAMPLE_IDENTIFIER, customPermissions2); assertTrue("Expected audio play permission ", model.getCopyOfCustomPermissions().get(EXAMPLE_IDENTIFIER).contains(customPermission2)); final HashSet customPermissionHashSet = new HashSet<>(); customPermissionHashSet.add(customPermission); customPermissionHashSet.add(customPermission2); assertEquals("Expected custom permission ", customPermissionHashSet, model.getCopyOfCustomPermissions().get(EXAMPLE_IDENTIFIER)); } @Test public void testAllPermissionsAreFalseInitially() throws Exception { assertEquals("Should not have any identifiers initially", Collections.emptySet(), model.getIdentifiers()); model.addIdentifier(EXAMPLE_IDENTIFIER); final Map policyEditorPermissions = model.getCopyOfPermissions().get(EXAMPLE_IDENTIFIER); for (final Map.Entry entry : policyEditorPermissions.entrySet()) { assertFalse("Expected " + entry.getKey() + " to be false", entry.getValue()); } } @Test public void testAllPermissionsAreInitialized() throws Exception { assertEquals("Should not have any identifiers initially", Collections.emptySet(), model.getIdentifiers()); model.addIdentifier(EXAMPLE_IDENTIFIER); final Map policyEditorPermissions = model.getCopyOfPermissions().get(EXAMPLE_IDENTIFIER); for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { assertTrue(perm + " should have been present as a key", policyEditorPermissions.containsKey(perm)); } } @Test public void testGetCopyOfPermissionsIsCopy() throws Exception { final Map> codebasePermissionsMap = model.getCopyOfPermissions(); assertEquals("Map should be initially empty", Collections.>emptyMap(), codebasePermissionsMap); codebasePermissionsMap.put(INVALID_IDENTIFIER, Collections.singletonMap(PolicyEditorPermissions.CLIPBOARD, true)); final Map> codebasePermissionsMap2 = model.getCopyOfPermissions(); assertEquals("New copy should be initially empty", Collections.>emptyMap(), codebasePermissionsMap2); assertNotEquals("Modified map should not equal newly copied map", codebasePermissionsMap, codebasePermissionsMap2); } @Test public void testGetCopyOfCustomPermissionsIsCopy() throws Exception { final Map> codebasePermissionsMap = model.getCopyOfCustomPermissions(); assertEquals("Map should be initially empty", Collections.>emptyMap(), codebasePermissionsMap); codebasePermissionsMap.put(INVALID_IDENTIFIER, Collections.singleton((PolicyParser.PermissionEntry) new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY))); final Map> codebasePermissionsMap2 = model.getCopyOfCustomPermissions(); assertEquals("New copy should be initially empty", Collections.>emptyMap(), codebasePermissionsMap2); assertNotEquals("Modified set should not equal newly copied set", codebasePermissionsMap, codebasePermissionsMap2); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/Permissio0000644000000000000000000000031013441742745030646 xustar00111 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PermissionActionsTest.java 29 mtime=1552401893.06983276 30 atime=1552402157.256253438 30 ctime=1552410887.065183555 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PermissionActionsTest.jav0000644000175000002070000000556013441742745034604 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import java.util.HashSet; import java.util.Set; import static org.junit.Assert.assertTrue; import org.junit.Test; public class PermissionActionsTest { @Test public void testFromString() throws Exception { final String accept = "accept"; final String rw = "read,write"; final PermissionActions p1 = PermissionActions.fromString(accept); final PermissionActions p2 = PermissionActions.fromString(rw); assertTrue("accept should match ACCEPT", p1.equals(PermissionActions.ACCEPT)); assertTrue("read,write should match NONE", p2.equals(PermissionActions.NONE)); } @Test public void testGetActions() throws Exception { final Set actions = new HashSet(); actions.add("accept"); actions.add("connect"); actions.add("resolve"); actions.add("listen"); final String actionsStr = "resolve,listen,connect,accept"; final PermissionActions perm = PermissionActions.fromString(actionsStr); assertTrue("resolve,listen,connect,accept should match NETALL", perm.equals(PermissionActions.NETALL)); assertTrue("NETALL should contain accept, connect, resolve, listen", perm.getActions().equals(actions)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEnt0000644000000000000000000000013213441742745030604 xustar0030 mtime=1552401893.070832758 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEntryTest.java0000644000175000002070000002400313441742745033546 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import org.junit.Test; import sun.security.provider.PolicyParser; import java.util.Collections; import java.util.HashSet; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; /** * PolicyEntryTest does not test the various parsing scenarios as those are tested in PolicyEditorParsingTest */ public class PolicyEntryTest { @Test public void testGetCodebase() throws Exception { final String codebase = "http://example.com"; final Set permissions = Collections.singleton(PolicyEditorPermissions.CLIPBOARD); final Set customPermissions = Collections.singleton(new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY)); final PolicyEntry policyEntry = new PolicyEntry.Builder() .codebase(codebase) .permissions(permissions) .customPermissions(customPermissions) .build(); assertEquals("Codebase should equal input", codebase, policyEntry.getPolicyIdentifier().getCodebase()); } @Test public void testNullCodebaseConvertsToEmpty() throws Exception { final String codebase = null; final Set permissions = Collections.singleton(PolicyEditorPermissions.CLIPBOARD); final Set customPermissions = Collections.singleton(new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY)); final PolicyEntry policyEntry = new PolicyEntry.Builder() .codebase(codebase) .permissions(permissions) .customPermissions(customPermissions) .build(); assertEquals("Null codebase should produce empty string", "", policyEntry.getPolicyIdentifier().getCodebase()); } @Test public void testGetPermissions() throws Exception { final String codebase = "http://example.com"; final Set permissions = Collections.singleton(PolicyEditorPermissions.CLIPBOARD); final Set customPermissions = Collections.singleton(new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY)); final PolicyEntry policyEntry = new PolicyEntry.Builder() .codebase(codebase) .permissions(permissions) .customPermissions(customPermissions) .build(); assertEquals("Permissions set should equal input", permissions, policyEntry.getPermissions()); } @Test public void testGetPermissions2() throws Exception { final String codebase = "http://example.com"; final Set permissions = new HashSet() {{ add(PolicyEditorPermissions.CLIPBOARD); add(PolicyEditorPermissions.NETWORK); }}; final Set customPermissions = Collections.singleton(new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY)); final PolicyEntry policyEntry = new PolicyEntry.Builder() .codebase(codebase) .permissions(permissions) .customPermissions(customPermissions) .build(); assertEquals("Permissions set should equal input", permissions, policyEntry.getPermissions()); } @Test public void testGetCustomPermissions() throws Exception { final String codebase = "http://example.com"; final Set permissions = Collections.singleton(PolicyEditorPermissions.CLIPBOARD); final Set customPermissions = Collections.singleton(new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY)); final PolicyEntry policyEntry = new PolicyEntry.Builder() .codebase(codebase) .permissions(permissions) .customPermissions(customPermissions) .build(); assertEquals("Custom permissions set should equal input", customPermissions, policyEntry.getCustomPermissions()); } @Test public void testGetCustomPermissions2() throws Exception { final String codebase = "http://example.com"; final Set permissions = Collections.singleton(PolicyEditorPermissions.CLIPBOARD); final Set customPermissions = new HashSet(){{ add(new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY)); add(new CustomPolicyViewer.DisplayablePermission(PermissionType.RUNTIME_PERMISSION, PermissionTarget.CLASSLOADER)); }}; final PolicyEntry policyEntry = new PolicyEntry.Builder() .codebase(codebase) .permissions(permissions) .customPermissions(customPermissions) .build(); assertEquals("Custom permissions set should equal input", customPermissions, policyEntry.getCustomPermissions()); } @Test(expected = NullPointerException.class) public void testEntryWithNullPermissions() throws Exception { final String codebase = "http://example.com"; final Set customPermissions = Collections.singleton(new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY)); new PolicyEntry.Builder() .codebase(codebase) .permissions(null) .customPermissions(customPermissions) .build(); } @Test(expected = NullPointerException.class) public void testEntryWithNullCustomPermissions() throws Exception { final String codebase = "http://example.com"; final Set permissions = Collections.singleton(PolicyEditorPermissions.CLIPBOARD); new PolicyEntry.Builder() .codebase(codebase) .permissions(permissions) .customPermissions(null) .build(); } @Test(expected = NullPointerException.class) public void testNullPermissionsNotAllowed() throws Exception { final String codebase = "http://example.com"; final Set permissions = Collections.singleton(null); final Set customPermissions = Collections.singleton(new CustomPolicyViewer.DisplayablePermission(PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY)); new PolicyEntry.Builder() .codebase(codebase) .permissions(permissions) .customPermissions(customPermissions) .build(); } @Test public void testNullCustomPermissionsNotAllowed() throws Exception { final String codebase = "http://example.com"; final Set permissions = Collections.singleton(PolicyEditorPermissions.CLIPBOARD); final Set customPermissions = Collections.singleton(null); final PolicyEntry policyEntry = new PolicyEntry.Builder() .codebase(codebase) .permissions(permissions) .customPermissions(customPermissions) .build(); assertFalse("Custom permissions set should not contain null element", policyEntry.getCustomPermissions().contains(null)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/CustomPol0000644000000000000000000000031213441742745030623 xustar00112 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewerTest.java 30 mtime=1552401893.070832758 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewerTest.ja0000644000175000002070000001361313441742745034557 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import static net.sourceforge.jnlp.security.policyeditor.PolicyEditor.identifierFromCodebase; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import sun.security.provider.PolicyParser; import java.util.Collection; public class CustomPolicyViewerTest { private CustomPolicyViewer viewer; private static final PolicyIdentifier IDENTIFIER = identifierFromCodebase("http://example.com"); private static final CustomPolicyViewer.DisplayablePermission PERMISSION = CustomPolicyViewer.DisplayablePermission.from(new PolicyParser.PermissionEntry("java.lang.RuntimePermission", "createClassLoader", null)); @Before public void setupViewer() { viewer = new CustomPolicyViewer(new PolicyEditor(null), IDENTIFIER); } @Test(expected = NullPointerException.class) public void testConstructorWithNullPolicyEditor() throws Exception { new CustomPolicyViewer(null, IDENTIFIER); } @Test(expected = NullPointerException.class) public void testConstructorWithNullCodebase() throws Exception { new CustomPolicyViewer(new PolicyEditor(null), null); } @Test public void testPermissionsSetInitiallyEmpty() throws Exception { assertEquals("Permissions set should be empty", 0, viewer.getCopyOfCustomPermissions().size()); } @Test public void testAddCustomPermission() throws Exception { viewer.addCustomPermission(PERMISSION); assertEquals("Permissions set size mismatch", 1, viewer.getCopyOfCustomPermissions().size()); assertTrue("Permissions set should contain " + PERMISSION, viewer.getCopyOfCustomPermissions().contains(PERMISSION)); } @Test public void testAddCustomPermissionDuplicates() throws Exception { viewer.addCustomPermission(PERMISSION); assertEquals("Permissions set size mismatch", 1, viewer.getCopyOfCustomPermissions().size()); assertTrue("Permissions set should contain " + PERMISSION, viewer.getCopyOfCustomPermissions().contains(PERMISSION)); viewer.addCustomPermission(PERMISSION); assertEquals("Permissions set size should not have changed", 1, viewer.getCopyOfCustomPermissions().size()); assertTrue("Permissions set should still contain " + PERMISSION, viewer.getCopyOfCustomPermissions().contains(PERMISSION)); } @Test(expected = NullPointerException.class) public void testAddCustomPermissionNull() throws Exception { viewer.addCustomPermission(null); } @Test public void testRemoveCustomPermission() throws Exception { viewer.addCustomPermission(PERMISSION); assertEquals("Permissions set size mismatch", 1, viewer.getCopyOfCustomPermissions().size()); assertTrue("Permissions set should contain " + PERMISSION, viewer.getCopyOfCustomPermissions().contains(PERMISSION)); viewer.removeCustomPermission(PERMISSION); assertEquals("Permissions set should be empty", 0, viewer.getCopyOfCustomPermissions().size()); assertFalse("Permissions set should not contain " + PERMISSION, viewer.getCopyOfCustomPermissions().contains(PERMISSION)); } @Test(expected = NullPointerException.class) public void testRemoveCustomPermissionNull() throws Exception { viewer.removeCustomPermission(null); } @Test public void testGetCopyOfCustomPermissionsNotNull() throws Exception { assertNotNull(viewer.getCopyOfCustomPermissions()); } @Test public void testGetCopyOfCustomPermissionsReturnsCopy() throws Exception { final Collection permissions = viewer.getCopyOfCustomPermissions(); permissions.add(PERMISSION); assertNotEquals("Sets should be distinct", viewer.getCopyOfCustomPermissions(), permissions); assertNotEquals("Sizes should not match", viewer.getCopyOfCustomPermissions().size(), permissions.size()); assertTrue("Copy should contain " + PERMISSION, permissions.contains(PERMISSION)); assertFalse("Viewer should not contain " + PERMISSION, viewer.getCopyOfCustomPermissions().contains(PERMISSION)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEdi0000644000000000000000000000031713441742745030564 xustar00117 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissionsTest.java 30 mtime=1552401893.079832739 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissionsTe0000644000175000002070000000526013441742745034644 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import org.junit.Test; import static org.junit.Assert.assertFalse; public class PolicyEditorPermissionsTest { @Test public void assertAllPermissionsHaveNames() throws Exception { for (PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { assertFalse("Permission " + perm + " should have a defined name", perm.getName().contains("UNDEFINED")); } } @Test public void assertAllPermissionsHaveDescriptions() throws Exception { for (PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { assertFalse("Permission " + perm + " should have a defined description", perm.getDescription().contains("UNDEFINED")); } } @Test public void assertAllPermissionsHavePermissionStrings() throws Exception { for (PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { assertFalse("Permission " + perm + " should have a defined permission string", perm.toPermissionString().trim().isEmpty()); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEdi0000644000000000000000000000031513441742745030562 xustar00116 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorControllerTest.java 29 mtime=1552401893.07483275 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorControllerTes0000644000175000002070000004624213441742745034644 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import net.sourceforge.jnlp.util.FileUtils; import org.junit.Before; import org.junit.Test; import sun.security.provider.PolicyParser; import java.io.File; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; public class PolicyEditorControllerTest { private static final String SIGNED_BY = "someCA"; private static final String CODEBASE = "http://example.com"; private static final List EMPTY_PRINCIPALS = Collections.emptyList(); private static final PolicyIdentifier DEFAULT_IDENTIFIER = new PolicyIdentifier(SIGNED_BY, EMPTY_PRINCIPALS, CODEBASE); private static final String LINEBREAK = System.getProperty("line.separator"); private static final String EXAMPLE_POLICY_1 = "grant {" + LINEBREAK + "permission some.java.permission \"somePermission\";" + LINEBREAK + "};" + LINEBREAK; private static final String EXAMPLE_POLICY_2 = "grant {" + LINEBREAK + "permission some.other.java.permission \"somePermission\";" + LINEBREAK + "};" + LINEBREAK; private static final String CLIPBOARD_POLICY = "grant codeBase \"http://example.com\" {" + LINEBREAK + "permission java.awt.AWTPermission \"accessClipboard\";" + LINEBREAK + "};" + LINEBREAK; private String tempFilePath; private PolicyEditorController controller; @Before public void setNewTempfile() throws Exception { tempFilePath = File.createTempFile("policyeditor", null).getCanonicalPath(); controller = new PolicyEditorController(); controller.setFile(new File(tempFilePath)); } @Test public void testChangesMadeInitiallyFalse() throws Exception { assertFalse("Controller should report changes made initially", controller.changesMade()); } @Test public void testChangesMade() throws Exception { controller.setChangesMade(false); assertFalse("Controller should have changes made marked false after being explicitly set", controller.changesMade()); } @Test public void testFileHasChanged() throws Exception { assertFalse("File should not have been changed initially", controller.fileHasChanged()); } @Test public void testFileHasChangedWithChange() throws Exception { assertFalse("Controller should report file has changed initially", controller.fileHasChanged()); FileUtils.saveFile(EXAMPLE_POLICY_1, new File(tempFilePath)); controller.openAndParsePolicyFile(); FileUtils.saveFile(EXAMPLE_POLICY_2, new File(tempFilePath)); assertTrue("File should be marked changed after being externally modified", controller.fileHasChanged()); } @Test public void testInitialIdentifier() throws Exception { final Collection initialIdentifiers = controller.getIdentifiers(); assertEquals("Controller should have no identifiers to begin with", 0, initialIdentifiers.size()); } @Test public void testAddIdentifier() throws Exception { controller.addIdentifier(DEFAULT_IDENTIFIER); final Collection identifiers = controller.getIdentifiers(); assertTrue("Controller should have " + DEFAULT_IDENTIFIER, identifiers.contains(DEFAULT_IDENTIFIER)); assertEquals("Controller should only have two identifiers", 1, identifiers.size()); } @Test public void testAddMultipleIdentifiers() throws Exception { final Set toAdd = new HashSet<>(); toAdd.add(DEFAULT_IDENTIFIER); final PolicyIdentifier newIdentifier = new PolicyIdentifier(null, EMPTY_PRINCIPALS, "http://icedtea.classpath.org"); toAdd.add(newIdentifier); for (final PolicyIdentifier id : toAdd) { controller.addIdentifier(id); } final Collection identifiers = controller.getIdentifiers(); for (final PolicyIdentifier id : toAdd) { assertTrue("Controller should have " + id, identifiers.contains(id)); } } @Test public void testRemoveIdentifier() throws Exception { controller.addIdentifier(DEFAULT_IDENTIFIER); final Collection identifiers = controller.getIdentifiers(); assertTrue("Controller should have " + DEFAULT_IDENTIFIER, identifiers.contains(DEFAULT_IDENTIFIER)); assertEquals("Controller should only have one identifier", 1, identifiers.size()); controller.removeIdentifier(DEFAULT_IDENTIFIER); final Collection afterRemove = controller.getIdentifiers(); assertFalse("Controller should not have " + DEFAULT_IDENTIFIER + ". Contained: " + afterRemove, afterRemove.contains(DEFAULT_IDENTIFIER)); assertEquals("Controller should have no identifiers", Collections.emptySet(), afterRemove); } @Test public void testCopyPasteIdentifiers() throws Exception { final String pasteUrl = "http://example.com/example"; final PolicyIdentifier pasteIdentifier = new PolicyIdentifier(null, EMPTY_PRINCIPALS, pasteUrl); final PolicyEditorPermissions clipBoard = PolicyEditorPermissions.CLIPBOARD; controller.addIdentifier(DEFAULT_IDENTIFIER); controller.setPermission(DEFAULT_IDENTIFIER, clipBoard, Boolean.TRUE); final Collection beforePasteIdentifiers = controller.getIdentifiers(); assertTrue("Controller should contain original identifier: " + DEFAULT_IDENTIFIER, beforePasteIdentifiers.contains(DEFAULT_IDENTIFIER)); assertTrue(DEFAULT_IDENTIFIER + " should have " + clipBoard, controller.getPermissions(DEFAULT_IDENTIFIER).get(clipBoard)); controller.copyPolicyEntryToClipboard(DEFAULT_IDENTIFIER); final PolicyEntry clipboardEntry = PolicyEditorController.getPolicyEntryFromClipboard(); final PolicyEntry newEntry = new PolicyEntry.Builder() .codebase(pasteUrl) .permissions(clipboardEntry.getPermissions()) .customPermissions(clipboardEntry.getCustomPermissions()) .build(); controller.addPolicyEntry(newEntry); final Collection afterPasteIdentifiers = controller.getIdentifiers(); assertTrue("Controller should still contain original identifier: " + DEFAULT_IDENTIFIER, afterPasteIdentifiers.contains(DEFAULT_IDENTIFIER)); assertTrue("Controller should also contain pasted identifier:" + pasteIdentifier, afterPasteIdentifiers.contains(pasteIdentifier)); assertTrue(DEFAULT_IDENTIFIER + " should have " + clipBoard, controller.getPermissions(DEFAULT_IDENTIFIER).get(clipBoard)); assertTrue(pasteIdentifier + " should have " + clipBoard, controller.getPermissions(pasteIdentifier).get(clipBoard)); } @Test public void testAddPolicyEntry() throws Exception { final PolicyEditorPermissions editorPermissions = PolicyEditorPermissions.CLIPBOARD; final Collection permissions = Collections.singleton(editorPermissions); final CustomPolicyViewer.DisplayablePermission customPermission = new CustomPolicyViewer.DisplayablePermission(PermissionType.FILE_PERMISSION, PermissionTarget.USER_HOME, PermissionActions.FILE_ALL); final Collection customPermissions = Collections.singleton(customPermission); final PolicyEntry policyEntry = new PolicyEntry.Builder() .identifier(DEFAULT_IDENTIFIER) .permissions(permissions) .customPermissions(customPermissions) .build(); controller.addPolicyEntry(policyEntry); final Collection identifiers = controller.getIdentifiers(); assertTrue("Controller should have " + DEFAULT_IDENTIFIER, identifiers.contains(DEFAULT_IDENTIFIER)); assertEquals("Controller should only have one identifier", 1, identifiers.size()); assertTrue("Controller should have granted " + editorPermissions, controller.getPermission(DEFAULT_IDENTIFIER, editorPermissions)); assertTrue("Controller should have granted " + customPermission, controller.getCustomPermissions(DEFAULT_IDENTIFIER).contains(customPermission)); } @Test public void testAddCustomPermissionNoActions() throws Exception { final CustomPolicyViewer.DisplayablePermission customPermission = new CustomPolicyViewer.DisplayablePermission("java.lang.RuntimePermission", "createClassLoader"); controller.addCustomPermission(DEFAULT_IDENTIFIER, customPermission); assertTrue("Controller custom permissions should include " + customPermission + " but did not", controller.getCustomPermissions(DEFAULT_IDENTIFIER).contains(customPermission)); } @Test public void testAddCustomPermissionEmptyActions() throws Exception { final CustomPolicyViewer.DisplayablePermission customPermission = new CustomPolicyViewer.DisplayablePermission("java.lang.RuntimePermission", "createClassLoader", ""); controller.addCustomPermission(DEFAULT_IDENTIFIER, customPermission); assertTrue("Controller custom permissions should include " + customPermission + " but did not", controller.getCustomPermissions(DEFAULT_IDENTIFIER).contains(customPermission)); } @Test public void testClearCustomPermissionsNoActions() throws Exception { final CustomPolicyViewer.DisplayablePermission customPermission = new CustomPolicyViewer.DisplayablePermission("java.lang.RuntimePermission", "createClassLoader"); controller.addCustomPermission(DEFAULT_IDENTIFIER, customPermission); assertTrue("Controller custom permissions should include " + customPermission + " but did not", controller.getCustomPermissions(DEFAULT_IDENTIFIER).contains(customPermission)); controller.clearCustomIdentifier(DEFAULT_IDENTIFIER); assertEquals(0, controller.getCustomPermissions(DEFAULT_IDENTIFIER).size()); } @Test public void testClearCustomPermissionsEmptyActions() throws Exception { final CustomPolicyViewer.DisplayablePermission customPermission = new CustomPolicyViewer.DisplayablePermission("java.lang.RuntimePermission", "createClassLoader", ""); controller.addCustomPermission(DEFAULT_IDENTIFIER, customPermission); assertTrue("Controller custom permissions should include " + customPermission + " but did not", controller.getCustomPermissions(DEFAULT_IDENTIFIER).contains(customPermission)); controller.clearCustomIdentifier(DEFAULT_IDENTIFIER); assertEquals(0, controller.getCustomPermissions(DEFAULT_IDENTIFIER).size()); } @Test public void testReturnedIdentifiersIsCopy() throws Exception { final Collection original = controller.getIdentifiers(); original.add(new PolicyIdentifier("invalidSigner", EMPTY_PRINCIPALS, "invalidURL")); original.remove(DEFAULT_IDENTIFIER); final Collection second = controller.getIdentifiers(); assertEquals("Controller should have no identifiers", 0, second.size()); } @Test public void testReturnedPermissionsMapIsCopy() throws Exception { final Map original = controller.getPermissions(DEFAULT_IDENTIFIER); for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { original.put(perm, true); } final Map second = controller.getPermissions(DEFAULT_IDENTIFIER); for (final Map.Entry entry : second.entrySet()) { assertFalse("Permission " + entry.getKey() + " should be false", entry.getValue()); } } @Test public void testReturnedCustomPermissionsSetIsCopy() throws Exception { final Collection original = controller.getCustomPermissions(DEFAULT_IDENTIFIER); assertTrue("There should not be any custom permissions to start", original.isEmpty()); original.add(new CustomPolicyViewer.DisplayablePermission("java.io.FilePermission", "*", "write")); final Collection second = controller.getCustomPermissions(DEFAULT_IDENTIFIER); assertTrue("The custom permission should not have been present", second.isEmpty()); } @Test public void testDefaultPermissionsAllFalse() throws Exception { final Map defaultMap = controller.getPermissions(DEFAULT_IDENTIFIER); controller.addIdentifier(DEFAULT_IDENTIFIER); final Map addedMap = controller.getPermissions(DEFAULT_IDENTIFIER); for (final Map.Entry entry : defaultMap.entrySet()) { assertFalse("Permission " + entry.getKey() + " should be false", entry.getValue()); } for (final Map.Entry entry : addedMap.entrySet()) { assertFalse("Permission " + entry.getKey() + " should be false", entry.getValue()); } } @Test public void testAllPermissionsRepresented() throws Exception { final Map defaultMap = controller.getPermissions(DEFAULT_IDENTIFIER); controller.addIdentifier(DEFAULT_IDENTIFIER); final Map addedMap = controller.getPermissions(DEFAULT_IDENTIFIER); assertTrue("Default identifier permissions keyset should be the same size as enum values set", defaultMap.keySet().size() == PolicyEditorPermissions.values().length); assertTrue("Added identifier permissions keyset should be the same size as enum values set", addedMap.keySet().size() == PolicyEditorPermissions.values().length); for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { assertTrue("Permission " + perm + " should be in the editor's identifier keyset", defaultMap.keySet().contains(perm)); } for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { assertTrue("Permission " + perm + " should be in the editor's identifier keyset", addedMap.keySet().contains(perm)); } } @Test public void testSetGetPermission() throws Exception { controller.addIdentifier(DEFAULT_IDENTIFIER); final PolicyEditorPermissions permission = PolicyEditorPermissions.CLIPBOARD; assertFalse("Clipboard permission should not be initially granted", controller.getPermission(DEFAULT_IDENTIFIER, permission)); controller.setPermission(DEFAULT_IDENTIFIER, permission, true); assertTrue("Clipboard permission should be granted after being set", controller.getPermission(DEFAULT_IDENTIFIER, permission)); } @Test public void testClearPermission() throws Exception { controller.addIdentifier(DEFAULT_IDENTIFIER); final PolicyEditorPermissions permission = PolicyEditorPermissions.CLIPBOARD; assertFalse("Clipboard permission should not be initially granted", controller.getPermission(DEFAULT_IDENTIFIER, permission)); controller.setPermission(DEFAULT_IDENTIFIER, permission, true); assertTrue("Clipboard permission should be granted after being set", controller.getPermission(DEFAULT_IDENTIFIER, permission)); controller.clearPermissions(); for (final PolicyIdentifier id : controller.getIdentifiers()) { for (final Map.Entry entry : controller.getPermissions(id).entrySet()) { assertFalse("Permission " + entry.getKey() + " should be false for identifier " + id, entry.getValue()); } } assertEquals(0, controller.getIdentifiers().size()); } @Test public void testIdentifierCodebaseTrailingSlashesDoNotMatch() throws Exception { final PolicyIdentifier firstId = new PolicyIdentifier(SIGNED_BY, EMPTY_PRINCIPALS, "http://example.com"); final PolicyIdentifier secondId = new PolicyIdentifier(SIGNED_BY, EMPTY_PRINCIPALS, "http://example.com"); final Collection toAdd = Arrays.asList(firstId, secondId); for (final PolicyIdentifier id : toAdd) { controller.addIdentifier(id); } final Collection identifiers = controller.getIdentifiers(); for (final PolicyIdentifier id : toAdd) { assertTrue("Controller should have " + id, identifiers.contains(id)); } } @Test public void testOpenAndParsePolicyFile() throws Exception { final PolicyIdentifier exampleIdentifier = new PolicyIdentifier(null, Collections.emptyList(), "http://example.com"); FileUtils.saveFile(CLIPBOARD_POLICY, new File(tempFilePath)); controller.openAndParsePolicyFile(); assertEquals("Controller should have one identifier", 1, controller.getIdentifiers().size()); assertTrue("Controller should have identifier " + exampleIdentifier, controller.getIdentifiers().contains(exampleIdentifier)); assertTrue("Controller should grant " + PolicyEditorPermissions.CLIPBOARD + " got: " + controller.getPermissions(exampleIdentifier) + " and: " + controller.getCustomPermissions(exampleIdentifier), controller.getPermission(exampleIdentifier, PolicyEditorPermissions.CLIPBOARD)); assertEquals("Custom permission set should have been empty", Collections.emptySet(), controller.getCustomPermissions(exampleIdentifier)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyIde0000644000000000000000000000013213441742745030557 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyIdentifierTest.java0000644000175000002070000001533213441742745034534 0ustar00jvanekmock00000000000000/*Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import sun.security.provider.PolicyParser; import org.junit.Before; import org.junit.Test; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; public class PolicyIdentifierTest { private static final Set principals = new HashSet<>(Arrays.asList( new PolicyParser.PrincipalEntry("aa", "bb"), new PolicyParser.PrincipalEntry("cc", "dd") )); public static final Set EMPTY_SET = Collections.emptySet(); @Test public void testEquals() { PolicyIdentifier exampleIdentifier = new PolicyIdentifier(null, EMPTY_SET, "http://example.com"); PolicyIdentifier exampleIdentifier2 = new PolicyIdentifier(null, EMPTY_SET, "http://example.com"); assertTrue(exampleIdentifier.equals(exampleIdentifier2)); assertTrue(exampleIdentifier2.equals(exampleIdentifier)); assertFalse(exampleIdentifier.equals(null)); assertFalse(exampleIdentifier.equals(new Object())); assertFalse(exampleIdentifier.equals(PolicyIdentifier.ALL_APPLETS_IDENTIFIER)); } @Test public void testHashCode() { PolicyIdentifier exampleIdentifier = new PolicyIdentifier(null, EMPTY_SET, "http://example.com"); PolicyIdentifier exampleIdentifier2 = new PolicyIdentifier(null, EMPTY_SET, "http://example.com"); assertTrue(exampleIdentifier.hashCode() == exampleIdentifier2.hashCode()); assertTrue(exampleIdentifier2.hashCode() == exampleIdentifier.hashCode()); assertFalse(exampleIdentifier.hashCode() == PolicyIdentifier.ALL_APPLETS_IDENTIFIER.hashCode()); } @Test public void testCompareTo() { PolicyIdentifier exampleIdentifier1 = createIdentifier("exampleIdentifier1", null, EMPTY_SET, "http://example.com"); PolicyIdentifier exampleIdentifier2 = createIdentifier("exampleIdentifier2", null, EMPTY_SET, "http://example.com2"); PolicyIdentifier exampleIdentifier3 = createIdentifier("exampleIdentifier3", "signedBy1", EMPTY_SET, "http://example.com"); PolicyIdentifier exampleIdentifier4 = createIdentifier("exampleIdentifier4", "signedBy2", EMPTY_SET, "http://example.com"); PolicyIdentifier exampleIdentifier5 = createIdentifier("exampleIdentifier5", "signedBy2", principals, "http://example.com"); assertLesser(PolicyIdentifier.ALL_APPLETS_IDENTIFIER, exampleIdentifier1); assertLesser(PolicyIdentifier.ALL_APPLETS_IDENTIFIER, exampleIdentifier2); assertLesser(PolicyIdentifier.ALL_APPLETS_IDENTIFIER, exampleIdentifier3); assertLesser(PolicyIdentifier.ALL_APPLETS_IDENTIFIER, exampleIdentifier4); assertTrue("ALL_APPLETS_IDENTIFIER should be equal to itself", PolicyIdentifier.ALL_APPLETS_IDENTIFIER.compareTo(PolicyIdentifier.ALL_APPLETS_IDENTIFIER) == 0); assertLesser(exampleIdentifier1, exampleIdentifier2); assertLesser(exampleIdentifier3, exampleIdentifier2); assertLesser(exampleIdentifier3, exampleIdentifier1); assertLesser(exampleIdentifier3, exampleIdentifier4); assertLesser(exampleIdentifier4, exampleIdentifier5); } @Test public void testCompareToCodebases() { PolicyIdentifier a = createIdentifier("a", null, EMPTY_SET, "a"); PolicyIdentifier aa = createIdentifier("aa", null, EMPTY_SET, "aa"); PolicyIdentifier aaa = createIdentifier("aaa", null, EMPTY_SET, "aaa"); PolicyIdentifier b = createIdentifier("b", null, EMPTY_SET, "b"); assertLesser(a, aa); assertLesser(a, aaa); assertLesser(aa, aaa); assertLesser(a, b); assertLesser(aa, b); assertLesser(aaa, b); } @Test public void testCompareToSignedBys() { PolicyIdentifier a = createIdentifier("a", "a", EMPTY_SET, null); PolicyIdentifier aa = createIdentifier("aa", "aa", EMPTY_SET, null); PolicyIdentifier aaa = createIdentifier("aaa", "aaa", EMPTY_SET, null); PolicyIdentifier b = createIdentifier("b", "b", EMPTY_SET, null); assertLesser(a, aa); assertLesser(a, aaa); assertLesser(aa, aaa); assertLesser(a, b); assertLesser(aa, b); assertLesser(aaa, b); } //@Test public void testCompareToPrincipals() { // compareTo on principals set depends on implementation of Set.hashCode(), there is no real meaningful ordering on this field } static void assertLesser(PolicyIdentifier lesser, PolicyIdentifier greater) { String message = lesser.toString() + " should be less than " + greater.toString(); assertTrue(message, lesser.compareTo(greater) < 0); } static PolicyIdentifier createIdentifier(final String name, String signedBy, Set principals, String codebase) { return new PolicyIdentifier(signedBy, principals, codebase) { @Override public String toString() { return name; } }; } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/Permissio0000644000000000000000000000013213441742745030650 xustar0030 mtime=1552401893.067832765 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PermissionTargetTest.java0000644000175000002070000000477113441742745034576 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import static org.junit.Assert.assertTrue; import org.junit.Test; public class PermissionTargetTest { @Test public void testFromString() throws Exception { final PermissionTarget wildcard = PermissionTarget.fromString("*"); final PermissionTarget clipboard = PermissionTarget.fromString("accessClipboard"); final PermissionTarget none = PermissionTarget.fromString(""); final PermissionTarget garbage = PermissionTarget.fromString("garbagedata"); assertTrue("* should match ALL", wildcard.equals(PermissionTarget.ALL)); assertTrue("accessClipboard should match CLIPBOARD", clipboard.equals(PermissionTarget.CLIPBOARD)); assertTrue("empty string should match NONE", none.equals(PermissionTarget.NONE)); assertTrue("nonexistent target should match NONE", garbage.equals(PermissionTarget.NONE)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/PaxHeaders.7406/dialogresults0000644000000000000000000000013213441742745027051 xustar0030 mtime=1552401893.073832752 30 atime=1552410887.112183445 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/0000755000175000002070000000000013441742745027736 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesNoTes0000644000000000000000000000013213441742745030562 xustar0030 mtime=1552401893.064832771 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesNoTestTest.java0000644000175000002070000000572313441742745033345 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import org.junit.Assert; import org.junit.Test; public class YesNoTestTest { @Test public void yesReadWrite() { YesNo y = YesNo.yes(); String s = y.writeValue(); YesNo yy = YesNo.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertTrue(y.toBoolean()); } @Test public void noReadWrite() { YesNo y = YesNo.no(); String s = y.writeValue(); YesNo yy = YesNo.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertFalse(y.toBoolean()); } @Test(expected = Exception.class) public void cancelRead() { YesNo y = YesNo.readValue(BasicDialogValue.Primitive.CANCEL.name()); } @Test(expected = Exception.class) public void sandboxRead() { YesNo y = YesNo.readValue(BasicDialogValue.Primitive.SANDBOX.name()); } @Test(expected = Exception.class) public void nonsenseRead() { YesNo y = YesNo.readValue("blah"); } public void noRead() { YesNo y = YesNo.readValue(BasicDialogValue.Primitive.NO.name()); Assert.assertFalse(y.toBoolean()); } public void yesRead() { YesNo y = YesNo.readValue(BasicDialogValue.Primitive.YES.name()); Assert.assertTrue(y.toBoolean()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/AccessWa0000644000000000000000000000032713441742745030550 xustar00125 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/AccessWarningPaneComplexReturnTest.java 30 mtime=1552401893.065832769 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/AccessWarningPaneComplex0000644000175000002070000001473113441742745034552 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.security.dialogresults; import org.junit.Assert; import org.junit.Test; /* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class AccessWarningPaneComplexReturnTest { @Test public void AccessWarningPaneComplexReturnTestReadWrite1() { AccessWarningPaneComplexReturn aw1 = new AccessWarningPaneComplexReturn(true); Assert.assertEquals(aw1.getRegularReturn().getValue(), BasicDialogValue.Primitive.YES); Assert.assertEquals(aw1.getRegularReturn().getValue(), new AccessWarningPaneComplexReturn(BasicDialogValue.Primitive.YES).getRegularReturn().getValue()); String s1 = aw1.writeValue(); AccessWarningPaneComplexReturn aw11 = AccessWarningPaneComplexReturn.readValue(s1); Assert.assertEquals(aw1.getRegularReturn().getValue(), aw11.getRegularReturn().getValue()); Assert.assertEquals(aw1.getDekstop(), aw11.getDekstop()); Assert.assertEquals(aw1.getMenu(), aw11.getMenu()); Assert.assertEquals(null, aw11.getDekstop()); Assert.assertEquals(null, aw11.getMenu()); } public void AccessWarningPaneComplexReturnTestReadWrite2() { AccessWarningPaneComplexReturn aw2 = new AccessWarningPaneComplexReturn(false); Assert.assertEquals(aw2.getRegularReturn().getValue(), BasicDialogValue.Primitive.NO); Assert.assertEquals(aw2.getRegularReturn().getValue(), new AccessWarningPaneComplexReturn(BasicDialogValue.Primitive.NO).getRegularReturn().getValue()); String s2 = aw2.writeValue(); AccessWarningPaneComplexReturn aw22 = AccessWarningPaneComplexReturn.readValue(s2); Assert.assertEquals(aw2.getRegularReturn().getValue(), aw22.getRegularReturn().getValue()); Assert.assertEquals(aw2.getDekstop(), aw22.getDekstop()); Assert.assertEquals(aw2.getMenu(), aw22.getMenu()); Assert.assertEquals(null, aw22.getDekstop()); Assert.assertEquals(null, aw22.getMenu()); } @Test(expected = Exception.class) public void AccessWarningPaneComplexReturnTestReadWriteBad1() { AccessWarningPaneComplexReturn accessWarningPaneComplexReturn = new AccessWarningPaneComplexReturn(BasicDialogValue.Primitive.CANCEL); } @Test(expected = Exception.class) public void AccessWarningPaneComplexReturnTestReadWriteBad2() { AccessWarningPaneComplexReturn accessWarningPaneComplexReturn = new AccessWarningPaneComplexReturn(BasicDialogValue.Primitive.SANDBOX); } @Test public void AccessWarningPaneComplexReturnTestReadWrite3() { AccessWarningPaneComplexReturn aw1 = new AccessWarningPaneComplexReturn(true); aw1.setDekstop(new AccessWarningPaneComplexReturn.ShortcutResult(true)); aw1.setMenu(new AccessWarningPaneComplexReturn.ShortcutResult(false)); String s1 = aw1.writeValue(); AccessWarningPaneComplexReturn aw11 = AccessWarningPaneComplexReturn.readValue(s1); Assert.assertEquals(aw1.getRegularReturn().getValue(), aw11.getRegularReturn().getValue()); Assert.assertEquals(aw1.getDekstop(), aw11.getDekstop()); Assert.assertEquals(aw1.getMenu(), aw11.getMenu()); Assert.assertNotEquals(null, aw11.getDekstop()); Assert.assertNotEquals(null, aw11.getMenu()); Assert.assertEquals(true, aw11.getDekstop().isCreate()); Assert.assertEquals(false, aw11.getMenu().isCreate()); } @Test public void AccessWarningPaneComplexReturnTestReadWrite4() { AccessWarningPaneComplexReturn aw1 = new AccessWarningPaneComplexReturn(true); aw1.setDekstop(new AccessWarningPaneComplexReturn.ShortcutResult("b1",true, AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.BROWSER, false)); aw1.setMenu(new AccessWarningPaneComplexReturn.ShortcutResult("b2",false, AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.JAVAWS_HTML, true)); String s1 = aw1.writeValue(); AccessWarningPaneComplexReturn aw11 = AccessWarningPaneComplexReturn.readValue(s1); Assert.assertEquals(aw1.getRegularReturn().getValue(), aw11.getRegularReturn().getValue()); Assert.assertEquals(aw1.getDekstop(), aw11.getDekstop()); Assert.assertEquals(aw1.getMenu(), aw11.getMenu()); Assert.assertNotEquals(null, aw11.getDekstop()); Assert.assertNotEquals(null, aw11.getMenu()); Assert.assertEquals(false, aw11.getDekstop().isCreate()); Assert.assertEquals(true, aw11.getMenu().isCreate()); Assert.assertEquals("b1", aw11.getDekstop().getBrowser()); Assert.assertEquals("b2", aw11.getMenu().getBrowser()); Assert.assertEquals(AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.BROWSER, aw11.getDekstop().getShortcutType()); Assert.assertEquals(AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.JAVAWS_HTML, aw11.getMenu().getShortcutType()); Assert.assertEquals(true, aw11.getDekstop().isFixHref()); Assert.assertEquals(false, aw11.getMenu().isFixHref()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesNoCan0000644000000000000000000000013213441742745030530 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesNoCancelTest.java0000644000175000002070000000654413441742745033615 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import org.junit.Assert; import org.junit.Test; public class YesNoCancelTest { @Test public void yesReadWrite() { YesNoCancel y = YesNoCancel.yes(); String s = y.writeValue(); YesNoCancel yy = YesNoCancel.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertTrue(y.toBoolean()); } @Test public void noReadWrite() { YesNoCancel y = YesNoCancel.no(); String s = y.writeValue(); YesNoCancel yy = YesNoCancel.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertFalse(y.toBoolean()); } @Test public void sandboxReadWrite() { YesNoCancel y = YesNoCancel.cancel(); String s = y.writeValue(); YesNoCancel yy = YesNoCancel.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertFalse(y.toBoolean()); } @Test(expected = Exception.class) public void sandboxRead() { YesNoCancel y = YesNoCancel.readValue(BasicDialogValue.Primitive.SANDBOX.name()); } public void cancelRead() { YesNoCancel y = YesNoCancel.readValue(BasicDialogValue.Primitive.CANCEL.name()); Assert.assertFalse(y.toBoolean()); } public void noRead() { YesNoCancel y = YesNoCancel.readValue(BasicDialogValue.Primitive.NO.name()); Assert.assertFalse(y.toBoolean()); } public void yesRead() { YesNoCancel y = YesNoCancel.readValue(BasicDialogValue.Primitive.YES.name()); Assert.assertTrue(y.toBoolean()); } @Test(expected = Exception.class) public void nonsenseRead() { YesNoCancel y = YesNoCancel.readValue("blah"); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesCance0000644000000000000000000000013113441742745030542 xustar0029 mtime=1552401893.06983276 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesCancelTest.java0000644000175000002070000000530513441742745033312 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import org.junit.Assert; import org.junit.Test; public class YesCancelTest { @Test public void yesReadWrite() { YesCancel y = YesCancel.yes(); String s = y.writeValue(); YesCancel yy = YesCancel.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); } @Test public void cacnelReadWrite() { YesCancel y = YesCancel.cancel(); String s = y.writeValue(); YesCancel yy = YesCancel.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertFalse(y.toBoolean()); } @Test(expected = Exception.class) public void sandboxRead() { YesCancel y = YesCancel.readValue(BasicDialogValue.Primitive.SANDBOX.name()); } public void cacnelRead() { YesCancel y = YesCancel.readValue(BasicDialogValue.Primitive.CANCEL.name()); Assert.assertFalse(y.toBoolean()); } @Test(expected = Exception.class) public void nonsenseRead() { YesCancel y = YesCancel.readValue("blah"); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesTest.0000644000000000000000000000013213441742745030527 xustar0030 mtime=1552401893.073832752 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesTest.java0000644000175000002070000000527313441742745032210 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import org.junit.Assert; import org.junit.Test; public class YesTest { @Test public void yesReadWrite() { Yes y = new Yes(); String s = y.writeValue(); Yes yy = Yes.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertTrue(y.toBoolean()); } public void yesReadOk() { Yes yy = Yes.readValue(BasicDialogValue.Primitive.YES.toString()); } @Test(expected = Exception.class) public void yesReadNonsense1() { Yes yy = Yes.readValue("blah"); } @Test(expected = Exception.class) public void yesReadNonsense2() { Yes yy = Yes.readValue(BasicDialogValue.Primitive.CANCEL.toString()); } @Test(expected = Exception.class) public void yesReadNonsense3() { Yes yy = Yes.readValue(BasicDialogValue.Primitive.NO.toString()); } @Test(expected = Exception.class) public void yesReadNonsense4() { Yes yy = Yes.readValue(BasicDialogValue.Primitive.SANDBOX.toString()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesNoSan0000644000000000000000000000013213441742745030550 xustar0030 mtime=1552401893.067832765 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesNoSandboxTest.java0000644000175000002070000000660213441742745034021 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import org.junit.Assert; import org.junit.Test; public class YesNoSandboxTest { @Test public void yesReadWrite() { YesNoSandbox y = YesNoSandbox.yes(); String s = y.writeValue(); YesNoSandbox yy = YesNoSandbox.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertTrue(y.toBoolean()); } @Test public void noReadWrite() { YesNoSandbox y = YesNoSandbox.no(); String s = y.writeValue(); YesNoSandbox yy = YesNoSandbox.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertFalse(y.toBoolean()); } @Test public void sandboxReadWrite() { YesNoSandbox y = YesNoSandbox.sandbox(); String s = y.writeValue(); YesNoSandbox yy = YesNoSandbox.readValue(s); Assert.assertEquals(y.getValue(), yy.getValue()); Assert.assertTrue(y.toBoolean()); } @Test(expected = Exception.class) public void cancelRead() { YesNoSandbox y = YesNoSandbox.readValue(BasicDialogValue.Primitive.CANCEL.name()); } @Test(expected = Exception.class) public void nonsenseRead() { YesNoSandbox y = YesNoSandbox.readValue("blah"); } public void noRead() { YesNoSandbox y = YesNoSandbox.readValue(BasicDialogValue.Primitive.NO.name()); Assert.assertFalse(y.toBoolean()); } public void yesRead() { YesNoSandbox y = YesNoSandbox.readValue(BasicDialogValue.Primitive.YES.name()); Assert.assertTrue(y.toBoolean()); } public void sandboxRead() { YesNoSandbox y = YesNoSandbox.readValue(BasicDialogValue.Primitive.SANDBOX.name()); Assert.assertTrue(y.toBoolean()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/PaxHeaders.7406/appletextendedsecurity0000644000000000000000000000013213441742745030766 xustar0030 mtime=1552401893.072832754 30 atime=1552410887.112183445 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/0000755000175000002070000000000013441742745031653 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.74060000644000000000000000000000031213441742745030766 xustar00112 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UrlRegExTest.java 30 mtime=1552401893.063832773 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UrlRegExTest.ja0000644000175000002070000002174313441742745034533 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; import org.junit.Assert; import org.junit.Test; public class UrlRegExTest { @Test public void testSimpleUnquote2() throws Exception { Assert.assertEquals("aabbccddee", UrlRegEx.simpleUnquote("aa\\Qbb\\Ecc\\Qdd\\Eee")); Assert.assertEquals("aabbccddee", UrlRegEx.simpleUnquote("aa\\Qbb\\Ecc\\Qdd\\Eee")); Assert.assertEquals("a\\Ea\\Ee\\Ee", UrlRegEx.simpleUnquote("a\\Ea\\Q\\E\\E\\Q\\Ee\\Ee")); Assert.assertEquals("http://url.cz/", UrlRegEx.simpleUnquote("\\Qhttp://url.cz/\\E")); Assert.assertEquals("http://url.cz/.*", UrlRegEx.simpleUnquote("\\Qhttp://url.cz/\\E.*")); Assert.assertEquals("http://ur\\El.cz/.*", UrlRegEx.simpleUnquote("\\Qhttp://ur\\E\\E\\Ql.cz/\\E.*")); } @Test public void testSimpleUnquote1() throws Exception { Assert.assertEquals("\\Q", UrlRegEx.simpleUnquote("\\Q\\Q\\E")); Assert.assertEquals("a\\Q", UrlRegEx.simpleUnquote("a\\Q\\Q\\E")); Assert.assertEquals("\\Qb", UrlRegEx.simpleUnquote("\\Q\\Q\\Eb")); Assert.assertEquals("a\\Qb", UrlRegEx.simpleUnquote("a\\Q\\Q\\Eb")); Assert.assertEquals("abc", UrlRegEx.simpleUnquote("a\\Qb\\Ec")); Assert.assertEquals("aabbcc", UrlRegEx.simpleUnquote("aa\\Qbb\\Ecc")); Assert.assertEquals("aabb", UrlRegEx.simpleUnquote("aa\\Qbb\\E")); Assert.assertEquals("bbcc", UrlRegEx.simpleUnquote("\\Qbb\\Ecc")); Assert.assertEquals("aacc", UrlRegEx.simpleUnquote("aa\\Q\\Ecc")); Assert.assertEquals("a", UrlRegEx.simpleUnquote("\\Qa\\E")); Assert.assertEquals("ab", UrlRegEx.simpleUnquote("\\Qab\\E")); Assert.assertEquals("", UrlRegEx.simpleUnquote("\\Q\\E")); Assert.assertEquals("", UrlRegEx.simpleUnquote("")); Assert.assertEquals("a", UrlRegEx.simpleUnquote("a")); Assert.assertEquals("ab", UrlRegEx.simpleUnquote("ab")); Assert.assertEquals("abc", UrlRegEx.simpleUnquote("abc")); Assert.assertEquals("Q", UrlRegEx.simpleUnquote("Q")); Assert.assertEquals("QE", UrlRegEx.simpleUnquote("QE")); Assert.assertEquals("Q\\E", UrlRegEx.simpleUnquote("Q\\E")); Assert.assertEquals("\\E", UrlRegEx.simpleUnquote("\\E")); Assert.assertEquals("\\E\\E\\E", UrlRegEx.simpleUnquote("\\E\\E\\E")); } @Test public void testReplaceAll1() throws Exception { Assert.assertEquals("abcd", UrlRegEx.replaceLast("abcd", "X", "Y")); Assert.assertEquals("abcD", UrlRegEx.replaceLast("abcd", "d", "D")); Assert.assertEquals("abcDef", UrlRegEx.replaceLast("abcdef", "d", "D")); Assert.assertEquals("abcdD", UrlRegEx.replaceLast("abcdd", "d", "D")); Assert.assertEquals("Abcd", UrlRegEx.replaceLast("abcd", "a", "A")); Assert.assertEquals("aAbcd", UrlRegEx.replaceLast("aabcd", "a", "A")); } @Test public void testReplaceAll2() throws Exception { Assert.assertEquals("abcd", UrlRegEx.replaceLast("abcd", "abcde", "")); Assert.assertEquals("abc", UrlRegEx.replaceLast("abcd", "d", "")); Assert.assertEquals("abcef", UrlRegEx.replaceLast("abcdef", "d", "")); Assert.assertEquals("bcdef", UrlRegEx.replaceLast("abcdef", "a", "")); Assert.assertEquals("abcdef", UrlRegEx.replaceLast("aabcdef", "a", "")); Assert.assertEquals("ab", UrlRegEx.replaceLast("abcd", "cd", "")); Assert.assertEquals("abf", UrlRegEx.replaceLast("abcdef", "cde", "")); Assert.assertEquals("cdef", UrlRegEx.replaceLast("abcdef", "ab", "")); Assert.assertEquals("acdef", UrlRegEx.replaceLast("aabcdef", "ab", "")); Assert.assertEquals("", UrlRegEx.replaceLast("abc", "abc", "")); } @Test public void testReplaceAll3() throws Exception { Assert.assertEquals("abcd", UrlRegEx.replaceLast("abcd", "xyz", "ABCDE")); Assert.assertEquals("abcDD", UrlRegEx.replaceLast("abcd", "d", "DD")); Assert.assertEquals("abcDDDef", UrlRegEx.replaceLast("abcdef", "d", "DDD")); Assert.assertEquals("AAbcdef", UrlRegEx.replaceLast("abcdef", "a", "AA")); Assert.assertEquals("aAAAbcdef", UrlRegEx.replaceLast("aabcdef", "a", "AAA")); Assert.assertEquals("abXCDY", UrlRegEx.replaceLast("abcd", "cd", "XCDY")); Assert.assertEquals("abXCDEYZf", UrlRegEx.replaceLast("abcdef", "cde", "XCDEYZ")); Assert.assertEquals("XABYcdef", UrlRegEx.replaceLast("abcdef", "ab", "XABY")); Assert.assertEquals("aABCDcdef", UrlRegEx.replaceLast("aabcdef", "ab", "ABCD")); Assert.assertEquals("ABC", UrlRegEx.replaceLast("abc", "abc", "ABC")); Assert.assertEquals("ABCE", UrlRegEx.replaceLast("abc", "abc", "ABCE")); } @Test public void testExact() throws Exception { String s1 = "string"; String s2 = "reg.*ex"; String s3 = "reg\\Eex"; String s4 = "reg\\.\\*ex"; UrlRegEx a1 = UrlRegEx.exact(s1); UrlRegEx a2 = UrlRegEx.exact(s2); UrlRegEx a3 = UrlRegEx.exact(s3); UrlRegEx a4 = UrlRegEx.exact(s4); Assert.assertEquals(s1, a1.getRegEx()); Assert.assertEquals(s2, a2.getRegEx()); Assert.assertEquals(s3, a3.getRegEx()); Assert.assertEquals(s4, a4.getRegEx()); Assert.assertTrue("regXXXex".matches(a2.getRegEx())); Assert.assertFalse("regXXXex".matches(a4.getRegEx())); Assert.assertEquals(s1, a1.getFilteredRegEx()); Assert.assertEquals(s2, a2.getFilteredRegEx()); Assert.assertEquals(s3, a3.getFilteredRegEx()); Assert.assertEquals(s4, a4.getFilteredRegEx()); } @Test public void testQuote1() throws Exception { String s1 = "string"; String s2 = "reg.*ex"; String s3 = "reg\\.\\*ex"; UrlRegEx a1 = UrlRegEx.quote(s1); UrlRegEx a2 = UrlRegEx.quote(s2); UrlRegEx a3 = UrlRegEx.quote(s3); Assert.assertEquals("\\Q" + s1 + "\\E", a1.getRegEx()); Assert.assertEquals("\\Q" + s2 + "\\E", a2.getRegEx()); Assert.assertEquals("\\Q" + s3 + "\\E", a3.getRegEx()); Assert.assertTrue("string".matches(a1.getRegEx())); Assert.assertFalse("regXXXex".matches(a2.getRegEx())); Assert.assertTrue("reg.*ex".matches(a2.getRegEx())); Assert.assertFalse("regXXXex".matches(a3.getRegEx())); Assert.assertFalse("reg.*ex".matches(a3.getRegEx())); Assert.assertTrue("reg\\.\\*ex".matches(a3.getRegEx())); Assert.assertEquals(s1, a1.getFilteredRegEx()); Assert.assertEquals(s2, a2.getFilteredRegEx()); Assert.assertEquals(s3, a3.getFilteredRegEx()); } @Test public void testQuote2() throws Exception { String s1 = "stri\\Eng"; String s2 = "reg.*ex"; String s3 = "reg\\.\\*ex"; UrlRegEx a1 = UrlRegEx.quote(s1); UrlRegEx a2 = UrlRegEx.quote(s2); UrlRegEx a3 = UrlRegEx.quote(s3); Assert.assertNotEquals("\\Qstri\\Eng\\E", a1.getRegEx()); Assert.assertEquals("\\Q" + s2 + "\\E", a2.getRegEx()); Assert.assertEquals("\\Q" + s3 + "\\E", a3.getRegEx()); Assert.assertFalse("regXXXex".matches(a2.getRegEx())); Assert.assertTrue("reg.*ex".matches(a2.getRegEx())); Assert.assertTrue("stri\\Eng".matches(a1.getRegEx())); Assert.assertEquals(s1, a1.getFilteredRegEx()); Assert.assertEquals(s2, a2.getFilteredRegEx()); Assert.assertEquals(s3, a3.getFilteredRegEx()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.74060000644000000000000000000000013213441742745030766 xustar0030 mtime=1552401893.097832702 30 atime=1552410887.112183445 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/0000755000175000002070000000000013441742745032614 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/PaxHeaders0000644000000000000000000000034613441742745031337 xustar00140 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImplTest.java 30 mtime=1552401893.097832702 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAp0000644000175000002070000003556613441742745034613 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity.impl; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import java.io.File; import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class UnsignedAppletActionStorageImplTest { private static final String versionLine=UnsignedAppletActionStorageImpl.versionPreffix+UnsignedAppletActionStorageImpl.currentVersion+"\n"; private static File f1; private static File f2; private static File f3; private static File ff1; private static File ff2; private static File ff3; private static File ff4; private abstract static class c1 implements RememberableDialog { }; private abstract static class c2 implements RememberableDialog { }; private abstract static class c3 implements RememberableDialog { }; private abstract static class c4 implements RememberableDialog { }; private abstract static class c5 implements RememberableDialog { }; private abstract static class c6 implements RememberableDialog { }; private abstract static class c7 implements RememberableDialog { }; @BeforeClass public static void preapreTestFiles() throws IOException { f1 = File.createTempFile("itwMatching", "testFile1"); f2 = File.createTempFile("itwMatching", "testFile2"); f3 = File.createTempFile("itwMatching", "testFile3"); ServerAccess.saveFile(versionLine+"c1:A{YES}; 123456 .* .* jar1,jar2", f1); ServerAccess.saveFile(versionLine+"c1:N{NO}; 123456 .* \\Qbla\\E jar1,jar2", f2); ServerAccess.saveFile(versionLine + "c1:A{YES}; 1 \\Qhttp://jmol.sourceforge.net/demo/atoms/\\E \\Qhttp://jmol.sourceforge.net/jmol/\\E JmolApplet0.jar\n" + "c1:N{NO}; 1363278653454 \\Qhttp://www.walter-fendt.de/ph14e\\E.* \\Qhttp://www.walter-fendt.de\\E.*\n" + "c1:n{NO}; 1363281783104 \\Qhttp://www.walter-fendt.de/ph14e/inclplane.htm\\E \\Qhttp://www.walter-fendt.de/ph14_jar/\\E Ph14English.jar,SchiefeEbene.jar" + "c1:y{YES};c2:A{YES}; 1 \\Qhttp://jmol.sourceforge.net/demo/atoms/\\E \\Qhttp://jmol.sourceforge.net/jmol/\\E JmolApplet0.jar\n" + "c1:A{YES};c2:A{YES}; 1363278653454 \\Qhttp://www.walter-fendt.de/ph14e\\E.* \\Qhttp://www.walter-fendt.de\\E.*\n" + "c1:n{NO};c2:n{NO}; 1363281783104 \\Qhttp://www.walter-fendt.de/ph14e/inclplane.htm\\E \\Qhttp://www.walter-fendt.de/ph14_jar/\\E Ph14English.jar,SchiefeEbene.jar" + "", f3); ff1 = File.createTempFile("itwMatching", "testFile1"); ff2 = File.createTempFile("itwMatching", "testFile2"); ff3 = File.createTempFile("itwMatching", "testFile3"); ff4 = File.createTempFile("itwMatching", "testFile3"); ServerAccess.saveFile(versionLine+"c1:A{YES};c3:n{NO}; 123456 .* .* jar1,jar2", ff1); ServerAccess.saveFile(versionLine+"c6:y{YES}; 123456 .* \\Qbla\\E jar1,jar2", ff2); ServerAccess.saveFile(versionLine+"c6:A{YES}; 123456 .* \\Qbla\\E jar1,jar2", ff4); ServerAccess.saveFile(versionLine + "c2:A{YES}; 1 \\Qa\\E \\Qb\\E jar1\n" + "c1:N{NO};c2:N{NO};c3:A{YES}; 2 \\Qc\\E \\Qd\\E\n" + "c1:n{NO};c2:y{YES};c4:y{YES};c5:n{NO}; 3 \\Qe\\E \\Qf\\E j1,j2" + "", ff3); } @AfterClass public static void removeTestFiles() throws IOException { f1.delete(); f2.delete(); f3.delete(); ff1.delete(); ff2.delete(); ff3.delete(); ff4.delete(); } @Test public void multipleActionsf4JustLoad() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff4); //pass } @Test public void multipleActionsf4() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff4); //reed whatever UnsignedAppletActionEntry r1 = i1.getMatchingItem("a", "b", Arrays.asList(new String[]{"jar1"}), c1.class); //nonmapped return null Assert.assertEquals(null, r1); } @Test public void multipleActionsf3() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff3); UnsignedAppletActionEntry r1 = i1.getMatchingItem("a", "b", Arrays.asList(new String[]{"jar1"}), c1.class); UnsignedAppletActionEntry r2 = i1.getMatchingItem("c", "d", Arrays.asList(new String[]{}), c2.class); UnsignedAppletActionEntry r3 = i1.getMatchingItem("e", "f", Arrays.asList(new String[]{"j1", "j2"}), c3.class); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, new Result(c1.class), Result.AY(c2.class), new Result(c3.class)); Assert.assertNotNull("r2 should be found", r2); Assert.assertEquals(ExecuteAppletAction.NEVER, r2.getAppletSecurityActions().getActionEntry(c1.class).getAction()); checkValues(r2, Result.NN(c1.class), Result.NN(c2.class), Result.AY(c3.class)); Assert.assertNotNull("r3 should be found", r3); checkValues(r3, Result.nN(c1.class), Result.yY(c2.class), Result.NUL(c3.class), Result.yY(c4.class), Result.nN(c5.class)); } @Test public void multipleActionsf2() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff2); UnsignedAppletActionEntry r1 = i1.getMatchingItem("whatever", "bla", Arrays.asList(new String[]{"jar1", "jar2"}), c6.class); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, Result.NUL(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.yY(c6.class)); } @Test public void multipleActionsf1() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff1); UnsignedAppletActionEntry r1 = i1.getMatchingItem("bla", "blaBla", Arrays.asList(new String[]{"jar1", "jar2"}), c1.class); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, Result.AY(c1.class), Result.NUL(c2.class), Result.nN(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class) ); } @Test public void wildcards1() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(f3); UnsignedAppletActionEntry r1 = i1.getMatchingItem("http://www.walter-fendt.de/ph14e/inclplane.htm", "http://www.walter-fendt.de/ph14_jar/", Arrays.asList(new String[]{"Ph14English.jar", "SchiefeEbene.jar"}), c1.class); Assert.assertNotNull("r1 should be found", r1); ServerAccess.logOutputReprint(r1.toString()); //stronger result checkValues(r1, Result.NN(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class) ); } @Test public void allMatchingDocAndCode() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(f1); UnsignedAppletActionEntry r1 = i1.getMatchingItem("bla", "blaBla", Arrays.asList(new String[]{"jar1", "jar2"}), c1.class); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, Result.AY(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class) ); UnsignedAppletActionEntry r3 = i1.getMatchingItem("blah", "blaBla", Arrays.asList(new String[]{"jar2", "jar1"}), c1.class); checkValues(r3, Result.AY(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class) ); Assert.assertNotNull("r3 should be found", r3); UnsignedAppletActionEntry r4 = i1.getMatchingItem("blha", "blaBlam", Arrays.asList(new String[]{"jar2", "wrong_jar"}), c1.class); Assert.assertNull("r4 should NOT be found", r4); UnsignedAppletActionEntry r5 = i1.getMatchingItem("blaBla", "blaBlaBla", Arrays.asList(new String[]{"jar2"}), c1.class); Assert.assertNull("r5 should NOT be found", r5); } @Test public void allMatchingDocAndStrictCode() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(f2); UnsignedAppletActionEntry r1 = i1.getMatchingItem("whatever", "bla", Arrays.asList(new String[]{"jar1", "jar2"}), c1.class); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, Result.NN(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class)); UnsignedAppletActionEntry r3 = i1.getMatchingItem("whatever", null, Arrays.asList(new String[]{"jar2", "jar1"}), c1.class); Assert.assertNotNull("r3 should be found", r3); checkValues(r3, Result.NN(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class)); UnsignedAppletActionEntry r2 = i1.getMatchingItem("bla", "blaBlam", Arrays.asList(new String[]{"jar1", "jar2"}), c1.class); Assert.assertNull("r2 should NOT be found", r2); UnsignedAppletActionEntry r4 = i1.getMatchingItem(null, "blaBlam", null, c1.class); Assert.assertNull("r4 should NOT be found", r4); } @Test public void allMatchingDocAndCodeWithNulls() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(f1); UnsignedAppletActionEntry r1 = i1.getMatchingItem("bla", "blaBla", null, c1.class); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, Result.AY(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class)); UnsignedAppletActionEntry r3 = i1.getMatchingItem("bla", "whatever", null, c1.class); Assert.assertNotNull("r3 should be found", r3); checkValues(r3, Result.AY(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class)); UnsignedAppletActionEntry r2 = i1.getMatchingItem("bla", "blaBla", Arrays.asList(new String[]{"jar2", "jar1"}), c1.class); Assert.assertNotNull("r2 should be found", r2); checkValues(r2, Result.AY(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class)); UnsignedAppletActionEntry r4 = i1.getMatchingItem("bla", "blaBla", null, c1.class); Assert.assertNotNull("r4 should be found", r4); checkValues(r2, Result.AY(c1.class), Result.NUL(c2.class), Result.NUL(c3.class), Result.NUL(c4.class), Result.NUL(c5.class), Result.NUL(c6.class)); UnsignedAppletActionEntry r5 = i1.getMatchingItem("", "blaBla", Arrays.asList(new String[]{"jar2", "jar1"}), c1.class); Assert.assertNotNull("r5 should be found", r5); UnsignedAppletActionEntry r6 = i1.getMatchingItem(null, null, Arrays.asList(new String[]{"jar2", "jar1"}), c1.class); Assert.assertNotNull("r6 should be found", r6); UnsignedAppletActionEntry r7 = i1.getMatchingItem(null, null, Arrays.asList(new String[]{"jar2", "jar11"}), c1.class); Assert.assertNull("r7 should NOT be found", r7); } private void checkValues(UnsignedAppletActionEntry item, Result... results) { for (Result result : results) { if (result.nul) { Assert.assertEquals(null, item.getAppletSecurityActions().getActionEntry(result.id)); } else { Assert.assertEquals(result.action, item.getAppletSecurityActions().getActionEntry(result.id).getAction()); Assert.assertEquals(result.savedValue, item.getAppletSecurityActions().getActionEntry(result.id).getSavedValue()); } } } private static class Result { public final ExecuteAppletAction action; public final String savedValue; public final boolean nul; public final Class id; public static Result AY(Class id) { return new Result(ExecuteAppletAction.ALWAYS, "YES", id); } public static Result yY(Class id) { return new Result(ExecuteAppletAction.YES, "YES", id); } public static Result NN(Class id) { return new Result(ExecuteAppletAction.NEVER, "NO", id); } public static Result nN(Class id) { return new Result(ExecuteAppletAction.NO, "NO", id); } public static Result NUL(Class id) { return new Result(id); } public Result(ExecuteAppletAction action, String savedValue, Class id) { this.action = action; this.savedValue = savedValue; this.nul = false; this.id = id; } public Result(Class id) { this.action = null; this.savedValue = null; this.nul = true; this.id = id; } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/PaxHeaders0000644000000000000000000000033113441742745031331 xustar00127 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/VersionRestrictionTest.java 30 mtime=1552401893.078832742 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/VersionRes0000644000175000002070000003311513441742745034641 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity.impl; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.Arrays; import java.util.Date; import java.util.List; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import net.sourceforge.jnlp.security.appletextendedsecurity.UrlRegEx; import net.sourceforge.jnlp.security.dialogs.remember.AppletSecurityActions; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import net.sourceforge.jnlp.security.dialogs.remember.SavedRememberAction; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class VersionRestrictionTest extends NoStdOutErrTest { private static File testFile; private static final SavedRememberAction sra = new SavedRememberAction(ExecuteAppletAction.ALWAYS, "NO"); private static final AppletSecurityActions asa = AppletSecurityActions.fromAction(cN.class, sra); private static final UrlRegEx urx = UrlRegEx.quote("http://aa.bb/"); private static final List archs = Arrays.asList("res.jar"); private static final UnsignedAppletActionEntry aq = new UnsignedAppletActionEntry(asa, new Date(1l), urx, urx, archs); private abstract static class cN implements RememberableDialog { }; @Before public void preapreNewTestFile() throws IOException { testFile = File.createTempFile("itwAES", "testFile"); testFile.deleteOnExit(); } @After public void removeAllPossibleBackupFiles() throws IOException { File[] f = getBackupFiles(); for (File file : f) { file.deleteOnExit(); } for (File file : f) { file.delete(); } checkBackupFile(false); } private File[] getBackupFiles() { File[] f = testFile.getParentFile().listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.matches(testFile.getName() + "\\.[0123456789]+" + UnsignedAppletActionStorageImpl.BACKUP_SUFFIX); } }); return f; } private void checkBackupFile(boolean created) throws IOException { checkBackupFile(created, 0); } private void checkBackupFile(boolean created, int expectedVersion) throws IOException { File[] f = getBackupFiles(); if (!created) { Assert.assertEquals("no backup should exists", 0, f.length); } else { Assert.assertEquals("there should be exactly one backup", 1, f.length); Assert.assertTrue(f[0].getName().endsWith("." + expectedVersion + UnsignedAppletActionStorageImpl.BACKUP_SUFFIX)); String s = FileUtils.loadFileAsString(f[0]); String l[] = s.split("\\n"); int hc = 0; for (String string : l) { string = string.trim(); if (string.startsWith(UnsignedAppletActionStorageImpl.versionPreffix)) { hc++; if (hc == 1) { Assert.assertTrue("first header must contains warning", string.contains("!WARNING!")); } else { Assert.assertFalse("only first header can contains warning", string.contains("!WARNING!")); } } } Assert.assertTrue("at least one header must be in backup", hc > 0); } } @Test public void numberFormatExceptionInOnInLoad1() throws IOException { ServerAccess.saveFile("#VERSION X\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true, 0); } @Test public void numberFormatExceptionInOnInLoad2() throws IOException { ServerAccess.saveFile("#VERSION\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true, 0); } @Test public void numberFormatExceptionInOnInLoad3() throws IOException { ServerAccess.saveFile("#VERSION \n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true, 0); } @Test public void numberFormatExceptionInOnInLoad4() throws IOException { ServerAccess.saveFile("#VERSION \n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true, 0); } @Test public void correctLoad() throws IOException { ServerAccess.saveFile("#VERSION 2\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(1, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(2, i1.items.size()); checkBackupFile(false); } @Test public void correctLoad2() throws IOException { ServerAccess.saveFile("#VERSION 2" + "\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar" + "\n" + "cN:N{YES}; 1 \\Qhttp://some2.url/\\E \\Qhttp://some2.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(2, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(3, i1.items.size()); checkBackupFile(false); } @Test public void correctLoad3() throws IOException { ServerAccess.saveFile("\n" + "\n" + "#VERSION 2" + "\n" + "\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar" + "\n" + "cN:N{YES}; 1 \\Qhttp://some2.url/\\E \\Qhttp://some2.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(2, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(3, i1.items.size()); checkBackupFile(false); } @Test public void firstVersionValidOnlyOK() throws IOException { ServerAccess.saveFile("\n" + "\n" + "#VERSION 2" + "\n" + "#VERSION 1" + "\n" + "\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar" + "\n" + "cN:N{YES}; 1 \\Qhttp://some2.url/\\E \\Qhttp://some2.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(2, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(3, i1.items.size()); checkBackupFile(false); } @Test public void firstVersionValidOnlyBad() throws IOException { ServerAccess.saveFile("\n" + "\n" + "#VERSION 1" + "\n" + "#VERSION 2" + "\n" + "\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar" + "\n" + "cN:N{YES}; 1 \\Qhttp://some2.url/\\E \\Qhttp://some2.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true, 1); } @Test public void laterVersionIgnored() throws IOException { ServerAccess.saveFile("\n" + "\n" + "\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar" + "#VERSION 2\n" + "cN:N{YES}; 1 \\Qhttp://some2.url/\\E \\Qhttp://some2.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true); } @Test public void incorrectLoad() throws IOException { ServerAccess.saveFile("#VERSION 1\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true, 1); } @Test public void incorrectLoad1() throws IOException { ServerAccess.saveFile("#VERSION2\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true, 0); } @Test public void incorrectLoad2() throws IOException { ServerAccess.saveFile("#VERSION 1" + "\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar" + "\n" + "cN:N{YES}; 1 \\Qhttp://some2.url/\\E \\Qhttp://some2.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true, 1); } @Test public void noVersionNoLoad() throws IOException { ServerAccess.saveFile("\n" + "cN:N{YES}; 1 \\Qhttp://some.url/\\E \\Qhttp://some.url/\\E jar.jar" + "\n" + "cN:N{YES}; 1 \\Qhttp://some2.url/\\E \\Qhttp://some2.url/\\E jar.jar", testFile); UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(testFile); i1.readContents(); Assert.assertEquals(0, i1.items.size()); i1.add(aq); i1.readContents(); Assert.assertEquals(1, i1.items.size()); checkBackupFile(true); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/PaxHeaders0000644000000000000000000000035413441742745031336 xustar00146 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/LegacyUnsignedAppletActionStorageImplTest.java 30 mtime=1552401893.072832754 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/LegacyUnsi0000644000175000002070000003000013441742745034573 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity.impl; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import java.io.File; import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.security.dialogs.remember.AppletSecurityActions; import net.sourceforge.jnlp.security.dialogs.remember.AppletSecurityActionsTest; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class LegacyUnsignedAppletActionStorageImplTest { private static File f1; private static File f2; private static File f3; private static File ff1; private static File ff2; private static File ff3; private static File ff4; private static final String versionLine=UnsignedAppletActionStorageImpl.versionPreffix+UnsignedAppletActionStorageImpl.currentVersion+"\n"; @BeforeClass public static void preapreTestFiles() throws IOException { f1 = File.createTempFile("itwMatching", "testFile1"); f2 = File.createTempFile("itwMatching", "testFile2"); f3 = File.createTempFile("itwMatching", "testFile3"); ServerAccess.saveFile(versionLine+"A 123456 .* .* jar1,jar2", f1); ServerAccess.saveFile(versionLine+"N 123456 .* \\Qbla\\E jar1,jar2", f2); ServerAccess.saveFile(versionLine + "A 1 \\Qhttp://jmol.sourceforge.net/demo/atoms/\\E \\Qhttp://jmol.sourceforge.net/jmol/\\E JmolApplet0.jar\n" + "N 1363278653454 \\Qhttp://www.walter-fendt.de/ph14e\\E.* \\Qhttp://www.walter-fendt.de\\E.*\n" + "n 1363281783104 \\Qhttp://www.walter-fendt.de/ph14e/inclplane.htm\\E \\Qhttp://www.walter-fendt.de/ph14_jar/\\E Ph14English.jar,SchiefeEbene.jar" + "yA 1 \\Qhttp://jmol.sourceforge.net/demo/atoms/\\E \\Qhttp://jmol.sourceforge.net/jmol/\\E JmolApplet0.jar\n" + "Ay 1363278653454 \\Qhttp://www.walter-fendt.de/ph14e\\E.* \\Qhttp://www.walter-fendt.de\\E.*\n" + "nn 1363281783104 \\Qhttp://www.walter-fendt.de/ph14e/inclplane.htm\\E \\Qhttp://www.walter-fendt.de/ph14_jar/\\E Ph14English.jar,SchiefeEbene.jar" + "", f3); ff1 = File.createTempFile("itwMatching", "testFile1"); ff2 = File.createTempFile("itwMatching", "testFile2"); ff3 = File.createTempFile("itwMatching", "testFile3"); ff4 = File.createTempFile("itwMatching", "testFile3"); ServerAccess.saveFile(versionLine+"AXn 123456 .* .* jar1,jar2", ff1); ServerAccess.saveFile(versionLine+"XXXXXy 123456 .* \\Qbla\\E jar1,jar2", ff2); ServerAccess.saveFile(versionLine+"XXXXXA 123456 .* \\Qbla\\E jar1,jar2", ff4); ServerAccess.saveFile(versionLine + "XA 1 \\Qa\\E \\Qb\\E jar1\n" + "NNA 2 \\Qc\\E \\Qd\\E\n" + "nyXyn 3 \\Qe\\E \\Qf\\E j1,j2" + "", ff3); } @AfterClass public static void removeTestFiles() throws IOException { f1.delete(); f2.delete(); f3.delete(); ff1.delete(); ff2.delete(); ff3.delete(); ff4.delete(); } @Test public void multipleActionsf4JustLoad() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff4); //pass } private abstract static class cN implements RememberableDialog { }; @Test public void multipleActionsf4() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff4); //reed whatever UnsignedAppletActionEntry r1 = i1.getMatchingItem("a", "b", Arrays.asList(new String[]{"jar1"}), cN.class); //nonmapped return null Assert.assertEquals(null, r1); } @Test public void multipleActionsf3() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff3); UnsignedAppletActionEntry r1 = i1.getMatchingItem("a", "b", Arrays.asList(new String[]{"jar1"}), AppletSecurityActionsTest.MACA); UnsignedAppletActionEntry r2 = i1.getMatchingItem("c", "d", Arrays.asList(new String[]{}), AppletSecurityActionsTest.MACA); UnsignedAppletActionEntry r3 = i1.getMatchingItem("e", "f", Arrays.asList(new String[]{"j1", "j2"}), AppletSecurityActionsTest.MACA); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, null, ExecuteAppletAction.ALWAYS); Assert.assertNotNull("r2 should be found", r2); checkValues(r2, ExecuteAppletAction.NEVER, ExecuteAppletAction.NEVER); Assert.assertNotNull("r3 should be found", r3); checkValues(r3, ExecuteAppletAction.NO, ExecuteAppletAction.YES); } @Test public void multipleActionsf2() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff2); UnsignedAppletActionEntry r1 = i1.getMatchingItem("whatever", "bla", Arrays.asList(new String[]{"jar1", "jar2"}), AppletSecurityActionsTest.MACA); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, null, null); } @Test public void multipleActionsf1() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(ff1); UnsignedAppletActionEntry r1 = i1.getMatchingItem("bla", "blaBla", Arrays.asList(new String[]{"jar1", "jar2"}), AppletSecurityActionsTest.MACA); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, ExecuteAppletAction.ALWAYS, null); } @Test public void wildcards1() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(f3); UnsignedAppletActionEntry r1 = i1.getMatchingItem("http://www.walter-fendt.de/ph14e/inclplane.htm", "http://www.walter-fendt.de/ph14_jar/", Arrays.asList(new String[]{"Ph14English.jar", "SchiefeEbene.jar"}), AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r1 should be found", r1); ServerAccess.logOutputReprint(r1.toString()); checkValues(r1, ExecuteAppletAction.NEVER, null); } @Test public void allMatchingDocAndCode() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(f1); UnsignedAppletActionEntry r1 = i1.getMatchingItem("bla", "blaBla", Arrays.asList(new String[]{"jar1", "jar2"}), AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, ExecuteAppletAction.ALWAYS, null); UnsignedAppletActionEntry r3 = i1.getMatchingItem("blah", "blaBla", Arrays.asList(new String[]{"jar2", "jar1"}), AppletSecurityActionsTest.UATWA); checkValues(r3, ExecuteAppletAction.ALWAYS, null); Assert.assertNotNull("r3 should be found", r3); UnsignedAppletActionEntry r4 = i1.getMatchingItem("blha", "blaBlam", Arrays.asList(new String[]{"jar2", "wrong_jar"}), AppletSecurityActionsTest.UATWA); Assert.assertNull("r4 should NOT be found", r4); UnsignedAppletActionEntry r5 = i1.getMatchingItem("blaBla", "blaBlaBla", Arrays.asList(new String[]{"jar2"}), AppletSecurityActionsTest.UATWA); Assert.assertNull("r5 should NOT be found", r5); } @Test public void allMatchingDocAndStrictCode() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(f2); UnsignedAppletActionEntry r1 = i1.getMatchingItem("whatever", "bla", Arrays.asList(new String[]{"jar1", "jar2"}), AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, ExecuteAppletAction.NEVER, null); UnsignedAppletActionEntry r3 = i1.getMatchingItem("whatever", null, Arrays.asList(new String[]{"jar2", "jar1"}), AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r3 should be found", r3); checkValues(r3, ExecuteAppletAction.NEVER, null); UnsignedAppletActionEntry r2 = i1.getMatchingItem("bla", "blaBlam", Arrays.asList(new String[]{"jar1", "jar2"}), AppletSecurityActionsTest.UATWA); Assert.assertNull("r2 should NOT be found", r2); UnsignedAppletActionEntry r4 = i1.getMatchingItem(null, "blaBlam", null, AppletSecurityActionsTest.UATWA); Assert.assertNull("r4 should NOT be found", r4); } @Test public void allMatchingDocAndCodeWithNulls() { UnsignedAppletActionStorageImpl i1 = new UnsignedAppletActionStorageImpl(f1); UnsignedAppletActionEntry r1 = i1.getMatchingItem("bla", "blaBla", null, AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r1 should be found", r1); checkValues(r1, ExecuteAppletAction.ALWAYS, null); UnsignedAppletActionEntry r3 = i1.getMatchingItem("bla", "whatever", null, AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r3 should be found", r3); checkValues(r3, ExecuteAppletAction.ALWAYS, null); UnsignedAppletActionEntry r2 = i1.getMatchingItem("bla", "blaBla", Arrays.asList(new String[]{"jar2", "jar1"}), AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r2 should be found", r2); checkValues(r2, ExecuteAppletAction.ALWAYS, null); UnsignedAppletActionEntry r4 = i1.getMatchingItem("bla", "blaBla", null, AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r4 should be found", r4); checkValues(r2, ExecuteAppletAction.ALWAYS, null); UnsignedAppletActionEntry r5 = i1.getMatchingItem("", "blaBla", Arrays.asList(new String[]{"jar2", "jar1"}), AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r5 should be found", r5); UnsignedAppletActionEntry r6 = i1.getMatchingItem(null, null, Arrays.asList(new String[]{"jar2", "jar1"}), AppletSecurityActionsTest.UATWA); Assert.assertNotNull("r6 should be found", r6); UnsignedAppletActionEntry r7 = i1.getMatchingItem(null, null, Arrays.asList(new String[]{"jar2", "jar11"}), AppletSecurityActionsTest.UATWA); Assert.assertNull("r7 should NOT be found", r7); } private void checkValues(UnsignedAppletActionEntry item, ExecuteAppletAction uaca, ExecuteAppletAction maca) { AppletSecurityActions as = item.getAppletSecurityActions(); ExecuteAppletAction q1 = item.getAppletSecurityActions().getAction(AppletSecurityActionsTest.UATWA); ExecuteAppletAction q2 = item.getAppletSecurityActions().getAction(AppletSecurityActionsTest.MACA); Assert.assertEquals(uaca, q1); Assert.assertEquals(maca, q2); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.74060000644000000000000000000000034113441742745030770 xustar00135 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmationTest.java 30 mtime=1552401893.066832766 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletT0000644000175000002070000003712613441742745034655 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; import java.io.File; import java.io.IOException; import java.io.StringReader; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.net.MalformedURLException; import java.net.URL; import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.List; import java.util.Properties; import net.sourceforge.jnlp.InformationDesc; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.mock.DummyJNLPFileWithJar; import net.sourceforge.jnlp.security.appletextendedsecurity.impl.UnsignedAppletActionStorageImpl; import net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel.UnsignedAppletTrustWarningPanel; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.security.dialogs.remember.SavedRememberAction; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.UrlUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class UnsignedAppletTrustConfirmationTest { private static final String surl1 = "http://codeba.se/app"; private static final String url41 = "http://my.url/app/"; private static final String url42 = "resource.jar"; private static URL url; private static URL url4; private static class DummyJnlpWithTitleAndUrls extends DummyJNLPFileWithJar { public DummyJnlpWithTitleAndUrls(URL u) throws MalformedURLException { super(url, u); } @Override public InformationDesc getInformation() { return new InformationDesc(null, false) { @Override public String getTitle() { return "Demo App"; } }; } @Override public URL getCodeBase() { return url; } @Override public URL getSourceLocation() { return url; } }; @BeforeClass public static void initUrl() throws MalformedURLException { url=new URL(surl1); url4=new URL(url41+url42); } private static File backup; @BeforeClass public static void backupAppTrust() throws IOException{ backup = File.createTempFile("appletExtendedSecurity", "itwUnittest"); backup.deleteOnExit(); FirefoxProfilesOperator.copyFile(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile(), backup); } @AfterClass public static void restoreAppTrust() throws IOException{ FirefoxProfilesOperator.copyFile(backup, PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); } @Test public void updateAppletActionTest1() throws Exception { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file to examine later UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrls(url4), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); String s = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); Assert.assertTrue(s.contains("UnsignedAppletTrustWarningPanel:A{YES}")); Assert.assertTrue(s.contains(url41+url42)); Assert.assertTrue(s.contains(surl1)); UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrls(url4), new SavedRememberAction(ExecuteAppletAction.NEVER, "NO"), Boolean.TRUE, UnsignedAppletTrustWarningPanel.class); s = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); Assert.assertTrue(s.contains("UnsignedAppletTrustWarningPanel:N{NO}")); Assert.assertFalse(s.contains(url41+url42)); Assert.assertTrue(s.contains(surl1)); } @Test public void testToRelativePaths() throws Exception { /* Absolute -> Relative */ assertEquals(Arrays.asList("test.jar"), UnsignedAppletTrustConfirmation.toRelativePaths(Arrays.asList("http://example.com/test.jar"), "http://example.com/")); /* Relative is unchanged */ assertEquals(Arrays.asList("test.jar"), UnsignedAppletTrustConfirmation.toRelativePaths(Arrays.asList("test.jar"), "http://example.com/")); /* Different root URL is unchanged */ assertEquals(Arrays.asList("http://example2.com/test.jar"), UnsignedAppletTrustConfirmation.toRelativePaths(Arrays.asList("http://example2.com/test.jar"), "http://example.com/")); /* Path with invalid URL characters is handled */ assertEquals(Arrays.asList("test .jar"), UnsignedAppletTrustConfirmation.toRelativePaths(Arrays.asList("http://example.com/test .jar"), "http://example.com/")); } @Test public void testSripFile() throws Exception { String sample = "http://aa.bb/"; String result = UrlUtils.stripFile(new URL(sample)); assertEquals(sample, result); sample = "http://aa.bb"; result = UrlUtils.stripFile(new URL(sample)); assertEquals(sample + "/", result); sample = "http://aa.bb/"; result = UrlUtils.stripFile(new URL(sample + "cc")); assertEquals(sample, result); sample = "http://aa.bb/cc/"; result = UrlUtils.stripFile(new URL(sample)); assertEquals(sample, result); sample = "http://aa.bb/some/complicated/"; result = UrlUtils.stripFile(new URL(sample + "some")); assertEquals(sample, result); sample = "http://aa.bb/some/complicated/some/"; result = UrlUtils.stripFile(new URL(sample)); assertEquals(sample, result); sample = "http://aa.bb/some/"; result = UrlUtils.stripFile(new URL(sample + "strange?a=b")); assertEquals(sample, result); sample = "http://aa.bb/some/strange/"; result = UrlUtils.stripFile(new URL(sample + "?a=b")); assertEquals(sample, result); } private static URL urlX1; private static URL urlX2; private static URL urlX3; private static URL urlY1; private static URL urlY2; private static URL urlY3; private static URL urlY4; private static URL urlY5; private static URL urlY6; private static URL urlY7; private static URL urlY8; @BeforeClass public static void initUrlsX123() throws MalformedURLException, IOException { urlX1 = new URL("http:// does not metter is ok"); urlX2 = new URL("http://\ndoes not metter is harmfull"); Properties p = new Properties(); p.load(new StringReader("key=http:\\u002F\\u002F\\u000Adoes\\u0020not\\u0020metter\\u0020is\\u0020harmfull")); urlX3=new URL(p.getProperty("key")); } @BeforeClass public static void initUrlsY12345678() throws MalformedURLException, IOException { urlY1 = new URL("http://som\\EeUrl.cz/aa"); urlY2 = new URL("http://some\\QUrl.cz/aa"); urlY3 = new URL("http://so\\QmeU\\Erl.cz/aa"); urlY4 = new URL("http://so\\EmeU\\Qrl.cz/aa"); urlY5 = new URL("http://someUrl.cz/aa\\Ebb/cc"); urlY6 = new URL("http://someUrl.cz/aa\\Qbb/cc"); urlY7 = new URL("http://someUrl.cz/aa\\Qbb/cc/dd\\Eee"); urlY8 = new URL("http://someUrl.cz/aa\\Ebb/cc/dd\\Qee"); } @Test public void updateAppletActionTestYQN1234saveAndLoadFine() throws Exception { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file to examine later UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrlsWithOverwrite(urlY1), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrlsWithOverwrite(urlY2), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrlsWithOverwrite(urlY3), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrlsWithOverwrite(urlY4), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); AppletStartupSecuritySettings securitySettings = AppletStartupSecuritySettings.getInstance(); UnsignedAppletActionStorageImpl userActionStorage = (UnsignedAppletActionStorageImpl) securitySettings.getUnsignedAppletActionCustomStorage(); List ll = userActionStorage.getMatchingItems(null, null, null); Assert.assertEquals(4, ll.size()); } @Test public void updateAppletActionTestYQN5678saveAndLoadFine() throws Exception { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file to examine later UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrlsWithOverwrite(urlY5), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrlsWithOverwrite(urlY6), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrlsWithOverwrite(urlY7), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrlsWithOverwrite(urlY8), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); AppletStartupSecuritySettings securitySettings = AppletStartupSecuritySettings.getInstance(); UnsignedAppletActionStorageImpl userActionStorage = (UnsignedAppletActionStorageImpl) securitySettings.getUnsignedAppletActionCustomStorage(); List ll = userActionStorage.getMatchingItems(null, null, null); Assert.assertEquals(4, ll.size()); } @Test public void updateAppletActionTestX3() throws Exception { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file to examine later try{ UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrls(urlX3), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); //may throw RuntimeExeption which is correct, however, wee need to check result } catch (Exception ex){ ServerAccess.logException(ex); } String s = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); Assert.assertFalse(s.contains("harmfull")); } @Test public void updateAppletActionTestX2() throws Exception { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file to examine later try{ UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrls(urlX2), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); //may throw RuntimeExeption which is correct, however, wee need to check result } catch (Exception ex){ ServerAccess.logException(ex); } String s = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); Assert.assertFalse(s.contains("harmfull")); } @Test public void updateAppletActionTestX1() throws Exception { //this case is correct, if html ecnoded url is passed as URL from javaws, it is kept intact PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); //clean file to examine later Exception eex = null; try{ UnsignedAppletTrustConfirmation.updateAppletAction( new DummyJnlpWithTitleAndUrls(urlX1), new SavedRememberAction(ExecuteAppletAction.ALWAYS, "YES"), Boolean.FALSE, UnsignedAppletTrustWarningPanel.class); //may throw RuntimeExeption which is correct, however, wee need to check result } catch (Exception ex){ eex = ex; ServerAccess.logException(ex); } String s = FileUtils.loadFileAsString(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); Assert.assertNull(eex); Assert.assertTrue(s.contains("http:// does not metter is ok")); } private static class DummyJnlpWithTitleAndUrlsWithOverwrite extends DummyJnlpWithTitleAndUrls { private final URL u; public DummyJnlpWithTitleAndUrlsWithOverwrite(URL u) throws MalformedURLException { super(u); this.u = u; } @Override public URL getCodeBase() { return u; } @Override public URL getSourceLocation() { return u; } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/PaxHeaders.7406/dialogs0000644000000000000000000000013013441742745025610 xustar0028 mtime=1552401893.0988327 30 atime=1552410887.112183445 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/0000755000175000002070000000000013441742745026477 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/TemporaryPermi0000644000000000000000000000013013441742745030567 xustar0028 mtime=1552401893.0988327 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsTest.java0000644000175000002070000001204213441742745034417 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import static org.junit.Assert.assertEquals; import java.awt.AWTPermission; import java.io.FilePermission; import java.security.Permission; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; import javax.sound.sampled.AudioPermission; import net.sourceforge.jnlp.security.policyeditor.PolicyEditorPermissions; import org.junit.Test; public class TemporaryPermissionsTest { @Test public void testGetPermission() throws Exception { final Permission expected = new FilePermission(System.getProperty("java.io.tmpdir"), "read"); final Permission generated = TemporaryPermissions.getPermission(PolicyEditorPermissions.READ_TMP_FILES); assertEquals(expected, generated); } @Test public void testGetPermissionsVarargs() throws Exception { final Permission readTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "read"); final Permission writeTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "write"); final Set expected = new HashSet<>(Arrays.asList(readTmpPermission, writeTmpPermission)); final Set generated = new HashSet<>(TemporaryPermissions.getPermissions(PolicyEditorPermissions.READ_TMP_FILES, PolicyEditorPermissions.WRITE_TMP_FILES)); assertEquals(expected, generated); } @Test public void testGetPermissionsVarargsArray() throws Exception { final Permission readTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "read"); final Permission writeTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "write"); final Set expected = new HashSet<>(Arrays.asList(readTmpPermission, writeTmpPermission)); final PolicyEditorPermissions[] arr = new PolicyEditorPermissions[] { PolicyEditorPermissions.READ_TMP_FILES, PolicyEditorPermissions.WRITE_TMP_FILES }; final Set generated = new HashSet<>(TemporaryPermissions.getPermissions(arr)); assertEquals(expected, generated); } @Test public void testGetPermissionsCollection() throws Exception { final Permission readTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "read"); final Permission writeTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "write"); final Set expected = new HashSet<>(Arrays.asList(readTmpPermission, writeTmpPermission)); final Collection coll = Arrays.asList(PolicyEditorPermissions.READ_TMP_FILES, PolicyEditorPermissions.WRITE_TMP_FILES); final Set generated = new HashSet<>(TemporaryPermissions.getPermissions(coll)); assertEquals(expected, generated); } @Test public void testGetPermissionsGroup() throws Exception { final Permission playAudio = new AudioPermission("play"); final Permission recordAudio = new AudioPermission("record"); final Permission print = new RuntimePermission("queuePrintJob"); final Permission clipboard = new AWTPermission("accessClipboard"); final Set expected = new HashSet<>(Arrays.asList(playAudio, recordAudio, print, clipboard)); final Set generated = new HashSet<>(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.MediaAccess)); assertEquals(expected, generated); } }icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/remember0000644000000000000000000000013213441742745027410 xustar0030 mtime=1552401893.066832766 30 atime=1552410887.112183445 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/remember/0000755000175000002070000000000013441742745030275 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/remember/PaxHeaders.7406/Apple0000644000000000000000000000032113441742745030451 xustar00119 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/remember/AppletSecurityActionsTest.java 30 mtime=1552401893.066832766 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/remember/AppletSecurityActions0000644000175000002070000002310213441742745034514 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.remember; import net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel.MatchingALACAttributePanel; import net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel.UnsignedAppletTrustWarningPanel; import org.junit.Assert; import static org.junit.Assert.assertEquals; import org.junit.Test; public class AppletSecurityActionsTest { //before 1.7 only those two were remebered. Using in legacy parsing tests public static final Class UATWA = UnsignedAppletTrustWarningPanel.class; public static final Class MACA = MatchingALACAttributePanel.class; @Test public void parseMultipleItemsCorrectLegacy() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString("ANynsXsnyNA"); assertEquals(ExecuteAppletAction.ALWAYS, a1.getAction(UATWA)); assertEquals(ExecuteAppletAction.NEVER, a1.getAction(MACA)); assertEquals(2, a1.getActions().size()); } @Test public void parseMultipleItemsCorrect() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString("c1:A{};c2:N{};c3:y{};c4:n{};c8:n{};c9:y{};c10:N{};c11:A{};"); assertEquals(ExecuteAppletAction.ALWAYS, a1.getAction("c1")); assertEquals(ExecuteAppletAction.NEVER, a1.getAction("c2")); assertEquals(ExecuteAppletAction.YES, a1.getAction("c3")); assertEquals(ExecuteAppletAction.NO, a1.getAction("c4")); assertEquals(ExecuteAppletAction.NO, a1.getAction("c8")); assertEquals(ExecuteAppletAction.YES, a1.getAction("c9")); assertEquals(ExecuteAppletAction.NEVER, a1.getAction("c10")); assertEquals(ExecuteAppletAction.ALWAYS, a1.getAction("c11")); assertEquals(8, a1.getActions().size()); } @Test public void checkToString() throws Exception { AppletSecurityActions as = new AppletSecurityActions(); as.setAction("c1", new SavedRememberAction(ExecuteAppletAction.ALWAYS, "")); as.setAction("c2", new SavedRememberAction(ExecuteAppletAction.ALWAYS, null)); as.setAction("c3", new SavedRememberAction(ExecuteAppletAction.ALWAYS, "item")); String saveString = as.toShortString(); //order is not guaranted Assert.assertTrue(saveString.contains("c3:A{item};")); Assert.assertTrue(saveString.contains("c1:A{};")); Assert.assertTrue(saveString.contains("c2:A{};")); } @Test public void checkToStringIsParsableBack() throws Exception { AppletSecurityActions as = new AppletSecurityActions(); as.setAction("c1", new SavedRememberAction(ExecuteAppletAction.ALWAYS, "")); as.setAction("c2", new SavedRememberAction(ExecuteAppletAction.NEVER, null)); as.setAction("c3", new SavedRememberAction(ExecuteAppletAction.YES, "item")); as.setAction("c2", new SavedRememberAction(ExecuteAppletAction.NO, "item2")); as.setAction("c3", new SavedRememberAction(ExecuteAppletAction.NO, null)); Assert.assertTrue(as.getRealCount() == 3); String saveString = as.toShortString(); AppletSecurityActions a2 = AppletSecurityActions.fromString(saveString); Assert.assertTrue(as.getRealCount() == a2.getRealCount()); SavedRememberAction c1 = a2.getActionEntry("c1"); Assert.assertTrue(c1.getSavedValue() == null || c1.getSavedValue().equals("")); Assert.assertTrue(c1.getAction().equals(ExecuteAppletAction.ALWAYS)); SavedRememberAction c2 = a2.getActionEntry("c2"); Assert.assertTrue(c2.getSavedValue().equals("item2")); Assert.assertTrue(c2.getAction().equals(ExecuteAppletAction.NO)); SavedRememberAction c3 = a2.getActionEntry("c3"); Assert.assertTrue(c3.getSavedValue() == null || c3.getSavedValue().equals("")); //not yet decided Assert.assertTrue(c3.getAction().equals(ExecuteAppletAction.NO)); } @Test public void parseEmpty() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString(""); assertEquals(null, a1.getAction(UATWA)); assertEquals(null, a1.getAction(MACA)); assertEquals(0, a1.getActions().size()); } @Test public void parseOkSetAndGetZero() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString(""); assertEquals(null, a1.getAction(MACA)); assertEquals(0, a1.getActions().size()); a1.setAction(MACA, new SavedRememberAction(ExecuteAppletAction.YES, "aa")); assertEquals(ExecuteAppletAction.YES, a1.getAction(MACA)); assertEquals("aa", a1.getActionEntry(MACA).getSavedValue()); assertEquals(1, a1.getActions().size()); } @Test public void parseOkSetAndGet() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString("A"); assertEquals(ExecuteAppletAction.ALWAYS, a1.getAction(UATWA)); assertEquals(1, a1.getActions().size()); a1.setAction(UATWA, new SavedRememberAction(ExecuteAppletAction.NO, "U1")); assertEquals(ExecuteAppletAction.NO, a1.getAction(UATWA)); assertEquals(1, a1.getActions().size()); a1.setAction(MACA, new SavedRememberAction(ExecuteAppletAction.YES,"M1")); assertEquals(ExecuteAppletAction.NO, a1.getAction(UATWA)); assertEquals(ExecuteAppletAction.YES, a1.getAction(MACA)); assertEquals(2, a1.getActions().size()); a1.setAction(UATWA, new SavedRememberAction(ExecuteAppletAction.NO, "U2")); assertEquals(ExecuteAppletAction.NO, a1.getAction(UATWA)); assertEquals(2, a1.getActions().size()); a1.setAction("Another", new SavedRememberAction(ExecuteAppletAction.NEVER,"A1")); assertEquals(ExecuteAppletAction.NO, a1.getAction(UATWA)); assertEquals(ExecuteAppletAction.YES, a1.getAction(MACA)); assertEquals(ExecuteAppletAction.NEVER, a1.getAction("Another")); assertEquals(3, a1.getActions().size()); } @Test(expected = NullPointerException.class) public void parseNotOkGet() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString("ANynsXsnyNA"); a1.getAction((Class)null); } @Test(expected = NullPointerException.class) public void parseNotOkSet() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString("ANynsXsnyNA"); a1.setAction((Class)null, new SavedRememberAction(ExecuteAppletAction.NO, "")); } @Test(expected = RuntimeException.class) public void parseMultipleItemsToSomeWrong() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString("AQA"); } @Test public void parseMultipleItemsFillMissing() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString("AN"); assertEquals(ExecuteAppletAction.ALWAYS, a1.getAction(UATWA)); assertEquals(ExecuteAppletAction.NEVER, a1.getAction(MACA)); assertEquals(null, a1.getAction("unset")); assertEquals(null, a1.getAction("unset")); //note, getters do not increase length assertEquals(2, a1.getActions().size()); } @Test public void parseMultipleItemsSpaceEnd() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString("ANXs AAA"); assertEquals(ExecuteAppletAction.ALWAYS, a1.getAction(UATWA)); assertEquals(ExecuteAppletAction.NEVER, a1.getAction(MACA)); assertEquals(null, a1.getAction("no1")); assertEquals(null, a1.getAction("no2")); assertEquals(null, a1.getAction("no3")); assertEquals(null, a1.getAction("no4")); assertEquals(null, a1.getAction("no5")); assertEquals(2, a1.getActions().size()); } @Test public void testIterator() throws Exception { AppletSecurityActions a1 = AppletSecurityActions.fromString("ANXs AAA"); int i = 0; for (SavedRememberAction eaa : a1) { Assert.assertTrue(a1.getActions().contains(eaa.getAction())); i++; } assertEquals(a1.getRealCount(), i); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/apptrustwarnin0000644000000000000000000000013213441742745030713 xustar0030 mtime=1552401893.078832742 30 atime=1552410887.112183445 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/0000755000175000002070000000000013441742745032767 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PaxHeader0000644000000000000000000000033413441742745031324 xustar00130 path=icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanelTest.java 30 mtime=1552401893.078832742 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustW0000644000175000002070000001500513441742745034624 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.JButton; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.PluginParameters; import net.sourceforge.jnlp.security.dialogs.remember.RememberPanel; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.security.dialogs.SecurityDialogPanel; import org.junit.AfterClass; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.BeforeClass; import org.junit.Test; public class AppTrustWarningPanelTest { private static URL mockCodebase; private static URL mockDocumentBase; private static String mockJar; private static String mockMainClass; private static int mockWidth; private static int mockHeight; private static PluginParameters mockParameters; private static PluginBridge mockPluginBridge; /* Should contain an instance of each AppTrustWarningPanel subclass */ private static List panelList = new ArrayList(); private static File appletSecurityBackup; public static void backupAppletSecurity() throws IOException { appletSecurityBackup = File.createTempFile("appletSecurity", "itwTestBAckup"); FirefoxProfilesOperator.copyFile(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile(), appletSecurityBackup); } public static void removeAppletSecurityImpl() throws IOException { if (appletSecurityBackup.exists()) { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); } } @AfterClass public static void restoreAppletSecurity() throws IOException { if (appletSecurityBackup.exists()) { removeAppletSecurityImpl(); FirefoxProfilesOperator.copyFile(appletSecurityBackup, PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); appletSecurityBackup.delete(); } } @BeforeClass public static void setup() throws Exception { backupAppletSecurity(); //emptying .appletTrustSettings to not affect run of this test removeAppletSecurityImpl(); mockCodebase = new URL("http://www.example.com"); mockDocumentBase = new URL("http://www.example.com"); mockJar = "ApplicationName.jar"; mockMainClass = "ApplicationMainClass"; mockWidth = 100; mockHeight = 100; Map fakeMap = new HashMap(); fakeMap.put("code", mockMainClass); mockParameters = new PluginParameters(fakeMap); mockPluginBridge = new PluginBridge(mockCodebase, mockDocumentBase, mockJar, mockMainClass, mockWidth, mockHeight, mockParameters); panelList.add(new UnsignedAppletTrustWarningPanel(null, mockPluginBridge)); } @Test public void testJNLPFile() throws Exception { for (AppTrustWarningPanel panel : panelList) { assertNotNull("JNLPFile for " + panel.getClass() + " should not be null", panel.file); } } @Test public void testDimensions() throws Exception { for (AppTrustWarningPanel panel : panelList) { assertTrue("Pane width for " + panel.getClass() + " should be positive", panel.PANE_WIDTH > 0); assertTrue("Top panel height for " + panel.getClass() + " should be positive", panel.TOP_PANEL_HEIGHT > 0); assertTrue("Info panel height for " + panel.getClass() + " should be positive", panel.INFO_PANEL_HEIGHT > 0); assertTrue("Info panel hint height for " + panel.getClass() + " should be positive", panel.INFO_PANEL_HINT_HEIGHT > 0); assertTrue("Question panel height for " + panel.getClass() + " should be positive", panel.QUESTION_PANEL_HEIGHT > 0); } } @Test public void testButtons() throws Exception { for (AppTrustWarningPanel panel : panelList) { assertTrue("Allow Button for " + panel.getClass() + " should be a JButton", panel.getAllowButton() instanceof JButton); assertTrue("Reject Button for " + panel.getClass() + " should be a JButton", panel.getRejectButton() instanceof JButton); } } @Test public void testInfoImage() throws Exception { for (AppTrustWarningPanel panel : panelList) { assertNotNull("infoImage should not be null for " + panel.getClass(), panel.getInfoImage()); } } @Test public void testGetTopLabelTextKey() throws Exception { for (AppTrustWarningPanel panel : panelList) { assertResultTextValid("top panel", panel.getClass(), panel.getTopPanelText()); } } @Test public void testGetInfoLabelTextKey() throws Exception { for (AppTrustWarningPanel panel : panelList) { assertResultTextValid("info panel", panel.getClass(), panel.getInfoPanelText()); } } @Test public void testGetQuestionPanelKey() throws Exception { for (AppTrustWarningPanel panel : panelList) { assertResultTextValid("question panel", panel.getClass(), panel.getQuestionPanelText()); } } @Test public void testHtmlWrap() throws Exception { final String testText = "This is some text"; final String expectedResult = "This is some text"; final String actualResult = SecurityDialogPanel.htmlWrap(testText); assertEquals("htmlWrap should properly wrap text with HTML tags", expectedResult, actualResult); } private static void assertResultTextValid(String propertyName, Class panelType, String result) { assertNotNull(propertyName + " text should not be null for " + panelType, result); assertFalse(propertyName + " text should not be No Resource for " + panelType, result.contains("RNoResource")); assertFalse(propertyName + " label text resource should not be missing for " + panelType, result.contains("Missing Resource:")); assertTrue(propertyName + " text should be html-wrapped for " + panelType, result.startsWith("") && result.endsWith("")); assertFalse(propertyName + " should not have empty fields for " + panelType, result.matches(".*\\{\\d+\\}.*")); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/PaxHeaders.7406/SecurityDialogsTest.ja0000644000000000000000000000013213441742745030533 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java0000644000175000002070000007012013441742745031672 0ustar00jvanekmock00000000000000/* Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.net.MalformedURLException; import java.net.URL; import java.util.HashSet; import net.sourceforge.jnlp.InformationDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.mock.DummyJNLPFileWithJar; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletTrustConfirmation; import net.sourceforge.jnlp.security.appletextendedsecurity.impl.UnsignedAppletActionStorageImpl; import net.sourceforge.jnlp.security.dialogresults.AccessWarningPaneComplexReturn; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogresults.NamePassword; import net.sourceforge.jnlp.security.dialogresults.YesNo; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class SecurityDialogsTest extends NoStdOutErrTest { private static boolean wasHeadless; private static boolean wasTrustAll; private static boolean wasTrustNone; private static String prompt; private static URL url; private static File appletSecurityBackup; private static String seclevel; private static final String urlstr1 = "http://must.not.be.in/"; private static final String urlstr2 = ".appletSecurity"; private static final String urlstr = urlstr1 + urlstr2; private JNLPFile crtJnlpF() throws MalformedURLException { return new DummyJnlpWithTitleAndUrls(); } private static class DummyJnlpWithTitleAndUrls extends DummyJNLPFileWithJar { public DummyJnlpWithTitleAndUrls() throws MalformedURLException { super(new File("/some/path/blah.jar")); } @Override public InformationDesc getInformation() { return new InformationDesc(null, false) { @Override public String getTitle() { return "Demo App"; } }; } @Override public URL getCodeBase() { return url; } @Override public URL getSourceLocation() { return url; } }; private static class ExpectedResults { public static ExpectedResults PositiveResults = new ExpectedResults(BasicDialogValue.Primitive.YES, YesNo.yes(), null, true); public static ExpectedResults NegativeResults = new ExpectedResults(BasicDialogValue.Primitive.NO, YesNo.no(), null, false); public final BasicDialogValue.Primitive p; public final YesNo ea; public final NamePassword np; public final boolean b; public ExpectedResults(BasicDialogValue.Primitive p, YesNo ea, NamePassword np, boolean b) { this.p = p; this.ea = ea; this.np = np; this.b = b; } } @BeforeClass public static void initUrl() throws MalformedURLException { url = new URL(urlstr); } @BeforeClass public static void backupAppletSecurity() throws IOException { if (PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().exists()) { appletSecurityBackup = File.createTempFile("appletSecurity", "itwTestBackup"); FirefoxProfilesOperator.copyFile(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile(), appletSecurityBackup); } } @Before public void removeAppletSecurity() throws IOException { removeAppletSecurityImpl(); } public static void removeAppletSecurityImpl() throws IOException { if (appletSecurityBackup != null && appletSecurityBackup.exists()) { PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().delete(); } } @AfterClass public static void restoreAppletSecurity() throws IOException { if (appletSecurityBackup != null && appletSecurityBackup.exists()) { removeAppletSecurityImpl(); FirefoxProfilesOperator.copyFile(appletSecurityBackup, PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); appletSecurityBackup.delete(); } } @BeforeClass public static void saveJnlpRuntime() { wasHeadless = JNLPRuntime.isHeadless(); wasTrustAll = JNLPRuntime.isTrustAll(); //trutNone is not used in dialogues, its considered as default //but is ussed in Unsigned... dialogs family wasTrustNone = JNLPRuntime.isTrustNone(); prompt = JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER); seclevel = JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL); } @After public void restoreJnlpRuntime() throws Exception { restoreJnlpRuntimeFinally(); } private static void setPrompt(String p) { JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER, p); } private static void setPrompt(boolean p) { JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER, String.valueOf(p)); } private static void setAS(AppletSecurityLevel as) { JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, String.valueOf(as.toChars())); } @AfterClass public static void restoreJnlpRuntimeFinally() throws Exception { JNLPRuntime.setHeadless(wasHeadless); JNLPRuntime.setTrustAll(wasTrustAll); JNLPRuntime.setTrustNone(wasTrustNone); setPrompt(prompt); JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, seclevel); } @Test(timeout = 10000)//if gui pops up public void testDialogsHeadlessTrustAllPrompt() throws Exception { JNLPRuntime.setHeadless(true); JNLPRuntime.setTrustAll(true); JNLPRuntime.setTrustNone(false); //ignored setPrompt(true); //should not metter becasue is headless setAS(AppletSecurityLevel.ALLOW_UNSIGNED); try { fakeQueue(); testAllDialogs(ExpectedResults.PositiveResults); checkUnsignedActing(true); setAS(AppletSecurityLevel.ASK_UNSIGNED); checkUnsignedActing(true, null); setAS(AppletSecurityLevel.DENY_ALL); checkUnsignedActing(false, null); setAS(AppletSecurityLevel.DENY_UNSIGNED); checkUnsignedActing(false, null); } finally { resetQueue(); } } @Test(timeout = 10000)//if gui pops up public void testDialogsHeadlessTrustNonePrompt() throws Exception { JNLPRuntime.setHeadless(true); JNLPRuntime.setTrustAll(false); JNLPRuntime.setTrustNone(false); //used by Unsigne setPrompt(true); //should not metter becasue is headless setAS(AppletSecurityLevel.ALLOW_UNSIGNED); fakeQueue(); InputStream backup = System.in; try { fakeQueue(); System.setIn(new ByteArrayInputStream(new byte[0])); testAllDialogsNullResaults(); checkUnsignedActing(true); setAS(AppletSecurityLevel.ASK_UNSIGNED); checkUnsignedActing(false, null); setAS(AppletSecurityLevel.DENY_ALL); checkUnsignedActing(false, null); setAS(AppletSecurityLevel.DENY_UNSIGNED); checkUnsignedActing(false, null); } finally { System.setIn(backup); resetQueue(); } } @Test(timeout = 10000)//if gui pops up public void testDialogsNotHeadlessTrustAllDontPrompt() throws Exception { JNLPRuntime.setHeadless(false); //should not metter as is nto asking JNLPRuntime.setTrustAll(true); JNLPRuntime.setTrustNone(false); //ignored setPrompt(false); setAS(AppletSecurityLevel.ALLOW_UNSIGNED); try { fakeQueue(); testAllDialogs(ExpectedResults.PositiveResults); checkUnsignedActing(true); setAS(AppletSecurityLevel.ASK_UNSIGNED); checkUnsignedActing(true, null); setAS(AppletSecurityLevel.DENY_ALL); checkUnsignedActing(false, null); setAS(AppletSecurityLevel.DENY_UNSIGNED); checkUnsignedActing(false, null); } finally { resetQueue(); } } @Test(timeout = 10000)//if gui pops up public void testDialogsNotHeadlessTrustNoneDontPrompt() throws Exception { JNLPRuntime.setHeadless(false); //should not metter as is nto asking JNLPRuntime.setTrustAll(false); JNLPRuntime.setTrustNone(false); //ignored setPrompt(false); setAS(AppletSecurityLevel.ALLOW_UNSIGNED); try { fakeQueue(); testAllDialogs(ExpectedResults.NegativeResults); checkUnsignedActing(true); setAS(AppletSecurityLevel.ASK_UNSIGNED); checkUnsignedActing(false, null); setAS(AppletSecurityLevel.DENY_ALL); checkUnsignedActing(false, null); setAS(AppletSecurityLevel.DENY_UNSIGNED); checkUnsignedActing(false, null); } finally { resetQueue(); } } private void testAllDialogs(ExpectedResults r) throws MalformedURLException { //anything but shoertcut AccessWarningPaneComplexReturn r1 = SecurityDialogs.showAccessWarningDialog(SecurityDialogs.AccessType.PRINTER, crtJnlpF(), null); Assert.assertEquals(r.p, r1.getRegularReturn().getValue()); //shortcut AccessWarningPaneComplexReturn r2 = SecurityDialogs.showAccessWarningDialog(SecurityDialogs.AccessType.CREATE_DESTKOP_SHORTCUT, crtJnlpF(), null); Assert.assertEquals(r.p, r2.getRegularReturn().getValue()); YesNo r3 = SecurityDialogs.showUnsignedWarningDialog(crtJnlpF()); Assert.assertEquals(r.ea, r3); //cant emualte security delegate now //YesNoSandbox r4 = SecurityDialogs.showCertWarningDialog(SecurityDialogs.AccessType.UNVERIFIED, crtJnlpF(), null, null); //Assert.assertEquals(r.p, r4.getValue()); //YesNo r5 = SecurityDialogs.showPartiallySignedWarningDialog(crtJnlpF(), null, null); //Assert.assertEquals(r.ea, r5); NamePassword r6 = SecurityDialogs.showAuthenicationPrompt(null, 123456, null, null); Assert.assertEquals(r.np, r6); boolean r7 = SecurityDialogs.showMissingALACAttributePanel(crtJnlpF(), null, new HashSet()); Assert.assertEquals(r.b, r7); boolean r8 = SecurityDialogs.showMatchingALACAttributePanel(crtJnlpF(), url, new HashSet()); Assert.assertEquals(r.b, r8); boolean r9 = SecurityDialogs.showMissingPermissionsAttributeDialogue(crtJnlpF()); Assert.assertEquals(r.b, r9); } private void testAllDialogsNullResaults() throws MalformedURLException { //anything but shoertcut AccessWarningPaneComplexReturn r1 = SecurityDialogs.showAccessWarningDialog(SecurityDialogs.AccessType.PRINTER, crtJnlpF(), null); Assert.assertEquals(null, r1); //shortcut AccessWarningPaneComplexReturn r2 = SecurityDialogs.showAccessWarningDialog(SecurityDialogs.AccessType.CREATE_DESTKOP_SHORTCUT, crtJnlpF(), null); Assert.assertEquals(null, r2); YesNo r3 = SecurityDialogs.showUnsignedWarningDialog(crtJnlpF()); Assert.assertEquals(null, r3); //cant emualte security delegate now //YesNoSandbox r4 = SecurityDialogs.showCertWarningDialog(SecurityDialogs.AccessType.UNVERIFIED, crtJnlpF(), null, null); //Assert.assertEquals(r.p, r4.getValue()); //YesNo r5 = SecurityDialogs.showPartiallySignedWarningDialog(crtJnlpF(), null, null); //Assert.assertEquals(r.ea, r5); NamePassword r6 = SecurityDialogs.showAuthenicationPrompt(null, 123456, null, null); Assert.assertEquals(null, r6); boolean r7 = SecurityDialogs.showMissingALACAttributePanel(crtJnlpF(), null, new HashSet()); Assert.assertEquals(false, r7); boolean r8 = SecurityDialogs.showMatchingALACAttributePanel(crtJnlpF(), url, new HashSet()); Assert.assertEquals(false, r8); boolean r9 = SecurityDialogs.showMissingPermissionsAttributeDialogue(crtJnlpF()); Assert.assertEquals(false, r9); } private void checkUnsignedActing(Boolean b) throws MalformedURLException { checkUnsignedActing(b, b); } /* * testPartiallySignedBehaviour(); needs security delegate to set sandbox, so somtetimes results are strange */ private void checkUnsignedActing(Boolean b1, Boolean b2) throws MalformedURLException { if (b1 != null) { boolean r10 = testUnsignedBehaviour(); Assert.assertEquals(b1.booleanValue(), r10); } if (b2 != null) { boolean r11 = testPartiallySignedBehaviour(); Assert.assertEquals(b2.booleanValue(), r11); } } private boolean testUnsignedBehaviour() throws MalformedURLException { try { UnsignedAppletTrustConfirmation.checkUnsignedWithUserIfRequired(crtJnlpF()); return true; } catch (LaunchException ex) { return false; } } private boolean testPartiallySignedBehaviour() throws MalformedURLException { try { UnsignedAppletTrustConfirmation.checkPartiallySignedWithUserIfRequired(null, crtJnlpF(), null); return true; } catch (LaunchException ex) { return false; } } //SPOILER ALERT //all test below, are executing gui mode //however, they should never popup becasue jnlpruntime should never be initialized in this test //so posting to non existing queue leads to NPE //if this logic will ever be changed, the testswill need fixing //msot terrible thing which may happen is, that gui will be really shown //then each test must check if it have X, if odnt, pass with message "nothing tested| //if it have X, it have to show gui, terminate itself, and then verify that gui was really running private void countNPES() throws MalformedURLException { countNPES(0); } private void countNPES(int allowedRuns) throws MalformedURLException { int npecounter = 0; int metcounter = 0; try { metcounter++; //anything but shoertcut SecurityDialogs.showAccessWarningDialog(SecurityDialogs.AccessType.PRINTER, crtJnlpF(), null); } catch (NullPointerException ex) { npecounter++; } try { metcounter++; //shortcut SecurityDialogs.showAccessWarningDialog(SecurityDialogs.AccessType.CREATE_DESTKOP_SHORTCUT, crtJnlpF(), null); } catch (NullPointerException ex) { npecounter++; } try { metcounter++; SecurityDialogs.showUnsignedWarningDialog(crtJnlpF()); } catch (NullPointerException ex) { npecounter++; } try { metcounter++; SecurityDialogs.showCertWarningDialog(SecurityDialogs.AccessType.UNVERIFIED, crtJnlpF(), null, null); } catch (NullPointerException ex) { npecounter++; } try { metcounter++; SecurityDialogs.showPartiallySignedWarningDialog(crtJnlpF(), null, null); } catch (NullPointerException ex) { npecounter++; } try { metcounter++; SecurityDialogs.showAuthenicationPrompt(null, 123456, null, null); } catch (NullPointerException ex) { npecounter++; } try { metcounter++; SecurityDialogs.showMissingALACAttributePanel(crtJnlpF(), null, null); } catch (NullPointerException ex) { npecounter++; } try { metcounter++; SecurityDialogs.showMatchingALACAttributePanel(crtJnlpF(), url, new HashSet()); } catch (NullPointerException ex) { npecounter++; } try { metcounter++; SecurityDialogs.showMissingPermissionsAttributeDialogue(crtJnlpF()); } catch (NullPointerException ex) { npecounter++; } Assert.assertEquals(metcounter, npecounter + allowedRuns); } private void checkUnsignedNPE(Boolean b) throws MalformedURLException { checkUnsignedNPE(b, b); } /* testPartiallySignedBehaviour(); needs security delegate to set sandbox, so somtetimes results are strange */ private void checkUnsignedNPE(Boolean b1, Boolean b2) throws MalformedURLException { int metcounter = 0; int maxcount = 0; boolean ex1 = false; boolean ex2 = false; if (b1 != null) { maxcount++; try { metcounter++; testPartiallySignedBehaviour(); } catch (NullPointerException ex) { ex1 = true; } } if (b2 != null) { maxcount++; try { metcounter++; testUnsignedBehaviour(); } catch (NullPointerException ex) { ex2 = true; } } Assert.assertEquals(maxcount, metcounter); if (b1 != null) { Assert.assertEquals(b1.booleanValue(), ex1); } if (b2 != null) { Assert.assertEquals(b2.booleanValue(), ex2); } } @Test(timeout = 10000)//if gui pops up public void testDialogsNotHeadlessTrustNonePrompt() throws Exception { JNLPRuntime.setHeadless(false); JNLPRuntime.setTrustAll(false);//should notmetter JNLPRuntime.setTrustNone(false); //ignored setPrompt(true); setAS(AppletSecurityLevel.ALLOW_UNSIGNED); countNPES(); checkUnsignedNPE(false); } @Test(timeout = 10000)//if gui pops up public void testNormaDialogsNotHeadlessTrustAllPrompt() throws Exception { JNLPRuntime.setHeadless(false); JNLPRuntime.setTrustAll(true); JNLPRuntime.setTrustNone(false); setPrompt(true); setAS(AppletSecurityLevel.ALLOW_UNSIGNED); countNPES(); } @Test(timeout = 10000)//if gui pops up public void testUnsignedDialogsNotHeadlessTrustAllPrompt() throws Exception { JNLPRuntime.setHeadless(false); JNLPRuntime.setTrustAll(true); JNLPRuntime.setTrustNone(false); setPrompt(true); //ignored setAS(AppletSecurityLevel.ALLOW_UNSIGNED); checkUnsignedActing(true); setAS(AppletSecurityLevel.ASK_UNSIGNED); try { fakeQueue(); checkUnsignedActing(true, null); setAS(AppletSecurityLevel.DENY_ALL); checkUnsignedActing(false, null); setAS(AppletSecurityLevel.DENY_UNSIGNED); checkUnsignedActing(false, null); } finally { resetQueue(); } } @Test(timeout = 10000)//if gui pops up public void testUnsignedDialogsNotHeadlessTrustNonePrompt() throws Exception { JNLPRuntime.setHeadless(false); JNLPRuntime.setTrustAll(false); JNLPRuntime.setTrustNone(true); setPrompt(true); //ignored setAS(AppletSecurityLevel.ALLOW_UNSIGNED); boolean r10 = testUnsignedBehaviour(); Assert.assertEquals(true, r10); checkUnsignedNPE(false); setAS(AppletSecurityLevel.ASK_UNSIGNED); try { // boolean r11 = testUnsignedBehaviour(); // Assert.assertEquals(false, r11); checkUnsignedNPE(true); setAS(AppletSecurityLevel.DENY_ALL); boolean r12 = testUnsignedBehaviour(); Assert.assertEquals(false, r12); checkUnsignedNPE(true, false); setAS(AppletSecurityLevel.DENY_UNSIGNED); boolean r13 = testUnsignedBehaviour(); Assert.assertEquals(false, r13); checkUnsignedNPE(true, false); } finally { resetQueue(); } } @Test(timeout = 10000)//if gui pops up public void testUnsignedDialogsNotHeadlessTrustNoneTrustAllPrompt() throws Exception { JNLPRuntime.setHeadless(false); JNLPRuntime.setTrustAll(true); JNLPRuntime.setTrustNone(true); setPrompt(true); //ignored setAS(AppletSecurityLevel.ALLOW_UNSIGNED); boolean a = testUnsignedBehaviour(); Assert.assertTrue(a); checkUnsignedNPE(false); setAS(AppletSecurityLevel.ASK_UNSIGNED); try { fakeQueue(); boolean r10 = testUnsignedBehaviour(); Assert.assertEquals(false, r10); checkUnsignedNPE(null, false); setAS(AppletSecurityLevel.DENY_ALL); boolean r11 = testUnsignedBehaviour(); Assert.assertEquals(false, r11); checkUnsignedNPE(null, false); setAS(AppletSecurityLevel.DENY_UNSIGNED); boolean r12 = testUnsignedBehaviour(); Assert.assertEquals(false, r12); checkUnsignedNPE(null, false); } finally { resetQueue(); } } @Test(timeout = 10000)//if gui pops up public void testUnsignedDialogsNotHeadlessPrompt() throws Exception { JNLPRuntime.setHeadless(false); JNLPRuntime.setTrustAll(false); JNLPRuntime.setTrustNone(false); setPrompt(true); //ignored setAS(AppletSecurityLevel.ALLOW_UNSIGNED); checkUnsignedActing(true); setAS(AppletSecurityLevel.ASK_UNSIGNED); checkUnsignedNPE(true, true); setAS(AppletSecurityLevel.DENY_ALL); boolean r11 = testUnsignedBehaviour(); Assert.assertEquals(false, r11); checkUnsignedNPE(true, false); setAS(AppletSecurityLevel.DENY_UNSIGNED); boolean r12 = testUnsignedBehaviour(); Assert.assertEquals(false, r12); checkUnsignedNPE(true, false); } //ending/mising spaces are important separators! //if new rememberable interface implementation is added, then tests using this sentence should start to fail, //and so this sentence should be updated for it private static final String versionLine=UnsignedAppletActionStorageImpl.versionPreffix+UnsignedAppletActionStorageImpl.currentVersion+"\n"; private static final String appletSecurityContent=versionLine+ "MissingALACAttributePanel:A{YES};" + "MatchingALACAttributePanel:A{YES};" + "UnsignedAppletTrustWarningPanel:A{YES};" + "AccessWarningPane:A{YES};" + "MissingPermissionsAttributePanel:A{YES};" + "PartiallySignedAppTrustWarningPanel:A{YES}; " + "1434098834574 " + ".* \\Q" + urlstr + "\\E "; private void runRememeberableClasses(ExpectedResults r) throws MalformedURLException { boolean r7 = SecurityDialogs.showMissingALACAttributePanel(crtJnlpF(), null, new HashSet()); Assert.assertEquals(r.b, r7); boolean r8 = SecurityDialogs.showMatchingALACAttributePanel(crtJnlpF(), url, new HashSet()); Assert.assertEquals(r.b, r8); boolean r9 = testUnsignedBehaviour(); Assert.assertEquals(r.b, r9); //skiping this one, ahrd to mock certVerifier // boolean r5 = testPartiallySignedBehaviour(); //Assert.assertEquals(r.b, r5); boolean r6 = SecurityDialogs.showMissingPermissionsAttributeDialogue(crtJnlpF()); Assert.assertEquals(r.b, r6); AccessWarningPaneComplexReturn r1 = SecurityDialogs.showAccessWarningDialog(SecurityDialogs.AccessType.PRINTER, crtJnlpF(), null); Assert.assertEquals(r.p, r1.getRegularReturn().getValue()); AccessWarningPaneComplexReturn r2 = SecurityDialogs.showAccessWarningDialog(SecurityDialogs.AccessType.CREATE_DESTKOP_SHORTCUT, crtJnlpF(), null); Assert.assertEquals(r.p, r2.getRegularReturn().getValue()); } @Test(timeout = 10000)//if gui pops up public void testRemeberBehaviour() throws Exception { File f = PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile(); try { JNLPRuntime.setHeadless(false); JNLPRuntime.setTrustAll(false); JNLPRuntime.setTrustNone(false); setPrompt(true); //ignored setAS(AppletSecurityLevel.ASK_UNSIGNED); /*Everything is on default, which means ask always everywhere*/ countNPES(); checkUnsignedNPE(true); //no we fake queue fakeQueue(); //file exists our 6 rememberable dialogues should pass FileUtils.saveFile(appletSecurityContent, f); runRememeberableClasses(ExpectedResults.PositiveResults); FileUtils.saveFile(appletSecurityContent.replace("{YES}", "{NO}"), f); runRememeberableClasses(ExpectedResults.NegativeResults); } finally { resetQueue(); f.delete(); } } private void fakeQueue() throws Exception { Field field = JNLPRuntime.class.getDeclaredField("securityDialogMessageHandler"); field.setAccessible(true); SecurityDialogMessageHandler sd = new SecurityDialogMessageHandler() { private SecurityDialogMessage currentMessage; @Override protected void handleMessage(SecurityDialogMessage message) { this.currentMessage = message; super.handleMessage(message); //To change body of generated methods, choose Tools | Templates. } @Override public void run() { while (true) { try { super.run(); } catch (Exception ex) { ex.printStackTrace(); unlockMessagesClient(currentMessage); } } } }; field.set(null, sd); Thread t = new Thread(sd); t.setDaemon(true); t.start(); } private void resetQueue() throws Exception { Field field = JNLPRuntime.class.getDeclaredField("securityDialogMessageHandler"); field.setAccessible(true); field.set(null, null); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/PaxHeaders.7406/KeyStoresTest.java0000644000000000000000000000013213441742745027700 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/security/KeyStoresTest.java0000644000175000002070000001447713441742745030525 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.security.Permission; import net.sourceforge.jnlp.config.InfrastructureFileDescriptor; import net.sourceforge.jnlp.config.PathsAndFiles; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; public class KeyStoresTest { private class DummySM extends SecurityManager { boolean called = false; @Override public void checkPermission(Permission perm) { called=true; } } @AfterClass public static void removeClassLaoder() { System.setSecurityManager(null); } @Test public void getKeyStoreUserLocationTest() { InfrastructureFileDescriptor s; System.setSecurityManager(null); s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.CA_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_CACERTS.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_CERTS.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.CLIENT_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_CLIENTCERT.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.JSSE_CA_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_JSSECAC.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.JSSE_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_JSSECER.getFile()); } @Test public void getKeyStoreSystemLocationTest() { InfrastructureFileDescriptor s; System.setSecurityManager(null); s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.CA_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_CACERT.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_CERT.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.CLIENT_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_CLIENTCERT.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.JSSE_CA_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_JSSECAC.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.JSSE_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_JSSECERT.getFile()); } @Test public void getKeyStoreUserLocationTestSM() { DummySM dm = new DummySM(); System.setSecurityManager(dm); InfrastructureFileDescriptor s; s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.CA_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_CACERTS.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_CERTS.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.CLIENT_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_CLIENTCERT.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.JSSE_CA_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_JSSECAC.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.USER, KeyStores.Type.JSSE_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.USER_JSSECER.getFile()); Assert.assertEquals(true, dm.called); } @Test public void getKeyStoreSystemLocationTestSM() { DummySM dm = new DummySM(); System.setSecurityManager(dm); InfrastructureFileDescriptor s; s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.CA_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_CACERT.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_CERT.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.CLIENT_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_CLIENTCERT.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.JSSE_CA_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_JSSECAC.getFile()); s = KeyStores.getKeyStoreLocation(KeyStores.Level.SYSTEM, KeyStores.Type.JSSE_CERTS); Assert.assertEquals(s.getFile(), PathsAndFiles.SYS_JSSECERT.getFile()); Assert.assertEquals(true, dm.called); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/runtime0000644000000000000000000000013213441742745024004 xustar0030 mtime=1552401893.096832704 30 atime=1552410887.112183445 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/0000755000175000002070000000000013441742745024671 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/TranslatorTest.java0000644000000000000000000000013213441742745027715 xustar0030 mtime=1552401893.096832704 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/TranslatorTest.java0000644000175000002070000000531413441742745030530 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.runtime; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Locale; import java.util.ResourceBundle; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class TranslatorTest { private static class TestableTranslator extends Translator { public TestableTranslator(ResourceBundle bundle) { super(bundle); } public String translate(String message, Object... params) { return super.getMessage(message, params); } } TestableTranslator translator; @Before public void setup() throws IOException { File f = new File(System.getProperty("java.io.tmpdir"), "test.properties"); f.createNewFile(); f.deleteOnExit(); FileOutputStream fos = new FileOutputStream(f); String message = "key=value\n" + "argkey=value {0}\n" + "apostrophekey=keywith''\n" + "RNoResource=no-resource\n"; fos.write(message.getBytes()); URL u = f.getParentFile().toURI().toURL(); ClassLoader loader = new URLClassLoader(new URL[] {u}); ResourceBundle bundle = ResourceBundle.getBundle("test", Locale.getDefault(), loader); translator = new TestableTranslator(bundle); } @Test public void testTranslateNonExistingMessage() { String message = translator.translate("doesn't-exist"); assertEquals("no-resource", message); } @Test public void testTranslateNullMessage() { String message = translator.translate(null); assertEquals("no-resource", message); } @Test public void testTranslateMessage() { String message = translator.translate("key"); assertEquals("value", message); } @Test public void testTranslateMessageWithArgs() { String message = translator.translate("argkey", new Object[] {"Hello"}); assertEquals("value Hello", message); } @Test public void testTranslateMessageWithApostrophe() { //Message format requires apostrophes to be escaped by using two '' //The properties files follow this requirement String message = translator.translate("apostrophekey"); assertEquals("keywith'", message); } @Test public void singletonTest1() { String message = Translator.R("key"); Assert.assertNotEquals("value", message); } @Test public void singletonTest2() { String message = Translator.R("unknown-key"); Assert.assertTrue(message.contains("unknown-key")); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/ManifestAttributesCheck0000644000000000000000000000013213441742745030557 xustar0030 mtime=1552401893.063832773 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/ManifestAttributesCheckerTest.java0000644000175000002070000000524613441742745033505 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.net.MalformedURLException; import java.net.URL; import org.junit.Assert; import org.junit.Test; public class ManifestAttributesCheckerTest { @Test public void stripDocbaseTest() throws Exception { tryTest("http://aaa.bb/ccc/file.html", "http://aaa.bb/ccc/"); tryTest("http://aaa.bb/ccc/file.html/", "http://aaa.bb/ccc/file.html/"); tryTest("http://aaa.bb/ccc/dir/", "http://aaa.bb/ccc/dir/"); tryTest("http://aaa.bb/ccc/dir", "http://aaa.bb/ccc/"); tryTest("http://aaa.bb/ccc/", "http://aaa.bb/ccc/"); tryTest("http://aaa.bb/ccc", "http://aaa.bb/"); tryTest("http://aaa.bb/", "http://aaa.bb/"); tryTest("http://aaa.bb", "http://aaa.bb"); } private static void tryTest(String src, String expected) throws MalformedURLException { URL s = new URL(src); URL q = ManifestAttributesChecker.stripDocbase(s); //junit is failing for me on url.equls(url)... Assert.assertEquals(expected, q.toExternalForm()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/pf.jar-orig0000644000000000000000000000013213441742745026122 xustar0030 mtime=1552401893.065832769 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/pf.jar-orig0000644000175000002070000010461513441742745026741 0ustar00jvanekmock00000000000000PKDuуJMETA-INF/DAVID_DY.RSAэ™y8UлџЧЯфр„cžщQ™і6SЎyژЁЄƒƒcцSдхЉdˆd*ЅЂRЄ(STB‘P‰R$™ŠшЗЉЃмчопѓ}žћ§§ёѓ<{Ÿ§љЌЯZ{эЕ?ћѕ^k(ЂChЦ­QQгЬpzDEє@эDРс `F3ˆ2€(œЌћЯЂА7”"@A g!pTƒПЇƒтНСu#iBs ,uAN€j`8жi:9Yљљ“Ш8M-P Ѕzзq­xuƒШ?/МЮЪЪgJ zћЙƒ5ЩСї{œЖ&ЮТл› ѓ0  €€МВœВ Г,­љяwˆпH;(а ")p, ђc8V6Э/зџ†’Rщ5Е^_сmК9#Rкќ:M.хтуCЇЮUюЈ85Œфя‹kyяinѓяfўЊ#ЭДЎфВoR†o‰љLGІ2}"w0—(ЦŸg\d&’Їjййг|ю бћN‡V‡ЛЮЛ†‚OM{?_Ѕ’`ТХНYIJг0цšDПO”§^rцъжйm=TvуyнH~‡NйC‰nmиІ|9бm[YŽ\м.џН“M[:єЪ0„в6-oЎыЗBfGэ,лхmФH8 žў я„ бbAqЃ8 *Я”П!6=S'f5ŠЌьmДт‡’*ЦЂPPЎЁ,ер€У ш$є„ЇR="Ј№ ќdиš-œ']є§з3€ђлWЄОїЂєо#›jž‹МХžF'fjžЩшŠ яЖхЄQ$ФuоЩзєа?БГш›ЌкРї)1ކ0юKїlОGЗЧlH{kL‰RЈјќzg]ыщВW‡MG|цU†˜;9ЅNVrїVїшљˆ|њЂuуШ)V—л™h…Мmяд:аёiџѓї%jяr0їW:ЩadжШsыŽ;V;5u‚_‹nч3нЩs9\ЙpклSB+E;Џ$№ŽЊя•yoјbгšАœ=)-№цФ™ˆЦѕрИŽq=Šdpл№Е’'Ь]z№Б1‹MZ0‡‘n?ы(&l˜дIсБ yRбg…‚Ш ‘Уc‘ЌZќŸ“#љж[`ŒъEХrŒўO€DP”e@~Ix2MЌ-— ШАy.ЊAЯСb‰ї уŒёюœ6‘ ‚‹§цВr%рЌ-u-Ќ,Ќ-­VzЖXПјМЎdВЊŒL`` Д?‰рGІіRкбл;Яime*EmBшG"K™9Иџž7ЭWУеГГёAWA˜u2лYqьzСеtŠ+PЕ/4.У2s7xњ’ШЈѕЮг‘M/ћЪНў;18—†/]ї’†єQ šЗ^А‹F1N™МЧRЎ_ќЎйz^БqV-сі@—ТЬЛјкєьєЖэ“ьЉХeŒНЎ§‚З&’КЙЭЏ xxїЫЦw.хyќћЋаw3{мA7КižЭСvЬŽ$ё”}?rїb^ инQњєниhwмu‹SчŸХœЇ—ОїЮЎ%ЬџІ3YўЅS№цЗЅйjоАM4˜е_WуёЂ@6Bsтв{MŸ9BМчЬЬЮКo•Ї%јP’mž9ЏЦўєŽ МuЫ‹Žђ_тЭ ||aЌ!b№мkѓ‚H/†ШœœлѓКSЏTкn69О§a'РВ$*ƒў‚IlT…4]ТЊk=J иЈd)e)DЩ-НiG?еoZf99—sS[“š™вP  €f@C=Žкˆ›–mХЗд З#Щgu‹kqШDKцrѕБ!њАј=z'ОђЉ8oнn#щйђЌ+к:6xћбИі†ЏFБжмŽeЛ_m“ЈlЋ6FFщЄїНеа›3”p‹З:јLыХї6З;Ю‡§8xч}CmЂiФіpУs‰эВŒ ЅЯГљІ)Жо7u-mdиФ]шёк. sН_ё)Б(ž—МЏ u{fЯrђ_м?“Є;fкб§CМНCcъFХј;l*тЮœ‹єцъЛльљеSX#+ИџшЬЮprnмgџт ,†QaуЫ—UъАo§Ьv.OчВ„‘]гwG;[…]ЮО5Щчао*V|Fl$­Q'Gз&<™‹r'ФЁˆC-KbѕЩ4›ДbшР;?&јпљ•CџW?{W (ЫЪ Пс*„ІлњZ РЗиmv}?J/œ оЫб•@‚.Aж…Ф†ƒz go?'р]ь?›Ж™‰™Ž•’ЦDO"™рДмw$яr™ЗgItё"zЙPeџ–I_r>ŒЇlжp Sj} ~2ёXЂRД~иGудЏo\њ•#ў_tђŸд>3™цЋjлnR­_О—Р}ъD&2§м‡)7Ч=ѓіЏžўiДѓLm…ЃпEy(sІPюиА›м< k$=‚9*ГЗ<Пyo=шўA-ь'ђяЩУЦƒ5|GI‰~M3?ЬM%/‡№“Šaё’]Вogчђ“Е?ЩпчАtН^}Nум‹™Ї.huŸK1mЭ7œЯ+ьМоьзVrL4–­к§и|kђќиP„зЅЪ–cЮцLRв{ыaљ§уŸgTI%BZп­ќ[v‚2}/УЛEЖšэmYdОНUTZ;?Љ$|ПXђPє „kшІ &њHѕв–зуПQ‰}…J… pP}›PLfHфZДвZЄФ*bU–\ј—ДZ+-XEІa•+р Ј­А Aгљїц–љЗи–НЖ&дљ?@]rLр)Wјўа.)%њx;­§LN7obЇђкUФ_oдЛh(шlЄЧЗW:и9•‘иуiЎА)Aњrя“qЇi"удсљ!љЯт{ЮйЗС ђhМZ"(0њхУйчљК3LŠлУ\юTŽJзФПQѓ•йV]ДчАn­…/’~jBХфИтxOз‹§C,)aТ:‚цG'ыйхvфš\Š•Ib ЉП—&Y+лTyB\lь €4GS*Оl+‰№Gзоi ћjQŸпќYљlHQт­КЇ7”q‡sЧ•ŠцхЇ_ѕЄLjГІФн L~8ЧQ&œя]GsV7ЙeРХ@#rdрж$иOРЅ”зя*z_В$У+Йs№хŸЮмЋGЖ№т‡ўm лQ_Е AЕPЌ€о"эдh*†f‚"Q№ы G" `Ыr]œ[ˆ DСбп@Ѕ‹З“ЗД,Ѓmn h."RZ'(fЩgЩF4ˆ\ŒuФ/ m1зЉЉО”щкšВ „єЃ!Є3рlЇ!$@CШвZ§$/- iЋЏХGGTFт ‘#šУ#WXŠgЊІ07ŸАc~ўbhфх‘{,sЭlf‰ŸŸМ+ъ93„юўЬчˆL іLЏqђjЩŠ˜7ЮTяuЪe~}HтsrZжЈ2Я˜ІGs•YBйЙ§zмуa5o§smхы4uХEŸ•\ysoаю}ЪўDЪГ=ЈбѓпЛчZkg 9fЫquЎ,ихКN@ŸфыV|4ЧЉЙЌЪидъ#–‹П(У%!К 5%x6myŸпт]GIсн›--aим§e]ЄdьЇЭЊEv‚'=ўДљPјМЊ?FЅНƒ]ёИйФЋцY6>#DХьmмЕIL3Ha{ Pи^SїБТуџЋјћ :гnХ­ц ЇэгЌŽй ŠDцEœ4ъКнЇ^:Ћv!Ћ цR<ƒ–єЄHю&Jє“cеn№ЊЭ[ЖМК№sL7­fНp;оР{Ј™В-ЌфЭ6Ч ц Ы-i’ŒŸь.мг;йqьЕ9ќАсэЯуяЇNПfБіЈšзЙб,—"&6Ц-дЈЬћTяK,KqJї˜”є=Їім~$џuТЙ^ЅL(ё8‡пšp­`њx%lЪФs^ПŸpТ|ЩœУаужќЅЅ Љs^ђисJ~MюdоHвlь}5,Йv7’ЩbќЎi@1и5Аc6Эі<…u#@aFЏ[FV Hae†œŒЋv8Б3;}ы Џ˜N‚‰р‡†д—І&•х€:ь‡’a‰sєp`M<ŠsЅЈе•›`“ЭІщ‹—pЅt)VeVфх#УЅЃ1‚ІМЇyБВ$^J€œ,(/ (л ˆНЏш‚^Yfu€‚vƒЄйbi‚„Ї!Tь)vоўБŸgЬљWUvX­{\ РƒђŒI‡шBд†І@8C/GрY\QАR—NP‘#a‘ 4йЗRC“D‚Шц„3дВO \_•§Йš 5§е}`[XљB}`Xnмˆ,оDpх&VDOшcС{њ@вKђёіrњТ™эdї=ДЄ—Ђал;UПЕпалcЏ^Ы+чж;ээuџг§DІѕзФОГэ6ŽЖCѓЎˆfoч‘юЦ#ƒі—О=‹&ейЦї№§dТЙzN•|бЙF’ 1їoўтTj^6Щ^B:qЩО‹?wmbŽ=ШŸхВ-чœЎШЩ(ыCМQt'ЌЃƒ єІБФцМ6Е›[*Е?Šїуu-П:в? /†ыя(ТcGХћІгЦŒAЇиОЁОшмУ-ŸN0)кЌ>x+Јс!ZZѕAьд—$ђŒiчќUёыЭ>zƒ/4ЮяUэтbмК 85ёџј УcїOZ љˆЊб‹c1lqKТ‰T€–Јрпї‚№Q-Zэc€ЦђоЂдQрЅq:ЮгІ4žlІб;СeНћ5sфŽwZ‰E@ж.a мІ ѓ‚Уp0 F€~НaЮа™ s…!І y§ ›љ‰0GКІЦ9B‘^PЕ„ еІzЉёxЈФКіН™kАѓд{kюБ;˜<С—ћ ФdЧОO~q­NzoОћХ„чќрБužŸиy+Ї­­4‰ю5;k0…EЯМzПpbTњтдКХ†МъддІ R››Kjƒžћ†<,јУ Љ‹пЙ-№ЋкўSЕ6. РZjCна„$gaЗ]AрЇр€4цП"zЇE(RЉпеh%_ #iјДžнeЕяJ]Ћ&:юЁмwн„}сч†%3Оrяэ9{S”ЋцLљ@УW1u˜…ћн‡ Š|СЁU &=“SŸŽTd@ц1ЩЯѓRц@ƒАPс иDѓ‡ѕбCŠъ@эЫгГšМI"ѓљЛштЧd7pЧдћ§F—r(ЛAЛёa›кpБfіАњн—Щu#Т%Ÿ+˜$RŸдлБk…П‰№ЂдХŒ8уЏэuЦдХоmmF_+ˆє6ˆL7г(7ў\xfvЊYУnпTюИLсЇ˜Ÿнy ХеЄ‚ŽёЮa yŸж-зУeэё]ЁX‡‹ъВœ’чшQ—Еш ЄEПь2EAkЈ…e—< Л"=№•+ФЯЅиЪj•DЕ.KдCШИ7а˜%ўСр(ШОЈвh”4Э>щ*HRŽ>$)?‚7‰Hіі †B=џ_ЕўЊЕжЦc0xюџP ДiЄ@щ%TР,m†‡/ЊрA PЭ‚д,JўŸЋрJ;Пз§;ЄЉћSЇз”qZзКPј%Б‘Jэ<ž“Г!sТѓv-Aг3џуaйfбeЁRл-…-ƒ ~оЎ}!эЬы4KF?љЏ'+ОО!#ЙжќЅ\фщmе(Пх |;y?§#IЛžнQŒ |,ziХg}e o ЯЁiіИT|MUыЭЄЪ§fХt­,jќW8m/GЙЙrявUrъ&›…‚’6‘оmЭkЩ0ЖЏ1т~gфc ‹ў~?ИҘ}їМ§с „]юќ,НВsН]B9жEЗщyФ№@"sl1ё„йьо^lыеkАа‘ -––„ё2юlme(&kD’СњШЦ[CМќ&пЗn(0#є“}_  ВfrVgšЩи$3la)I€‚иL]ЕќBБЦэчš0+ќРПђ’‘ ѓЊ5% јГŒФ.ljў\BkІ•R%IWQKt<ъq[USPѕ† Ÿm: ќ€эњ–‰К‡ @ ЭќLФ…}p"E4zю§kXЖE‘аЛтЫ•n:o•Ћšm@пЦЫі…EXEСa–Ќж[шЛйЭЕВe6ѕI}ЈŽ0РxБ9IЭ%п”{ѕщ“^‘ƒ;y0ЋЁjТНgzjнўњоўћг­[ЗghЦ„|ья|§ ц›Т_QkђЩГ­Ла@ІчЅtC˜оzТ!uїWЏЫгj{ эGoa%HхЃѕЇлтЄƒY­ыaAё)ВbN—ŠыУал:OчАZ~У|ЫКzъНtE†чGЦбщf+68$~€dŸЊŒJШшmc’з~Ц–т‹щŠЈ Љ,ПдSуYЎџGу0ЅSПЩmœђ-FюЩОГ5щ^VС§ŸлчћbџPKй€ья$PKDuуJMETA-INF/DAVID_DY.SF•НG“ЃиК.%УХš],д™ѓњКМ> џ цoŒџч№џ0ш_џчкzA§‹ЎлІnН~нЯџ§яџњяџКxeє?џЊлlbАт" z™+ЏLƒџ…зuџ^џѓ/ЎзjЫg дік.”I8њm~ДЪъžaтгC@Œ ЫЅЏѓЗ5ќ4Ѓ) †ЏŠьчЏž_D{Ћ)˜usRBЛ‚€CXжЧ№уйцЂ?9Х‹ФNїь‚‰љЯеТД]7TЗ3X„^jЬ…K‹>jїУ‚цLєž„Mеё‘fЅŽЊгsŽ™шё$Т|‘i`ЏшўЙX7ІU^‘EЁxs=єыzЩўrI'F~Щгѓ”+Њ–AїЉK-SN9E6LЪВ|}сёNўД\‘зETѕ*gыТTEїŸ~ъ7n*}Йaдˆ7ыЅZe‘BІ&Џ&ŽyvVЫ|Ё1ф"дШ?ЗSE=hDSЏEЯa}šкжAдuѕюfFёцЧp ђ˜ШiNa}Жу>r”wЃЅ!+сєЋFoъw›‰гU6wуаnqzєкmыy’ЪЁžАe*&.+ЈљˆУŠ}ЗРw)п^ƒРiЄПс/yzЮNіbƒаjE‡’бАђsВЙТЊт{О!QпЏ"аiй Э–W ‘ъЅЛgvVzW йb*x>†М&—WŽВ•Ьчшj\ƒщжФхV*@*эѕЈп{ОоYА/wс=ъЎСЄЬьн­бТs@ЦѕзыМ–WТn% :Њк­ЊйІ§ эмє5(xн# ѕеТUЩо‚!БŠt27yhI’ХlЗ 7Цžšєq…ˆбkЊяЈfЬaoCu]ь=ТЖ0E˜сjЁXФгЃŒi~Т”ЩŽk“‘Ъђ”)ѕ#˜{ђцvк$§Ў_ тЧб}~ЖZ…H‹М0jэuЧћ лtГІбщDŽ {L}“#„œrЛИ>ШЦР-цoиЙ АŸQаМ У}Yќѓ™ZZъ/—ЎHзЋCс(Х%о6TeQе%хNW‡“Ўh0o(щЏ"ЇЏПбЇдбЋHVУЗЗF6™‡'ŸJЦ€БђхЕhŸ=]#^\ŽжAщпjkнХлŠ4шd­ 'з&я3rС†[nƒѓыDа˜—I ZЏЦ{sl7H*›КB2’ѓШ€ГрgŒŠн|А^ГVЬ^~)ДŽиЧЂN’дЂЎFН_M{ф•ЪњбО0 Ћй88hЇѓиЫэŸњkXI2Иуˆ?0 ˜ЎК~“’рн!Ў0pћ Уuh@N—цu!AшјИ7теПФ2з&JФїn7rˆfЖњГ…]ŸдmєŸЬkџљHЃ?z№ЪoЦ|Љ !KёRЦKnТB›™У@ШTsІЊ љэW4”зЅхЕщR§RaHцбbtв_Œш#u–і'яЮИ$RзSљМ`ќ8(ОущzЈњАЋН%ІльТ™L+ †ТччvёмeЙъ/Еk^ГLінрDuДTП/Q|Р …›Н‡ѕбv~-v—XV~‹э^§іSJe‚ЌњF>•хeФ|gУŸЏИМ(КXЅўUЉ?ЌмоBiMїЉu)‚BWйњ06—Œdк!№1ЄjЊšx‘ •zgCF›О\ъAђМф!1ЁЋb!zŒЙ*šшу (жЪ‰ TКо7јРТTZyэќ ыQћк_ ОNїм БcЪ19Ь•<@ ЙF>Г­g“d\wСQ…Ѕ= WЄЄŸ\ ф/&G‹DtљIМјеШ—$хќќѕРЄAсу†}УuЋўŸ‹U3|74{kХ'™%†SšЩу~M‰v’бЇ=к‚1ЄDQьi #іJ1ѓЦZDпџє…g йСn6›Ў}Тњ'ЄCŠ-Ќ~|`ВžoЄчGgуООtщ{Ћ>љEX$]ц.†eViЧV Щ ўD‡—9љ8—юР’ПšКЎ ўГЄЭCŠyЊ*hx{вNЃZ я->іИЩЁ е jєЪ+gО– :ёК>.i^†—ќь’Т™›к lYjЯa”і4tѓ vy@‘#“‡~1Шњ-џ:vђ3d|ПЊ!mЌzB'@бXPfCкѕмМЙTJEРљЈž‡bѕPќЏЈко’Ž†Шш!ЫшXаЅГєиL6ж‹ЏVeзЦхњK~ИЉ@ЧŸ~§Х5d\џ­`ёЙЄСЕ=Œo /ы@Ѕy%кХ=`%"ъРАqЄїxEс{AўуПыР>О ћ™Я#їt9@ŒXќ&5Њ@Й1˜ƒЧ\„ЛвНЖPхЧŠщŸXђЧšbј%ЊŒц D9щy_Tј0ф‚сЩУЋVДЫѕOЖщ2}=аŠНЩmR№Зі?0ѓу ѕРЋжћјL№ЊАи?J0ЩAІяоњE=ФЕЭГy:&vхtcю‰Щ/.ўо оЛ•UнЯ^<ДЁˆЌДKз/№яяTЌтzWd,ц‰ЧнѕВТѓЙZ- BGм€ Иа"S dT`’3фЊЗч~бˆѕpпл™hyф…Ђ`НЧUы_ˆи3ЧЏГ@і)Џ)$‘Y ‚>7Ащ–*~тдеUжєWОl]x‚ЛФCž/‰мЅ§mœ j€\vьЪвR•5fx’^0‡Йd#Џ7eRvЅ–/jп+”zняГЋ$§LœдфЧбЙЯк!h3wчђ•Тƒ~=—у•Ь7ѕЫЉ…DКXБаЊ6xУ"=Џƒ!ŒF[‡&эйЌZпђU1bџRˆ{rЂхqЬ§-ЧёmmБzyEЊ^Лўн*;ьDЭ;=…ЋЫMЯ=ЗR Оv2Аh@ЅžЖАЃˆЭ/яI Б|"O d"LZџ”t§Х]ЮЇ%ббтћ›;ЧъJ&ЙVЇnЌєЉlйєѓ;ч4_+•їр0ŒeС[]…ыHœ_/щ40 ьšˆЩшzФv7ОU~яmS‘:Jю˜QКЉ?PScНО‰Њ™›Фх’CўMq—•аIЖЃ“я оjgНаы=№/˜~^?bжvD8Р Дсљ |IWРммEъ‰~"]P+D0"–ХФ6xъЇхј‘Рљ @dqЌD2‰э˜щŽї2{RfЕzuЕЭkј$оЎ<ў№š_‰!оy ЎТ_уИgptdД™к(ъЭM{S—0#OZе’NпР^o™Яn|Ž‚Еыm:ЄЈ-G‡ ™GЦ8š+…вЌёfst<ЯvМ;ќfёѕџП‹цa;xпннТ}КчЊwЮ“9рс­n$^‡Яо1_„yAр kј‰(›uŒќh3а?žDб=еXіxhФЂ7DaTюэnˆЗž.Љ­ќћOБJ'ш“,uг ъжhv|Xк$ї­-яЅщUЮ‚(3іыВa7>qеф&jћ4њЬ!~gj5еНцтFˆѓt…ъ•ZЈЅЎЬЁ5Р“еEA+МиgфgKџџжџаџў§чѕ­хŸvБЛЈдmo>БЭˆШЋЅ’wЛ•8G&<“ш;{ ѕы>оŸZš{7?CЪщiрЉž‘бs'UwЇ”8ЖЕнШяЛKтTBї#у№>ЭpX #eЇHўЪ‹ гШŒJ4тO eQЪѓОшцЂ qІhЯ-ЙўШ}`%vхН§ќ•жъ+ЎХ/+•МfЊЪ?5 8 h-БЊцGžu8 яRАzўe~aŠR<tO LоІ‘ЦŒ+tђУ:,iзЋgiє"нМЃДAЊП1Єv•щ(ќыЖі–rЬЈN-˜^я|3ЉччThЇgСјJЄ5тУ<PМs ЁПэ;%csNsˆ)Ч‚8—(%`ЧЃВ#:_UТЙHШИЄк;\і‹}Sе]79х™’3„р$ЪёЩХюІ’ж(—­…žOZdЬЫ@žр ЃАХzgыN˜nЯ"‘мMЦyДab&1Яє\R-H^(ѓd]5љУлa[›ьyoЕыY_§эё.№–K#иz˜•МBѓœ,“?knЇDcbВ!yŸjћM‹VqxЅoNа$^šћДY€0ЌИУЇ3чЃ ИZЛ‡4˜ьˆBмk'iP6њoeЇ>ZazxіšН5JJ>•u:ЄCе‘ЕwЯ&œяоu9З;еšVRм=ЅдЖ*?>1sЄ(Ўф8Lп1ЖЗ39ф)вдзЌ“"ХкV ї4Ц@ЇНdeвOф–iј…ќхh‡hRќšM$ЋуhШћ9sьјм„@д 2 Т]дE7Нчlмж_rШЌn]jH?Њi>ўЭN#)OSГd|—o\`pЮЄељщ­Ь!‡вг“рОш’/K’ўкяWх!pэYињDёqШ:v‚э8уVŠ<~ 7Ў~vF K7*m~ЖToŠ“€Ї–Аггž^-ЈЉНQАŠ ЎЩ`Тse„•єb7ЌсgFn5Uџ› ЕМ'у€„ЩЂаЎYtXžФZ˜чf.šgкГ/;5ЙєіГЌV0ЋгэдВ@?xёqo<‹DГлЙAиЫ2A„ІЋŸиvK7Dт‡'МЄХ{g8Ж-пyўХ?Б“Шѓ9w&rH3Є†BšМњ•xCrЩ јЁZŸ†I<+ДќVРѕЎ*‡оeG&ыVCY;јZЦŠq—уГDє$н$и”гщИ“FRЂ) МтЛ7\Ољ0ˆћ ДЊЉЏ†”Т+;ЏЌЯBsЛHo8„Яt"нŽ(*\‚ё› Œ^yє[ЋОwэG‘•ЫA>п щ]LЪѓљБ@)ёy6jрhюУ„ZnиOЃk|у5ўуEoтЭ4EYв ŽАGЈ%ѕ hЬ!Lє[Š•бчљ•`Pѕ6ђ˜Ћ“е{Џ}D@Ё‘ƒвъM*№)ФAЂЂ  Ҙ80q7Щї29лиепSЮЛ‚јpS­XZўŒ=уи]•ѕHЩіUКн^Сђ8]њФ6МкЁRрŸžёГрd_":їFчщЭ#*ƒg—зцi`ж ЅŠ“;yКф`@‡lуьўŒ-}xњ§‚Њ{`МvхђтБаz"­ЪЯЎжР‰AќJW—Qq:\SŠ6vГWЎГЁpі7ђэq8Чь  ZnDЪkвЏWЌює›чфЗ\Е7˜ŸGјMП'і–J•ыBŸг“–эjb=Y}ˆаШ"QзЊ†’ nohдп"X+—ъSЏH—wђ‡ћ 4$ I њѓ 3pФ7ЦЕхIлЎЦ#Кqa8ёC‡П2v–…FЯе‹• !ЗЭФї„c›aŽЦC/ќрЫ9sо8Н_}ЁЕ~ФяŸяbB zр”SœwыŠF‰ЯєБдеДu%"м9Ех\…/Bл KџvщамАNЛL&m*іљ>ššЏѓЋЃCшuXю.йr…i„—fЏ јЏ Ц]пО№HrЯ$Ѓющ)ЙCИ‡Ъ2Ё…nхvы5ЭО,—м)ЄVгв'‚‚ТыЧЪOАw(њŠаЁЊqнъДЖЛ‘:ћpёf•Цu[~љЁ ЂєвfUнБgMNФаe’Ѓ­jпg^neЅnКЛ—“љxˆ3сŒМPFі†§^шЇ~ўјВо$2ЯG‹Хё zќŠ(Ќ+ѓ›?аСs@Žм5^ЩkHbjУ};ЛпMли8К€,м•4Чёђ\=Ќ<Љш=|мЗ ­&хJЭ/+§Оgї>Нпћ„zFgдqO-5"Юƒ‡Йњ9ЕеЋ3+љ4z0UPdhвХ6ŽђЇRЦн AV%ЂЃk@T”}цШŠЗ‹)у|Хы‹чу0ћДЄмђOБјгЕ~Х0и9S$нŽќЁ‘8ЧЎ@›Б:šьœ0R^—к§Њ  vмъ‡љ{ОwПXЁчФ4ь"wQJЯ\:е‘г•–9 ф)CјеžЇБыћоDф §у$Ÿ ќДпы/t}bgЏин%2bGЋпcn[бPGъ”рDъ'Oxт†ЉcњЂЗ  ~є4žы№ŸяЎRtРœ sЈАCсdЗy†r;sаСњG‡`^ањмњ†6џПњГє ]Ђ№Ы`–buk]№@f1)й[Б€^пЬІ ‚Љ$ыYу"8хЦЖаљ~]ВњЋtfWЛ‰%™ы{h|buW‚Fˆ3јpц&Uђѓ:9u& ДW…@Џв/V]T­8}Er4П‰ ЮІ9Ж­]мa$Ѕ)п‹eѓy.BaœёY5\,{ ТPм/?'t~tУўNV‡<Ѕ№Jр3&АSГщєXљS‡l™сц eZE(ИЂƒ_РдJ4WЄQ)Л2Дє88ЛVZcїДvу’^tlпyЄУп‘лa)ХXЃМ“ј|є’q=ЮKИY*эьUr‘ЦРгqcЧaњ?сбћТ9ЃЇњвœгл|rNlбђ,@ˆЙИњѓЌSE\ћёH]ћ­tР“§lxЧ* чБyЈш3„ІЅ’iкЃ7п0В?~ЬЎг+‰š0‚гaЃTЋ9$yrr–g;ЙUR9№‹џ ˆVЂЗнПѓЬуz,Вˆкv—L) 6K  [†Бм|ЏHўОфўцG>Kš”о…ZrXъlкV4­^šх•Іђ$‰A Ющ™ymъ|/‚ёЇ 0цц#мДЂя7–Р„јj]AЊ‘ˆГtххјldB v_иЋЧX/c9>NнЯXпkвАКэ”:Юя€}xфjьSФ8уrtЏYenЧЃG'ЯКJ™‰–]ъѕЭ?ЌR2to§ž€MzЧ>3UqЇy|„sŽ!Ёю$bŒq#ЎыzŽоЕƒр§;šљЌН*НaЫgѕшRЭОоœрЗ*Є,oEљЃђ-6УAЁчh+ јkDњИЋ‰­%rЈA˜jкб84ж’x 6ŽШnGUЮ 1о3Џ‚ZяыЦў]–ЏN“ЏбXПаф_"'TъЊŠя/œЇy'10F~ЙžЈсчEmы`*%лI рЋ,<Ј`Д] @єЫ%у™ јШН•Х4я]%}oŽž[ь•ŸKŸp^˜р GTХќJ‘sKw*–Џ Љ…VёSQ>Hм_йЏэодNBчцšGиwnБЫ? ‰ьЂНЃ#nе žkьдQoOtщЮ‰ню‚ЏX*ІXЂw=H-DUЩ HƒЂ"&H(ыRщc/ТG~ШжзE…™ІОМfТ&\[…жN(сЙqzЌяђНa“С†Kг}m‚›_ЇAаŸ?оеR€ГIDDСFzЧ‹ЩЩткŒ№/Њo:t’ЈDy‘ сВ›ъxПёI–Ћd 5ѓtНЧLŠтM†љбSЕф€'&Ые’7lСЯБпнš`јŒѓР<№}“‡Яd0@œ?†јДич•УSёTŸNѕJ€ћ/ЎхЉ,ЖнЫ%хТ иљБlx+ЯŠЧtј<лKлK‰ Aё4щЏЋŒ?zгdhпСУЬCТcѕѓ–ЮіM7ЊЮЛї:žЊzuУ]є™kfК•јќf]>B-уэз#–О%Yбy>!q`Іt€IЇПйЪb'MРMєСт0eЋ‘чЋЭзХќ”с]Aшх'ЯФ“ЁpЉ@ Чшg‚qчk 3Цхmчй?*4vй;U‰Ї 7yЗѕЕdЦ/BH|сЅЦŒ{.Тˆwžj‚АюaЈЂi4HеjЋ9-4ЊПXвaš]љuЪlN4ЂBЁЏ‹Ytнј8ДГaхўъ7б#Џ]•(ъ†bZ—yO2‡—ХаFJ/]Gэй KІŠєѓŒ[[@Ю9kіJг>™еzlкАђе2њђВ$сJ gLдpa›.PŠђдz‹еёР€fфdиу‚ебэЮZњ{ГТn…_mм0ˆЗZzжb-!њдЂwЇс[Ь3––GіКИЇцF3›Вђж/­­гbgя>˜ёx ЄW)Тe-ŸЌ†ЊУn N†_B 31Фкшєќ0и^‘я{&эђюљHeО.O’.ЬPžTЩ.bqИаWž•џп4ќrоч~wЋжK ^Њ ЗWPœ%Ац4Ъ˜& єžtА’0(О {д•&|і‘юZ*3Ц ZЎЗœТјdє‘чst.6;h+‡ЊЮДHхYžkr/ВўЩNЏџ*Й~ƒSt…;ђјBПhqyœ™\YщЃъDё‘ Ъ|ЩŠэoЎwU­єWzЗЮрТAjˆдњЮ,@2 шЮцЉю]ихёЩГхjєЅ{ойФF№=.bкзсFd%ŠTЫCW`RS›ьx?ЫИŒr=чVnѕрэ ФGК§-юgЋю$‚kœ$И!jV№AЮш)>,ўХ6Ё#ЭЮ=Mbi_ФNјšU^еcѕ#UўЅ§8ttœОFЎтБ~чТžёЁц#: \BOЖ‚)И-й+п`ЈнШ?щNЯŽЁ+еь+d­PwNщ+qa УЯњ€ѓdћљdџгДѕЧ 0ЙАЮЎощ%ШuЮ<0ЬоХ”˜ƒЈ3ю„œ-6GsmM9xWМˆаH§ъLиf_ǘт§ƒŸTб;н0=c^˜/…ыЯНЈ}”ŸЏœВlМЗEќg”a‡ВLJqФГи|сѕZ`ІЫ5>3s\8ꉓюfђкУцŸ я­EЯнt№CDL8/=:dz'ФІМa0~Qщd$Ž[чqЏ'aГЫѕЯ~‹w-§ёBжn~ђ_ЗшТ:Љt=”{5QЬеž‰kДWљ}T ]ЄoLТ8œO <§‚<ГцU/Q/Q/ТБctNnМУёŒB)vzдКэ?КЃ7AVїyi2шМ2Љg–Qh)P‹mеfcIfO9tЊЂЄсz‡`ОeЗA Є4sgž\КнC$ФK}МxiЗ0zЅ^.NgК)B-Д6§[TГY=’юТ0ЙЛњ~ƒrbьSсС8žRАљ"*RШгУ­—IЪ†?нœџѕsїзћBєіЅШCыBЉ?] Хaс\'‹;!Э™sюYЮCг{cUžвЋТќ@ЖЩPОKю:Сk!П•ѕѕИhЎфg#в"=} #š$КUЧЉЪu<ниеЯу5ъ–I?sBоОЧХhшЕxmwѕЙd#№ЏGЮŸВ” 6Љ=Ё8мЄГтш[“C~„„Еo?піTхєдl №uЗ 1ЫOбэJlKЫЮn&dрžШжU}‚ОTWыЩЉuКЏ=ОЯоьрjФeб‘фcз^еŠЪ8ЪЖTT+Бz–вс~б4№ђН— фpи ЙЅW5­^јСЁKGЗЉ_у1w@4`'`c[?хDонqФG‰іƒ’1/єlŸ’УФёиѓЛjd`2ј ›Ї”ЙэСЎЯфјG]УЛтыЉ”†ЧS&kИfAВп@kœy›ЬU'ьЮњЃ4JUЙoXя_т\{+Z ч7ъ*Nиƒv›\…˜‚€œфLš—^Й­l…Rш­"ОU]?;­~ЋЕ‡AН3!ђ}„ФyІ>чЕŒ КRачbлђwœЛІП•^нOмф2KЈЄV…ЏSdжЧЬА“ћСЙСNјє2P3*#y’$kяеХ2Qь­ьь7Rн“ТИг‘І<„діd hь[ТЇћљžkў }I`2ЭNwдЗ]§ЏPџєЪьT!BпЙхсБdOЕkˆ"Ё:.­ыޘ"’зд3Td{EbњъоˆE1^cшЋW'ђ/b~ БЄс ТЃ[)WoУvФіЂ`ПіА}/žиХsŠп-~1šЈьзdGPŠ%6{M{LNX_›L2 wјzŠёЕ.п…^ŽЇѕR_ФK (  oЌPМЕq‹jЗі0=ьУРl6аз/х;_ ъТ•{Ÿ%ŒД ћ, ”œ Йд/§ЊLŒH ЏL-Ќњоя5K§NьЊ‚лыЮЮЕP)н™ZŠлСц†№Ь&rw ™љЄ:Б G ГUH§‹–эї$xз@nС#m'2Џ&/ЌL_‘>>1PтчбЪьўmkэ?›•ПъUю"<:Д‡ѕеiцкА`‰У/žjЊWІќ,КМќŠ~bTЬѕlДбЉњцCў§.ЂDJь“УЬ~ѓŠiE‰<‰”Ю —В ?.UŽ-ъ‘МОIЭ~#5П•я>ЈsHјЫАЯN Ь X™šЖSП№яА@[{Ѕ В< nрш_YШW-Eс)1c„Ђ Ѓщ№<–?]ЮŒFй‹yт})ApЄ^м8ШO)!П‰Щћфvѕ№žЗ‡BpфRј,‚26%XDњWпЕWЅаЧЁn<Пaџ1 j7'oн&е•ŽљR@iњ†^‹€ЁУFзQў<[ БзŸ№[1ЄGјtxM;.ьLWѕјr™CњТрˆ%&ЎЉЅv|Ў.ˆѓoАьЃžљ+NmUŒДЪЮSBƒъKЬƒI,С ПГE} žыпЁ`ЇЂљЯI?fН|ЙфU >І_П<Ч :{Тe–O2К\Ыƒ+Д”i;‹El%ёv|йз ЎN#CCЫЭїХ)ь:JK9?ѕыAїЌ0Я‚C%D•ДU–ўн"џ^!я§ЎЭ˜uщ)&їШМn +GщЫD%ؐ]*]3Зъ іъƒ†О&љш‹QѓнЈёЏ ‰т3Ђž˜>S0&я4ŠНФRžz{v“c]бf+ЕИ=A}3ЉћюдЋrwЊLQ>zЛ`Сf˜ъ‰і‚VGЭ*й)§2 wi м’ АЯкља6ˆh/4C(ѕёеЋUЗf+NЙjтЙЃтЯšƒO?з5Ћа{/Шw3ЙЬtgЬд=H3*Ѕ}Гv{xШмЌr|ЂОHжA|звѓЯNо] Ÿ•#Лй`gћ•їwЪГА[\BsщŸЗ*Ы_#fо@счГ§g2wмЋBBbO5‚( €M2V#Ф ўфˆH§Ћ:BžЦ‰ї­lУFзяL {Nурвhъпq†ЬLэy-gТь.Љ№ љCЫ(§>‚ї(ршgчїэi1љ sŠAsuWlgЬрЦ',„ЕцЛІi9ЌSЫЏ‰:ˆžЎ2§ЛВЊŸ СПB#I+——yЇcМ^Ђ:^тIXB­„TFhMЌќš=Щ›Щ[ƒџšфѓ~цзKСя|Xи›-DJ6юѕLP/р—ѓыuМqъРiiЙ7Гє“Г і;в.КpЗ4жЩ{œђ€Йн›ы™2ИУјн~Јоƒь†@Щп эŸ6А,оqГжЛk6dгCVU Щ€єы–‡у“а‚'Ѕ“^Б4lM3ќG+kн4яШR_]нk'ё ŒіВущvќёЙ№хФFЙЌАЂ‹з*’­VЁVТу ~ЇЅPгЮ2‹tФIБŽћуЊ$ŠЧjžЃ™+њЈ{MШ+Ке˜ДнgГкЛўЃІJЂЏlЎЄ\сСяS4-к&rю‘ ЁiŽJyД#<‹2‘j§ќ5•њw{Ÿm+?yqГdCWmб YŒ'›ИS8о@^l›B&ЮВГ:_vРёпЧyяЛхn`/ч’УUњZF™‡ 4‰PH^[3Йђк‹Ј 8љЕѕъ‘аѕO–іA>є7VГЄ@Gэi ФeQ№q6Х1К‘e #'ŠFо{sѕЊЁнф;‘пƒtх9алЖ!чRФбУaФ9ТTё!•x€94SЈіМ˜|ь4ЛўuŒЬ WпuуŒСRNw 9‚z!о`Ф<ЪЅY …Яdšctєy%3\В-њљf„яn(+—f/ТьжЕу3ОŸ”8 ™oнѓ!лŒD\zХФeuЏ”*Vaм‹Ќ:–лJњЪйVЬ •[†KЛ‹›8/”Р>„Ц-є:,п5Ÿ~5g‡3 wz–/.Z;йX‡8W дщЬ9|гт‹)ЯзгЏ7BIe ОœОE?sжœЎN*~ Ы‘LGц|bбžHБ№Ыy€^zqtЇдэяБН….W<Ÿœ@uєц8ž™aїEЪ^f…Рttбяѓ‚uЈВUР№=зљха?›'Wљžv%€eЛ o Ь„) Ј+ЄуR )L0ѓ&&X2!Oє ЇУnчїTю6А/9ртM‰ Ÿє{ЮRnйИ€іwCЃ тАh lJЫ З{ЩЩ_Ї_.X,‰и*GЦYањBЇюЈppѓь5Jš й>х ЎvŸЖЂј]™џWP6fЋП 9=|ХWЃS!Г#1Ф>рЁ<|2‰њ0љп1tЭъгољMWМЄјJ+nЂђr_ъЉЅ,іdšŠФ_ЈŒУ‚[Vg?ЯЩЄйёјEHX’ФWмrќ—яJR№ЦХдPЮzа1ЏЯу|Оƒў}і™зџ–Зcbл@у‰AZ œ8ѓ.н2PUЩЖlЯb/-8F/що_‡ wНщVо{”Х§ю&iqЈŽьy>АAzєSѓŸ4н,јXŽTЂКJньйOіѓvtR\Ы›Чо о8EѓЅ0 @šG„Оx ]Э NјВъћKЩЏ3,”ю+ЅМ1L5Ѓkє+цИ‚=ofЧё–ц5ЏЯъоФЛяЉŠ3\­љ>ЇТŠФ^N xŒ$tН†Ш…'uёСУNЋzwрf›цТЦн‰gп‚™mыЭ_ёХ­~Ј9С,toa};С'ЇЭW џР] †Žс$gІб­ЂрoЩEЎ†Ž­тК}3Уујšц0hКС0F4Йљ€›=ќ˜НМ№№@ћaёКЇї„КэЩФїсHodѓI D*:љ!vvQ;ЭёIaйž^u ZІЃgNДьwп.ч}2‰ [йqO@{'nЦq0КШJС ƒр ‡›иуМСbиаZfc/ЗЋN F_(†О>єг-~ЪlXЫiчфр}pqj6FаVтЈЭаЧNQУ_ї]јIајм!а{дТ 4Ђ9Їу‰КŒ Ы4 о!€эЉ{Ќohд@ћ1f€>€Ця№>ЯiэG…тppТ№Э`IO=N.хщзК/ъаQюV/ѓ_CšОЮ„мoZu я…ёaHНИx§9Кт'чp…MЯЫSŽzЁптЪ?e[о+nJ 3Œž)EЄгgRKICЬ“*€шIхKš6tё^ѕСgлб;ЋзEЊMcЗџ‘Ў8‡7—ЂSeFnЂ{’š•˜eшжАд_­ооС2Т8ЅYH!ІњT˜>Ÿјщљ€ ЊhSGжqKmщvЄэwyе<ŸdК‚šжЫ^.о•ЙD?зœvLŽѓВZѓЫkšŽоёkшl7<Я g (œиЄ$q!Є Nœ4NIiЅY€А;<:g;4ќЇИрЧTЎњmc+!6ažЮYJ_EњйЁq“y?raУЮdᘿ;xе›K„mН/с—hчЛа…}€EЖ_ОhАjЭѕЗаT mІ[Џ^Щј†|чRяžOЋ { M4+Ђ%чЬ§b=2QіGЗ8]‡їд%Ећ`Џ їЯZвнр[ѕ<Њ1NгБ ЬLфюh@ЇЩЬгЌPђбСD*@Іу§эeОзэМГ ФkШЃ‹‰ ,˜Sчеј-1 Уй˜иКЙrŒСЖW…ё#ђmЦњ;UПŽБЉ?ы‡:!}є@k–А ЬŽУ-ЅЇ мЙiQoНвфOJіХ@–Ж =Fl1’ oК{™УS3йk\<п§)…Z‹˜,ѕЗя[QуvаѕЂšI|6ЁлˆЏњp)›уhХ‹„Ќ ЎˆФЈГe~7^ЭАk—yЯК1‘—–>ћаГУiГfQ‹—.G–ьG~НнŠо+ƒј6=тK]/т%y€Ю2 >Ї*рнГ)C.ƒgг2OЗQ$фўоНŒ1пЭќяОM#TДЧУjЫY‘ИK'Јо–ОzВ2ђeїEгwЖ9?eб№ікŸхEЛЉОЇчˆохоAЧAВŠж|vЄ(JфЌPчGxdOЃ ‚,z+чц§ntЦi…q…T"Т“ЎMЩЫPY5<нmЎи–Ѓи‰T0aЯu}tИМ­`JHIБ4сІекуЦЩМ_кnЩк'ѕ xм Ф+ їитін2ў:Vэ›мœTMмт›˜Сy”цТЗ2wэ;/вKTŸ W+Ўч|АЁЗ/ЅњA\З5ˆ…ђБ7ЌрВМ р9З1ˆЗgђJДЩ@eвИ—Іf[ЙпŸ[›џ*УљІїЊŸљ‹хLМ/wЕd&!ѓ„ю|‡U4ѕфќ m_Яddl5П§ ІПž}F <ЧKЂєрщ†DЗ;_ЋЭЩ‘b*1с.СTPд{“YўъШи|вўŠCКЏЎЗШsжРГІ.юqъG=ѕў"љpю[яјљUyзЁџђ]yуэђtnйQХЎ3S‰ЯУБ\(ійЕХrXймкжŽ…­`Эж П$HžІ3я^Gи.7pЙ›з%d.jџrъО;eЧћnІщЧbRеэ›—-Dž№zЂ^БPн9“^•*ŸКфј,И+'6жЮь|}a>ОѕЖo9фŸ’Ш_жZєц"нюь0<8*ЯI7ѕWЎ‹€oB=A_Y.^Е —НВѕЭ’ђЯ2іЗхфЌЭzџ :Ж$ЩьhЈГ%”щ™4^™$XиНЅk§.їѕЯ7YяVR•йS‹рГ“•w9tЯВ.РуРE€Юe!‹ хŸy]Етt:П-0RЉEч":РВ0АHvО.“vGJїCUМЪДx›E ѓ——4mіo›-IzеЯŒцгAP.еШXхЉw‰})юсѕС\Є ‡Єцz'ПзћќџPKаABЂ6иPKDuуJMETA-INF/MANIFEST.MFНЩ’ЃиЖ-к?fчncїАНAЂд1{  !jtžQзu­ЏПrїˆШJШумlЄ{(2ЕДsЭ9֘…$ЏЮтhџmE§5ѕџќŸУ џўЏџўЏ›WEџѓš>льЃИŒ‚ЄЗкЋВр?Aщ Уџ—Ю‘џ>ЂиПщ,yОХџќбZ€SРfœФ1Tu;Юуdi\ŸьЩИ]ZtTђџћЧ~ƒбгјќ Я|ўъљeДЗšНоyb›ЂU§ :8OsИи„Хш}Ь•'v‚M€РЯ6єЯеТЌnЈщ7А Ндш›•cдя-ц#цr\yWMgUR›t № 2o–ЉфЁ~ЌŠq6ОXlXВ: ЏˆШВМz[3’W{ЩўrтEЈE—“№;u>ЩH&7л(CmM…<|PК".|НoЗфOЫѕQyCєяКЃсЙ№ПыrјЯИŽџ|џѕХNg dDМ[Y‚ЮEшЮ WХGн›5П_•NBЉ“.џмN ­Ѓuгѓн”О Ђahv7cоЎL,GњЖЁЧСNƒ-ўД.Ц|Мх™A'ў-гшtPеw›‰ГЇ-МоЭШ"”;—†+Я=1Гє@n`Мхъ–‡ЧVYЌoх’€М[р‡•П^#Vѕe’вА•SдуrШбxТ.a>ŸяР!Лф?ё›/ ЧЇ `VЕ%(F›х•SЄxйю™Qa*#0tni4a Щ\х•?œOм ЛO…w:8cд†zFѓЯхžWЈЉlдЃqя§‹‡чqddЇ•ZгfЧxЪЕцФxѓѓЪГь{X€""ЬЋэSŸє[;6 ч iъcџмуо‚ыУ[“ёŒ —т9IgЪ.ŠБ­зL™‹ЦЃ8j№<ŠН 5MЙїю ХNЧУЪёЇЋ~є—ыYgažfjб™cYr˜‡Фїtњ$§aьНруш>_{z…H‹М0ъэчŽї/l2wйgsAЌбжцѕШђƒР]VнЬQЅѓшаˆsRе??Џ -џ= џЄcUўѓ=М7'Эь‘Ср%Ѕц“ьёУR:б=в’бнЯ§e|qd59§љk}ZнйЃфщјіv‚tцЅВhЛДˆ !}egT  Xэl@H…#~{zw™š!~}‘BAbJK ћюagљdLьEKЄМžЇ[„hieS~Ј9ёЯ]Ео оЅычГрычѓhћшЭS98„ŽЂ0rk+'Юъr~тTъLШО@]|(ЯЫ‹`VЇы‹[єзќјЋ№ѓ‡НеZЉz fba”з6яиmГ ѕДžEх юЋэ№ˆЦ™о!7ŽmxnъјЯ–їЏУоКK˜Іl^:L 7оЏRІбс6ХЉВ›„’\ЊфT)IпТ+M*tж3ѕиoЯO0zYНМKphЁnя3ИЎ'NкP|р='эI —яб#ОП8оаџКжКz§ŠѕћdЋ[%‘™SnЂхлi+ A1Ыщ„RK€ pЙ'•щqЦЋл­ SFUTя:У~^jA—VЬяэІU?№‡Ќ sq‰nЃD§URЯ‡ 9яLўc;ЏmhJ „Y3,QƒƒабЛA8T зЃ?@Тˆ—AЮЭ+Јђу d?>)>|n$‹ГЈПDЯGуН96qЪWXPЅс‹s<‘дlo ЁZ‰Ыe“rАcG{xП€ce“$ЈEy:ѕёщк#ЏК>_к7Fyeњˆ 6taЦ§NЁtQКyЭXэ!сz9ї-dyТРзg84Ьљl%№СєF­ЋHЅtќdД”єќ)ѕcаE оеъЯхљŽAгGџЩНў…+’)OMъы™0ЄТ2чnQшѓЄV`сЃФюA(‚šй‹‹3>а Rо–зgHѕл cз%ш^§ЪŒcькyЙДœ1ŽЩвˆ;пЛ#dпФък] xnІz ›Ѕо[‚^=:%Уєi )\нфоыЖѓЁЂX†\ТЮШ||xЩ‹‡ўc‰ђ=QИљaа;ыД’РЉtQњј@GЄКУОжё<К ЮТфЁˆZШ•‚Юю‰KСлUчыь#О^›/ЗыdмМюk!ЭБч%ŠБ“ЉGН>цFтЕР…jг№тŸЎЮp0њьсъхќY кXVщ  ш‡ЉЖ1vО2л8™fцЙIи@{…>А0•е^П§@УzдЯћkн#=dsƒ{,˜Се!Ўѓ&к4MЎulб(†™С‹Е>7C>‘vyчš Л. 9cљ уар02b‘#'йі–BйКF'Є!ХК>>M;/Ђl9=я>xўxk-JžЫьУ…\ЃjЋyœx^^гN5мCз 4Њ+ЮгuЖzVRб^„ѓ/\їМџђ/ОnЇŽfo­ŒFЖ†Ље ŸЎЪ(Lќ<_кœ)гQЎЃ8 †3^І)Ѕ)џ- њёЇo"У§1\‰УаОiУсЌ)зѓѕ Эцѕц› ˜Сœ{,žдџ‡ОЗъЧ+YАžљPЫѕцКБбЭщ8EП^Ї$ЙЭ9ƒџЋЋњр?Ќ}їСжбPќјDљ_Bйуd>ЩъиDП+v7&№ъ}€Ў‡є^†—ќь‚ъќГX“iЕиФгМг2s32VъpR—sdЦЊѓ­bъЉњsЯ_w/prщWЌЙ#u—Сѓ=1ыFјЌ˜fWХoФ\”К:хž ~…жї @ "Ьш^­@Хe44D‡нћЊi@\xf%ПY$5vѓ.О=ёжыјvgюkw(žш\ьЌ|Њf‡Лnў@ш“EсN8:†ЅЌѓ=_ЗЎсC<‰??>ШџЮfDЈЩ›˜фє[XвЄчFш…Л јЬE">QˆЖ” Cк#KўWё§ЊЫшxР3Є*МO'Вp\&ЇАыэЛ<Иє5ќU–№ШВфКЮЁъУœнЁ%РЏ'sТ+nl%ёpўьіќWšgпЛТ{РЩч(wЮ…ФG>ŸLг­T›]&? хЭ &ŠЧЅ“їчуFЏwЄ'/КzБhfр}‰‚Вг­хЬI&ds­‚;ЙЫЇjиќвУžnqxщ[oЅ…Є}‰9С6яTЛdl~<1Ш@FR1РBы*1H‹t‡‹}h`рfЂЄxѕѓ‰}МЦyuXюхё\м щљlvщдЕ{8DХ&9ЕNЊŽ9рЭЇУ Рйzы_ У]‚зчu—М1HЕЉŒЌlШžр_?"(_ЧЭюеИMщvФ”~Ѓ'єˆ@ЏtкеУч+ь[cЭMв^Dб?9ш?ЂТ{?ƒlxЩC~š „Ч‰Н_qs bНщДCЦ.Зф9…Ўх }uП•8u1ЃЏVЏa’}a. ž“ЮЉmёa2d˜ћт™кH‰Vu|СP›!ўЕСŽц_єTUлз‹ЛdƒЂСч‰ Џэ< gЌ=Ь4F8Њ}xиiЃX9 Ё™žq/То—е^ЪЦїЪkѓмяOГ{I€с|0ЃДЗуѓ–ZїFЋц™fћ‚јF2Н›Yё›љb‹џXN)Н J›ђ‰…žзцуя`и%0EНN№ћT.9–ЫмУ…n8g‘ЮЏzqј§ˆNИzќОжцый+ГPёњчп=m‡YƒЈ}wOsMmЯeа|+ѕ­3ю”‰юЭYАЅЧ•уЪ!шj}с]џ&‘П'+wœ +XЌ3Є*Л„[пkЩ†ˆеЁёIЛю„эiНLеŽлЛрt„Ж`тAœ%W’ЪŽŸ} D?T{D+CћщМGР&Ђъ•‚ђ™ОаМ0kЈi›њв7SK5ыоjœЉИ"I›bаAм9‹JУUУЎ-~TЄTЩtFžŠs№_мї_.ŽЭъ7ДPWФдЊ}-|œ’—‹aЋŠјГ"@ GЬ“МЂ\шщ…7ћ+ј yY№“№ЯзіVe08М‹iЏVH2}]9Tt;6–ЉљЋЪХђ"зШмё,eGС<ЗШkбЧЧx—сЊq—Ъm‘Y"яУРеTxЫч ›фQ…Г~—Ъ7H\z*>tЏ'\OЂšтxџ ЧИišв9š'#?ЉHy:–yэ;сUЦх# 7“6Б“`хyћwўаc("NДxžvё80в­aУї“–ХlzЂxZaˆ'Бz+З|\,vЊ?Сѓ›ђЭнВ ‰ŽLb%љ–ШOi~GєШсЩАВЫuъЩ МЙо*§Užуy„їЊќ"Ѕпшџs‡Fh lЬŸR ‹AЭДхdи™ЭfёБKHЋ`wD„пMІЅшCœЭlѓљpD“#ы‹юF(‚p—GŒЛIqШУVЖР[ђCо{ME”АцЪCПyХ3Вјš*+uфE< RKBg9гдЩНxP@МЇŸѕBoєР?`Кє|‰~ОДЗЛj MЄУйMmЇ*\Щ…tuœ!ю4єЗоt>ŽіHGь ьгsќLрќ B cIІsuHzs.Т<ёH8ІВъ+c HЦ=Ых@ѓѕё њВЧŸQѓ;3TюНaЌ›ЌW€ЈЧз‚ГоJ]Ки͘™д…ЌМŒYю‹;Низ[цГЗЂt.Ў@б ^ЫТЙЕЊULш,N“y=@2%г/ДЭ/ЏќћHЕƒЃюCЂPПqхmhŒ• ˆ…ЌЃ7kЉ[ЙЙаЈАƒ@РпfЄ!шБ€/ЁdCжu!Ђ:ЌЎэueEВQЙIiQn}€охТњх‰Вп‘`uОтdcȘJоШGЧMx­ЯxVийьedT`ЏˆєТ6> ёy“лЈГш3‡јЮD6Б]ц&BVceЅoЫUб˜YМБ 4ф8ьГ„§gћјџŸџ џўsјЯќUНё*ЕбнЕА;@BP>Т†@hтШ^,ˆ‰V-о8Тъ”6W5M<ОР/іёўдPч"a!ŽNЧІ>щЊх\&E5–ГЯИкAm;ˆвœ~3~fоЇЖояЯЈЋЗСH;XШмЏdj)мЉ]х зSбHжу^.ш+1Oо;nпнкђY~b[AtѓОа–‚E>…ћYЉоЊялЭл“žЁЬo\Q XнЉšO{BXn›{ZфO*Žѕ\яDЭi0[•‚Сї‹!ѕO›ŽТ?žж.ПЧ$Tєу-Т8vЃЄЃ E­q˜&цt1oГк“ ЃХЛњ;БcХ/DЂ'ь!Бk\Rл›цеЗВmeН—W˜ъш‹Ъ“і„яRЎ?БизUнл ьЮu­.ЧJ Bихr:ЊUЬЩ# Љ60{мЮV‰dooѕЄ_*ж;_ЪњСWтщїлYщяlT—'ї:RЮРХDАвa/0э.{о[эjŽ"ЊTЮw9 љP2udв3ЪЕѕЋ$ДЅИEO{њы=ЭaЮоœ эцZOAЫ§бvЭЃk2у`нљА ]gaVПS/цoeжёщŠЃPђкН5"[?%N.]``Ём>сцTЦSzcѓвЏsУІ\‰'юЋѕx‰>1s“dШ?Щq˜Нcl6сЇn\ sиld9NГй%Šo‡ ПЂ—eў}›эџ#аў+`ЧВзЬJŠНаЬ‡pAЈ‹}ž7нXˆњDK0Yl*ШЗ,yAOџАCњIрžKMйG5ЭЧѓMа‹Ј ‚0BаПВЭЩщrPЋ]‘MшŠЇЂ1љђm}Шћ§Ў<Фбc$ГСхсљд^ЗУѓ]P’!†žь+„лBHх^јп?{Њ7ХIWЭШЉК;’˜7ч-t•zЙTХi$€Tг‹ъЬa ЪˆяeфžЎъSЁfDЪЭ‘luЮ“щˆЭLТ|ач–№†$OД’gГ№чM=Н`оdЏSЫ™Ÿ<јG“%'яД3ЎјPaЫбwыђШыˆrї˜дЩ3ћ?ќŒ„ЗЌ| OdMѕ=n:” $ђLKЊ$D™КHъOИG6F=ЛяhЮŸŽ‰—О -П ИоUЅAрl=зh­Ю№р Œ;ЃˆюSVТKЉu–N™ЬЧЎxж,№Ъб№i№э‡Cмп`НЈ"aiЩИ№Y’_њ“q;КЎFtMŠВ@ЭшSЁЌ@oъѕ&(Ђm­ўwe`…,ŸџЁCУ а‰„—zЙнјy№Pтв“sž›žd!ѓЧ(Ч2^єNoіЄЪђl8ЫЧƒщ‘йpO“rЌMЩСВТ .RŠЩј GѕЗ:Y}єњЗ"‚ MЋaђ#щJd!\u gЧ‘ ь^…вN0„Яf:пѓ‰њПЇœїiВ ЮŽbоŽ‹{PW|<с—MŽnЭЁИ›cГя„ЋTЈѕBљ4Т_‘ёГрф 0яРгт@шŠъьB]LоЦХ•с^`Б5HР-1лcˆ0і#вяTU2|­ћ1Р‰~†Я™Ќ ‚0ќ.RAЇ1b09=LJB(xau{х:O'NСўЦ.и]9zG™sЭXЅХ‰щ[…ЫVGЊРVטыБ‘Lё№Т(>№ыўўHьjё …дF™ЭйЁrмдYћ)]Ѓ4m‰9t­y„Шлћ“‚ѕфRcц•йу§Qmzp@{Ќz_вБЛЊЏгнМљBкvt31уTcпБŽx|хЬЫф?ю№w@ц€с:>Э­O˜vмœn?ц:“зѕуа "НС њHКoKДЈlМ№г!ўx}7Nе’{оАt”ž1)ˆвШВqHuљ1Ÿ№k:ц№ŒЫх gђ‹­§U@јЖt(Љну“*n&ЭЂQпщ9ГR$(G9Ud­Чy}^ѓНœњŒЛvŸѕЉиL—(c›ЃСїођMюNœšВВтГвєЉ^ў7ЉЉ]В‹Oвыђ˜‚ŽЁ`†$Ье5ЎRf> ГTи\/—Wх’Ÿ Х~ХЋЃЇЏnv…>БKлŽtоZyэ+y6š…RЫЛ6 г–Ы€Rж{ЉЏэџњёѓdЦАЅі+‚"§86З8+]уЈЛД-uвЩ^ЦFW‚%ьф+Омс7ЋЈзРRQїЌ:D“ˆЌЅ›IхŒШp;f) 2Уса…8Н€bПзЛФн9Ш jИЖЎIŠ |ёа/G_—Ю)rюЁѓm? lcоЫLNЇж›Tч#Ф›u7}ѕAцЇ>ˆ>вKo˜UFЙй1эѓpІPAЮIEюj)†С’чoв,ѕ'QЕяЯlфяєї5ї•ш†ЧTЃѕ-уjшоХbзЏЄЎр„xˆЭѓЌG1;ИюќТ<уЦяqЖХ—Ў Ў:ІЇP~рv7dЎm/ŠТ|№]wлњ+Єаua^DРПЃ‡ЈŸГ`з!ЄзёьєQЌ„YMо”Д[ќl>м>^Œ^hЖd%ЖяТaєў ычдыwщœiзIдГ:N…ёp]CŒ,CЈу{™qK†Œз2TЁЛНћљЛФк„­ии ]гНмR–ЦЮN>EІм0ƒZЉ‹’>њгrН‡їGЊŸЉŸ}п61ˆqђ}˜ч›П^KЊв’Р:\ЋдB{сц‘+'ьЋц?‹nлїх‘!4У’nЗвы91Ђ€ŸжJЙŠ№œј s1?^§хфЏ $О §”Япж›(7~8ЎpcЊ—ЩтЯ3RA:'zС3‚Ћ&Beфмрzсe7 ћЛiаЩ,ю‹т›Z˜ђCЉcХ‰bЮтЬ„?y,іŽяJщџœнћŒ~яъ+&ТE ИбUюЙ[УˆГЈѓДвлЅЉ8 ЃМGяНJЈџЉ”q7ƒ~ 3b?WѕJ^e˜8_”ЈТѕЪj™Тc„xЩЅRЬ=ГјZПc\0ЇкC[ЦїЎФј?тбЃш%†Š Т'UКŸ^СЁПч{wы,„Ф '’1Ў2•@}BmЮКuVЙЃ›~-ђј9М•ёВыцG‘7щH>јщПŸПœћш;{хю.щцЮsnsУ1ЗГYЈО-HыTŽ4)PЦљ”}LGЬ+­ёgOЃд„Ÿј|w•ЬU˜ѕВруш†ш[3з^jKѓŸžƒ<Љ3Нi]1LощjќЁ_§*=ШQј­˜%QаeљШ%[94 Ј[Уa#OV/'=їоŒКОчzвљёЙd§GщЬ.O|„Œ‹z-kДC l|^8:b*AYУЮ>eмЃдЛ=ю{E:чЇѕѓѕеOœЭ‘moTС6Iи'dсI4рOMУ Дf~XхъSЌЙЛѕя{П<=џWыяdu”yЫAЙk™ЙюЁм„щWwW+Я–0sbгУ‚qљŠЙПЄя? Слє=№dˆш}ЎfЙI<ыŠt„.vO8РГ",RK|№ЊgtчzќЬo’ММяБ§В9 ъ !Q'ѓощБm*’ џzG]Ьи˜›–ЧЫ§х'јqШ'+зхі’&%яE$~д_шG#ТлФC~™ YыЇМбйшрzс^Aв“eж'ЈCрВnKо‰Бъ@В‚хAoуЬveЂŸРСM<й|< ${sэПBм?M” >дСo`jщњШТ<я§CsŸ ѓ˜D•}эŽя”й_ђ•<Œt‹Ќ'.Пш0ќЛeІьМЬaRе>:Ћ`13зAДњЛXЄ17­}Gtч…2ѕ!гџ‚Gя ч:Mшј‹ Ѕd}S”ЇчWSКї[VІ;В)гО‚Гؘ0эПИ”?OіГmрЋА$щЦƒ§] љ№*ЎуКч6RяaеZс[%чFг/k2ўAќvAe.'њ0Td€Д:uвPOo“wk€Iѓ АzЌ$okœХмїрсx1%ДR„єБ8ђ ѕ.s^”˜8šН2НЄіK!79НМрчoдћ*еЩ<.DM‘zЖ_*IŠBIсђ"s!ЕХA2ўB™mбБыВБwMТЅ-n\ШaЎiч24 ЖбѕрƒЗДёеD ІРІSіКUŒЈj›оыпEh,0МИ->В‡:fˆюЩ•Ÿ j—ЛkІ4зY™чAРЅсп0Вџt˜;нc2"E™tя’•‚…rТp=XzН$љfщ‡вJœўЯИџIє^ЊћL :“b&’ кгКѓЖ†LЏaxЌP‹' [Ю/ŽўoqфГЄщњѓЯЛ*кбtеЁ`.›bEt аDbdрл]SG6Ÿц~Ћ(|Иck?фІ'њ~у ќЩ4вЋгE‹–Т.“ЂјGюT&Ё[Ј‚]є6кСŸ}Йзfa Џ{PФўRжW!Ъ-њ^ ЂіW 2ЮЯKГsЌH€Ѓ%1А[e§d?ž†ЗqЯ>8кbязlB=С~MM/PМp xr%жF#о:ы<Ѓџ@3†Е—п<ЊЌIх ,Q0;Хъ{)ЗtxЛ"Yѕ1я­œЬ%ЕшэСњ_ŠєqЗљ„РuкV’йˆ3Ь5–Ёe&Q„e=ыВvяcB;ТВ$aЏAŸтУv+l*ћО6­ЗЂ.жb>‘‘c‘Kћ.ЮскHЇПДІ§у~>ЈзwаN Žsњкt[WЙ”7WђfУ"QТЩEсйЭˆfЏ•л јШI^_LэћPЙšВЈЦRdCЧSь 5Рs@ ЬБvNЈlSiŒAWЪ|ЇШ№“Ф§‘№њсM1JRPa pЬD?с"E З‹}% 2ХрC˜жСo №v№ФэœXа7ъFv^Gt єФој‡ш€ ИQ›П>щb&†јw{ љa[пц?kEБЎыY…‡ж ЃYF\Е­Іы8у?c#*†˜=НCЊ?ІAœ?МЋЅHЉ;цЈEф8Ќѕьи_dсјФIЛмЋAЋƒFъЖfЈю…5ХЎќ]ХЇфЇЭЧЃ•?А’и ›KNџР!ьf†CЙHŒrпіRS?4пнЛy‡`!§ьa щ]^ Хf­ЊOТ…Хh=ђƒRц/ЁхпkUО/ЙJмŽ'0lѕЮ’ŽQкOі>№Ъ8,Н;ƒёьЦc{ёWн /=‡Y2ѕoS„„BSлДC<нїјF’6H‡ЖЎ'Uь›Pи/о^œз?Є–ˆііы9СЌЊ&ѓr4 JГЎyЁфV.А…фЮБ3‘[e“-;В§Ы#я4пѓ[‡ОЌі|MяьJ9tАЁв9ЧЉЧ3t‹NъXиŽyе­ќІBcW3H0PКЪФ•~Ќ[•ЯтdБѓЈ ‹GxиN~K… }ЭwŽЁŽvІбTтt)яЖY№ИЯе!0OахX žРлBп7j=†ц^нЮ˜е#Џ^Ђh˜Ъ]x0ѓИ;Ќ}Šl;4`h-$‡]]*вжэиБ:ЦЖ‚Т(ш^СЧ'Гz›6=љj}ћА(GђгЌІ" х =r`Щг.d1UъoЬGџŽељGТСбР§uГТnсЧ3$й†єS%бgяx›њхжc–6UЧ‹ЛљћJчђg3лѕЩ[ПѕЖ )j/•м˜Ёй2і0.я)тЃWШЄo=ФŠў žќ 0и^YьG&ЁћšЩэœZоЄ{…€ЗdjѕОzkNь.ЇFXћВс—ѕ>їЛы ІqК‘ыЅ2'PO I‘ыЧц@у„j`QM6HUю…Ћ§™.њь#нvбнд­БLLєєЌ!ќбЫp­‹б2ЃјНЁ_РрЯЃћdЇ­7~—\ ы№5ќAдУ7Mz˜’$Нуа‘)†?Eu Уgцє…ъїzŸW+›#C>явњQGИ ~q)шR*PV”юtЯRž;С“IччC8CxљNћщпу"GŸвЦOXU(Ђ‘n+hJэ„315Kaiстё№Х~v тC‡ю?ЄХнuiŸx`ЭаЙлcC?zРж  ЄWКК †wчˆЩLŒJоmњ0ыЂn–њgЊќ[џ‘сќаz’b™Ўй ;ЌЧуГрЪйPлЧ33>дkRo§Ћbћђ šкU2O ьxЇFpД'nJ‰ХŒмРL§B СЮ5Е”Г;Ѕ‡$њчŒткОљXсE^\hЉхd"ТЙVedЉTд‡Жq€Ъ0OЉЃX=€ђxвЂђѓ'ЇЌZяm?r/М†}:/ЧюінЁЕNъц„YЫкяAlЮ!ЈЁž^h$иЗ$ џ˜ЯpЭГ$а№РѓujЎ—Щ=ЯНjЮ|[tП•;3]^wЙўъЗx'lqTA„`ЧœFZ\.дƒdНкŽˆ{ѕtZ†ГшЩР€кЛzЩзЈ’s™НqMІухNљ|учoЏЌщœ}Ѕт–Й— ВёА-љJWўШ˜+M?~t FoDVX,sќ"˜4АЩeQяеCА:ОЭЂи"" м'(Шˆ„ЛМкї•a| b:š[sAа)sі™Кu6>WњђъЫƒф™ƒdПѓяf–‹/ §KеlŸЩ їБз-Т{ЪсЪ^:K ,ић)‚gеуxMŽ‚YN–D WХbщўz_ˆо+gшРљ9|Qlё6ћy™EFх\kw4+ )Д№УњТЧx^žЪЋУќ@іЩTНKю=XNлdФ­шV`uO,р‚ЅВw$н ф€qwтPоњ›ёMOgŸ9!o?тBS-6ЄщвA:K\;8œИЂ6ыБ0EЄіЬ“ƒ^љzqŸ~JТкзЯwœа<]М+иЃwz9љЁюХИдЬ–,у‹‚н0љxWМI7cє}8 І~žœвdoЊfъЧИnŠУ-0RrАGyО5r`1уІЈgшЁЇoсЋтОBОї–ЬKTнc/=к‘(†.† jДD9ћzДрD|ЧzTLдdЇор‡цѕюшВТ)PЫCч Єфсыœщїz4ЕLЉ–‹ЌL,]:к%імЮgrќЃЎс]ё2^–оH$ёю‡Ћвc‰я‚Љ’` ’і” qnцk~}СкџЂsэк@;ьТš[9\.ЩЦŠm> “Eu– •*hђIиЏzzŸзѕГгъЗZ{№ж0B=˜V`чkаю ~Gd›rwы*&~4е^ХЩ_вЋЛќbd уD[gЪЂxШЇђЋ;8G>ДQqОŸњiшљЈЊіRbt{Ovі›‚TЖЁ›amъczшХPaЎ—и’єйSГл.(vозЎўWЈj vЅD1їёUB9тEМPn,IvдЋјƒcQ;ыѓЋ,ќ—zА яЬ‚Ў6тИ-СC–sL3дrGZКq^——+з„кvŸnчц… zбУіЃxbo9ЯЁf0‡фЙkп;HЄ њц™M5IОQ*Y'’ф…{§[}еЕЎоI/P‡К nР#п˜ЦЋPxwц^I’ЇЧJ @doТЦЮЏ`љŸЫwОдeчshЋžшxtЦЈИ<=ъL,ЙSоуЃс]/PсїІDўŽv EІqбсљы,ƒ1,„ркОš[!• в.0|ї№~ЇУќО'сАŠK3иŽ;ЈAeк‹ ёНѓhBiо6ђЁEји^ШУъS/мвЛfхяz•ЁсzЮЅЧD@@ n3mуБVњPЦЪXЧЗ{АBн!xq ŒŠ–%Ѓ>HеW љз;E‰nЅЙgjуsвуGTi<ј ѕb7‚ќу ёŒїДX^„­П&Н+пК‘Rс‚•<цq=e|Хˆрƒ"= Іщt[ŸŒЧбvћžыЏ,фЛ–"‰ƒ(`3Ф+WчАšT‚ЮPE‡З`B<ё3ЛЈВvše`Я“_fђ>Й™\ @mшщv'І•Іб)Ї"cЋ*)ъƒFпъ3XlћЃ v7уКХ "= M'бсCк ЊVеи ШŠВчаЃ5\ќ‹`ќеЙї;R‚=ЄVЗ•ЎCOўК=дГOвЉ2_@Ю/&!:!ъСшЙ _аъПСВzця8Е9ŽGБжt™;bC8Rm3оА“”иi\9nHИЬ 8>ЅЛЃ2ŒHњ9ыхл%7ž"GЗƒk; ”иMх#^›&ѕаbbСшG9љЦМтС;Бь{СТЊ‹я3IДЂp‘Е$ДЬЙL†Шіђћ@1‘<Ђм€›‹№ЊЧщЫ#џ^!oРmі8Ь§р†3R†”Х Œ†kv+RЭєm 7nЌ-о_щn}а46ф_^њfд|ŒЪMdа жc'5фг§0SB)ф ‘ЁЇђю­ЪМј-LЇ;ЄќŸS”7“КiXTСг…XkЂCАX'$i­уMZ.У•qsJзќ7'`юHœЗ…е{,ШQ<‘„Ы‘w.‘@ iХяє\<‰.‘Д#y§œ4§НбІcЗ–W ДZ*њЅcaDF?нNЕ{Љ_шќ%ŒsŸ3‘іжa‹Me2f6AmV%пМФі§гЂnq-Џ@(ЂЋ˜Њћі}їЮuQХЌйЗZР8‰WO КDqBРЈFЗЋ3,fžђЅЧ&<мЙЁуЋjмчM”š0*е|ЦЙЁ}њ}є‚bWТ&Ааlм;п;{oИлiнккuU–ИвWXеwшŸМЛ.ѕД˜іVgZxуж-јХQ:žБЈехО5$=ЙќЕxЋx|rбз‚ЧI мaђдƒ+j[FаЫАтЅые€юІъи5Zw ЖRнWSъ_”q§Ю”0зКBЄъзШ†œ5'KЩФxЄяЋЙž&6Ю,цnјЊњc'?ОŸвСQ>‚љЌšШзжЩG!3aйŽ7JTn:q\уQСыРДO§g)4јЉЩП0НёšЖЧA+ђV"Вё "Ђƒ+цйIŠZЪЙ?nЁ1T†јвGО(џрњ,ЕlCмвзЪзЩй“q˜ЯcЄ­ўаЈйЌеbG]ћ­™_PhЂ”§ќ_эхiМv:ŸДМ GАЗЄkйЮ@шJв^Vэ“Гі;в>"ЇХt-#уЦo§ъ“Lhр:ЃФЙ‘AƒyƒцН7mП*пq3sГѕ!ЭnЦ&)Хv^ЖсХEМБюVlп;reєЊьэ­ЌMлО#KWф‚‹ЈЂl-Ѓ<уMтлІзWPЊыє т1Y№ТЫ~ЖўW№;-…u "–+Q§ ЁmГ)ч™@ь:мЁT№ŽL3ѓj^ты>›ЇП?:aъ$њЮчЊ‚ЃdљЋ}тъЅУЁMОY€)SЊTУЎД}SŽmzёрў˜J§ЛНЯ•НЯj!)ш4AЧ ew`'_j7fщьлbКРwцЄў}œї~XЦˆ 4,>‡&xP#У#NЧАJе96шђ–WF1Ѓ€G‹ХOшњ‹Ѕ}PЇЯ §ХjvХ+i‰;д*І2нЏp–5Ў;ЎvЩТыБKю‘ynЁН &Яі{ŽŒaЎР7~\Ъ-‹ц)’’\u’@Ћl7m њJ~еЬі—cЄŸpѕ]7Ю˜ўp}Œ<1 ж§~хЕ=n†Яћв:кDзsћŒ0ОїjЮ›ОЛtW˜3Ђ>‘Т\х7ОšXPІ(p‹БЇX# gшЋЛ%hTљ4Ц]Г 1ЗХШižч'G#Ч8БOЮfФІУ ‘™,аб}ЊПЫŠ3g‡яlВ867аžР9ЦNrчЩ‚…Їтj*XPЧ™Г3Фђ+;}ыюKeћ­t+lьР†0ЯИxз”zС§ ѕo~+—лљХ:ЏД]ЖЂ]І“QњRХcІerKљnЄ›^ ЖqхД*ЅV xtЏ ~ф:?T§ГyђiпыЎ˜ќИ"zXчН_мvъкqђЌТ$ьшRU‡0:Ё$sPђЛ№G*їgиЗѕТS“TМЋИ|lАэ:>Dъ9fu'‰B7+ЉfхфЛпЯјNП_АНzчка‡аКеœD:сйэД‹шMJЏ$.8РsЫжо•q5SGзЗ Мш•9уёb,<),м‹‹`yCЁљBкaOџєЁeкgL{7зfрuљЊYdЕ‡СYР“W")“>yЇм Yt=љъЫ^xќFnˆу…Юƒў4]uяžžСхс†:lNе‚y—ГцX.^ю˜џџCЁ$уѓиBФнЎ‹бœћ Ћ§‹ояЁЌžѓ„@tт5yеПє2ЌМ(m€™cr§“Пcд§s†3]Д˜Љ#ш4ЌGГИЬоы—њd?oG'?У0В–Э–]‘ХaДpSP^„щ! „‰.нЦЄw•Б_цџ­х7ЕpЛ„њВ8ј!_˜ю€УнЋуo^;‡19цG{Ѕ5?RnИ~ўх{5.ПRІ2:џ@ ѓrƒєЊћŠ=†‰ C$МЗЅФкНБ$?ФЬОїЖяxЩBŽ№Ђ?T%DВŠ`ИеwoqЗ„О}рђвЙОХЬA:цХјJ.ВM0 L7§›ЬYЅ‹Зp!§Ш‚ Ы:нљz FU# .&"šcYіR!?†#НБ‰cЂі4OьпsЊДШкщ1ъJž{aœˆо&Чы|_кыј(pјz8я“IpŒђfщ˜бШjW$ 49HухTfѓТ:*›%†Eш•/мрvkCМЅzцGV3”™ыFэ ЮЊдБсsш )`™aх†џ^|рн?0ю;љ „уQЙЧ\ѓ*qУгВŠWмН2.Ае:r‡­^~•-јh?Ч Pгај';ПбСVQ[&ќ•Kw0i?‰-3–ќQцŒgџ5ЄщћLv!@N~жс$s)ЕyФ_г“Р6SФІ•u{ѕ}OЪЖМПИЗЕвцУ‰эШM;Ь|F|мŠдЩTEmŸЗИ:&_Q^h§Ѓэш…'PFЖ Zъ;§˜HЈЇиzhgЯ0йЧ YЅЖЊхьV{%<ПМо.“DйК7 ЕЧХжЊ&№Їa­ЅDЃn%к3<дRKЩ_хеї№|XлoѓЊ”ъ7є‘+ ‹щѓmЎ*ТVЇЭ!TƒШOw;PїёФВуЮчПJgЛСhЦed›Šc; 0+И[чё…wŒяс;/Ин–ыэU'іпtСЉ\ЭлЦVтtAF;tR•Љфнь9r9І"•FDНxб_ ВПЈяЄ……ђ/ѕ­'ж‰0іxM]­М:dR*ыљjДAъf{WѕЩЅоНd’~u—|‰Р№~МюыMžWwБzH™єЏЬ6ї#юM’њUKК›smBЛ„GTЮ`ЕЎ`ЫŠKЈ…­ымхбВ5"vлишЯёру[аМaч;Ы@Ц—‹О=lHMЁ'k‚MЉпЬcixWхІe˜ъ‘ `~дМeŸŸњЇђ5c§нU_ЫsŒЈ—œRщ%6JIпGjУg„ZєktЭSЉйНФћ—№ЖWK+*Љ Єи5ЅЃ­Дўѓ%cѕz9ЅpIєQxћ}“OдјZtѕœ”#ІжМтЮНХAKkчСцx–yБT• фЂЭФљN{ёе ЛBk^—ї3 Ж”Oфs–YWг]fвмa:œgдЌђђЊ€щOг#ОНы‰У:ѓ#ksё\ђЮЂЁ!ŸлвnЗЛюˆюR/ т„ˆ{›_nўwПMЃ+ЂUk FW8:Р:ч\Яy;3‘'YЬNё§™Щќ…ќЕМh7йьŸхёcЋ2џqV1–ѕ+//WVф L*ˆЩ?…ќЬB/Ўтч\СпRgЦžїЕТеуЈŸNbSt;Ш0'rr`eќЌц)9ыэќjrЮOІќЖ‚icбжBДем’ 4Ўl}И,Ь§шШIzр—™Ш’‚хъWeї_žёЏcеОќф.œЃ’šьќ іэ!кЙeЫ<Я^_оК|-l$тхэ—.ў$ЎЏoа2*ЅЁ3ЪЭак[а}qкђ,‰гЋгT№ЉПЦ†ъбћЭ—ыўQ†ѓ;MяAћ8 бI5Жкq‘M„Ћъˆ=с'J‹PАИ—в`QаКпГЛ`њћй›­Ž"и;‘ŽjБ7šдХ›жЭF„0‡Ъ;ЂMЂLїЮЛIZ_ћТч|KЙ&ѕЫ“o’хэСM™4@тЬ'тmbя‚”ŽЉ~ц&XgAв†v.аg|ћYWє-,хЛ/3МКsщrj›“г э†ЩZљјЌи5QЦАл§ёk >Љ›ў ЂюТ€TWY4 ћФ•KqwьpQB)э!0іьšыžeJ"[k“s[…L>чдƒYб•Л1жOUaЛАЈІVŸ=шa8Иі^йњЫ’ђЯ2іwхфХ-‘ѕŒЎћ“`“vb;bЉKO\`Qm…sDопнЛ~“ѕnЕtЏFx€фEщЂєЪyДX3НТS`№­;œЕЉЄkSУv š~хu•>ŠГUz[`Є ~ЏУО%>ёf­оc{Dц›їH№ф*,­—Ўлщлойѓ}эЖœFsАъсžИ™(щЁЄЇ‹•i)SCnР<АаОnРџPK–Q”& 6 PKр€чJШПуIЃpf.jar №ffсbŽ9зэ' ƒЏkˆЃЎЇŸ›ўПS 0Ѕ ь@Ѕћъ4–‹3300J00ˆEсJ}§<н\ƒCє|нŽЮˆЭŸm ві~тў}ЗкЗ(pо­šО­ћЪЊ—Ћ.њюžЭcЙфоЗm‘Гъэ“'ЉХruЊю‰c;71~оџѓЊ’–?јbмЮ<јЙЮxЁЕПšЊŸ<УЪєWЉOzcŸ71O3ŸГ>ыїЦчџy;>тПИ{ЧЂ З sGМ<4Xv-Zљ§^щ9эIоЙі‡MИO§uрцЅв˜чbтmя,Ђ bDмч2yЪ§ўшмuтR’‘K%epOdўВ%КЦ0К! ЧъЗјзёщ[”V/иKчŒяICŒŠ*—„.аГL.1зЙ*Ъ  ђЈ=гч2а КЎ( pј…~М`nЄk’ёХI™$$3рwŽIеП%g8э жёaŸRэ•™ЇUЗaSg+h3Ьгžjj~Ядц‰ДK,q‚ o’фDvžЪ›иjйmддбŠк^aОBaXƒѓ?і ŽpH%у+~ŸЃ-eюсікI›ДХДAh”Ї=ЃЬHЇЪќ€#/Д‰ЏнFNОУMЇЎџЉgl9[,”‰Й›ЦуЈ§ўшГ яIz{феќ&еЂrн0ќЈg~ЄЛ[KЦП|GєШ&4­ЗиHЛe H€ЃРNЗ љ^ШєбcЛ=VЋnЗгcGV “ЩфKђKеeƒ–4UЏЁМзŠ:-О;ъєT7є­А+ѓJU |wксѕ'”№ю)ХvТ–јб„[*)“Л+”1Ž~Ьn^k*жВЛЇтzƒјС`и72YЎалзЦCYu№ВкOŸ4З3 џCД H+NЄЩHЏ]аEŽ…шLWЋг№Vz{Тn7иS++…Y›˜ДиxэrDН mмˆoСрY њvb˜T̘дgog$йКgЕihћјівьRГг:wlsŸ/Џz!*>ќYпZЃhЙ*ЧvKчЄЈЋкЬ2щ‰јєјк†yчЬ6н>сzm§›WŸ}7…ВпŽ‘-^/гЏ]љБ,-чВЩЕъШv+Eи™;xЗц-OyћЊ‚w§ХЛuЭIOO§а№fdaЦы @€с­#BЭƒ­Иr!,iдЦ‘'МYй@*˜€АH—0ƒxPKDuуJй€ья$META-INF/DAVID_DY.RSAPKDuуJаABЂ6и_META-INF/DAVID_DY.SFPKDuуJ–Q”& 6 CNMETA-INF/MANIFEST.MFPK?р€чJШПуIЃ$ €Є‘„pf.jar €lL*їв€lL*їв€lL*ївPKXˆicedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/CodeBaseClassLoaderTest0000644000000000000000000000013213441742745030426 xustar0030 mtime=1552401893.064832771 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java0000644000175000002070000002371513441742745032166 0ustar00jvanekmock00000000000000/* CodeBaseClassLoaderTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import net.sourceforge.jnlp.mock.DummyJNLPFile; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.lang.reflect.Field; import java.net.URL; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.NullJnlpFileException; import net.sourceforge.jnlp.SecurityDesc; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.runtime.JNLPClassLoader.CodeBaseClassLoader; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.Remote; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletStartupSecuritySettings; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class CodeBaseClassLoaderTest extends NoStdOutErrTest { private static AppletSecurityLevel level; private static String macStatus; @BeforeClass public static void setPermissions() { level = AppletStartupSecuritySettings.getInstance().getSecurityLevel(); macStatus = JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK); JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars()); JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.NONE.toString()); } @AfterClass public static void resetPermissions() { JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, level.toChars()); JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, macStatus); } private static final String isWSA = "isWebstartApplication"; static void setStaticField(Field field, Object newValue) throws Exception { field.setAccessible(true); field.set(null, newValue); } private void setWSA() throws Exception { setStaticField(JNLPRuntime.class.getDeclaredField(isWSA), true); } private void setApplet() throws Exception { setStaticField(JNLPRuntime.class.getDeclaredField(isWSA), false); } @AfterClass public static void tearDown() throws Exception { setStaticField(JNLPRuntime.class.getDeclaredField(isWSA), false); } @Bug(id = {"PR895", "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-March/017626.html", "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-March/017667.html"}) @Test @Remote public void testClassResourceLoadSuccessCachingApplication() throws Exception { setWSA(); //we are testing new resource not in cache testResourceCaching("net/sourceforge/jnlp/about/Main.class"); } @Test @Remote public void testClassResourceLoadSuccessCachingApplet() throws Exception { setApplet(); //so new resource again not in cache testResourceCaching("net/sourceforge/jnlp/about/Main.class"); } @Test @Remote public void testResourceLoadSuccessCachingApplication() throws Exception { setWSA(); //we are testing new resource not in cache testResourceCaching("net/sourceforge/jnlp/about/resources/about.html"); } @Test @Remote public void testResourceLoadSuccessCachingApplet() throws Exception { setApplet(); //so new resource again not in cache testResourceCaching("net/sourceforge/jnlp/about/resources/about.html"); } public void testResourceCaching(String r) throws Exception { testResourceCaching(r, true); } public void testResourceCaching(String r, boolean shouldExists) throws Exception { JNLPFile dummyJnlpFile = new DummyJNLPFile(); JNLPClassLoader parent = new JNLPClassLoader(dummyJnlpFile, null); CodeBaseClassLoader classLoader = new CodeBaseClassLoader(new URL[]{DummyJNLPFile.JAR_URL, DummyJNLPFile.CODEBASE_URL}, parent); int level = 10; if (shouldExists) { //for found the "caching" is by internal logic.Always faster, but who knows how... //to keep the test stabile keep the difference minimal level = 1; } long startTime, stopTime; startTime = System.nanoTime(); URL u1 = classLoader.findResource(r); if (shouldExists) { Assert.assertNotNull(u1); } else { Assert.assertNull(u1); } stopTime = System.nanoTime(); long timeOnFirstTry = stopTime - startTime; ServerAccess.logErrorReprint("" + timeOnFirstTry); startTime = System.nanoTime(); URL u2 = classLoader.findResource(r); if (shouldExists) { Assert.assertNotNull(u1); } else { Assert.assertNull(u2); } stopTime = System.nanoTime(); long timeOnSecondTry = stopTime - startTime; ServerAccess.logErrorReprint("" + timeOnSecondTry); assertTrue(timeOnSecondTry < (timeOnFirstTry / level)); } @Bug(id = {"PR895", "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-March/017626.html", "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-March/017667.html"}) @Test @Remote public void testResourceLoadFailureCachingApplication() throws Exception { setWSA(); testResourceCaching("net/sourceforge/jnlp/about/Main_FOO_.class", false); } @Test public void testResourceLoadFailureCachingApplet() throws Exception { setApplet(); testResourceCaching("net/sourceforge/jnlp/about/Main_FOO_.class", false); } @Test @Remote public void testParentClassLoaderIsAskedForClassesApplication() throws Exception { setWSA(); testParentClassLoaderIsAskedForClasses(); } @Test @Remote public void testParentClassLoaderIsAskedForClassesApplet() throws Exception { setApplet(); testParentClassLoaderIsAskedForClasses(); } public void testParentClassLoaderIsAskedForClasses() throws Exception { JNLPFile dummyJnlpFile = new DummyJNLPFile(); final boolean[] parentWasInvoked = new boolean[1]; JNLPClassLoader parent = new JNLPClassLoader(dummyJnlpFile, null) { @Override protected Class findClass(String name) throws ClassNotFoundException { parentWasInvoked[0] = true; throw new ClassNotFoundException(name); } }; CodeBaseClassLoader classLoader = new CodeBaseClassLoader(new URL[]{DummyJNLPFile.JAR_URL, DummyJNLPFile.CODEBASE_URL}, parent); try { classLoader.findClass("foo"); assertFalse("should not happen", true); } catch (ClassNotFoundException cnfe) { /* ignore */ } assertTrue(parentWasInvoked[0]); } @Test public void testNullFileSecurityDescApplication() throws Exception { setWSA(); Exception ex = null; try { testNullFileSecurityDesc(); } catch (Exception exx) { ex = exx; } Assert.assertTrue("was expected exception", ex != null); Assert.assertTrue("was expected " + NullJnlpFileException.class.getName(), ex instanceof NullJnlpFileException); } @Test @Remote public void testNullFileSecurityDescApplet() throws Exception { setApplet(); Exception ex = null; try { testNullFileSecurityDesc(); } catch (Exception exx) { ex = exx; } Assert.assertTrue("was expected exception", ex != null); Assert.assertTrue("was expected " + NullJnlpFileException.class.getName(), ex instanceof NullJnlpFileException); } public void testNullFileSecurityDesc() throws Exception { JNLPFile dummyJnlpFile = new DummyJNLPFile() { @Override public SecurityDesc getSecurity() { return new SecurityDesc(null, SecurityDesc.SANDBOX_PERMISSIONS, null); } }; JNLPClassLoader parent = new JNLPClassLoader(dummyJnlpFile, null); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/JNLPFileTest.java0000644000000000000000000000013213441742745027127 xustar0030 mtime=1552401893.067832765 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPFileTest.java0000644000175000002070000006414013441742745027744 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.io.File; import java.net.URL; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.jar.Attributes; import java.util.jar.Manifest; import net.sourceforge.jnlp.InformationDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.SecurityDesc; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.mock.DummyJNLPFileWithJar; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletStartupSecuritySettings; import net.sourceforge.jnlp.util.FileTestUtils; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class JNLPFileTest extends NoStdOutErrTest { private static AppletSecurityLevel level; private static List attCheckValue; @BeforeClass public static void setPermissions() { level = AppletStartupSecuritySettings.getInstance().getSecurityLevel(); attCheckValue = ManifestAttributesChecker.getAttributesCheck(); JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars()); JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, String.valueOf(ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ALL)); } @AfterClass public static void resetPermissions() { JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, level.toChars()); JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, String.valueOf(attCheckValue)); } @Test public void newSecurityAttributesTestNotSet() throws Exception { //oreder is tested in removeTitle //here we go with pure loading and parsing of them File tempDirectory = FileTestUtils.createTempDirectory(); tempDirectory.deleteOnExit(); File jarLocation66 = new File(tempDirectory, "test66.jar"); File jarLocation77 = new File(tempDirectory, "test77.jar"); Manifest manifest77 = new Manifest(); FileTestUtils.createJarWithContents(jarLocation66); //no manifest FileTestUtils.createJarWithContents(jarLocation77, manifest77); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(0, jarLocation66, jarLocation77); //jar 6 should be main final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS);//jnlp file got its instance in classloaders constructor //jnlpFile.getManifestsAttributes().setLoader(classLoader); //classloader set, but no att specified Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_NAME))); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_LIBRARY_ALLOWABLE))); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.CALLER_ALLOWABLE))); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.CODEBASE))); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.PERMISSIONS))); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_LIBRARY))); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_ONLY))); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.ENTRY_POINT))); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getMainClass()); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getApplicationName()); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getApplicationLibraryAllowableCodebase()); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getCallerAllowableCodebase()); Assert.assertNull("classloader attached, but should be null", jnlpFile.getManifestsAttributes().getCodebase()); Assert.assertEquals("no classloader attached, should be null", JNLPFile.ManifestBoolean.UNDEFINED, jnlpFile.getManifestsAttributes().isSandboxForced()); Assert.assertEquals("no classloader attached, should be null", JNLPFile.ManifestBoolean.UNDEFINED, jnlpFile.getManifestsAttributes().isTrustedLibrary()); Assert.assertEquals("no classloader attached, should be null", JNLPFile.ManifestBoolean.UNDEFINED, jnlpFile.getManifestsAttributes().isTrustedOnly()); } @Test public void newSecurityAttributesTest() throws Exception { //oreder is tested in removeTitle //here we go with pure loading and aprsing of them File tempDirectory = FileTestUtils.createTempDirectory(); tempDirectory.deleteOnExit(); File jarLocation6 = new File(tempDirectory, "test6.jar"); File jarLocation7 = new File(tempDirectory, "test7.jar"); Manifest manifest6 = new Manifest(); manifest6.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "DummyClass1"); //see DummyJNLPFileWithJar constructor with int manifest6.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_NAME), "DummyClass1 title"); manifest6.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.ENTRY_POINT), "main1 main2"); manifest6.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_LIBRARY_ALLOWABLE), "*.com https://*.cz"); manifest6.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.CALLER_ALLOWABLE), "*.net ftp://*uu.co.uk"); manifest6.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.CODEBASE), "*.com *.net *.cz *.co.uk"); /* * "sandbox" or "all-permissions" */ /* TODO: Commented lines with "sandbox" permissions specified are causing failures after * PR1769 ("Permissions: sandbox" manifest attribute) patch is applied. The problem * appears to be that the JarCertVerifier thinks that DummyJNLPFileWithJars are * signed (jcv.isFullySigned() falls into the isTriviallySigned() case) even though * they are completely unsigned. This *may* be only be an issue with DummyJNLPFiles. */ // manifest6.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.PERMISSIONS), "sandbox"); /* commented due to DummyJNLP being "signed" */ manifest6.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.PERMISSIONS), "all-permissions"); manifest6.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_LIBRARY), "false"); manifest6.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_ONLY), "false"); Manifest manifest7 = new Manifest(); //6 must e main manifest7.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "DummyClass2"); /* * "sandbox" or "all-permissions" */ manifest7.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.PERMISSIONS), "erroronous one"); manifest7.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_LIBRARY), "erroronous one"); manifest7.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_ONLY), "erroronous one"); FileTestUtils.createJarWithContents(jarLocation6, manifest6); FileTestUtils.createJarWithContents(jarLocation7, manifest7); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(1, jarLocation7, jarLocation6); //jar 6 should be main. Jar 7 have wrong items, but they are never laoded as in main jar are the correct one final DummyJNLPFileWithJar errorJnlpFile = new DummyJNLPFileWithJar(0, jarLocation7); //jar 7 should be main Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_NAME))); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.ENTRY_POINT))); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_LIBRARY_ALLOWABLE))); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.CALLER_ALLOWABLE))); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.CODEBASE))); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.PERMISSIONS))); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_LIBRARY))); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_ONLY))); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getApplicationName()); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getApplicationLibraryAllowableCodebase()); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getCallerAllowableCodebase()); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getCodebase()); Assert.assertEquals("no classloader attached, should be null", JNLPFile.ManifestBoolean.UNDEFINED, jnlpFile.getManifestsAttributes().isSandboxForced()); Assert.assertEquals("no classloader attached, should be null", JNLPFile.ManifestBoolean.UNDEFINED, jnlpFile.getManifestsAttributes().isTrustedLibrary()); Assert.assertEquals("no classloader attached, should be null", JNLPFile.ManifestBoolean.UNDEFINED, jnlpFile.getManifestsAttributes().isTrustedOnly()); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); //jnlp file got its instance in classloaders constructor //jnlpFile.getManifestsAttributes().setLoader(classLoader); Exception ex = null; try { final JNLPClassLoader errorClassLoader = new JNLPClassLoader(errorJnlpFile, UpdatePolicy.ALWAYS);//jnlp file got its instance in classloaders constructor //errorJnlpFile.getManifestsAttributes().setLoader(errorClassLoader); } catch (Exception e){ //correct exception ex = e; } Assert.assertNotNull(ex); Assert.assertEquals("DummyClass1 title", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_NAME))); Assert.assertEquals("main1 main2", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.ENTRY_POINT))); Assert.assertEquals("*.com https://*.cz", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_LIBRARY_ALLOWABLE))); Assert.assertEquals("*.net ftp://*uu.co.uk", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.CALLER_ALLOWABLE))); Assert.assertEquals("*.com *.net *.cz *.co.uk", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.CODEBASE))); // Assert.assertEquals(SecurityDesc.RequestedPermissionLevel.SANDBOX.toHtmlString(), jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.PERMISSIONS))); /* commented due to DummyJNLP being "signed" */ Assert.assertEquals(SecurityDesc.RequestedPermissionLevel.ALL.toHtmlString(), jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.PERMISSIONS))); Assert.assertEquals("false", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_LIBRARY))); Assert.assertEquals("false", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_ONLY))); Assert.assertNull(errorJnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_NAME))); Assert.assertNull(errorJnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.ENTRY_POINT))); Assert.assertNull(errorJnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_LIBRARY_ALLOWABLE))); Assert.assertNull(errorJnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.CALLER_ALLOWABLE))); Assert.assertNull(errorJnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.CODEBASE))); Assert.assertEquals("erroronous one", errorJnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.PERMISSIONS))); Assert.assertEquals("erroronous one", errorJnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_LIBRARY))); Assert.assertEquals("erroronous one", errorJnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.TRUSTED_ONLY))); Assert.assertEquals("DummyClass1 title", jnlpFile.getManifestsAttributes().getApplicationName()); Assert.assertEquals(true, jnlpFile.getManifestsAttributes().getApplicationLibraryAllowableCodebase().matches(new URL("http://aa.com"))); Assert.assertEquals(true, jnlpFile.getManifestsAttributes().getApplicationLibraryAllowableCodebase().matches(new URL("https://aa.cz"))); Assert.assertEquals(true, jnlpFile.getManifestsAttributes().getApplicationLibraryAllowableCodebase().matches(new URL("https://aa.com"))); Assert.assertEquals(false, jnlpFile.getManifestsAttributes().getApplicationLibraryAllowableCodebase().matches(new URL("http://aa.cz"))); Assert.assertEquals(true, jnlpFile.getManifestsAttributes().getCallerAllowableCodebase().matches(new URL("http://aa.net"))); Assert.assertEquals(true, jnlpFile.getManifestsAttributes().getCallerAllowableCodebase().matches(new URL("ftp://aa.uu.co.uk"))); Assert.assertEquals(false, jnlpFile.getManifestsAttributes().getCallerAllowableCodebase().matches(new URL("http://aa.uu.co.uk"))); Assert.assertEquals("*.com *.net *.cz *.co.uk", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.CODEBASE))); Assert.assertEquals(true, jnlpFile.getManifestsAttributes().getCodebase().matches(new URL("http://aa.com"))); Assert.assertEquals(true, jnlpFile.getManifestsAttributes().getCodebase().matches(new URL("ftp://aa.bb.net"))); Assert.assertEquals(true, jnlpFile.getManifestsAttributes().getCodebase().matches(new URL("https://x.net"))); Assert.assertEquals(false, jnlpFile.getManifestsAttributes().getCodebase().matches(new URL("http://aa.bb/com"))); // Assert.assertEquals(JNLPFile.ManifestBoolean.TRUE, jnlpFile.getManifestsAttributes().isSandboxForced()); /* commented due to DummyJNLP being "signed" */ Assert.assertEquals(JNLPFile.ManifestBoolean.FALSE, jnlpFile.getManifestsAttributes().isSandboxForced()); Assert.assertEquals(JNLPFile.ManifestBoolean.FALSE, jnlpFile.getManifestsAttributes().isTrustedLibrary()); Assert.assertEquals(JNLPFile.ManifestBoolean.FALSE, jnlpFile.getManifestsAttributes().isTrustedOnly()); ex = null; try { errorJnlpFile.getManifestsAttributes().isSandboxForced(); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); ex = null; try { Assert.assertEquals("erroronous one", errorJnlpFile.getManifestsAttributes().isTrustedLibrary()); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); ex = null; try { Assert.assertEquals("erroronous one", errorJnlpFile.getManifestsAttributes().isTrustedOnly()); } catch (Exception e) { ex = e; } Assert.assertNotNull(ex); } @Test public void removeTitle() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); tempDirectory.deleteOnExit(); File jarLocation1 = new File(tempDirectory, "test1.jar"); File jarLocation2 = new File(tempDirectory, "test2.jar"); File jarLocation3 = new File(tempDirectory, "test3.jar"); File jarLocation4 = new File(tempDirectory, "test4.jar"); File jarLocation5 = new File(tempDirectory, "test5.jar"); /* Test with various attributes in manifest!s! */ Manifest manifest1 = new Manifest(); manifest1.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "DummyClass1"); //two times, but one in main jar, see DummyJNLPFileWithJar constructor with int Manifest manifest2 = new Manifest(); manifest2.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_VENDOR, "rh1"); //two times, both in not main jar, see DummyJNLPFileWithJar constructor with int Manifest manifest3 = new Manifest(); manifest3.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_TITLE, "it"); //jsut once in not main jar, see DummyJNLPFileWithJar constructor with int manifest3.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_VENDOR, "rh2"); Manifest manifest4 = new Manifest(); manifest4.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "DummyClass2"); //see jnlpFile.setMainJar(3); manifest4.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_URL, "some url2"); //see DummyJNLPFileWithJar constructor with int //first jar Manifest manifest5 = new Manifest(); manifest5.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_URL, "some url1"); //see DummyJNLPFileWithJar constructor with int manifest5.getMainAttributes().put(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_NAME), "Manifested Name"); FileTestUtils.createJarWithContents(jarLocation1, manifest1); FileTestUtils.createJarWithContents(jarLocation2, manifest2); FileTestUtils.createJarWithContents(jarLocation3, manifest3); FileTestUtils.createJarWithContents(jarLocation4, manifest4); FileTestUtils.createJarWithContents(jarLocation5, manifest5); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(3, jarLocation5, jarLocation3, jarLocation4, jarLocation1, jarLocation2); //jar 1 should be main Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getMainClass()); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_VENDOR)); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_TITLE)); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.MAIN_CLASS)); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_VENDOR_ID)); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_URL)); Assert.assertNull("no classloader attached, should be null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_NAME))); Assert.assertNull(jnlpFile.getTitleFromJnlp()); Assert.assertNull(jnlpFile.getTitleFromManifest()); Assert.assertNull(jnlpFile.getTitle()); setTitle(jnlpFile); Assert.assertEquals("jnlp title", jnlpFile.getTitleFromJnlp()); Assert.assertNull(jnlpFile.getTitleFromManifest()); Assert.assertEquals("jnlp title", jnlpFile.getTitle()); removeTitle(jnlpFile); Assert.assertNull(jnlpFile.getTitleFromJnlp()); Assert.assertNull(jnlpFile.getTitleFromManifest()); Assert.assertNull(jnlpFile.getTitle()); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS);//jnlp file got its instance in classloaders constructor //jnlpFile.getManifestsAttributes().setLoader(classLoader); Assert.assertNotNull("classloader attached, should be not null", jnlpFile.getManifestsAttributes().getMainClass()); Assert.assertNull("defined twice, shoud be null", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_VENDOR)); Assert.assertNotNull("classloader attached, should be not null", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_TITLE)); Assert.assertNotNull("classloader attached, should be not null", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.MAIN_CLASS)); Assert.assertNull("not deffined, should benull", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_VENDOR_ID)); Assert.assertNotNull("classloader attached, should be not null", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_URL)); Assert.assertNotNull("classloader attached, should be not null", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_NAME))); //correct values are also tested in JnlpClassloaderTest Assert.assertEquals("classloader attached, should be not null", "it", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_TITLE)); Assert.assertEquals("classloader attached, should be not null", "DummyClass1", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.MAIN_CLASS)); Assert.assertEquals("classloader attached, should be not null", "some url1", jnlpFile.getManifestsAttributes().getAttribute(Attributes.Name.IMPLEMENTATION_URL)); Assert.assertEquals("classloader attached, should be not null", "Manifested Name", jnlpFile.getManifestsAttributes().getAttribute(new Attributes.Name(JNLPFile.ManifestsAttributes.APP_NAME))); Assert.assertNull(jnlpFile.getTitleFromJnlp()); Assert.assertEquals("Manifested Name", jnlpFile.getTitleFromManifest()); Assert.assertEquals("Manifested Name", jnlpFile.getTitle()); setTitle(jnlpFile); Assert.assertEquals("jnlp title", jnlpFile.getTitleFromJnlp()); Assert.assertEquals("Manifested Name", jnlpFile.getTitleFromManifest()); Assert.assertEquals("jnlp title (Manifested Name)", jnlpFile.getTitle()); } private void setTitle(final DummyJNLPFileWithJar jnlpFile) { setTitle(jnlpFile, "jnlp title"); } private void setTitle(final DummyJNLPFileWithJar jnlpFile, final String title) { jnlpFile.setInfo(Arrays.asList(new InformationDesc[]{ new InformationDesc(new Locale[]{}, false) { @Override public String getTitle() { return title; } } })); } private void removeTitle(final DummyJNLPFileWithJar jnlpFile) { jnlpFile.setInfo(Arrays.asList(new InformationDesc[]{})); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/JNLPClassLoaderTest.jav0000644000000000000000000000013213441742745030303 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java0000644000175000002070000004101313441742745031253 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import static net.sourceforge.jnlp.util.FileTestUtils.assertNoFileLeak; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.nio.file.Files; import java.util.Arrays; import java.util.List; import java.util.jar.Attributes; import java.util.jar.Manifest; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.mock.DummyJNLPFileWithJar; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletStartupSecuritySettings; import net.sourceforge.jnlp.util.FileTestUtils; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class JNLPClassLoaderTest extends NoStdOutErrTest { private static AppletSecurityLevel level; public static String askUser; @BeforeClass public static void setPermissions() { level = AppletStartupSecuritySettings.getInstance().getSecurityLevel(); JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, AppletSecurityLevel.ALLOW_UNSIGNED.toChars()); } @AfterClass public static void resetPermissions() { JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, level.toChars()); } @BeforeClass public static void noDialogs() { askUser = JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER); JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER, Boolean.toString(false)); } @AfterClass public static void restoreDialogs() { JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER, askUser); } /* Note: Only does file leak testing for now. */ @Test public void constructorFileLeakTest() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); File jarLocation = new File(tempDirectory, "test.jar"); FileTestUtils.createJarWithContents(jarLocation /* no contents*/); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); assertNoFileLeak(new Runnable() { @Override public void run() { try { new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); } catch (LaunchException e) { fail(e.toString()); } } }); } /* Note: We should create a JNLPClassLoader with an invalid jar to test isInvalidJar with. * However, it is tricky without it erroring-out. */ @Test public void isInvalidJarTest() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); File jarLocation = new File(tempDirectory, "test.jar"); FileTestUtils.createJarWithContents(jarLocation /* no contents*/); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); assertNoFileLeak(new Runnable() { @Override public void run() { assertFalse(classLoader.isInvalidJar(jnlpFile.getJarDesc())); } }); } @Test public void getMainClassNameTest() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); File jarLocation = new File(tempDirectory, "test.jar"); /* Test with main-class in manifest */ { Manifest manifest = new Manifest(); manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "DummyClass"); FileTestUtils.createJarWithContents(jarLocation, manifest); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); assertNoFileLeak(new Runnable() { @Override public void run() { assertEquals("DummyClass", classLoader.getMainClassName(jnlpFile.getJarLocation())); } }); } } @Test public void getMainClassNameTestEmpty() throws Exception { /* Test with-out any main-class specified */ { File tempDirectory = FileTestUtils.createTempDirectory(); File jarLocation = new File(tempDirectory, "test.jar"); FileTestUtils.createJarWithContents(jarLocation /* No contents */); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); assertNoFileLeak(new Runnable() { @Override public void run() { assertEquals(null, classLoader.getMainClassName(jnlpFile.getJarLocation())); } }); } } /* Note: Although it does a basic check, this mainly checks for file-descriptor leak */ @Test public void checkForMainFileLeakTest() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); File jarLocation = new File(tempDirectory, "test.jar"); FileTestUtils.createJarWithContents(jarLocation /* No contents */); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); assertNoFileLeak(new Runnable() { @Override public void run() { try { classLoader.checkForMain(Arrays.asList(jnlpFile.getJarDesc())); } catch (LaunchException e) { fail(e.toString()); } } }); assertFalse(classLoader.hasMainJar()); } @Test public void getCustomAtributes() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); File jarLocation = new File(tempDirectory, "testX.jar"); /* Test with attributes in manifest */ Manifest manifest = new Manifest(); manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "DummyClass"); manifest.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_TITLE, "it"); manifest.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_VENDOR, "rh"); FileTestUtils.createJarWithContents(jarLocation, manifest); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); assertNoFileLeak(new Runnable() { @Override public void run() { assertEquals("rh", classLoader.getManifestAttribute(jnlpFile.getJarLocation(), Attributes.Name.IMPLEMENTATION_VENDOR)); assertEquals("DummyClass", classLoader.getManifestAttribute(jnlpFile.getJarLocation(), Attributes.Name.MAIN_CLASS)); assertEquals("it", classLoader.getManifestAttribute(jnlpFile.getJarLocation(), Attributes.Name.IMPLEMENTATION_TITLE)); } }); } @Test public void getCustomAtributesEmpty() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); File jarLocation = new File(tempDirectory, "testX.jar"); /* Test with-out any attribute specified specified */ FileTestUtils.createJarWithContents(jarLocation /* No contents */); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); assertNoFileLeak(new Runnable() { @Override public void run() { assertEquals(null, classLoader.getManifestAttribute(jnlpFile.getJarLocation(), Attributes.Name.IMPLEMENTATION_VENDOR)); assertEquals(null, classLoader.getManifestAttribute(jnlpFile.getJarLocation(), Attributes.Name.MAIN_CLASS)); assertEquals(null, classLoader.getManifestAttribute(jnlpFile.getJarLocation(), Attributes.Name.IMPLEMENTATION_TITLE)); } }); } @Test public void checkOrderWhenReadingAttributes() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); File jarLocation1 = new File(tempDirectory, "test1.jar"); File jarLocation2 = new File(tempDirectory, "test2.jar"); File jarLocation3 = new File(tempDirectory, "test3.jar"); File jarLocation4 = new File(tempDirectory, "test4.jar"); File jarLocation5 = new File(tempDirectory, "test5.jar"); /* Test with various attributes in manifest!s! */ Manifest manifest1 = new Manifest(); manifest1.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "DummyClass1"); //two times, but one in main jar, see DummyJNLPFileWithJar constructor with int Manifest manifest2 = new Manifest(); manifest2.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_VENDOR, "rh1"); //two times, both in not main jar, see DummyJNLPFileWithJar constructor with int Manifest manifest3 = new Manifest(); manifest3.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_TITLE, "it"); //jsut once in not main jar, see DummyJNLPFileWithJar constructor with int manifest3.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_VENDOR, "rh2"); Manifest manifest4 = new Manifest(); manifest4.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "DummyClass2"); //see jnlpFile.setMainJar(3); manifest4.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_URL, "some url2"); //see DummyJNLPFileWithJar constructor with int //first jar Manifest manifest5 = new Manifest(); manifest5.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_URL, "some url1"); //see DummyJNLPFileWithJar constructor with int FileTestUtils.createJarWithContents(jarLocation1, manifest1); FileTestUtils.createJarWithContents(jarLocation2, manifest2); FileTestUtils.createJarWithContents(jarLocation3, manifest3); FileTestUtils.createJarWithContents(jarLocation4, manifest4); FileTestUtils.createJarWithContents(jarLocation5, manifest5); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(3, jarLocation5, jarLocation3, jarLocation4, jarLocation1, jarLocation2); //jar 1 should be main final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); assertNoFileLeak(new Runnable() { @Override public void run() { //defined twice assertEquals(null, classLoader.checkForAttributeInJars(Arrays.asList(jnlpFile.getJarDescs()), Attributes.Name.IMPLEMENTATION_VENDOR)); //defined twice, but one in main jar assertEquals("DummyClass1", classLoader.checkForAttributeInJars(Arrays.asList(jnlpFile.getJarDescs()), Attributes.Name.MAIN_CLASS)); //defined not in main jar assertEquals("it", classLoader.checkForAttributeInJars(Arrays.asList(jnlpFile.getJarDescs()), Attributes.Name.IMPLEMENTATION_TITLE)); //not deffined assertEquals(null, classLoader.checkForAttributeInJars(Arrays.asList(jnlpFile.getJarDescs()), Attributes.Name.IMPLEMENTATION_VENDOR_ID)); //deffined in first jar assertEquals("some url1", classLoader.checkForAttributeInJars(Arrays.asList(jnlpFile.getJarDescs()), Attributes.Name.IMPLEMENTATION_URL)); } }); } @Test public void tryNullManifest() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); File jarLocation = new File(tempDirectory, "test-npe.jar"); File dummyContent = File.createTempFile("dummy", "context", tempDirectory); jarLocation.deleteOnExit(); /* Test with-out any attribute specified specified */ FileTestUtils.createJarWithoutManifestContents(jarLocation, dummyContent); final Exception[] exs = new Exception[2]; final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); try { final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); assertNoFileLeak(new Runnable() { @Override public void run() { try { assertEquals(null, classLoader.getManifestAttribute(jnlpFile.getJarLocation(), Attributes.Name.MAIN_CLASS)); assertEquals(null, classLoader.getManifestAttribute(jnlpFile.getJarLocation(), Attributes.Name.IMPLEMENTATION_TITLE)); } catch (Exception e) { exs[0] = e; } } }); } catch (Exception e) { exs[1] = e; } Assert.assertNotNull(exs); Assert.assertNull(exs[0]); Assert.assertNull(exs[1]); } @Test @Bug(id = "PR3417") /** * The nested jar must be more 1024 bytes long. Better, longer * then byte[] bytes = new byte[1024] on line 1273 in * net.sourceforge.jnlp.runtime.JNLPClassLoader otherwise the file * will not get rewritten while read Also there must be more then * one item of this size, for same reason */ public void testNameClashInNestedJars() throws Exception { //for this test is enought to not crash jvm boolean verifyBackup = JNLPRuntime.isVerifying(); File dirHolder = File.createTempFile("pf-", ".jar"); dirHolder.deleteOnExit(); File jarLocation = new File(dirHolder.getParentFile(), "pf.jar"); jarLocation.deleteOnExit(); try { //it is invalid jar, so we have to disable checks first JNLPRuntime.setVerify(false); InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("net/sourceforge/jnlp/runtime/pf.jar-orig"); Files.copy(is, jarLocation.toPath()); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS) { @Override protected void activateJars(List jars) { super.activateJars(jars); } }; } finally { JNLPRuntime.setVerify(verifyBackup); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/html0000644000000000000000000000013213441742745024750 xustar0030 mtime=1552401893.077832744 30 atime=1552410887.112183445 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/html/0000755000175000002070000000000013441742745025635 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/html/PaxHeaders.7406/AppletParserTest.j0000644000000000000000000000013213441742745030442 xustar0030 mtime=1552401893.077832744 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/html/AppletParserTest.java0000644000175000002070000000435313441742745031747 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime.html; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import org.junit.Test; public class AppletParserTest { @Test public void sanitizeSizeTest() { assertFalse(AppletParser.sanitizeSize(null) == null); assertEquals("1", AppletParser.sanitizeSize(null)); assertEquals("800", AppletParser.sanitizeSize("800")); assertEquals("10", AppletParser.sanitizeSize("10px")); assertEquals("1000", AppletParser.sanitizeSize(" 1000 ")); assertEquals("1000", AppletParser.sanitizeSize(" $1000 ")); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/BootTest.java0000644000000000000000000000013213441742745026467 xustar0030 mtime=1552401893.076832746 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/BootTest.java0000644000175000002070000000504113441742745027277 0ustar00jvanekmock00000000000000/* Copyright (C) 2017 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.Assert; import org.junit.Test; public class BootTest extends NoStdOutErrTest { @Test public void fixJnlpProtocolTest() throws Exception { Assert.assertEquals("http://www.com/file.jnlp", Boot.fixJnlpProtocol("jnlp://www.com/file.jnlp")); Assert.assertEquals("https://www.com/file.jnlp", Boot.fixJnlpProtocol("jnlps://www.com/file.jnlp")); Assert.assertEquals("http://www.com/file.jnlp", Boot.fixJnlpProtocol("jnlp:http://www.com/file.jnlp")); Assert.assertEquals("https://www.com/file.jnlp", Boot.fixJnlpProtocol("jnlp:https://www.com/file.jnlp")); Assert.assertEquals("http://www.com/file.jnlp", Boot.fixJnlpProtocol("jnlps:http://www.com/file.jnlp")); Assert.assertEquals("https://www.com/file.jnlp", Boot.fixJnlpProtocol("jnlps:https://www.com/file.jnlp")); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/ResourcesDescTest.java0000644000000000000000000000013213441742745030335 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/ResourcesDescTest.java0000644000175000002070000001112413441742745031144 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.io.File; import java.util.jar.Manifest; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.mock.DummyJNLPFileWithJar; import net.sourceforge.jnlp.util.FileTestUtils; import org.junit.Assert; import org.junit.Test; public class ResourcesDescTest { @Test public void checkGetMainJar_noMainSet() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); tempDirectory.deleteOnExit(); File jarLocation1 = new File(tempDirectory, "test1.jar"); File jarLocation2 = new File(tempDirectory, "test2.jar"); File jarLocation3 = new File(tempDirectory, "test3.jar"); Manifest manifest1 = new Manifest(); Manifest manifest2 = new Manifest(); Manifest manifest3 = new Manifest(); Manifest manifest4 = new Manifest(); Manifest manifest5 = new Manifest(); FileTestUtils.createJarWithContents(jarLocation1, manifest1); FileTestUtils.createJarWithContents(jarLocation2, manifest2); FileTestUtils.createJarWithContents(jarLocation3, manifest3); final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation1, jarLocation2, jarLocation3); JARDesc result = jnlpFile.getResources().getMainJAR(); Assert.assertTrue("first jar must be returned", result.getLocation().getFile().endsWith("test1.jar")); } @Test public void checkGetMainJar_mainSet() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); tempDirectory.deleteOnExit(); File jarLocation1 = new File(tempDirectory, "test1.jar"); File jarLocation2 = new File(tempDirectory, "test2.jar"); File jarLocation3 = new File(tempDirectory, "test3.jar"); Manifest manifest1 = new Manifest(); Manifest manifest2 = new Manifest(); Manifest manifest3 = new Manifest(); Manifest manifest4 = new Manifest(); Manifest manifest5 = new Manifest(); FileTestUtils.createJarWithContents(jarLocation1, manifest1); FileTestUtils.createJarWithContents(jarLocation2, manifest2); FileTestUtils.createJarWithContents(jarLocation3, manifest3); DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(0, jarLocation1, jarLocation2, jarLocation3); JARDesc result = jnlpFile.getResources().getMainJAR(); Assert.assertTrue("main jar must be returned", result.getLocation().getFile().endsWith("test1.jar")); jnlpFile = new DummyJNLPFileWithJar(1, jarLocation1, jarLocation2, jarLocation3); result = jnlpFile.getResources().getMainJAR(); Assert.assertTrue("main jar must be returned", result.getLocation().getFile().endsWith("test2.jar")); jnlpFile = new DummyJNLPFileWithJar(2, jarLocation1, jarLocation2, jarLocation3); result = jnlpFile.getResources().getMainJAR(); Assert.assertTrue("main jar must be returned", result.getLocation().getFile().endsWith("test3.jar")); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/PaxHeaders.7406/JNLPProxySelectorTest.j0000644000000000000000000000013213441742745030402 xustar0030 mtime=1552401893.065832769 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPProxySelectorTest.java0000644000175000002070000003341313441742745031706 0ustar00jvanekmock00000000000000/* JNLPProxySelectorTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.fail; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.Proxy.Type; import java.net.URI; import java.net.URISyntaxException; import java.net.UnknownHostException; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.config.DeploymentConfiguration; import org.junit.Ignore; import org.junit.Test; public class JNLPProxySelectorTest { private static final Proxy BROWSER_PROXY = new Proxy(Type.SOCKS, InetSocketAddress.createUnresolved("foo", 0xF00)); class TestProxySelector extends JNLPProxySelector { public TestProxySelector(DeploymentConfiguration config) { super(config); } @Override protected List getFromBrowser(URI uri) { return Arrays.asList(BROWSER_PROXY); } } @Test public void testNoProxy() throws URISyntaxException { DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_NONE)); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("http://example.org/")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } @Test public void testProxyBypassLocal() throws URISyntaxException, UnknownHostException { final String LOCALHOST = InetAddress.getLocalHost().getHostName(); DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_MANUAL)); config.setProperty(DeploymentConfiguration.KEY_PROXY_BYPASS_LOCAL, String.valueOf(true)); List result; JNLPProxySelector selector = new TestProxySelector(config); result = selector.select(new URI("http://127.0.0.1/")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); result = selector.select(new URI("http://" + LOCALHOST + "/")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); result = selector.select(new URI("socket://127.0.0.1/")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); result = selector.select(new URI("socket://" + LOCALHOST + "/")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } // TODO implement this @Ignore("Implement this") @Test public void testLocalProxyBypassListIsIgnoredForNonLocal() { fail(); } @Test public void testProxyBypassList() throws URISyntaxException { DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_MANUAL)); config.setProperty(DeploymentConfiguration.KEY_PROXY_BYPASS_LIST, "example.org"); JNLPProxySelector selector = new TestProxySelector(config); List result; result = selector.select(new URI("http://example.org/")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); result = selector.select(new URI("socket://example.org/")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } @Test public void testManualHttpProxy() throws URISyntaxException { String HTTP_HOST = "example.org"; int HTTP_PORT = 42; DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_MANUAL)); config.setProperty(DeploymentConfiguration.KEY_PROXY_HTTP_HOST, HTTP_HOST); config.setProperty(DeploymentConfiguration.KEY_PROXY_HTTP_PORT, String.valueOf(HTTP_PORT)); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("http://example.org/")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.HTTP, new InetSocketAddress(HTTP_HOST, HTTP_PORT)), result.get(0)); } @Test public void testManualHttpsProxy() throws URISyntaxException { String HTTPS_HOST = "example.org"; int HTTPS_PORT = 42; DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_MANUAL)); config.setProperty(DeploymentConfiguration.KEY_PROXY_HTTPS_HOST, HTTPS_HOST); config.setProperty(DeploymentConfiguration.KEY_PROXY_HTTPS_PORT, String.valueOf(HTTPS_PORT)); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("https://example.org/")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.HTTP, new InetSocketAddress(HTTPS_HOST, HTTPS_PORT)), result.get(0)); } @Test public void testManualFtpProxy() throws URISyntaxException { String FTP_HOST = "example.org"; int FTP_PORT = 42; DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_MANUAL)); config.setProperty(DeploymentConfiguration.KEY_PROXY_FTP_HOST, FTP_HOST); config.setProperty(DeploymentConfiguration.KEY_PROXY_FTP_PORT, String.valueOf(FTP_PORT)); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("ftp://example.org/")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.HTTP, new InetSocketAddress(FTP_HOST, FTP_PORT)), result.get(0)); } @Test public void testManualSocksProxy() throws URISyntaxException { String SOCKS_HOST = "example.org"; int SOCKS_PORT = 42; DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_MANUAL)); config.setProperty(DeploymentConfiguration.KEY_PROXY_SOCKS4_HOST, SOCKS_HOST); config.setProperty(DeploymentConfiguration.KEY_PROXY_SOCKS4_PORT, String.valueOf(SOCKS_PORT)); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("socket://example.org/")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.SOCKS, new InetSocketAddress(SOCKS_HOST, SOCKS_PORT)), result.get(0)); } @Test public void testHttpFallsBackToManualSocksProxy() throws URISyntaxException { String SOCKS_HOST = "example.org"; int SOCKS_PORT = 42; DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_MANUAL)); config.setProperty(DeploymentConfiguration.KEY_PROXY_SOCKS4_HOST, SOCKS_HOST); config.setProperty(DeploymentConfiguration.KEY_PROXY_SOCKS4_PORT, String.valueOf(SOCKS_PORT)); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("http://example.org/")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.SOCKS, new InetSocketAddress(SOCKS_HOST, SOCKS_PORT)), result.get(0)); } @Test public void testManualUnknownProtocolProxy() throws URISyntaxException { DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_MANUAL)); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("gopher://example.org/")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } @Test public void testManualSameProxy() throws URISyntaxException { final String HTTP_HOST = "example.org"; final int HTTP_PORT = 42; DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_MANUAL)); config.setProperty(DeploymentConfiguration.KEY_PROXY_HTTP_HOST, HTTP_HOST); config.setProperty(DeploymentConfiguration.KEY_PROXY_HTTP_PORT, String.valueOf(HTTP_PORT)); config.setProperty(DeploymentConfiguration.KEY_PROXY_SAME, String.valueOf(true)); JNLPProxySelector selector = new TestProxySelector(config); List result; result = selector.select(new URI("http://example.org/")); assertEquals(1, result.size()); assertEquals(new Proxy(Type.HTTP, new InetSocketAddress(HTTP_HOST, HTTP_PORT)), result.get(0)); } @Test public void testBrowserProxy() throws URISyntaxException { DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_BROWSER)); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("http://example.org/")); assertEquals(1, result.size()); assertSame(BROWSER_PROXY, result.get(0)); } @Test public void testMissingProxyAutoConfigUrl() throws URISyntaxException { DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_AUTO)); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("http://example.org/")); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } // TODO @Ignore("Need to find a way to inject a custom proxy autoconfig file first") @Test public void testProxyAutoConfig() throws URISyntaxException { DeploymentConfiguration config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_AUTO)); config.setProperty(DeploymentConfiguration.KEY_PROXY_AUTO_CONFIG_URL, "foobar"); JNLPProxySelector selector = new TestProxySelector(config); List result = selector.select(new URI("http://example.org/")); assertEquals(1, result.size()); } // TODO this JNLPProxySelect#getProxiesFromPacResult should be moved into a different class // TODO this test should be split into different methods @Test public void testConvertingProxyAutoConfigResultToProxyObject() { List result; result = JNLPProxySelector.getProxiesFromPacResult("foo bar baz; what is this; dunno"); assertEquals(0, result.size()); result = JNLPProxySelector.getProxiesFromPacResult("DIRECT"); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); result = JNLPProxySelector.getProxiesFromPacResult("PROXY foo:42"); assertEquals(1, result.size()); assertEquals(new Proxy(Type.HTTP, new InetSocketAddress("foo", 42)), result.get(0)); result = JNLPProxySelector.getProxiesFromPacResult("PROXY foo:bar"); assertEquals(0, result.size()); result = JNLPProxySelector.getProxiesFromPacResult("PROXY foo"); assertEquals(0, result.size()); result = JNLPProxySelector.getProxiesFromPacResult("SOCKS foo:42"); assertEquals(1, result.size()); assertEquals(new Proxy(Type.SOCKS, new InetSocketAddress("foo", 42)), result.get(0)); result = JNLPProxySelector.getProxiesFromPacResult("SOCKS foo:bar"); assertEquals(0, result.size()); result = JNLPProxySelector.getProxiesFromPacResult("SOCKS foo"); assertEquals(0, result.size()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/jarsInJreDesc.jnlp0000644000000000000000000000013213441742745025751 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/jarsInJreDesc.jnlp0000644000175000002070000000643313441742745026567 0ustar00jvanekmock00000000000000 OmegaT OmegaT development team icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/cache0000644000000000000000000000013213441742745023364 xustar0030 mtime=1552401893.095832706 30 atime=1552410887.112183445 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/0000755000175000002070000000000013441742745024251 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/PaxHeaders.7406/ResourceUrlCreatorTest.ja0000644000000000000000000000013213441742745030407 xustar0030 mtime=1552401893.095832706 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java0000644000175000002070000001654313441742745031557 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.cache; import static org.junit.Assert.assertEquals; import java.net.MalformedURLException; import java.net.URL; import net.sourceforge.jnlp.DownloadOptions; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.Test; public class ResourceUrlCreatorTest extends NoStdOutErrTest{ private static final Version VERSION_11 = new Version("1.1"); private static final Version VERSION_20 = new Version("2.0"); private static final Version VERSION_TWO = new Version("version two"); private static final DownloadOptions DLOPTS_NOPACK_USEVERSION = new DownloadOptions(false, true); private static final DownloadOptions DLOPTS_NOPACK_NOVERSION = new DownloadOptions(false, false); private URL getResultUrl(String url, Version version, boolean usePack /*use pack.gz suffix*/, boolean useVersion /*use version suffix*/) throws MalformedURLException { Resource resource = Resource.getResource(new URL(url), version, null); return ResourceUrlCreator.getUrl(resource, usePack, useVersion); } private URL getResultUrl(String url, Version version, DownloadOptions downloadOptions) throws MalformedURLException { Resource resource = Resource.getResource(new URL(url), version, null); ResourceUrlCreator ruc = new ResourceUrlCreator(resource, downloadOptions); return ruc.getVersionedUrl(); } @Test public void testVersionEncode() throws MalformedURLException { URL result = getResultUrl("http://example.com/versionEncode.jar", VERSION_11, false, true); assertEquals("http://example.com/versionEncode__V1.1.jar", result.toString()); } @Test public void testVersionWithPeriods() throws MalformedURLException { URL result = getResultUrl("http://example.com/test.version.with.periods.jar", VERSION_11, false, true); // A previous bug had this as "test__V1.1.with.periods.jar" assertEquals("http://example.com/test.version.with.periods__V1.1.jar", result.toString()); } @Test public void testPackEncode() throws MalformedURLException { URL result = getResultUrl("http://example.com/packEncode.jar", VERSION_11, true, false); assertEquals("http://example.com/packEncode.jar.pack.gz", result.toString()); } @Test public void testVersionAndPackEncode() throws MalformedURLException { URL result = getResultUrl("http://example.com/versionAndPackEncode.jar", VERSION_11, true, true); assertEquals("http://example.com/versionAndPackEncode__V1.1.jar.pack.gz", result.toString()); } @Test public void testGetVersionedUrl() throws MalformedURLException { URL result = getResultUrl("http://example.com/versionedUrl.jar", VERSION_11, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com/versionedUrl.jar?version-id=1.1", result.toString()); } @Test public void testGetNonVersionIdUrl() throws MalformedURLException { URL result = getResultUrl("http://example.com/nonVersionIdUrl.jar", VERSION_TWO, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com/nonVersionIdUrl.jar", result.toString()); } @Test public void testGetVersionedUrlWithQuery() throws MalformedURLException { URL result = getResultUrl("http://example.com/versionedUrlWithQuery.jar?i=1234abcd", VERSION_11, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com/versionedUrlWithQuery.jar?i=1234abcd&version-id=1.1", result.toString()); } @Test public void testGetVersionedUrlWithoutVersion() throws MalformedURLException { URL result = getResultUrl("http://example.com/versionedUrlWithoutVersion.jar", null, DLOPTS_NOPACK_NOVERSION); assertEquals("http://example.com/versionedUrlWithoutVersion.jar", result.toString()); } @Test public void testGetVersionedUrlWithoutVersionWithQuery() throws MalformedURLException { URL result = getResultUrl("http://example.com/versionedUrlWithoutVersionWithQuery.jar?i=1234abcd", null, DLOPTS_NOPACK_NOVERSION); assertEquals("http://example.com/versionedUrlWithoutVersionWithQuery.jar?i=1234abcd", result.toString()); } @Test public void testGetVersionedUrlWithLongQuery() throws MalformedURLException { URL result = getResultUrl("http://example.com/versionedUrlWithLongQuery.jar?i=1234&j=abcd", VERSION_20, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com/versionedUrlWithLongQuery.jar?i=1234&j=abcd&version-id=2.0", result.toString()); } @Test public void testPercentEncoded() throws MalformedURLException { URL result = getResultUrl("http://example.com/percent encoded.jar", null, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com/percent encoded.jar", result.toString()); } @Test public void testPercentEncodedOnlyOnce() throws MalformedURLException { URL result = getResultUrl("http://example.com/percent%20encoded%20once.jar", null, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com/percent%20encoded%20once.jar", result.toString()); } @Test public void testPartiallyEncodedUrl() throws MalformedURLException { URL result = getResultUrl("http://example.com/partially encoded%20url.jar", null, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com/partially encoded%20url.jar", result.toString()); } @Test public void testVersionedEncodedUrl() throws MalformedURLException { URL result = getResultUrl("http://example.com/versioned%20encoded.jar", VERSION_11, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com/versioned%20encoded.jar?version-id=1.1", result.toString()); } @Test public void testInvalidVersionedUrl() throws MalformedURLException { URL result = getResultUrl("http://example.com/invalid versioned url.jar", VERSION_11, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com/invalid versioned url.jar?version-id=1.1", result.toString()); } @Test public void testLongComplexUrl() throws MalformedURLException { String URL = "https://example.com/,DSID=64c19c5b657df383835706571a7c7216,DanaInfo=example.com,CT=java+JICAComponents/complexOne.jar"; URL result = getResultUrl(URL, null, DLOPTS_NOPACK_USEVERSION); assertEquals(URL, result.toString()); } @Test public void testLongComplexVersionedUrl() throws MalformedURLException { String URL = "https://example.com/,DSID=64c19c5b657df383835706571a7c7216,DanaInfo=example.com,CT=java+JICAComponents/complexTwo.jar"; URL result = getResultUrl(URL, VERSION_11, DLOPTS_NOPACK_USEVERSION); assertEquals(URL + "?version-id=" + VERSION_11, result.toString()); } @Test public void testUserInfoAndVersioning() throws MalformedURLException { URL result = getResultUrl("http://foo:bar@example.com/userInfoAndVersion.jar", VERSION_11, DLOPTS_NOPACK_USEVERSION); assertEquals("http://foo:bar@example.com/userInfoAndVersion.jar?version-id=1.1", result.toString()); } @Test public void testPortAndVersioning() throws MalformedURLException { URL result = getResultUrl("http://example.com:1234/portAndVersioning.jar", VERSION_11, DLOPTS_NOPACK_USEVERSION); assertEquals("http://example.com:1234/portAndVersioning.jar?version-id=1.1", result.toString()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/PaxHeaders.7406/ResourceTest.java0000644000000000000000000000013213441742745026733 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTest.java0000644000175000002070000002142713441742745027551 0ustar00jvanekmock00000000000000/* ResourceTest.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import static net.sourceforge.jnlp.cache.Resource.Status.PRECONNECT; import static net.sourceforge.jnlp.cache.Resource.Status.CONNECTED; import static net.sourceforge.jnlp.cache.Resource.Status.CONNECTING; import static net.sourceforge.jnlp.cache.Resource.Status.PREDOWNLOAD; import static net.sourceforge.jnlp.cache.Resource.Status.DOWNLOADED; import static net.sourceforge.jnlp.cache.Resource.Status.DOWNLOADING; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; import java.util.EnumSet; import java.util.Set; import net.sourceforge.jnlp.Version; import org.junit.Test; public class ResourceTest { public static final long INCREMENT_TRANSFERRED_CONSTANT = 10; @Test public void testGetLocation() throws Exception { String testName = "GetLocation"; Resource res = createResource(testName); URL location = res.getLocation(); URL sameUrl = new URL("http://example.com/applet" + testName + ".jar"); assertEquals("Locations should match each other", sameUrl, location); } @Test public void testGetRequestVersion() throws Exception { String testName = "GetRequestVersion"; Resource res = createResource(testName); Version dummyVersion = new Version("1.0"); Version getVersion = res.getRequestVersion(); assertTrue("Versions should match each other.", dummyVersion.matches(getVersion)); } @Test public void testGetDownloadVersion() throws Exception { String testName = "GetDownloadVersion"; Resource res = createResource(testName); Version dummyVersion = new Version("1.0"); res.setDownloadVersion(dummyVersion); Version getVersion = res.getDownloadVersion(); assertTrue("Set version should match other.", getVersion.matches(dummyVersion)); } @Test public void testTransferredIsZero() throws Exception { String testName = "TransferredIsZero"; Resource res = createResource(testName); assertEquals(0, res.getTransferred()); } @Test public void testIncrementTransferred() throws Exception { String testName = "IncrementTransferred"; Resource res = createResource(testName); long original = res.getTransferred(); res.incrementTransferred(INCREMENT_TRANSFERRED_CONSTANT); assertEquals(original + INCREMENT_TRANSFERRED_CONSTANT, res.getTransferred()); } @Test public void testSizeIsNegativeOne() throws Exception { String testName = "SizeIsNegativeOne"; Resource res = createResource(testName); assertEquals(-1, res.getSize()); } @Test public void testSetSize() throws Exception { String testName = "SetSize"; Resource res = createResource(testName); long original = res.getSize(); res.setSize(original + 10); assertEquals(original + 10,res.getSize()); } @Test public void testStatusIsCopied() throws Exception { String testName = "testStatus"; Resource res = createResource(testName); Set original = res.getCopyOfStatus(); assertTrue("Original should be emtpy", original.isEmpty()); original.add(DOWNLOADING); Set dummy = res.getCopyOfStatus(); assertFalse(dummy.equals(original)); assertFalse(dummy.contains(DOWNLOADING)); } @Test public void testNewResourceIsUninitialized() throws Exception { Resource res = createResource("NewResource"); assertTrue("Resource should not have had any status flags set", isUninitialized(res)); } @Test public void testSetFlag() throws Exception { Resource res = createResource("SetFlag"); setStatus(res, EnumSet.of(PRECONNECT)); assertFalse("Resource should have been initialized", isUninitialized(res)); assertTrue("Resource should have had PRECONNECT set", hasFlag(res, PRECONNECT)); assertTrue("Resource should have only had PRECONNECT set", hasOnly(res, EnumSet.of(PRECONNECT))); } @Test public void testSetMultipleFlags() throws Exception { Resource res = createResource("SetFlags"); setStatus(res, EnumSet.of(PRECONNECT, PREDOWNLOAD)); assertFalse("Resource should have been initialized", isUninitialized(res)); assertTrue("Resource should have had PRECONNECT set", hasFlag(res, PRECONNECT)); assertTrue("Resource should have had PREDOWNLOAD set", hasFlag(res, PREDOWNLOAD)); assertTrue("Resource should have only had PRECONNECT and PREDOWNLOAD set", hasOnly(res, EnumSet.of(PRECONNECT, PREDOWNLOAD))); } @Test public void testChangeStatus() throws Exception { Resource res = createResource("ChangeStatus"); setStatus(res, EnumSet.of(PRECONNECT)); assertTrue("Resource should have had PRECONNECT set", hasFlag(res, PRECONNECT)); assertTrue("Resource should have only had PRECONNECT set", hasOnly(res, EnumSet.of(PRECONNECT))); Collection downloadFlags = EnumSet.of(PREDOWNLOAD, DOWNLOADING, DOWNLOADED); Collection connectFlags = EnumSet.of(PRECONNECT, CONNECTING, CONNECTED); changeStatus(res, connectFlags, downloadFlags); assertTrue("Resource should have had PREDOWNLOAD set", hasFlag(res, PREDOWNLOAD)); assertTrue("Resource should have had DOWNLOADING set", hasFlag(res, DOWNLOADING)); assertTrue("Resource should have had DOWNLOADED set", hasFlag(res, DOWNLOADED)); assertTrue("Resource should have only had PREDOWNLOAD{,ING,ED} flags set", hasOnly(res, downloadFlags)); assertFalse("Resource should not have had PRECONNECT set", hasFlag(res, PRECONNECT)); } private static Resource createResource(String testName) throws MalformedURLException { URL dummyUrl = new URL("http://example.com/applet" + testName + ".jar"); return Resource.getResource(dummyUrl, new Version("1.0"), UpdatePolicy.ALWAYS); } private static void setStatus(Resource resource, Collection flags) { resource.setStatusFlags(flags); } private static void changeStatus(Resource resource, Collection clear, Collection add) { resource.changeStatus(clear, add); } private static boolean hasOnly(Resource resource, Collection flags) { for (final Resource.Status flag : flags) { // ensure all the specified flags are set if (!resource.isSet(flag)) { return false; } } for (final Resource.Status flag : Resource.Status.values()) { // ensure all other flags are unset if (resource.isSet(flag) && !flags.contains(flag)) { return false; } } return true; } private static boolean hasFlag(Resource resource, Resource.Status flag) { return resource.isSet(flag); } private static boolean isUninitialized(Resource resource) { return !resource.isInitialized(); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/PaxHeaders.7406/CacheLRUWrapperTest.java0000644000000000000000000000013213441742745030073 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java0000644000175000002070000002422213441742745030705 0ustar00jvanekmock00000000000000/* CacheLRUWrapperTest.java Copyright (C) 2012 Thomas Meyer This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.concurrent.CountDownLatch; import org.junit.Before; import org.junit.Test; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.config.InfrastructureFileDescriptor; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.util.CacheTestUtils; public class CacheLRUWrapperTest { // does no DeploymentConfiguration exist for this file name? private static final String cacheIndexFileName = PathsAndFiles.CACHE_INDEX_FILE_NAME + "_testing"; private static final File javaTmp = new File(System.getProperty("java.io.tmpdir")); private static final File tmpCache; private static final File tmpIndexFile; static { try { tmpCache = File.createTempFile("itw", "CacheLRUWrapperTest", javaTmp); tmpCache.delete(); tmpCache.mkdir(); tmpCache.deleteOnExit(); if (!tmpCache.isDirectory()) { throw new IOException("Unsuccess to create tmpfile, remove it and createsame directory"); } tmpIndexFile = new File(tmpCache, cacheIndexFileName); } catch (IOException ex) { throw new RuntimeException(ex); } } private static class DummyInfrastructureFileDescriptor extends InfrastructureFileDescriptor{ private final File backend; private DummyInfrastructureFileDescriptor(File backend) { super(); this.backend=backend; } @Override public File getFile() { return backend; } @Override public String getFullPath() { return backend.getAbsolutePath(); } } private static final CacheLRUWrapper clw = new CacheLRUWrapper( new DummyInfrastructureFileDescriptor(tmpIndexFile), new DummyInfrastructureFileDescriptor(tmpCache)); private final int noEntriesCacheFile = 1000; private ByteArrayOutputStream baos; private PrintStream out; @Before public void setup() { baos = new ByteArrayOutputStream(); out = new PrintStream(baos); } @Test public void testLoadStoreTiming() throws InterruptedException { final File cacheIndexFile = clw.getRecentlyUsedFile().getFile(); cacheIndexFile.delete(); try { int noLoops = 1000; long time[] = new long[noLoops]; clw.lock(); clearCacheIndexFile(); fillCacheIndexFile(noEntriesCacheFile); clw.store(); // FIXME: wait a second, because of file modification timestamp only provides accuracy on seconds. Thread.sleep(1000); long sum = 0; for(int i=0; i < noLoops - 1; i++) { time[i]= System.nanoTime(); clw.load(); time[i+1]= System.nanoTime(); if(i==0) continue; sum = sum + time[i] - time[i-1]; } double avg = sum / time.length; ServerAccess.logErrorReprint("Average = " + avg + "ns"); // wait more than 100 microseconds for noLoops = 1000 and noEntries=1000 is bad assertTrue("load() must not take longer than 100 ТЕs, but took in avg " + avg/1000 + "ТЕs", avg < 100 * 1000); } finally { clw.unlock(); cacheIndexFile.delete(); } } private void fillCacheIndexFile(int noEntries) { // fill cache index file for(int i = 0; i < noEntries; i++) { String path = clw.getRecentlyUsedFile().getFullPath() + File.separatorChar + i + File.separatorChar + "test" + i + ".jar"; String key = clw.generateKey(path); clw.addEntry(key, path); } } @Test public void testModTimestampAfterStore() throws InterruptedException { final File cacheIndexFile = clw.getRecentlyUsedFile().getFile(); cacheIndexFile.delete(); try{ clw.lock(); // 1. clear cache entries + store clw.addEntry("aa", "bb"); clw.store(); long lmBefore = cacheIndexFile.lastModified(); Thread.sleep(1010); clearCacheIndexFile(); long lmAfter = cacheIndexFile.lastModified(); assertTrue("modification timestamp hasn't changed! Before = " + lmBefore + " After = " + lmAfter, lmBefore < lmAfter); // FIXME: wait a second, because of file modification timestamp only provides accuracy on seconds. Thread.sleep(1010); // 2. load cache file lmBefore = cacheIndexFile.lastModified(); clw.load(); lmAfter = cacheIndexFile.lastModified(); assertTrue("modification timestamp has changed!", lmBefore == lmAfter); // 3. add some cache entries and store lmBefore = cacheIndexFile.lastModified(); fillCacheIndexFile(noEntriesCacheFile); clw.store(); lmAfter = cacheIndexFile.lastModified(); assertTrue("modification timestamp hasn't changed! Before = " + lmBefore + " After = " + lmAfter, lmBefore < lmAfter); } finally { cacheIndexFile.delete(); clw.unlock(); } } private void clearCacheIndexFile() { clw.lock(); try { // clear cache + store file clw.clearLRUSortedEntries(); clw.store(); } finally { clw.unlock(); } } @Test public void testAddEntry() { String key = "key"; String value = "value"; clw.addEntry(key, value); assertTrue(clw.containsKey(key) && clw.containsValue(value)); } @Test public void testRemoveEntry() { String key = "key"; String value = "value"; clw.addEntry(key, value); clw.removeEntry(key); assertFalse(clw.containsKey(key) && clw.containsValue(value)); } @Test(timeout = 2000l) public void testLock() throws IOException { try { clw.lock(); assertTrue(clw.getRecentlyUsedPropertiesFile().isHeldByCurrentThread()); } finally { clw.unlock(); } } @Test(timeout = 2000l) public void testUnlock() throws IOException { try { clw.lock(); } finally { clw.unlock(); } assertTrue(!clw.getRecentlyUsedPropertiesFile().isHeldByCurrentThread()); } @Test(timeout = 2000l) public void testStoreFailsWithoutLock() throws IOException { assertTrue(!clw.store()); } @Test(timeout = 2000l) public void testStoreWorksWithLocK() throws IOException { try { clw.lock(); assertTrue(clw.store()); } finally { clw.unlock(); } } @Test(timeout = 2000l) public void testMultithreadLockPreventsStore() throws IOException, InterruptedException { int numThreads = 100; CountDownLatch doneSignal = new CountDownLatch(numThreads); Thread[] list = new Thread[numThreads]; for (int i = 0; i < numThreads; i++) { list[i] = new Thread(new StoreWorker(doneSignal)); } for (int i = 0; i < numThreads; i++) { list[i].start(); } //Wait for all children to finish for (int i = 0; i < numThreads; i++) { list[i].join(); } String out = baos.toString(); assertTrue(CacheTestUtils.stringContainsOnlySingleInstance(out, "true") && out.contains("false")); } private class StoreWorker implements Runnable { private final CountDownLatch doneSignal; public StoreWorker(CountDownLatch doneSignal) { this.doneSignal = doneSignal; } @Override public void run() { try { clw.getRecentlyUsedPropertiesFile().tryLock(); boolean result = clw.store(); synchronized (out) { out.println(String.valueOf(result)); out.flush(); } //Let parent know outputting is done doneSignal.countDown(); //Wait until able to continue to clw.unlock() doneSignal.await(); } catch (Exception e) { e.printStackTrace(); } finally { clw.unlock(); } } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/PaxHeaders.7406/NativeLibraryStorageTest.0000644000000000000000000000013213441742745030402 xustar0030 mtime=1552401893.065832769 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/NativeLibraryStorageTest.java0000644000175000002070000001577713441742745032075 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import static net.sourceforge.jnlp.util.FileTestUtils.assertNoFileLeak; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.util.FileTestUtils; import org.junit.Test; public class NativeLibraryStorageTest { /************************************************************************** * Test helpers * **************************************************************************/ /* Associates an extension with whether it represents a native library */ static class FileExtension { public FileExtension(String extension, boolean isNative) { this.extension = extension; this.isNative = isNative; } final String extension; final boolean isNative; } static private List makeExtensionsToTest() { List exts = new ArrayList(); exts.add(new FileExtension(".foobar", false)); /* Dummy non-native test extension */ for (String ext : NativeLibraryStorage.NATIVE_LIBRARY_EXTENSIONS) { exts.add(new FileExtension(ext, true)); } return exts; } /* All the native library types we support, as well as one negative test */ static final List extensionsToTest = makeExtensionsToTest(); /* Creates a NativeLibraryStorage object, caching the given URLs */ static NativeLibraryStorage nativeLibraryStorageWithCache(URL... urlsToCache) { ResourceTracker tracker = new ResourceTracker(); for (URL urlToCache : urlsToCache) { tracker.addResource(urlToCache, new Version("1.0"), null, UpdatePolicy.ALWAYS); } return new NativeLibraryStorage(tracker); } /************************************************************************** * Test cases * **************************************************************************/ /* Tests searching for native libraries in jars */ @Test public void testJarFileSearch() throws Exception { /* Create a temporary directory to create jars in */ File tempDirectory = FileTestUtils.createTempDirectory(); for (FileExtension ext : extensionsToTest) { /* Create empty file to search for */ String testFileName = "foobar" + ext.extension; File testFile = new File(tempDirectory, testFileName); FileTestUtils.createFileWithContents(testFile, ""); /* Create jar to search in */ File jarLocation = new File(tempDirectory, "test.jar"); FileTestUtils.createJarWithContents(jarLocation, testFile); final URL tempJarUrl = jarLocation.toURI().toURL(); final NativeLibraryStorage storage = nativeLibraryStorageWithCache(tempJarUrl); assertNoFileLeak( new Runnable () { @Override public void run() { storage.addSearchJar(tempJarUrl); } }); /* This check isn't critical, but ensures we do not accidentally add jars as search directories */ assertFalse(storage.getSearchDirectories().contains(tempJarUrl)); /* If the file we added is native, it should be found * Due to an implementation detail, non-native files will not be found */ boolean testFileWasFound = storage.findLibrary(testFileName) != null; assertEquals(ext.isNative, testFileWasFound); } } /* Tests searching for native libraries in directories */ @Test public void testDirectorySearch() throws Exception { /* Create a temporary directory to search in */ File tempDirectory = FileTestUtils.createTempDirectory(); for (FileExtension ext : extensionsToTest) { /* Create empty file in the directory */ String testFileName = "foobar" + ext.extension; FileTestUtils.createFileWithContents(new File(tempDirectory, testFileName), ""); /* Add the directory to the search list */ NativeLibraryStorage storage = nativeLibraryStorageWithCache(/* None needed */); storage.addSearchDirectory(tempDirectory); /* Ensure directory is in our search list */ assertTrue(storage.getSearchDirectories().contains(tempDirectory)); /* The file should be found, regardless if it was native */ boolean testFileWasFound = storage.findLibrary(testFileName) != null; assertTrue(testFileWasFound); } } @Test public void testCleanupTemporaryFolder() throws Exception { NativeLibraryStorage storage = nativeLibraryStorageWithCache(/* None needed */); storage.ensureNativeStoreDirectory(); /* The temporary native store directory should be our only search folder */ assertTrue(storage.getSearchDirectories().size() == 1); File searchDirectory = storage.getSearchDirectories().get(0); assertTrue(searchDirectory.exists()); /* Test that it has been deleted */ storage.cleanupTemporaryFolder(); assertFalse(searchDirectory.exists()); } }icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/PaxHeaders.7406/CacheUtilTest.java0000644000000000000000000000013213441742745027005 xustar0030 mtime=1552401893.066832766 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/CacheUtilTest.java0000644000175000002070000001502213441742745027615 0ustar00jvanekmock00000000000000/* CacheUtilTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import java.io.File; import java.net.URL; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.util.UrlUtils; import org.junit.Assert; import org.junit.Test; public class CacheUtilTest { @Test public void testNormalizeUrlComparsions() throws Exception { URL[] u = ResourceTrackerTest.getUrls(); URL[] n = ResourceTrackerTest.getNormalizedUrls(); for (int i = 0; i < u.length; i++) { Assert.assertTrue("url " + i + " must CacheUtil.urlEquals to its normalized form " + i, UrlUtils.urlEquals(u[i], n[i])); Assert.assertTrue("normalized form " + i + " must CacheUtil.urlEquals to its original " + i, UrlUtils.urlEquals(n[i], u[i])); } } @Test public void testUrlToPath() throws Exception { final URL u = new URL("https://example.com/applet/some:weird*applet?.jar"); //stuf behind querry is kept final File expected = new File("/tmp/https/example.com/applet/some_weird_applet..jar"); Assert.assertEquals(expected, CacheUtil.urlToPath(u, "/tmp")); } @Test @Bug(id = "1190") public void testUrlToPathWithPort() throws Exception { final URL u = new URL("https://example.com:5050/applet/some:weird*applet?.jar"); //stuf behind querry is kept final File expected = new File("/tmp/https/example.com/5050/applet/some_weird_applet..jar"); Assert.assertEquals(expected, CacheUtil.urlToPath(u, "/tmp")); } @Test @Bug(id = "3227") public void testUrlToPathLonger256() throws Exception { final URL u = new URL("https://example.com:5050/applet/uspto-auth.authenticate.jnlp.q_SlNFU1NJT05JRD02OUY1ODVCNkJBOTM1NThCQjdBMTA5RkQyNDZEQjEwRi5wcm9kX3RwdG9tY2F0MjE1X2p2bTsgRW50cnVzdFRydWVQYXNzUmVkaXJlY3RVcmw9Imh0dHBzOi8vZWZzLnVzcHRvLmdvdi9FRlNXZWJVSVJlZ2lzdGVyZWQvRUZTV2ViUmVnaXN0ZXJlZCI7IFRDUFJPRFBQQUlSc2Vzc2lvbj02MjIxMjk0MTguMjA0ODAuMDAwMA__.info"); final File expected = new File("/tmp/https/example.com/5050/applet/a2ac35576c36d0304c86eb9e645a251ff69dba28646e13f2e81dbb9cc96097f.info"); Assert.assertEquals(expected, CacheUtil.urlToPath(u, "/tmp")); } @Test @Bug(id = "3227") public void testUrlToPathLonger256NoSuffix() throws Exception { final URL u = new URL("https://example.com:5050/applet/uspto-auth.authenticate.jnlp.q_SlNFU1NJT05JRD02OUY1ODVCNkJBOTM1NThCQjdBMTA5RkQyNDZEQjEwRi5wcm9kX3RwdG9tY2F0MjE1X2p2bTsgRW50cnVzdFRydWVQYXNzUmVkaXJlY3RVcmw9Imh0dHBzOi8vZWZzLnVzcHRvLmdvdi9FRlNXZWJVSVJlZ2lzdGVyZWQvRUZTV2ViUmVnaXN0ZXJlZCI7IFRDUFJPRFBQQUlSc2Vzc2lvbj02MjIxMjk0MTguMjA0ODAuMDAwMA"); final File expected = new File("/tmp/https/example.com/5050/applet/e4f3cf11f86f5aa33f424bc3efe3df7a9d20837a6f1a5bbbc60c1f57f3780a4"); Assert.assertEquals(expected, CacheUtil.urlToPath(u, "/tmp")); } @Test public void testUrlToPathWithQuery() throws Exception { final URL u = new URL("https://example.com/applet/applet.php?id=applet5"); //querry is kept and sanitized final File expected = new File("/tmp/https/example.com/applet/applet.php.id_applet5"); Assert.assertEquals(expected, CacheUtil.urlToPath(u, "/tmp")); } @Test public void testUrlToPathWithoutQuery() throws Exception { final URL u = new URL("https://example.com/applet/applet.php"); //no doubledot is caused by patch adding query to file final File expected = new File("/tmp/https/example.com/applet/applet.php"); Assert.assertEquals(expected, CacheUtil.urlToPath(u, "/tmp")); } @Test public void CacheID(){ CacheUtil.CacheId cj11 = new CacheUtil.CacheJnlpId("a"); CacheUtil.CacheId cj12 = new CacheUtil.CacheJnlpId("a"); CacheUtil.CacheId cj2 = new CacheUtil.CacheJnlpId("b"); CacheUtil.CacheId cj31 = new CacheUtil.CacheJnlpId(null); CacheUtil.CacheId cj32 = new CacheUtil.CacheJnlpId(null); CacheUtil.CacheId cd11 = new CacheUtil.CacheDomainId("a"); CacheUtil.CacheId cd12 = new CacheUtil.CacheDomainId("a"); CacheUtil.CacheId cd2 = new CacheUtil.CacheDomainId("b"); CacheUtil.CacheId cd31 = new CacheUtil.CacheDomainId(null); CacheUtil.CacheId cd32 = new CacheUtil.CacheDomainId(null); Assert.assertEquals(cj11, cj11); Assert.assertEquals(cj11, cj12); Assert.assertEquals(cd11, cd11); Assert.assertEquals(cd11, cd12); Assert.assertEquals(cj31, cj31); Assert.assertEquals(cj31, cj32); Assert.assertEquals(cd31, cd31); Assert.assertEquals(cd31, cd32); Assert.assertNotEquals(cj11, cj2); Assert.assertNotEquals(cj11, cj31); Assert.assertNotEquals(cd11, cd2); Assert.assertNotEquals(cd11, cd31); Assert.assertNotEquals(cj11, cd11); Assert.assertNotEquals(cj2, cd2); Assert.assertNotEquals(cj31, cd31); Assert.assertNotEquals(cj32, cd32); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/PaxHeaders.7406/CacheEntryTest.java0000644000000000000000000000013213441742745027171 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.256253438 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/CacheEntryTest.java0000644000175000002070000003045113441742745030004 0ustar00jvanekmock00000000000000/* CacheEntryTest -- unit test for CacheEntry Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.net.MalformedURLException; import java.net.URL; import java.nio.file.Files; import java.util.concurrent.CountDownLatch; import org.junit.Before; import org.junit.Test; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.util.CacheTestUtils; import net.sourceforge.jnlp.util.PropertiesFile; public class CacheEntryTest { /** A custom subclass that allows supplying num predefined cache file */ static class TestCacheEntry extends CacheEntry { private File cacheFile; public TestCacheEntry(URL location, Version version, File cacheFile) { super(location, version); this.cacheFile = cacheFile; } @Override protected File getCacheFile() { return cacheFile; } @Override protected PropertiesFile readCacheEntryInfo() { try { return new PropertiesFile(createFile("")); } catch (IOException e) { throw new AssertionError(e); } } } private URL url; private Version version; private ByteArrayOutputStream baos; private PrintStream out; @Before public void setUp() throws MalformedURLException { url = new URL("http://example.com/example.jar"); version = new Version("1.0"); baos = new ByteArrayOutputStream(); out = new PrintStream(baos); } @Test public void verifyLocationIsSame() { CacheEntry entry = new TestCacheEntry(url, version, null); assertEquals(url, entry.getLocation()); } @Test public void verifyLastModifiedIsSetCorrectly() { long LAST_MODIFIED = 1000; CacheEntry entry = new TestCacheEntry(url, version, null); entry.setLastModified(LAST_MODIFIED); assertEquals(LAST_MODIFIED, entry.getLastModified()); } @Test public void verifyLastUpdatedIsSetCorrectly() { long LAST_UPDATED = 1000; CacheEntry entry = new TestCacheEntry(url, version, null); entry.setLastUpdated(LAST_UPDATED); assertEquals(LAST_UPDATED, entry.getLastUpdated()); } @Test public void verifyContentLengthIsSetCorrectly() { long CONTENT_LENGTH = 1000; CacheEntry entry = new TestCacheEntry(url, version, null); entry.setRemoteContentLength(CONTENT_LENGTH); assertEquals(CONTENT_LENGTH, entry.getRemoteContentLength()); } @Test public void verifyOriginalContentLengthIsSetCorrectly() { long ORIGINAL_CONTENT_LENGTH = 1000; CacheEntry entry = new TestCacheEntry(url, version, null); entry.setOriginalContentLength(ORIGINAL_CONTENT_LENGTH); assertEquals(ORIGINAL_CONTENT_LENGTH, entry.getOriginalContentLength()); } @Test public void verifyNotCachedIfFileIsAbsent() { File doesNotExist = new File("/foo/bar/baz/spam/eggs"); CacheEntry entry = new TestCacheEntry(url, version, doesNotExist); assertFalse(entry.isCached()); } @Test public void verifyNotCachedIfContentLengthsDiffer() throws IOException { File cachedFile = createFile("Foo"); CacheEntry entry = new TestCacheEntry(url, version, cachedFile); entry.setRemoteContentLength(10000); assertFalse(entry.isCached()); } @Test public void verifyCachedIfContentLengthsAreSame() throws IOException { String contents = "Foo"; File cachedFile = createFile(contents); CacheEntry entry = new TestCacheEntry(url, version, cachedFile); entry.setRemoteContentLength(contents.length()); assertTrue(entry.isCached()); } @Test public void verifyCachedIfOriginalContentLengthsAreSame() throws IOException { String contents = "FooDECOMPRESSED"; long compressedLength = 5; File cachedFile = createFile(contents); CacheEntry entry = new TestCacheEntry(url, version, cachedFile); entry.setRemoteContentLength(compressedLength); entry.setOriginalContentLength(compressedLength); assertTrue(entry.isCached()); } @Test public void verifyCurrentWhenCacheEntryHasSameTimeStamp() throws IOException { long lastModified = 10; String contents = "Foo"; File cachedFile = createFile(contents); CacheEntry entry = new TestCacheEntry(url, version, cachedFile); entry.setRemoteContentLength(contents.length()); entry.setLastModified(lastModified); assertTrue(entry.isCurrent(lastModified)); } @Test public void verifyNotCurrentWhenRemoteContentIsNewer() throws IOException { long oldTimeStamp = 10; long newTimeStamp = 100; String contents = "Foo"; File cachedFile = createFile(contents); CacheEntry entry = new TestCacheEntry(url, version, cachedFile); entry.setRemoteContentLength(contents.length()); entry.setLastModified(oldTimeStamp); assertFalse(entry.isCurrent(newTimeStamp)); } private static File createFile(String contents) throws IOException { File cachedFile = File.createTempFile("CacheEntryTest", null); Files.write(cachedFile.toPath(), contents.getBytes()); cachedFile.deleteOnExit(); return cachedFile; } @Test(timeout = 2000l) public void testLock() throws IOException { TestCacheEntry entry = new TestCacheEntry(url, version, null); try { entry.lock(); assertTrue(entry.isHeldByCurrentThread()); } finally { entry.unlock(); } } @Test(timeout = 2000l) public void testUnlock() throws IOException { TestCacheEntry entry = new TestCacheEntry(url, version, null); try { entry.lock(); } finally { entry.unlock(); } assertTrue(!entry.isHeldByCurrentThread()); } @Test(timeout = 2000l) public void testStoreFailsWithoutLock() throws IOException { TestCacheEntry entry = new TestCacheEntry(url, version, null); long num = 10; entry.setLastModified(num); assertTrue(!entry.store()); } @Test(timeout = 2000l) public void testStoreWorksWithLocK() throws IOException { TestCacheEntry entry = new TestCacheEntry(url, version, null); long num = 10; entry.setLastModified(num); try { entry.lock(); assertTrue(entry.store()); } finally { entry.unlock(); } } @Test(timeout = 2000l) public void testMultithreadLockPreventsWrite() throws IOException, InterruptedException { int numThreads = 100; CountDownLatch doneSignal = new CountDownLatch(numThreads); CountDownLatch writersDoneSignal = new CountDownLatch(numThreads); TestCacheEntry entry = new TestCacheEntry(url, version, null); Thread[] list = new Thread[numThreads]; for (int i=0; i resources = Arrays.asList(resource); Resource result = ResourceTracker.selectByStatus(resources, DOWNLOADING, ERROR); Assert.assertEquals(resource, result); } @Test public void testSelectByStatusNoMatchingResource() throws Exception { Resource resource = createResource("noMatchingResource"); Assert.assertNotNull(resource); List resources = Arrays.asList(resource); Resource result = ResourceTracker.selectByStatus(resources, DOWNLOADING, ERROR); Assert.assertNull(result); } @Test public void testSelectByStatusExcludedResources() throws Exception { Resource resource = createResource("excludedResources"); Assert.assertNotNull(resource); resource.setStatusFlag(ERROR); List resources = Arrays.asList(resource); Resource result = ResourceTracker.selectByStatus(resources, DOWNLOADING, ERROR); Assert.assertNull(result); } @Test public void testSelectByStatusMixedResources() throws Exception { Resource r1 = createResource("mixedResources1"); Assert.assertNotNull(r1); r1.setStatusFlag(CONNECTED); r1.setStatusFlag(DOWNLOADING); Resource r2 = createResource("mixedResources2"); Assert.assertNotNull(r2); r2.setStatusFlag(CONNECTED); r2.setStatusFlag(DOWNLOADING); r2.setStatusFlag(ERROR); List resources = Arrays.asList(r1, r2); Resource result = ResourceTracker.selectByStatus(resources, EnumSet.of(CONNECTED, DOWNLOADING), EnumSet.of(ERROR)); Assert.assertEquals(r1, result); } @Test public void testSelectByFilterUninitialized() throws Exception { Resource resource = createResource("filterUninitialized"); Assert.assertNotNull(resource); List resources = Arrays.asList(resource); Resource result = ResourceTracker.selectByFilter(resources, new ResourceTracker.Filter() { @Override public boolean test(Resource t) { return !t.isInitialized(); } }); Assert.assertEquals(resource, result); } @Test public void testNormalizeUrl() throws Exception { URL[] u = getUrls(); URL[] n = getNormalizedUrls(); Assert.assertNull("first url should be null", u[0]); Assert.assertNull("first normalized url should be null", n[0]); for (int i = 1; i < CHANGE_BORDER; i++) { Assert.assertTrue("url " + i + " must be equals too normalized url " + i, u[i].equals(n[i])); } for (int i = CHANGE_BORDER; i < n.length; i++) { Assert.assertFalse("url " + i + " must be normalized (and so not equals) too normalized url " + i, u[i].equals(n[i])); } } public static final int CHANGE_BORDER = 8; public static URL[] getUrls() throws MalformedURLException { URL[] u = { /*constant*/ null, new URL("file:///home/jvanek/Desktop/icedtea-web/tests.build/jnlp_test_server/Spaces%20can%20be%20everywhere2.jnlp"), new URL("http://localhost:44321/SpacesCanBeEverywhere1.jnlp"), new URL("http:///SpacesCanBeEverywhere1.jnlp"), new URL("file://localhost/home/jvanek/Desktop/icedtea-web/tests.build/jnlp_test_server/Spaces can be everywhere2.jnlp"), new URL("http://localhost:44321/testpage.jnlp?applicationID=25"), new URL("http://localhost:44321/Spaces%20Can%20Be%20Everyw%2Fhere1.jnlp"), new URL("http://localhost/Spaces+Can+Be+Everywhere1.jnlp"), /*changing*/ new URL("http://localhost/SpacesC anBeEverywhere1.jnlp?a=5&b=10#df"), new URL("http:///oook.jnlp?a=5&b=ahoj ХЁХЁ dd#df"), new URL("http://localhost/SpacesФ›ФХЁХОХЁХ™УНХОФХ™УК can !@^*(){}[].jnlp?a=5&ahoj ХЁХЁ dd#df"), new URL("http://localhost:44321/SpaХ cesCan Be Everywhere1.jnlp"), new URL("http:/SpacesCanB eEverywhere1.jnlp")}; return u; } public static URL[] getNormalizedUrls() throws MalformedURLException, UnsupportedEncodingException, URISyntaxException { URL[] u = getUrls(); URL[] n = new URL[u.length]; for (int i = 0; i < n.length; i++) { n[i] = UrlUtils.normalizeUrl(u[i]); } return n; } @BeforeClass //keeping silent outputs from launched jvm public static void redirectErr() throws IOException { for (int i = 0; i < backedUpStream.length; i++) { if (backedUpStream[i] == null) { switch (i) { case 0: backedUpStream[i] = System.out; break; case 1: backedUpStream[i] = System.err; break; case 2: backedUpStream[i] = OutputController.getLogger().getOut(); break; case 3: backedUpStream[i] = OutputController.getLogger().getErr(); break; } } } currentErrorStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(currentErrorStream)); System.setErr(new PrintStream(currentErrorStream)); OutputController.getLogger().setOut(new PrintStream(currentErrorStream)); OutputController.getLogger().setErr(new PrintStream(currentErrorStream)); } @AfterClass public static void redirectErrBack() throws IOException { ServerAccess.logErrorReprint(currentErrorStream.toString("utf-8")); System.setOut(backedUpStream[0]); System.setErr(backedUpStream[1]); OutputController.getLogger().setOut(backedUpStream[2]); OutputController.getLogger().setErr(backedUpStream[3]); } @BeforeClass public static void onDebug() { JNLPRuntime.setDebug(true); } @AfterClass public static void offDebug() { JNLPRuntime.setDebug(false); } private static String cacheDir; @BeforeClass public static void setupDownloadServer() throws IOException { File dir = new File(System.getProperty("java.io.tmpdir"), "itw-down"); dir.mkdirs(); dir.deleteOnExit(); redirectErr(); downloadServer = ServerAccess.getIndependentInstance(dir.getAbsolutePath(), ServerAccess.findFreePort()); redirectErrBack(); cacheDir = PathsAndFiles.CACHE_DIR.getFullPath(); PathsAndFiles.CACHE_DIR.setValue(System.getProperty("java.io.tmpdir") + File.separator + "tempcache"); } @AfterClass public static void teardownDownloadServer() { downloadServer.stop(); CacheUtil.clearCache(); PathsAndFiles.CACHE_DIR.setValue(cacheDir); } @Test public void testDownloadResource() throws IOException { String s = "hello"; File f = downloadServer.getDir(); File temp = new File(f, "resource"); temp.createNewFile(); Files.write(temp.toPath(), s.getBytes()); temp.deleteOnExit(); URL url = downloadServer.getUrl("resource"); ResourceTracker rt = new ResourceTracker(); rt.addResource(url, null, null, UpdatePolicy.FORCE); File downloadFile = rt.getCacheFile(url); assertTrue(downloadFile.exists() && downloadFile.isFile()); String output = new String(Files.readAllBytes(downloadFile.toPath())); assertEquals(s, output); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/PaxHeaders.7406/ResourceDownloaderTest.ja0000644000000000000000000000013113441742745030422 xustar0030 mtime=1552401893.064832771 29 atime=1552402157.25525344 30 ctime=1552410887.064183557 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/cache/ResourceDownloaderTest.java0000644000175000002070000004643213441742745031573 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.cache; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.file.Files; import java.util.EnumSet; import java.util.HashMap; import java.util.jar.Attributes; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.jar.Pack200; import java.util.zip.GZIPOutputStream; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import net.sourceforge.jnlp.DownloadOptions; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.JarFile; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import net.sourceforge.jnlp.util.logging.OutputController; public class ResourceDownloaderTest extends NoStdOutErrTest { public static ServerLauncher testServer; public static ServerLauncher testServerWithBrokenHead; public static ServerLauncher downloadServer; private static final PrintStream[] backedUpStream = new PrintStream[4]; private static ByteArrayOutputStream currentErrorStream; private static final String nameStub1 = "itw-server"; private static final String nameStub2 = "test-file"; private static String cacheDir; @BeforeClass //keeping silent outputs from launched jvm public static void redirectErr() throws IOException { for (int i = 0; i < backedUpStream.length; i++) { if (backedUpStream[i] == null) { switch (i) { case 0: backedUpStream[i] = System.out; break; case 1: backedUpStream[i] = System.err; break; case 2: backedUpStream[i] = OutputController.getLogger().getOut(); break; case 3: backedUpStream[i] = OutputController.getLogger().getErr(); break; } } } currentErrorStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(currentErrorStream)); System.setErr(new PrintStream(currentErrorStream)); OutputController.getLogger().setOut(new PrintStream(currentErrorStream)); OutputController.getLogger().setErr(new PrintStream(currentErrorStream)); } @AfterClass public static void redirectErrBack() throws IOException { ServerAccess.logErrorReprint(currentErrorStream.toString("utf-8")); System.setOut(backedUpStream[0]); System.setErr(backedUpStream[1]); OutputController.getLogger().setOut(backedUpStream[2]); OutputController.getLogger().setErr(backedUpStream[3]); } @BeforeClass public static void onDebug() { JNLPRuntime.setDebug(true); } @AfterClass public static void offDebug() { JNLPRuntime.setDebug(false); } @BeforeClass public static void startServer() throws Exception { redirectErr(); testServer = ServerAccess.getIndependentInstance(System.getProperty("java.io.tmpdir"), ServerAccess.findFreePort()); redirectErrBack(); } @BeforeClass public static void startServer2() throws Exception { redirectErr(); testServerWithBrokenHead = ServerAccess.getIndependentInstance(System.getProperty("java.io.tmpdir"), ServerAccess.findFreePort()); testServerWithBrokenHead.setSupportingHeadRequest(false); redirectErrBack(); } @AfterClass public static void stopServer() { testServer.stop(); } @AfterClass public static void stopServer2() { testServerWithBrokenHead.stop(); } @Test public void getUrlResponseCodeTestWorkingHeadRequest() throws Exception { redirectErr(); try { File f = File.createTempFile(nameStub1, nameStub2); int i = ResourceDownloader.getUrlResponseCode(testServer.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.HEAD); Assert.assertEquals(HttpURLConnection.HTTP_OK, i); f.delete(); i = ResourceDownloader.getUrlResponseCode(testServer.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.HEAD); Assert.assertEquals(HttpURLConnection.HTTP_NOT_FOUND, i); } finally { redirectErrBack(); } } @Test public void getUrlResponseCodeTestNotWorkingHeadRequest() throws Exception { redirectErr(); try { File f = File.createTempFile(nameStub1, nameStub2); int i = ResourceDownloader.getUrlResponseCode(testServerWithBrokenHead.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.HEAD); Assert.assertEquals(HttpURLConnection.HTTP_NOT_IMPLEMENTED, i); f.delete(); i = ResourceDownloader.getUrlResponseCode(testServerWithBrokenHead.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.HEAD); Assert.assertEquals(HttpURLConnection.HTTP_NOT_IMPLEMENTED, i); } finally { redirectErrBack(); } } @Test public void getUrlResponseCodeTestGetRequestOnNotWorkingHeadRequest() throws Exception { redirectErr(); try { File f = File.createTempFile(nameStub1, nameStub2); int i = ResourceDownloader.getUrlResponseCode(testServerWithBrokenHead.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.GET); Assert.assertEquals(HttpURLConnection.HTTP_OK, i); f.delete(); i = ResourceDownloader.getUrlResponseCode(testServerWithBrokenHead.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.GET); Assert.assertEquals(HttpURLConnection.HTTP_NOT_FOUND, i); } finally { redirectErrBack(); } } @Test public void getUrlResponseCodeTestGetRequest() throws Exception { redirectErr(); try { File f = File.createTempFile(nameStub1, nameStub2); int i = ResourceDownloader.getUrlResponseCode(testServer.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.GET); Assert.assertEquals(HttpURLConnection.HTTP_OK, i); f.delete(); i = ResourceDownloader.getUrlResponseCode(testServer.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.GET); Assert.assertEquals(HttpURLConnection.HTTP_NOT_FOUND, i); } finally { redirectErrBack(); } } @Test public void getUrlResponseCodeTestWrongRequest() throws Exception { redirectErr(); try { File f = File.createTempFile(nameStub1, nameStub2); Exception exception = null; try { ResourceDownloader.getUrlResponseCode(testServer.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.TESTING_UNDEF); } catch (Exception ex) { exception = ex; } Assert.assertNotNull(exception); exception = null; f.delete(); try { ResourceDownloader.getUrlResponseCode(testServer.getUrl(f.getName()), new HashMap(), ResourceTracker.RequestMethods.TESTING_UNDEF); } catch (Exception ex) { exception = ex; } Assert.assertNotNull(exception);; } finally { redirectErrBack(); } } @Test public void findBestUrltest() throws Exception { redirectErr(); try { File fileForServerWithHeader = File.createTempFile(nameStub1, nameStub2); File versionedFileForServerWithHeader = new File(fileForServerWithHeader.getParentFile(), fileForServerWithHeader.getName() + "-2.0"); versionedFileForServerWithHeader.createNewFile(); File fileForServerWithoutHeader = File.createTempFile(nameStub1, nameStub2); File versionedFileForServerWithoutHeader = new File(fileForServerWithoutHeader.getParentFile(), fileForServerWithoutHeader.getName() + "-2.0"); versionedFileForServerWithoutHeader.createNewFile(); ResourceDownloader resourceDownloader = new ResourceDownloader(null, null); Resource r1 = Resource.getResource(testServer.getUrl(fileForServerWithHeader.getName()), null, UpdatePolicy.NEVER); Resource r2 = Resource.getResource(testServerWithBrokenHead.getUrl(fileForServerWithoutHeader.getName()), null, UpdatePolicy.NEVER); Resource r3 = Resource.getResource(testServer.getUrl(versionedFileForServerWithHeader.getName()), new Version("1.0"), UpdatePolicy.NEVER); Resource r4 = Resource.getResource(testServerWithBrokenHead.getUrl(versionedFileForServerWithoutHeader.getName()), new Version("1.0"), UpdatePolicy.NEVER); assertOnServerWithHeader(resourceDownloader.findBestUrl(r1).getURL()); assertVersionedOneOnServerWithHeader(resourceDownloader.findBestUrl(r3).URL); assertOnServerWithoutHeader(resourceDownloader.findBestUrl(r2).URL); assertVersionedOneOnServerWithoutHeader(resourceDownloader.findBestUrl(r4).URL); fileForServerWithHeader.delete(); Assert.assertNull(resourceDownloader.findBestUrl(r1)); assertVersionedOneOnServerWithHeader(resourceDownloader.findBestUrl(r3).URL); assertOnServerWithoutHeader(resourceDownloader.findBestUrl(r2).URL); assertVersionedOneOnServerWithoutHeader(resourceDownloader.findBestUrl(r4).URL); versionedFileForServerWithHeader.delete(); Assert.assertNull(resourceDownloader.findBestUrl(r1)); Assert.assertNull(resourceDownloader.findBestUrl(r3)); assertOnServerWithoutHeader(resourceDownloader.findBestUrl(r2).URL); assertVersionedOneOnServerWithoutHeader(resourceDownloader.findBestUrl(r4).URL); versionedFileForServerWithoutHeader.delete(); Assert.assertNull(resourceDownloader.findBestUrl(r1)); Assert.assertNull(resourceDownloader.findBestUrl(r3)); assertOnServerWithoutHeader(resourceDownloader.findBestUrl(r2).URL); Assert.assertNull(resourceDownloader.findBestUrl(r4)); fileForServerWithoutHeader.delete(); Assert.assertNull(resourceDownloader.findBestUrl(r1)); Assert.assertNull(resourceDownloader.findBestUrl(r3)); Assert.assertNull(resourceDownloader.findBestUrl(r2)); Assert.assertNull(resourceDownloader.findBestUrl(r4)); } finally { redirectErrBack(); } } private void assertOnServerWithoutHeader(URL u) { assertCommonComponentsOfUrl(u); assertPort(u, testServerWithBrokenHead.getPort()); } private void assertVersionedOneOnServerWithoutHeader(URL u) { assertCommonComponentsOfUrl(u); assertPort(u, testServerWithBrokenHead.getPort()); assertVersion(u); } private void assertOnServerWithHeader(URL u) { assertCommonComponentsOfUrl(u); assertPort(u, testServer.getPort()); } private void assertVersionedOneOnServerWithHeader(URL u) { assertCommonComponentsOfUrl(u); assertPort(u, testServer.getPort()); assertVersion(u); } private void assertCommonComponentsOfUrl(URL u) { Assert.assertTrue(u.getProtocol().equals("http")); Assert.assertTrue(u.getHost().equals("localhost")); Assert.assertTrue(u.getPath().contains(nameStub1)); Assert.assertTrue(u.getPath().contains(nameStub2)); ServerAccess.logOutputReprint(u.toExternalForm()); } private void assertPort(URL u, int port) { Assert.assertTrue(u.getPort() == port); } private void assertVersion(URL u) { Assert.assertTrue(u.getPath().contains("-2.0")); Assert.assertTrue(u.getQuery().contains("version-id=1.0")); } @BeforeClass public static void setupCache() throws IOException { File dir = new File(System.getProperty("java.io.tmpdir"), "itw-down"); dir.mkdirs(); dir.deleteOnExit(); redirectErr(); downloadServer = ServerAccess.getIndependentInstance(dir.getAbsolutePath(), ServerAccess.findFreePort()); redirectErrBack(); cacheDir = PathsAndFiles.CACHE_DIR.getFullPath(); PathsAndFiles.CACHE_DIR.setValue(System.getProperty("java.io.tmpdir") + File.separator + "tempcache"); } @AfterClass public static void teardownCache() { downloadServer.stop(); CacheUtil.clearCache(); PathsAndFiles.CACHE_DIR.setValue(cacheDir); } private File setupFile(String fileName, String text) throws IOException { File downloadDir = downloadServer.getDir(); File file = new File(downloadDir, fileName); file.createNewFile(); Files.write(file.toPath(), text.getBytes()); file.deleteOnExit(); return file; } private Resource setupResource(String fileName, String text) throws IOException { File f = setupFile(fileName, text); URL url = downloadServer.getUrl(fileName); Resource resource = Resource.getResource(url, null, UpdatePolicy.NEVER); return resource; } @Test public void testDownloadResource() throws IOException { String expected = "testDownloadResource"; Resource resource = setupResource("download-resource", expected); ResourceDownloader resourceDownloader = new ResourceDownloader(resource, new Object()); resource.setStatusFlag(Resource.Status.PRECONNECT); resourceDownloader.run(); File downloadedFile = resource.getLocalFile(); assertTrue(downloadedFile.exists() && downloadedFile.isFile()); String output = new String(Files.readAllBytes(downloadedFile.toPath())); assertEquals(expected, output); } @Test public void testDownloadPackGzResource() throws IOException { String expected = "1.2"; setupPackGzFile("download-packgz", expected); Resource resource = Resource.getResource(downloadServer.getUrl("download-packgz.jar"), null, UpdatePolicy.NEVER); ResourceDownloader resourceDownloader = new ResourceDownloader(resource, new Object()); resource.setStatusFlag(Resource.Status.PRECONNECT); resource.setDownloadOptions(new DownloadOptions(true, false)); resourceDownloader.run(); File downloadedFile = resource.getLocalFile(); assertTrue(downloadedFile.exists() && downloadedFile.isFile()); JarFile jf = new JarFile(downloadedFile); Manifest m = jf.getManifest(); String actual = (String) m.getMainAttributes().get(Attributes.Name.MANIFEST_VERSION); assertEquals(expected, actual); } @Test public void testDownloadVersionedResource() throws IOException { String expected = "testVersionedResource"; setupFile("download-version__V1.0.jar", expected); URL url = downloadServer.getUrl("download-version.jar"); Resource resource = Resource.getResource(url, new Version("1.0"), UpdatePolicy.NEVER); ResourceDownloader resourceDownloader = new ResourceDownloader(resource, new Object()); resource.setStatusFlag(Resource.Status.PRECONNECT); resource.setDownloadOptions(new DownloadOptions(false, true)); resourceDownloader.run(); File downloadedFile = resource.getLocalFile(); assertTrue(downloadedFile.exists() && downloadedFile.isFile()); String output = new String(Files.readAllBytes(downloadedFile.toPath())); assertEquals(expected, output); } @Test public void testDownloadVersionedPackGzResource() throws IOException { String expected = "1.2"; setupPackGzFile("download-packgz__V1.0", expected); Resource resource = Resource.getResource(downloadServer.getUrl("download-packgz.jar"), new Version("1.0"), UpdatePolicy.NEVER); ResourceDownloader resourceDownloader = new ResourceDownloader(resource, new Object()); resource.setStatusFlag(Resource.Status.PRECONNECT); resource.setDownloadOptions(new DownloadOptions(true, true)); resourceDownloader.run(); File downloadedFile = resource.getLocalFile(); assertTrue(downloadedFile.exists() && downloadedFile.isFile()); JarFile jf = new JarFile(downloadedFile); Manifest m = jf.getManifest(); String actual = (String) m.getMainAttributes().get(Attributes.Name.MANIFEST_VERSION); assertEquals(expected, actual); } @Test public void testDownloadLocalResourceFails() throws IOException { String expected = "local-resource"; File localFile = Files.createTempFile("download-local", ".temp").toFile(); localFile.createNewFile(); Files.write(localFile.toPath(), expected.getBytes()); localFile.deleteOnExit(); String stringURL = "file://" + localFile.getAbsolutePath(); URL url = new URL(stringURL); Resource resource = Resource.getResource(url, null, UpdatePolicy.NEVER); ResourceDownloader resourceDownloader = new ResourceDownloader(resource, new Object()); resource.setStatusFlag(Resource.Status.PRECONNECT); resourceDownloader.run(); assertTrue(resource.hasFlags(EnumSet.of(Resource.Status.ERROR))); } @Test public void testDownloadNotExistingResourceFails() throws IOException { Resource resource = Resource.getResource(new URL(downloadServer.getUrl() + "/notexistingfile"), null, UpdatePolicy.NEVER); ResourceDownloader resourceDownloader = new ResourceDownloader(resource, new Object()); resource.setStatusFlag(Resource.Status.PRECONNECT); resourceDownloader.run(); assertTrue(resource.hasFlags(EnumSet.of(Resource.Status.ERROR))); } private void setupPackGzFile(String fileName, String version) throws IOException { File downloadDir = downloadServer.getDir(); File orig = new File(downloadDir, fileName + ".jar"); orig.deleteOnExit(); Manifest manifest = new Manifest(); manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, version); JarOutputStream target = new JarOutputStream(new FileOutputStream(orig), manifest); target.close(); File pack = new File(downloadDir, fileName + ".jar.pack"); pack.deleteOnExit(); JarFile jarFile = new JarFile(orig.getAbsolutePath()); FileOutputStream fos = new FileOutputStream(pack); Pack200.Packer p = Pack200.newPacker(); p.pack(jarFile, fos); fos.close(); File packgz = new File(downloadDir, fileName + ".jar.pack.gz"); packgz.deleteOnExit(); FileOutputStream gzfos = new FileOutputStream(packgz); GZIPOutputStream gos = new GZIPOutputStream(gzfos); gos.write(Files.readAllBytes(pack.toPath())); gos.finish(); gos.close(); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/awt0000644000000000000000000000013113441742745023113 xustar0030 mtime=1552401893.061832777 30 atime=1552410887.112183445 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/awt/0000755000175000002070000000000013441742745024001 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/awt/PaxHeaders.7406/imagesearch0000644000000000000000000000013113441742745025363 xustar0030 mtime=1552401893.061832777 30 atime=1552410887.112183445 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/awt/imagesearch/0000755000175000002070000000000013441742745026251 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/awt/imagesearch/PaxHeaders.7406/ComponentFinder0000644000000000000000000000013013441742745030454 xustar0030 mtime=1552401893.061832777 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/awt/imagesearch/ComponentFinderTest.java0000644000175000002070000000412413441742745033047 0ustar00jvanekmock00000000000000/* ComponentFinderTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.awt.imagesearch; import java.awt.image.BufferedImage; import org.junit.Assert; import org.junit.Test; /** * * This class is a part of AWTFramework, contains component finding * by searching for icons. * */ public class ComponentFinderTest { @Test public void initialiseDefaultIcon() { BufferedImage icon = ComponentFinder.defaultIcon; Assert.assertNotNull("The default icon marker.png was not initialized.", icon); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/application0000644000000000000000000000013113441742745024623 xustar0030 mtime=1552401893.093832711 30 atime=1552410887.112183445 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/0000755000175000002070000000000013441742745025511 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/PaxHeaders.7406/application3.jnlp0000644000000000000000000000013013441742745030152 xustar0030 mtime=1552401893.093832711 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/application3.jnlp0000644000175000002070000000075613441742745030774 0ustar00jvanekmock00000000000000 Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/PaxHeaders.7406/application1.jnlp0000644000000000000000000000013013441742745030150 xustar0030 mtime=1552401893.060832779 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/application1.jnlp0000644000175000002070000000053313441742745030763 0ustar00jvanekmock00000000000000 Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/PaxHeaders.7406/application5.jnlp0000644000000000000000000000013013441742745030154 xustar0030 mtime=1552401893.062832775 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/application5.jnlp0000644000175000002070000000053713441742745030773 0ustar00jvanekmock00000000000000 Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/PaxHeaders.7406/application7.jnlp0000644000000000000000000000013013441742745030156 xustar0030 mtime=1552401893.064832771 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/application7.jnlp0000644000175000002070000000042513441742745030771 0ustar00jvanekmock00000000000000 Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/PaxHeaders.7406/application6.jnlp0000644000000000000000000000013013441742745030155 xustar0030 mtime=1552401893.066832766 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/application6.jnlp0000644000175000002070000000061413441742745030770 0ustar00jvanekmock00000000000000 Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/PaxHeaders.7406/application4.jnlp0000644000000000000000000000012713441742745030161 xustar0029 mtime=1552401893.07483275 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/application4.jnlp0000644000175000002070000000051113441742745030762 0ustar00jvanekmock00000000000000 Sample Test * icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/PaxHeaders.7406/application2.jnlp0000644000000000000000000000012713441742745030157 xustar0029 mtime=1552401893.06983276 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/application2.jnlp0000644000175000002070000000053313441742745030764 0ustar00jvanekmock00000000000000 RedHat Sample Test icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/PaxHeaders.7406/application8.jnlp0000644000000000000000000000013013441742745030157 xustar0030 mtime=1552401893.063832773 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/application8.jnlp0000644000175000002070000000071613441742745030775 0ustar00jvanekmock00000000000000 Sample RedHat This is a sample to test a bug icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/PaxHeaders.7406/application0.jnlp0000644000000000000000000000013013441742745030147 xustar0030 mtime=1552401893.063832773 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/application/application0.jnlp0000644000175000002070000000073313441742745030764 0ustar00jvanekmock00000000000000 random tag test ]]> Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/ParserSettingsTest.java0000644000000000000000000000013013441742745027054 xustar0030 mtime=1552401893.060832779 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/ParserSettingsTest.java0000644000175000002070000000747313441742745027701 0ustar00jvanekmock00000000000000/* ParserSettingsTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import net.sourceforge.jnlp.util.optionparser.OptionParser; import org.junit.Assert; import org.junit.Test; import net.sourceforge.jnlp.ParserSettings; public class ParserSettingsTest { @Test public void testDefaultSettings() { Assert.assertNotNull("Default parser settings should not be null", ParserSettings.getGlobalParserSettings()); } @Test public void testSetGlobalParserSettings() { ParserSettings globalSettings, settings; settings = new ParserSettings(false, false, false); ParserSettings.setGlobalParserSettings(settings); globalSettings = ParserSettings.getGlobalParserSettings(); Assert.assertEquals(settings.isStrict(), globalSettings.isStrict()); Assert.assertEquals(settings.isMalformedXmlAllowed(), globalSettings.isMalformedXmlAllowed()); Assert.assertEquals(settings.isExtensionAllowed(), globalSettings.isExtensionAllowed()); } @Test public void testSetGlobalParserSettingsFromOptionParser() { String args[] = {"-xml", "-strict"}; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); ParserSettings settings = ParserSettings.setGlobalParserSettingsFromOptionParser(optionParser); ParserSettings globalSettings = ParserSettings.getGlobalParserSettings(); Assert.assertEquals(settings.isStrict(), globalSettings.isStrict()); Assert.assertEquals(settings.isExtensionAllowed(), globalSettings.isExtensionAllowed()); Assert.assertEquals(settings.isMalformedXmlAllowed(), globalSettings.isMalformedXmlAllowed()); } @Test public void testSetGlobalParserSettingsFromOptionParserHasSameOptionsAsOptionParser() { String args[] = {"-xml", "-strict"}; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getJavaWsOptions()); ParserSettings settings = ParserSettings.setGlobalParserSettingsFromOptionParser(optionParser); Assert.assertEquals(settings.isStrict(), optionParser.hasOption(OptionsDefinitions.OPTIONS.STRICT)); Assert.assertEquals(settings.isMalformedXmlAllowed(), !optionParser.hasOption(OptionsDefinitions.OPTIONS.XML)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/JNLPFileTest.java0000644000000000000000000000013013441742745025442 xustar0030 mtime=1552401893.059832781 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java0000644000175000002070000004541313441742745026263 0ustar00jvanekmock00000000000000/* JNLPFileTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; import java.util.Map; import net.sourceforge.jnlp.JNLPFile.Match; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.mock.MockJNLPFile; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.Assert; import org.junit.Test; public class JNLPFileTest extends NoStdOutErrTest{ Locale jvmLocale = new Locale("en", "CA", "utf8"); MockJNLPFile file = new MockJNLPFile(jvmLocale); @Test public void testCompareAll() { Locale[] correctAvailable = { new Locale("en", "CA", "utf8") }; Assert.assertTrue("Entire locale should match but did not.", file.localeMatches(jvmLocale, correctAvailable, Match.LANG_COUNTRY_VARIANT)); Locale[] mismatchedAvailable = { new Locale("en", "CA", "utf16") }; Assert.assertFalse("Should not match variant but did.", file.localeMatches(jvmLocale, mismatchedAvailable, Match.LANG_COUNTRY_VARIANT)); } @Test public void testLangAndCountry() { Locale[] correctAvailable = { new Locale("en", "CA") }; Assert.assertTrue("Should match language and country, ignoring variant but did not.", file.localeMatches(jvmLocale, correctAvailable, Match.LANG_COUNTRY)); Locale[] mismatchedAvailable = { new Locale("en", "EN") }; Assert.assertFalse("Should not match country but did.", file.localeMatches(jvmLocale, mismatchedAvailable, Match.LANG_COUNTRY)); Locale[] extraMismatched = { new Locale("en", "CA", "utf16") }; Assert.assertFalse("Should not match because of extra variant but did.", file.localeMatches(jvmLocale, extraMismatched, Match.LANG_COUNTRY)); } @Test public void testLangOnly() { Locale[] correctAvailable = { new Locale("en") }; Assert.assertTrue("Should match only language but did not.", file.localeMatches(jvmLocale, correctAvailable, Match.LANG)); Locale[] mismatchedAvailable = { new Locale("fr", "CA", "utf8") }; Assert.assertFalse("Should not match language but did.", file.localeMatches(jvmLocale, mismatchedAvailable, Match.LANG)); Locale[] extraMismatched = { new Locale("en", "EN") }; Assert.assertFalse("Should not match because of extra country but did.", file.localeMatches(jvmLocale, extraMismatched, Match.LANG)); } @Test public void testNoLocalAvailable() { Assert.assertTrue("Null locales should match but did not.", file.localeMatches(jvmLocale, null, Match.GENERALIZED)); Locale[] emptyAvailable = {}; Assert.assertTrue("Empty locales list should match but did not.", file.localeMatches(jvmLocale, emptyAvailable, Match.GENERALIZED)); Locale[] mismatchAvailable = { new Locale("fr", "FR", "utf16") }; Assert.assertFalse("Locales list should not match generalized case but did.", file.localeMatches(jvmLocale, mismatchAvailable, Match.GENERALIZED)); } @Test public void testCodebaseConstructorWithInputstreamAndCodebase() throws Exception { String jnlpContext = "\n" + "\n" + "" + "\n" + "Sample Test\n" + "RedHat\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + ""; URL codeBase = new URL("http://www.redhat.com/"); InputStream is = new ByteArrayInputStream(jnlpContext.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false,false,false)); Assert.assertEquals("http://icedtea.claspath.org/", jnlpFile.getCodeBase().toExternalForm()); Assert.assertEquals("redhat.embeddedjnlp", jnlpFile.getApplet().getMainClass()); Assert.assertEquals("Sample Test", jnlpFile.getTitle()); Assert.assertEquals(2, jnlpFile.getResources().getJARs().length); } @Test public void testPropertyRestrictions() throws MalformedURLException, ParseException { String jnlpContents = "\n" + "\n" + " \n" + " Parsing Test\n" + " IcedTea\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " " + " \n" + " \n" + " " + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + ""; URL codeBase = new URL("http://www.redhat.com/"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false,false,false)); ResourcesDesc resources; Map properties; resources = jnlpFile.getResources(Locale.getDefault(), "os0", "arch0"); properties = resources.getPropertiesMap(); Assert.assertEquals("general", properties.get("general")); Assert.assertEquals("general", properties.get("os")); Assert.assertEquals("general", properties.get("arch")); resources = jnlpFile.getResources(Locale.getDefault(), "os1", "arch0"); properties = resources.getPropertiesMap(); Assert.assertEquals("general", properties.get("general")); Assert.assertEquals("os1", properties.get("os")); Assert.assertEquals("general", properties.get("arch")); resources = jnlpFile.getResources(Locale.getDefault(), "os1", "arch1"); properties = resources.getPropertiesMap(); Assert.assertEquals("general", properties.get("general")); Assert.assertEquals("os1", properties.get("os")); Assert.assertEquals("arch1", properties.get("arch")); resources = jnlpFile.getResources(Locale.getDefault(), "os2", "arch2"); properties = resources.getPropertiesMap(); Assert.assertEquals("general", properties.get("general")); Assert.assertEquals("os2", properties.get("os")); Assert.assertEquals("arch2", properties.get("arch")); } @Bug(id={"PR1533"}) @Test public void testDownloadOptionsAppliedEverywhere() throws MalformedURLException, ParseException { String os = System.getProperty("os.name"); String arch = System.getProperty("os.arch"); String jnlpContents = "\n" + "\n" + " \n" + " Parsing Test\n" + " IcedTea\n" + " \n" + " \n" + " \n" + " " + " " + " \n" + " " + " " + " \n" + " " + " " + " \n" + " \n" + ""; URL codeBase = new URL("http://icedtea.classpath.org"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false,false,false)); DownloadOptions downloadOptions = jnlpFile.getDownloadOptions(); Assert.assertTrue(downloadOptions.useExplicitPack()); Assert.assertTrue(downloadOptions.useExplicitVersion()); } @Bug(id={"PR1533"}) @Test public void testDownloadOptionsFilteredOut() throws MalformedURLException, ParseException { String jnlpContents = "\n" + "\n" + " \n" + " Parsing Test\n" + " IcedTea\n" + " \n" + " \n" + " \n" + " " + " " + " \n" + " " + " " + " \n" + " " + " " + " \n" + " \n" + ""; URL codeBase = new URL("http://icedtea.classpath.org"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false,false,false)); DownloadOptions downloadOptions = jnlpFile.getDownloadOptions(); Assert.assertFalse(downloadOptions.useExplicitPack()); Assert.assertFalse(downloadOptions.useExplicitVersion()); } public static final String minimalJnlp = "\n" + "\n" + " \n" + " Parsing Test\n" + " IcedTea\n" + " \n" + "\n" + " \n" + "SECURITY" + ""; @Test public void testGetRequestedPermissionLevel1() throws MalformedURLException, ParseException { String jnlpContents = minimalJnlp.replace("SECURITY", ""); URL codeBase = new URL("http://icedtea.classpath.org"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false, false, false)); Assert.assertEquals(SecurityDesc.RequestedPermissionLevel.NONE, jnlpFile.getRequestedPermissionLevel()); } @Test public void testGetRequestedPermissionLevel2() throws MalformedURLException, ParseException { String jnlpContents = minimalJnlp.replace("SECURITY", "<"+SecurityDesc.RequestedPermissionLevel.ALL.toJnlpString()+"/>"); URL codeBase = new URL("http://icedtea.classpath.org"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false, false, false)); Assert.assertEquals(SecurityDesc.RequestedPermissionLevel.ALL, jnlpFile.getRequestedPermissionLevel()); } @Test public void testGetRequestedPermissionLevel3() throws MalformedURLException, ParseException { String jnlpContents = minimalJnlp.replace("SECURITY", ""); URL codeBase = new URL("http://icedtea.classpath.org"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false, false, false)); Assert.assertEquals(SecurityDesc.RequestedPermissionLevel.NONE, jnlpFile.getRequestedPermissionLevel()); } @Test public void testGetRequestedPermissionLevel4() throws MalformedURLException, ParseException { String jnlpContents = minimalJnlp.replace("SECURITY", "whatever"); URL codeBase = new URL("http://icedtea.classpath.org"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false, false, false)); Assert.assertEquals(SecurityDesc.RequestedPermissionLevel.NONE, jnlpFile.getRequestedPermissionLevel()); } @Test public void testGetRequestedPermissionLevel5() throws MalformedURLException, ParseException { String jnlpContents = minimalJnlp.replace("SECURITY", "<"+SecurityDesc.RequestedPermissionLevel.J2EE.toJnlpString()+"/>"); URL codeBase = new URL("http://icedtea.classpath.org"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false, false, false)); Assert.assertEquals(SecurityDesc.RequestedPermissionLevel.J2EE, jnlpFile.getRequestedPermissionLevel()); } @Test //unknown for jnlp public void testGetRequestedPermissionLevel6() throws MalformedURLException, ParseException { String jnlpContents = minimalJnlp.replace("SECURITY", "<" + SecurityDesc.RequestedPermissionLevel.SANDBOX.toHtmlString() + "/>"); URL codeBase = new URL("http://icedtea.classpath.org"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false, false, false)); Assert.assertEquals(SecurityDesc.RequestedPermissionLevel.NONE, jnlpFile.getRequestedPermissionLevel()); } @Test //unknown for jnlp public void testGetRequestedPermissionLevel7() throws MalformedURLException, ParseException { String jnlpContents = minimalJnlp.replace("SECURITY", "<" + SecurityDesc.RequestedPermissionLevel.DEFAULT.toHtmlString() + "/>"); URL codeBase = new URL("http://icedtea.classpath.org"); InputStream is = new ByteArrayInputStream(jnlpContents.getBytes()); JNLPFile jnlpFile = new JNLPFile(is, codeBase, new ParserSettings(false, false, false)); Assert.assertEquals(SecurityDesc.RequestedPermissionLevel.NONE, jnlpFile.getRequestedPermissionLevel()); } @Test public void splitEmptyEntryPointsReturnsTests() throws Exception { Assert.assertArrayEquals(null, JNLPFile.splitEntryPoints(" ")); Assert.assertArrayEquals(null, JNLPFile.splitEntryPoints(null)); } @Test public void ensureSingleEntryPointIsParsed() throws Exception { Assert.assertArrayEquals(new String[]{"a.b.c"}, JNLPFile.splitEntryPoints(" a.b.c ")); Assert.assertArrayEquals(new String[]{"a.b.c"}, JNLPFile.splitEntryPoints("a.b.c")); Assert.assertArrayEquals(new String[]{"a.b.c"}, JNLPFile.splitEntryPoints(" a.b.c")); Assert.assertArrayEquals(new String[]{"a.b.c"}, JNLPFile.splitEntryPoints("a.b.c ")); } @Test public void ensureMultipleEntryPointsAreParsed() throws Exception { Assert.assertArrayEquals(new String[]{"a.b.c", "cde"}, JNLPFile.splitEntryPoints(" a.b.c cde")); Assert.assertArrayEquals(new String[]{"a.b.c", "cde"}, JNLPFile.splitEntryPoints(" a.b.c cde ")); Assert.assertArrayEquals(new String[]{"a.b.c", "cde"}, JNLPFile.splitEntryPoints("a.b.c cde ")); } @Test public void WindowsWithNameAreRecognized(){ boolean r = JNLPFile.stringMatches("Windows", new String[]{"Windows 7"}); Assert.assertTrue(r); boolean rr = JNLPFile.stringMatches("Windows", new String[]{"Windows"}); Assert.assertTrue(rr); boolean rrr = JNLPFile.stringMatches("Windows 7", new String[]{"Windows"}); Assert.assertTrue(rrr); boolean rrrr = JNLPFile.stringMatches("CrapSystem", new String[]{null}); Assert.assertFalse(rrrr); boolean rrrrr = JNLPFile.stringMatches("CrapSystem", new String[]{}); Assert.assertTrue(rrrrr); boolean rrrrrr = JNLPFile.stringMatches("CrapSystem", null); Assert.assertTrue(rrrrrr); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/config0000644000000000000000000000013113441742745023565 xustar0030 mtime=1552401893.076832746 30 atime=1552410887.112183445 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/config/0000755000175000002070000000000013441742745024453 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/config/PaxHeaders.7406/DeploymentConfigurationT0000644000000000000000000000013013441742745030560 xustar0030 mtime=1552401893.063832773 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/config/DeploymentConfigurationTest.java0000644000175000002070000002466013441742745033036 0ustar00jvanekmock00000000000000/* DeploymentConfigurationTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Date; import static org.junit.Assert.assertTrue; import java.util.Properties; import javax.naming.ConfigurationException; import net.sourceforge.jnlp.PluginBridgeTest; import net.sourceforge.jnlp.ServerAccess; import net.sourceforge.jnlp.ServerLauncher; import net.sourceforge.jnlp.annotations.Remote; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.Assert; import org.junit.Test; public class DeploymentConfigurationTest extends NoStdOutErrTest { @Test public void testLoad() throws ConfigurationException { DeploymentConfiguration config = new DeploymentConfiguration(); // FIXME test this more exhaustively config.load(); assertTrue(config.getAllPropertyNames().size() > 0); } @Test public void testInstallProperties() throws ConfigurationException { DeploymentConfiguration config = new DeploymentConfiguration(); config.load(); Properties target = new Properties(); config.copyTo(target); assertTrue(!target.isEmpty()); } @Test public void testPersistedComments() throws ConfigurationException, IOException { final File f = File.createTempFile("proeprties", "withComments"); f.deleteOnExit(); FileUtils.saveFile("#commented1=val1\nproeprty2=val2\n#commented3=val3\nproeprty4=val4", f); DeploymentConfiguration dc = new DeploymentConfiguration(new InfrastructureFileDescriptor() { @Override public String getFullPath() { return f.getAbsolutePath(); } }); dc.load(); Assert.assertEquals("val2", dc.getProperty("proeprty2")); Assert.assertEquals("val4", dc.getProperty("proeprty4")); Assert.assertEquals(null, dc.getProperty("commented1")); Assert.assertEquals(null, dc.getProperty("commented3")); dc.save(); String s = FileUtils.loadFileAsString(f); Assert.assertTrue(s.contains("#" + DeploymentConfiguration.DEPLOYMENT_COMMENT)); String date = new Date().toString().substring(0, 10); //every propertiews file have header and date by default Assert.assertTrue(s.contains("#" + date)); //check day part of date... Assert.assertTrue(s.contains("#commented1")); Assert.assertTrue(s.contains("proeprty2")); Assert.assertTrue(s.contains("#commented3")); Assert.assertTrue(s.contains("proeprty4")); Assert.assertTrue(s.contains("val1")); Assert.assertTrue(s.contains("val2")); Assert.assertTrue(s.contains("val3")); Assert.assertTrue(s.contains("val4")); } @Test public void testEnsurePersistedCommentsDoNotMultiplyHeaderAndDate() throws ConfigurationException, IOException { final File f = File.createTempFile("proeprties", "withComments"); f.deleteOnExit(); FileUtils.saveFile("#commented1=val1\nproeprty2=val2\n#commented3=val3\nproeprty4=val4", f); DeploymentConfiguration dc = new DeploymentConfiguration(new InfrastructureFileDescriptor() { @Override public String getFullPath() { return f.getAbsolutePath(); } }); String s = null; for (int x = 0; x < 10; x++) { dc.load(); Assert.assertEquals("val2", dc.getProperty("proeprty2")); Assert.assertEquals("val4", dc.getProperty("proeprty4")); Assert.assertEquals(null, dc.getProperty("commented1")); Assert.assertEquals(null, dc.getProperty("commented3")); dc.save(); s = FileUtils.loadFileAsString(f); for (int y = 0; x < x; x++) { //ensure salt Assert.assertTrue(s.contains("#id" + y + "id")); } Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, DeploymentConfiguration.DEPLOYMENT_COMMENT)); String date = new Date().toString().substring(0, 10); //every propertiews file have header and date by default Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, date)); //check day part of date... Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, "#commented1")); Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, "proeprty2")); Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, "#commented3")); Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, "proeprty4")); Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, "val1")); Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, "val2")); Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, "val3")); Assert.assertEquals(1, PluginBridgeTest.countOccurences(s, "val4")); //insert some salt to check if it really iterates FileUtils.saveFile(s + "\n#id" + x + "id", f); } //System.out.println(s); } @Test public void testCheckUrlFileOk() throws ConfigurationException, IOException { File f = File.createTempFile("itw", "checkUrlTest"); f.deleteOnExit(); boolean is = DeploymentConfiguration.checkUrl(f.toURI().toURL()); Assert.assertTrue("File was supposed to exists", is); boolean is2 = DeploymentConfiguration.checkUrl(f.toURI().toURL()); Assert.assertTrue("File was supposed to exists", is2); } @Test public void testCheckUrlFileNotOk() throws ConfigurationException, IOException { File f = new File("/some/not/existing/file"); boolean is = DeploymentConfiguration.checkUrl(f.toURI().toURL()); Assert.assertFalse("File was NOT supposed to exists", is); boolean is2 = DeploymentConfiguration.checkUrl(f.toURI().toURL()); Assert.assertFalse("File was NOT supposed to exists", is2); } @Test public void testCheckUrlFileOkNotOk() throws ConfigurationException, IOException { File f = File.createTempFile("itw", "checkUrlTest"); f.deleteOnExit(); boolean is = DeploymentConfiguration.checkUrl(f.toURI().toURL()); Assert.assertTrue("File was supposed to exists", is); f.delete(); boolean is2 = DeploymentConfiguration.checkUrl(f.toURI().toURL()); Assert.assertFalse("File was NOT supposed to exists", is2); f.createNewFile(); f.deleteOnExit(); boolean is3 = DeploymentConfiguration.checkUrl(f.toURI().toURL()); Assert.assertTrue("File was supposed to exists", is3); } @Test public void testCheckUrlRemoteNotOk() throws ConfigurationException, IOException { boolean is = DeploymentConfiguration.checkUrl(new URL("http://some.not/surely/existing.file")); Assert.assertFalse("File was supposed to not exists", is); } @Test public void testCheckUrlRemoteNotOk404_1() throws ConfigurationException, IOException { ServerLauncher server = ServerAccess.getIndependentInstance(System.getProperty("java.io.tmpdir"), ServerAccess.findFreePort()); File f = File.createTempFile("itw", "checkUrlTest"); f.delete(); f.mkdir(); f.deleteOnExit(); try { URL u = new URL("http://localhost:" + server.getPort() + "/" + f.getName() + "/notexisting.file"); boolean is = DeploymentConfiguration.checkUrl(u); Assert.assertFalse("File was not supposed to exists", is); } finally { server.stop(); } } @Test @Remote public void testCheckUrlRemoteNotOk404_2() throws ConfigurationException, IOException { URL u = new URL("https://google.com/some/not/existingitw.file"); boolean is = DeploymentConfiguration.checkUrl(u); Assert.assertFalse("File was not supposed to exists", is); } @Test public void testCheckUrlRemoteOk() throws ConfigurationException, IOException { ServerLauncher server = ServerAccess.getIndependentInstance(System.getProperty("java.io.tmpdir"), ServerAccess.findFreePort()); try { File f = File.createTempFile("itw", "checkUrlTest"); f.deleteOnExit(); URL u = new URL("http://localhost:" + server.getPort() + "/" + f.getName()); boolean is = DeploymentConfiguration.checkUrl(u); Assert.assertTrue("File was supposed to exists", is); f.delete(); //404_3 boolean is2 = DeploymentConfiguration.checkUrl(u); Assert.assertFalse("File was NOT supposed to exists", is2); f.createNewFile(); f.deleteOnExit(); boolean is3 = DeploymentConfiguration.checkUrl(u); Assert.assertTrue("File was supposed to exists", is3); } finally { server.stop(); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/config/PaxHeaders.7406/DirectoryValidatorTest.j0000644000000000000000000000013013441742745030466 xustar0030 mtime=1552401893.067832765 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/config/DirectoryValidatorTest.java0000644000175000002070000002526413441742745032001 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.util.Arrays; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.Test; public class DirectoryValidatorTest extends NoStdOutErrTest{ @Test public void testMainDirTestNotExists() { DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(new File("/definitely/not/existing/file/efgrhisaes"), false, false); String s = result.getMessage(); assertTrue(s.endsWith("\n")); assertTrue(s.split("\n").length == 3); } @Test public void testMainDirTestExistsAsFile() throws IOException { File f = File.createTempFile("test", "testMainDirs"); f.deleteOnExit(); DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(f, false, false); String s = result.getMessage(); assertTrue(s.endsWith("\n")); assertTrue(s.split("\n").length == 2); } @Test public void testMainDirTestExistsAsDir() throws IOException { File f = File.createTempFile("test", "testMainDirs"); assertTrue(f.delete()); assertTrue(f.mkdir()); f.deleteOnExit(); DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(f, false, false); String s = result.getMessage(); assertTrue(s.isEmpty()); } @Test public void testMainDirTestExistsAsDirButNotWritable() throws IOException { File f = File.createTempFile("test", "testMainDirs"); assertTrue(f.delete()); assertTrue(f.mkdir()); assertTrue(f.setWritable(false)); f.deleteOnExit(); DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(f, false, false); String s = result.getMessage(); assertTrue(s.endsWith("\n")); assertTrue(s.split("\n").length == 1); assertTrue(f.setWritable(true)); } @Test public void testMainDirTestExistsAsDirButNotReadable() throws IOException { File f = File.createTempFile("test", "testMainDirs"); assertTrue(f.delete()); assertTrue(f.mkdir()); f.deleteOnExit(); assertTrue(f.setReadable(false)); DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(f, false, false); String s = result.getMessage(); assertTrue(s.endsWith("\n")); assertTrue(s.split("\n").length == 1); assertTrue(f.setReadable(true)); } @Test public void testMainDirTestNotExistsWithSubdir() { DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(new File("/definitely/not/existing/file/efgrhisaes"), false, true); String s = result.getMessage(); assertTrue(s.endsWith("\n")); assertTrue(s.split("\n").length == 3); } @Test public void testMainDirTestExistsAsFileWithSubdir() throws IOException { File f = File.createTempFile("test", "testMainDirs"); f.deleteOnExit(); DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(f, false, true); String s = result.getMessage(); assertTrue(s.endsWith("\n")); assertTrue(s.split("\n").length == 2); } @Test public void testMainDirTestExistsAsDirWithSubdir() throws IOException { File f = File.createTempFile("test", "testMainDirs"); assertTrue(f.delete()); assertTrue(f.mkdir()); f.deleteOnExit(); DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(f, false, true); String s = result.getMessage(); assertTrue(s.isEmpty()); } @Test public void testMainDirTestExistsAsDirButNotWritableWithSubdir() throws IOException { File f = File.createTempFile("test", "testMainDirs"); assertTrue(f.delete()); assertTrue(f.mkdir()); assertTrue(f.setWritable(false)); f.deleteOnExit(); DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(f, false, true); String s = result.getMessage(); assertTrue(s.endsWith("\n")); assertTrue(s.split("\n").length == 1); assertTrue(f.setWritable(true)); } @Test public void testMainDirTestExistsAsDirButNotReadableWithSubdir() throws IOException { File f = File.createTempFile("test", "testMainDirs"); assertTrue(f.delete()); assertTrue(f.mkdir()); f.deleteOnExit(); f.setReadable(false); DirectoryValidator.DirectoryCheckResult result = DirectoryValidator.testDir(f, false, true); String s = result.getMessage(); assertTrue(s.endsWith("\n")); assertTrue(s.split("\n").length == 1); } @Test public void testDirectoryCheckResult() { DirectoryValidator.DirectoryCheckResult r1 = new DirectoryValidator.DirectoryCheckResult(new File("a")); DirectoryValidator.DirectoryCheckResult r2 = new DirectoryValidator.DirectoryCheckResult(new File("b")); r1.subDir = r2; assertTrue(r1.getMessage().isEmpty()); assertTrue(r2.getMessage().isEmpty()); assertTrue(r1.getFailures() == 0); assertTrue(r2.getFailures() == 0); assertTrue(r1.getPasses() == 6); assertTrue(r2.getPasses() == 3); r1.correctPermissions = false; r2.isDir = false; assertTrue(r1.getMessage().split("\n").length == 2); assertTrue(r2.getMessage().split("\n").length == 1); assertTrue(r1.getFailures() == 2); assertTrue(r2.getFailures() == 1); assertTrue(r1.getPasses() == 4); assertTrue(r2.getPasses() == 2); r1.exists = false; r2.exists = false; assertTrue(r1.getMessage().split("\n").length == 4); assertTrue(r2.getMessage().split("\n").length == 2); assertTrue(r1.getFailures() == 4); assertTrue(r2.getFailures() == 2); assertTrue(r1.getPasses() == 2); assertTrue(r2.getPasses() == 1); r1.isDir = false; r2.correctPermissions = false; assertTrue(r1.getMessage().split("\n").length == 6); assertTrue(r2.getMessage().split("\n").length == 3); assertTrue(r1.getFailures() == 6); assertTrue(r2.getFailures() == 3); assertTrue(r1.getPasses() == 0); assertTrue(r2.getPasses() == 0); } @Test public void testDirectoryValidator() throws IOException { File f1 = File.createTempFile("test", "testMainDirs"); File f2 = File.createTempFile("test", "testMainDirs"); DirectoryValidator dv = new DirectoryValidator(Arrays.asList(f1, f2)); assertTrue(f1.delete()); assertTrue(f1.mkdir()); assertTrue(f1.setWritable(false)); f1.deleteOnExit(); assertTrue(f2.delete()); assertTrue(f2.mkdir()); assertTrue(f2.setWritable(false)); f2.deleteOnExit(); DirectoryValidator.DirectoryCheckResults results1 = dv.ensureDirs(); assertTrue(results1.results.size() == 2); assertTrue(results1.getFailures() == 2); assertTrue(results1.getPasses() == 4); String s1 = results1.getMessage(); assertTrue(s1.endsWith("\n")); assertTrue(s1.split("\n").length == 2); assertTrue(f1.setWritable(true)); DirectoryValidator.DirectoryCheckResults results2 = dv.ensureDirs(); assertTrue(results2.results.size() == 2); assertTrue(results2.getFailures() == 1); assertTrue(results2.getPasses() == 5); String s2 = results2.getMessage(); assertTrue(s2.endsWith("\n")); assertTrue(s2.split("\n").length == 1); assertTrue(f2.setWritable(true)); DirectoryValidator.DirectoryCheckResults results3 = dv.ensureDirs(); assertTrue(results3.results.size() == 2); assertTrue(results3.getFailures() == 0); assertTrue(results3.getPasses() == 6); String s3 = results3.getMessage(); assertTrue(s3.isEmpty()); assertTrue(f2.delete()); //will be created in dv.ensureDirs(); DirectoryValidator.DirectoryCheckResults results4 = dv.ensureDirs(); assertTrue(results4.results.size() == 2); assertTrue(results4.getFailures() == 0); assertTrue(results4.getPasses() == 6); String s4 = results4.getMessage(); assertTrue(s4.isEmpty()); File f3 = File.createTempFile("test", "testMainDirs", f2); File f4 = File.createTempFile("test", "testMainDirs", f2); assertTrue(f4.delete()); assertTrue(f3.delete()); assertTrue(f4.mkdir()); assertTrue(f2.setWritable(false)); //now f2 will not be recreated dv= new DirectoryValidator(Arrays.asList(f3, f4)); DirectoryValidator.DirectoryCheckResults results5 = dv.ensureDirs(); assertTrue(results5.results.size() == 2); assertTrue(results5.getFailures() == 3); assertTrue(results5.getPasses() == 3); String s5 = results5.getMessage(); assertTrue(s5.endsWith("\n")); assertTrue(s5.split("\n").length == 3); assertTrue(f2.setWritable(true)); assertTrue(f4.delete()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/config/PaxHeaders.7406/BasicValueValidatorsTest0000644000000000000000000000013013441742745030473 xustar0030 mtime=1552401893.076832746 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/config/BasicValueValidatorsTests.java0000644000175000002070000001462313441742745032416 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; import org.junit.Assert; import org.junit.Test; public class BasicValueValidatorsTests { //decomposed for testing public static boolean canBeWindows(String s) { return s.toLowerCase().contains("windows"); } /** * guess the OS of user, if legal, or windows * @return */ public static boolean isOsWindows() { return canBeWindows(System.getProperty("os.name")); } private static final BasicValueValidators.FilePathValidator pv = new BasicValueValidators.FilePathValidator(); private final String neverLegal = "aaa/bb/cc"; private final String winLegal = "C:\\aaa\\bb\\cc"; private final String linuxLegal = "/aaa/bb/cc"; @Test public void testWindowsDetction() { Assert.assertTrue(canBeWindows("blah windows blah")); Assert.assertTrue(canBeWindows("blah Windows blah")); Assert.assertTrue(canBeWindows(" WINDOWS 7")); Assert.assertFalse(canBeWindows("blah windy miracle blah")); Assert.assertFalse(canBeWindows("blah wind blah")); Assert.assertTrue(canBeWindows("windows")); Assert.assertFalse(canBeWindows("linux")); Assert.assertFalse(canBeWindows("blah mac blah")); Assert.assertFalse(canBeWindows("blah solaris blah")); } @Test public void testLinuxAbsoluteFilePathValidator() { if (!isOsWindows()) { Exception ex = null; try { pv.validate(linuxLegal); } catch (Exception eex) { ex = eex; } Assert.assertTrue(ex == null); ex = null; try { pv.validate(neverLegal); } catch (Exception eex) { ex = eex; } Assert.assertTrue(ex instanceof IllegalArgumentException); ex = null; try { pv.validate(winLegal); } catch (Exception eex) { ex = eex; } Assert.assertTrue(ex instanceof IllegalArgumentException); } } @Test public void testWindowsAbsoluteFilePathValidator() { if (isOsWindows()) { Exception ex = null; try { pv.validate(winLegal); } catch (Exception eex) { ex = eex; } Assert.assertTrue(ex == null); ex = null; try { pv.validate(neverLegal); } catch (Exception eex) { ex = eex; } Assert.assertTrue(ex instanceof IllegalArgumentException); ex = null; try { pv.validate(linuxLegal); } catch (Exception eex) { ex = eex; } Assert.assertTrue(ex instanceof IllegalArgumentException); } } @Test public void testMultipleStringValueValidator() { String[] singleValues = { "SINGLE", "ONLY", "NONE" }; String[] multipleValues = { "MULTIPLE", "COMBO", "ONE", "TWO", "THREE" }; ValueValidator multipleValidator = BasicValueValidators.getMultipleStringValidator(singleValues, multipleValues); multipleValidator.validate("SINGLE"); multipleValidator.validate("ONLY"); multipleValidator.validate("NONE"); multipleValidator.validate("MULTIPLE"); multipleValidator.validate("MULTIPLE,COMBO,TWO"); multipleValidator.validate("THREE,ONE,COMBO,MULTIPLE"); } @Test(expected = IllegalArgumentException.class) public void testMultipleStringValueValidatorCantMixSingleAndComboValues() { String[] singleValues = { "SINGLE", "ONLY", "NONE" }; String[] multipleValues = { "MULTIPLE", "COMBO", "ONE", "TWO", "THREE" }; ValueValidator multipleValidator = BasicValueValidators.getMultipleStringValidator(singleValues, multipleValues); multipleValidator.validate("SINGLE,COMBO"); } @Test public void testManifestAttributeCheckValidator() { ValueValidator multipleValidator = BasicValueValidators.getManifestAttributeCheckValidator(); multipleValidator.validate("ALL"); multipleValidator.validate("PERMISSIONS"); multipleValidator.validate("NONE"); multipleValidator.validate("ALAC"); multipleValidator.validate("CODEBASE"); multipleValidator.validate("CODEBASE,ALAC,PERMISSIONS"); multipleValidator.validate("TRUSTED,ALAC,CODEBASE"); } @Test(expected = IllegalArgumentException.class) public void testManifestAttributeCheckValidatorCantMixSingleAndComboValues() { ValueValidator multipleValidator = BasicValueValidators.getManifestAttributeCheckValidator(); multipleValidator.validate("ALL,CODEBASE,NONE"); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/PropertyDescTest.java0000644000000000000000000000013013441742745026522 xustar0030 mtime=1552401893.061832777 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PropertyDescTest.java0000644000175000002070000000745313441742745027345 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import org.junit.Assert; import org.junit.Test; public class PropertyDescTest { @Test public void regularValue() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString("key=value"); Assert.assertEquals("key", p.getKey()); Assert.assertEquals("value", p.getValue()); } @Test public void correctEmptyValue() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString("key="); Assert.assertEquals("key", p.getKey()); Assert.assertEquals("", p.getValue()); } @Test public void strangeEmptyValue() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString("key= "); Assert.assertEquals("key", p.getKey()); Assert.assertEquals(" ", p.getValue()); } @Test public void emptyKey() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString("=value"); Assert.assertEquals("", p.getKey()); Assert.assertEquals("value", p.getValue()); } @Test public void strangeEmptyKey() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString(" =value"); Assert.assertEquals(" ", p.getKey()); Assert.assertEquals("value", p.getValue()); } @Test public void allEmpty() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString("="); Assert.assertEquals("", p.getKey()); Assert.assertEquals("", p.getValue()); } @Test public void allStarngeEmpty() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString(" = "); Assert.assertEquals(" ", p.getKey()); Assert.assertEquals(" ", p.getValue()); } @Test(expected = LaunchException.class) public void irregularValue() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString("key"); } @Test(expected = LaunchException.class) public void empty() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString(""); } @Test(expected = NullPointerException.class) public void nullValue() throws LaunchException{ PropertyDesc p = PropertyDesc.fromString(null); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/LaunchExceptionTest.java0000644000000000000000000000013013441742745027170 xustar0030 mtime=1552401893.061832777 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/LaunchExceptionTest.java0000644000175000002070000000546113441742745030010 0ustar00jvanekmock00000000000000/* LaunchExceptionTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import org.junit.Test; public class LaunchExceptionTest { @Test public void testPrintStackTrace() { NullPointerException cause = new NullPointerException("test"); LaunchException exception = new LaunchException(null, cause, "severe", "category", "test exception", "test description"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); exception.printStackTrace(new PrintStream(baos)); String output = baos.toString(); assertNotNull(output); assertFalse(output.trim().length() == 0); assertTrue(output.contains("LaunchException: severe: category: test exception test description")); assertTrue(output.contains("NullPointerException: test")); int causedByAt = output.indexOf("Caused by:"); assertTrue(causedByAt != -1); causedByAt = output.indexOf("Caused by:", causedByAt+1); assertTrue(causedByAt == -1); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/VersionTest.java0000644000000000000000000000013013441742745025524 xustar0030 mtime=1552401893.064832771 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/VersionTest.java0000644000175000002070000001150613441742745026341 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import org.junit.Assert; import org.junit.Test; public class VersionTest { private static boolean[] results = {true, true, false, true, false, true, false, true, false, false, false, false, true, true, true, true, true, true, false, true}; private static Version jvms[] = { new Version("1.1* 1.3*"), new Version("1.2+"),}; private static Version versions[] = { new Version("1.1"), new Version("1.1.8"), new Version("1.2"), new Version("1.3"), new Version("2.0"), new Version("1.3.1"), new Version("1.2.1"), new Version("1.3.1-beta"), new Version("1.1 1.2"), new Version("1.2 1.3"),}; @Test public void testMatches() { int i = 0; for (int j = 0; j < jvms.length; j++) { for (int v = 0; v < versions.length; v++) { i++; String debugOutput = i + " " + jvms[j].toString() + " "; if (!jvms[j].matches(versions[v])) { debugOutput += "!"; } debugOutput += "matches " + versions[v].toString(); ServerAccess.logOutputReprint(debugOutput); Assert.assertEquals(results[i - 1], jvms[j].matches(versions[v])); } } } @Test public void cornerCases() { Assert.assertTrue(new Version("1.5").matches("1.5")); Assert.assertTrue(new Version("1.5+").matches("1.5")); Assert.assertTrue(new Version("1.5+").matches("1.6")); Assert.assertFalse(new Version("1.5+").matches("1.4")); Assert.assertFalse(new Version("1.5").matches("1.4")); Assert.assertFalse(new Version("1.5").matches("1.6")); } @Test public void testMatchesMinus() { Assert.assertTrue(new Version("1.5-").matches("1.5")); //this fails, do we need to patch it? //Assert.assertTrue(new Version("1.5-").matches("1.4")); //not until somebody complains Assert.assertFalse(new Version("1.5-").matches("1.6")); } @Test public void multiplePossibilities() { Assert.assertTrue(new Version("1.4 1.5").matches("1.5")); Assert.assertFalse(new Version("1.3 1.4").matches("1.5")); } @Test public void jreVersionTestOk() { //no exception occures //head support jdk 7+, so this statements should be always true Version.JreVersion jreVersion = new Version.JreVersion("1.4 1.5+", true, true); Version.JreVersion jreVersion1 = new Version.JreVersion("1.6+", true, true); } @Test(expected = RuntimeException.class) public void jreVersionTestFails1() { //head support jdk 7+, so this statements should be always false Version.JreVersion jreVersion = new Version.JreVersion("2", true, true); } @Test(expected = RuntimeException.class) public void jreVersionTestFails2() { //head support jdk 7+, so this statements should be always false Version.JreVersion jreVersion = new Version.JreVersion("1.4", true, true); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/ParserCornerCases.java0000644000000000000000000000013013441742745026623 xustar0030 mtime=1552401893.063832773 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/ParserCornerCases.java0000644000175000002070000002630613441742745027444 0ustar00jvanekmock00000000000000/* ParserCornerCases.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.nanoxml.XMLElement; import net.sourceforge.nanoxml.XMLParseException; import org.junit.Assert; import org.junit.Test; /** Test various corner cases of the parser */ public class ParserCornerCases { private static final ParserSettings defaultParser = new ParserSettings(false, true,true); @Test public void testCdata() throws ParseException, XMLParseException, IOException { String data = " value ]]>"; XMLElement elem = new XMLElement(); elem.parseFromReader(new StringReader(data)); XMLElement target = elem; Assert.assertEquals("argument", target.getName()); Assert.assertTrue("too small", target.getContent().length() > 20); Assert.assertTrue(target.getContent().contains("xml")); Assert.assertTrue(target.getContent().contains("DOCTYPE")); Assert.assertTrue(target.getContent().contains("value")); Node node = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("argument", node.getNodeName().getName()); String contents = node.getNodeValue(); Assert.assertTrue(contents.contains("xml")); Assert.assertTrue(contents.contains("DOCTYPE")); Assert.assertTrue(contents.contains("value")); } @Test public void testCdataNested() throws ParseException, XMLParseException, IOException { String data = "\n" + "\n" + "\n" + " value ]]>" + "\n" + "1\n" + "\n" + ""; XMLElement elem = new XMLElement(); elem.parseFromReader(new StringReader(data)); XMLElement target = (elem.enumerateChildren().nextElement()).enumerateChildren().nextElement(); Assert.assertEquals("argument", target.getName()); Assert.assertTrue("too small", target.getContent().length() > 20); Assert.assertTrue(target.getContent().contains("xml")); Assert.assertTrue(target.getContent().contains("DOCTYPE")); Assert.assertTrue(target.getContent().contains("value")); Node node = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); node = node.getFirstChild().getFirstChild(); Assert.assertEquals("argument", node.getNodeName().getName()); String contents = node.getNodeValue(); Assert.assertTrue(contents.contains("xml")); Assert.assertTrue(contents.contains("DOCTYPE")); Assert.assertTrue(contents.contains("value")); } @Test @KnownToFail public void testCDataFirstChild() throws XMLParseException, IOException { String xml = "\n" + "\n" + " random tag test ]]>\n" + "\n" + ""; XMLElement elem = new XMLElement(); elem.parseFromReader(new StringReader(xml)); } @Test @KnownToFail public void testCDataSecondChild() throws XMLParseException, IOException { String xml = "\n" + "\n" + "\n" + " random tag test ]]>\n" + ""; XMLElement elem = new XMLElement(); elem.parseFromReader(new StringReader(xml)); } @Test public void testUnsupportedSpecNumber() throws ParseException { String malformedJnlp = ""; Node root = Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), defaultParser); Parser parser = new Parser(null, null, root, defaultParser); Assert.assertEquals("11.11", parser.getSpecVersion().toString()); } @Test public void testApplicationAndComponent() throws ParseException { String malformedJnlp = ""; Node root = Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), defaultParser); Parser parser = new Parser(null, null, root, defaultParser); Assert.assertNotNull(parser.getLauncher(root)); } @Test public void testCommentInElements() throws ParseException { String malformedJnlp = "> "; Node root = Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), defaultParser); Parser p = new Parser(null, null, root, defaultParser); Assert.assertEquals("1.0", p.getSpecVersion().toString()); } @Test public void testNestedComments() throws ParseException { String malformedJnlp = "" + "testNestedComments" + "IcedTea" + " -->" + ""; Node root = Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), defaultParser); Parser p = new Parser(null, null, root, defaultParser); Assert.assertEquals(" -->", p.getInfo(root).get(0).getDescription()); } @Test public void testDoubleDashesInComments() throws ParseException { String malformedJnlp = "" + " \n" + " " + ""; Node root = Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), defaultParser); Parser p = new Parser(null, null, root, defaultParser); } @Test public void testCommentInElements2() throws ParseException { String malformedJnlp = " spec='1.0'> "; Node root = Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), new ParserSettings(false, true,true)); Parser p = new Parser(null, null, root, defaultParser); //defaultis used Assert.assertEquals("1.0+", p.getSpecVersion().toString()); } @Test public void testCommentInElements2_malformedOff() throws ParseException { String malformedJnlp = " spec='1.0'> "; Node root = Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), new ParserSettings(false, true,false)); Parser p = new Parser(null, null, root, defaultParser); Assert.assertEquals("1.0", p.getSpecVersion().toString()); } @Test public void testCommentInAttributes() throws ParseException { String malformedJnlp = ""; Node root = Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), new ParserSettings(false, true,true)); Parser p = new Parser(null, null, root, defaultParser); Assert.assertEquals("", p.getSpecVersion().toString()); } @Test public void testCommentInAttributes_malformedOff() throws ParseException { String malformedJnlp = ""; Node root = Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), new ParserSettings(false, true,false)); Parser p = new Parser(null, null, root, defaultParser); //defaultis used Assert.assertEquals("1.0+", p.getSpecVersion().toString()); } @Test public void testCommentInElements3_malformedOff() throws JNLPMatcherException, IOException, ParseException { //heving comment inside element declaration is invalid but internal parser can handle it try (InputStream fileStream = ClassLoader.getSystemClassLoader() .getResourceAsStream("net/sourceforge/jnlp/templates/template5.jnlp")) { Node root = Parser.getRootNode(fileStream, new ParserSettings(false, true, false)); String a = root.getChildNodes()[2].getAttribute("main-class"); Assert.assertEquals("*", a); } } @Test @KnownToFail public void testCommentInElements3_malformedOn() throws JNLPMatcherException, IOException, ParseException { //heving comment inside element declaration is invalid anyway, so tagsoup can be excused for failing in this case try (InputStream fileStream = ClassLoader.getSystemClassLoader() .getResourceAsStream("net/sourceforge/jnlp/templates/template5.jnlp")) { Node root = Parser.getRootNode(fileStream, new ParserSettings(false, true, true)); String a = root.getChildNodes()[2].getAttribute("main-class"); Assert.assertEquals("*", a); } } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/DefaultLaunchHandlerTest.java0000644000000000000000000000013013441742745030114 xustar0030 mtime=1552401893.063832773 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/DefaultLaunchHandlerTest.java0000644000175000002070000001404713441742745030734 0ustar00jvanekmock00000000000000/* DefaultLaunchHandlerTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.lang.reflect.Field; import net.sourceforge.jnlp.util.logging.LogConfig; import net.sourceforge.jnlp.util.logging.OutputController; import org.junit.Test; public class DefaultLaunchHandlerTest { private static class LocalLogger extends OutputController { private static class AccessibleStream extends PrintStream { public AccessibleStream(ByteArrayOutputStream out) { super(out); } public ByteArrayOutputStream getOut() { return (ByteArrayOutputStream) out; } } LocalLogger() { super(new AccessibleStream(new ByteArrayOutputStream()), new AccessibleStream(new ByteArrayOutputStream())); try{ Field f = LogConfig.class.getDeclaredField("logToStreams"); f.setAccessible(true); f.set(LogConfig.getLogConfig(), true); }catch(Exception ex){ ServerAccess.logException(ex); } } public String getStream1() { return ((AccessibleStream) (super.getOut())).getOut().toString(); } public String getStream2() { return ((AccessibleStream) (super.getErr())).getOut().toString(); } } @Test public void testBasicLaunch() { LocalLogger l = new LocalLogger(); DefaultLaunchHandler handler = new DefaultLaunchHandler(l); // all no-ops with no output handler.launchInitialized(null); handler.launchStarting(null); handler.launchCompleted(null); assertEquals("", l.getStream1()); assertEquals("", l.getStream2()); } @Test public void testLaunchWarning() { LocalLogger l = new LocalLogger(); DefaultLaunchHandler handler = new DefaultLaunchHandler(l); LaunchException warning = new LaunchException(null, null, "severe", "warning type", "test warning", "this is a test of the warning"); boolean continueLaunch = handler.launchWarning(warning); assertTrue(continueLaunch); assertEquals("netx: warning type: test warning\n", l.getStream1()); } @Test public void testLaunchError() { LocalLogger l = new LocalLogger(); DefaultLaunchHandler handler = new DefaultLaunchHandler(l); LaunchException error = new LaunchException(null, null, "severe", "error type", "test error", "this is a test of the error"); handler.launchError(error); assertEquals("netx: error type: test error\n", l.getStream1()); } @Test public void testLaunchErrorWithCause() { LocalLogger l = new LocalLogger(); DefaultLaunchHandler handler = new DefaultLaunchHandler(l); ParseException parse = new ParseException("no information element"); LaunchException error = new LaunchException(null, parse, "severe", "error type", "test error", "this is a test of the error"); handler.launchError(error); assertEquals("netx: error type: test error (no information element)\n", l.getStream1()); } @Test public void testLaunchErrorWithNestedCause() { LocalLogger l = new LocalLogger(); DefaultLaunchHandler handler = new DefaultLaunchHandler(l); ParseException parse = new ParseException("no information element"); RuntimeException runtime = new RuntimeException("programmer made a mistake", parse); LaunchException error = new LaunchException(null, runtime, "severe", "error type", "test error", "this is a test of the error"); handler.launchError(error); assertEquals("netx: error type: test error (programmer made a mistake (no information element))\n", l.getStream1()); } @Test public void testValidationError() { LocalLogger l = new LocalLogger(); DefaultLaunchHandler handler = new DefaultLaunchHandler(l); LaunchException error = new LaunchException(null, null, "severe", "validation-error type", "test validation-error", "this is a test of a validation error"); handler.validationError(error); assertEquals("netx: validation-error type: test validation-error\n", l.getStream1()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/SecurityDescTest.java0000644000000000000000000000013013441742745026505 xustar0030 mtime=1552401893.065832769 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/SecurityDescTest.java0000644000175000002070000002074713441742745027331 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.net.URI; import net.sourceforge.jnlp.mock.DummyJNLPFile; import org.junit.Test; import static org.junit.Assert.*; public class SecurityDescTest { @Test public void testNotNullJnlpFile() throws Exception { Throwable t = null; try { new SecurityDesc(new DummyJNLPFile(), SecurityDesc.SANDBOX_PERMISSIONS, null); } catch (Exception ex) { t = ex; } assertNull("securityDesc should not throw exception", t); } @Test(expected = NullPointerException.class) public void testNullJnlpFile() throws Exception { new SecurityDesc(null, SecurityDesc.SANDBOX_PERMISSIONS, null); } @Test public void testAppendRecursiveSubdirToCodebaseHostString() throws Exception { final String urlStr = "http://example.com"; final String result = SecurityDesc.appendRecursiveSubdirToCodebaseHostString(urlStr); final String expected = "http://example.com/-"; assertEquals(expected, result); } @Test public void testAppendRecursiveSubdirToCodebaseHostString2() throws Exception { final String urlStr = "http://example.com/"; final String result = SecurityDesc.appendRecursiveSubdirToCodebaseHostString(urlStr); final String expected = "http://example.com/-"; assertEquals(expected, result); } @Test public void testAppendRecursiveSubdirToCodebaseHostString3() throws Exception { final String urlStr = "http://example.com///"; final String result = SecurityDesc.appendRecursiveSubdirToCodebaseHostString(urlStr); final String expected = "http://example.com/-"; assertEquals(expected, result); } @Test public void testAppendRecursiveSubdirToCodebaseHostStringWithPort() throws Exception { final String urlStr = "http://example.com:8080"; final String result = SecurityDesc.appendRecursiveSubdirToCodebaseHostString(urlStr); final String expected = "http://example.com:8080/-"; assertEquals(expected, result); } @Test(expected = NullPointerException.class) public void testAppendRecursiveSubdirToCodebaseHostStringWithNull() throws Exception { SecurityDesc.appendRecursiveSubdirToCodebaseHostString(null); } @Test public void testGetHostWithSpecifiedPort() throws Exception { final URI codebase = new URI("http://example.com"); final URI expected = new URI("http://example.com:80"); assertEquals(expected, SecurityDesc.getHostWithSpecifiedPort(codebase, 80)); } @Test public void testGetHostWithSpecifiedPortWithFtpScheme() throws Exception { final URI codebase = new URI("ftp://example.com"); final URI expected = new URI("ftp://example.com:80"); assertEquals(expected, SecurityDesc.getHostWithSpecifiedPort(codebase, 80)); } @Test public void testGetHostWithSpecifiedPortWithUserInfo() throws Exception { final URI codebase = new URI("http://user:password@example.com"); final URI expected = new URI("http://user:password@example.com:80"); assertEquals(expected, SecurityDesc.getHostWithSpecifiedPort(codebase, 80)); } @Test public void testGetHostWithSpecifiedPortWithPort() throws Exception { final URI codebase = new URI("http://example.com:8080"); final URI expected = new URI("http://example.com:80"); assertEquals(expected, SecurityDesc.getHostWithSpecifiedPort(codebase, 80)); } @Test public void testGetHostWithSpecifiedPortWithPath() throws Exception { final URI codebase = new URI("http://example.com/applet/codebase/"); final URI expected = new URI("http://example.com:80"); assertEquals(expected, SecurityDesc.getHostWithSpecifiedPort(codebase, 80)); } @Test public void testGetHostWithSpecifiedPortWithAll() throws Exception { final URI codebase = new URI("ftp://user:password@example.com:8080/applet/codebase/"); final URI expected = new URI("ftp://user:password@example.com:80"); assertEquals(expected, SecurityDesc.getHostWithSpecifiedPort(codebase, 80)); } @Test(expected = NullPointerException.class) public void testGetHostWithSpecifiedPortWithNull() throws Exception { SecurityDesc.getHostWithSpecifiedPort(null, 80); } @Test public void testGetHost() throws Exception { final URI codebase = new URI("http://example.com"); final URI expected = new URI("http://example.com"); assertEquals(expected, SecurityDesc.getHost(codebase)); } @Test public void testGetHostWithFtpScheme() throws Exception { final URI codebase = new URI("ftp://example.com"); final URI expected = new URI("ftp://example.com"); assertEquals(expected, SecurityDesc.getHost(codebase)); } @Test public void testGetHostWithUserInfo() throws Exception { final URI codebase = new URI("http://user:password@example.com"); final URI expected = new URI("http://user:password@example.com"); assertEquals(expected, SecurityDesc.getHost(codebase)); } @Test public void testGetHostWithPort() throws Exception { final URI codebase = new URI("http://example.com:8080"); final URI expected = new URI("http://example.com:8080"); assertEquals(expected, SecurityDesc.getHost(codebase)); } @Test public void testGetHostWithPath() throws Exception { final URI codebase = new URI("http://example.com/applet/codebase/"); final URI expected = new URI("http://example.com"); assertEquals(expected, SecurityDesc.getHost(codebase)); } @Test public void testGetHostWithAll() throws Exception { final URI codebase = new URI("ftp://user:password@example.com:8080/applet/codebase/"); final URI expected = new URI("ftp://user:password@example.com:8080"); assertEquals(expected, SecurityDesc.getHost(codebase)); } @Test(expected = NullPointerException.class) public void testGetHostNull() throws Exception { SecurityDesc.getHost(null); } @Test public void testGetHostWithAppendRecursiveSubdirToCodebaseHostString() throws Exception { final URI codebase = new URI("ftp://user:password@example.com:8080/applet/codebase/"); final String expected = "ftp://user:password@example.com:8080/-"; assertEquals(expected, SecurityDesc.appendRecursiveSubdirToCodebaseHostString(SecurityDesc.getHost(codebase).toString())); } @Test public void testGetHostWithSpecifiedPortWithAppendRecursiveSubdirToCodebaseHostString() throws Exception { final URI codebase = new URI("ftp://user:password@example.com:8080/applet/codebase/"); final String expected = "ftp://user:password@example.com:80/-"; assertEquals(expected, SecurityDesc.appendRecursiveSubdirToCodebaseHostString(SecurityDesc.getHostWithSpecifiedPort(codebase, 80).toString())); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/ParserBasic.java0000644000000000000000000000013013441742745025435 xustar0030 mtime=1552401893.065832769 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/ParserBasic.java0000644000175000002070000002744013441742745026256 0ustar00jvanekmock00000000000000/* ParserBasic.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.InputStream; import java.util.List; import net.sourceforge.jnlp.mock.DummyJNLPFile; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /** * Test that the parser works with basic jnlp files */ public class ParserBasic extends NoStdOutErrTest { private static Node root; private static Parser parser; @BeforeClass public static void setUp() throws ParseException { ClassLoader cl = ParserBasic.class.getClassLoader(); if (cl == null) { cl = ClassLoader.getSystemClassLoader(); } ParserSettings defaultParser = new ParserSettings(); InputStream jnlpStream = cl.getResourceAsStream("net/sourceforge/jnlp/basic.jnlp"); root = Parser.getRootNode(jnlpStream, defaultParser); parser = new Parser(new DummyJNLPFile(), null, root, defaultParser); } @Test public void testJNLP() { Assert.assertEquals("1.0", parser.getSpecVersion().toString()); Assert.assertEquals("http://localhost/", parser.getCodeBase().toString()); Assert.assertEquals("http://localhost/jnlp.jnlp", parser.getFileLocation().toString()); } @Test public void testInformation() throws ParseException { List infos = parser.getInfo(root); Assert.assertNotNull(infos); Assert.assertEquals(1, infos.size()); InformationDesc info = infos.get(0); Assert.assertNotNull(info); } @Test public void testInformationTitle() throws ParseException { InformationDesc info = parser.getInfo(root).get(0); Assert.assertEquals("Large JNLP", info.getTitle()); } @Test public void testInformationVendor() throws ParseException { InformationDesc info = parser.getInfo(root).get(0); Assert.assertEquals("The IcedTea Project", info.getVendor()); } @Test public void testInformationHomePage() throws ParseException { InformationDesc info = parser.getInfo(root).get(0); Assert.assertEquals("http://homepage/", info.getHomepage().toString()); } @Test public void testInformationDescription() throws ParseException { InformationDesc info = parser.getInfo(root).get(0); Assert.assertEquals("one-line", info.getDescription("one-line")); Assert.assertEquals("short", info.getDescription("short")); Assert.assertEquals("tooltip", info.getDescription("tooltip")); } @Test public void testInformationOfflineAllowed() throws ParseException { InformationDesc info = parser.getInfo(root).get(0); Assert.assertEquals(true, info.isOfflineAllowed()); } @Test public void testInformationIcon() throws ParseException { InformationDesc info = parser.getInfo(root).get(0); IconDesc[] icons = info.getIcons(IconDesc.DEFAULT); Assert.assertNotNull(icons); Assert.assertEquals(1, icons.length); IconDesc icon = icons[0]; Assert.assertNotNull(icon); Assert.assertEquals("http://localhost/icon.png", icon.getLocation().toString()); icons = info.getIcons(IconDesc.SPLASH); Assert.assertNotNull(icons); Assert.assertEquals(1, icons.length); icon = icons[0]; Assert.assertNotNull(icon); Assert.assertEquals("http://localhost/splash.png", icon.getLocation().toString()); } @Test public void testInformationShortcut() throws ParseException { InformationDesc info = parser.getInfo(root).get(0); ShortcutDesc shortcut = info.getShortcut(); Assert.assertNotNull(shortcut); Assert.assertTrue(shortcut.isOnlineValue()); Assert.assertTrue(shortcut.onDesktop()); MenuDesc menu = shortcut.getMenu(); Assert.assertNotNull(menu); Assert.assertEquals("submenu", menu.getSubMenu()); } @Test public void testInformationAssociation() throws ParseException { InformationDesc info = parser.getInfo(root).get(0); AssociationDesc[] associations = info.getAssociations(); Assert.assertNotNull(associations); Assert.assertEquals(1, associations.length); AssociationDesc association = associations[0]; Assert.assertNotNull(association); String[] extensions = association.getExtensions(); Assert.assertNotNull(extensions); Assert.assertEquals(1, extensions.length); String extension = extensions[0]; Assert.assertNotNull(extension); Assert.assertEquals("*.foo", extension); String mimeType = association.getMimeType(); Assert.assertNotNull(mimeType); Assert.assertEquals("foo/bar", mimeType); } @Test public void testInformationRelatedContent() throws ParseException { InformationDesc info = parser.getInfo(root).get(0); RelatedContentDesc[] relatedContents = info.getRelatedContents(); Assert.assertNotNull(relatedContents); Assert.assertEquals(1, relatedContents.length); RelatedContentDesc relatedContent = relatedContents[0]; Assert.assertNotNull(relatedContent); Assert.assertEquals("related-content title", relatedContent.getTitle()); Assert.assertNotNull(relatedContent.getLocation()); Assert.assertEquals("http://related-content/", relatedContent.getLocation().toString()); Assert.assertEquals("decription of related-content", relatedContent.getDescription()); IconDesc relatedIcon = relatedContent.getIcon(); Assert.assertNotNull(relatedIcon.getLocation()); Assert.assertEquals("http://localhost/related-content-icon.png", relatedIcon.getLocation().toString()); } @Test public void testSecurity() throws ParseException { SecurityDesc security = parser.getSecurity(root); Assert.assertNotNull(security); Assert.assertEquals(SecurityDesc.ALL_PERMISSIONS, security.getSecurityType()); } @Test public void testResources() throws ParseException { List allResources = parser.getResources(root, false); Assert.assertNotNull(allResources); Assert.assertEquals(1, allResources.size()); ResourcesDesc resources = allResources.get(0); Assert.assertNotNull(resources); } @Test public void testResourcesJava() throws ParseException { ResourcesDesc resources = parser.getResources(root, false).get(0); JREDesc[] jres = resources.getJREs(); Assert.assertNotNull(jres); Assert.assertEquals(1, jres.length); JREDesc jre = jres[0]; Assert.assertNotNull(jre); Assert.assertEquals("1.3+", jre.getVersion().toString()); Assert.assertEquals("http://java-url/", jre.getLocation().toString()); Assert.assertEquals("64m", jre.getInitialHeapSize()); Assert.assertEquals("128m", jre.getMaximumHeapSize()); } @Test public void testResourcesInsideJava() throws ParseException { ClassLoader cl = ParserBasic.class.getClassLoader(); if (cl == null) { cl = ClassLoader.getSystemClassLoader(); } ParserSettings defaultParser = new ParserSettings(); InputStream jnlpStream = cl.getResourceAsStream("net/sourceforge/jnlp/jarsInJreDesc.jnlp"); Node omega = Parser.getRootNode(jnlpStream, defaultParser); Parser omegaParser = new Parser(new DummyJNLPFile(), null, omega, defaultParser); ResourcesDesc resources = omegaParser.getResources(omega, false).get(0); JARDesc[] r = resources.getJARs(); // we ensures that also in j2se hars ar eloaded.it is 7 withutt them. Assert.assertTrue(r.length>30); } @Test public void testResourcesJar() throws ParseException { ResourcesDesc resources = parser.getResources(root, false).get(0); boolean foundNative = false; boolean foundEager = false; boolean foundLazy = false; JARDesc[] jars = resources.getJARs(); Assert.assertEquals(3, jars.length); for (int i = 0; i < jars.length; i++) { if (jars[i].isNative()) { foundNative = true; Assert.assertEquals("http://localhost/native.jar", jars[i].getLocation().toString()); } else if (jars[i].isEager()) { foundEager = true; Assert.assertEquals("http://localhost/eager.jar", jars[i].getLocation().toString()); } else if (jars[i].isLazy()) { foundLazy = true; Assert.assertEquals("http://localhost/lazy.jar", jars[i].getLocation().toString()); } else { Assert.assertFalse(true); } } Assert.assertTrue(foundNative); Assert.assertTrue(foundLazy); Assert.assertTrue(foundEager); } @Test public void testResourcesExtensions() throws ParseException { ResourcesDesc resources = parser.getResources(root, false).get(0); ExtensionDesc[] extensions = resources.getExtensions(); Assert.assertNotNull(extensions); Assert.assertEquals(1, extensions.length); ExtensionDesc extension = extensions[0]; Assert.assertNotNull(extension); Assert.assertEquals("http://extension/", extension.getLocation().toString()); Assert.assertEquals("extension", extension.getName()); Assert.assertEquals("0.1.1", extension.getVersion().toString()); } @Test public void testResourcesProperty() throws ParseException { ResourcesDesc resources = parser.getResources(root, false).get(0); PropertyDesc[] properties = resources.getProperties(); Assert.assertNotNull(properties); Assert.assertEquals(1, properties.length); PropertyDesc property = properties[0]; Assert.assertNotNull(property); Assert.assertEquals("key", property.getKey()); Assert.assertEquals("value", property.getValue()); } @Test public void testApplication() throws ParseException { ApplicationDesc app = (ApplicationDesc) parser.getLauncher(root); Assert.assertNotNull(app); Assert.assertEquals("MainClass", app.getMainClass()); Assert.assertArrayEquals(new String[]{"arg1", "arg2"}, app.getArguments()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/AsyncCallTest.java0000644000000000000000000000013013441742745025750 xustar0030 mtime=1552401893.064832771 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/AsyncCallTest.java0000644000175000002070000000462513441742745026571 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.concurrent.Callable; import org.junit.Test; public class AsyncCallTest { @Test public void timeOutTest() { final boolean[] wasInterrupted = { false }; AsyncCall call = AsyncCall.startWithTimeOut(new Callable() { @Override public synchronized Void call() { try { wait(); } catch (InterruptedException ie) { // Received on time-out wasInterrupted[0] = true; } return null; } }, 100 /* 100 millisecond time-out */); boolean completedNormally = false; try { call.join(); completedNormally = true; } catch (Exception e) { ServerAccess.logErrorReprint(e.toString()); assertTrue(e instanceof AsyncCall.TimeOutException); } assertFalse(completedNormally); assertTrue(wasInterrupted[0]); } @Test public void normalReturnTest() { AsyncCall call = AsyncCall.startWithTimeOut(new Callable() { @Override public Integer call() { return 1; } }); Integer result = null; boolean completedNormally = false; try { result = call.join(); completedNormally = true; } catch (Exception e) { ServerAccess.logErrorReprint(e.toString()); } assertTrue(completedNormally); assertEquals(Integer.valueOf(1), result); } @Test public void thrownExceptionTest() { @SuppressWarnings("serial") class TestException extends RuntimeException { } AsyncCall call = AsyncCall.startWithTimeOut(new Callable() { @Override public Void call() { throw new TestException(); } }); boolean completedNormally = false; try { call.join(); completedNormally = true; } catch (Exception e) { ServerAccess.logErrorReprint(e.toString()); assertTrue(e instanceof TestException); } assertFalse(completedNormally); } }icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/PluginParametersTest.java0000644000000000000000000000013013441742745027361 xustar0030 mtime=1552401893.073832752 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PluginParametersTest.java0000644000175000002070000001174613441742745030204 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp; import static org.junit.Assert.*; import java.util.HashMap; import java.util.Map; import org.junit.Test; public class PluginParametersTest { @Test public void testAttributeParseJavaPrefix() { // java_* aliases override older names: // http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/using_tags.html#in-nav Map rawParams; Map params; rawParams = new HashMap(); rawParams.put("code", "codeValue"); rawParams.put("java_code", "java_codeValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals("java_codeValue", params.get("code")); rawParams = new HashMap(); rawParams.put("codebase", "codebaseValue"); rawParams.put("java_codebase", "java_codebaseValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals("java_codebaseValue", params.get("codebase")); rawParams = new HashMap(); rawParams.put("archive", "archiveValue"); rawParams.put("java_archive", "java_archiveValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals("java_archiveValue", params.get("archive")); rawParams = new HashMap(); rawParams.put("object", "objectValue"); rawParams.put("java_object", "java_objectValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals("java_objectValue", params.get("object")); rawParams = new HashMap(); rawParams.put("type", "typeValue"); rawParams.put("java_type", "java_typeValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals("java_typeValue", params.get("type")); } @Test public void testEnsureJavaPrefixTakesPrecedence() { Map params; params = new HashMap(); params.put("test", "testValue"); params.put("java_test", "java_testValue"); PluginParameters.ensureJavaPrefixTakesPrecedence(params, "test"); assertEquals("java_testValue", params.get("test")); params = new HashMap(); params.put("test", "testValue"); PluginParameters.ensureJavaPrefixTakesPrecedence(params, "test"); assertEquals("testValue", params.get("test")); params = new HashMap(); params.put("java_test", "java_testValue"); PluginParameters.ensureJavaPrefixTakesPrecedence(params, "test"); assertEquals("java_testValue", params.get("test")); } @Test public void testAttributeParseCodeAttribute() { Map rawParams; Map params; // Simple test of object tag being set rawParams = new HashMap(); rawParams.put("object", "objectValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals("objectValue", params.get("object")); // Classid tag gets used as code tag rawParams = new HashMap(); rawParams.put("classid", "classidValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals("classidValue", params.get("code")); // Java: gets stripped from code tag rawParams = new HashMap(); rawParams.put("code", "java:codeValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals("codeValue", params.get("code")); // Classid tag gets used as code tag, and java: is stripped rawParams = new HashMap(); rawParams.put("classid", "java:classidValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals("classidValue", params.get("code")); // Classid tag gets used as code tag, and clsid: is stripped rawParams = new HashMap(); rawParams.put("classid", "clsid:classidValue"); params = PluginParameters.createParameterTable(rawParams); assertEquals(null, params.get("code")); } /** * Initialize PluginParameters without code/object parameters */ @Test(expected = PluginParameterException.class) public void testConstructorWithNoCodeAndObjectParam() { Map rawParams = new HashMap(); rawParams.put("classid", "clsid:classidValue"); new PluginParameters(rawParams); } /** * Initialize PluginParameters with jnlp_href but no code/object parameters */ @Test public void testConstructorWithOnlyJnlpHrefParam() { Map rawParams = new HashMap(); rawParams.put("jnlp_href", "applet.jnlp"); PluginParameters pluginParam = new PluginParameters(rawParams); assertEquals("applet.jnlp", pluginParam.getJNLPHref()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/JREDescTest.java0000644000000000000000000000013013441742745025316 xustar0030 mtime=1552401893.072832754 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/JREDescTest.java0000644000175000002070000001323213441742745026131 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import org.junit.Assert; import org.junit.Test; public class JREDescTest { @Test public void testNulls() throws ParseException { JREDesc a = new JREDesc(null, null, null, null, null, null); } @Test public void testInitialHeapSize() throws ParseException { JREDesc a = new JREDesc(null, null, null, "1", null, null); a = new JREDesc(null, null, null, "99999999", null, null); a = new JREDesc(null, null, null, "1k", null, null); a = new JREDesc(null, null, null, "1000k", null, null); a = new JREDesc(null, null, null, "1K", null, null); a = new JREDesc(null, null, null, "1000K", null, null); a = new JREDesc(null, null, null, "1m", null, null); a = new JREDesc(null, null, null, "1m", null, null); a = new JREDesc(null, null, null, "1M", null, null); a = new JREDesc(null, null, null, "1g", null, null); a = new JREDesc(null, null, null, "1G", null, null); a = new JREDesc(null, null, null, "10000G", null, null); } @Test public void testMaximumHeapSize() throws ParseException { JREDesc a = new JREDesc(null, null, null, null, "1", null); a = new JREDesc(null, null, null, null, "99999999", null); a = new JREDesc(null, null, null, null, "1k", null); a = new JREDesc(null, null, null, null, "1000k", null); a = new JREDesc(null, null, null, null, "1K", null); a = new JREDesc(null, null, null, null, "1000K", null); a = new JREDesc(null, null, null, null, "1m", null); a = new JREDesc(null, null, null, null, "1m", null); a = new JREDesc(null, null, null, null, "1M", null); a = new JREDesc(null, null, null, null, "1g", null); a = new JREDesc(null, null, null, null, "1G", null); a = new JREDesc(null, null, null, null, "10000G", null); } @Test(expected = ParseException.class) public void testInitialHeapSizeBad() throws ParseException { JREDesc a = new JREDesc(null, null, null, "blah", null, null); } @Test(expected = ParseException.class) public void testMaximumHeapSizeBad() throws ParseException { JREDesc a = new JREDesc(null, null, null, null, "blah", null); } @Test public void checkHeapSize() throws ParseException { String s = JREDesc.checkHeapSize(null); Assert.assertEquals(null, s); s = JREDesc.checkHeapSize("0"); Assert.assertEquals("0", s); s = JREDesc.checkHeapSize(" 0k"); Assert.assertEquals("0k", s); s = JREDesc.checkHeapSize("1 "); Assert.assertEquals("1", s); s = JREDesc.checkHeapSize("10"); Assert.assertEquals("10", s); s = JREDesc.checkHeapSize(" 1k"); Assert.assertEquals("1k", s); s = JREDesc.checkHeapSize("10m "); Assert.assertEquals("10m", s); s = JREDesc.checkHeapSize("0"); Assert.assertEquals("0", s); s = JREDesc.checkHeapSize(" 0K"); Assert.assertEquals("0K", s); s = JREDesc.checkHeapSize("1 "); Assert.assertEquals("1", s); s = JREDesc.checkHeapSize("10"); Assert.assertEquals("10", s); s = JREDesc.checkHeapSize(" 1M"); Assert.assertEquals("1M", s); s = JREDesc.checkHeapSize("10G "); Assert.assertEquals("10G", s); s = JREDesc.checkHeapSize("99K"); Assert.assertEquals("99K", s); } @Test(expected = ParseException.class) public void checkHeapSizeBad1() throws ParseException { JREDesc.checkHeapSize("10k10m"); } @Test(expected = ParseException.class) public void checkHeapSizeBad2() throws ParseException { JREDesc.checkHeapSize("one gigabyte"); } @Test(expected = ParseException.class) public void checkHeapSizeBad3() throws ParseException { JREDesc.checkHeapSize("99l"); } @Test(expected = ParseException.class) public void checkHeapSizeBad4() throws ParseException { JREDesc.checkHeapSize("99KK"); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/launchApp.jnlp0000644000000000000000000000013013441742745025174 xustar0030 mtime=1552401893.071832756 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/launchApp.jnlp0000644000175000002070000000057213441742745026012 0ustar00jvanekmock00000000000000 Sample Test RedHat icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/basic.jnlp0000644000000000000000000000013013441742745024342 xustar0030 mtime=1552401893.070832758 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/basic.jnlp0000644000175000002070000000312613441742745025156 0ustar00jvanekmock00000000000000 Large JNLP The IcedTea Project one-line short tooltip related-content <!-- or something -->title decription of related-content arg1 arg2 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/ParserTest.java0000644000000000000000000000013013441742745025333 xustar0030 mtime=1552401893.068832762 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/ParserTest.java0000644000175000002070000022517013441742745026154 0ustar00jvanekmock00000000000000/* ParserTest.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.ByteArrayInputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Locale; import net.sourceforge.jnlp.mock.MockJNLPFile; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import org.junit.Assert; import org.junit.Test; /** Test various corner cases of the parser */ public class ParserTest extends NoStdOutErrTest { private static final String LANG = "en"; private static final String COUNTRY = "CA"; private static final String VARIANT = "utf8"; private static final Locale LANG_LOCALE = new Locale(LANG); private static final Locale LANG_COUNTRY_LOCALE = new Locale(LANG, COUNTRY); private static final Locale ALL_LOCALE = new Locale(LANG, COUNTRY, VARIANT); ParserSettings defaultParser=new ParserSettings(); ParserSettings strictParser=new ParserSettings(true, true, true); @Test(expected = MissingInformationException.class) public void testMissingInfoFullLocale() throws ParseException { String data = "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); parser.getInfo(root); } @Test(expected = MissingTitleException.class) public void testEmptyLocalizedInfoFullLocale() throws ParseException { String data = "\n" + " \n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test public void testOneFullyLocalizedInfoFullLocale() throws ParseException { String data = "\n" + " \n" + " English_CA_utf8_T\n" + " English_CA_utf8_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_CA_utf8_T' but wasn't", "English_CA_utf8_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_CA_utf8_V' but wasn't", "English_CA_utf8_V", file.getVendor()); } @Test public void testOneLangCountryLocalizedInfoFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_CA_T\n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly two info descs should be found", infoDescs.size() == 2); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_CA_T' but wasn't", "English_CA_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_CA_V' but wasn't", "English_CA_V", file.getVendor()); } @Test public void testOneLangLocalizedInfoFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly two info descs should be found", infoDescs.size() == 2); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_V' but wasn't", "English_V", file.getVendor()); } @Test public void testGeneralizedInfoFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); Assert.assertEquals("Title should be `Generalized_T' but wasn't", "Generalized_T", file.getTitle()); Assert.assertEquals("Vendor should be `Generalized_V' but wasn't", "Generalized_V", file.getVendor()); } @Test public void testTwoDifferentLocalizedInfoFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + " \n" + " French_T\n" + " French_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_V' but wasn't", "English_V", file.getVendor()); } @Test public void testTwoLocalizedWithSameLangInfoFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + " \n" + " English_CA_T\n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_CA_T' but wasn't", "English_CA_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_CA_V' but wasn't", "English_CA_V", file.getVendor()); } @Test public void testTwoSameLangOneMissingTitleFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_CA_V' but wasn't", "English_CA_V", file.getVendor()); } @Test public void testTwoSameLangWithGeneralizedTitleFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `Generalized_T' but wasn't", "Generalized_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_CA_V' but wasn't", "English_CA_V", file.getVendor()); } @Test(expected = MissingTitleException.class) public void testMissingTitleFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_V\n" + " \n" + " \n" + " English_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingVendorException.class) public void testMissingVendorFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " \n" + " \n" + " English_T\n" + " \n" + " \n" + " English_CA_T\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingTitleException.class) public void testMissingLocalizedTitleFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly two info descs should be found", infoDescs.size() == 2); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingVendorException.class) public void testMissingLocalizedVendorFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " \n" + " \n" + " English_CA_T\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly two info descs should be found",infoDescs.size() == 2); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingTitleException.class) public void testEmptyLocalizedTitleFullLocale() throws ParseException { String data = "\n" + " \n" + " \n" + " English_CA_utf8_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingVendorException.class) public void testEmptyLocalizedVendorFullLocale() throws ParseException { String data = "\n" + " \n" + " English_CA_utf8_T\n" + " \n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test public void testFallbackEmptyLocalizedTitleVendorFullLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " French_CA_utf8_T\n" + " French_CA_utf8_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(ALL_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly five info descs should be found", infoDescs.size() == 5); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `Generalized_V' but wasn't", "Generalized_V", file.getVendor()); parser.checkForInformation(); } @Test(expected = MissingInformationException.class) public void testMissingInfoLangCountryLocale() throws ParseException { String data = "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); parser.getInfo(root); } @Test(expected = MissingTitleException.class) public void testEmptyLocalizedInfoLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingTitleException.class) public void testOneFullyLocalizedInfoLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " English_CA_utf8_T\n" + " English_CA_utf8_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test public void testOneLangCountryLocalizedInfoLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_CA_T\n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly two info descs should be found", infoDescs.size() == 2); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_CA_T' but wasn't", "English_CA_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_CA_V' but wasn't", "English_CA_V", file.getVendor()); } @Test public void testOneLangLocalizedInfoLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly two info descs should be found", infoDescs.size() == 2); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_V' but wasn't", "English_V", file.getVendor()); } @Test public void testGeneralizedInfoLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); Assert.assertEquals("Title should be `Generalized_T' but wasn't", "Generalized_T", file.getTitle()); Assert.assertEquals("Vendor should be `Generalized_V' but wasn't", "Generalized_V", file.getVendor()); } @Test public void testTwoDifferentLocalizedInfoLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + " \n" + " French_T\n" + " French_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_V' but wasn't", "English_V", file.getVendor()); } @Test public void testTwoLocalizedWithSameLangInfoLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + " \n" + " English_CA_T\n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_CA_T' but wasn't", "English_CA_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_CA_V' but wasn't", "English_CA_V", file.getVendor()); } @Test public void testTwoSameLangOneMissingTitleLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_CA_V' but wasn't", "English_CA_V", file.getVendor()); } @Test public void testTwoSameLangWithGeneralizedTitleLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `Generalized_T' but wasn't", "Generalized_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_CA_V' but wasn't", "English_CA_V", file.getVendor()); } @Test(expected = MissingTitleException.class) public void testMissingTitleLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_V\n" + " \n" + " \n" + " English_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingVendorException.class) public void testMissingVendorLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " \n" + " \n" + " English_T\n" + " \n" + " \n" + " English_CA_T\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingTitleException.class) public void testMissingLocalizedTitleLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly two info descs should be found", infoDescs.size() == 2); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingVendorException.class) public void testMissingLocalizedVendorLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " \n" + " \n" + " English_CA_T\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly two info descs should be found",infoDescs.size() == 2); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingTitleException.class) public void testEmptyLocalizedTitleLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " \n" + " English_CA_utf8_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingVendorException.class) public void testEmptyLocalizedVendorLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " English_CA_utf8_T\n" + " \n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test public void testFallbackEmptyLocalizedTitleVendorLangCountryLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " French_CA_utf8_T\n" + " French_CA_utf8_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_COUNTRY_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly five info descs should be found", infoDescs.size() == 5); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `Generalized_V' but wasn't", "Generalized_V", file.getVendor()); parser.checkForInformation(); } @Test(expected = MissingInformationException.class) public void testMissingInfoLangLocale() throws ParseException { String data = "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); parser.getInfo(root); } @Test(expected = MissingTitleException.class) public void testEmptyLocalizedInfoLangLocale() throws ParseException { String data = "\n" + " \n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingTitleException.class) public void testOneFullyLocalizedInfoLangLocale() throws ParseException { String data = "\n" + " \n" + " English_CA_utf8_T\n" + " English_CA_utf8_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingTitleException.class) public void testOneLangCountryLocalizedInfoLangLocale() throws ParseException { String data = "\n" + " \n" + " English_CA_T\n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test public void testOneLangLocalizedInfoLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly two info descs should be found", infoDescs.size() == 2); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_V' but wasn't", "English_V", file.getVendor()); } @Test public void testGeneralizedInfoLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); Assert.assertEquals("Title should be `Generalized_T' but wasn't", "Generalized_T", file.getTitle()); Assert.assertEquals("Vendor should be `Generalized_V' but wasn't", "Generalized_V", file.getVendor()); } @Test public void testTwoDifferentLocalizedInfoLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + " \n" + " French_T\n" + " French_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_V' but wasn't", "English_V", file.getVendor()); } @Test public void testTwoLocalizedWithSameLangInfoLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " English_V\n" + " \n" + " \n" + " English_CA_T\n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `English_V' but wasn't", "English_V", file.getVendor()); } @Test public void testTwoSameLangOneMissingTitleLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly two info descs should be found", infoDescs.size() == 2); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `Generalized_V' but wasn't", "Generalized_V", file.getVendor()); } @Test(expected = MissingTitleException.class) public void testMissingTitleLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_V\n" + " \n" + " \n" + " English_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingVendorException.class) public void testMissingVendorLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " \n" + " \n" + " English_T\n" + " \n" + " \n" + " English_CA_T\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly three info descs should be found", infoDescs.size() == 3); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingTitleException.class) public void testMissingLocalizedTitleLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_V\n" + " \n" + " \n" + " English_CA_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly two info descs should be found", infoDescs.size() == 2); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingVendorException.class) public void testMissingLocalizedVendorLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " \n" + " \n" + " English_CA_T\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly two info descs should be found",infoDescs.size() == 2); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingTitleException.class) public void testEmptyLocalizedTitleLangLocale() throws ParseException { String data = "\n" + " \n" + " \n" + " English_CA_utf8_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test(expected = MissingVendorException.class) public void testEmptyLocalizedVendorLangLocale() throws ParseException { String data = "\n" + " \n" + " English_CA_utf8_T\n" + " \n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, strictParser); List infoDescs = new ArrayList<>(); infoDescs.addAll(parser.getInfo(root)); Assert.assertTrue("Exactly one info desc should be found", infoDescs.size() == 1); file.setInfo(infoDescs); parser.checkForInformation(); } @Test public void testFallbackEmptyLocalizedTitleVendorLangLocale() throws ParseException { String data = "\n" + " \n" + " Generalized_T\n" + " Generalized_V\n" + " \n" + " \n" + " English_T\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " French_CA_utf8_T\n" + " French_CA_utf8_V\n" + " \n" + "\n"; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser); List infoDescs = parser.getInfo(root); Assert.assertTrue("Exactly five info descs should be found", infoDescs.size() == 5); file.setInfo(infoDescs); Assert.assertEquals("Title should be `English_T' but wasn't", "English_T", file.getTitle()); Assert.assertEquals("Vendor should be `Generalized_V' but wasn't", "Generalized_V", file.getVendor()); parser.checkForInformation(); } @Test public void testOverwrittenCodebaseWithValidJnlpCodebase() throws Exception { String data = "\n" + "\n" + ""; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); URL overwrittenCodebase = new URL("http://icedtea.classpath.org"); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser, overwrittenCodebase); Assert.assertEquals("http://www.redhat.com/", parser.getCodeBase().toExternalForm()); } @Test public void testOverwrittenCodebaseWithInvalidJnlpCodebase() throws Exception { String data = "\n" + "\n" + ""; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); URL overwrittenCodebase = new URL("http://icedtea.classpath.org"); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser, overwrittenCodebase); Assert.assertEquals(overwrittenCodebase.toExternalForm(), parser.getCodeBase().toExternalForm()); } @Test public void testOverwrittenCodebaseWithNoJnlpCodebase() throws Exception { String data = "\n" + "\n" + ""; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); URL overwrittenCodebase = new URL("http://icedtea.classpath.org"); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser, overwrittenCodebase); Assert.assertEquals(overwrittenCodebase.toExternalForm(), parser.getCodeBase().toExternalForm()); } @Test public void testEmptyCodebase() throws Exception { String data = "\n" + "\n" + ""; Node root = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root.getNodeName().getName()); MockJNLPFile file = new MockJNLPFile(LANG_LOCALE); Parser parser = new Parser(file, null, root, defaultParser, null); ParseException eex = null; //non codebase element is unaffected URL u = parser.getURL(root, "aaa", null); Assert.assertEquals(null, u); try { parser.getURL(root, "codebase", null); } catch (ParseException ex) { eex = ex; } Assert.assertEquals(true, eex != null); Assert.assertEquals(true, eex instanceof ParseException); } @Test public void testNullMainClassApplication() throws Exception { String data = "\n" + "\n" + "\n" + "\n" + ""; Node root1 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root1.getNodeName().getName()); MockJNLPFile file1 = new MockJNLPFile(LANG_LOCALE); Parser parser1 = new Parser(file1, null, root1, defaultParser, null); String main1 = parser1.getLauncher(root1).getMainClass(); Assert.assertEquals(null, main1); //strict also ok Node root2 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), strictParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root2.getNodeName().getName()); MockJNLPFile file2 = new MockJNLPFile(LANG_LOCALE); Parser parser2 = new Parser(file2, null, root2, defaultParser, null); String main2 = parser2.getLauncher(root2).getMainClass(); Assert.assertEquals(null, main2); } @Test public void testNullMainClassInstaller() throws Exception { String data = "\n" + "\n" + "\n" + "\n" + ""; Node root1 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root1.getNodeName().getName()); MockJNLPFile file1 = new MockJNLPFile(LANG_LOCALE); Parser parser1 = new Parser(file1, null, root1, defaultParser, null); String main1 = parser1.getLauncher(root1).getMainClass(); Assert.assertEquals(null, main1); //strict also ok Node root2 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), strictParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root2.getNodeName().getName()); MockJNLPFile file2 = new MockJNLPFile(LANG_LOCALE); Parser parser2 = new Parser(file2, null, root2, strictParser, null); String main2 = parser2.getLauncher(root2).getMainClass(); Assert.assertEquals(null, main2); } @Test(expected = ParseException.class) public void testNullMainClassApplet() throws Exception { String data = "\n" + "\n" + "\n" + "\n" + ""; Node root1 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root1.getNodeName().getName()); MockJNLPFile file1 = new MockJNLPFile(LANG_LOCALE); Parser parser1 = new Parser(file1, null, root1, defaultParser, null); parser1.getLauncher(root1).getMainClass(); //both throw } @Test public void testOkMainClassApplication() throws Exception { String data = "\n" + "\n" + "\n" + "\n" + ""; Node root1 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root1.getNodeName().getName()); MockJNLPFile file1 = new MockJNLPFile(LANG_LOCALE); Parser parser1 = new Parser(file1, null, root1, defaultParser, null); String main1 = parser1.getLauncher(root1).getMainClass(); Assert.assertEquals("some.main.class", main1); //strict also ok Node root2 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), strictParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root2.getNodeName().getName()); MockJNLPFile file2 = new MockJNLPFile(LANG_LOCALE); Parser parser2 = new Parser(file2, null, root2, strictParser, null); String main2 = parser2.getLauncher(root2).getMainClass(); Assert.assertEquals("some.main.class", main2); } @Test(expected = ParseException.class) public void testNeedToBeTrimmed1MainClassApplication() throws Exception { String data = "\n" + "\n" + "\n" + "\n" + ""; Node root1 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root1.getNodeName().getName()); MockJNLPFile file1 = new MockJNLPFile(LANG_LOCALE); Parser parser1 = new Parser(file1, null, root1, defaultParser, null); String main1 = parser1.getLauncher(root1).getMainClass(); Assert.assertEquals("some.main.class", main1); //strict throws Node root2 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), strictParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root2.getNodeName().getName()); MockJNLPFile file2 = new MockJNLPFile(LANG_LOCALE); Parser parser2 = new Parser(file2, null, root2, strictParser, null); parser2.getLauncher(root2).getMainClass(); } @Test(expected = ParseException.class) public void testNeedToBeTrimmed2MainClassApplication() throws Exception { String data = "\n" + "\n" + "\n" + "\n" + ""; Node root1 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root1.getNodeName().getName()); MockJNLPFile file1 = new MockJNLPFile(LANG_LOCALE); Parser parser1 = new Parser(file1, null, root1, defaultParser, null); String main1 = parser1.getLauncher(root1).getMainClass(); Assert.assertEquals("some.main.class", main1); //strict throws Node root2 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), strictParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root2.getNodeName().getName()); MockJNLPFile file2 = new MockJNLPFile(LANG_LOCALE); Parser parser2 = new Parser(file2, null, root2, strictParser, null); parser2.getLauncher(root2).getMainClass(); } @Test(expected = ParseException.class) public void testSpacesInsidePersistedMainClassApplication() throws Exception { String data = "\n" + "\n" + "\n" + "\n" + ""; Node root1 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root1.getNodeName().getName()); MockJNLPFile file1 = new MockJNLPFile(LANG_LOCALE); Parser parser1 = new Parser(file1, null, root1, defaultParser, null); String main1 = parser1.getLauncher(root1).getMainClass(); Assert.assertEquals("som e.main .class", main1); //strict throws Node root2 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), strictParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root2.getNodeName().getName()); MockJNLPFile file2 = new MockJNLPFile(LANG_LOCALE); Parser parser2 = new Parser(file2, null, root2, strictParser, null); parser2.getLauncher(root2).getMainClass(); } @Test(expected = ParseException.class) public void testSpacesAroundDots() throws Exception { String data = "\n" + "\n" + "\n" + "\n" + ""; Node root1 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), defaultParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root1.getNodeName().getName()); MockJNLPFile file1 = new MockJNLPFile(LANG_LOCALE); Parser parser1 = new Parser(file1, null, root1, defaultParser, null); String main1 = parser1.getLauncher(root1).getMainClass(); Assert.assertEquals("some . another . main .class. here", main1); //strict throws Node root2 = Parser.getRootNode(new ByteArrayInputStream(data.getBytes()), strictParser); Assert.assertEquals("Root name is not jnlp", "jnlp", root2.getNodeName().getName()); MockJNLPFile file2 = new MockJNLPFile(LANG_LOCALE); Parser parser2 = new Parser(file2, null, root2, strictParser, null); parser2.getLauncher(root2).getMainClass(); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/JNLPMatcherTest.java0000644000000000000000000000013013441742745026146 xustar0030 mtime=1552401893.067832765 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/JNLPMatcherTest.java0000644000175000002070000004305013441742745026762 0ustar00jvanekmock00000000000000/* JNLPMatcherTest.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Random; import net.sourceforge.jnlp.annotations.KnownToFail; import org.junit.Assert; import org.junit.Test; public class JNLPMatcherTest { static final String tests[] = { "Testing template with CDATA", "Testing template with an exact duplicate of the launching JNLP file", "Testing template with wildchars as attribute/element values", "Testing template with attributes/elements in different order", "Testing template with wildchars as ALL element/attribute values", "Testing template with comments", "Testing template with different attribute/element values", "Testing template by adding an additional children to element", "Testing template by removing children from element", "Testing template with a complete different JNLP template file ", "Testing application with CDATA", "Testing application with an exact duplicate of the launching JNLP file", "Testing application with the same element/attribute name and value pair in different orders", "Testing application with comments", "Testing application with wildchars as attribute/element values", "Testing application with a different codebase attribute value", "Testing application by adding additional children to element", "Testing application by removing children from element", "Testing application with a complete different JNLP application file", "Testing by calling JNLPMatcher.match() multiple times. Checking to see if the returns value is consistent" }; private final ClassLoader cl = ClassLoader.getSystemClassLoader(); private final boolean MALLFORMED_ALLOWED = false; private InputStream getLaunchReader() { return cl.getResourceAsStream("net/sourceforge/jnlp/launchApp.jnlp"); } @Test @KnownToFail public void testTemplateCDATA() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template0.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[0], true, test.isMatch()); } } @Test public void testTemplateDuplicate() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template1.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[1], true, test.isMatch()); } } @Test public void testTemplateWildCharsRandom() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template2.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[2], true, test.isMatch()); } } @Test public void testTemplateDifferentOrder() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template3.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[3], true, test.isMatch()); } } @Test public void testTemplateWildCharsAsAllValues() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template4.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[4], true, test.isMatch()); } } @Test public void testTemplateComments() throws JNLPMatcherException, IOException { //heving comment inside element declaration is invalid but internal parser can handle it try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template5.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[5], true, test.isMatch()); } } @Test public void testTemplateDifferentValues() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template6.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[6], false, test.isMatch()); } } @Test public void testTemplateExtraChild() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template7.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[7], false, test.isMatch()); } } @Test public void testTemplateFewerChild() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template8.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[8], false, test.isMatch()); } } @Test public void testTemplateDifferentFile() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template9.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[9], false, test.isMatch()); } } @Test @KnownToFail public void testApplicationCDATA() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application0.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[10], true, test.isMatch()); } } @Test public void testApplicationDuplicate() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application1.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[11], true, test.isMatch()); } } @Test public void testApplicationDifferentOrder() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application2.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[12], true, test.isMatch()); } } @Test public void testApplicationComments() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application3.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[13], true, test.isMatch()); } } @Test public void testApplicationWildCharsRandom() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application4.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[14], false, test.isMatch()); } } @Test public void testApplicationDifferentCodebaseValue() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application5.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[15], false, test.isMatch()); } } @Test public void testApplicationExtraChild() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application6.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[16], false, test.isMatch()); } } @Test public void testApplicationFewerChild() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application7.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[17], false, test.isMatch()); } } @Test public void testApplicationDifferentFile() throws JNLPMatcherException, IOException { try (InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application8.jnlp")) { JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[18], false, test.isMatch()); } } @SuppressWarnings("unused") @Test public void testNullJNLPFiles() throws IOException { Exception expectedException = null; InputStream fileStream; try (InputStream launchReader = this.getLaunchReader()) { fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application8.jnlp"); try { JNLPMatcher test = new JNLPMatcher(null, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); } catch (Exception e) { expectedException = e; } Assert.assertEquals( "Checking exception after trying to create an instance with null signed application/template reader", expectedException.getClass().getName(), "net.sourceforge.jnlp.JNLPMatcherException"); try { JNLPMatcher test = new JNLPMatcher(fileStream, null, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); } catch (Exception e) { expectedException = e; } Assert.assertEquals( "Checking exception after trying to create an instance with null launching JNLP file reader", expectedException.getClass().getName(), "net.sourceforge.jnlp.JNLPMatcherException"); try { JNLPMatcher test = new JNLPMatcher(null, null, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); } catch (Exception e) { expectedException = e; } Assert.assertEquals( "Checking exception after trying to create an instance with both readers being null", expectedException.getClass().getName(), "net.sourceforge.jnlp.JNLPMatcherException"); } fileStream.close(); } @Test public void testCallingMatchMultiple() throws JNLPMatcherException, IOException { // Check with application InputStream launchReader = this.getLaunchReader(); InputStream fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/application/application8.jnlp"); JNLPMatcher test = new JNLPMatcher(fileStream, launchReader, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[19], false, test.isMatch()); Assert.assertEquals(tests[19], false, test.isMatch()); fileStream.close(); launchReader.close(); // Check with template launchReader = this.getLaunchReader(); fileStream = cl .getResourceAsStream("net/sourceforge/jnlp/templates/template6.jnlp"); test = new JNLPMatcher(fileStream, launchReader, true, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertEquals(tests[19], false, test.isMatch()); Assert.assertEquals(tests[19], false, test.isMatch()); fileStream.close(); launchReader.close(); } @Test (timeout=5000 /*ms*/) public void testIsMatchDoesNotHangOnLargeData() throws JNLPMatcherException, UnsupportedEncodingException { /* construct an alphabet containing characters 'a' to 'z' */ final int ALPHABET_SIZE = 26; char[] alphabet = new char[ALPHABET_SIZE]; for (int i = 0; i < ALPHABET_SIZE; i++) { alphabet[i] = (char)('a' + i); } /* generate a long but random string using the alphabet */ final Random r = new Random(); final int STRING_SIZE = 1024 * 1024; // 1 MB StringBuilder descriptionBuilder = new StringBuilder(STRING_SIZE); for (int i = 0; i < STRING_SIZE; i++) { descriptionBuilder.append(alphabet[r.nextInt(ALPHABET_SIZE)]); } String longDescription = descriptionBuilder.toString(); String file = "\n" + " \n" + " JNLPMatcher hanges on large file size\n" + " IcedTea\n" + " " + longDescription + "\n" + " \n" + "\n"; InputStream reader1 = new ByteArrayInputStream(file.getBytes("utf-8")); InputStream reader2 = new ByteArrayInputStream(file.getBytes("utf-8")); JNLPMatcher matcher = new JNLPMatcher(reader1, reader2, false, new ParserSettings(true, true, MALLFORMED_ALLOWED)); Assert.assertTrue(matcher.isMatch()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/controlpanel0000644000000000000000000000013113441742745025020 xustar0030 mtime=1552401893.066832766 30 atime=1552410887.112183445 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/controlpanel/0000755000175000002070000000000013441742745025706 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/ClassFinderTest.ja0000644000000000000000000000013013441742745030445 xustar0030 mtime=1552401893.066832766 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/controlpanel/ClassFinderTest.java0000644000175000002070000000604113441742745031607 0ustar00jvanekmock00000000000000/* Copyright (C) 2016 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import org.junit.Assert; import org.junit.Test; public class ClassFinderTest { String[] known = new String[]{ "UnsignedAppletTrustWarningPanel", "MatchingALACAttributePanel", "PartiallySignedAppTrustWarningPanel", "AppTrustWarningPanel", "AccessWarningPane", "MissingALACAttributePanel", "MissingPermissionsAttributePanel" }; @Test public void testFoundClasses() { List kknown = new ArrayList<>(Arrays.asList(known)); List> l = ClassFinder.findAllMatchingTypes(RememberableDialog.class); Assert.assertTrue(l.size() == 7); for (Class l1 : l) { Assert.assertTrue(l1.getName().startsWith("net.sourceforge.jnlp.security.dialogs.")); } for (int i = 0; i < kknown.size(); i++) { for (int j = 0; j < l.size(); j++) { if (l.get(j).getName().endsWith(kknown.get(i))) { l.remove(j); kknown.remove(i); i--; break; } } } Assert.assertTrue(l.isEmpty()); Assert.assertTrue(kknown.isEmpty()); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/CommandLineTest.ja0000644000000000000000000000013013441742745030436 xustar0030 mtime=1552401893.064832771 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/controlpanel/CommandLineTest.java0000644000175000002070000002013513441742745031600 0ustar00jvanekmock00000000000000/* CommandLine.java -- command line interface to icedtea-web's deployment settings. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import static net.sourceforge.jnlp.runtime.Translator.R; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.util.logging.NoStdOutErrTest; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.optionparser.OptionParser; import net.sourceforge.jnlp.util.optionparser.UnevenParameterException; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class CommandLineTest extends NoStdOutErrTest{ public static final int ERROR = 1; public static final int SUCCESS = 0; private static File userDeployFile; private static String userDeployContents; @BeforeClass public static void setup() throws IOException { userDeployFile = PathsAndFiles.USER_DEPLOYMENT_FILE.getFile(); userDeployContents = new String(Files.readAllBytes(userDeployFile.toPath())); clearDeployFile(); } @AfterClass public static void afterClass() throws IOException { Files.write(userDeployFile.toPath(), userDeployContents.getBytes()); } private static void clearDeployFile() throws IOException { String clear = ""; Files.write(userDeployFile.toPath(), clear.getBytes()); } private ByteArrayOutputStream getOutputControllerStream() { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); PrintStream outPrintStream = new PrintStream(outStream); OutputController.getLogger().setOut(outPrintStream); return outStream; } @Test public void testHandleSetCommand() throws IOException { ByteArrayOutputStream outStream = getOutputControllerStream(); String[] args = { "set", "deployment.security.level", "ALLOW_UNSIGNED" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); CommandLine commandLine = new CommandLine(optionParser); int status = commandLine.handleSetCommand(); assertTrue(outStream.toString().isEmpty()); assertEquals(SUCCESS, status); clearDeployFile(); } @Test public void testHandleSetCommandDisplaysWarningOnUknownProperty() throws IOException { ByteArrayOutputStream outStream = getOutputControllerStream(); String[] args = { "set", "unknown", "does_not_matter" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); CommandLine commandLine = new CommandLine(optionParser); int status = commandLine.handleSetCommand(); String output = outStream.toString(); assertEquals(output, R("CLWarningUnknownProperty", "unknown") + "\n"); assertEquals(SUCCESS, status); clearDeployFile(); } @Test public void testSetWithDuplicateKeyValuePair() throws IOException { ByteArrayOutputStream outStream = getOutputControllerStream(); String[] args = { "set", "blah", "blah" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); CommandLine commandLine = new CommandLine(optionParser); int status = commandLine.handleSetCommand(); String contents = new String(Files.readAllBytes(userDeployFile.toPath())); String output = outStream.toString(); assertEquals(output, R("CLWarningUnknownProperty", "blah") + "\n"); assertEquals(SUCCESS, status); assertTrue(contents.contains("blah=blah")); clearDeployFile(); } @Test public void testSetWithDuplicateKeyValue() throws IOException { ByteArrayOutputStream outStream = getOutputControllerStream(); String[] args = { "set", "blue", "blah", "blah", "green" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); CommandLine commandLine = new CommandLine(optionParser); int status = commandLine.handleSetCommand(); String contents = new String(Files.readAllBytes(userDeployFile.toPath())); String output = outStream.toString(); assertTrue(output.contains(R("CLWarningUnknownProperty", "blue") + "\n")); assertTrue(output.contains(R("CLWarningUnknownProperty", "blah") + "\n")); assertTrue(contents.contains("blue=blah")); assertTrue(contents.contains("blah=green")); assertEquals(SUCCESS, status); clearDeployFile(); } @Test public void testSetPropertyWithIncorrectValue() throws IOException { String[] args = { "set", "deployment.security.level", "INTENTIONALLY_INCORRECT" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); CommandLine commandLine = new CommandLine(optionParser); int status = commandLine.handleSetCommand(); assertEquals(ERROR, status); clearDeployFile(); } @Test(expected = UnevenParameterException.class) public void testSetOddNumberOfParams() throws IOException { ByteArrayOutputStream outStream = getOutputControllerStream(); String[] args = { "set", "blue", "blah", "purple" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); CommandLine commandLine = new CommandLine(optionParser); int status = commandLine.handleSetCommand(); clearDeployFile(); } @Test public void testSetWithValueHavingSpace() throws IOException { ByteArrayOutputStream outStream = getOutputControllerStream(); String[] args = { "set", "blue", "blah red" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); CommandLine commandLine = new CommandLine(optionParser); int status = commandLine.handleSetCommand(); String contents = new String(Files.readAllBytes(userDeployFile.toPath())); String output = outStream.toString(); assertTrue(output.contains(R("CLWarningUnknownProperty", "blue") + "\n")); assertTrue(contents.contains("blue=blah red")); assertEquals(SUCCESS, status); clearDeployFile(); } @Test public void testSetWithKeyHavingSpace() throws IOException { ByteArrayOutputStream outStream = getOutputControllerStream(); String[] args = { "set", "blue green", "blah" }; OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); CommandLine commandLine = new CommandLine(optionParser); int status = commandLine.handleSetCommand(); String contents = new String(Files.readAllBytes(userDeployFile.toPath())); String output = outStream.toString(); assertTrue(output.contains(R("CLWarningUnknownProperty", "blue green") + "\n")); assertTrue(contents.contains("blue\\ green=blah")); assertEquals(SUCCESS, status); clearDeployFile(); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/ParserMalformedXml.java0000644000000000000000000000013013441742745027003 xustar0030 mtime=1552401893.062832775 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/ParserMalformedXml.java0000644000175000002070000001227213441742745027621 0ustar00jvanekmock00000000000000/* ParserMalformedXml.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.IOException; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.util.FileUtils; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; /** Test how well the parser deals with malformed xml */ public class ParserMalformedXml { private static String originalJnlp = null; private static ParserSettings lenientParserSettings = new ParserSettings(false, true, true); @BeforeClass public static void setUp() throws IOException { ClassLoader cl = ParserMalformedXml.class.getClassLoader(); if (cl == null) { cl = ClassLoader.getSystemClassLoader(); } InputStream is = cl.getResourceAsStream("net/sourceforge/jnlp/basic.jnlp"); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder jnlpBuilder = new StringBuilder(); String line; while ( (line = reader.readLine()) != null) { jnlpBuilder.append(line).append("\n"); } originalJnlp = jnlpBuilder.toString(); } @Test public void testMissingXmlDecleration() throws ParseException { String malformedJnlp = originalJnlp.replaceFirst("<\\?xml.*\\?>", ""); Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), lenientParserSettings); } @Test @KnownToFail public void testMalformedArguments() throws ParseException { String malformedJnlp = originalJnlp.replace("arg2", ""); Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), lenientParserSettings); } @Test public void testUnquotedAttributes() throws ParseException { String malformedJnlp = originalJnlp.replace("'jnlp.jnlp'", "jnlp.jnlp"); Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), lenientParserSettings); } @Test(expected = ParseException.class) public void testTagNotClosedNoTagSoup() throws ParseException { String malformedJnlp = originalJnlp.replace("", ""); Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), new ParserSettings(false, true, false)); } @Test(expected = ParseException.class) public void testUnquotedAttributesNoTagSoup() throws ParseException { String malformedJnlp = originalJnlp.replace("'jnlp.jnlp'", "jnlp.jnlp"); Parser.getRootNode(new ByteArrayInputStream(malformedJnlp.getBytes()), new ParserSettings(false, true, false)); } @Bug(id = "PR2690") @Test public void testXmlBomTagSoupOff() throws ParseException { InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("net/sourceforge/jnlp/templates/EFBBBF.jnlp"); Assert.assertNotNull(is); Parser.getRootNode(is, new ParserSettings(false, true, false)); } @Test public void testXmlBomTagSoupOn() throws ParseException { InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("net/sourceforge/jnlp/templates/EFBBBF.jnlp"); Assert.assertNotNull(is); Parser.getRootNode(is, new ParserSettings(false, true, true)); } } icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/PaxHeaders.7406/InformationDescTest.java0000644000000000000000000000013013441742745027163 xustar0030 mtime=1552401893.061832777 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/net/sourceforge/jnlp/InformationDescTest.java0000644000175000002070000002105613441742745030001 0ustar00jvanekmock00000000000000/* InformationDescTest.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; import org.junit.Test; public class InformationDescTest { @Test public void testLocales() { InformationDesc info; info = new InformationDesc(new Locale[0]); assertArrayEquals(new Locale[0], info.getLocales()); Locale[] someLocales = new Locale[] { Locale.ENGLISH, Locale.FRENCH }; info = new InformationDesc(someLocales); assertArrayEquals(someLocales, info.getLocales()); } @Test public void testTitle() { InformationDesc info = new InformationDesc(new Locale[0]); info.addItem("title", "A Title"); assertEquals("A Title", info.getTitle()); } @Test public void testVendor() { InformationDesc info = new InformationDesc(new Locale[0]); info.addItem("vendor", "Some Vendor"); assertEquals("Some Vendor", info.getVendor()); } @Test public void testHomePage() throws MalformedURLException { URL url = new URL("http://some.home.page.example.com"); InformationDesc info = new InformationDesc(new Locale[0]); info.addItem("homepage", url); assertEquals(url, info.getHomepage()); } @Test public void testDescription() { InformationDesc info = new InformationDesc(new Locale[0]); info.addItem("description-" + InformationDesc.DEFAULT, "Default Description"); assertEquals("Default Description", info.getDescription()); } @Test public void testDescriptionFallbackOrder() { InformationDesc info = new InformationDesc(new Locale[0]); info.addItem("description-" + InformationDesc.TOOLTIP, "Tooltip Description"); assertEquals("Tooltip Description", info.getDescription()); info.addItem("description-" + InformationDesc.SHORT, "Short Description"); assertEquals("Short Description", info.getDescription()); info.addItem("description-" + InformationDesc.ONE_LINE, "One-line Description"); assertEquals("One-line Description", info.getDescription()); info.addItem("description-" + InformationDesc.DEFAULT, "Default Description"); assertEquals("Default Description", info.getDescription()); } @Test public void testDescriptionKind() { InformationDesc info = new InformationDesc(new Locale[0]); info.addItem("description-" + InformationDesc.DEFAULT, "Default Description"); info.addItem("description-" + InformationDesc.ONE_LINE, "One-line Description"); info.addItem("description-" + InformationDesc.SHORT, "Short Description"); info.addItem("description-" + InformationDesc.TOOLTIP, "Tooltip Description"); assertEquals("Default Description", info.getDescription(InformationDesc.DEFAULT)); assertEquals("One-line Description", info.getDescription(InformationDesc.ONE_LINE)); assertEquals("Short Description", info.getDescription(InformationDesc.SHORT)); assertEquals("Tooltip Description", info.getDescription(InformationDesc.TOOLTIP)); } @Test public void testGetIcons() { InformationDesc info = new InformationDesc(new Locale[0]); assertArrayEquals(new IconDesc[0], info.getIcons(IconDesc.DEFAULT)); IconDesc icon1 = new IconDesc(null, null, -1, -1, -1, -1); IconDesc icon2 = new IconDesc(null, null, -1, -1, -1, -1); info.addItem("icon-" + IconDesc.DEFAULT, icon1); info.addItem("icon-" + IconDesc.DEFAULT, icon2); assertArrayEquals(new IconDesc[] { icon1, icon2 }, info.getIcons(IconDesc.DEFAULT)); } @Test public void testGetIconLocations() throws MalformedURLException { InformationDesc info = new InformationDesc(new Locale[0]); URL location1 = new URL("http://location1.example.org"); URL location2 = new URL("http://location2.example.org"); IconDesc icon1 = new IconDesc(location1, null, 10, 10, -1, -1); IconDesc icon2 = new IconDesc(location2, null, 20, 20, -1, -1); info.addItem("icon-" + IconDesc.DEFAULT, icon1); info.addItem("icon-" + IconDesc.DEFAULT, icon2); // exact size matches assertEquals(location1, info.getIconLocation(IconDesc.DEFAULT, 10, 10)); assertEquals(location2, info.getIconLocation(IconDesc.DEFAULT, 20, 20)); // match a bigger icon assertEquals(location1, info.getIconLocation(IconDesc.DEFAULT, 1, 1)); assertEquals(location2, info.getIconLocation(IconDesc.DEFAULT, 15, 15)); // match a smaller icon assertEquals(location1, info.getIconLocation(IconDesc.DEFAULT, 25, 25)); } @Test public void testIsOfflineAllowed() { InformationDesc info = new InformationDesc(new Locale[0], true); assertFalse(info.isOfflineAllowed()); info.addItem("offline-allowed", new Object()); assertTrue(info.isOfflineAllowed()); } @Test public void testIsOfflineAllowedNotStrict() { InformationDesc info = new InformationDesc(new Locale[0], false); assertTrue(info.isOfflineAllowed()); info.addItem("offline-allowed", new Object()); assertTrue(info.isOfflineAllowed()); } @Test public void testIsSharingAllowed() { InformationDesc info = new InformationDesc(new Locale[0]); assertFalse(info.isSharingAllowed()); info.addItem("sharing-allowed", new Object()); assertTrue(info.isSharingAllowed()); } @Test public void testGetShortcut() { InformationDesc info = new InformationDesc(new Locale[0]); assertNull(info.getShortcut()); ShortcutDesc shortcut = new ShortcutDesc(false, false); info.addItem("shortcut", shortcut); assertSame(shortcut, info.getShortcut()); } @Test public void testGetAssociation() throws ParseException { InformationDesc info = new InformationDesc(new Locale[0]); assertArrayEquals(new AssociationDesc[0], info.getAssociations()); AssociationDesc association = new AssociationDesc(null, null); info.addItem("association", association); assertArrayEquals(new AssociationDesc[] { association }, info.getAssociations()); } @Test public void testGetRelatedContents() { InformationDesc info = new InformationDesc(new Locale[0]); assertArrayEquals(new RelatedContentDesc[0], info.getRelatedContents()); RelatedContentDesc relatedContent = new RelatedContentDesc(null); info.addItem("related-content", relatedContent); assertArrayEquals(new RelatedContentDesc[] { relatedContent }, info.getRelatedContents()); } } icedtea-web-1.8/tests/netx/unit/PaxHeaders.7406/sun0000644000000000000000000000013113441742745017051 xustar0030 mtime=1552401893.076832746 30 atime=1552410887.112183445 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/sun/0000755000175000002070000000000013441742745017737 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/sun/PaxHeaders.7406/applet0000644000000000000000000000013113441742745020336 xustar0030 mtime=1552401893.087832723 30 atime=1552410887.112183445 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/sun/applet/0000755000175000002070000000000013441742745021224 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/unit/sun/applet/PaxHeaders.7406/MethodOverloadResolverTest.java0000644000000000000000000000013013441742745026553 xustar0030 mtime=1552401893.087832723 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/sun/applet/MethodOverloadResolverTest.java0000644000175000002070000004420013441742745027365 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.TreeSet; import net.sourceforge.jnlp.ServerAccess; import netscape.javascript.JSObject; import org.junit.Test; import sun.applet.MethodOverloadResolver.ResolvedMethod; import sun.applet.MethodOverloadResolver.WeightedCast; public class MethodOverloadResolverTest { /************************************************************************** * MethodOverloadResolver.getCostAndCastedObject tests * **************************************************************************/ // Helper methods // Helper class for overload order tests static class CandidateCast implements Comparable{ public CandidateCast(int cost, Class candidate) { this.cost = cost; this.candidate = candidate; } public int getCost() { return cost; } public Class getCandidate() { return candidate; } @Override public int compareTo(CandidateCast other) { return cost > other.cost ? +1 : -1; } private int cost; private Class candidate; } // asserts that these overloads have the given order of preference // and that none of the costs are equal static private void assertOverloadOrder(Object arg, Class... orderedCandidates) { String argClassName = arg.getClass().getSimpleName(); TreeSet casts = new TreeSet(); for (Class candidate : orderedCandidates) { WeightedCast wc = MethodOverloadResolver.getCostAndCastedObject(arg, candidate); assertFalse("Expected valid overload from " + argClassName + " to " + candidate.getSimpleName(), wc == null); // Check previous candidates, _should not_ be 'ambiguous', ie this cost == other cost for (CandidateCast cc : casts) { String failureString = "Unexpected ambiguity overloading " + argClassName + " between " + candidate.getSimpleName() + " and " + cc.candidate.getSimpleName() + " with cost " + cc.cost +"!"; assertFalse(failureString, cc.cost == wc.getCost()); } casts.add(new CandidateCast(wc.getCost(), candidate)); } Class[] actualOrder = new Class[casts.size()]; int n = 0; for (CandidateCast cc : casts) { actualOrder[n] = cc.candidate; ServerAccess.logOutputReprint(arg.getClass().getSimpleName() + " to " + cc.candidate.getSimpleName() + " has cost " + cc.cost); n++; } assertArrayEquals(orderedCandidates, actualOrder); } // Asserts that the given overloads are all of same cost static private void assertInvalidOverloads(Object arg, Class... candidates) { for (Class candidate : candidates) { WeightedCast wc = MethodOverloadResolver.getCostAndCastedObject(arg, candidate); int cost = (wc != null ? wc.getCost() : 0); // Avoid NPE on non-failure String argClassName = arg == null ? "null" : arg.getClass().getSimpleName(); assertTrue("Expected to be unable to cast " + argClassName + " to " + candidate.getSimpleName() + " but was able to with cost " + cost + "!", wc == null); } } static private void assertNotPrimitiveCastable(Object arg) { assertInvalidOverloads(arg, Double.TYPE, Float.TYPE, Long.TYPE, Short.TYPE, Byte.TYPE, Character.TYPE); } static private void assertNotNumberCastable(Object arg) { assertNotPrimitiveCastable(arg); assertInvalidOverloads(arg, Double.class, Float.class, Long.class, Short.class, Byte.class, Character.class); } // Asserts that the given overloads are all of same cost static private void assertAmbiguousOverload(Object arg, Class... candidates) { String argClassName = arg == null ? "null" : arg.getClass().getSimpleName(); List casts = new ArrayList(); for (Class candidate : candidates) { WeightedCast wc = MethodOverloadResolver.getCostAndCastedObject(arg, candidate); assertFalse("Expected valid overload from " + argClassName + " to " + candidate.getSimpleName(), wc == null); // Check previous candidates, _should_ all 'ambiguous', ie this cost == other cost for (CandidateCast cc : casts) { String failureString = "Expected ambiguity " + argClassName + " between " + candidate.getSimpleName() + " and " + cc.candidate.getSimpleName() + ", got costs " + wc.getCost() + " and " + cc.cost + "!"; assertTrue(failureString, cc.cost == wc.getCost()); } casts.add(new CandidateCast(wc.getCost(), candidate)); } } // Test methods @Test public void testBooleanOverloading() { // based on http://jdk6.java.net/plugin2/liveconnect/#OVERLOADED_METHODS assertOverloadOrder(new Boolean(false), Boolean.TYPE, Boolean.class, Double.TYPE, Object.class, String.class); } @Test public void testNumberOverloading() { // based on http://jdk6.java.net/plugin2/liveconnect/#OVERLOADED_METHODS assertAmbiguousOverload(new Double(0), Integer.TYPE, Long.TYPE, Short.TYPE, Byte.TYPE, Character.TYPE); assertOverloadOrder(new Double(0), Double.TYPE, Double.class, Float.TYPE, Boolean.TYPE, Object.class, String.class); } @Test public void testStringOverloading() { // based on http://jdk6.java.net/plugin2/liveconnect/#OVERLOADED_METHODS assertAmbiguousOverload("1", Double.TYPE, Float.TYPE, Integer.TYPE, Long.TYPE, Short.TYPE, Byte.TYPE); assertOverloadOrder("1.0", String.class, Double.TYPE, Object.class); } // Turned off until JSObject is unit-testable (privilege problem) // @Test public void testJSObjectOverloading() { // based on http://jdk6.java.net/plugin2/liveconnect/#OVERLOADED_METHODS assertOverloadOrder(new JSObject(0L), JSObject.class, String.class); assertAmbiguousOverload(new JSObject(0L), Object[].class, String.class); } @Test public void testNullOverloading() { // based on http://jdk6.java.net/plugin2/liveconnect/#OVERLOADED_METHODS assertNotPrimitiveCastable(null); assertAmbiguousOverload(null, Object.class, String.class); } @Test public void testInheritanceOverloading() { // based on http://jdk6.java.net/plugin2/liveconnect/#OVERLOADED_METHODS class FooParent {} class FooChild extends FooParent {} class FooChildOfChild extends FooChild {} assertNotNumberCastable(new FooChildOfChild()); // NB: this is ambiguious as far as costs are concerned, however // MethodOverloadResolver.getBestOverloadMatch sorts out this ambiguity assertAmbiguousOverload(new FooChildOfChild(), FooChild.class, FooParent.class, Object.class); assertOverloadOrder(new FooChild(), FooChild.class, FooParent.class, String.class); } /************************************************************************** * MethodOverloadResolver.getMatchingMethod tests * **************************************************************************/ // Helper methods // Convenient representation of resulting method signature static private String simpleSignature(java.lang.reflect.AccessibleObject m) { StringBuilder sb = new StringBuilder(); for (Class c : MethodOverloadResolver.getParameterTypesFor(m)) { sb.append(c.getSimpleName()); sb.append(", "); } sb.setLength(sb.length() - 2); // Trim last ", " return sb.toString(); } static private Object[] args(Class klazz, Object... params) { List objects = new ArrayList(); objects.add(klazz); // assumes our method test name is "testmethod" objects.add("testmethod"); objects.addAll(Arrays.asList(params)); return objects.toArray( new Object[0]); } // Takes {class, method, arguments...} bundled in one array static private ResolvedMethod getResolvedMethod(Object[] methodAndParams) { /* Copy over argument portion (class and method are bundled in same array for convenience) */ Class c = (Class)methodAndParams[0]; String methodName = (String)methodAndParams[1]; /* Copy over argument portion (class and method are bundled in same array for convenience) */ Object[] params = Arrays.copyOfRange(methodAndParams, 2, methodAndParams.length); return MethodOverloadResolver.getBestMatchMethod(c, methodName, params); } /* Assert that the overload completed properly by simply providing a type signature*/ static private void assertExpectedOverload(Object[] methodAndParams, String expectedSignature, int expectedCost) { ResolvedMethod result = getResolvedMethod(methodAndParams); // Check signature array as string for convenience assertEquals(expectedSignature, simpleSignature(result.getAccessibleObject())); assertEquals(expectedCost, result.getCost()); } /* Assert that the overload completed by providing the expected objects */ static private void assertExpectedOverload(Object[] methodAndParams, Object[] expectedCasts, int expectedCost) { ResolvedMethod result = getResolvedMethod(methodAndParams); assertArrayEquals(expectedCasts, result.getCastedParameters()); assertEquals(expectedCost, result.getCost()); } // Test methods @Test public void testMultipleArgResolve() { abstract class MultipleArg { public abstract void testmethod(String s, int i); public abstract void testmethod(String s, Integer i); } // Numeric to java primitive assertExpectedOverload( args( MultipleArg.class, "teststring", 1 ), "String, int", MethodOverloadResolver.CLASS_SAME_COST + MethodOverloadResolver.NUMERIC_SAME_COST); // String to java primitive assertExpectedOverload( args( MultipleArg.class, "teststring", "1.1" ), "String, int", MethodOverloadResolver.CLASS_SAME_COST + MethodOverloadResolver.STRING_NUMERIC_CAST_COST); // Null to non-primitive type assertExpectedOverload( args( MultipleArg.class, "teststring", (Object)null ), "String, Integer", MethodOverloadResolver.CLASS_SAME_COST + MethodOverloadResolver.NULL_TO_OBJECT_COST); } @Test public void testBoxedNumberResolve() { abstract class BoxedNumber { public abstract void testmethod(Number n); public abstract void testmethod(Integer i); } assertExpectedOverload( args( BoxedNumber.class, 1), "Integer", MethodOverloadResolver.CLASS_SAME_COST); assertExpectedOverload( args( BoxedNumber.class, (short)1), "Number", MethodOverloadResolver.CLASS_SUPERCLASS_COST); } @Test public void testPrimitivesResolve() { abstract class Primitives { public abstract void testmethod(int i); public abstract void testmethod(long l); public abstract void testmethod(float f); public abstract void testmethod(double d); } assertExpectedOverload( args( Primitives.class, 1), "int", MethodOverloadResolver.NUMERIC_SAME_COST); assertExpectedOverload( args( Primitives.class, 1L), "long", MethodOverloadResolver.NUMERIC_SAME_COST); assertExpectedOverload( args( Primitives.class, 1.1f), "float", MethodOverloadResolver.NUMERIC_SAME_COST); assertExpectedOverload( args( Primitives.class, 1.1), "double", MethodOverloadResolver.NUMERIC_SAME_COST); } @Test public void testComplexResolve() { abstract class Complex { public abstract void testmethod(float f); public abstract void testmethod(String s); public abstract void testmethod(JSObject j); } assertExpectedOverload( args( Complex.class, 1), "float", MethodOverloadResolver.NUMERIC_CAST_COST); assertExpectedOverload( args( Complex.class, "1"), "String", MethodOverloadResolver.CLASS_SAME_COST); assertExpectedOverload( args( Complex.class, 1.1f), "float", MethodOverloadResolver.NUMERIC_SAME_COST); // This test is commented out until JSObject can be unit tested (privilege problem) // assertExpectedOverload( // args( Complex.class, new JSObject(0L)), // "JSObject", MethodOverloadResolver.CLASS_SAME_COST); } @Test public void testInheritanceResolve() { class FooParent {} class FooChild extends FooParent {} class FooChildOfChild extends FooChild {} abstract class Inheritance { public abstract void testmethod(FooParent fp); public abstract void testmethod(FooChild fc); } assertExpectedOverload( args( Inheritance.class, new FooParent()), "FooParent", MethodOverloadResolver.CLASS_SAME_COST); assertExpectedOverload( args( Inheritance.class, new FooChild()), "FooChild", MethodOverloadResolver.CLASS_SAME_COST); assertExpectedOverload( args( Inheritance.class, new FooChildOfChild()), "FooChild", MethodOverloadResolver.CLASS_SUPERCLASS_COST); } /* * Test that arrays are casted to strings by using Javascript rules. * Notably, commas have no spacing, and null values are printed as empty strings. */ @Test public void testArrayToStringResolve() { abstract class ArrayAsStringResolve { public abstract void testmethod(String stringRepr); } final Object[] asStringExpectedResult = {"foo,,bar"}; assertExpectedOverload( args( ArrayAsStringResolve.class, (Object) new String[] {"foo", null, "bar"}), asStringExpectedResult, MethodOverloadResolver.ARRAY_CAST_COST); } /* * Test that arrays are casted to other arrays by recursively invoking the * casting rules on each element. */ @Test public void testArrayToArrayResolve() { abstract class IntArrayResolve { public abstract void testmethod(int[] intArray); } // Note that currently, the only array actually received from the Javascript side is // a String[] array, but this may change. final Object[] intArrayExpectedResult = {new int[] {0, 1, 2}}; assertExpectedOverload( args(IntArrayResolve.class, (Object) new String[] {null, "1", "2.1"}), intArrayExpectedResult, MethodOverloadResolver.ARRAY_CAST_COST); assertExpectedOverload( args(IntArrayResolve.class, new int[] {0, 1, 2}), intArrayExpectedResult, MethodOverloadResolver.ARRAY_CAST_COST); assertExpectedOverload( args(IntArrayResolve.class, new double[] {0, 1, 2.1}), intArrayExpectedResult, MethodOverloadResolver.ARRAY_CAST_COST); abstract class NestedArrayResolve { public abstract void testmethod(int[][] nestedArray); } final Object[] nestedArrayExpectedResult = { new int[][] { {1,1}, {2,2} } }; assertExpectedOverload( args(NestedArrayResolve.class, (Object) new String[][] { {"1", "1"}, {"2", "2"} }), nestedArrayExpectedResult, MethodOverloadResolver.ARRAY_CAST_COST); } } icedtea-web-1.8/tests/netx/unit/sun/applet/PaxHeaders.7406/PluginAppletSecurityContextTest.java0000644000000000000000000000013013441742745027616 xustar0030 mtime=1552401893.076832746 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/sun/applet/PluginAppletSecurityContextTest.java0000644000175000002070000002100213441742745030423 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertEquals; import netscape.javascript.JSObject; import org.junit.Test; public class PluginAppletSecurityContextTest { private static PluginAppletSecurityContext dummySecurityContext() { return new PluginAppletSecurityContext(0, false); } @Test public void toIDStringNullTest() { PluginAppletSecurityContext pasc = dummySecurityContext(); assertEquals("literalreturn null", pasc.toObjectIDString(null, Object.class, false)); } @Test public void toIDStringVoidTest() { PluginAppletSecurityContext pasc = dummySecurityContext(); assertEquals("literalreturn void", pasc.toObjectIDString(null, Void.TYPE, false)); assertFalse("literalreturn void".equals(pasc.toObjectIDString(null, Void.class, false))); } @Test public void toIDStringIntegralTest() { // NB: the special .TYPE classes here represent primitives PluginAppletSecurityContext pasc = dummySecurityContext(); // Test both unboxing allowed and not allowed to be sure it doesn't // alter result // although it really shouldn't for (boolean unboxPrimitives : new Boolean[] { false, true }) { assertEquals("literalreturn true", pasc.toObjectIDString( new Boolean(true), Boolean.TYPE, unboxPrimitives)); assertEquals("literalreturn 1", pasc.toObjectIDString(new Byte( (byte) 1), Byte.TYPE, unboxPrimitives)); assertEquals("literalreturn 1", pasc.toObjectIDString( new Character((char) 1), Character.TYPE, unboxPrimitives)); assertEquals("literalreturn 1", pasc.toObjectIDString(new Short( (short) 1), Short.TYPE, unboxPrimitives)); assertEquals("literalreturn 1", pasc.toObjectIDString( new Integer(1), Integer.TYPE, unboxPrimitives)); assertEquals("literalreturn 1", pasc.toObjectIDString(new Long(1), Long.TYPE, unboxPrimitives)); } } @Test public void toIDStringBoxedIntegralNoUnboxingTest() { PluginAppletSecurityContext pasc = dummySecurityContext(); assertFalse("literalreturn true".equals(pasc.toObjectIDString( new Boolean(true), Boolean.class, false))); assertFalse("literalreturn 1".equals(pasc.toObjectIDString(new Byte( (byte) 1), Byte.class, false))); assertFalse("literalreturn 1".equals(pasc.toObjectIDString( new Character((char) 1), Character.class, false))); assertFalse("literalreturn 1".equals(pasc.toObjectIDString(new Short( (short) 1), Short.class, false))); assertFalse("literalreturn 1".equals(pasc.toObjectIDString(new Integer( 1), Integer.class, false))); assertFalse("literalreturn 1".equals(pasc.toObjectIDString(new Long(1), Long.class, false))); } @Test public void toIDStringBoxedIntegralWithUnboxingTest() { PluginAppletSecurityContext pasc = dummySecurityContext(); assertEquals("literalreturn true", pasc.toObjectIDString(new Boolean(true), Boolean.class, true)); assertEquals("literalreturn 1", pasc.toObjectIDString(new Byte((byte) 1), Byte.class, true)); assertEquals("literalreturn 1", pasc.toObjectIDString(new Character( (char) 1), Character.class, true)); assertEquals("literalreturn 1", pasc.toObjectIDString(new Short((short) 1), Short.class, true)); assertEquals("literalreturn 1", pasc.toObjectIDString(new Integer(1), Integer.class, true)); assertEquals("literalreturn 1", pasc.toObjectIDString(new Long(1), Long.class, true)); } @Test public void toIDStringFloatingPoint() { final int prefixLength = "literalreturn ".length(); // NB: the special .TYPE classes here represent primitives PluginAppletSecurityContext pasc = dummySecurityContext(); // Test both unboxing allowed and not allowed to be sure it doesn't // alter result // although it really shouldn't for (boolean unboxPrimitives : new Boolean[] { false, true }) { { final float testFloat = 3.141592f; String idString = pasc.toObjectIDString(new Float(testFloat), Float.TYPE, unboxPrimitives); String floatRepr = idString.substring(prefixLength); assertTrue(testFloat == Float.parseFloat(floatRepr)); } { final double testDouble = 3.141592; String idString = pasc.toObjectIDString(new Double(testDouble), Double.TYPE, unboxPrimitives); String doubleRepr = idString.substring(prefixLength); assertTrue(testDouble == Double.parseDouble(doubleRepr)); } } { final float testFloat = 3.141592f; String idString = pasc.toObjectIDString(new Float(testFloat), Float.class, true); String floatRepr = idString.substring(prefixLength); assertTrue(testFloat == Float.parseFloat(floatRepr)); } { final double testDouble = 3.141592; String idString = pasc.toObjectIDString(new Double(testDouble), Double.class, true); String doubleRepr = idString.substring(prefixLength); assertTrue(testDouble == Double.parseDouble(doubleRepr)); } { final float testFloat = 3.141592f; String idString = pasc.toObjectIDString(new Float(testFloat), Float.class, false); assertFalse(idString.startsWith("literalreturn ")); } { final double testDouble = 3.141592; String idString = pasc.toObjectIDString(new Double(testDouble), Double.class, false); assertFalse(idString.startsWith("literalreturn ")); } } // FIXME: How can we get the permissions to do this? // @Test // public void toIDStringJSObject() { // PluginAppletSecurityContext pasc = dummySecurityContext(); // // long testReference = 1; // assertEquals("literalreturn 1", pasc.toObjectIDString(new JSObject( // testReference), JSObject.class, false)); // } @Test public void toIDStringArbitraryObject() { PluginAppletSecurityContext pasc = dummySecurityContext(); final Object testObject = new Object(); String idString = pasc.toObjectIDString(testObject, testObject.getClass(), false); assertFalse(idString.startsWith("literalreturn")); assertFalse(idString.startsWith("jsobject")); } } icedtea-web-1.8/tests/netx/unit/sun/applet/PaxHeaders.7406/PluginParameterParserTest.java0000644000000000000000000000013013441742745026371 xustar0030 mtime=1552401893.077832744 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/sun/applet/PluginParameterParserTest.java0000644000175000002070000001036113441742745027204 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import static org.junit.Assert.*; import java.util.Map; import net.sourceforge.jnlp.PluginParameters; import org.junit.Test; public class PluginParameterParserTest { @Test public void testIsInt() { assertFalse(PluginParameterParser.isInt("1.0")); assertFalse(PluginParameterParser.isInt("abc")); assertTrue(PluginParameterParser.isInt("1")); /* Numbers that overflow or underflow can cause problems if we * consider them valid, and pass them to parseInt: */ assertFalse(PluginParameterParser.isInt("4294967295")); } @Test public void testUnescapeString() { assertEquals("", PluginParameterParser.unescapeString("")); assertEquals("\n", PluginParameterParser.unescapeString("\n")); assertEquals("\\", PluginParameterParser.unescapeString("\\\\")); assertEquals(";", PluginParameterParser.unescapeString("\\:")); assertEquals("test\n\\;", PluginParameterParser.unescapeString("test" + "\\n" + "\\\\" + "\\:")); assertEquals("start\n;end\\;", PluginParameterParser.unescapeString("start\\n\\:end\\\\;")); } @Test public void testParseEscapedKeyValuePairs() { Map params; params = PluginParameterParser.parseEscapedKeyValuePairs("key1;value1;KEY2\\:;value2\\\\;"); assertEquals(params.size(), 2); assertEquals(params.get("key1"), "value1"); assertEquals(params.get("key2;"), "value2\\"); // ensure key is lowercased params = PluginParameterParser.parseEscapedKeyValuePairs(""); assertEquals(params.size(), 0); params = PluginParameterParser.parseEscapedKeyValuePairs("key;;"); assertEquals(params.size(), 1); assertEquals(params.get("key"), ""); params = PluginParameterParser.parseEscapedKeyValuePairs(";value;"); assertEquals(params.size(), 1); assertEquals(params.get(""), "value"); } @Test public void testAttributeParseWidthHeightAttributes() { final String width = "1", height = "1"; final String codeKeyVal = "code;codeValue;"; PluginParameterParser parser = new PluginParameterParser(); PluginParameters params; params = parser.parse(width, height, codeKeyVal); assertEquals("1", params.get("width")); assertEquals("1", params.get("height")); //Test that width height are defaulted to in case of not-a-number attributes: params = parser.parse(width, height, codeKeyVal + " width;NAN;height;NAN;"); assertEquals("1", params.get("width")); assertEquals("1", params.get("height")); } } icedtea-web-1.8/tests/netx/unit/sun/applet/PaxHeaders.7406/PluginAppletViewerTest.java0000644000000000000000000000013013441742745025703 xustar0030 mtime=1552401893.078832742 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/sun/applet/PluginAppletViewerTest.java0000644000175000002070000002167513441742745026530 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import static org.junit.Assert.assertEquals; import static sun.applet.PluginPipeMockUtil.getPluginStoreId; import static sun.applet.PluginPipeMockUtil.getPluginStoreObject; import java.util.concurrent.Callable; import net.sourceforge.jnlp.AsyncCall; import net.sourceforge.jnlp.ServerAccess; import org.junit.After; import org.junit.Before; import org.junit.Test; import sun.applet.mock.PluginPipeMock; import sun.applet.PluginPipeMockUtil; public class PluginAppletViewerTest { /************************************************************************** * Test setup * **************************************************************************/ PluginPipeMock pipeMock; // Set up before each test @Before public void setupMockedMessageHandling() throws Exception { pipeMock = PluginPipeMockUtil.setupMockedMessageHandling(); } @After public void cleanUpMessageHandlingThreads() throws Exception { PluginPipeMockUtil.cleanUpMockedMessageHandling(pipeMock); } /************************************************************************** * Test cases * * A PluginStreamHandler is installed for each, see 'installPipeMock'. * **************************************************************************/ @Test public void testJavascriptCall() throws Exception { /* JS call parameters */ final int jsObjectID = 0; final String callName = "testfunction"; final Object[] arguments = { "testargument", 1 }; // Arbitrary objects AsyncCall call = AsyncCall.startWithTimeOut(new Callable() { public Object call() { return PluginAppletViewer.call(jsObjectID, callName, arguments); } }); String message = pipeMock.getNextRequest(); Object expectedReturn = new Object(); pipeMock.sendResponse("context 0 reference " + parseAndCheckJSCall(message, jsObjectID, callName, arguments) + " JavaScriptCall " + getPluginStoreId(expectedReturn)); assertEquals(expectedReturn, call.join()); } @Test public void testJavascriptEval() throws Exception { /* JS eval parameters */ final int jsObjectID = 0; final String callName = "testfunction"; AsyncCall call = AsyncCall.startWithTimeOut(new Callable() { public Object call() { return PluginAppletViewer.eval(jsObjectID, callName); } }); String message = pipeMock.getNextRequest(); Object expectedReturn = new Object(); pipeMock.sendResponse("context 0 reference " + parseAndCheckJSEval(message, jsObjectID, callName) + " JavaScriptEval " + getPluginStoreId(expectedReturn)); assertEquals(expectedReturn, call.join()); } @Test public void testJavascriptFinalize() throws Exception { final int jsObjectID = 0; AsyncCall call = AsyncCall.startWithTimeOut(new Callable() { public Void call() { PluginAppletViewer.JavaScriptFinalize(jsObjectID); return null; } }); String message = pipeMock.getNextRequest(); pipeMock.sendResponse("context 0 reference " + parseAndCheckJSFinalize(message, jsObjectID) + " JavaScriptFinalize "); call.join(); } @Test public void testJavascriptToString() throws Exception { final int jsObjectID = 0; AsyncCall call = AsyncCall.startWithTimeOut(new Callable() { public String call() { return PluginAppletViewer.javascriptToString(jsObjectID); } }); String message = pipeMock.getNextRequest(); String expectedReturn = "testreturn"; pipeMock.sendResponse("context 0 reference " + parseAndCheckJSToString(message, jsObjectID) + " JavaScriptToString " + getPluginStoreId(expectedReturn)); assertEquals(expectedReturn, call.join()); } /************************************************************************** * Test utilities * **************************************************************************/ /* * Asserts that the message is a valid javascript request and returns the * reference number */ private static int parseAndCheckJSMessage(String message, int messageLength, String messageType, int contextObjectID) { ServerAccess.logOutputReprint(message); String[] parts = message.split(" "); assertEquals(messageLength, parts.length); assertEquals("instance", parts[0]); assertEquals("0", parts[1]); // JSCall's are prefixed with a dummy '0' instance assertEquals("reference", parts[2]); int reference = Integer.parseInt(parts[3]); assertEquals(messageType, parts[4]); assertEquals(contextObjectID, Integer.parseInt(parts[5])); return reference; } /* * Asserts that the message is a valid javascript request and returns the * reference number */ private static int parseAndCheckJSMessage(String message, String messageType, int contextObjectID, String stringArg, Object[] arguments) { int expectedLength = 7 + arguments.length; int reference = parseAndCheckJSMessage(message, expectedLength, messageType, contextObjectID); String[] parts = message.split(" "); assertEquals(stringArg, getPluginStoreObject(Integer.parseInt(parts[6]))); for (int i = 0; i < arguments.length; i++) { int objectID = Integer.parseInt(parts[7+i]); assertEquals(arguments[i], getPluginStoreObject(objectID)); } return reference; } /* * Asserts that the message is a valid javascript method call request, and * returns the reference number */ public static int parseAndCheckJSCall(String message, int contextObjectID, String callName, Object[] arguments) { return parseAndCheckJSMessage(message, "Call", contextObjectID, callName, arguments); } /* * Asserts that the message is a valid javascript Eval request, and returns * the reference number */ public static int parseAndCheckJSEval(String message, int contextObjectID, String evalString) { return parseAndCheckJSMessage(message, "Eval", contextObjectID, evalString, new Object[] {}); } /* * Asserts that the message is a valid javascript Finalize request, and returns * the reference number */ public static int parseAndCheckJSFinalize(String message, int contextObjectID) { int expectedLength = 6; return parseAndCheckJSMessage(message, expectedLength, "Finalize", contextObjectID); } /* * Asserts that the message is a valid javascript ToString request, and returns * the reference number */ public static int parseAndCheckJSToString(String message, int contextObjectID) { int expectedLength = 6; return parseAndCheckJSMessage(message, expectedLength, "ToString", contextObjectID); } } icedtea-web-1.8/tests/netx/unit/sun/applet/PaxHeaders.7406/PluginProxySelectorTest.java0000644000000000000000000000013013441742745026116 xustar0030 mtime=1552401893.076832746 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/unit/sun/applet/PluginProxySelectorTest.java0000644000175000002070000002112313441742745026727 0ustar00jvanekmock00000000000000/* PluginProxySelectorTest Copyright (C) 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.Proxy.Type; import java.net.URI; import java.net.URISyntaxException; import java.util.List; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPProxySelector; import org.junit.Before; import org.junit.Test; public class PluginProxySelectorTest { private static class TestSelector extends PluginProxySelector { private URI browserResponse = null; private int remoteCallCount = 0; public TestSelector(DeploymentConfiguration config) { super(config); } @Override protected Object getProxyFromRemoteCallToBrowser(String uri) { remoteCallCount++; return browserResponse; } public void setBrowserResponse(URI response) { browserResponse = response; } public int getRemoteCallCount() { return remoteCallCount; } } private String PROXY_HOST = "localhost"; private int PROXY_PORT = 42; private DeploymentConfiguration config; private TestSelector proxySelector; @Before public void setUp() { config = new DeploymentConfiguration(); config.setProperty(DeploymentConfiguration.KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_BROWSER)); proxySelector = new TestSelector(config); } @Test public void testNullResponseFromBrowserMeansNoProxy() throws URISyntaxException { List result = proxySelector.select(new URI("http://example.org")); assertNotNull(result); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } @Test public void testUnrecognizedURIMeansNoProxy() throws URISyntaxException { TestSelector proxySelector = new TestSelector(config); proxySelector.setBrowserResponse(new URI("http://" + PROXY_HOST + ":" + PROXY_PORT)); List result = proxySelector.select(new URI("foo://example.org")); assertNotNull(result); assertEquals(1, result.size()); assertEquals(Proxy.NO_PROXY, result.get(0)); } @Test public void testHttpResponseFromBrowser() throws URISyntaxException { proxySelector.setBrowserResponse(new URI("http://" + PROXY_HOST + ":" + PROXY_PORT)); List result = proxySelector.select(new URI("http://example.org")); Proxy expectedProxy = new Proxy(Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT)); assertNotNull(result); assertEquals(1, result.size()); assertEquals(expectedProxy, result.get(0)); } @Test public void testHttpsResponseFromBrowser() throws URISyntaxException { proxySelector.setBrowserResponse(new URI("https://" + PROXY_HOST + ":" + PROXY_PORT)); List result = proxySelector.select(new URI("https://example.org")); // FIXME if a browser returns a https URI, that does not mean socks Proxy expectedProxy = new Proxy(Type.SOCKS, new InetSocketAddress(PROXY_HOST, PROXY_PORT)); assertNotNull(result); assertEquals(1, result.size()); assertEquals(expectedProxy, result.get(0)); } @Test public void testFtpResponseFromBrowser() throws URISyntaxException { proxySelector.setBrowserResponse(new URI("ftp://" + PROXY_HOST + ":" + PROXY_PORT)); List result = proxySelector.select(new URI("ftp://example.org")); // FIXME if a browser returns a ftp URI, that doesn't mean socks Proxy expectedProxy = new Proxy(Type.SOCKS, new InetSocketAddress(PROXY_HOST, PROXY_PORT)); assertNotNull(result); assertEquals(1, result.size()); assertEquals(expectedProxy, result.get(0)); } @Test public void testSocketResponseFromBrowser() throws URISyntaxException { TestSelector proxySelector = new TestSelector(config); // TODO does firefox actually return a "socks" URI? or a "socket" uri? proxySelector.setBrowserResponse(new URI("socks://" + PROXY_HOST + ":" + PROXY_PORT)); List result = proxySelector.select(new URI("socket://example.org")); Proxy expectedProxy = new Proxy(Type.SOCKS, new InetSocketAddress(PROXY_HOST, PROXY_PORT)); assertNotNull(result); assertEquals(1, result.size()); assertEquals(expectedProxy, result.get(0)); } @Test public void testCacheIsUsedOnRepeatedCalls() throws URISyntaxException { proxySelector.setBrowserResponse(new URI("http://" + PROXY_HOST + ":" + PROXY_PORT)); proxySelector.select(new URI("http://example.org")); proxySelector.select(new URI("http://example.org")); assertEquals(1, proxySelector.getRemoteCallCount()); } @Test public void testCacheIsNotUsedOnDifferentCalls() throws URISyntaxException { proxySelector.setBrowserResponse(new URI("http://" + PROXY_HOST + ":" + PROXY_PORT)); proxySelector.select(new URI("http://foo.example.org")); proxySelector.select(new URI("http://bar.example.org")); assertEquals(2, proxySelector.getRemoteCallCount()); } @Test public void testConvertUriSchemeForProxyQuery() throws Exception { URI[] testUris = { new URI("http", "foo.com", "/bar", null), new URI("https", "foo.com", "/bar", null), new URI("ftp", "foo.com", "/app/res/pub/channel.jar?i=1234", null), new URI("socket", "foo.co.uk", "/bar/pub/ale.jar", null), }; for (URI uri : testUris) { URI result = new URI(PluginProxySelector.convertUriSchemeForProxyQuery(uri)); assertQueryForBrowserProxyUsesHttpFallback(uri, result); String hierarchicalPath = result.getAuthority() + result.getPath(); assertQueryForBrowserProxyContainsNoDoubleSlashes(hierarchicalPath); assertQueryForBrowserProxyDoesNotChangeQuery(uri, result); } } // Test that only HTTP is used as fallback scheme if a protocol other than HTTP(S) or FTP is specified public void assertQueryForBrowserProxyUsesHttpFallback(URI expected, URI result) { if (expected.getScheme().equals("ftp") || expected.getScheme().startsWith("http")) { assertEquals(expected.getScheme(), result.getScheme()); } else { assertEquals(result.getScheme(), "http"); } } // Test that absolute resource paths do not result in double-slashes within the URI public void assertQueryForBrowserProxyContainsNoDoubleSlashes(String uri) { assertFalse(uri.contains("//")); } // Test that the query string of the URI is not changed public void assertQueryForBrowserProxyDoesNotChangeQuery(URI expected, URI result) { assertEquals(expected.getQuery(), result.getQuery()); } } icedtea-web-1.8/tests/netx/PaxHeaders.7406/pac0000644000000000000000000000013113441742745016030 xustar0030 mtime=1552401893.060832779 30 atime=1552410887.112183445 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/pac/0000755000175000002070000000000013441742745016716 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/netx/pac/PaxHeaders.7406/pac-funcs-test.js0000644000000000000000000000013013441742745021276 xustar0030 mtime=1552401893.060832779 29 atime=1552402157.25525344 29 ctime=1552410887.06318356 icedtea-web-1.8/tests/netx/pac/pac-funcs-test.js0000644000175000002070000005703313441742745022120 0ustar00jvanekmock00000000000000 var ICEDTEA_CLASSPATH_ORG_IP = "162.213.1.36"; var CLASSPATH_ORG_IP = "199.232.41.10"; var testsFailed = 0; var testsPassed = 0; print("loading needed files\n"); file = arguments[0] + ""; load(file) print("finished loaded needed files\n"); function main() { testIsPlainHostName(); testDnsDomainIs(); testLocalHostOrDomainIs(); testIsResolvable(); testIsInNet(); testDnsResolve(); testDnsDomainLevels(); testShExpMatch(); testDateRange(); testTimeRange(); testWeekdayRange(); testDateRange2(); testDateRange3(); java.lang.System.out.println("Test results: passed: " + testsPassed + "; failed: " + testsFailed + ";"); } function runTests(name, tests) { var undefined_var; for ( var i = 0; i < tests.length; i++) { runTest(name, tests[i]); } } function runTest(name, test) { var expectedVal = test[0]; var args = test.slice(1); var returnVal; try { returnVal = name.apply(null, args); } catch (e) { returnVal = e; } if (returnVal === expectedVal) { java.lang.System.out.println("Passed: " + name.name + "(" + args.join(", ") + ")"); testsPassed++; } else { java.lang.System.out.println("FAILED: " + name.name + "(" + args.join(", ") + ")"); java.lang.System.out.println(" Expected '" + expectedVal + "' but got '" + returnVal + "'"); testsFailed++; } } function testIsPlainHostName() { var tests = [ [ false, "icedtea.classpath.org" ], [ false, "classpath.org" ], [ true, "org" ], [ true, "icedtea" ], [ false, ".icedtea.classpath.org" ], [ false, "icedtea." ], [ false, "icedtea.classpath." ] ]; runTests(isPlainHostName, tests); } function testDnsDomainIs() { var tests = [ [ true, "icedtea.classpath.org", "icedtea.classpath.org" ], [ true, "icedtea.classpath.org", ".classpath.org" ], [ true, "icedtea.classpath.org", ".org" ], [ false, "icedtea.classpath.org", "icedtea.classpath.com" ], [ false, "icedtea.classpath.org", "icedtea.classpath" ], [ false, "icedtea.classpath", "icedtea.classpath.org" ], [ false, "icedtea", "icedtea.classpath.org" ] ]; runTests(dnsDomainIs, tests); } function testLocalHostOrDomainIs() { var tests = [ [ true, "icedtea.classpath.org", "icedtea.classpath.org" ], [ true, "icedtea", "icedtea.classpath.org" ], [ false, "icedtea.classpath.org", "icedtea.classpath.com" ], [ false, "icedtea.classpath", "icedtea.classpath.org" ], [ false, "foo.classpath.org", "icedtea.classpath.org" ], [ false, "foo", "icedtea.classpath.org" ] ]; runTests(localHostOrDomainIs, tests); } function testIsResolvable() { var tests = [ [ true, "icedtea.classpath.org", "icedtea.classpath.org" ], [ true, "classpath.org" ], [ false, "NotIcedTeaHost" ], [ false, "foobar.classpath.org" ], [ false, "icedtea.classpath.com" ] ]; runTests(isResolvable, tests); } function testIsInNet() { var parts = ICEDTEA_CLASSPATH_ORG_IP.split("\."); var fakeParts = ICEDTEA_CLASSPATH_ORG_IP.split("\."); fakeParts[0] = fakeParts[0] + 1; function createIp(array) { return array[0] + "." + array[1] + "." + array[2] + "." + array[3]; } var tests = [ [ true, "icedtea.classpath.org", ICEDTEA_CLASSPATH_ORG_IP, "255.255.255.255"], [ true, "icedtea.classpath.org", ICEDTEA_CLASSPATH_ORG_IP, "255.255.255.0"], [ true, "icedtea.classpath.org", ICEDTEA_CLASSPATH_ORG_IP, "255.255.0.0"], [ true, "icedtea.classpath.org", ICEDTEA_CLASSPATH_ORG_IP, "255.0.0.0"], [ true, "icedtea.classpath.org", ICEDTEA_CLASSPATH_ORG_IP, "0.0.0.0"], [ true, "icedtea.classpath.org", ICEDTEA_CLASSPATH_ORG_IP, "255.255.255.255"], [ true, "icedtea.classpath.org", ICEDTEA_CLASSPATH_ORG_IP, "0.0.0.0"], [ true, "icedtea.classpath.org", createIp(parts), "255.255.255.255" ], [ false, "icedtea.classpath.org", createIp(fakeParts), "255.255.255.255"], [ false, "icedtea.classpath.org", createIp(fakeParts), "255.255.255.0"], [ false, "icedtea.classpath.org", createIp(fakeParts), "255.255.0.0"], [ false, "icedtea.classpath.org", createIp(fakeParts), "255.0.0.0"], [ true, "icedtea.classpath.org", createIp(fakeParts), "0.0.0.0"] ]; runTests(isInNet, tests); } function testDnsResolve() { var tests = [ [ ICEDTEA_CLASSPATH_ORG_IP, "icedtea.classpath.org" ], //[ CLASSPATH_ORG_IP, "classpath.org" ], [ "127.0.0.1", "localhost" ] ]; runTests(dnsResolve, tests); } function testDnsDomainLevels() { var tests = [ [ 0, "org" ], [ 1, "classpath.org" ], [ 2, "icedtea.classpath.org" ], [ 3, "foo.icedtea.classpath.org" ] ]; runTests(dnsDomainLevels, tests); } function testShExpMatch() { var tests = [ [ true, "icedtea.classpath.org", "icedtea.classpath.org"], [ false, "icedtea.classpath.org", ".org"], [ false, "icedtea.classpath.org", "icedtea."], [ false, "icedtea", "icedtea.classpath.org"], [ true, "icedtea.classpath.org", "*" ], [ true, "icedtea.classpath.org", "*.classpath.org" ], [ true, "http://icedtea.classpath.org", "*.classpath.org" ], [ true, "http://icedtea.classpath.org/foobar/", "*.classpath.org/*" ], [ true, "http://icedtea.classpath.org/foobar/", "*/foobar/*" ], [ true, "http://icedtea.classpath.org/foobar/", "*foobar*" ], [ true, "http://icedtea.classpath.org/foobar/", "*foo*" ], [ false, "http://icedtea.classpath.org/foobar/", "*/foo/*" ], [ false, "http://icedtea.classpath.org/foobar/", "*/foob/*" ], [ false, "http://icedtea.classpath.org/foobar/", "*/fooba/*" ], [ false, "http://icedtea.classpath.org/foo/", "*foobar*" ], [ true, "1", "?" ], [ true, "12", "??" ], [ true, "123", "1?3" ], [ true, "123", "?23" ], [ true, "123", "12?" ], [ true, "1234567890", "??????????" ], [ false, "1234567890", "?????????" ], [ false, "123", "1?1" ], [ false, "123", "??" ], [ true, "http://icedtea.classpath.org/f1/", "*/f?/*" ], [ true, "http://icedtea1.classpath.org/f1/", "*icedtea?.classpath*/f?/*" ], [ false, "http://icedtea.classpath.org/f1/", "*/f2/*" ], [ true, "http://icedtea.classpath.org/f1/", "*/f?/*" ], [ false, "http://icedtea.classpath.org/f1", "f?*"], [ false, "http://icedtea.classpath.org/f1", "f?*"], [ false, "http://icedtea.classpath.org/f1", "f?*"], [ true, "http://icedtea.classpath.org/foobar/", "*.classpath.org/*" ], [ true, "http://icedtea.classpath.org/foobar/", "*.classpath.org/*" ], [ true, "http://icedtea.classpath.org/foobar/", "*.classpath.org/*" ], [ true, "http://icedtea.classpath.org/foo.php?id=bah", "*foo.php*" ], [ false, "http://icedtea.classpath.org/foo_php?id=bah", "*foo.php*" ] ]; runTests(shExpMatch, tests); } function testWeekdayRange() { var today = new Date(); var day = today.getDay(); function dayToStr(day) { switch (day) { case -2: return "FRI"; case -1: return "SAT"; case 0: return "SUN"; case 1: return "MON"; case 2: return "TUE"; case 3: return "WED"; case 4: return "THU"; case 5: return "FRI"; case 6: return "SAT"; case 7: return "SUN"; case 8: return "MON"; default: return "FRI"; } } var tests = [ [ true, dayToStr(day) ], [ false, dayToStr(day+1) ], [ false, dayToStr(day-1) ], ]; runTests(weekdayRange, tests); } /** Returns an array: [day, month, year] */ function incDate() { if ((arguments.length >= 3) && (arguments.length % 2 === 1)) { var date = arguments[0]; var result = date; var index = 1; while (index < arguments.length) { var whichThing = arguments[index]; var by = arguments[index+1]; switch (whichThing) { case 'year': result = new Date(result.getFullYear()+by, result.getMonth(), result.getDate()); break; case 'month': result = new Date(result.getFullYear(), result.getMonth()+by, result.getDate()); break; case 'day': result = new Date(result.getFullYear(), result.getMonth(), result.getDate()+by); break; } index += 2; } return [result.getDate(), result.getMonth(), result.getFullYear()]; } throw "Please call incDate properly"; } function monthToStr(month) { switch (month) { case -1: return "DEC"; case 0: return "JAN"; case 1: return "FEB"; case 2: return "MAR"; case 3: return "APR"; case 4: return "MAY"; case 5: return "JUN"; case 6: return "JUL"; case 7: return "AUG"; case 8: return "SEP"; case 9: return "OCT"; case 10: return "NOV"; case 11: return "DEC"; case 12: return "JAN"; default: throw "Invalid Month" + month; } } function testDateRange() { { var current = new Date(); var date = current.getDate(); var month = current.getMonth(); var year = current.getFullYear(); var today = incDate(current, 'day', 0); var tomorrow = incDate(current, 'day', 1); var yesterday = incDate(current, 'day', -1); runTest(dateRange, [ true, date ]); runTest(dateRange, [ false, tomorrow[0] ]); runTest(dateRange, [ false, yesterday[0] ]); runTest(dateRange, [ true, monthToStr(month) ]); runTest(dateRange, [ false, monthToStr(month+1) ]); runTest(dateRange, [ false, monthToStr(month-1) ]); runTest(dateRange, [ true, year ]); runTest(dateRange, [ false, year - 1]); runTest(dateRange, [ false, year + 1]); runTest(dateRange, [ true, date, date ]); runTest(dateRange, [ true, today[0], tomorrow[0] ]); runTest(dateRange, [ true, yesterday[0], today[0] ]); runTest(dateRange, [ true, yesterday[0], tomorrow[0] ]); runTest(dateRange, [ false, tomorrow[0], yesterday[0] ]); runTest(dateRange, [ false, incDate(current,'day',-2)[0], yesterday[0] ]); runTest(dateRange, [ false, tomorrow[0], incDate(current,'day',2)[0] ]); runTest(dateRange, [ true, monthToStr(month), monthToStr(month) ]); runTest(dateRange, [ true, monthToStr(month), monthToStr(month+1) ]); runTest(dateRange, [ true, monthToStr(month-1), monthToStr(month) ]); runTest(dateRange, [ true, monthToStr(month-1), monthToStr(month+1) ]); runTest(dateRange, [ true, "JAN", "DEC" ]); runTest(dateRange, [ true, "FEB", "JAN" ]); runTest(dateRange, [ true, "DEC", "NOV" ]); runTest(dateRange, [ true, "JUL", "JUN"]); runTest(dateRange, [ false, monthToStr(month+1), monthToStr(month+1) ]); runTest(dateRange, [ false, monthToStr(month-1), monthToStr(month-1) ]); runTest(dateRange, [ false, monthToStr(month+1), monthToStr(month-1) ]); runTest(dateRange, [ true, year, year ]); runTest(dateRange, [ true, year, year+1 ]); runTest(dateRange, [ true, year-1, year ]); runTest(dateRange, [ true, year-1, year+1 ]); runTest(dateRange, [ false, year-2, year-1 ]); runTest(dateRange, [ false, year+1, year+1 ]); runTest(dateRange, [ false, year+1, year+2 ]); runTest(dateRange, [ false, year+1, year-1 ]); runTest(dateRange, [ true, date, monthToStr(month) , date, monthToStr(month) ]); runTest(dateRange, [ true, yesterday[0], monthToStr(yesterday[1]) , date, monthToStr(month) ]); runTest(dateRange, [ false, yesterday[0], monthToStr(yesterday[1]) , yesterday[0], monthToStr(yesterday[1]) ]); runTest(dateRange, [ true, date, monthToStr(month) , tomorrow[0], monthToStr(tomorrow[1]) ]); runTest(dateRange, [ false, tomorrow[0], monthToStr(tomorrow[1]) , tomorrow[0], monthToStr(tomorrow[1]) ]); runTest(dateRange, [ true, yesterday[0], monthToStr(yesterday[1]) , tomorrow[0], monthToStr(tomorrow[1]) ]); runTest(dateRange, [ false, tomorrow[0], monthToStr(tomorrow[1]) , yesterday[0], monthToStr(yesterday[1]) ]); } { var lastMonth = incDate(new Date(), 'month', -1); var thisMonth = incDate(new Date(), 'month', 0); var nextMonth = incDate(new Date(), 'month', +1); runTest(dateRange, [ true, lastMonth[0], monthToStr(lastMonth[1]) , thisMonth[0], monthToStr(thisMonth[1]) ]); runTest(dateRange, [ true, thisMonth[0], monthToStr(thisMonth[1]) , nextMonth[0], monthToStr(nextMonth[1]) ]); runTest(dateRange, [ true, lastMonth[0], monthToStr(lastMonth[1]) , nextMonth[0], monthToStr(nextMonth[1]) ]); var date1 = incDate(new Date(), 'day', +1, 'month', -1); var date2 = incDate(new Date(), 'day', -1, 'month', +1); runTest(dateRange, [ true, date1[0], monthToStr(date1[1]) , nextMonth[0], monthToStr(nextMonth[1]) ]); runTest(dateRange, [ true, lastMonth[0], monthToStr(lastMonth[1]) , date2[0], monthToStr(date2[1]) ]); runTest(dateRange, [ false, nextMonth[0], monthToStr(nextMonth[1]) , lastMonth[0], monthToStr(lastMonth[1]) ]); var date3 = incDate(new Date(), 'day', +1, 'month', +1); var date4 = incDate(new Date(), 'day', +1, 'month', -1); runTest(dateRange, [ false, date3[0], monthToStr(date3[1]) , date4[0], monthToStr(date4[1]) ]); var date5 = incDate(new Date(), 'day', -1, 'month', -1); runTest(dateRange, [ false, date2[0], monthToStr(date2[1]) , date5[0], monthToStr(date5[1]) ]); runTest(dateRange, [ true, 1, "JAN", 31, "DEC" ]); runTest(dateRange, [ true, 2, "JAN", 1, "JAN" ]); var month = new Date().getMonth(); runTest(dateRange, [ false, 1, monthToStr(month+1), 31, monthToStr(month+1) ]); runTest(dateRange, [ false, 1, monthToStr(month-1), 31, monthToStr(month-1) ]); } { var lastMonth = incDate(new Date(), 'month', -1); var thisMonth = incDate(new Date(), 'month', 0); var nextMonth = incDate(new Date(), 'month', +1); runTest(dateRange, [ true, monthToStr(thisMonth[1]), thisMonth[2], monthToStr(thisMonth[1]), thisMonth[2] ]); runTest(dateRange, [ true, monthToStr(lastMonth[1]), lastMonth[2], monthToStr(thisMonth[1]), thisMonth[2] ]); runTest(dateRange, [ true, monthToStr(thisMonth[1]), thisMonth[2], monthToStr(nextMonth[1]), nextMonth[2] ]); runTest(dateRange, [ true, monthToStr(lastMonth[1]), lastMonth[2], monthToStr(nextMonth[1]), nextMonth[2] ]); runTest(dateRange, [ true, monthToStr(0), year, monthToStr(11), year ]); runTest(dateRange, [ false, monthToStr(nextMonth[1]), nextMonth[2], monthToStr(lastMonth[1]), lastMonth[2] ]); runTest(dateRange, [ false, monthToStr(nextMonth[1]), nextMonth[2], monthToStr(nextMonth[1]), nextMonth[2] ]); runTest(dateRange, [ false, monthToStr(lastMonth[1]), lastMonth[2], monthToStr(lastMonth[1]), lastMonth[2] ]); var lastYear = incDate(new Date(), 'year', -1); var nextYear = incDate(new Date(), 'year', +1); runTest(dateRange, [ false, monthToStr(lastYear[1]), lastYear[2], monthToStr(lastMonth[1]), lastMonth[2] ]); runTest(dateRange, [ true, monthToStr(thisMonth[1]), thisMonth[2], monthToStr(nextYear[1]), nextYear[2] ]); var year = new Date().getFullYear(); var month = new Date().getMonth(); runTest(dateRange, [ true, monthToStr(month), year-1, monthToStr(month), year ]); runTest(dateRange, [ true, monthToStr(month), year-1, monthToStr(month), year+1 ]); runTest(dateRange, [ true, monthToStr(0), year, monthToStr(0), year+1 ]); runTest(dateRange, [ true, monthToStr(0), year-1, monthToStr(0), year+1 ]); runTest(dateRange, [ false, monthToStr(0), year-1, monthToStr(11), year-1 ]); runTest(dateRange, [ false, monthToStr(0), year+1, monthToStr(11), year+1 ]); } { var today = incDate(new Date(), 'day', 0); var yesterday = incDate(new Date(), 'day', -1); var tomorrow = incDate(new Date(), 'day', +1); runTest(dateRange, [ true, today[0], monthToStr(today[1]), today[2], today[0], monthToStr(today[1]), today[2] ]); runTest(dateRange, [ true, yesterday[0], monthToStr(yesterday[1]), yesterday[2], tomorrow[0], monthToStr(tomorrow[1]), tomorrow[2] ]); } { var dayLastMonth = incDate(new Date(), 'day', -1, 'month', -1); var dayNextMonth = incDate(new Date(), 'day', +1, 'month', +1); runTest(dateRange, [ true, dayLastMonth[0], monthToStr(dayLastMonth[1]), dayLastMonth[2], dayNextMonth[0], monthToStr(dayNextMonth[1]), dayNextMonth[2] ]); } { var dayLastYear = incDate(new Date(), 'day', -1, 'month', -1, 'year', -1); var dayNextYear = incDate(new Date(), 'day', +1, 'month', +1, 'year', +1); runTest(dateRange, [ true, dayLastYear[0], monthToStr(dayLastYear[1]), dayLastYear[2], dayNextYear[0], monthToStr(dayNextYear[1]), dayNextYear[2] ]); } { var dayLastYear = incDate(new Date(), 'day', +1, 'month', -1, 'year', -1); var dayNextYear = incDate(new Date(), 'day', +1, 'month', +1, 'year', +1); runTest(dateRange, [ true, dayLastYear[0], monthToStr(dayLastYear[1]), dayLastYear[2], dayNextYear[0], monthToStr(dayNextYear[1]), dayNextYear[2] ]); } { var tomorrow = incDate(new Date(), 'day', +1); var dayNextYear = incDate(new Date(), 'day', +1, 'month', +1, 'year', +1); runTest(dateRange, [ false, tomorrow[0], monthToStr(tomorrow[1]), tomorrow[2], dayNextYear[0], monthToStr(dayNextYear[1]), dayNextYear[2] ]); } { var nextMonth = incDate(new Date(), 'month', +1); var nextYear = incDate(new Date(), 'day', +1, 'month', +1, 'year', +1); runTest(dateRange, [ false, nextMonth[0], monthToStr(nextMonth[1]), nextMonth[2], nextYear[0], monthToStr(nextYear[1]), nextYear[2] ]); } { runTest(dateRange, [ true, 1, monthToStr(0), 0, 31, monthToStr(11), 100000 ]); runTest(dateRange, [ true, 1, monthToStr(0), year, 31, monthToStr(11), year ]); runTest(dateRange, [ true, 1, monthToStr(0), year-1, 31, monthToStr(11), year+1 ]); runTest(dateRange, [ false, 1, monthToStr(0), year-1, 31, monthToStr(11), year-1 ]); runTest(dateRange, [ false, 1, monthToStr(0), year+1, 31, monthToStr(11), year+1 ]); } } function testDateRange2() { var dates = [ new Date("January 31, 2011 3:33:33"), new Date("February 28, 2011 3:33:33"), new Date("February 29, 2012 3:33:33"), new Date("March 31, 2011 3:33:33"), new Date("April 30, 2011 3:33:33"), new Date("May 31, 2011 3:33:33"), new Date("June 30, 2011 3:33:33"), new Date("July 31, 2011 3:33:33"), new Date("August 31, 2011 3:33:33"), new Date("September 30, 2011 3:33:33"), new Date("October 31, 2011 3:33:33"), new Date("November 30, 2011 3:33:33"), new Date("December 31, 2011 3:33:33"), ] for (var i = 0; i < dates.length; i++) { var current = dates[i]; var today = incDate(current, 'day', 0); var yesterday = incDate(current, 'day', -1); var tomorrow = incDate(current, 'day', 1); var aYearFromNow = new Date(current.getFullYear()+1, current.getMonth()+1, current.getDate()+1); var later = [aYearFromNow.getDate(), aYearFromNow.getMonth(), aYearFromNow.getFullYear()]; runTest(isDateInRange_internallForIcedTeaWebTesting, [ true, current, today[0], monthToStr(today[1]) , tomorrow[0], monthToStr(tomorrow[1]) ]); runTest(isDateInRange_internallForIcedTeaWebTesting, [ true, current, yesterday[0], monthToStr(yesterday[1]) , tomorrow[0], monthToStr(tomorrow[1]) ]); runTest(isDateInRange_internallForIcedTeaWebTesting, [ true, current, yesterday[0], monthToStr(yesterday[1]), yesterday[2], tomorrow[0], monthToStr(tomorrow[1]), tomorrow[2] ]); runTest(isDateInRange_internallForIcedTeaWebTesting, [ false, current, tomorrow[0], monthToStr(tomorrow[1]), tomorrow[2], later[0], monthToStr(later[1]), later[2] ]); } } function testDateRange3() { var dates = [ new Date("January 1, 2011 1:11:11"), new Date("February 1, 2011 1:11:11"), new Date("March 1, 2011 1:11:11"), new Date("April 1, 2011 1:11:11"), new Date("May 1, 2011 1:11:11"), new Date("June 1, 2011 1:11:11"), new Date("July 1, 2011 1:11:11"), new Date("August 1, 2011 1:11:11"), new Date("September 1, 2011 1:11:11"), new Date("October 1, 2011 1:11:11"), new Date("November 1, 2011 1:11:11"), new Date("December 1, 2011 1:11:11"), ] for (var i = 0; i < dates.length; i++) { var current = dates[i]; var yesterday = incDate(current,'day',-1); var today = incDate(current,'day',0); var tomorrow = incDate(current,'day',1); runTest(isDateInRange_internallForIcedTeaWebTesting, [ true, current, yesterday[0], monthToStr(yesterday[1]) , today[0], monthToStr(today[1]) ]); runTest(isDateInRange_internallForIcedTeaWebTesting, [ true, current, yesterday[0], monthToStr(yesterday[1]) , tomorrow[0], monthToStr(tomorrow[1]) ]); runTest(isDateInRange_internallForIcedTeaWebTesting, [ true, current, yesterday[0], monthToStr(yesterday[1]), yesterday[2], tomorrow[0], monthToStr(tomorrow[1]), tomorrow[2] ]); } } function testTimeRange() { var now = new Date(); var hour = now.getHours(); var min = now.getMinutes(); var sec = now.getSeconds(); function toHour(input) { if (input < 0) { while (input < 0) { input = input + 24; } return (input % 24); } else { return (input % 24); } } function toMin(input) { if (input < 0) { while (input < 0) { input = input + 60; } return (input % 60); } else { return (input % 60); } } tests = [ [ true, hour ], [ false, toHour(hour+1)], [ false, toHour(hour-1)], [ true, hour, hour ], [ true, toHour(hour-1), hour ], [ true, hour, toHour(hour+1)], [ true, toHour(hour-1), toHour(hour+1)], [ true, toHour(hour+1), hour ], [ true, hour, toHour(hour-1) ], [ false, toHour(hour-2), toHour(hour-1)], [ false, toHour(hour+1), toHour(hour+2)], [ false, toHour(hour+1), toHour(hour-1) ], [ true, 0, 23 ], [ true, 12, 11 ], [ true, hour, min, hour, min ], [ true, hour, min, hour, toMin(min+1) ], [ true, hour, toMin(min-1), hour, min ], [ true, hour, toMin(min-1), hour, toMin(min+1) ], [ true, hour, toMin(min+2), hour, toMin(min+1) ], [ false, hour, toMin(min+1), hour, toMin(min+1) ], [ false, hour, toMin(min-1), hour, toMin(min-1) ], [ false, hour, toMin(min+1), hour, toMin(min-1) ], [ true, toHour(hour-1), min, hour, min ], [ true, hour, min, toHour(hour+1), min ], [ true, toHour(hour-1), min, toHour(hour+1), min ], [ true, 0, 0, 23, 59 ], [ true, 0, 1, 0, 0 ], [ true, 0, 1, 0, 0, 0, 0 ], [ true, hour, min, sec, hour, min, sec ], [ true, hour, min, sec, hour, min + 10, sec ], [ true, hour, min, sec - 10, hour, min, sec ], [ true, hour, min, sec, hour, min-1 , sec ], ]; runTests(timeRange, tests); } main(); icedtea-web-1.8/tests/PaxHeaders.7406/junit-runner0000644000000000000000000000013213441742745016750 xustar0030 mtime=1552401893.091832715 30 atime=1552410887.112183445 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/junit-runner/0000755000175000002070000000000013441742745017635 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/junit-runner/PaxHeaders.7406/LessVerboseTextListener.java0000644000000000000000000000013113441742745024476 xustar0030 mtime=1552401893.091832715 29 atime=1552402157.25525344 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/junit-runner/LessVerboseTextListener.java0000644000175000002070000001304313441742745025310 0ustar00jvanekmock00000000000000/* * Copyright 2011 Red Hat, Inc. * * This file is made available under the terms of the Common Public License * v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html */ import java.io.PrintStream; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.Remote; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.internal.JUnitSystem; import org.junit.runner.Description; import org.junit.runner.Result; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; public class LessVerboseTextListener extends RunListener { private PrintStream writer; private boolean testFailed = false; private int totalK2F=0; private int failedK2F=0; private int passedK2F=0; private int ignoredK2F=0; public LessVerboseTextListener(JUnitSystem system) { writer= system.out(); } @Override public void testStarted(Description description) throws Exception { testFailed = false; } @Override public void testIgnored(Description description) throws Exception { writer.println("Ignored: " + description.getClassName() + "." + description.getMethodName()); printK2F(writer, null, description); printRemote(writer, description); } @Override public void testFailure(Failure failure) { testFailed = true; writer.println("FAILED: " + failure.getTestHeader() + " " + failure.getMessage()); printK2F(writer,true,failure.getDescription()); printRemote(writer, failure.getDescription()); } @Override public void testFinished(org.junit.runner.Description description) throws Exception { if (!testFailed) { writer.println("Passed: " + description.getClassName() + "." + description.getMethodName()); printK2F(writer,false,description); printRemote(writer, description); } } @Override public void testRunFinished(Result result) throws Exception { int passed = result.getRunCount() - result.getFailureCount() - result.getIgnoreCount(); int failed = result.getFailureCount(); int ignored = result.getIgnoreCount(); writer.println("Total tests run: "+result.getRunCount()+"; From those : " + totalK2F + " known to fail"); writer.println("Test known to fail: passed: " + passedK2F + "; failed: " + failedK2F + "; ignored: " + ignoredK2F); writer.println("Test results: passed: " + passed + "; failed: " + failed + "; ignored: " + ignored); } private void printK2F(PrintStream writer, Boolean failed, Description description) { try { KnownToFail k2f = getK2F(description); boolean thisTestIsK2F = false; if (k2f != null){ //determine if k2f in the current browser Browsers[] br = k2f.failsIn(); if(0 == br.length){ //@KnownToFail with default optional parameter failsIn={} thisTestIsK2F = true; }else{ for(Browsers b : br){ if(description.toString().contains(b.toString())){ thisTestIsK2F = true; } } } } if( thisTestIsK2F ){ totalK2F++; if (failed != null) { if (failed) { failedK2F++; } else { passedK2F++; } } else { ignoredK2F++; } if (failed != null && !failed) { writer.println(" - WARNING This test is known to fail, but have passed!"); } else { writer.println(" - This test is known to fail"); } } } catch (Exception ex) { ex.printStackTrace(); } } @SuppressWarnings("unchecked") public static T getAnnotation(Class q, String methodName, Class a) { try { if (q != null) { T rem = q.getAnnotation(a); if (rem != null) { return rem; } String qs = methodName; if (qs.contains(" - ")) { qs = qs.replaceAll(" - .*", ""); } Method qm = q.getMethod(qs); if (qm != null) { rem = qm.getAnnotation(a); return rem; } } } catch (Exception ex) { ex.printStackTrace(); } return null; } public static KnownToFail getK2F(Description description) { return getAnnotation(description.getTestClass(), description.getMethodName(), KnownToFail.class); } public static Remote getRemote(Description description) { return getAnnotation(description.getTestClass(), description.getMethodName(), Remote.class); } private void printRemote(PrintStream writer, Description description) { try { Remote rem = getRemote(description); if (rem != null) { writer.println(" - This test is running remote content, note that failures may be caused by broken target application or connection"); } } catch (Exception ex) { ex.printStackTrace(); } } } icedtea-web-1.8/tests/junit-runner/PaxHeaders.7406/CommandLine.java0000644000000000000000000000013113441742745022055 xustar0030 mtime=1552401893.059832781 29 atime=1552402157.25525344 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/junit-runner/CommandLine.java0000644000175000002070000000351113441742745022666 0ustar00jvanekmock00000000000000/* * Copyright 2011 Red Hat, Inc. * Based on code from JUnit * * This file is made available under the terms of the Common Public License * v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html */ import java.io.File; import java.util.ArrayList; import java.util.List; import org.junit.internal.JUnitSystem; import org.junit.internal.RealSystem; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; public class CommandLine extends JUnitCore { public static void main(String... args) { runMainAndExit(new RealSystem(), args); } public static void runMainAndExit(JUnitSystem system, String... args) { new CommandLine().runMain(system, args); System.exit(0); } public Result runMain(JUnitSystem system, String... args) { List> classes = new ArrayList>(); List missingClasses = new ArrayList(); for (String each : args) { try { if (each.contains("$")) continue; if (each.toLowerCase().endsWith(".jnlp")) continue; classes.add(Class.forName(each)); } catch (ClassNotFoundException e) { system.out().println("ERROR: Could not find class: " + each); } } RunListener jXmlOutput = new JunitLikeXmlOutputListener(system, new File("tests-output.xml")); addListener(jXmlOutput); RunListener listener = new LessVerboseTextListener(system); addListener(listener); Result result = run(classes.toArray(new Class[0])); for (Failure each : missingClasses) { result.getFailures().add(each); } return result; } } icedtea-web-1.8/tests/junit-runner/PaxHeaders.7406/README0000644000000000000000000000013113441742745017704 xustar0030 mtime=1552401893.071832756 29 atime=1552402157.25525344 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/junit-runner/README0000644000175000002070000000027213441742745020516 0ustar00jvanekmock00000000000000junit-runner is used to run tests instead of the standard runner org.junit.runner.JUnitCore. It provides output similar to that used by JTreg, which is useful for automated comparison. icedtea-web-1.8/tests/junit-runner/PaxHeaders.7406/JunitLikeXmlOutputListener.java0000644000000000000000000000013113441742745025175 xustar0030 mtime=1552401893.067832765 29 atime=1552402157.25525344 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/junit-runner/JunitLikeXmlOutputListener.java0000644000175000002070000004466713441742745026027 0ustar00jvanekmock00000000000000/* * Copyright 2011 Red Hat, Inc. * * This file is made available under the terms of the Common Public License * v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html */ import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.lang.reflect.Method; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.Arrays; import java.util.concurrent.TimeUnit; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.KnownToFail; import net.sourceforge.jnlp.annotations.Remote; import net.sourceforge.jnlp.browsertesting.Browsers; import org.junit.internal.JUnitSystem; import org.junit.runner.Description; import org.junit.runner.Result; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; /** * This class listens for events in junit testsuite and wrote output to xml. * Xml tryes to follow ant-tests schema, and is enriched for by-class statistics * stdout and err elements are added, but must be filled from elsewhere (eg tee * in make) as junit suite and listener run from our executer have no access to * them. * */ public class JunitLikeXmlOutputListener extends RunListener { private BufferedWriter writer; private Failure testFailed = null; private static final String ROOT = "testsuite"; private static final String DATE_ELEMENT = "date"; private static final String TEST_ELEMENT = "testcase"; private static final String BUGS = "bugs"; private static final String BUG = "bug"; private static final String K2F = "known-to-fail"; private static final String REMOTE = "remote"; private static final String TEST_NAME_ATTRIBUTE = "name"; private static final String TEST_TIME_ATTRIBUTE = "time"; private static final String TEST_IGNORED_ATTRIBUTE = "ignored"; private static final String TEST_ERROR_ELEMENT = "error"; private static final String TEST_CLASS_ATTRIBUTE = "classname"; private static final String ERROR_MESSAGE_ATTRIBUTE = "message"; private static final String ERROR_TYPE_ATTRIBUTE = "type"; private static final String SOUT_ELEMENT = "system-out"; private static final String SERR_ELEMENT = "system-err"; private static final String CDATA_START = ""; private static final String TEST_CLASS_ELEMENT = "class"; private static final String STATS_ELEMENT = "stats"; private static final String CLASSES_ELEMENT = "classes"; private static final String SUMMARY_ELEMENT = "summary"; private static final String SUMMARY_TOTAL_ELEMENT = "total"; private static final String SUMMARY_PASSED_ELEMENT = "passed"; private static final String SUMMARY_FAILED_ELEMENT = "failed"; private static final String SUMMARY_IGNORED_ELEMENT = "ignored"; private long testStart; private int failedK2F=0; private int passedK2F=0; private int ignoredK2F=0; private class ClassStat { Class c; int total; int failed; int passed; int ignored; long time = 0; int totalK2F=0; int failedK2F=0; int passedK2F=0; int ignoredK2F=0; } Map classStats = new HashMap(); public JunitLikeXmlOutputListener(JUnitSystem system, File f) { try { writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "UTF-8")); } catch (Exception ex) { throw new RuntimeException(ex); } } @Override public void testRunStarted(Description description) throws Exception { openElement(ROOT); writeElement(DATE_ELEMENT, new Date().toString()); } private void openElement(String name) throws IOException { openElement(name, null); } private void openElement(String name, Map atts) throws IOException { StringBuilder attString = new StringBuilder(); if (atts != null) { attString.append(" "); Set> entries = atts.entrySet(); for (Entry entry : entries) { String k = entry.getKey(); String v = entry.getValue(); if (v == null) { v = "null"; } attString.append(k).append("=\"").append(attributize(v)).append("\""); attString.append(" "); } } writer.write("<" + name + attString.toString() + ">"); writer.newLine(); } private static String attributize(String s) { return s.replace("&", "&").replace("<", "<").replace("\"", """); } private void closeElement(String name) throws IOException { writer.newLine(); writer.write(""); writer.newLine(); } private void writeContent(String content) throws IOException { writer.write(CDATA_START + content + CDATA_END); } private void writeElement(String name, String content) throws IOException { writeElement(name, content, null); } private void writeElement(String name, String content, Map atts) throws IOException { openElement(name, atts); writeContent(content); closeElement(name); } @Override public void testStarted(Description description) throws Exception { testFailed = null; testStart = System.nanoTime(); } @Override public void testFailure(Failure failure) throws IOException { testFailed = failure; } @Override public void testIgnored(Description description) throws Exception { testDone(description, 0, 0, true); } @Override public void testFinished(org.junit.runner.Description description) throws Exception { long testTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - testStart); double testTimeSeconds = ((double) testTime) / 1000d; testDone(description, testTime, testTimeSeconds, false); } @SuppressWarnings("unchecked") private void testDone(Description description, long testTime, double testTimeSeconds, boolean ignored) throws Exception { Class testClass = null; Method testMethod = null; try { testClass = description.getTestClass(); String qs = description.getMethodName(); //handling @Browser'bugsIds marking of used browser if (qs.contains(" - ")) { qs = qs.replaceAll(" - .*", ""); } testMethod = testClass.getMethod(qs); } catch (Exception ex) { ex.printStackTrace(); } Map testcaseAtts = new HashMap(4); NumberFormat formatter = new DecimalFormat("#0.0000"); String stringedTime = formatter.format(testTimeSeconds); stringedTime.replace(",", "."); testcaseAtts.put(TEST_TIME_ATTRIBUTE, stringedTime); testcaseAtts.put(TEST_CLASS_ATTRIBUTE, description.getClassName()); testcaseAtts.put(TEST_NAME_ATTRIBUTE, description.getMethodName()); if (ignored){ testcaseAtts.put(TEST_IGNORED_ATTRIBUTE, Boolean.TRUE.toString()); } KnownToFail k2f = LessVerboseTextListener.getAnnotation(testClass, testMethod.getName(), KnownToFail.class); boolean thisTestIsK2F = false; Remote remote = LessVerboseTextListener.getAnnotation(testClass, testMethod.getName(), Remote.class); if (k2f != null) { //determine if k2f in the current browser //?? Browsers[] br = k2f.failsIn(); if(0 == br.length){//the KnownToFail annotation without optional parameter thisTestIsK2F = true; }else{ for(Browsers b : br){ if(description.toString().contains(b.toString())){ thisTestIsK2F = true; } } } } if( thisTestIsK2F ) testcaseAtts.put(K2F, Boolean.TRUE.toString()); if (remote != null) { testcaseAtts.put(REMOTE, Boolean.TRUE.toString()); } openElement(TEST_ELEMENT, testcaseAtts); if (testFailed != null) { if (thisTestIsK2F) { failedK2F++; } Map errorAtts = new HashMap(3); errorAtts.put(ERROR_MESSAGE_ATTRIBUTE, testFailed.getMessage()); int i = testFailed.getTrace().indexOf(":"); if (i >= 0) { errorAtts.put(ERROR_TYPE_ATTRIBUTE, testFailed.getTrace().substring(0, i)); } else { errorAtts.put(ERROR_TYPE_ATTRIBUTE, "?"); } writeElement(TEST_ERROR_ELEMENT, testFailed.getTrace(), errorAtts); } else { if (thisTestIsK2F) { if (ignored) { ignoredK2F++; } else { passedK2F++; } } } try { if (testClass != null && testMethod != null) { Bug bug = testMethod.getAnnotation(Bug.class); if (bug != null) { openElement(BUGS); String[] bugsIds = bug.id(); for (String bugId : bugsIds) { String idAndUrl[] = createBug(bugId); Map visibleNameAtt = new HashMap(1); visibleNameAtt.put("visibleName", idAndUrl[0]); openElement(BUG, visibleNameAtt); writer.write(idAndUrl[1]); closeElement(BUG); } closeElement(BUGS); } } } catch (Exception ex) { ex.printStackTrace(); } closeElement(TEST_ELEMENT); writer.flush(); ClassStat classStat = classStats.get(description.getClassName()); if (classStat == null) { classStat = new ClassStat(); classStat.c = description.getTestClass(); classStats.put(description.getClassName(), classStat); } classStat.total++; if (thisTestIsK2F) { classStat.totalK2F++; } classStat.time += testTime; if (testFailed == null) { if (ignored) { classStat.ignored++; if (thisTestIsK2F) { classStat.ignoredK2F++; } } else { classStat.passed++; if (thisTestIsK2F) { classStat.passedK2F++; } } } else { classStat.failed++; if (thisTestIsK2F) { classStat.failedK2F++; } } } @Override @SuppressWarnings("unchecked") public void testRunFinished(Result result) throws Exception { writeElement(SOUT_ELEMENT, "@sout@"); writeElement(SERR_ELEMENT, "@serr@"); openElement(STATS_ELEMENT); openElement(SUMMARY_ELEMENT); int passed = result.getRunCount() - result.getFailureCount() - result.getIgnoreCount(); int failed = result.getFailureCount(); int ignored = result.getIgnoreCount(); writeElement(SUMMARY_TOTAL_ELEMENT, String.valueOf(result.getRunCount()),createKnownToFailSumamryAttribute(failedK2F+passedK2F+ignoredK2F)); writeElement(SUMMARY_FAILED_ELEMENT, String.valueOf(failed),createKnownToFailSumamryAttribute(failedK2F)); writeElement(SUMMARY_IGNORED_ELEMENT, String.valueOf(ignored),createKnownToFailSumamryAttribute(ignoredK2F)); writeElement(SUMMARY_PASSED_ELEMENT, String.valueOf(passed),createKnownToFailSumamryAttribute(passedK2F)); closeElement(SUMMARY_ELEMENT); openElement(CLASSES_ELEMENT); Set> e = classStats.entrySet(); for (Entry entry : e) { Map testcaseAtts = new HashMap(3); testcaseAtts.put(TEST_NAME_ATTRIBUTE, entry.getKey()); testcaseAtts.put(TEST_TIME_ATTRIBUTE, String.valueOf(entry.getValue().time)); openElement(TEST_CLASS_ELEMENT, testcaseAtts); writeElement(SUMMARY_PASSED_ELEMENT, String.valueOf(entry.getValue().passed),createKnownToFailSumamryAttribute(entry.getValue().passedK2F)); writeElement(SUMMARY_FAILED_ELEMENT, String.valueOf(entry.getValue().failed),createKnownToFailSumamryAttribute(entry.getValue().failedK2F)); writeElement(SUMMARY_IGNORED_ELEMENT, String.valueOf(entry.getValue().ignored),createKnownToFailSumamryAttribute(entry.getValue().ignoredK2F)); writeElement(SUMMARY_TOTAL_ELEMENT, String.valueOf(entry.getValue().total),createKnownToFailSumamryAttribute(entry.getValue().totalK2F)); try { Bug b = null; if (entry.getValue().c != null) { b = entry.getValue().c.getAnnotation(Bug.class); } if (b != null) { openElement(BUGS); String[] s = b.id(); for (String string : s) { String ss[] = createBug(string); Map visibleNameAtt = new HashMap(1); visibleNameAtt.put("visibleName", ss[0]); openElement(BUG, visibleNameAtt); writer.write(ss[1]); closeElement(BUG); } closeElement(BUGS); } } catch (Exception ex) { ex.printStackTrace(); } closeElement(TEST_CLASS_ELEMENT); } closeElement(CLASSES_ELEMENT); closeElement(STATS_ELEMENT); closeElement(ROOT); writer.flush(); writer.close(); } public Map createKnownToFailSumamryAttribute(int count) { Map atts = new HashMap(1); atts.put(K2F, String.valueOf(count)); return atts; } /** * When declare for suite class or for Test-marked method, * should be interpreted by report generating tool to links. * Known shortcuts are * SX - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=X * PRX - http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=X * RHX - https://bugzilla.redhat.com/show_bug.cgi?id=X * DX - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=X * GX - http://bugs.gentoo.org/show_bug.cgi?id=X * CAX - http://server.complang.tuwien.ac.at/cgi-bin/bugzilla/show_bug.cgi?id=X * LPX - https://bugs.launchpad.net/bugs/X * * http://mail.openjdk.java.net/pipermail/distro-pkg-dev/ * and http://mail.openjdk.java.net/pipermail/ are proceed differently * * You just put eg @Bug(id="RH12345",id="http:/my.bukpage.com/terribleNew") * and RH12345 will be transalated as * 123456 or * similar, the url will be inclueded as is. Both added to proper tests or suites * * @return Strng[2]{nameToBeShown, hrefValue} */ public static String[] createBug(String string) { String[] r = {"ex", string}; String[] prefixes = { "S", "PR", "RH", "D", "G", "CA", "LP",}; String[] urls = { "http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=", "http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=", "https://bugzilla.redhat.com/show_bug.cgi?id=", "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=", "http://bugs.gentoo.org/show_bug.cgi?id=", "http://server.complang.tuwien.ac.at/cgi-bin/bugzilla/show_bug.cgi?id", "https://bugs.launchpad.net/bugs/",}; for (int i = 0; i < urls.length; i++) { if (string.startsWith(prefixes[i])) { r[0] = string; r[1] = urls[i] + string.substring(prefixes[i].length()); return r; } } String distro = "http://mail.openjdk.java.net/pipermail/distro-pkg-dev/"; String openjdk = "http://mail.openjdk.java.net/pipermail/"; String pushHead = "http://icedtea.classpath.org/hg/"; String pushBranch = "http://icedtea.classpath.org/hg/release/"; if (string.startsWith(distro)) { r[0] = "distro-pkg"; return r; } if (string.startsWith(openjdk)) { r[0] = "openjdk"; return r; } if (string.startsWith(pushBranch)) { r[0] = "push (branch)"; return r; } if (string.startsWith(pushHead)) { r[0] = "push (head)"; return r; } return r; } public static void main(String[] args) { String[] q = createBug("PR608"); System.out.println(q[0] + " : " + q[1]); q = createBug("S4854"); System.out.println(q[0] + " : " + q[1]); q = createBug("RH649423"); System.out.println(q[0] + " : " + q[1]); q = createBug("D464"); System.out.println(q[0] + " : " + q[1]); q = createBug("G6554"); System.out.println(q[0] + " : " + q[1]); q = createBug("CA1654"); System.out.println(q[0] + " : " + q[1]); q = createBug("LP5445"); System.out.println(q[0] + " : " + q[1]); q = createBug("http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2011-November/016178.html"); System.out.println(q[0] + " : " + q[1]); q = createBug("http://mail.openjdk.java.net/pipermail/awt-dev/2012-March/002324.html"); System.out.println(q[0] + " : " + q[1]); q = createBug("http://lists.fedoraproject.org/pipermail/chinese/2012-January/008868.html"); System.out.println(q[0] + " : " + q[1]); q = createBug("http://icedtea.classpath.org/hg/icedtea-web/rev/22b7becd48a7"); System.out.println(q[0] + " : " + q[1]); q = createBug("http://icedtea.classpath.org/hg/release/icedtea-web-1.6/rev/0d9faf51357d"); System.out.println(q[0] + " : " + q[1]); } } icedtea-web-1.8/tests/PaxHeaders.7406/cpp-unit-tests0000644000000000000000000000013213441742745017207 xustar0030 mtime=1552401893.091832715 30 atime=1552410887.112183445 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/0000755000175000002070000000000013441742745020074 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/checked_allocations.cc0000644000000000000000000000013113441742745023550 xustar0030 mtime=1552401893.091832715 29 atime=1552402157.25525344 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/checked_allocations.cc0000644000175000002070000000566013441742745024370 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ // Overrides global 'new' operator with one that does error checking. #include #include #include "checked_allocations.h" // We keep a set of allocations, that, for obvious reasons, does not itself use the 'new' operator. static AllocationSet* __allocations = NULL; // Override global definition of new and delete! void* operator new(size_t size) throw (std::bad_alloc) { if (!__allocations) { // This uses placement-new, which calls the constructor on a specific memory location // This is needed because we cannot call 'new' in this context, nor can we rely on static-initialization // for the set to occur before any call to 'new'! void* memory = malloc(sizeof(AllocationSet)); __allocations = new (memory) AllocationSet(); } void* mem = malloc(size); if (mem == 0) { throw std::bad_alloc(); // ANSI/ISO compliant behavior } __allocations->insert(mem); return mem; } void operator delete(void* ptr) throw () { if (__allocations->erase(ptr)) { free(ptr); } else { printf( "Attempt to free memory with operator 'delete' that was not allocated by 'new'!\n"); CHECK(false); } } int cpp_unfreed_allocations() { return __allocations->size(); } icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/IcedTeaPluginUtilsTest.cc0000644000000000000000000000013113441742745024130 xustar0030 mtime=1552401893.091832715 29 atime=1552402157.25525344 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc0000644000175000002070000003032513441742745024744 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include #include #include #include "browser_mock.h" #include "MemoryLeakDetector.h" #include "IcedTeaPluginUtils.h" #include "IcedTeaNPPlugin.h" void doDebugErrorRun(); TEST(NPVariantAsString) { NPVariant var; STRINGZ_TO_NPVARIANT("test", var); std::string cppstr = IcedTeaPluginUtilities::NPVariantAsString(var); CHECK_EQUAL("test", cppstr); } TEST(NPStringCopy) { std::string cppstr = "test"; NPString npstr = IcedTeaPluginUtilities::NPStringCopy(cppstr); CHECK_EQUAL(4, npstr.UTF8Length); CHECK_EQUAL("test", npstr.UTF8Characters); // NPAPI states that browser allocation function should be used for NPString/NPVariant CHECK_EQUAL(1, browsermock_unfreed_allocations()); browser_functions.memfree((void*) npstr.UTF8Characters); CHECK_EQUAL(0, browsermock_unfreed_allocations()); } TEST(NPVariantStringCopy) { std::string cppstr = "test"; NPVariant npvar = IcedTeaPluginUtilities::NPVariantStringCopy(cppstr); CHECK_EQUAL(NPVariantType_String, npvar.type); CHECK_EQUAL(4, npvar.value.stringValue.UTF8Length); CHECK_EQUAL("test", npvar.value.stringValue.UTF8Characters); CHECK_EQUAL(1, browsermock_unfreed_allocations()); browser_functions.memfree((void*) npvar.value.stringValue.UTF8Characters); CHECK_EQUAL(0, browsermock_unfreed_allocations()); } TEST(NPIdentifierAsString) { const char test_string[] = "foobar"; MemoryLeakDetector leak_detector; /* Ensure destruction */{ std::string str = IcedTeaPluginUtilities::NPIdentifierAsString( browser_functions.getstringidentifier(test_string)); CHECK_EQUAL(test_string, str); } CHECK_EQUAL(0, leak_detector.memory_leaks()); } TEST(trim) { std::string toBeTrimmed = std::string(" testX "); IcedTeaPluginUtilities::trim (toBeTrimmed); CHECK_EQUAL("testX", toBeTrimmed); std::string toBeTrimmed2 = std::string(" \t testX\n"); IcedTeaPluginUtilities::trim (toBeTrimmed2); CHECK_EQUAL("testX", toBeTrimmed2); std::string toBeTrimmed3 = std::string(" \t \n te \n stX\n"); IcedTeaPluginUtilities::trim (toBeTrimmed3); CHECK_EQUAL("te \n stX", toBeTrimmed3); } TEST(unescape1) { std::string toBeEscaped = std::string("he\\\\=llo\\=my=boy\\\\ who :liv\\es in\\: space \\ and \\\\likes\\"); /*he\\=llo\=my=boy\\ who :liv\es in\: space \ and \\likes\ */ IcedTeaPluginUtilities::unescape(toBeEscaped); /* \\= -> \= , \= -> = , \\ -> \ , \e -> \e , \: -> : , \ -> \ , \\ -> \*/ /*he\=llo=my=boy\ who :liv\es in: space \ and \likes\ */ CHECK_EQUAL("he\\=llo=my=boy\\ who :liv\\es in: space \\ and \\likes\\", toBeEscaped); } TEST(unescape2) { std::string toBeEscaped = std::string("w1\\tw2\\\\tw3\\nw4\\\\nw5\\="); /*w1\tw2\\tw3\nw4\\nw5\=*/ IcedTeaPluginUtilities::unescape(toBeEscaped); /*w1TABw2\tw3NWLINEw4\nw5=*/ CHECK_EQUAL("w1\tw2\\tw3\nw4\\nw5=", toBeEscaped); } TEST(unescape3) { std::string toBeEscaped = std::string("w1\\rw2\\\\rw3="); IcedTeaPluginUtilities::unescape(toBeEscaped); CHECK_EQUAL("w1\rw2\\rw3=", toBeEscaped); } /* Creates a temporary file with the specified contents */ static std::string temporary_file(const std::string& contents) { std::string path = tmpnam(NULL); /* POSIX function, fine for test suite */ std::ofstream myfile; myfile.open (path.c_str()); myfile << contents; myfile.close(); return path; } TEST(file_exists) { std::string f1 = temporary_file("dummy content"); bool a = IcedTeaPluginUtilities::file_exists(f1); CHECK_EQUAL(a, true); remove(f1.c_str()); bool b = IcedTeaPluginUtilities::file_exists(f1); CHECK_EQUAL(b, false); std::string dir = tmpnam(NULL); const int PERMISSIONS_MASK = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; // 0755 bool created_dir = g_mkdir(dir.c_str(), PERMISSIONS_MASK); CHECK_EQUAL(created_dir, false); CHECK_EQUAL(IcedTeaPluginUtilities::file_exists(dir), true); } TEST(is_directory) { std::string n = tmpnam(NULL); bool no_file = IcedTeaPluginUtilities::is_directory(n); CHECK_EQUAL(no_file, false); std::string f = temporary_file("dummy content"); bool is_directory = IcedTeaPluginUtilities::is_directory(f); CHECK_EQUAL(is_directory, false); std::string d = tmpnam(NULL); const int PERMISSIONS_MASK = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; // 0755 bool created_test_dir = g_mkdir(d.c_str(), PERMISSIONS_MASK); CHECK_EQUAL(created_test_dir, false); bool is_directory2 = IcedTeaPluginUtilities::is_directory(d); CHECK_EQUAL(is_directory2, true); } TEST(create_dir) { FILE* old1 = stdout; FILE* old2 = stderr; char* buf1 = " "; char* buf2 = " "; stdout = fmemopen (buf1, strlen (buf1), "rw"); stderr = fmemopen (buf2, strlen (buf2), "rw"); std::string f1 = tmpnam(NULL); bool res1 = IcedTeaPluginUtilities::create_dir(f1); CHECK_EQUAL(res1, true); CHECK_EQUAL(IcedTeaPluginUtilities::is_directory(f1), true); std::string f2 = temporary_file("dummy content"); bool res2 = IcedTeaPluginUtilities::create_dir(f2); CHECK_EQUAL(res2, false); CHECK_EQUAL(IcedTeaPluginUtilities::is_directory(f2), false); std::string f3 = tmpnam(NULL); const int PERMISSIONS_MASK = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; // 0755 bool created_test_dir = g_mkdir(f3.c_str(), PERMISSIONS_MASK); CHECK_EQUAL(created_test_dir, false); bool res3 = IcedTeaPluginUtilities::create_dir(f3); CHECK_EQUAL(res3, true); CHECK_EQUAL(IcedTeaPluginUtilities::is_directory(f3), true); std::string f4 = tmpnam(NULL); const int READONLY_PERMISSIONS_MASK = S_IRUSR | S_IRGRP | S_IROTH; // 0444 bool created_test_dir2 = g_mkdir(f4.c_str(), READONLY_PERMISSIONS_MASK); CHECK_EQUAL(created_test_dir2, false); std::string subdir = f4 + "/test"; bool res4 = IcedTeaPluginUtilities::create_dir(subdir); CHECK_EQUAL(res4, false); CHECK_EQUAL(IcedTeaPluginUtilities::is_directory(subdir), false); fclose(stdout); fclose(stderr); stdout = old1; stderr = old2; } void doDebugErrorRun(int max) { FILE* old1 = stdout; FILE* old2 = stderr; char* buf1 = " "; char* buf2 = " "; stdout = fmemopen (buf1, strlen (buf1), "rw"); stderr = fmemopen (buf2, strlen (buf2), "rw"); clock_t begin1, end1; clock_t begin2, end2; int i; std::string hello = std::string("hello"); std::string eello = std::string("eello"); begin1 = clock(); for (i = 0 ; i < max ; i++ ) { PLUGIN_DEBUG("hello \n"); PLUGIN_DEBUG("hello %s\n", hello.c_str()); PLUGIN_DEBUG("hello %d %d\n", 10 , 0.5); PLUGIN_DEBUG("hello %s %s \n", hello.c_str() , hello.c_str()); PLUGIN_DEBUG("hello %s %d %s %d\n", hello.c_str() ,10, hello.c_str(), 0.5); } end1 = clock(); begin2 = clock(); for (i = 0 ; i < max ; i++ ) { PLUGIN_ERROR("eello \n"); PLUGIN_ERROR("eello %s\n", eello.c_str()); PLUGIN_ERROR("eello %d %d\n", 10 , 0.5); PLUGIN_ERROR("eello %s %s \n", eello.c_str() , eello.c_str()); PLUGIN_ERROR("eello %s %d %s %d\n", eello.c_str() ,10, eello.c_str(), 0.5); } end2 = clock(); fclose(stdout); fclose(stderr); stdout = old1; stderr = old2; long time_spent1 = ((end1 - begin1)); long time_spent2 = ((end2 - begin2)); fprintf (stdout, " PLUGIN_DEBUG %d, ", time_spent1); fprintf (stdout, "PLUGIN_ERROR %d\n", time_spent2); } void doDebugErrorRun() { doDebugErrorRun(1000000); } /* *The family of PLUGIN_DEBUG_ERROR_PROFILING tests actually do not test. *It is just messure that the mechanisms around do not break soething fataly. */ TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_on_headers_off) { bool plugin_debug_backup = plugin_debug; bool plugin_debug_headers_backup = plugin_debug_headers; bool plugin_debug_console_backup = plugin_debug_to_console; bool plugin_debug_system_backup = plugin_debug_to_system; plugin_debug_to_console = false; plugin_debug = true; plugin_debug_to_system = false; //no need to torture system log in testing doDebugErrorRun(); plugin_debug = plugin_debug_backup; plugin_debug_headers = plugin_debug_headers_backup; plugin_debug_to_console = plugin_debug_console_backup; plugin_debug_to_system = plugin_debug_system_backup; } TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_off_headers_off) { bool plugin_debug_backup = plugin_debug; bool plugin_debug_headers_backup = plugin_debug_headers; bool plugin_debug_console_backup = plugin_debug_to_console; bool plugin_debug_system_backup = plugin_debug_to_system; plugin_debug_to_console = false; plugin_debug = false; plugin_debug_to_system = false; //no need to torture system log in testing doDebugErrorRun(); plugin_debug = plugin_debug_backup; plugin_debug_headers = plugin_debug_headers_backup; plugin_debug_to_console = plugin_debug_console_backup; plugin_debug_to_system = plugin_debug_system_backup; } TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_on_headers_on) { bool plugin_debug_backup = plugin_debug; bool plugin_debug_headers_backup = plugin_debug_headers; bool plugin_debug_console_backup = plugin_debug_to_console; bool plugin_debug_system_backup = plugin_debug_to_system; plugin_debug_to_console = false; plugin_debug = true; plugin_debug_headers = true; plugin_debug_to_system = false; //no need to torture system log in testing doDebugErrorRun(); plugin_debug = plugin_debug_backup; plugin_debug_headers = plugin_debug_headers_backup; plugin_debug_to_console = plugin_debug_console_backup; plugin_debug_to_system = plugin_debug_system_backup; } TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_off_headers_on) { bool plugin_debug_backup = plugin_debug; bool plugin_debug_headers_backup = plugin_debug_headers; bool plugin_debug_console_backup = plugin_debug_to_console; bool plugin_debug_system_backup = plugin_debug_to_system; plugin_debug_to_console = false; plugin_debug = false; plugin_debug_headers = true; plugin_debug_to_system = false; //no need to torture system log in testing doDebugErrorRun(); plugin_debug = plugin_debug_backup; plugin_debug_headers = plugin_debug_headers_backup; plugin_debug_to_console = plugin_debug_console_backup; plugin_debug_to_system = plugin_debug_system_backup; } TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_on_headers_on_syslog_on) { bool plugin_debug_backup = plugin_debug; bool plugin_debug_headers_backup = plugin_debug_headers; bool plugin_debug_console_backup = plugin_debug_to_console; bool plugin_debug_system_backup = plugin_debug_to_system; plugin_debug_to_console = false; plugin_debug = true; plugin_debug_headers = true; plugin_debug_to_system = true; doDebugErrorRun(50); plugin_debug = plugin_debug_backup; plugin_debug_headers = plugin_debug_headers_backup; plugin_debug_to_console = plugin_debug_console_backup; plugin_debug_to_system = plugin_debug_system_backup; } icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/browser_mock_npidentifier.cc0000644000000000000000000000013113441742745025026 xustar0030 mtime=1552401893.058832783 29 atime=1552402157.25525344 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/browser_mock_npidentifier.cc0000644000175000002070000001123213441742745025636 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include #include "IcedTeaNPPlugin.h" #include "checked_allocations.h" #include "browser_mock_npidentifier.h" struct MockedNPIdentifier_t; // foward declare typedef std::basic_string, SafeAllocator> SafeString; typedef std::map, SafeAllocator> SafeIntToIDMap; typedef std::map, SafeAllocator> SafeStringToIDMap; // Handles creation of NPIdentifier // Carefully avoids operator new so as not to interfere with leak detection. // This mimics browser internal state. struct MockedNPIdentifier_t { SafeString string; int integer; bool is_integer; // If false, it is a string // Carefully avoids operator new so as not to interfere with leak detection static MockedNPIdentifier_t* safe_allocate(SafeString str) { MockedNPIdentifier_t* mem = (MockedNPIdentifier_t*)malloc(sizeof(MockedNPIdentifier_t)); new (&mem->string) SafeString(str); mem->integer = -1; mem->is_integer = false; return mem; } // Carefully avoids operator new so as not to interfere with leak detection static MockedNPIdentifier_t* safe_allocate(int i) { MockedNPIdentifier_t* mem = (MockedNPIdentifier_t*) malloc( sizeof(MockedNPIdentifier_t)); new (&mem->string) SafeString(); mem->integer = i; mem->is_integer = true; return mem; } }; // Mimics global browser data. OK if not cleared in-between tests, does not change semantics. // Used to ensure NPIdentifiers are unique. Never freed. static SafeIntToIDMap __np_int_identifiers; static SafeStringToIDMap __np_string_identifiers; // Carefully avoids operator new so as not to interfere with leak detection NPIdentifier browsermock_getstringidentifier(const NPUTF8* name) { SafeString safe_copy(name); if (__np_string_identifiers.find(safe_copy) == __np_string_identifiers.end()) { __np_string_identifiers[safe_copy] = MockedNPIdentifier_t::safe_allocate(safe_copy); } return __np_string_identifiers[safe_copy]; } // Carefully avoids operator new so as not to interfere with leak detection NPIdentifier browsermock_getintidentifier(int i) { if (__np_int_identifiers.find(i) == __np_int_identifiers.end()) { __np_int_identifiers[i] = MockedNPIdentifier_t::safe_allocate(i); } return __np_int_identifiers[i]; } bool browsermock_identifierisstring(NPIdentifier identifier) { MockedNPIdentifier_t* contents = (MockedNPIdentifier_t*)identifier; return !contents->is_integer; } NPUTF8* browsermock_utf8fromidentifier(NPIdentifier identifier) { MockedNPIdentifier_t* contents = (MockedNPIdentifier_t*)identifier; if (contents->is_integer) { return NULL; } // We expect this string to be freed with 'memfree' NPUTF8* copy = (NPUTF8*) browser_functions.memalloc(contents->string.size() + 1); memcpy(copy, contents->string.c_str(), contents->string.size() + 1); return copy; } icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/IcedTeaNPPluginTest.cc0000644000000000000000000000013113441742745023345 xustar0030 mtime=1552401893.058832783 29 atime=1552402157.25525344 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/IcedTeaNPPluginTest.cc0000644000175000002070000000772313441742745024167 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include #include #include "MemoryLeakDetector.h" #include "IcedTeaNPPlugin.h" #include "IcedTeaScriptablePluginObject.h" #include "IcedTeaPluginUtils.h" TEST(NP_GetMIMEDescription) { std::string MIME_type = NP_GetMIMEDescription(); CHECK(MIME_type.find("application/x-java-applet") != std::string::npos); CHECK(MIME_type.find("application/x-java-vm") != std::string::npos); } /* Not normally exposed */ std::vector* get_jvm_args(); TEST(get_jvm_args) { std::vector* args = get_jvm_args(); CHECK(args != NULL); IcedTeaPluginUtilities::freeStringPtrVector(args); } static IcedTeaScriptableJavaPackageObject* get_scriptable_package_object() { NPP_t instance = { /*Plugin data*/plugin_data_new(), /* Browser data*/0 }; /* Get the packages object (since instance.pdata->is_applet_instance == false) */ NPObject* obj = get_scriptable_object(&instance); /* Make sure we got an IcedTeaScriptableJavaPackageObject */ CHECK(obj->_class->deallocate == IcedTeaScriptableJavaPackageObject::deAllocate); plugin_data_destroy(&instance); return (IcedTeaScriptableJavaPackageObject*)obj; } TEST(get_scriptable_object) { MemoryLeakDetector leak_detector; // We test without an applet context, pending mocking of applet instances. IcedTeaScriptableJavaPackageObject* obj = get_scriptable_package_object(); // Calls get_scriptable_object browser_functions.releaseobject(obj); CHECK(leak_detector.memory_leaks() == 0); } TEST(NP_GetValue) { void* __unused = NULL; gchar* char_value = NULL; /* test plugin name */ { CHECK_EQUAL(NPERR_NO_ERROR, NP_GetValue(__unused, NPPVpluginNameString, &char_value)); CHECK(std::string(char_value).find(PLUGIN_NAME) != std::string::npos); g_free(char_value); char_value = NULL; } /* test plugin desc */ { CHECK_EQUAL(NPERR_NO_ERROR, NP_GetValue(__unused, NPPVpluginDescriptionString, &char_value)); CHECK(std::string(char_value).find("executes Java applets") != std::string::npos); g_free(char_value); char_value = NULL; } /* test plugin unknown */ { printf("NOTE: Next error expected\n"); // the following will print an error message CHECK_EQUAL(NPERR_GENERIC_ERROR, NP_GetValue(__unused, NPPVformValue, &char_value)); g_free(char_value); char_value = NULL; } } icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/main.cc0000644000000000000000000000013113441742745020516 xustar0030 mtime=1552401893.059832781 29 atime=1552402157.25525344 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/main.cc0000644000175000002070000001254213441742745021333 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ // The test runner. // Note that all modules compiled with the TEST macro will append tests to // a global test list, that is accessible via Test::GetTestList(). #include #include #include #include #include "IcedTeaNPPlugin.h" #include "browser_mock.h" #include "MemoryLeakDetector.h" #include "checked_allocations.h" using namespace UnitTest; static std::string full_testname(const TestDetails& details) { std::string suite = details.suiteName; if (suite == "DefaultSuite") { return details.testName; } else { return suite + "." + details.testName; } } // Important for testing purposes of eg leaks between tests static void reset_global_state() { browsermock_clear_state(); MemoryLeakDetector::reset_global_state(); } class IcedteaWebUnitTestReporter: public TestReporter { public: IcedteaWebUnitTestReporter() { // Unfortunately, there is no 'ReportSuccess' // We use 'did_finish_correctly' to track successes did_finish_correctly = false; } virtual void ReportTestStart(const TestDetails& test) { reset_global_state(); pretest_allocs = cpp_unfreed_allocations(); did_finish_correctly = true; } virtual void ReportFailure(const TestDetails& details, char const* failure) { std::string testname = full_testname(details); printf("FAILED: %s line %d (%s)\n", testname.c_str(), details.lineNumber, failure); did_finish_correctly = false; } virtual void ReportTestFinish(const TestDetails& details, float secondsElapsed) { reset_global_state(); int posttest_allocs = cpp_unfreed_allocations(); std::string testname = full_testname(details); if (browsermock_unfreed_allocations() > 0) { printf("*** WARNING: %s has a memory leak! %d more NPAPI allocations than frees!\n", testname.c_str(), browsermock_unfreed_allocations()); } if (posttest_allocs > pretest_allocs) { printf("*** WARNING: %s has a memory leak! %d more operator 'new' allocations than 'delete's!\n", testname.c_str(), posttest_allocs - pretest_allocs); } if (did_finish_correctly) { printf("Passed: %s\n", testname.c_str()); } } virtual void ReportSummary(int totalTestCount, int failedTestCount, int failureCount, float secondsElapsed) { if (failedTestCount > 0) { printf("TEST SUITE FAILURE: Not all tests have passed!\n"); } printf("Total tests run: %d\n", totalTestCount); printf("Test results: passed: %d; failed: %d\n", totalTestCount - failedTestCount, failedTestCount); } private: int pretest_allocs; bool did_finish_correctly; }; static int run_icedtea_web_unit_tests() { IcedteaWebUnitTestReporter reporter; TestRunner runner(reporter); return runner.RunTestsIf(Test::GetTestList(), NULL /*All suites*/, True() /*All tests*/, 0 /*No time limit*/); } /* Spawns the Java-side of the plugin, create request processing threads, * and sets up a mocked 'browser' environment. */ static void initialize_plugin_components() { NPNetscapeFuncs mocked_browser_functions = browsermock_create_table(); NPPluginFuncs unused_plugin_functions; memset(&unused_plugin_functions, 0, sizeof(NPPluginFuncs)); unused_plugin_functions.size = sizeof(NPPluginFuncs); NP_Initialize (&mocked_browser_functions, &unused_plugin_functions); start_jvm_if_needed(); } int main() { initialize_plugin_components(); int exitcode = run_icedtea_web_unit_tests(); return exitcode; } icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/MemoryLeakDetector.h0000644000000000000000000000013213441742745023174 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/MemoryLeakDetector.h0000644000175000002070000000643413441742745024013 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ // Memory leak detection helper class. // This utilizes checked_allocations.h & browser_mock.h to query how many unfreed allocations exist. // As well, it clears global state that is problematic for accurate measure of memory leaks. #ifndef MEMORYLEAKDETECTOR_H_ #define MEMORYLEAKDETECTOR_H_ #include #include "browser_mock.h" #include "checked_allocations.h" #include "IcedTeaPluginUtils.h" class MemoryLeakDetector { public: MemoryLeakDetector() { reset(); } /* Reset allocation counts and certain global state touched by the tests. * This is necessary to ensure accurate leak reporting for some functions. */ void reset() { reset_global_state(); initial_cpp_allocations = cpp_unfreed_allocations(); initial_npapi_allocations = browsermock_unfreed_allocations(); } /* Return allocation counts, after clearing global state that can conflict with the * leak detection. */ int memory_leaks() { reset_global_state(); int cpp_leaks = cpp_unfreed_allocations() - initial_cpp_allocations; int npapi_leaks = browsermock_unfreed_allocations() - initial_npapi_allocations; return cpp_leaks + npapi_leaks; } static void reset_global_state() { /* Clears allocations caused by storeInstanceID */ IcedTeaPluginUtilities::clearInstanceIDs(); /* Clears allocations caused by storeObjectMapping */ IcedTeaPluginUtilities::clearObjectMapping(); /*reset messages*/ reset_pre_init_messages(); } int initial_cpp_allocations; int initial_npapi_allocations; }; #endif /* MEMORYLEAKDETECTOR_H_ */ icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/browser_mock.cc0000644000000000000000000000013213441742745022267 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/browser_mock.cc0000644000175000002070000001164313441742745023104 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ // Browser mock functions. Add more as needed. #include #include #include #include #include "checked_allocations.h" #include "UnitTest++.h" #include "browser_mock.h" #include "browser_mock_npidentifier.h" // 'Browser' global data // Stores NPAPI allocations static AllocationSet __allocations; // Mocked functions // It is expected that these will only run during a unit test static void* mock_memalloc(uint32_t size) { void* mem = malloc(size); __allocations.insert(mem); return mem; } static void mock_memfree(void* ptr) { if (__allocations.erase(ptr)) { free(ptr); } else { printf("Attempt to free memory with browserfunctions.memfree that was not allocated by the browser!\n"); CHECK(false); } } static NPObject* mock_retainobject(NPObject* obj) { obj->referenceCount++; return obj; } static void mock_releaseobject(NPObject* obj) { if (--(obj->referenceCount) == 0) { if (obj->_class->deallocate) { obj->_class->deallocate(obj); } else { mock_memfree(obj); } } } static void mock_releasevariantvalue(NPVariant* variant) { if (variant->type == NPVariantType_String) { /* Only string and object values require freeing */ mock_memfree((void*)variant->value.stringValue.UTF8Characters); } else if (variant->type == NPVariantType_Object) { mock_releaseobject(variant->value.objectValue); } } static NPObject* mock_createobject(NPP instance, NPClass* np_class) { NPObject* obj; if (np_class->allocate) { obj = np_class->allocate(instance, np_class); } else { obj = (NPObject*) mock_memalloc(sizeof(NPObject)); } obj->referenceCount = 1; obj->_class = np_class; return obj; } static bool mock_getproperty(NPP npp, NPObject* obj, NPIdentifier property_name, NPVariant* result) { if (obj->_class->getProperty) { return obj->_class->getProperty(obj, property_name, result); } else { return false; } } static bool mock_setproperty(NPP npp, NPObject* obj, NPIdentifier property_name, const NPVariant* value) { if (obj->_class->setProperty) { return obj->_class->setProperty(obj, property_name, value); } else { return false; } } NPNetscapeFuncs browsermock_create_table() { NPNetscapeFuncs browser_functions; memset(&browser_functions, 0, sizeof(NPNetscapeFuncs)); browser_functions.size = sizeof(NPNetscapeFuncs); browser_functions.memalloc = &mock_memalloc; browser_functions.memfree = &mock_memfree; browser_functions.createobject = &mock_createobject; browser_functions.retainobject = &mock_retainobject; browser_functions.releaseobject = &mock_releaseobject; browser_functions.releasevariantvalue = &mock_releasevariantvalue; browser_functions.setproperty = &mock_setproperty; browser_functions.getproperty = &mock_getproperty; browser_functions.utf8fromidentifier = &browsermock_utf8fromidentifier; browser_functions.getstringidentifier = &browsermock_getstringidentifier; browser_functions.identifierisstring = &browsermock_identifierisstring; return browser_functions; } void browsermock_clear_state() { __allocations.clear(); } int browsermock_unfreed_allocations() { return __allocations.size(); } icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/PluginParametersTest.cc0000644000000000000000000000013213441742745023715 xustar0030 mtime=1552401893.063832773 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/PluginParametersTest.cc0000644000175000002070000000660213441742745024531 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /****************************************************************************** * Unit tests for functions related to sending applet parameters * * (key value pairs). * ******************************************************************************/ #include #include "IcedTeaNPPlugin.h" /* Not normally exposed */ std::string escape_parameter_string(const char* to_encode); TEST(escape_parameter_string) { CHECK_EQUAL("\\n", escape_parameter_string("\n")); CHECK_EQUAL("\\\\", escape_parameter_string("\\")); CHECK_EQUAL("\\:", escape_parameter_string(";")); CHECK_EQUAL(std::string("test") + "\\n" + "\\\\" + "\\:", escape_parameter_string("test\n\\;")); } /* Not normally exposed */ std::string plugin_parameters_string(int argc, char* argn[], char* argv[]); TEST(plugin_parameters_string) { /* test empty */{ const char* argn[] = { "" }; const char* argv[] = { "" }; CHECK_EQUAL("", plugin_parameters_string(0, (char**)argn, (char**)argv)); } /* test simple key & value */{ const char* argn[] = { "key" }; const char* argv[] = { "value" }; CHECK_EQUAL("key;value;", plugin_parameters_string(1, (char**)argn, (char**)argv)); } /* test key & value characters that require escaping */{ const char* argn[] = { "key\\" }; const char* argv[] = { "value;" }; CHECK_EQUAL("key\\\\;value\\:;", plugin_parameters_string(1, (char**)argn, (char**)argv)); } /* multiple key & value pairs that require escaping*/{ const char* argn[] = { "key1\\", "key2\\" }; const char* argv[] = { "value1;", "value2;" }; CHECK_EQUAL("key1\\\\;value1\\:;key2\\\\;value2\\:;", plugin_parameters_string(2, (char**)argn, (char**)argv)); } } icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/checked_allocations.h0000644000000000000000000000013213441742745023413 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/checked_allocations.h0000644000175000002070000000433613441742745024231 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ // Overrides global 'new' operator with one that does error checking. #ifndef CHECKED_ALLOCATIONS_H_ #define CHECKED_ALLOCATIONS_H_ #include #include #include #include #include #include #include //GNU extension // Classes that play nice with custom-defined operator new by using 'vanilla' malloc typedef __gnu_cxx::malloc_allocator SafeAllocator; typedef std::set, SafeAllocator> AllocationSet; int cpp_unfreed_allocations(); #endif /* CHECKED_ALLOCATIONS_H_ */ icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/IcedTeaScriptablePluginObjectTest.cc0000644000000000000000000000013213441742745026250 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc0000644000175000002070000001250113441742745027057 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include #include "browser_mock.h" #include "MemoryLeakDetector.h" #include "IcedTeaScriptablePluginObject.h" #include "IcedTeaPluginUtils.h" static NPP_t dummy_npp = {0,0}; SUITE(IcedTeaScriptablePluginObject) { TEST(destructor) { MemoryLeakDetector leak_detector; IcedTeaScriptablePluginObject* obj = new IcedTeaScriptablePluginObject(&dummy_npp); delete obj; CHECK(leak_detector.memory_leaks() == 0); } } SUITE(IcedTeaScriptableJavaObject) { TEST(deallocate) { MemoryLeakDetector leak_detector; IcedTeaScriptableJavaObject* obj = new IcedTeaScriptableJavaObject(&dummy_npp); IcedTeaScriptableJavaObject::deAllocate(obj); CHECK(leak_detector.memory_leaks() == 0); } TEST(get_scriptable_java_object) { MemoryLeakDetector leak_detector; NPObject* first_obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(&dummy_npp, "DummyClass", "DummyInstance", false); browser_functions.releaseobject(first_obj); /* After the first call, the object should be cached in the object map */ NPObject* second_obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(&dummy_npp, "DummyClass", "DummyInstance", false); /* Objects should be the same, because of caching */ CHECK(first_obj == second_obj); browser_functions.releaseobject(second_obj); CHECK(leak_detector.memory_leaks() == 0); } } SUITE(IcedTeaScriptableJavaPackageObject) { TEST(deallocate) { MemoryLeakDetector leak_detector; IcedTeaScriptableJavaPackageObject* obj = new IcedTeaScriptableJavaPackageObject(&dummy_npp); IcedTeaScriptableJavaPackageObject::deAllocate(obj); CHECK(leak_detector.memory_leaks() == 0); } TEST(get_scriptable_java_object) { MemoryLeakDetector leak_detector; NPObject* obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(&dummy_npp, "DummyPackage"); browser_functions.releaseobject(obj); CHECK(leak_detector.memory_leaks() == 0); } static NPVariant np_checked_get(NPObject* obj, const char* identifier) { NPVariant result; CHECK(browser_functions.getproperty(&dummy_npp, obj, browser_functions.getstringidentifier(identifier), &result)); return result; } /* NOTICE: Requires icedtea-web Java-side to be running! * Loads java.lang.Integer.MAX_VALUE */ TEST(getProperty) { MemoryLeakDetector leak_detector; /* Ensure destruction */{ /* Get the 'root' package */ NPObject* obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(&dummy_npp, ""); // Look up java.lang.Integer.MAX_VALUE NPVariant java_result = np_checked_get(obj, "java"); NPVariant lang_result = np_checked_get(NPVARIANT_TO_OBJECT(java_result), "lang"); NPVariant integer_result = np_checked_get(NPVARIANT_TO_OBJECT(lang_result), "Integer"); NPVariant max_value_result = np_checked_get(NPVARIANT_TO_OBJECT(integer_result), "MAX_VALUE"); // Check that it is indeed equal to 2147483647 CHECK(NPVARIANT_IS_INT32(max_value_result)); CHECK_EQUAL(2147483647, NPVARIANT_TO_INT32(max_value_result)); browser_functions.releasevariantvalue(&java_result); browser_functions.releasevariantvalue(&lang_result); browser_functions.releasevariantvalue(&integer_result); browser_functions.releasevariantvalue(&max_value_result); browser_functions.releaseobject(obj); } CHECK(leak_detector.memory_leaks() == 0); } } icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/browser_mock_npidentifier.h0000644000000000000000000000013213441742745024671 xustar0030 mtime=1552401893.066832766 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/browser_mock_npidentifier.h0000644000175000002070000000453413441742745025507 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /* * browser_mock_npidentifier.h: * Handles NPAPI functions related to NPIdentifier, NPIdentifier has the following constraints: * - Unique for each integer & string * - Should not interfere with leak detection, so use malloc-based allocators (specified by templates) everywhere. */ #ifndef __BROWSER_MOCK_NPIDENTIFIER_H__ #define __BROWSER_MOCK_NPIDENTIFIER_H__ #include #include NPIdentifier browsermock_getstringidentifier(const NPUTF8* name); NPIdentifier browsermock_getintidentifier(int i); bool browsermock_identifierisstring(NPIdentifier identifier); NPUTF8* browsermock_utf8fromidentifier(NPIdentifier identifier); #endif // __BROWSER_MOCK_NPIDENTIFIER_H__ icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/IcedTeaParsePropertiesTest.cc0000644000000000000000000000013213441742745025001 xustar0030 mtime=1552401893.066832766 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/IcedTeaParsePropertiesTest.cc0000644000175000002070000004043613441742745025620 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "IcedTeaParseProperties.h" using namespace std; //not exposed via IcedTeaParseProperties but needed extern void remove_all_spaces(string& str); extern bool get_property_value(string c, string& dest); extern bool starts_with(string c1, string c2); extern string user_properties_file(); extern string main_properties_file(); extern string default_java_properties_file(); //for passing three dummy files bool find_system_config_file(string main_file, string custom_jre_file, bool usecustom_jre, string default_java_file, string& dest); bool find_property(string filename, string property, string& dest); //for passing two dummy files bool read_deploy_property_value(string user_file, string system_file, bool usesystem_file, string property, string& dest); //for passing two dummy files bool find_custom_jre(string user_file, string main_file,string& dest); //end of non-public IcedTeaParseProperties api /* Creates a temporary file with the specified contents */ static string temporary_file(const string& contents) { string path = tmpnam(NULL); /* POSIX function, fine for test suite */ ofstream myfile; myfile.open (path.c_str()); myfile << contents; myfile.close(); return path; } /*private api fundamental tests*/ TEST(RemoveAllSpaces) { string toBeTrimmed = string(" te st X "); remove_all_spaces (toBeTrimmed); CHECK_EQUAL("testX", toBeTrimmed); string toBeTrimmed1 = string(" te st X "); remove_all_spaces (toBeTrimmed1); CHECK_EQUAL("testX", toBeTrimmed1); string toBeTrimmed2 = string(" \t t e\nst\tX\n"); remove_all_spaces (toBeTrimmed2); CHECK_EQUAL("testX", toBeTrimmed2); string toBeTrimmed3 = string(" \t \n te \n stX\n"); remove_all_spaces (toBeTrimmed3); CHECK_EQUAL("testX", toBeTrimmed3); } TEST(get_property_value) { string dest = string(""); bool a = get_property_value("key.key=value+eulav ",dest); CHECK_EQUAL("value+eulav", dest); CHECK_EQUAL(a, true); dest = string(""); a = get_property_value("horrible key = value/value",dest); CHECK_EQUAL("value/value", dest); CHECK_EQUAL(a, true); dest = string(""); a = get_property_value("better.key = but very horrible value ",dest); CHECK_EQUAL("but very horrible value", dest); CHECK_EQUAL(a, true); dest = string(""); a = get_property_value("better.key but errornous value ",dest); CHECK_EQUAL("", dest); CHECK_EQUAL(a, false); dest = string(""); a = get_property_value("key=nice\\=value=\\\\=with\\tescapes",dest); CHECK_EQUAL("nice=value=\\=with\tescapes", dest); CHECK_EQUAL(a, true); } TEST(starts_with) { bool a = starts_with("aa bb cc","aa b"); CHECK_EQUAL(a, true); a = starts_with("aa bb cc","aab"); CHECK_EQUAL(a, false); } TEST(user_properties_file) { string f = user_properties_file(); CHECK_EQUAL(f.find(".icedtea") >= 0, true); CHECK_EQUAL(f.find(default_file_ITW_deploy_props_name) >= 0, true); } TEST(main_properties_file) { string f = main_properties_file(); CHECK_EQUAL(f.find(default_file_ITW_deploy_props_name) >= 0, true); CHECK_EQUAL(f.find(".java") >= 0, true); } TEST(default_java_properties_file) { string f = default_java_properties_file(); CHECK_EQUAL(f.find(default_file_ITW_deploy_props_name) >= 0, true); CHECK_EQUAL(f.find("lib") >= 0, true); } TEST(find_system_config_file) { string f1 = temporary_file("key1=value1"); string f2 = temporary_file("key2=value2"); string f3 = temporary_file("key3=value3"); string dest=string(""); find_system_config_file(f1, f2, true, f3, dest); CHECK_EQUAL(f1, dest); dest=string(""); find_system_config_file(f1, f2, false, f3, dest); CHECK_EQUAL(f1, dest); remove(f1.c_str()); dest=string(""); find_system_config_file(f1, f2, true, f3, dest); CHECK_EQUAL(f2, dest); dest=string(""); find_system_config_file(f1, f2, false, f3, dest); CHECK_EQUAL(f3, dest); remove(f2.c_str()); dest=string(""); find_system_config_file(f1, f2, true, f3, dest); CHECK_EQUAL("", dest); //forcing not existing f2 dest=string(""); find_system_config_file(f1, f2, false, f3, dest); CHECK_EQUAL(f3, dest); remove(f3.c_str()); dest=string(""); find_system_config_file(f1, f2, true, f3, dest); CHECK_EQUAL("", dest); dest=string(""); find_system_config_file(f1, f2, true, f3, dest); CHECK_EQUAL("", dest); } TEST(find_property) { string f1 = temporary_file("key1=value1"); string dest=string(""); find_property(f1, "key1", dest); CHECK_EQUAL("value1", dest); dest=string(""); find_property(f1, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); find_property(f1, "value1", dest); CHECK_EQUAL("", dest); remove(f1.c_str()); string f2 = temporary_file("key2 =value2 key3=value3\n key5 = value5"); dest=string(""); find_property(f2, "key2", dest); CHECK_EQUAL("value2 key3=value3", dest); dest=string(""); find_property(f2, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); find_property(f2, "key3", dest); CHECK_EQUAL("", dest); dest=string(""); find_property(f2, "key5", dest); CHECK_EQUAL("value5", dest); remove(f2.c_str()); string f3 = temporary_file("ke.y3= value3\nkey4=value4"); dest=string(""); find_property(f3, "ke.y3", dest); CHECK_EQUAL("value3", dest); dest=string(""); find_property(f3, "key4", dest); CHECK_EQUAL("value4", dest); remove(f3.c_str()); } TEST(read_deploy_property_value1) { string f1 = temporary_file("key1=value11"); string f2 = temporary_file("key1=value12"); string f3 = temporary_file("key2=value23"); string dest=string(""); read_deploy_property_value(f1,f2,true, "key1", dest); CHECK_EQUAL("value11", dest); dest=string(""); read_deploy_property_value(f2,f1,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f3,true, "key1", dest); CHECK_EQUAL("value11", dest); dest=string(""); read_deploy_property_value(f3,f1,true, "key1", dest); CHECK_EQUAL("value11", dest); read_deploy_property_value(f3,f2,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f2,f3,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f2,true, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f1,true, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f1,f3,true, "key2", dest); CHECK_EQUAL("value23", dest); dest=string(""); read_deploy_property_value(f3,f1,true, "key2", dest); CHECK_EQUAL("value23", dest); read_deploy_property_value(f3,f2,true, "key2", dest); CHECK_EQUAL("value23", dest); dest=string(""); read_deploy_property_value(f2,f3,true, "key2", dest); CHECK_EQUAL("value23", dest); remove(f1.c_str());///////////////////////////////// dest=string(""); read_deploy_property_value(f1,f2,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f2,f1,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f3,true, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f3,f1,true, "key1", dest); CHECK_EQUAL("", dest); read_deploy_property_value(f3,f2,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f2,f3,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f2,true, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f1,true, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f1,f3,true, "key2", dest); CHECK_EQUAL("value23", dest); dest=string(""); read_deploy_property_value(f3,f1,true, "key2", dest); CHECK_EQUAL("value23", dest); read_deploy_property_value(f3,f2,true, "key2", dest); CHECK_EQUAL("value23", dest); dest=string(""); read_deploy_property_value(f2,f3,true, "key2", dest); CHECK_EQUAL("value23", dest); remove(f3.c_str());///////////////////////////////// dest=string(""); read_deploy_property_value(f1,f2,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f2,f1,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f3,true, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f3,f1,true, "key1", dest); CHECK_EQUAL("", dest); read_deploy_property_value(f3,f2,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f2,f3,true, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f2,true, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f1,true, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f1,f3,true, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f3,f1,true, "key2", dest); CHECK_EQUAL("", dest); read_deploy_property_value(f3,f2,true, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f3,true, "key2", dest); CHECK_EQUAL("", dest); remove(f2.c_str());///////////////////////////////// } TEST(read_deploy_property_value2) { string f1 = temporary_file("key1=value11"); string f2 = temporary_file("key1=value12"); string f3 = temporary_file("key2=value23"); string dest=string(""); read_deploy_property_value(f1,f2,false, "key1", dest); CHECK_EQUAL("value11", dest); dest=string(""); read_deploy_property_value(f2,f1,false, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f3,false, "key1", dest); CHECK_EQUAL("value11", dest); dest=string(""); read_deploy_property_value(f3,f1,false, "key1", dest); CHECK_EQUAL("", dest); read_deploy_property_value(f3,f2,false, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f3,false, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f2,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f1,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f1,f3,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f3,f1,false, "key2", dest); CHECK_EQUAL("value23", dest); read_deploy_property_value(f3,f2,false, "key2", dest); CHECK_EQUAL("value23", dest); dest=string(""); read_deploy_property_value(f2,f3,false, "key2", dest); CHECK_EQUAL("", dest); remove(f1.c_str());///////////////////////////////// dest=string(""); read_deploy_property_value(f1,f2,false, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f1,false, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f3,false, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f3,f1,false, "key1", dest); CHECK_EQUAL("", dest); read_deploy_property_value(f3,f2,false, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f3,false, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f2,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f1,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f1,f3,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f3,f1,false, "key2", dest); CHECK_EQUAL("value23", dest); read_deploy_property_value(f3,f2,false, "key2", dest); CHECK_EQUAL("value23", dest); dest=string(""); read_deploy_property_value(f2,f3,false, "key2", dest); CHECK_EQUAL("", dest); remove(f3.c_str());///////////////////////////////// dest=string(""); read_deploy_property_value(f1,f2,false, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f1,false, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f3,false, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f3,f1,false, "key1", dest); CHECK_EQUAL("", dest); read_deploy_property_value(f3,f2,false, "key1", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f3,false, "key1", dest); CHECK_EQUAL("value12", dest); dest=string(""); read_deploy_property_value(f1,f2,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f1,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f1,f3,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f3,f1,false, "key2", dest); CHECK_EQUAL("", dest); read_deploy_property_value(f3,f2,false, "key2", dest); CHECK_EQUAL("", dest); dest=string(""); read_deploy_property_value(f2,f3,false, "key2", dest); CHECK_EQUAL("", dest); remove(f2.c_str());///////////////////////////////// } TEST(find_custom_jre) { string f1 = temporary_file(custom_jre_key+"=value11"); string f2 = temporary_file(custom_jre_key+"=value12"); string f3 = temporary_file("key2=value23"); string f4 = temporary_file("key2=value24"); string dest=string(""); find_custom_jre(f1,f2, dest); CHECK_EQUAL("value11", dest); dest=string(""); find_custom_jre(f2,f1, dest); CHECK_EQUAL("value12", dest); dest=string(""); find_custom_jre(f1,f3, dest); CHECK_EQUAL("value11", dest); dest=string(""); find_custom_jre(f3,f1, dest); CHECK_EQUAL("value11", dest); dest=string(""); find_custom_jre(f3,f4, dest); CHECK_EQUAL("", dest); remove(f1.c_str());///////////////////////////////// dest=string(""); find_custom_jre(f1,f2, dest); CHECK_EQUAL("value12", dest); dest=string(""); find_custom_jre(f2,f1, dest); CHECK_EQUAL("value12", dest); dest=string(""); find_custom_jre(f1,f3, dest); CHECK_EQUAL("", dest); dest=string(""); find_custom_jre(f3,f1, dest); CHECK_EQUAL("", dest); remove(f3.c_str());///////////////////////////////// dest=string(""); find_custom_jre(f1,f2, dest); CHECK_EQUAL("value12", dest); dest=string(""); find_custom_jre(f2,f1, dest); CHECK_EQUAL("value12", dest); dest=string(""); find_custom_jre(f1,f3, dest); CHECK_EQUAL("", dest); dest=string(""); find_custom_jre(f3,f1, dest); CHECK_EQUAL("", dest); remove(f2.c_str());///////////////////////////////// dest=string(""); find_custom_jre(f1,f2, dest); CHECK_EQUAL("", dest); dest=string(""); find_custom_jre(f2,f1, dest); CHECK_EQUAL("", dest); dest=string(""); find_custom_jre(f1,f3, dest); CHECK_EQUAL("", dest); dest=string(""); find_custom_jre(f3,f1, dest); CHECK_EQUAL("", dest); remove(f4.c_str());///////////////////////////////// } icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/browser_mock.h0000644000000000000000000000013213441742745022131 xustar0030 mtime=1552401893.060832779 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/browser_mock.h0000644000175000002070000000423413441742745022744 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ // Browser mock functions. // This sets up a mock for unit testing purposes that puts simple // functions in the 'browserfunctions' table. This enables unit testing // of some functions that would otherwise not be possible. // Add additional mock functions in browser_mock.cc as needed #ifndef __BROWSER_MOCK_H__ #define __BROWSER_MOCK_H__ #include NPNetscapeFuncs browsermock_create_table(); void browsermock_clear_state(); int browsermock_unfreed_allocations(); #endif // __BROWSER_MOCK_H__ icedtea-web-1.8/tests/cpp-unit-tests/PaxHeaders.7406/IcedTeaJavaRequestProcessorTest.cc0000644000000000000000000000013213441742745026004 xustar0030 mtime=1552401893.060832779 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/cpp-unit-tests/IcedTeaJavaRequestProcessorTest.cc0000644000175000002070000003526213441742745026624 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include #include #include #include #include "MemoryLeakDetector.h" #include "IcedTeaJavaRequestProcessor.h" /****************************************************************************** * Simple helper methods to keep the tests clean. * ******************************************************************************/ static const char* TEST_SOURCE = "[System]"; static std::string checked_return(JavaResultData* result) { CHECK(!result->error_occurred); return *result->return_string; } // Packages static bool jrp_has_package(std::string package_name) { JavaRequestProcessor processor; JavaResultData* result = processor.hasPackage(0, package_name); CHECK(!result->error_occurred); return (result->return_identifier != 0); } // Classes static std::string jrp_find_class(std::string name) { return checked_return( JavaRequestProcessor().findClass(0, name) ); } // Object creation static std::string jrp_new_object_with_constructor(std::string class_id, std::string method_id, std::vector args = std::vector()) { return checked_return( JavaRequestProcessor().newObjectWithConstructor(TEST_SOURCE, class_id, method_id, args) ); } static std::string jrp_new_array(std::string class_id, std::string len) { return checked_return( JavaRequestProcessor().newArray(class_id, len) ); } static std::string jrp_new_string(std::string str) { return checked_return( JavaRequestProcessor().newString(str) ); } static std::string jrp_new_object(std::string class_id, std::vector args = std::vector()) { return checked_return( JavaRequestProcessor().newObject(TEST_SOURCE, class_id, args) ); } static std::string jrp_get_value(std::string object_id) { return checked_return( JavaRequestProcessor().getValue(object_id) ); } // Inheritance static bool jrp_is_instance_of(std::string object_id, std::string class_id) { JavaRequestProcessor processor; JavaResultData* result = processor.isInstanceOf(object_id, class_id); CHECK(!result->error_occurred); return (result->return_identifier != 0); } // Java methods operations. static std::string jrp_get_method_id(std::string class_id, std::string method_name, std::vector args = std::vector()) { return checked_return( JavaRequestProcessor().getMethodID(class_id, browser_functions.getstringidentifier(method_name.c_str()), args) ); } static std::string jrp_get_static_method_id(std::string class_id, std::string method_name, std::vector args = std::vector()) { return checked_return( JavaRequestProcessor().getStaticMethodID(class_id, browser_functions.getstringidentifier(method_name.c_str()), args) ); } static std::string jrp_call_method(std::string object_id, std::string method_name, std::vector args = std::vector()) { return checked_return( JavaRequestProcessor().callMethod(TEST_SOURCE, object_id, method_name, args) ); } static std::string jrp_call_static_method(std::string class_id, std::string method_name, std::vector args = std::vector()) { return checked_return( JavaRequestProcessor().callStaticMethod(TEST_SOURCE, class_id, method_name, args) ); } static std::string jrp_get_string(std::string object_id) { return checked_return( JavaRequestProcessor().getString(object_id) ); } static std::string jrp_get_class_id(std::string object_id) { return checked_return( JavaRequestProcessor().getClassID(object_id) ); } // Java field operations. static std::string jrp_get_field(std::string object_id, std::string field_name) { return checked_return( JavaRequestProcessor().getField(TEST_SOURCE, jrp_get_class_id(object_id), object_id, field_name) ); } static std::string jrp_get_field_id(std::string class_id, std::string field_name) { return checked_return( JavaRequestProcessor().getFieldID(class_id, field_name) ); } static std::string jrp_get_static_field_id(std::string class_id, std::string field_name) { return checked_return( JavaRequestProcessor().getStaticFieldID(class_id, field_name) ); } static std::string jrp_get_static_field(std::string class_id, std::string field_name) { return checked_return( JavaRequestProcessor().getStaticField(TEST_SOURCE, class_id, field_name) ); } static std::string jrp_set_field(std::string object_id, std::string field_name, std::string value_id) { return checked_return( JavaRequestProcessor().setField(TEST_SOURCE, jrp_get_class_id(object_id), object_id, field_name, value_id) ); } static std::string jrp_set_static_field(std::string class_id, std::string field_name, std::string value_id) { return checked_return( JavaRequestProcessor().setStaticField(TEST_SOURCE, class_id, field_name, value_id) ); } // Java array operations. static std::string jrp_set_slot(std::string object_id, std::string index, std::string value_id) { return checked_return( JavaRequestProcessor().setSlot(object_id, index, value_id) ); } static std::string jrp_get_slot(std::string object_id, std::string index) { return checked_return( JavaRequestProcessor().getSlot(object_id, index) ); } static std::string jrp_get_array_length(std::string object_id) { return checked_return( JavaRequestProcessor().getArrayLength(object_id) ); } // Result of toString() static std::string jrp_get_to_string_value(std::string object_id) { return checked_return( JavaRequestProcessor().getToStringValue(object_id) ); } /****************************************************************************** * Compound helper methods. * ******************************************************************************/ static NPP_t dummy_npp = {0,0}; static std::string create_java_integer(int value) { // Prepare a java integer object with the value 1 NPVariant integer_variant; std::string integer_id; INT32_TO_NPVARIANT(value, integer_variant); createJavaObjectFromVariant(&dummy_npp, integer_variant, &integer_id); return integer_id; } static std::string create_null() { // Prepare a null object NPVariant null_variant; std::string null_id; NULL_TO_NPVARIANT(null_variant); createJavaObjectFromVariant(&dummy_npp, null_variant, &null_id); return null_id; } static NPVariant java_result_to_variant(std::string object_id) { NPVariant variant; IcedTeaPluginUtilities::javaResultToNPVariant(&dummy_npp, &object_id, &variant); return variant; } /* Call the no-argument constructor of an object */ static std::string jrp_noarg_construct(std::string classname) { std::string class_id = jrp_find_class(classname); std::string constructor_id = jrp_get_method_id(class_id, ""); return jrp_new_object_with_constructor(class_id, constructor_id); } /****************************************************************************** * Test cases. Note that the tests exercise a variety of functions to first * * create the appropriate conditions for the intended test. * ******************************************************************************/ SUITE(JavaRequestProcessor) { TEST(callMethod) { std::string object_id = jrp_noarg_construct("java.lang.Object"); std::string tostring_result = jrp_get_string( jrp_call_method(object_id, "toString")); const char substr[] = "java.lang.Object@"; // Check that the result of toString is as expected CHECK(strncmp(tostring_result.c_str(), substr, strlen(substr)) == 0); } /* Create a java.awt.Point, since it is one of the few standard classes with public fields. */ TEST(getField_and_setField) { std::string object_id = jrp_noarg_construct("java.awt.Point"); // Set the field 'x' to 1 jrp_set_field(object_id, "x", create_java_integer(1)); // Get the field 'x' NPVariant field_value = java_result_to_variant(jrp_get_field(object_id, "x")); // Ensure that the received field is 1 CHECK(NPVARIANT_IS_INT32(field_value) && NPVARIANT_TO_INT32(field_value) == 1); } TEST(getStaticField_and_setStaticField) { // One of the few classes with a public & non-final static field that we can tinker with. // If it moves, this test will fail, in which-case this test should be updated to another appropriate field. std::string class_id = jrp_find_class("net.sourceforge.jnlp.controlpanel.DebuggingPanel"); std::string properties_id = jrp_get_static_field(class_id, "properties"); // Check that the field is initially a non-null object NPVariant sh_variant = java_result_to_variant(properties_id); CHECK(!NPVARIANT_IS_NULL(sh_variant) && NPVARIANT_IS_OBJECT(sh_variant)); browser_functions.releasevariantvalue(&sh_variant); jrp_set_static_field(class_id, "properties", create_null()); sh_variant = java_result_to_variant(jrp_get_static_field(class_id, "properties")); CHECK(NPVARIANT_IS_NULL(sh_variant)); // Reset the field to its original contents jrp_set_static_field(class_id, "properties", properties_id); sh_variant = java_result_to_variant(jrp_get_static_field(class_id, "properties")); CHECK(!NPVARIANT_IS_NULL(sh_variant) && NPVARIANT_IS_OBJECT(sh_variant)); browser_functions.releasevariantvalue(&sh_variant); } TEST(arrayIndexing) { const int ARRAY_LEN = 1; // We will create an Integer array of ARRAY_LEN std::vector args; args.push_back(jrp_find_class("java.lang.Integer")); args.push_back(create_java_integer(ARRAY_LEN)); // Create an array 'the hard way' (ie not using 'newArray') to test more of the API std::string array_id = jrp_call_static_method(jrp_find_class("java.lang.reflect.Array"), "newInstance", args); // Attempt to set the first element to 1 jrp_set_slot(array_id, "0", create_java_integer(1)); // Note we get an integer _object_, not a plain int literal std::string integer_id = jrp_get_slot(array_id, "0"); NPVariant unboxed_slot_value = java_result_to_variant(jrp_call_method(integer_id, "intValue")); // Ensure that the received slot is 1 CHECK(NPVARIANT_IS_INT32(unboxed_slot_value) && NPVARIANT_TO_INT32(unboxed_slot_value) == 1); } // Also exercises 'getToStringValue' TEST(newObject) { std::string object_id = jrp_new_object(jrp_find_class("java.lang.Object")); const char substr[] = "java.lang.Object@"; // Check that the result of toString is as expected CHECK(strncmp(jrp_get_to_string_value(object_id).c_str(), substr, strlen(substr)) == 0); } TEST(hasPackage) { CHECK(jrp_has_package("java.lang")); CHECK(!jrp_has_package("not.an.icedtea_web.package")); } TEST(newArray) { const char ARRAY_LEN[] = "10"; std::string array_id = jrp_new_array(jrp_find_class("java.lang.Integer"), ARRAY_LEN); CHECK_EQUAL(ARRAY_LEN, jrp_get_array_length(array_id)); } TEST(newString) { const char TEST_STRING[] = "foobar"; std::string string_id = jrp_new_string(TEST_STRING); CHECK_EQUAL(TEST_STRING, jrp_get_string(string_id)); CHECK_EQUAL(TEST_STRING, jrp_get_to_string_value(string_id)); } // Can only really do sanity checks with given API TEST(getFieldID_getStaticFieldID) { CHECK(!jrp_get_field_id(jrp_find_class("java.awt.Point"), "x").empty()); CHECK(!jrp_get_static_field_id(jrp_find_class("java.lang.Integer"), "MAX_VALUE").empty()); } // Can only really do sanity checks with given API TEST(getStaticMethodID) { std::string class_id = jrp_find_class("java.lang.Integer"); std::vector argtypes; argtypes.push_back("Ljava.lang.String;"); CHECK(!jrp_get_static_method_id(class_id, "valueOf", argtypes).empty()); } TEST(isInstanceOf) { std::string point_id = jrp_noarg_construct("java.awt.Point"); std::string object_class_id = jrp_find_class("java.lang.Object"); CHECK(jrp_is_instance_of(point_id, object_class_id)); } // Wasn't sure what the point of this method is to be honest, but it is used. // Here it simply returns back a passed string object. TEST(getValue) { const char TEST_STRING[] = "foobar"; std::string str = jrp_get_string(jrp_get_value(jrp_new_string(TEST_STRING))); CHECK_EQUAL(TEST_STRING, str); } } icedtea-web-1.8/tests/PaxHeaders.7406/UnitTest++0000644000000000000000000000013213441742745016215 xustar0030 mtime=1552401893.088832721 30 atime=1552410887.112183445 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/0000755000175000002070000000000013441742745017102 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/UnitTest++/PaxHeaders.7406/Makefile0000644000000000000000000000013213441742745017732 xustar0030 mtime=1552401893.088832721 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/Makefile0000644000175000002070000000433613441742745020550 0ustar00jvanekmock00000000000000CXX = g++ CXXFLAGS ?= -g -Wall -W -ansi # -pedantic LDFLAGS ?= SED = sed MV = mv RM = rm .SUFFIXES: .o .cpp lib = libUnitTest++.a test = TestUnitTest++ src = src/AssertException.cpp \ src/Test.cpp \ src/Checks.cpp \ src/TestRunner.cpp \ src/TestResults.cpp \ src/TestReporter.cpp \ src/TestReporterStdout.cpp \ src/ReportAssert.cpp \ src/TestList.cpp \ src/TimeConstraint.cpp \ src/TestDetails.cpp \ src/MemoryOutStream.cpp \ src/DeferredTestReporter.cpp \ src/DeferredTestResult.cpp \ src/XmlTestReporter.cpp \ src/CurrentTest.cpp ifeq ($(MSYSTEM), MINGW32) src += src/Win32/TimeHelpers.cpp else src += src/Posix/SignalTranslator.cpp \ src/Posix/TimeHelpers.cpp endif test_src = src/tests/Main.cpp \ src/tests/TestAssertHandler.cpp \ src/tests/TestChecks.cpp \ src/tests/TestUnitTest++.cpp \ src/tests/TestTest.cpp \ src/tests/TestTestResults.cpp \ src/tests/TestTestRunner.cpp \ src/tests/TestCheckMacros.cpp \ src/tests/TestTestList.cpp \ src/tests/TestTestMacros.cpp \ src/tests/TestTimeConstraint.cpp \ src/tests/TestTimeConstraintMacro.cpp \ src/tests/TestMemoryOutStream.cpp \ src/tests/TestDeferredTestReporter.cpp \ src/tests/TestXmlTestReporter.cpp \ src/tests/TestCurrentTest.cpp objects = $(patsubst %.cpp, %.o, $(src)) test_objects = $(patsubst %.cpp, %.o, $(test_src)) dependencies = $(subst .o,.d,$(objects)) test_dependencies = $(subst .o,.d,$(test_objects)) define make-depend $(CXX) $(CXXFLAGS) -M $1 | \ $(SED) -e 's,\($(notdir $2)\) *:,$(dir $2)\1: ,' > $3.tmp $(SED) -e 's/#.*//' \ -e 's/^[^:]*: *//' \ -e 's/ *\\$$//' \ -e '/^$$/ d' \ -e 's/$$/ :/' $3.tmp >> $3.tmp $(MV) $3.tmp $3 endef all: $(lib) $(lib): $(objects) @echo Creating $(lib) library... @ar cr $(lib) $(objects) $(test): $(lib) $(test_objects) @echo Linking $(test)... @$(CXX) $(LDFLAGS) -o $(test) $(test_objects) $(lib) @echo Running unit tests... @./$(test) clean: -@$(RM) $(objects) $(test_objects) $(dependencies) $(test_dependencies) $(test) $(lib) 2> /dev/null %.o : %.cpp @echo $< @$(call make-depend,$<,$@,$(subst .o,.d,$@)) @$(CXX) $(CXXFLAGS) -c $< -o $(patsubst %.cpp, %.o, $<) ifneq "$(MAKECMDGOALS)" "clean" -include $(dependencies) -include $(test_dependencies) endif icedtea-web-1.8/tests/UnitTest++/PaxHeaders.7406/src0000644000000000000000000000013213441742745017004 xustar0030 mtime=1552401893.090832717 30 atime=1552410887.112183445 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/0000755000175000002070000000000013441742745017671 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TimeConstraint.h0000644000000000000000000000013213441742745022175 xustar0030 mtime=1552401893.090832717 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TimeConstraint.h0000644000175000002070000000124513441742745023007 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TIMECONSTRAINT_H #define UNITTEST_TIMECONSTRAINT_H #include "TimeHelpers.h" namespace UnitTest { class TestResults; class TestDetails; class TimeConstraint { public: TimeConstraint(int ms, TestDetails const& details); ~TimeConstraint(); private: void operator=(TimeConstraint const&); TimeConstraint(TimeConstraint const&); Timer m_timer; TestDetails const& m_details; int const m_maxMs; }; #define UNITTEST_TIME_CONSTRAINT(ms) \ UnitTest::TimeConstraint unitTest__timeConstraint__(ms, UnitTest::TestDetails(m_details, __LINE__)) #define UNITTEST_TIME_CONSTRAINT_EXEMPT() do { m_timeConstraintExempt = true; } while (0) } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestReporterStdout.cpp0000644000000000000000000000013213441742745023432 xustar0030 mtime=1552401893.090832717 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestReporterStdout.cpp0000644000175000002070000000217513441742745024247 0ustar00jvanekmock00000000000000#include "TestReporterStdout.h" #include #include "TestDetails.h" namespace UnitTest { void TestReporterStdout::ReportFailure(TestDetails const& details, char const* failure) { #if defined(__APPLE__) || defined(__GNUG__) char const* const errorFormat = "%s:%d: error: Failure in %s: %s\n"; #else char const* const errorFormat = "%s(%d): error: Failure in %s: %s\n"; #endif using namespace std; printf(errorFormat, details.filename, details.lineNumber, details.testName, failure); } void TestReporterStdout::ReportTestStart(TestDetails const& /*test*/) { } void TestReporterStdout::ReportTestFinish(TestDetails const& /*test*/, float) { } void TestReporterStdout::ReportSummary(int const totalTestCount, int const failedTestCount, int const failureCount, float secondsElapsed) { using namespace std; if (failureCount > 0) printf("FAILURE: %d out of %d tests failed (%d failures).\n", failedTestCount, totalTestCount, failureCount); else printf("Success: %d tests passed.\n", totalTestCount); printf("Test time: %.2f seconds.\n", secondsElapsed); } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/Test.h0000644000000000000000000000013213441742745020151 xustar0030 mtime=1552401893.089832719 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/Test.h0000644000175000002070000000106213441742745020760 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TEST_H #define UNITTEST_TEST_H #include "TestDetails.h" namespace UnitTest { class TestResults; class TestList; class Test { public: explicit Test(char const* testName, char const* suiteName = "DefaultSuite", char const* filename = "", int lineNumber = 0); virtual ~Test(); void Run(); TestDetails const m_details; Test* next; mutable bool m_timeConstraintExempt; static TestList& GetTestList(); virtual void RunImpl() const; private: Test(Test const&); Test& operator =(Test const&); }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/MemoryOutStream.h0000644000000000000000000000013213441742745022346 xustar0030 mtime=1552401893.089832719 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/MemoryOutStream.h0000644000175000002070000000230213441742745023153 0ustar00jvanekmock00000000000000#ifndef UNITTEST_MEMORYOUTSTREAM_H #define UNITTEST_MEMORYOUTSTREAM_H #include "Config.h" #ifndef UNITTEST_USE_CUSTOM_STREAMS #include namespace UnitTest { class MemoryOutStream : public std::ostringstream { public: MemoryOutStream() {} char const* GetText() const; private: MemoryOutStream(MemoryOutStream const&); void operator =(MemoryOutStream const&); mutable std::string m_text; }; } #else #include namespace UnitTest { class MemoryOutStream { public: explicit MemoryOutStream(int const size = 256); ~MemoryOutStream(); char const* GetText() const; MemoryOutStream& operator << (char const* txt); MemoryOutStream& operator << (int n); MemoryOutStream& operator << (long n); MemoryOutStream& operator << (unsigned long n); MemoryOutStream& operator << (float f); MemoryOutStream& operator << (double d); MemoryOutStream& operator << (void const* p); MemoryOutStream& operator << (unsigned int s); enum { GROW_CHUNK_SIZE = 32 }; int GetCapacity() const; private: void operator= (MemoryOutStream const&); void GrowBuffer(int capacity); int m_capacity; char* m_buffer; }; } #endif #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/CurrentTest.cpp0000644000000000000000000000013213441742745022047 xustar0030 mtime=1552401893.088832721 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/CurrentTest.cpp0000644000175000002070000000044113441742745022656 0ustar00jvanekmock00000000000000#include "CurrentTest.h" #include namespace UnitTest { TestResults*& CurrentTest::Results() { static TestResults* testResults = NULL; return testResults; } const TestDetails*& CurrentTest::Details() { static const TestDetails* testDetails = NULL; return testDetails; } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestSuite.h0000644000000000000000000000013213441742745021163 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestSuite.h0000644000175000002070000000026413441742745021775 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TESTSUITE_H #define UNITTEST_TESTSUITE_H namespace UnitTestSuite { inline char const* GetSuiteName () { return "DefaultSuite"; } } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestReporter.cpp0000644000000000000000000000013213441742745022227 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestReporter.cpp0000644000175000002070000000012713441742745023037 0ustar00jvanekmock00000000000000#include "TestReporter.h" namespace UnitTest { TestReporter::~TestReporter() { } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/ReportAssert.h0000644000000000000000000000013213441742745021667 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/ReportAssert.h0000644000175000002070000000025413441742745022500 0ustar00jvanekmock00000000000000#ifndef UNITTEST_ASSERT_H #define UNITTEST_ASSERT_H namespace UnitTest { void ReportAssert(char const* description, char const* filename, int lineNumber); } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/ExecuteTest.h0000644000000000000000000000013213441742745021474 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/ExecuteTest.h0000644000175000002070000000166013441742745022307 0ustar00jvanekmock00000000000000#ifndef UNITTEST_EXECUTE_TEST_H #define UNITTEST_EXECUTE_TEST_H #include "TestDetails.h" #include "MemoryOutStream.h" #include "AssertException.h" #include "CurrentTest.h" #ifdef UNITTEST_POSIX #include "Posix/SignalTranslator.h" #endif namespace UnitTest { template< typename T > void ExecuteTest(T& testObject, TestDetails const& details) { CurrentTest::Details() = &details; try { #ifdef UNITTEST_POSIX UNITTEST_THROW_SIGNALS #endif testObject.RunImpl(); } catch (AssertException const& e) { CurrentTest::Results()->OnTestFailure( TestDetails(details.testName, details.suiteName, e.Filename(), e.LineNumber()), e.what()); } catch (std::exception const& e) { MemoryOutStream stream; stream << "Unhandled exception: " << e.what(); CurrentTest::Results()->OnTestFailure(details, stream.GetText()); } catch (...) { CurrentTest::Results()->OnTestFailure(details, "Unhandled exception: Crash!"); } } } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/Checks.h0000644000000000000000000000013213441742745020432 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/Checks.h0000644000175000002070000001150713441742745021246 0ustar00jvanekmock00000000000000#ifndef UNITTEST_CHECKS_H #define UNITTEST_CHECKS_H #include "Config.h" #include "TestResults.h" #include "MemoryOutStream.h" namespace UnitTest { template< typename Value > bool Check(Value const value) { return !!value; // doing double negative to avoid silly VS warnings } template< typename Expected, typename Actual > void CheckEqual(TestResults& results, Expected const& expected, Actual const& actual, TestDetails const& details) { if (!(expected == actual)) { UnitTest::MemoryOutStream stream; stream << "Expected " << expected << " but was " << actual; results.OnTestFailure(details, stream.GetText()); } } void CheckEqual(TestResults& results, char const* expected, char const* actual, TestDetails const& details); void CheckEqual(TestResults& results, char* expected, char* actual, TestDetails const& details); void CheckEqual(TestResults& results, char* expected, char const* actual, TestDetails const& details); void CheckEqual(TestResults& results, char const* expected, char* actual, TestDetails const& details); template< typename Expected, typename Actual, typename Tolerance > bool AreClose(Expected const& expected, Actual const& actual, Tolerance const& tolerance) { return (actual >= (expected - tolerance)) && (actual <= (expected + tolerance)); } template< typename Expected, typename Actual, typename Tolerance > void CheckClose(TestResults& results, Expected const& expected, Actual const& actual, Tolerance const& tolerance, TestDetails const& details) { if (!AreClose(expected, actual, tolerance)) { UnitTest::MemoryOutStream stream; stream << "Expected " << expected << " +/- " << tolerance << " but was " << actual; results.OnTestFailure(details, stream.GetText()); } } template< typename Expected, typename Actual > void CheckArrayEqual(TestResults& results, Expected const& expected, Actual const& actual, int const count, TestDetails const& details) { bool equal = true; for (int i = 0; i < count; ++i) equal &= (expected[i] == actual[i]); if (!equal) { UnitTest::MemoryOutStream stream; stream << "Expected [ "; for (int expectedIndex = 0; expectedIndex < count; ++expectedIndex) stream << expected[expectedIndex] << " "; stream << "] but was [ "; for (int actualIndex = 0; actualIndex < count; ++actualIndex) stream << actual[actualIndex] << " "; stream << "]"; results.OnTestFailure(details, stream.GetText()); } } template< typename Expected, typename Actual, typename Tolerance > bool ArrayAreClose(Expected const& expected, Actual const& actual, int const count, Tolerance const& tolerance) { bool equal = true; for (int i = 0; i < count; ++i) equal &= AreClose(expected[i], actual[i], tolerance); return equal; } template< typename Expected, typename Actual, typename Tolerance > void CheckArrayClose(TestResults& results, Expected const& expected, Actual const& actual, int const count, Tolerance const& tolerance, TestDetails const& details) { bool equal = ArrayAreClose(expected, actual, count, tolerance); if (!equal) { UnitTest::MemoryOutStream stream; stream << "Expected [ "; for (int expectedIndex = 0; expectedIndex < count; ++expectedIndex) stream << expected[expectedIndex] << " "; stream << "] +/- " << tolerance << " but was [ "; for (int actualIndex = 0; actualIndex < count; ++actualIndex) stream << actual[actualIndex] << " "; stream << "]"; results.OnTestFailure(details, stream.GetText()); } } template< typename Expected, typename Actual, typename Tolerance > void CheckArray2DClose(TestResults& results, Expected const& expected, Actual const& actual, int const rows, int const columns, Tolerance const& tolerance, TestDetails const& details) { bool equal = true; for (int i = 0; i < rows; ++i) equal &= ArrayAreClose(expected[i], actual[i], columns, tolerance); if (!equal) { UnitTest::MemoryOutStream stream; stream << "Expected [ "; for (int expectedRow = 0; expectedRow < rows; ++expectedRow) { stream << "[ "; for (int expectedColumn = 0; expectedColumn < columns; ++expectedColumn) stream << expected[expectedRow][expectedColumn] << " "; stream << "] "; } stream << "] +/- " << tolerance << " but was [ "; for (int actualRow = 0; actualRow < rows; ++actualRow) { stream << "[ "; for (int actualColumn = 0; actualColumn < columns; ++actualColumn) stream << actual[actualRow][actualColumn] << " "; stream << "] "; } stream << "]"; results.OnTestFailure(details, stream.GetText()); } } } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/UnitTest++.h0000644000000000000000000000013213441742745021137 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/UnitTest++.h0000644000175000002070000000044513441742745021752 0ustar00jvanekmock00000000000000#ifndef UNITTESTCPP_H #define UNITTESTCPP_H //lint -esym(1509,*Fixture) #include "Config.h" #include "Test.h" #include "TestList.h" #include "TestSuite.h" #include "TestResults.h" #include "TestMacros.h" #include "CheckMacros.h" #include "TestRunner.h" #include "TimeConstraint.h" #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestResults.cpp0000644000000000000000000000013213441742745022066 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestResults.cpp0000644000175000002070000000224113441742745022675 0ustar00jvanekmock00000000000000#include "TestResults.h" #include "TestReporter.h" #include "TestDetails.h" namespace UnitTest { TestResults::TestResults(TestReporter* testReporter) : m_testReporter(testReporter) , m_totalTestCount(0) , m_failedTestCount(0) , m_failureCount(0) , m_currentTestFailed(false) { } void TestResults::OnTestStart(TestDetails const& test) { ++m_totalTestCount; m_currentTestFailed = false; if (m_testReporter) m_testReporter->ReportTestStart(test); } void TestResults::OnTestFailure(TestDetails const& test, char const* failure) { ++m_failureCount; if (!m_currentTestFailed) { ++m_failedTestCount; m_currentTestFailed = true; } if (m_testReporter) m_testReporter->ReportFailure(test, failure); } void TestResults::OnTestFinish(TestDetails const& test, float secondsElapsed) { if (m_testReporter) m_testReporter->ReportTestFinish(test, secondsElapsed); } int TestResults::GetTotalTestCount() const { return m_totalTestCount; } int TestResults::GetFailedTestCount() const { return m_failedTestCount; } int TestResults::GetFailureCount() const { return m_failureCount; } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestDetails.h0000644000000000000000000000013213441742745021457 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestDetails.h0000644000175000002070000000107613441742745022273 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TESTDETAILS_H #define UNITTEST_TESTDETAILS_H namespace UnitTest { class TestDetails { public: TestDetails(char const* testName, char const* suiteName, char const* filename, int lineNumber); TestDetails(const TestDetails& details, int lineNumber); char const* const suiteName; char const* const testName; char const* const filename; int const lineNumber; TestDetails(TestDetails const&); // Why is it public? --> http://gcc.gnu.org/bugs.html#cxx_rvalbind private: TestDetails& operator=(TestDetails const&); }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/Posix0000644000000000000000000000013113441742745020105 xustar0029 mtime=1552401893.06983276 30 atime=1552410887.112183445 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/Posix/0000755000175000002070000000000013441742745020773 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/UnitTest++/src/Posix/PaxHeaders.7406/SignalTranslator.h0000644000000000000000000000013213441742745023623 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/Posix/SignalTranslator.h0000644000175000002070000000163413441742745024437 0ustar00jvanekmock00000000000000#ifndef UNITTEST_SIGNALTRANSLATOR_H #define UNITTEST_SIGNALTRANSLATOR_H #include #include namespace UnitTest { class SignalTranslator { public: SignalTranslator(); ~SignalTranslator(); static sigjmp_buf* s_jumpTarget; private: sigjmp_buf m_currentJumpTarget; sigjmp_buf* m_oldJumpTarget; struct sigaction m_old_SIGFPE_action; struct sigaction m_old_SIGTRAP_action; struct sigaction m_old_SIGSEGV_action; struct sigaction m_old_SIGBUS_action; struct sigaction m_old_SIGABRT_action; struct sigaction m_old_SIGALRM_action; }; #if !defined (__GNUC__) #define UNITTEST_EXTENSION #else #define UNITTEST_EXTENSION __extension__ #endif #define UNITTEST_THROW_SIGNALS \ UnitTest::SignalTranslator sig; \ if (UNITTEST_EXTENSION sigsetjmp(*UnitTest::SignalTranslator::s_jumpTarget, 1) != 0) \ throw ("Unhandled system exception"); } #endif icedtea-web-1.8/tests/UnitTest++/src/Posix/PaxHeaders.7406/TimeHelpers.h0000644000000000000000000000013213441742745022555 xustar0030 mtime=1552401893.060832779 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/Posix/TimeHelpers.h0000644000175000002070000000046213441742745023367 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TIMEHELPERS_H #define UNITTEST_TIMEHELPERS_H #include namespace UnitTest { class Timer { public: Timer(); void Start(); int GetTimeInMs() const; private: struct timeval m_startTime; }; namespace TimeHelpers { void SleepMs (int ms); } } #endif icedtea-web-1.8/tests/UnitTest++/src/Posix/PaxHeaders.7406/TimeHelpers.cpp0000644000000000000000000000013213441742745023110 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/Posix/TimeHelpers.cpp0000644000175000002070000000102713441742745023720 0ustar00jvanekmock00000000000000#include "TimeHelpers.h" #include namespace UnitTest { Timer::Timer() { m_startTime.tv_sec = 0; m_startTime.tv_usec = 0; } void Timer::Start() { gettimeofday(&m_startTime, 0); } int Timer::GetTimeInMs() const { struct timeval currentTime; gettimeofday(¤tTime, 0); int const dsecs = currentTime.tv_sec - m_startTime.tv_sec; int const dus = currentTime.tv_usec - m_startTime.tv_usec; return dsecs*1000 + dus/1000; } void TimeHelpers::SleepMs (int ms) { usleep(ms * 1000); } } icedtea-web-1.8/tests/UnitTest++/src/Posix/PaxHeaders.7406/SignalTranslator.cpp0000644000000000000000000000013113441742745024155 xustar0029 mtime=1552401893.06983276 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/Posix/SignalTranslator.cpp0000644000175000002070000000210213441742745024761 0ustar00jvanekmock00000000000000#include "SignalTranslator.h" namespace UnitTest { sigjmp_buf* SignalTranslator::s_jumpTarget = 0; namespace { void SignalHandler(int sig) { siglongjmp(*SignalTranslator::s_jumpTarget, sig ); } } SignalTranslator::SignalTranslator() { m_oldJumpTarget = s_jumpTarget; s_jumpTarget = &m_currentJumpTarget; struct sigaction action; action.sa_flags = 0; action.sa_handler = SignalHandler; sigemptyset( &action.sa_mask ); sigaction( SIGSEGV, &action, &m_old_SIGSEGV_action ); sigaction( SIGFPE , &action, &m_old_SIGFPE_action ); sigaction( SIGTRAP, &action, &m_old_SIGTRAP_action ); sigaction( SIGBUS , &action, &m_old_SIGBUS_action ); sigaction( SIGILL , &action, &m_old_SIGBUS_action ); } SignalTranslator::~SignalTranslator() { sigaction( SIGILL , &m_old_SIGBUS_action , 0 ); sigaction( SIGBUS , &m_old_SIGBUS_action , 0 ); sigaction( SIGTRAP, &m_old_SIGTRAP_action, 0 ); sigaction( SIGFPE , &m_old_SIGFPE_action , 0 ); sigaction( SIGSEGV, &m_old_SIGSEGV_action, 0 ); s_jumpTarget = m_oldJumpTarget; } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/DeferredTestReporter.cpp0000644000000000000000000000013213441742745023670 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/DeferredTestReporter.cpp0000644000175000002070000000147513441742745024507 0ustar00jvanekmock00000000000000#include "DeferredTestReporter.h" #include "TestDetails.h" #include "Config.h" using namespace UnitTest; void DeferredTestReporter::ReportTestStart(TestDetails const& details) { m_results.push_back(DeferredTestResult(details.suiteName, details.testName)); } void DeferredTestReporter::ReportFailure(TestDetails const& details, char const* failure) { DeferredTestResult& r = m_results.back(); r.failed = true; r.failures.push_back(DeferredTestResult::Failure(details.lineNumber, failure)); r.failureFile = details.filename; } void DeferredTestReporter::ReportTestFinish(TestDetails const&, float secondsElapsed) { DeferredTestResult& r = m_results.back(); r.timeElapsed = secondsElapsed; } DeferredTestReporter::DeferredTestResultList& DeferredTestReporter::GetResults() { return m_results; } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/AssertException.cpp0000644000000000000000000000013213441742745022705 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/AssertException.cpp0000644000175000002070000000110013441742745023505 0ustar00jvanekmock00000000000000#include "AssertException.h" #include namespace UnitTest { AssertException::AssertException(char const* description, char const* filename, int lineNumber) : m_lineNumber(lineNumber) { using namespace std; strcpy(m_description, description); strcpy(m_filename, filename); } AssertException::~AssertException() throw() { } char const* AssertException::what() const throw() { return m_description; } char const* AssertException::Filename() const { return m_filename; } int AssertException::LineNumber() const { return m_lineNumber; } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/XmlTestReporter.h0000644000000000000000000000013213441742745022355 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/XmlTestReporter.h0000644000175000002070000000171413441742745023170 0ustar00jvanekmock00000000000000#ifndef UNITTEST_XMLTESTREPORTER_H #define UNITTEST_XMLTESTREPORTER_H #include "DeferredTestReporter.h" #include namespace UnitTest { class XmlTestReporter : public DeferredTestReporter { public: explicit XmlTestReporter(std::ostream& ostream); virtual void ReportSummary(int totalTestCount, int failedTestCount, int failureCount, float secondsElapsed); private: XmlTestReporter(XmlTestReporter const&); XmlTestReporter& operator=(XmlTestReporter const&); void AddXmlElement(std::ostream& os, char const* encoding); void BeginResults(std::ostream& os, int totalTestCount, int failedTestCount, int failureCount, float secondsElapsed); void EndResults(std::ostream& os); void BeginTest(std::ostream& os, DeferredTestResult const& result); void AddFailure(std::ostream& os, DeferredTestResult const& result); void EndTest(std::ostream& os, DeferredTestResult const& result); std::ostream& m_ostream; }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestRunner.cpp0000644000000000000000000000013213441742745021676 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestRunner.cpp0000644000175000002070000000337613441742745022517 0ustar00jvanekmock00000000000000#include "TestRunner.h" #include "TestResults.h" #include "TestReporter.h" #include "TestReporterStdout.h" #include "TimeHelpers.h" #include "MemoryOutStream.h" #include namespace UnitTest { int RunAllTests() { TestReporterStdout reporter; TestRunner runner(reporter); return runner.RunTestsIf(Test::GetTestList(), NULL, True(), 0); } TestRunner::TestRunner(TestReporter& reporter) : m_reporter(&reporter) , m_result(new TestResults(&reporter)) , m_timer(new Timer) { m_timer->Start(); } TestRunner::~TestRunner() { delete m_result; delete m_timer; } int TestRunner::Finish() const { float const secondsElapsed = m_timer->GetTimeInMs() / 1000.0f; m_reporter->ReportSummary(m_result->GetTotalTestCount(), m_result->GetFailedTestCount(), m_result->GetFailureCount(), secondsElapsed); return m_result->GetFailureCount(); } bool TestRunner::IsTestInSuite(const Test* const curTest, char const* suiteName) const { using namespace std; return (suiteName == NULL) || !strcmp(curTest->m_details.suiteName, suiteName); } void TestRunner::RunTest(TestResults* const result, Test* const curTest, int const maxTestTimeInMs) const { CurrentTest::Results() = result; Timer testTimer; testTimer.Start(); result->OnTestStart(curTest->m_details); curTest->Run(); int const testTimeInMs = testTimer.GetTimeInMs(); if (maxTestTimeInMs > 0 && testTimeInMs > maxTestTimeInMs && !curTest->m_timeConstraintExempt) { MemoryOutStream stream; stream << "Global time constraint failed. Expected under " << maxTestTimeInMs << "ms but took " << testTimeInMs << "ms."; result->OnTestFailure(curTest->m_details, stream.GetText()); } result->OnTestFinish(curTest->m_details, testTimeInMs/1000.0f); } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestList.h0000644000000000000000000000013213441742745021005 xustar0030 mtime=1552401893.060832779 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestList.h0000644000175000002070000000050413441742745021614 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TESTLIST_H #define UNITTEST_TESTLIST_H namespace UnitTest { class Test; class TestList { public: TestList(); void Add (Test* test); Test* GetHead() const; private: Test* m_head; Test* m_tail; }; class ListAdder { public: ListAdder(TestList& list, Test* test); }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/DeferredTestResult.cpp0000644000000000000000000000013213441742745023344 xustar0030 mtime=1552401893.060832779 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/DeferredTestResult.cpp0000644000175000002070000000060513441742745024155 0ustar00jvanekmock00000000000000#include "DeferredTestResult.h" #include "Config.h" namespace UnitTest { DeferredTestResult::DeferredTestResult() : suiteName("") , testName("") , failureFile("") , timeElapsed(0.0f) , failed(false) { } DeferredTestResult::DeferredTestResult(char const* suite, char const* test) : suiteName(suite) , testName(test) , failureFile("") , timeElapsed(0.0f) , failed(false) { } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/CheckMacros.h0000644000000000000000000000013213441742745021414 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/CheckMacros.h0000644000175000002070000001054113441742745022225 0ustar00jvanekmock00000000000000#ifndef UNITTEST_CHECKMACROS_H #define UNITTEST_CHECKMACROS_H #include "Checks.h" #include "AssertException.h" #include "MemoryOutStream.h" #include "TestDetails.h" #include "CurrentTest.h" #ifdef CHECK #error UnitTest++ redefines CHECK #endif #ifdef CHECK_EQUAL #error UnitTest++ redefines CHECK_EQUAL #endif #ifdef CHECK_CLOSE #error UnitTest++ redefines CHECK_CLOSE #endif #ifdef CHECK_ARRAY_EQUAL #error UnitTest++ redefines CHECK_ARRAY_EQUAL #endif #ifdef CHECK_ARRAY_CLOSE #error UnitTest++ redefines CHECK_ARRAY_CLOSE #endif #ifdef CHECK_ARRAY2D_CLOSE #error UnitTest++ redefines CHECK_ARRAY2D_CLOSE #endif #define CHECK(value) \ do \ { \ try { \ if (!UnitTest::Check(value)) \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), #value); \ } \ catch (...) { \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \ "Unhandled exception in CHECK(" #value ")"); \ } \ } while (0) #define CHECK_EQUAL(expected, actual) \ do \ { \ try { \ UnitTest::CheckEqual(*UnitTest::CurrentTest::Results(), expected, actual, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \ } \ catch (...) { \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \ "Unhandled exception in CHECK_EQUAL(" #expected ", " #actual ")"); \ } \ } while (0) #define CHECK_CLOSE(expected, actual, tolerance) \ do \ { \ try { \ UnitTest::CheckClose(*UnitTest::CurrentTest::Results(), expected, actual, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \ } \ catch (...) { \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \ "Unhandled exception in CHECK_CLOSE(" #expected ", " #actual ")"); \ } \ } while (0) #define CHECK_ARRAY_EQUAL(expected, actual, count) \ do \ { \ try { \ UnitTest::CheckArrayEqual(*UnitTest::CurrentTest::Results(), expected, actual, count, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \ } \ catch (...) { \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \ "Unhandled exception in CHECK_ARRAY_EQUAL(" #expected ", " #actual ")"); \ } \ } while (0) #define CHECK_ARRAY_CLOSE(expected, actual, count, tolerance) \ do \ { \ try { \ UnitTest::CheckArrayClose(*UnitTest::CurrentTest::Results(), expected, actual, count, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \ } \ catch (...) { \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \ "Unhandled exception in CHECK_ARRAY_CLOSE(" #expected ", " #actual ")"); \ } \ } while (0) #define CHECK_ARRAY2D_CLOSE(expected, actual, rows, columns, tolerance) \ do \ { \ try { \ UnitTest::CheckArray2DClose(*UnitTest::CurrentTest::Results(), expected, actual, rows, columns, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \ } \ catch (...) { \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \ "Unhandled exception in CHECK_ARRAY_CLOSE(" #expected ", " #actual ")"); \ } \ } while (0) #define CHECK_THROW(expression, ExpectedExceptionType) \ do \ { \ bool caught_ = false; \ try { expression; } \ catch (ExpectedExceptionType const&) { caught_ = true; } \ catch (...) {} \ if (!caught_) \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), "Expected exception: \"" #ExpectedExceptionType "\" not thrown"); \ } while(0) #define CHECK_ASSERT(expression) \ CHECK_THROW(expression, UnitTest::AssertException); #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/XmlTestReporter.cpp0000644000000000000000000000013213441742745022710 xustar0030 mtime=1552401893.063832773 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/XmlTestReporter.cpp0000644000175000002070000000630313441742745023522 0ustar00jvanekmock00000000000000#include "XmlTestReporter.h" #include "Config.h" #include #include #include using std::string; using std::ostringstream; using std::ostream; namespace { void ReplaceChar(string& str, char c, string const& replacement) { for (size_t pos = str.find(c); pos != string::npos; pos = str.find(c, pos + 1)) str.replace(pos, 1, replacement); } string XmlEscape(string const& value) { string escaped = value; ReplaceChar(escaped, '&', "&"); ReplaceChar(escaped, '<', "<"); ReplaceChar(escaped, '>', ">"); ReplaceChar(escaped, '\'', "'"); ReplaceChar(escaped, '\"', """); return escaped; } string BuildFailureMessage(string const& file, int line, string const& message) { ostringstream failureMessage; failureMessage << file << "(" << line << ") : " << message; return failureMessage.str(); } } namespace UnitTest { XmlTestReporter::XmlTestReporter(ostream& ostream) : m_ostream(ostream) { } void XmlTestReporter::ReportSummary(int totalTestCount, int failedTestCount, int failureCount, float secondsElapsed) { AddXmlElement(m_ostream, NULL); BeginResults(m_ostream, totalTestCount, failedTestCount, failureCount, secondsElapsed); DeferredTestResultList const& results = GetResults(); for (DeferredTestResultList::const_iterator i = results.begin(); i != results.end(); ++i) { BeginTest(m_ostream, *i); if (i->failed) AddFailure(m_ostream, *i); EndTest(m_ostream, *i); } EndResults(m_ostream); } void XmlTestReporter::AddXmlElement(ostream& os, char const* encoding) { os << ""; } void XmlTestReporter::BeginResults(std::ostream& os, int totalTestCount, int failedTestCount, int failureCount, float secondsElapsed) { os << ""; } void XmlTestReporter::EndResults(std::ostream& os) { os << ""; } void XmlTestReporter::BeginTest(std::ostream& os, DeferredTestResult const& result) { os << ""; else os << "/>"; } void XmlTestReporter::AddFailure(std::ostream& os, DeferredTestResult const& result) { os << ">"; // close element for (DeferredTestResult::FailureVec::const_iterator it = result.failures.begin(); it != result.failures.end(); ++it) { string const escapedMessage = XmlEscape(it->second); string const message = BuildFailureMessage(result.failureFile, it->first, escapedMessage); os << ""; } } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestResults.h0000644000000000000000000000013213441742745021533 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestResults.h0000644000175000002070000000136113441742745022344 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TESTRESULTS_H #define UNITTEST_TESTRESULTS_H namespace UnitTest { class TestReporter; class TestDetails; class TestResults { public: explicit TestResults(TestReporter* reporter = 0); void OnTestStart(TestDetails const& test); void OnTestFailure(TestDetails const& test, char const* failure); void OnTestFinish(TestDetails const& test, float secondsElapsed); int GetTotalTestCount() const; int GetFailedTestCount() const; int GetFailureCount() const; private: TestReporter* m_testReporter; int m_totalTestCount; int m_failedTestCount; int m_failureCount; bool m_currentTestFailed; TestResults(TestResults const&); TestResults& operator =(TestResults const&); }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestList.cpp0000644000000000000000000000013213441742745021340 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestList.cpp0000644000175000002070000000075313441742745022155 0ustar00jvanekmock00000000000000#include "TestList.h" #include "Test.h" #include namespace UnitTest { TestList::TestList() : m_head(0) , m_tail(0) { } void TestList::Add(Test* test) { if (m_tail == 0) { assert(m_head == 0); m_head = test; m_tail = test; } else { m_tail->next = test; m_tail = test; } } Test* TestList::GetHead() const { return m_head; } ListAdder::ListAdder(TestList& list, Test* test) { list.Add(test); } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/DeferredTestReporter.h0000644000000000000000000000013213441742745023335 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/DeferredTestReporter.h0000644000175000002070000000120313441742745024141 0ustar00jvanekmock00000000000000#ifndef UNITTEST_DEFERREDTESTREPORTER_H #define UNITTEST_DEFERREDTESTREPORTER_H #include "TestReporter.h" #include "DeferredTestResult.h" #include namespace UnitTest { class DeferredTestReporter : public TestReporter { public: virtual void ReportTestStart(TestDetails const& details); virtual void ReportFailure(TestDetails const& details, char const* failure); virtual void ReportTestFinish(TestDetails const& details, float secondsElapsed); typedef std::vector< DeferredTestResult > DeferredTestResultList; DeferredTestResultList& GetResults(); private: DeferredTestResultList m_results; }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/AssertException.h0000644000000000000000000000013213441742745022352 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/AssertException.h0000644000175000002070000000077313441742745023171 0ustar00jvanekmock00000000000000#ifndef UNITTEST_ASSERTEXCEPTION_H #define UNITTEST_ASSERTEXCEPTION_H #include namespace UnitTest { class AssertException : public std::exception { public: AssertException(char const* description, char const* filename, int lineNumber); virtual ~AssertException() throw(); virtual char const* what() const throw(); char const* Filename() const; int LineNumber() const; private: char m_description[512]; char m_filename[256]; int m_lineNumber; }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TimeHelpers.h0000644000000000000000000000013213441742745021453 xustar0030 mtime=1552401893.070832758 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TimeHelpers.h0000644000175000002070000000020313441742745022256 0ustar00jvanekmock00000000000000#include "Config.h" #if defined UNITTEST_POSIX #include "Posix/TimeHelpers.h" #else #include "Win32/TimeHelpers.h" #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestReporterStdout.h0000644000000000000000000000013213441742745023077 xustar0030 mtime=1552401893.070832758 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestReporterStdout.h0000644000175000002070000000102313441742745023703 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TESTREPORTERSTDOUT_H #define UNITTEST_TESTREPORTERSTDOUT_H #include "TestReporter.h" namespace UnitTest { class TestReporterStdout : public TestReporter { private: virtual void ReportTestStart(TestDetails const& test); virtual void ReportFailure(TestDetails const& test, char const* failure); virtual void ReportTestFinish(TestDetails const& test, float secondsElapsed); virtual void ReportSummary(int totalTestCount, int failedTestCount, int failureCount, float secondsElapsed); }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestDetails.cpp0000644000000000000000000000013113441742745022011 xustar0029 mtime=1552401893.06983276 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestDetails.cpp0000644000175000002070000000074413441742745022627 0ustar00jvanekmock00000000000000#include "TestDetails.h" namespace UnitTest { TestDetails::TestDetails(char const* testName_, char const* suiteName_, char const* filename_, int lineNumber_) : suiteName(suiteName_) , testName(testName_) , filename(filename_) , lineNumber(lineNumber_) { } TestDetails::TestDetails(const TestDetails& details, int lineNumber_) : suiteName(details.suiteName) , testName(details.testName) , filename(details.filename) , lineNumber(lineNumber_) { } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/CurrentTest.h0000644000000000000000000000013213441742745021514 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/CurrentTest.h0000644000175000002070000000035113441742745022323 0ustar00jvanekmock00000000000000#ifndef UNITTEST_CURRENTTESTRESULTS_H #define UNITTEST_CURRENTTESTRESULTS_H namespace UnitTest { class TestResults; class TestDetails; namespace CurrentTest { TestResults*& Results(); const TestDetails*& Details(); } } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TimeConstraint.cpp0000644000000000000000000000013213441742745022530 xustar0030 mtime=1552401893.065832769 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TimeConstraint.cpp0000644000175000002070000000122613441742745023341 0ustar00jvanekmock00000000000000#include "TimeConstraint.h" #include "TestResults.h" #include "MemoryOutStream.h" #include "CurrentTest.h" namespace UnitTest { TimeConstraint::TimeConstraint(int ms, TestDetails const& details) : m_details(details) , m_maxMs(ms) { m_timer.Start(); } TimeConstraint::~TimeConstraint() { int const totalTimeInMs = m_timer.GetTimeInMs(); if (totalTimeInMs > m_maxMs) { MemoryOutStream stream; stream << "Time constraint failed. Expected to run test under " << m_maxMs << "ms but took " << totalTimeInMs << "ms."; UnitTest::CurrentTest::Results()->OnTestFailure(m_details, stream.GetText()); } } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestReporter.h0000644000000000000000000000013213441742745021674 xustar0030 mtime=1552401893.065832769 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/TestReporter.h0000644000175000002070000000101713441742745022503 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TESTREPORTER_H #define UNITTEST_TESTREPORTER_H namespace UnitTest { class TestDetails; class TestReporter { public: virtual ~TestReporter(); virtual void ReportTestStart(TestDetails const& test) = 0; virtual void ReportFailure(TestDetails const& test, char const* failure) = 0; virtual void ReportTestFinish(TestDetails const& test, float secondsElapsed) = 0; virtual void ReportSummary(int totalTestCount, int failedTestCount, int failureCount, float secondsElapsed) = 0; }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/Test.cpp0000644000000000000000000000013213441742745020504 xustar0030 mtime=1552401893.065832769 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/Test.cpp0000644000175000002070000000122213441742745021311 0ustar00jvanekmock00000000000000#include "Config.h" #include "Test.h" #include "TestList.h" #include "TestResults.h" #include "AssertException.h" #include "MemoryOutStream.h" #include "ExecuteTest.h" #ifdef UNITTEST_POSIX #include "Posix/SignalTranslator.h" #endif namespace UnitTest { TestList& Test::GetTestList() { static TestList s_list; return s_list; } Test::Test(char const* testName, char const* suiteName, char const* filename, int lineNumber) : m_details(testName, suiteName, filename, lineNumber) , next(0) , m_timeConstraintExempt(false) { } Test::~Test() { } void Test::Run() { ExecuteTest(*this, m_details); } void Test::RunImpl() const { } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/MemoryOutStream.cpp0000644000000000000000000000013213441742745022701 xustar0030 mtime=1552401893.064832771 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/MemoryOutStream.cpp0000644000175000002070000000510113441742745023506 0ustar00jvanekmock00000000000000#include "MemoryOutStream.h" #ifndef UNITTEST_USE_CUSTOM_STREAMS namespace UnitTest { char const* MemoryOutStream::GetText() const { m_text = this->str(); return m_text.c_str(); } } #else #include #include namespace UnitTest { namespace { template void FormatToStream(MemoryOutStream& stream, char const* format, ValueType const& value) { using namespace std; char txt[32]; sprintf(txt, format, value); stream << txt; } int RoundUpToMultipleOfPow2Number (int n, int pow2Number) { return (n + (pow2Number - 1)) & ~(pow2Number - 1); } } MemoryOutStream::MemoryOutStream(int const size) : m_capacity (0) , m_buffer (0) { GrowBuffer(size); } MemoryOutStream::~MemoryOutStream() { delete [] m_buffer; } char const* MemoryOutStream::GetText() const { return m_buffer; } MemoryOutStream& MemoryOutStream::operator << (char const* txt) { using namespace std; int const bytesLeft = m_capacity - (int)strlen(m_buffer); int const bytesRequired = (int)strlen(txt) + 1; if (bytesRequired > bytesLeft) { int const requiredCapacity = bytesRequired + m_capacity - bytesLeft; GrowBuffer(requiredCapacity); } strcat(m_buffer, txt); return *this; } MemoryOutStream& MemoryOutStream::operator << (int const n) { FormatToStream(*this, "%i", n); return *this; } MemoryOutStream& MemoryOutStream::operator << (long const n) { FormatToStream(*this, "%li", n); return *this; } MemoryOutStream& MemoryOutStream::operator << (unsigned long const n) { FormatToStream(*this, "%lu", n); return *this; } MemoryOutStream& MemoryOutStream::operator << (float const f) { FormatToStream(*this, "%ff", f); return *this; } MemoryOutStream& MemoryOutStream::operator << (void const* p) { FormatToStream(*this, "%p", p); return *this; } MemoryOutStream& MemoryOutStream::operator << (unsigned int const s) { FormatToStream(*this, "%u", s); return *this; } MemoryOutStream& MemoryOutStream::operator <<(double const d) { FormatToStream(*this, "%f", d); return *this; } int MemoryOutStream::GetCapacity() const { return m_capacity; } void MemoryOutStream::GrowBuffer(int const desiredCapacity) { int const newCapacity = RoundUpToMultipleOfPow2Number(desiredCapacity, GROW_CHUNK_SIZE); using namespace std; char* buffer = new char[newCapacity]; if (m_buffer) strcpy(buffer, m_buffer); else strcpy(buffer, ""); delete [] m_buffer; m_buffer = buffer; m_capacity = newCapacity; } } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/Config.h0000644000000000000000000000013213441742745020437 xustar0030 mtime=1552401893.064832771 30 atime=1552402157.254253442 30 ctime=1552410887.062183562 icedtea-web-1.8/tests/UnitTest++/src/Config.h0000644000175000002070000000172213441742745021251 0ustar00jvanekmock00000000000000#ifndef UNITTEST_CONFIG_H #define UNITTEST_CONFIG_H // Standard defines documented here: http://predef.sourceforge.net #if defined(_MSC_VER) #pragma warning(disable:4127) // conditional expression is constant #pragma warning(disable:4702) // unreachable code #pragma warning(disable:4722) // destructor never returns, potential memory leak #if (_MSC_VER == 1200) // VC6 #pragma warning(disable:4786) #pragma warning(disable:4290) #endif #endif #if defined(unix) || defined(__unix__) || defined(__unix) || defined(linux) || \ defined(__APPLE__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) #define UNITTEST_POSIX #endif #if defined(__MINGW32__) #define UNITTEST_MINGW #endif // by default, MemoryOutStream is implemented in terms of std::ostringstream, which can be expensive. // uncomment this line to use the custom MemoryOutStream (no deps on std::ostringstream). //#define UNITTEST_USE_CUSTOM_STREAMS #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestRunner.h0000644000000000000000000000013213441742745021343 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/UnitTest++/src/TestRunner.h0000644000175000002070000000210713441742745022153 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TESTRUNNER_H #define UNITTEST_TESTRUNNER_H #include "Test.h" #include "TestList.h" #include "CurrentTest.h" namespace UnitTest { class TestReporter; class TestResults; class Timer; int RunAllTests(); struct True { bool operator()(const Test* const) const { return true; } }; class TestRunner { public: explicit TestRunner(TestReporter& reporter); ~TestRunner(); template int RunTestsIf(TestList const& list, char const* suiteName, const Predicate& predicate, int maxTestTimeInMs) const { Test* curTest = list.GetHead(); while (curTest != 0) { if (IsTestInSuite(curTest,suiteName) && predicate(curTest)) { RunTest(m_result, curTest, maxTestTimeInMs); } curTest = curTest->next; } return Finish(); } private: TestReporter* m_reporter; TestResults* m_result; Timer* m_timer; int Finish() const; bool IsTestInSuite(const Test* const curTest, char const* suiteName) const; void RunTest(TestResults* const result, Test* const curTest, int const maxTestTimeInMs) const; }; } #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/TestMacros.h0000644000000000000000000000013213441742745021316 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/UnitTest++/src/TestMacros.h0000644000175000002070000001207713441742745022135 0ustar00jvanekmock00000000000000#ifndef UNITTEST_TESTMACROS_H #define UNITTEST_TESTMACROS_H #include "Config.h" #include "ExecuteTest.h" #include "AssertException.h" #include "TestDetails.h" #include "MemoryOutStream.h" #ifndef UNITTEST_POSIX #define UNITTEST_THROW_SIGNALS #else #include "Posix/SignalTranslator.h" #endif #ifdef TEST #error UnitTest++ redefines TEST #endif #ifdef TEST_EX #error UnitTest++ redefines TEST_EX #endif #ifdef TEST_FIXTURE_EX #error UnitTest++ redefines TEST_FIXTURE_EX #endif #define SUITE(Name) \ namespace Suite##Name { \ namespace UnitTestSuite { \ inline char const* GetSuiteName () { \ return #Name ; \ } \ } \ } \ namespace Suite##Name #define TEST_EX(Name, List) \ class Test##Name : public UnitTest::Test \ { \ public: \ Test##Name() : Test(#Name, UnitTestSuite::GetSuiteName(), __FILE__, __LINE__) {} \ private: \ virtual void RunImpl() const; \ } test##Name##Instance; \ \ UnitTest::ListAdder adder##Name (List, &test##Name##Instance); \ \ void Test##Name::RunImpl() const #define TEST(Name) TEST_EX(Name, UnitTest::Test::GetTestList()) #define TEST_FIXTURE_EX(Fixture, Name, List) \ class Fixture##Name##Helper : public Fixture \ { \ public: \ explicit Fixture##Name##Helper(UnitTest::TestDetails const& details) : m_details(details) {} \ void RunImpl(); \ UnitTest::TestDetails const& m_details; \ private: \ Fixture##Name##Helper(Fixture##Name##Helper const&); \ Fixture##Name##Helper& operator =(Fixture##Name##Helper const&); \ }; \ \ class Test##Fixture##Name : public UnitTest::Test \ { \ public: \ Test##Fixture##Name() : Test(#Name, UnitTestSuite::GetSuiteName(), __FILE__, __LINE__) {} \ private: \ virtual void RunImpl() const; \ } test##Fixture##Name##Instance; \ \ UnitTest::ListAdder adder##Fixture##Name (List, &test##Fixture##Name##Instance); \ \ void Test##Fixture##Name::RunImpl() const \ { \ bool ctorOk = false; \ try { \ Fixture##Name##Helper fixtureHelper(m_details); \ ctorOk = true; \ UnitTest::ExecuteTest(fixtureHelper, m_details); \ } \ catch (UnitTest::AssertException const& e) \ { \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(m_details.testName, m_details.suiteName, e.Filename(), e.LineNumber()), e.what()); \ } \ catch (std::exception const& e) \ { \ UnitTest::MemoryOutStream stream; \ stream << "Unhandled exception: " << e.what(); \ UnitTest::CurrentTest::Results()->OnTestFailure(m_details, stream.GetText()); \ } \ catch (...) { \ if (ctorOk) \ { \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(m_details, __LINE__), \ "Unhandled exception while destroying fixture " #Fixture); \ } \ else \ { \ UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(m_details, __LINE__), \ "Unhandled exception while constructing fixture " #Fixture); \ } \ } \ } \ void Fixture##Name##Helper::RunImpl() #define TEST_FIXTURE(Fixture,Name) TEST_FIXTURE_EX(Fixture, Name, UnitTest::Test::GetTestList()) #endif icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/ReportAssert.cpp0000644000000000000000000000013213441742745022222 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/UnitTest++/src/ReportAssert.cpp0000644000175000002070000000031213441742745023026 0ustar00jvanekmock00000000000000#include "AssertException.h" namespace UnitTest { void ReportAssert(char const* description, char const* filename, int lineNumber) { throw AssertException(description, filename, lineNumber); } } icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/DeferredTestResult.h0000644000000000000000000000013213441742745023011 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/UnitTest++/src/DeferredTestResult.h0000644000175000002070000000104313441742745023617 0ustar00jvanekmock00000000000000#ifndef UNITTEST_DEFERREDTESTRESULT_H #define UNITTEST_DEFERREDTESTRESULT_H #include #include namespace UnitTest { struct DeferredTestResult { DeferredTestResult(); DeferredTestResult(char const* suite, char const* test); std::string suiteName; std::string testName; std::string failureFile; typedef std::pair< int, std::string > Failure; typedef std::vector< Failure > FailureVec; FailureVec failures; float timeElapsed; bool failed; }; } #endif //UNITTEST_DEFERREDTESTRESULT_H icedtea-web-1.8/tests/UnitTest++/src/PaxHeaders.7406/Checks.cpp0000644000000000000000000000013213441742745020765 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/UnitTest++/src/Checks.cpp0000644000175000002070000000225013441742745021574 0ustar00jvanekmock00000000000000#include "Checks.h" #include namespace UnitTest { namespace { void CheckStringsEqual(TestResults& results, char const* expected, char const* actual, TestDetails const& details) { using namespace std; if (strcmp(expected, actual)) { UnitTest::MemoryOutStream stream; stream << "Expected " << expected << " but was " << actual; results.OnTestFailure(details, stream.GetText()); } } } void CheckEqual(TestResults& results, char const* expected, char const* actual, TestDetails const& details) { CheckStringsEqual(results, expected, actual, details); } void CheckEqual(TestResults& results, char* expected, char* actual, TestDetails const& details) { CheckStringsEqual(results, expected, actual, details); } void CheckEqual(TestResults& results, char* expected, char const* actual, TestDetails const& details) { CheckStringsEqual(results, expected, actual, details); } void CheckEqual(TestResults& results, char const* expected, char* actual, TestDetails const& details) { CheckStringsEqual(results, expected, actual, details); } } icedtea-web-1.8/tests/UnitTest++/PaxHeaders.7406/README0000644000000000000000000000013213441742745017152 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/UnitTest++/README0000644000175000002070000000407613441742745017771 0ustar00jvanekmock00000000000000UnitTest++ README Version: v1.4 Last update: 2008-10-30 UnitTest++ is free software. You may copy, distribute, and modify it under the terms of the License contained in the file COPYING distributed with this package. This license is the same as the MIT/X Consortium license. See src/tests/TestUnitTest++.cpp for usage. Authors: Noel Llopis (llopis@convexhull.com) Charles Nicholson (charles.nicholson@gmail.com) Contributors: Jim Tilander Kim Grasman Jonathan Jansson Dirck Blaskey Rory Driscoll Dan Lind Matt Kimmel -- Submitted with permission from Blue Fang Games Anthony Moralez Jeff Dixon Randy Coulman Lieven van der Heide Release notes: -------------- Version 1.4 (2008-10-30) - CHECK macros work at arbitrary stack depth from inside TESTs. - Remove obsolete TEST_UTILITY macros - Predicated test execution (via TestRunner::RunTestsIf) - Better exception handling for fixture ctors/dtors. - VC6/7/8/9 support Version 1.3 (2007-4-22) - Removed dynamic memory allocations (other than streams) - MinGW support - Consistent (native) line endings - Minor bug fixing Version 1.2 (2006-10-29) - First pass at documentation. - More detailed error crash catching in fixtures. - Standard streams used for printing objects under check. This should allow the use of standard class types such as std::string or other custom classes with stream operators to ostream. - Standard streams can be optionally compiled off by defining UNITTEST_USE_CUSTOM_STREAMS in Config.h - Added named test suites - Added CHECK_ARRAY2D_CLOSE - Posix library name is libUnitTest++.a now - Floating point numbers are postfixed with f in the failure reports Version 1.1 (2006-04-18) - CHECK macros do not have side effects even if one of the parameters changes state - Removed CHECK_ARRAY_EQUAL (too similar to CHECK_ARRAY_CLOSE) - Added local and global time constraints - Removed dependencies on strstream - Improved Posix signal to exception translator - Failing tests are added to Visual Studio's error list - Fixed Visual Studio projects to work with spaces in directories Version 1.0 (2006-03-15) - Initial release icedtea-web-1.8/tests/UnitTest++/PaxHeaders.7406/COPYING0000644000000000000000000000013213441742745017325 xustar0030 mtime=1552401893.064832771 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/UnitTest++/COPYING0000644000175000002070000000206513441742745020140 0ustar00jvanekmock00000000000000Copyright (c) 2006 Noel Llopis and Charles Nicholson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. icedtea-web-1.8/tests/PaxHeaders.7406/jacoco-operator0000644000000000000000000000013213441742745017377 xustar0030 mtime=1552401893.061832777 30 atime=1552410887.113183443 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/jacoco-operator/0000755000175000002070000000000013441742745020264 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/jacoco-operator/PaxHeaders.7406/org0000644000000000000000000000013213441742745020166 xustar0030 mtime=1552401893.061832777 30 atime=1552410887.113183443 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/jacoco-operator/org/0000755000175000002070000000000013441742745021053 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/jacoco-operator/org/PaxHeaders.7406/jacoco0000644000000000000000000000013213441742745021424 xustar0030 mtime=1552401893.061832777 30 atime=1552410887.113183443 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/jacoco-operator/org/jacoco/0000755000175000002070000000000013441742745022311 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/jacoco-operator/org/jacoco/PaxHeaders.7406/operator0000644000000000000000000000013213441742745023257 xustar0030 mtime=1552401893.063832773 30 atime=1552410887.113183443 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/jacoco-operator/org/jacoco/operator/0000755000175000002070000000000013441742745024144 5ustar00jvanekmock00000000000000icedtea-web-1.8/tests/jacoco-operator/org/jacoco/operator/PaxHeaders.7406/MergeTask.java0000644000000000000000000000013213441742745026061 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/jacoco-operator/org/jacoco/operator/MergeTask.java0000644000175000002070000001217313441742745026675 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package org.jacoco.operator; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jacoco.core.data.ExecutionDataReader; import org.jacoco.core.data.ExecutionDataStore; import org.jacoco.core.data.ExecutionDataWriter; import org.jacoco.core.data.SessionInfoStore; /** * Task for merging a set of execution data store files into a single file * * Inspired by: * https://raw.github.com/jacoco/jacoco/master/org.jacoco.ant/src/org/jacoco/ant/MergeTask.java */ public class MergeTask implements Runnable { public static final String DEFAULT_NAME = "jacoco.exec"; private File destfile; private final List files = new ArrayList(1); public MergeTask(File destfile) { this.destfile = destfile; } public MergeTask(File destfile, List inputs) { this.destfile = destfile; files.addAll(inputs); } /** * Sets the location of the merged data store * * @param destfile Destination data store location */ public void setDestfile(final File destfile) { this.destfile = destfile; } public void addInputFile(final File input) { if (input != null) { files.add(input); } } public void addInputFiles(final List input) { files.addAll(input); } public void execute() throws IOException { if (destfile == null) { throw new RuntimeException("Destination file must be supplied"); } final SessionInfoStore infoStore = new SessionInfoStore(); final ExecutionDataStore dataStore = new ExecutionDataStore(); loadSourceFiles(infoStore, dataStore); OutputStream outputStream = null; try { outputStream = new BufferedOutputStream(new FileOutputStream( destfile)); final ExecutionDataWriter dataWriter = new ExecutionDataWriter( outputStream); infoStore.accept(dataWriter); dataStore.accept(dataWriter); } finally { if (outputStream != null) { outputStream.close(); } } } private void loadSourceFiles(final SessionInfoStore infoStore, final ExecutionDataStore dataStore) throws IOException { if (files == null || files.isEmpty()) { throw new RuntimeException("No input files"); } final Iterator resourceIterator = files.iterator(); while (resourceIterator.hasNext()) { final File resource = (File) resourceIterator.next(); if (resource.isDirectory()) { continue; } InputStream resourceStream = null; try { resourceStream = new FileInputStream(resource); final ExecutionDataReader reader = new ExecutionDataReader( resourceStream); reader.setSessionInfoVisitor(infoStore); reader.setExecutionDataVisitor(dataStore); reader.read(); } finally { if (resourceStream != null) { resourceStream.close(); } } } } @Override public void run() { try { execute(); } catch (IOException ex) { throw new RuntimeException(ex); } } } icedtea-web-1.8/tests/jacoco-operator/org/jacoco/operator/PaxHeaders.7406/Main.java0000644000000000000000000000013213441742745025063 xustar0030 mtime=1552401893.063832773 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/jacoco-operator/org/jacoco/operator/Main.java0000644000175000002070000002762613441742745025710 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package org.jacoco.operator; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * Commandline launcher */ public class Main { //main switches private static final String MERGE = "merge"; private static final String REPORT = "report"; //switches private static final String die_on_failure = "--die-soon"; //merge private static final String output_file = "--output-file"; private static final String input_files = "--input-files"; //report private static final String html_output = "--html-output"; private static final String xml_output = "--xml-output"; private static final String input_srcs = "--input-srcs"; private static final String input_builds = "--input-builds"; private static final String title = "--title"; private static String input_file = "--input-file"; /** * * */ private static boolean dieOnFailure = false; private static boolean warned = false; public static void main(String[] args) throws IOException { if (args.length < 2) { printHelp(); System.exit(0); } Runnable r = null; if (args[0].equalsIgnoreCase(MERGE)) { r = proceedMerge(cutFirstParam(args)); } else if (args[0].equalsIgnoreCase(REPORT)) { r = proceedReport(cutFirstParam(args)); } else { System.err.println("Unsuported main switch `" + args[0] + "`, use " + MERGE + " or " + REPORT); printHelp(); System.exit(1); } if (dieOnFailure && warned) { System.err.println(die_on_failure + " is specified and warning occured. Exiting"); System.exit(2); } r.run(); } private static void printHelp() { System.out.println("Usage: java `classpath` org.jacoco.operator.Main [" + MERGE + "|" + REPORT + "] switches/files"); System.out.println(" order of switches does not matter"); System.out.println(" Merge usage: java `classpath` org.jacoco.operator.Main " + MERGE + " " + output_file + " file " + input_files + " file file file ..."); System.out.println(" Report usage: java `classpath` org.jacoco.operator.Main " + REPORT + " " + html_output + " file " + xml_output + " file " + input_srcs + " file file file ... " + input_builds + " file file file " + title + " titleOfReport " + input_file + " file"); System.out.println("Where:"); System.out.println(" classpath should contain this application, and complete jacoco, and sometimes asm3 (depends on jacoco bundle)"); System.out.println(" " + die_on_failure + " - can be set as first parameter (after main switch), each warning then will cause exit of application"); System.out.println(" " + MERGE); System.out.println(" " + output_file + " - is file where merged inputs will be saved"); System.out.println(" " + input_files + " - is list of files which will be merged into output file"); System.out.println(" " + REPORT); System.out.println(" " + html_output + " - name of directory into which report will be generated. Should be empty or not yet exist"); System.out.println(" " + xml_output + " - is name of file into which xml report will be written"); System.out.println(" " + input_srcs + " - jars, zips or directories with java sources which will be used during report generation"); System.out.println(" " + input_builds + " - jars, zips or directories with compiled java classes, debug information must be present"); System.out.println(" " + title + " - title of report"); System.out.println(" " + input_file + " - input file with recorded coverage-run-session. By default jacoco saves into " + MergeTask.DEFAULT_NAME); } private static String[] cutFirstParam(String[] args) { String[] arg = new String[args.length - 1]; System.arraycopy(args, 1, arg, 0, arg.length); return arg; } private static Runnable proceedMerge(String[] a) throws IOException { String doing = null; String outputFile = null; List inputFiles = new ArrayList(2); for (String s : a) { if (s.startsWith("--")) { if (s.equalsIgnoreCase(die_on_failure)) { doing = null; dieOnFailure = true; } else if (s.equalsIgnoreCase(output_file)) { doing = output_file; } else if (s.equalsIgnoreCase(input_files)) { doing = input_files; } else { warnOrDie("Unknown Switch for merge " + s); doing = null; } } else { if (doing == null) { warnOrDie("Missing switch during processing of " + s); } else { if (doing.equalsIgnoreCase(output_file)) { outputFile = s; } else if (doing.equalsIgnoreCase(input_files)) { inputFiles.add(s); } else { warnOrDie("Unknown processing of switch of" + doing); } } } } throwIfNullOrEmpty(outputFile, "empty output file"); File ff = new File(outputFile); if (ff.exists()) { warnOrDie("Warning, output file " + ff.getAbsolutePath() + " exists"); } MergeTask m = new MergeTask(ff); for (String string : inputFiles) { if (checkIfNotNullOrEmpty(string)) { File f = new File(string); if (!f.exists()) { warnOrDie("Warning, input coverage " + f.getAbsolutePath() + " does not exists!"); } m.addInputFile(f); } } return m; } private static Runnable proceedReport(String[] a) throws IOException { String doing = null; String htmlDir = null; String xmlFile = null; List inputSrcs = new ArrayList(1); List inputBuilds = new ArrayList(1); String titleValue = null; String inputFile = null; for (String s : a) { if (s.startsWith("--")) { if (s.equalsIgnoreCase(die_on_failure)) { doing = null; dieOnFailure = true; } else if (s.equalsIgnoreCase(html_output)) { doing = html_output; } else if (s.equalsIgnoreCase(xml_output)) { doing = xml_output; } else if (s.equalsIgnoreCase(input_srcs)) { doing = input_srcs; } else if (s.equalsIgnoreCase(input_builds)) { doing = input_builds; } else if (s.equalsIgnoreCase(title)) { doing = title; } else if (s.equalsIgnoreCase(input_file)) { doing = input_file; } else { warnOrDie("Unknown Switch for report " + s); doing = null; } } else { if (doing == null) { warnOrDie("Missing switch during processing of " + s); } else { if (doing.equalsIgnoreCase(html_output)) { htmlDir = s; } else if (doing.equalsIgnoreCase(xml_output)) { xmlFile = s; } else if (doing.equalsIgnoreCase(input_srcs)) { inputSrcs.add(s); } else if (doing.equalsIgnoreCase(input_builds)) { inputBuilds.add(s); } else if (doing.equalsIgnoreCase(title)) { titleValue = s; } else if (doing.equalsIgnoreCase(input_file)) { inputFile = s; } else { warnOrDie("Unknown processing of switch of " + doing); } } } } File finalHtmlFile = null; if (checkIfNotNullOrEmpty(htmlDir)) { finalHtmlFile = new File(htmlDir); if (finalHtmlFile.exists()) { warnOrDie("Warning, direcotry for html report exists! " + finalHtmlFile.getAbsolutePath()); } } File finalXmlFile = null; if (checkIfNotNullOrEmpty(xmlFile)) { finalXmlFile = new File(xmlFile); if (finalXmlFile.exists()) { warnOrDie("Warning, file for xml report exists! " + finalHtmlFile.getAbsolutePath()); } } if (chckIfNUllOrEmpty(titleValue)) { titleValue = "Coverage report"; } throwIfNullOrEmpty(inputFile, "No coverage data file specified!"); File finalInputFile = new File(inputFile); ReportGenerator rg = new ReportGenerator(titleValue, finalInputFile, finalHtmlFile, finalXmlFile); for (String string : inputSrcs) { if (checkIfNotNullOrEmpty(string)) { File f = new File(string); if (!f.exists()) { warnOrDie("Warning, input source " + f.getAbsolutePath() + " does not exists!"); } rg.addSource(f); } } for (String string : inputBuilds) { if (checkIfNotNullOrEmpty(string)) { File f = new File(string); if (!f.exists()) { warnOrDie("Warning, input build " + f.getAbsolutePath() + " does not exists!"); } rg.addClasses(f); } } return rg; } private static String throwIfNullOrEmpty(String outputFile, String message) throws RuntimeException { if (chckIfNUllOrEmpty(outputFile)) { throw new RuntimeException(message); } return outputFile; } private static boolean checkIfNotNullOrEmpty(String string) { return string != null && string.trim().length() != 0; } private static boolean chckIfNUllOrEmpty(String outputFile) { return outputFile == null || outputFile.trim().length() == 0; } private static void warnOrDie(String string) { System.err.println(string); warned = true; } } icedtea-web-1.8/tests/jacoco-operator/org/jacoco/operator/PaxHeaders.7406/ReportGenerator.java0000644000000000000000000000013213441742745027321 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.254253442 30 ctime=1552410887.061183564 icedtea-web-1.8/tests/jacoco-operator/org/jacoco/operator/ReportGenerator.java0000644000175000002070000002454613441742745030144 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package org.jacoco.operator; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.jacoco.core.analysis.Analyzer; import org.jacoco.core.analysis.CoverageBuilder; import org.jacoco.core.analysis.IBundleCoverage; import org.jacoco.core.data.ExecutionDataReader; import org.jacoco.core.data.ExecutionDataStore; import org.jacoco.core.data.SessionInfoStore; import org.jacoco.report.DirectorySourceFileLocator; import org.jacoco.report.FileMultiReportOutput; import org.jacoco.report.IReportVisitor; import org.jacoco.report.MultiSourceFileLocator; import org.jacoco.report.html.HTMLFormatter; import org.jacoco.report.xml.XMLFormatter; /** * This example creates a HTML report for eclipse like projects based on a * single execution data store called jacoco.exec. The report contains no * grouping information. * * The class files under test must be compiled with debug information, otherwise * source highlighting will not work. * * Originally based on: * http://www.eclemma.org/jacoco/trunk/doc/examples/java/ReportGenerator.java */ public class ReportGenerator implements Runnable { private final String title; private final File executionDataFile; private final List classesDirectories = new ArrayList(1); private final List sourceDirectories = new ArrayList(1); private File reportDirectory; private File xmlOutput; private ExecutionDataStore executionDataStore; private SessionInfoStore sessionInfoStore; private String XML_DEF_NAME = "coverage-summary.xml"; /** * Create a new generator based for the given project. * * @param projectDirectory */ public ReportGenerator(final File projectDirectory) { this.title = projectDirectory.getName(); this.executionDataFile = new File(projectDirectory, MergeTask.DEFAULT_NAME); this.classesDirectories.add(new File(projectDirectory, "bin")); this.sourceDirectories.add(new File(projectDirectory, "src")); this.reportDirectory = new File(projectDirectory, "coveragereport"); this.xmlOutput = new File(projectDirectory, XML_DEF_NAME); } public ReportGenerator(String title, File exec, File classes, File sources, File htmlReport, File xmlReport) { this.title = title; this.executionDataFile = exec; if (classes != null) { this.classesDirectories.add(classes); } if (sources != null) { this.sourceDirectories.add(sources); } this.reportDirectory = htmlReport; this.xmlOutput = xmlReport; } public ReportGenerator(String title, File exec, List classes, List sources, File htmlReport, File xmlReport) { this.title = title; this.executionDataFile = exec; if (classes != null) { this.classesDirectories.addAll(classes); } if (sources != null) { this.sourceDirectories.addAll(sources); } this.reportDirectory = htmlReport; this.xmlOutput = xmlReport; } public ReportGenerator(String title, File exec, List classes, List sources, File report) { this.title = title; this.executionDataFile = exec; if (classes != null) { this.classesDirectories.addAll(classes); } if (sources != null) { this.sourceDirectories.addAll(sources); } this.reportDirectory = report; this.xmlOutput = new File(report, XML_DEF_NAME); } public ReportGenerator(String title, File exec, File htmlReport, File xmlReport) { this.title = title; this.executionDataFile = exec; this.reportDirectory = htmlReport; this.xmlOutput = xmlReport; } public ReportGenerator(String title, File exec, File report) { this.title = title; this.executionDataFile = exec; this.reportDirectory = report; this.xmlOutput = new File(report, XML_DEF_NAME); } public void addSource(File f) { sourceDirectories.add(f); } public void addClasses(File f) { classesDirectories.add(f); } /** * Create the report. * * @throws IOException */ public void execute() throws IOException { // Read the jacoco.exec file. Multiple data stores could be merged // at this point loadExecutionData(); // Run the structure analyzer on a single class folder to build up // the coverage model. The process would be similar if your classes // were in a jar file. Typically you would create a bundle for each // class folder and each jar you want in your report. If you have // more than one bundle you will need to add a grouping node to your // report final IBundleCoverage bundleCoverage = analyzeStructure(); if (reportDirectory != null) { createHtmlReport(bundleCoverage); } if (xmlOutput != null) { createXmlReport(bundleCoverage); } } private void createHtmlReport(final IBundleCoverage bundleCoverage) throws IOException { // Create a concrete report visitor based on some supplied // configuration. In this case we use the defaults final HTMLFormatter htmlFormatter = new HTMLFormatter(); final IReportVisitor visitor = htmlFormatter.createVisitor(new FileMultiReportOutput(reportDirectory)); // Initialize the report with all of the execution and session // information. At this point the report doesn't know about the // structure of the report being created visitor.visitInfo(sessionInfoStore.getInfos(), executionDataStore.getContents()); // Populate the report structure with the bundle coverage information. // Call visitGroup if you need groups in your report. MultiSourceFileLocator msf = new MultiSourceFileLocator(4); for (File file : sourceDirectories) { msf.add(new DirectorySourceFileLocator( file, "utf-8", 4)); } visitor.visitBundle(bundleCoverage, msf); // Signal end of structure information to allow report to write all // information out visitor.visitEnd(); } private void createXmlReport(final IBundleCoverage bundleCoverage) throws IOException { OutputStream fos = new FileOutputStream(xmlOutput); try { // Create a concrete report visitor based on some supplied // configuration. In this case we use the defaults final XMLFormatter htmlFormatter = new XMLFormatter(); final IReportVisitor visitor = htmlFormatter.createVisitor(fos); // Initialize the report with all of the execution and session // information. At this point the report doesn't know about the // structure of the report being created visitor.visitInfo(sessionInfoStore.getInfos(), executionDataStore.getContents()); // Populate the report structure with the bundle coverage information. // Call visitGroup if you need groups in your report. visitor.visitBundle(bundleCoverage, null); // Signal end of structure information to allow report to write all // information out visitor.visitEnd(); } finally { if (fos != null) { fos.close(); } } } private void loadExecutionData() throws IOException { final FileInputStream fis = new FileInputStream(executionDataFile); try { final ExecutionDataReader executionDataReader = new ExecutionDataReader( fis); executionDataStore = new ExecutionDataStore(); sessionInfoStore = new SessionInfoStore(); executionDataReader.setExecutionDataVisitor(executionDataStore); executionDataReader.setSessionInfoVisitor(sessionInfoStore); while (executionDataReader.read()) { } } finally { if (fis != null) { fis.close(); } } } private IBundleCoverage analyzeStructure() throws IOException { final CoverageBuilder coverageBuilder = new CoverageBuilder(); final Analyzer analyzer = new Analyzer(executionDataStore, coverageBuilder); for (File file : classesDirectories) { analyzer.analyzeAll(file); } return coverageBuilder.getBundle(title); } @Override public void run() { try { execute(); } catch (IOException ex) { throw new RuntimeException(ex); } } } icedtea-web-1.8/PaxHeaders.7406/rust-launcher0000644000000000000000000000013213441742745015742 xustar0030 mtime=1552401893.056832787 30 atime=1552410887.113183443 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/0000755000175000002070000000000013441742745016627 5ustar00jvanekmock00000000000000icedtea-web-1.8/rust-launcher/PaxHeaders.7406/src0000644000000000000000000000013213441764270016526 xustar0030 mtime=1552410808.316367816 30 atime=1552410887.113183443 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/0000755000175000002070000000000013441764270017413 5ustar00jvanekmock00000000000000icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/utils.rs0000644000000000000000000000013113441764270020310 xustar0030 mtime=1552410808.316367816 29 atime=1552410814.99535218 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/utils.rs0000644000175000002070000004234113441764270021125 0ustar00jvanekmock00000000000000use std; use std::ffi::OsString; use env; use dirs_paths_helper; use os_access; use std::fmt::Write; use hardcoded_paths; use property_from_files_resolver; use property_from_file; pub fn find_jre(os: &os_access::Os) -> std::path::PathBuf { let mut info1 = String::new(); write!(&mut info1, "itw-rust-debug: trying jdk over properties ({})", property_from_file::JRE_PROPERTY_NAME).expect("unwrap failed"); os.log(&info1); match property_from_files_resolver::try_jdk_from_properties(os) { Some(path) => { os.log("itw-rust-debug: found and using"); return std::path::PathBuf::from(path); } None => { os.log("itw-rust-debug: nothing"); os.log("itw-rust-debug: trying jdk JAVA_HOME"); match env::var("JAVA_HOME") { Ok(war) => { os.log("itw-rust-debug: found and using"); let java_home = std::path::PathBuf::from(war); let mut jre_dir = java_home.clone(); jre_dir.push("jre"); jre_dir.push(""); if jre_dir.exists() { return jre_dir; } return java_home; } Err(_e) => { os.log("itw-rust-debug: nothing"); os.log("itw-rust-debug: trying jdk from registry"); match os.get_registry_java() { Some(path) => { os.log("itw-rust-debug: found and using"); return path; } None => { os.log("itw-rust-debug: nothing"); os.log("itw-rust-debug: trying jdk from path"); match get_jdk_from_path_conditionally(os) { Some(path) => { os.log("itw-rust-debug: found and using"); let mut jre_dir = path.clone(); jre_dir.push("jre"); jre_dir.push(""); if jre_dir.exists() { return jre_dir; } return path; } None => { os.log("itw-rust-debug: nothing"); os.log("itw-rust-debug: failing down to hardcoded"); return std::path::PathBuf::from(hardcoded_paths::get_jre()); } } } } } } } } } fn get_jdk_from_path_conditionally(os: &os_access::Os) -> Option { get_jdk_from_path_conditionally_testable(env::var_os("PATH"), hardcoded_paths::get_libsearch(os), os) } fn get_jdk_from_path_conditionally_testable(system_path: Option, libsearch: hardcoded_paths::ItwLibSearch, os: &os_access::Os) -> Option { if libsearch == hardcoded_paths::ItwLibSearch::DISTRIBUTION { os.log("itw-rust-debug: skipping jdk from path, your build is distribution"); None } else { if libsearch == hardcoded_paths::ItwLibSearch::BOTH { os.important("your build is done as BOTH distribution and bundled, jdk from PATH may be not what you want!"); } get_jdk_from_given_path_testable(system_path, os) } } fn get_jdk_from_given_path_testable(system_path: Option, os: &os_access::Os) -> Option { system_path.and_then(|paths| { env::split_paths(&paths).filter_map(|dir| { for suffix in os.get_exec_suffixes() { let mut bin_name = String::new(); write!(&mut bin_name, "java{}", suffix).expect("unwrap failed"); let full_path = dir.join(bin_name); let mut info1 = String::new(); write!(&mut info1, "itw-rust-debug: trying {}", full_path.to_str().expect("unwrap failed")).expect("unwrap failed"); os.log(&info1); if dirs_paths_helper::is_file(&full_path) { let can = match dirs_paths_helper::canonicalize(&full_path) { Ok(resolved) => { //.../bin/java resolved } _error => { full_path.clone() } }; //.../bin/java -> bin let jre_bin_dir: std::path::PathBuf = std::path::PathBuf::from(&can.parent().expect("file should always have parent")); let jre_dir: std::path::PathBuf; //will panic if the file was /java - not fixing if jre_bin_dir.file_name().expect("java's parent should have name") == "bin" { jre_dir = std::path::PathBuf::from(jre_bin_dir.parent().expect("java's bin dir should have parent")) } else { os.important("Error: JRE from path seems to not have bin dir"); jre_dir = match jre_bin_dir.parent() { Some(p) => { //.../bin/ -> ... std::path::PathBuf::from(p) } None => { //?? jre_bin_dir.clone() } } } let mut info2 = String::new(); write!(&mut info2, "itw-rust-debug: found {} resolving as {}", full_path.to_str().expect("unwrap failed"), can.to_str().expect("unwrap failed")).expect("unwrap failed"); os.log(&info2); //returning owner of /bin/java as needed by find_jre return Some(jre_dir); } } None }).next() }) } #[cfg(test)] pub mod tests_utils { use std; use std::fs::File; use std::time::{SystemTime, UNIX_EPOCH}; use std::fs::OpenOptions; use std::fmt::Write as fmt_write; use std::io::Write; use std::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT}; use property_from_file; use os_access; use std::cell::RefCell; use dirs_paths_helper; use hardcoded_paths; use std::ffi::OsString as fo; use log_helper; #[test] fn try_none_jre_from_path() { assert_eq!(super::get_jdk_from_path_conditionally_testable(None, hardcoded_paths::ItwLibSearch::DISTRIBUTION, &TestLogger::create_new()), None); assert_eq!(super::get_jdk_from_path_conditionally_testable(None, hardcoded_paths::ItwLibSearch::BUNDLED, &TestLogger::create_new()), None); assert_eq!(super::get_jdk_from_path_conditionally_testable(None, hardcoded_paths::ItwLibSearch::BOTH, &TestLogger::create_new()), None); assert_eq!(super::get_jdk_from_path_conditionally_testable(Some(fo::from("/some/bad/path")), hardcoded_paths::ItwLibSearch::DISTRIBUTION, &TestLogger::create_new()), None); assert_eq!(super::get_jdk_from_path_conditionally_testable(Some(fo::from("/some/bad/path")), hardcoded_paths::ItwLibSearch::BUNDLED, &TestLogger::create_new()), None); assert_eq!(super::get_jdk_from_path_conditionally_testable(Some(fo::from("/some/bad/path")), hardcoded_paths::ItwLibSearch::BOTH, &TestLogger::create_new()), None); } #[test] fn try_jre_exists_on_path() { let top_dir = dirs_paths_helper::canonicalize(&fake_jre(true)).expect("canonicalize failed"); let mut master_dir = top_dir.clone(); master_dir.push("bin"); let v1 = super::get_jdk_from_path_conditionally_testable(Some(fo::from(master_dir.clone())), hardcoded_paths::ItwLibSearch::DISTRIBUTION, &TestLogger::create_new()); let v2 = super::get_jdk_from_path_conditionally_testable(Some(fo::from(master_dir.clone())), hardcoded_paths::ItwLibSearch::BUNDLED, &TestLogger::create_new()); let v3 = super::get_jdk_from_path_conditionally_testable(Some(fo::from(master_dir.clone())), hardcoded_paths::ItwLibSearch::BOTH, &TestLogger::create_new()); debuggable_remove_dir(&master_dir); assert_eq!(None, v1); assert_eq!(Some(top_dir.clone()), v2); assert_eq!(Some(top_dir.clone()), v3); } #[test] fn try_jre_dir_on_path_exists_but_no_java() { let master_dir = fake_jre(false); let v1 = super::get_jdk_from_path_conditionally_testable(Some(fo::from(master_dir.clone())), hardcoded_paths::ItwLibSearch::DISTRIBUTION, &TestLogger::create_new()); let v2 = super::get_jdk_from_path_conditionally_testable(Some(fo::from(master_dir.clone())), hardcoded_paths::ItwLibSearch::BUNDLED, &TestLogger::create_new()); let v3 = super::get_jdk_from_path_conditionally_testable(Some(fo::from(master_dir.clone())), hardcoded_paths::ItwLibSearch::BOTH, &TestLogger::create_new()); debuggable_remove_dir(&master_dir); assert_eq!(None, v1); assert_eq!(None, v2); assert_eq!(None, v3); } #[test] fn try_jre_dir_java_on_path_but_no_bin() { let mut fake_jre = create_tmp_file(); debuggable_remove_file(&fake_jre); let master_dir = fake_jre.clone(); std::fs::create_dir(&fake_jre).expect("dir creation failed"); fake_jre.push("java"); File::create(&fake_jre).expect("File created"); let v1 = super::get_jdk_from_path_conditionally_testable(Some(fo::from(master_dir.clone())), hardcoded_paths::ItwLibSearch::DISTRIBUTION, &TestLogger::create_new()); let v2 = super::get_jdk_from_path_conditionally_testable(Some(fo::from(master_dir.clone())), hardcoded_paths::ItwLibSearch::BUNDLED, &TestLogger::create_new()); let v3 = super::get_jdk_from_path_conditionally_testable(Some(fo::from(master_dir.clone())), hardcoded_paths::ItwLibSearch::BOTH, &TestLogger::create_new()); debuggable_remove_dir(&master_dir); assert_eq!(None, v1); let parent = dirs_paths_helper::canonicalize(&std::path::PathBuf::from(master_dir.parent().expect("just created"))).expect("canonicalize failed"); assert_eq!(Some(parent.clone()), v2); assert_eq!(Some(parent.clone()), v3); } pub struct TestLogger { vec: RefCell>, } impl TestLogger { pub fn create_new() -> TestLogger { TestLogger { vec: RefCell::new(Vec::new()) } } pub fn get_log(&self) -> String { let joined = self.vec.borrow_mut().join("; "); joined } } impl os_access::Os for TestLogger { fn system_log(&self, s: &str){ panic!("not implemented"); } fn advanced_logging(&self) -> &log_helper::AdvancedLogging { panic!("not implemented"); } fn is_verbose(&self) -> bool { return true; } #[cfg(windows)] fn inside_console(&self) -> bool { return true; } fn log(&self, s: &str) { let ss = String::from(s); self.vec.borrow_mut().push(ss); } fn info(&self, s: &str) { let ss = String::from(s); self.vec.borrow_mut().push(ss); } fn important(&self, s: &str) { let ss = String::from(s); self.vec.borrow_mut().push(ss); } fn get_registry_java(&self) -> Option { None } fn spawn_java_process(&self, _jre_dir: &std::path::PathBuf, _args: &Vec) -> std::process::Child { panic!("not implemented"); } fn get_system_config_javadir(&self) -> Option { None } fn get_user_config_dir(&self) -> Option { None } fn get_legacy_system_config_javadir(&self) -> Option { None } fn get_legacy_user_config_dir(&self) -> Option { None } fn get_home(&self) -> Option { panic!("not implemented"); } fn get_classpath_separator(&self) -> char { ':' } fn get_exec_suffixes(&self) -> &'static [&'static str] { &[""] } } // rand is in separate crate, so using atomic increment instead static TMP_COUNTER: AtomicUsize = ATOMIC_USIZE_INIT; // use cargo test -- --nocapture to see files which needs delete static CLEAN_TMP_FILES: bool = true; pub fn debuggable_remove_file(file: &std::path::PathBuf) { if CLEAN_TMP_FILES { std::fs::remove_file(file).expect("remove of tmp failed"); } else { println!("file {} intentionally not deleted!", file.display()); } } pub fn debuggable_remove_dir(dir: &std::path::PathBuf) { if CLEAN_TMP_FILES { std::fs::remove_dir_all(dir).expect("remove of tmp dir failed"); } else { println!("directory {} intentionally not deleted!", dir.display()); } } pub fn create_tmp_name() -> String { // base name on time let now = SystemTime::now(); let since_the_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards"); let in_ms = since_the_epoch.as_secs() * 1000 + since_the_epoch.subsec_nanos() as u64 / 1_000_000; //each [test] run via cargo test run (by default) in its own thread, so two files of same name may be handled over time //thus adding also atomic counter let id = TMP_COUNTER.fetch_add(1, Ordering::AcqRel); //create nice name let mut owned_string: String = "itw-".to_owned(); owned_string.push_str(&in_ms.to_string()); owned_string.push_str("-"); owned_string.push_str(&id.to_string()); owned_string.push_str("-rusttmp"); owned_string } pub fn create_scratch_dir() -> std::path::PathBuf { let mut project_dir = dirs_paths_helper::current_program_parent(); while !project_dir.to_str().expect("Cannot get path name").ends_with("rust-launcher") { project_dir = project_dir.parent().expect("Cannot get parent").to_path_buf(); } let mut scratch_dir = std::path::PathBuf::new(); scratch_dir.push(project_dir); scratch_dir.push("target"); scratch_dir.push("scratch"); if !scratch_dir.exists() { std::fs::create_dir_all(scratch_dir.as_path()).expect("Cannot create scratch dir"); } scratch_dir } const CUSTOM_TMP_DIR: Option<&'static str> = option_env!("ITW_TMP_REPLACEMENT"); pub fn prepare_tmp_dir() -> std::path::PathBuf { if CUSTOM_TMP_DIR.is_some() { let dir = std::path::PathBuf::from(CUSTOM_TMP_DIR.expect("is_some failed for CUSTOM_TMP_DIR")); assert_eq!(true, dir.exists()); dir } else { create_scratch_dir() } } pub fn create_tmp_file() -> std::path::PathBuf { //let mut dir = CUSTOM_TMP_DIR.unwrap_or(env::temp_dir()); let mut dir = prepare_tmp_dir(); let s = create_tmp_name(); dir.push(s); let f = File::create(&dir).expect("File created"); f.sync_all().expect("data were written"); dir } pub fn create_tmp_propfile_with_content() -> std::path::PathBuf { create_tmp_propfile_with_custom_jre_content("/some/jre") } pub fn create_tmp_propfile_with_custom_jre_content(jre_path: &str) -> std::path::PathBuf { let dir = create_tmp_file(); let mut f = OpenOptions::new() .write(true) .open(&dir).expect("just created file failed to open"); let mut res = String::new(); write!(&mut res, "{}", "key1=val1\n").expect("unwrap failed"); write!(&mut res, "{}", "key2=val2\n").expect("unwrap failed"); write!(&mut res, "{}", property_from_file::JRE_PROPERTY_NAME).expect("unwrap failed"); write!(&mut res, "{}", "=").expect("unwrap failed"); write!(&mut res, "{}", jre_path).expect("unwrap failed"); write!(&mut res, "{}", "\n").expect("unwrap failed"); write!(&mut res, "{}", "key2=val3\n").expect("unwrap failed"); write!(&mut res, "{}", "key4=val4\n").expect("unwrap failed"); write!(&mut res, "{}", ", ").expect("unwrap failed"); f.write_all(res.as_bytes()).expect("writing of tmp file failed"); f.sync_all().expect("data were written"); dir } pub fn fake_jre(valid: bool) -> std::path::PathBuf { let mut fake_jre = create_tmp_file(); debuggable_remove_file(&fake_jre); let master_dir = fake_jre.clone(); std::fs::create_dir(&fake_jre).expect("dir creation failed"); fake_jre.push("bin"); std::fs::create_dir(&fake_jre).expect("dir creation failed"); fake_jre.push("java"); if valid { File::create(&fake_jre).expect("File created"); } master_dir } } icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/os_access.rs0000644000000000000000000000013113441764270021112 xustar0030 mtime=1552410808.316367816 29 atime=1552410814.99535218 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/os_access.rs0000644000175000002070000005627413441764270021741 0ustar00jvanekmock00000000000000use std; use dirs_paths_helper; use std::env; use std::fmt::Write; use log_helper; pub fn create_java_cmd(os: &Os,jre_dir: &std::path::PathBuf, args: &Vec) -> std::process::Command { let mut bin_java = jre_dir.clone(); bin_java.push("bin"); bin_java.push("java"); let mut cmd = std::process::Command::new(&bin_java); for ar in args.into_iter() { cmd.arg(ar); } #[cfg(windows)] { if !os.inside_console() { use std::os::windows::process::CommandExt; cmd.creation_flags(win::CREATE_NO_WINDOW); } } let mut info = String::new(); write!(&mut info, "itw-rust-debug: command {}", format!("{:?}", cmd)).expect("unwrap failed"); os.log(&info); return cmd; } fn spawn_java_process(os: &Os, jre_dir: &std::path::PathBuf, args: &Vec) -> std::process::Child { let mut cmd = create_java_cmd(os, jre_dir, args); cmd.stdin(std::process::Stdio::inherit()); cmd.stdout(std::process::Stdio::inherit()); cmd.stderr(std::process::Stdio::inherit()); let res = cmd.spawn(); match res { Ok(child) => child, Err(_) => panic!("Error spawning JVM process, \ java executable: [{}], arguments: [{:?}]", jre_dir.clone().into_os_string().to_str().expect("path should unwrap"), args) } } pub trait Os { fn advanced_logging(&self) -> &log_helper::AdvancedLogging; fn log(&self, s: &str); fn info(&self, s: &str); fn important(&self, s: &str); fn system_log(&self, s: &str); fn get_registry_java(&self) -> Option; // next to system and home cfg dir, there is also by-jre config dir, but that do not need to be handled os-specific way // https://docs.oracle.com/javase/7/docs/technotes/guides/jweb/jcp/properties.html fn get_system_config_javadir(&self) -> Option; fn get_user_config_dir(&self) -> Option; // is valid only on linux, otherwise returns get_system_config_javadir fn get_legacy_system_config_javadir(&self) -> Option; // is valid only on linux, otherwise returns get_user_config_dir fn get_legacy_user_config_dir(&self) -> Option; fn spawn_java_process(&self, jre_dir: &std::path::PathBuf, args: &Vec) -> std::process::Child; // should probe HOME on linux and USERPROFILE on windows. // it should have fallback in env::home_dir as it is doing a bit more // see https://doc.rust-lang.org/std/env/fn.home_dir.html fn get_home(&self) -> Option; fn get_classpath_separator(&self) -> char; fn get_exec_suffixes(&self) -> &'static [&'static str]; fn is_verbose(&self) -> bool; #[cfg(windows)] fn inside_console(&self) -> bool; } #[cfg(not(windows))] pub struct Linux { verbose: bool, al: log_helper::AdvancedLogging, } #[cfg(not(windows))] impl Linux { pub fn new(debug: bool, load_advanced: bool) -> Linux { if ! load_advanced { Linux { verbose: debug, al: log_helper::AdvancedLogging::default() } } else { Linux { verbose: debug, al: log_helper::AdvancedLogging::load(&Linux::new(debug, false)) } } } } #[cfg(not(windows))] impl Os for Linux { fn system_log(&self, s: &str) { let mut cmd = std::process::Command::new("logger"); cmd.arg("-p"); cmd.arg("user.err"); cmd.arg("--"); cmd.arg(s); let output_result = cmd.output(); match output_result { Ok(output) => { let mut info = String::new(); write!(&mut info, "itw-rust-debug: system log call returned {}", output.status.code().expect("Failed to read syslog process return value")).expect("unwrap failed"); self.log(&info); if !output.status.success() { self.log(&String::from_utf8(output.stdout).expect("sout should unwrap")); self.log(&String::from_utf8(output.stderr).expect("serr should unwrap")); } } _error => { self.log("itw-rust-debug: failed to call system log"); } } } fn advanced_logging(&self) -> &log_helper::AdvancedLogging { return &self.al; } fn is_verbose(&self) -> bool { return self.verbose; } fn log(&self, s: &str) { log_helper::log_impl(2,self, s); } fn info(&self, s: &str) { log_helper::log_impl(1,self, s); } fn important(&self, s: &str) { log_helper::log_impl(0,self, s); } fn get_registry_java(&self) -> Option { None } fn get_system_config_javadir(&self) -> Option { let path = std::path::PathBuf::from("/etc/.java/deployment"); Some(path) } fn get_user_config_dir(&self) -> Option { match dirs_paths_helper::get_xdg_config_dir(self) { Some(mut p) => { p.push(dirs_paths_helper::ICEDTEA_WEB); Some(p) } None => None } } fn get_legacy_system_config_javadir(&self) -> Option { let path = std::path::PathBuf::from("/etc/.java/.deploy"); Some(path) } fn get_legacy_user_config_dir(&self) -> Option { match self.get_home() { Some(mut p) => { p.push(".icedtea"); Some(p) } None => None } } fn spawn_java_process(&self, jre_dir: &std::path::PathBuf, args: &Vec) -> std::process::Child { spawn_java_process(self, jre_dir, args) } fn get_home(&self) -> Option { match env::var("HOME") { Ok(war) => { let home_var_path = std::path::PathBuf::from(war); if dirs_paths_helper::is_dir(&home_var_path) { return Some(home_var_path); } } Err(_) => {} } // Not failing to env::get_home // if this will ever be bugged, the fix should be to set HOME // locally, or fix the distribution itslef None } fn get_classpath_separator(&self) -> char { ':' } //on linux, java is known to be compiled witout any suffix, on windows, it should be .exe fn get_exec_suffixes(&self) -> &'static [&'static str] { &[""] } } #[cfg(windows)] pub struct Windows { verbose: bool, al: log_helper::AdvancedLogging, ic: bool } #[cfg(windows)] impl Windows { pub fn new(debug: bool, load_advanced: bool, ic: bool) -> Windows { if ! load_advanced { Windows { verbose: debug, al: log_helper::AdvancedLogging::default(), ic: ic } } else { Windows { verbose: debug, al: log_helper::AdvancedLogging::load(&Windows::new(debug, false, ic)), ic: ic } } } } #[cfg(windows)] impl Os for Windows { fn system_log(&self, s: &str){/*no go for now*/} fn advanced_logging(&self) -> &log_helper::AdvancedLogging { return &self.al; } fn log(&self, s: &str) { log_helper::log_impl(2,self, s); } fn info(&self, s: &str) { log_helper::log_impl(1,self, s); } fn important(&self, s: &str) { log_helper::log_impl(0,self, s); } fn is_verbose(&self) -> bool { return self.verbose; } fn inside_console(&self) -> bool { return self.ic; } fn get_registry_java(&self) -> Option { std::panic::catch_unwind(|| { match win::java_registry_path() { Ok(path) => Some(std::path::PathBuf::from(path)), Err(_) => None, } }).unwrap_or_else(|_e| { // show_error_message(errloc_msg(&e)); None }) } fn get_system_config_javadir(&self) -> Option { None } fn get_user_config_dir(&self) -> Option { match self.get_home() { Some(mut p) => { p.push(".config"); p.push(dirs_paths_helper::ICEDTEA_WEB); Some(p) } None => None } } fn get_legacy_system_config_javadir(&self) -> Option { None } fn get_legacy_user_config_dir(&self) -> Option { None } fn spawn_java_process(&self, jre_dir: &std::path::PathBuf, args: &Vec) -> std::process::Child { //there was an intention, which caused all the os trait, to implement this better. However developer (alex) faield and gave up spawn_java_process(self, jre_dir, args) } fn get_home(&self) -> Option { match env::var("USERPROFILE") { Ok(war) => { let home_var_path = std::path::PathBuf::from(war); if dirs_paths_helper::is_dir(&home_var_path) { return Some(home_var_path); } } Err(_) => {} } None } fn get_classpath_separator(&self) -> char { ';' } //on linux, java is known to be compiled witout any suffix, on windows, it should be .exe fn get_exec_suffixes(&self) -> &'static [&'static str] { &[".exe"] } } #[cfg(windows)] #[allow(non_snake_case)] #[allow(non_camel_case_types)] pub mod win { // https://crates.io/crates/scopeguard macro_rules! defer { ($e:expr) => { let _deferred = ScopeGuard::new((), |_| $e); } } pub struct ScopeGuard where F: FnMut(&mut T) { __dropfn: F, __value: T } impl ScopeGuard where F: FnMut(&mut T) { pub fn new(v: T, dropfn: F) -> ScopeGuard { ScopeGuard { __value: v, __dropfn: dropfn } } } impl Drop for ScopeGuard where F: FnMut(&mut T) { fn drop(&mut self) { (self.__dropfn)(&mut self.__value) } } // https://crates.io/crates/errloc_macros macro_rules! errloc { () => { concat!(file!(), ':', line!()) } } fn errloc_msg<'a>(e: &'a Box) -> &'a str { match e.downcast_ref::<&str>() { Some(st) => st, None => { match e.downcast_ref::() { Some(stw) => stw.as_str(), None => "()", } }, } } // implementation use std; use std::os::raw::*; use std::ptr::{null, null_mut}; // constants pub const ATTACH_PARENT_PROCESS: c_ulong = 0xFFFFFFFF; pub const CREATE_NO_WINDOW: c_ulong = 0x08000000; const CP_UTF8: c_ulong = 65001; const FORMAT_MESSAGE_ALLOCATE_BUFFER: c_ulong = 0x00000100; const FORMAT_MESSAGE_FROM_SYSTEM: c_ulong = 0x00001000; const FORMAT_MESSAGE_IGNORE_INSERTS: c_ulong = 0x00000200; const LANG_NEUTRAL: c_ushort = 0x00; const SUBLANG_DEFAULT: c_ushort = 0x01; const ERROR_SUCCESS: c_ulong = 0; const READ_CONTROL: c_ulong = 0x00020000; const STANDARD_RIGHTS_READ: c_ulong = READ_CONTROL; const KEY_QUERY_VALUE: c_ulong = 0x0001; const KEY_ENUMERATE_SUB_KEYS: c_ulong = 0x0008; const KEY_NOTIFY: c_ulong = 0x0010; const SYNCHRONIZE: c_ulong = 0x00100000; const REG_SZ: c_ulong = 1; const KEY_READ: c_ulong = ( STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY ) & (!SYNCHRONIZE); const HKEY_LOCAL_MACHINE: *mut c_void = 0x80000002 as *mut c_void; // function declarations extern "system" { pub fn AttachConsole(dwProcessId: c_ulong) -> c_int; fn MultiByteToWideChar( CodePage: c_uint, dwFlags: c_ulong, lpMultiByteStr: *const c_char, cbMultiByte: c_int, lpWideCharStr: *mut c_ushort, cchWideChar: c_int ) -> c_int; fn WideCharToMultiByte( CodePage: c_uint, dwFlags: c_ulong, lpWideCharStr: *const c_ushort, cchWideChar: c_int, lpMultiByteStr: *mut c_char, cbMultiByte: c_int, lpDefaultChar: *const c_char, lpUsedDefaultChar: *mut c_int ) -> c_int; fn GetLastError() -> c_ulong; fn FormatMessageW( dwFlags: c_ulong, lpSource: *const c_void, dwMessageId: c_ulong, dwLanguageId: c_ulong, lpBuffer: *mut c_ushort, nSize: c_ulong, Arguments: *mut *mut c_char ) -> c_ulong; fn LocalFree( hMem: *mut c_void ) -> *mut c_void; fn RegOpenKeyExW( hKey: *mut c_void, lpSubKey: *const c_ushort, ulOptions: c_ulong, samDesired: c_ulong, phkResult: *mut *mut c_void ) -> c_long; fn RegQueryInfoKeyW( hKey: *mut c_void, lpClass: *mut c_ushort, lpcchClass: *mut c_ulong, lpReserved: *mut c_ulong, lpcSubKeys: *mut c_ulong, lpcbMaxSubKeyLen: *mut c_ulong, lpcbMaxClassLen: *mut c_ulong, lpcValues: *mut c_ulong, lpcbMaxValueNameLen: *mut c_ulong, lpcbMaxValueLen: *mut c_ulong, lpcbSecurityDescriptor: *mut c_ulong, lpftLastWriteTime: *mut c_void ) -> c_long; fn RegEnumKeyExW( hKey: *mut c_void, dwIndex: c_ulong, lpName: *mut c_ushort, lpcchName: *mut c_ulong, lpReserved: *mut c_ulong, lpClass: *mut c_ushort, lpcchClass: *mut c_ulong, lpftLastWriteTime: *mut c_void ) -> c_long; fn RegCloseKey( hKey: *mut c_void ) -> c_long; fn RegQueryValueExW( hKey: *mut c_void, lpValueName: *const c_ushort, lpReserved: *mut c_ulong, lpType: *mut c_ulong, lpData: *mut c_uchar, lpcbData: *mut c_ulong ) -> c_long; } // windows-specific utilities fn MAKELANGID(p: c_ushort, s: c_ushort) -> c_ushort { (s << 10 | p) } fn widen(st: &str) -> Vec { unsafe { let size_needed = MultiByteToWideChar( CP_UTF8, 0, st.as_ptr() as *mut i8, st.len() as c_int, null_mut::(), 0); if 0 == size_needed { panic!(format!("Error on string widen calculation, \ string: [{}], error: [{}]", st, errcode_to_string(GetLastError()))); } let mut res: Vec = Vec::new(); res.resize((size_needed + 1) as usize, 0); let chars_copied = MultiByteToWideChar( CP_UTF8, 0, st.as_ptr() as *mut i8, st.len() as c_int, res.as_mut_ptr(), size_needed); if chars_copied != size_needed { panic!(format!("Error on string widen execution, \ string: [{}], error: [{}]", st, errcode_to_string(GetLastError()))); } res.resize(size_needed as usize, 0); res } } fn narrow(wst: &[u16]) -> String { unsafe { let size_needed = WideCharToMultiByte( CP_UTF8, 0, wst.as_ptr(), wst.len() as c_int, null_mut::(), 0, null::(), null_mut::()); if 0 == size_needed { panic!(format!("Error on string narrow calculation, \ string length: [{}], error code: [{}]", wst.len(), GetLastError())); } let mut vec: Vec = Vec::new(); vec.resize(size_needed as usize, 0); let bytes_copied = WideCharToMultiByte( CP_UTF8, 0, wst.as_ptr(), wst.len() as c_int, vec.as_mut_ptr() as *mut i8, size_needed, null::(), null_mut::()); if bytes_copied != size_needed { panic!(format!("Error on string narrow execution, \ string length: [{}], error code: [{}]", vec.len(), GetLastError())); } String::from_utf8(vec).expect(errloc!()) } } fn errcode_to_string(code: c_ulong) -> String { if 0 == code { return String::new(); } unsafe { let mut buf: *mut u16 = null_mut::(); let size = FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, null::(), code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) as c_ulong, std::mem::transmute::<*mut *mut u16, *mut u16>(&mut buf), 0, null_mut::<*mut c_char>()); if 0 == size { return format!("Cannot format code: [{}] \ into message, error code: [{}]", code, GetLastError()); } defer!({ LocalFree(buf as *mut c_void); }); if size <= 2 { return format!("code: [{}], message: []", code); } std::panic::catch_unwind(|| { let slice = std::slice::from_raw_parts(buf, (size - 2) as usize); let msg = narrow(slice); format!("code: [{}], message: [{}]", code, msg) }).unwrap_or_else(|e| { format!("Cannot format code: [{}] \ into message, narrow error: [{}]", code, errloc_msg(&e)) }) } } /* try to get with the following preference: - JRE 1.8 - JDK 1.8 - max JDK >= 9 - max JRE >= 9 (only 9 or 10 possible) - max JDK < 1.8 - max JRE < 1.8 */ pub fn java_registry_path() -> Result { let mut java_key_name = String::new(); let jskeys = vec!["Java Runtime Environment", "Java Development Kit", "JDK", "JRE"]; for jskey in jskeys.iter() { let reg_key_name = r"SOFTWARE\JavaSoft\".to_string() + jskey; let wreg_key_name = widen(®_key_name); unsafe { // open regkey let mut reg_key = null_mut::(); let err_java = RegOpenKeyExW( HKEY_LOCAL_MACHINE, wreg_key_name.as_ptr(), 0, KEY_READ | KEY_ENUMERATE_SUB_KEYS, &mut reg_key) as u32; if ERROR_SUCCESS != err_java { continue; } defer!({ RegCloseKey(reg_key); }); // get subkey count let mut sub_cnt: c_ulong = 0; let err_cnt = RegQueryInfoKeyW( reg_key, null_mut::(), null_mut::(), null_mut::(), &mut sub_cnt, null_mut::(), null_mut::(), null_mut::(), null_mut::(), null_mut::(), null_mut::(), null_mut::()) as u32; if ERROR_SUCCESS != err_cnt || !(sub_cnt > 0) { continue; } // get last subkey let mut sub_key = Vec::with_capacity(256); let mut sub_len = sub_key.capacity() as u32; let err_sub = RegEnumKeyExW( reg_key, sub_cnt-1, sub_key.as_mut_ptr(), &mut sub_len, null_mut::(), null_mut::(), null_mut::(), null_mut::()) as u32; if ERROR_SUCCESS != err_sub { continue; } sub_key.set_len(sub_len as usize); let slice = std::slice::from_raw_parts(sub_key.as_ptr(), sub_key.len() as usize); let jpath = narrow(slice); java_key_name = reg_key_name + r"\" + &jpath; if jpath.starts_with("1.8") || jskey.len() == 3 { break; } } } if java_key_name.len() == 0 { return Err(2); } let wjava_key_name = widen(&java_key_name); let java_home = "JavaHome"; let wjava_home = widen("JavaHome"); unsafe { // open root let mut java_key = null_mut::(); let err_java = RegOpenKeyExW( HKEY_LOCAL_MACHINE, wjava_key_name.as_ptr(), 0, KEY_READ | KEY_ENUMERATE_SUB_KEYS, &mut java_key) as u32; if ERROR_SUCCESS != err_java { return Err(err_java); } defer!({ RegCloseKey(java_key); }); // find out value len let mut value_len: c_ulong = 0; let mut value_type: c_ulong = 0; let err_len = RegQueryValueExW( java_key, wjava_home.as_ptr(), null_mut::(), &mut value_type, null_mut::(), &mut value_len) as u32; if ERROR_SUCCESS != err_len || !(value_len > 0) || REG_SZ != value_type { panic!(format!("Error opening registry value len, \ key: [{}], value: [{}], message: [{}]", java_key_name, java_home, errcode_to_string(err_len))); } // get value let mut wvalue: Vec = Vec::new(); wvalue.resize((value_len as usize) / std::mem::size_of::(), 0); let err_val = RegQueryValueExW( java_key, wjava_home.as_ptr(), null_mut::(), null_mut::(), wvalue.as_mut_ptr() as *mut c_uchar, &mut value_len) as u32; if ERROR_SUCCESS != err_val { panic!(format!("Error opening registry value, \ key: [{}], value: [{}], message: [{}]", java_key_name, java_home, errcode_to_string(err_val))); } // format and return path let slice = std::slice::from_raw_parts(wvalue.as_ptr(), wvalue.len() - 1 as usize); let mut jpath = narrow(slice); if '\\' as u8 != jpath.as_bytes()[jpath.len() - 1] { jpath.push('\\'); } return Ok(jpath); } } } icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/main.rs0000644000000000000000000000013113441764270020074 xustar0030 mtime=1552410808.315367818 29 atime=1552410814.99535218 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/main.rs0000644000175000002070000004457613441764270020725 0ustar00jvanekmock00000000000000#![windows_subsystem = "windows"] mod hardcoded_paths; mod property_from_file; mod os_access; mod dirs_paths_helper; mod property_from_files_resolver; mod utils; mod property; mod jars_helper; mod log_helper; use std::string::String; use std::fmt::Write; use os_access::Os; use std::env; #[cfg(not(windows))] fn get_os(debug: bool, al: bool) -> os_access::Linux { os_access::Linux::new(debug, al) } #[cfg(windows)] fn get_os(debug: bool, al: bool, ic: bool) -> os_access::Windows { os_access::Windows::new(debug, al, ic) } fn is_debug_on() -> bool { match is_debug_on_testable(env::args().collect::>()) { Some(val) => { return val; } _none => { #[cfg(not(windows))] let os = get_os(false, false); #[cfg(windows)] let os = get_os(false, false, true); return property_from_files_resolver::try_main_verbose_from_properties(&os); } } } fn is_debug_on_testable(aargs: Vec) -> Option { for s in aargs { if clean_param(s) == ("-verbose") { return Some(true); } } None } fn is_headless_enforced() -> bool { is_headless_enforced_testable(env::args().collect::>()) } fn is_headless_enforced_testable(aargs: Vec) -> bool { for s in aargs { if clean_param(s) == ("-headless") { return true; } } false } fn is_splash_forbidden() -> bool { is_splash_forbidden_testable(env::vars().collect::>()) } fn is_splash_forbidden_testable(vars: Vec<(String, String)>) -> bool { for (key, value) in vars { if key == "ICEDTEA_WEB_SPLASH" { if value.to_lowercase() == "true" { return false; } return true; } } false } fn main() { let os; #[cfg(windows)] { use os_access::win; let acr: i32; unsafe { acr = win::AttachConsole(win::ATTACH_PARENT_PROCESS) }; os = get_os(is_debug_on(), true, acr != 0); } #[cfg(not(windows))] { os = get_os(is_debug_on(), true); } os.log(&dirs_paths_helper::path_to_string(&dirs_paths_helper::current_program())); let java_dir = utils::find_jre(&os); let mut info2 = String::new(); write!(&mut info2, "selected jre: {}", java_dir.display()).expect("unwrap failed"); os.info(&info2); let a = env::args(); let s = a.skip(1); let c: std::vec::Vec = s.collect(); let mut child = os.spawn_java_process(&java_dir, &compose_arguments(&java_dir, &c, &os)); let ecode = child.wait().expect("failed to wait on child"); let code = ecode.code().expect("code should be always here"); std::process::exit(code) } fn compose_arguments(java_dir: &std::path::PathBuf, original_args: &std::vec::Vec, os: &os_access::Os) -> Vec { let hard_bootcp = hardcoded_paths::get_bootcp(); let bootcp = jars_helper::get_bootclasspath(&java_dir, os); let cp = jars_helper::get_classpath(&java_dir, os); let current_name = dirs_paths_helper::current_program_name(); let current_bin = dirs_paths_helper::current_program(); let mut info2 = String::new(); write!(&mut info2, "itw-rust-debug: exemplar boot classpath: {}", hard_bootcp).expect("unwrap failed"); os.log(&info2); info2 = String::new(); write!(&mut info2, "itw-rust-debug: used boot classpath: {}", bootcp).expect("unwrap failed"); os.log(&info2); info2 = String::new(); write!(&mut info2, "itw-rust-debug: used classpath: {}", cp).expect("unwrap failed"); os.log(&info2); info2 = String::new(); write!(&mut info2, "itw-rust-debug: expected name: {}", hardcoded_paths::get_name()).expect("unwrap failed"); os.log(&info2); info2 = String::new(); write!(&mut info2, "itw-rust-debug: current name: {}", current_name).expect("unwrap failed"); os.log(&info2); info2 = String::new(); write!(&mut info2, "itw-rust-debug: installed bin: {}", hardcoded_paths::get_bin()).expect("unwrap failed"); os.log(&info2); info2 = String::new(); write!(&mut info2, "itw-rust-debug: current bin: {}", &dirs_paths_helper::path_to_string(¤t_bin)).expect("unwrap failed"); os.log(&info2); let mut bin_name = String::from("-Dicedtea-web.bin.name="); let mut bin_location = String::from("-Dicedtea-web.bin.location="); //no metter what ITW_LIBS are saying, imho using current pgm is always correct comapred to hardcoded values bin_name.push_str(¤t_name); bin_location.push_str(&dirs_paths_helper::path_to_string(¤t_bin)); let mut all_args = std::vec::Vec::new(); include_dashJs_values(&original_args, &mut all_args, os); match get_splash(os) { Some(switch) => { all_args.push(switch); } _none => { os.log("itw-rust-debug: splash excluded"); } } if is_modular_jdk(os, &java_dir) { all_args.push(resolve_argsfile(os)); let js_object_candidate = get_jsobject_patchmodule(os); match js_object_candidate { Some(js_object_path) => { all_args.push(js_object_path.0); all_args.push(js_object_path.1); } _none => {} } } all_args.push(bootcp); all_args.push(String::from("-classpath")); all_args.push(cp); all_args.push(bin_name); all_args.push(bin_location); all_args.push(hardcoded_paths::get_main().to_string()); include_not_dashJs(&original_args, &mut all_args); all_args } fn is_modular_jdk(os: &os_access::Os, jre_dir: &std::path::PathBuf) -> bool { if jdk_version(os, jre_dir) > 8 { os.log("itw-rust-debug: modular jdk"); true } else { os.log("itw-rust-debug: non-modular jdk"); false } } fn jdk_version(os: &os_access::Os, jre_dir: &std::path::PathBuf) -> i32 { let vec = vec!["-version".to_string()]; //this of course fails during tests let output_result = os_access::create_java_cmd(os, jre_dir, &vec).output(); match output_result { Ok(output) => { for line in String::from_utf8(output.stderr).expect("java version was supopsed to return output").lines() { if line.contains("version") && (line.contains("\"1") || line.contains("\"2") || line.contains("\"3")) { if line.contains("\"1.7.0") || line.contains("\"1.7.1") { os.log("itw-rust-debug: detected jdk 7"); return 7 } else if line.contains("\"1.8.0") { os.log("itw-rust-debug: detected jdk 8"); return 8 } else { //currently this serves only to determine module/non modular jdk os.log("itw-rust-debug: detected jdk 9 or up"); return 9 } } } os.log("itw-rust-debug: unrecognized jdk! Fallback to 8!"); return 8; } _error => { os.log("itw-rust-debug: failed to launch jdk recognition. fallback to 8"); return 8 } } } fn resolve_argsfile(os: &os_access::Os) -> String { let args_location = dirs_paths_helper::path_to_string(&jars_helper::resolve_argsfile(os)); let mut owned_string: String = args_location.to_owned(); let splash_switch: &str = "@"; owned_string.insert_str(0, splash_switch); let r = String::from(owned_string); r } fn get_jsobject_patchmodule(os: &os_access::Os) -> Option<(String, String)> { let js_object_candidate = jars_helper::resolve_jsobject(os); match js_object_candidate { Some(js_object_path) => { let args_location = dirs_paths_helper::path_to_string(&js_object_path); let mut owned_string: String = args_location.to_owned(); let splash_switch: &str = "jdk.jsobject="; owned_string.insert_str(0, splash_switch); let r = String::from(owned_string); let tuple = ("--patch-module".to_string(), r); return Some(tuple) } None => { return None } } } fn get_splash(os: &os_access::Os) -> Option { let headless = is_headless_enforced(); let splash_forbidden = is_splash_forbidden(); get_splash_testable(headless, splash_forbidden, os) } fn get_splash_testable(headless: bool, splash_forbidden: bool, os: &os_access::Os) -> Option { if !headless && !splash_forbidden { let splash_location = dirs_paths_helper::path_to_string(&jars_helper::resolve_splash(os)); let mut owned_string: String = splash_location.to_owned(); let splash_switch: &str = "-splash:"; owned_string.insert_str(0, splash_switch); let r = String::from(owned_string); Some(r) } else { None } } fn clean_param(s: String) -> String { let mut ss = String::from(s); let was = ss.starts_with("-"); while ss.starts_with("-") { ss = ss[1..ss.len()].to_string(); } if was { ss.insert_str(0, "-"); } String::from(ss) } #[allow(non_snake_case)] fn include_not_dashJs(srcs: &Vec, target: &mut Vec) { for f in srcs.iter() { if !f.to_string().starts_with("-J") { target.push(f.to_string()); } } } #[allow(non_snake_case)] fn include_dashJs_values(srcs: &Vec, target: &mut Vec, os: &os_access::Os) { for f in srcs.iter() { if f.to_string().starts_with("-J") { let s = String::from(f.to_string().get(2..).expect("-J should be substring-able by 2")); if s.is_empty() { os.info("Warning, empty -J switch") } else { target.push(s); } } } } #[cfg(test)] pub mod tests_main { use utils::tests_utils as tu; #[test] fn is_splash_forbidden_test() { let mut vec: Vec<(String, String)> = Vec::new(); assert_eq!(super::is_splash_forbidden_testable(vec), false); vec = Vec::new(); vec.push(("".to_string(), "".to_string())); assert_eq!(super::is_splash_forbidden_testable(vec), false); vec = Vec::new(); vec.push(("-blah".to_string(), "-blah".to_string())); vec.push(("-verbose".to_string(), "-blah".to_string())); assert_eq!(super::is_splash_forbidden_testable(vec), false); vec = Vec::new(); vec.push(("-blah".to_string(), "-blah".to_string())); vec.push(("ICEDTEA_WEB_SPLASH".to_string(), "".to_string())); vec.push(("-headless".to_string(),"-blah".to_string())); assert_eq!(super::is_splash_forbidden_testable(vec), true); vec = Vec::new(); vec.push(("-blah".to_string(), "-blah".to_string())); vec.push(("ICEDTEA_WEB_SPLASH".to_string(), "".to_string())); vec.push(("---headless".to_string(), "-blah".to_string())); assert_eq!(super::is_splash_forbidden_testable(vec), true); vec = Vec::new(); vec.push(("-blah".to_string(), "-blah".to_string())); vec.push(("aICEDTEA_WEB_SPLASH".to_string(), "".to_string())); vec.push(("---headless".to_string(), "-blah".to_string())); assert_eq!(super::is_splash_forbidden_testable(vec), false); vec = Vec::new(); vec.push(("-blah".to_string(), "-blah".to_string())); vec.push(("ICEDTEA_WEB_SPLASHb".to_string(), "".to_string())); vec.push(("---headless".to_string(), "-blah".to_string())); assert_eq!(super::is_splash_forbidden_testable(vec), false); vec = Vec::new(); vec.push(("-blah".to_string(), "-blah".to_string())); vec.push(("aICEDTEA_WEB_SPLASHb".to_string(), "".to_string())); vec.push(("---headless".to_string(), "-blah".to_string())); assert_eq!(super::is_splash_forbidden_testable(vec), false); vec = Vec::new(); vec.push(("ICEDTEA_WEB_SPLASH".to_string(), "value".to_string())); vec.push(("---headless".to_string(), "-blah".to_string())); assert_eq!(super::is_splash_forbidden_testable(vec), true); vec = Vec::new(); vec.push(("ICEDTEA_WEB_SPLASH".to_string(), "true".to_string())); vec.push(("---headless".to_string(), "-blah".to_string())); assert_eq!(super::is_splash_forbidden_testable(vec), false); } #[test] fn is_headless_enforced_test() { let mut vec: Vec = Vec::new(); assert_eq!(super::is_headless_enforced_testable(vec), false); vec = Vec::new(); vec.push("".to_string()); assert_eq!(super::is_headless_enforced_testable(vec), false); vec = Vec::new(); vec.push("-blah".to_string()); vec.push("-verbose".to_string()); assert_eq!(super::is_headless_enforced_testable(vec), false); vec = Vec::new(); vec.push("-blah".to_string()); vec.push("-verbose".to_string()); vec.push("headless".to_string()); assert_eq!(super::is_headless_enforced_testable(vec), false); vec = Vec::new(); vec.push("-blah".to_string()); vec.push("-verbose".to_string()); vec.push("-headless".to_string()); assert_eq!(super::is_headless_enforced_testable(vec), true); vec = Vec::new(); vec.push("-blah".to_string()); vec.push("-verbose".to_string()); vec.push("---headless".to_string()); assert_eq!(super::is_headless_enforced_testable(vec), true); } #[test] fn is_debug_on_test() { let mut vec: Vec = Vec::new(); assert_eq!(super::is_debug_on_testable(vec), None); vec = Vec::new(); vec.push("".to_string()); assert_eq!(super::is_debug_on_testable(vec), None); vec = Vec::new(); vec.push("-blah".to_string()); vec.push("-headless".to_string()); assert_eq!(super::is_debug_on_testable(vec), None); vec = Vec::new(); vec.push("-blah".to_string()); vec.push("verbose".to_string()); vec.push("-headless".to_string()); assert_eq!(super::is_debug_on_testable(vec), None); vec = Vec::new(); vec.push("-blah".to_string()); vec.push("-verbose".to_string()); vec.push("-headless".to_string()); assert_eq!(super::is_debug_on_testable(vec), Some(true)); vec = Vec::new(); vec.push("-blah".to_string()); vec.push("---verbose".to_string()); vec.push("-headless".to_string()); assert_eq!(super::is_debug_on_testable(vec), Some(true)); } #[test] fn get_splash_test() { assert_eq!(super::get_splash_testable(true, false, &tu::TestLogger::create_new()), None); assert_eq!(super::get_splash_testable(false, true, &tu::TestLogger::create_new()), None); assert_eq!(super::get_splash_testable(true, true, &tu::TestLogger::create_new()), None); let some = super::get_splash_testable(false, false, &tu::TestLogger::create_new()); assert_eq!(some == None, false); let val = some.expect("is known to be not none"); assert_eq!(val.starts_with("-splash:"), true); } #[test] fn clean_param_test() { assert_eq!(super::clean_param(String::from("-verbose")), String::from("-verbose")); assert_eq!(super::clean_param(String::from("--verbose")), String::from("-verbose")); assert_eq!(super::clean_param(String::from("------verbose")), String::from("-verbose")); assert_eq!(super::clean_param(String::from("a-headless")), String::from("a-headless")); assert_eq!(super::clean_param(String::from("-a-headless")), String::from("-a-headless")); assert_eq!(super::clean_param(String::from("----a-headless")), String::from("-a-headless")); assert_eq!(super::clean_param(String::from("test-")), String::from("test-")); assert_eq!(super::clean_param(String::from("-test-")), String::from("-test-")); assert_eq!(super::clean_param(String::from("verbose")), String::from("verbose")); } #[test] fn compose_arguments_test() { // this test just ensures -Js are first, and all others are last, and something get betwen them let switches = vec![ String::from("-a"), String::from("-J-b")]; let result = super::compose_arguments(&std::path::PathBuf::from("/some/jre"), &switches, &tu::TestLogger::create_new()); assert_eq!(result.len() > 3, true); assert_eq!(result.get(0).expect("first item should exists"), &String::from("-b")); assert_eq!(result.get(result.len() - 1).expect("last item should exists"), &String::from("-a")); } #[test] #[allow(non_snake_case)] fn include_not_dashJs_test() { let switches = vec![ String::from("-J-a"), String::from("-b"), String::from("--Jc"), String::from("d")]; let mut result = Vec::new(); super::include_not_dashJs(&switches, &mut result); let ex = vec![ String::from("-b"), String::from("--Jc"), String::from("d")]; assert_eq!(ex, result); } #[test] #[allow(non_snake_case)] fn include_not_dashJs_test_empty() { let switches: Vec = vec![]; let mut result: Vec = Vec::new(); let ex: Vec = Vec::new(); super::include_not_dashJs(&switches, &mut result); assert_eq!(ex, result); } #[test] #[allow(non_snake_case)] fn include_dashJs_valuess_test() { let switches = vec![ String::from("-J-a"), String::from("-b"), String::from("--Jc"), String::from("-J"), //not added, have no arg String::from("-J-"), //added String::from("-Jd")]; let mut result = Vec::new(); super::include_dashJs_values(&switches, &mut result, &tu::TestLogger::create_new()); let ex = vec![ String::from("-a"), String::from("-"), String::from("d")]; assert_eq!(ex, result); } #[test] #[allow(non_snake_case)] fn include_dashJs_values_test_empty() { let switches: Vec = vec![]; let mut result: Vec = Vec::new(); let ex: Vec = Vec::new(); super::include_dashJs_values(&switches, &mut result, &tu::TestLogger::create_new()); assert_eq!(ex, result); } } icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/dirs_paths_helper.rs0000644000000000000000000000013213441764270022650 xustar0030 mtime=1552410808.314367821 30 atime=1552410814.994352182 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/dirs_paths_helper.rs0000644000175000002070000001463713441764270023473 0ustar00jvanekmock00000000000000use os_access; use std; use std::io; use std::env; #[cfg(windows)] extern crate dunce; pub static ICEDTEA_WEB: &'static str = "icedtea-web"; pub static DEPLOYMENT_PROPERTIES: &'static str = "deployment.properties"; pub fn get_xdg_config_dir(os: &os_access::Os) -> Option { match env::var("XDG_CONFIG_HOME") { Ok(war) => { Some(std::path::PathBuf::from(war)) } Err(_) => { match os.get_home() { Some(mut p) => { p.push(".config"); Some(p) } None => None } } } } pub fn append_deployment_file(dir: Option) -> Option { match dir { Some(mut p) => { p.push(DEPLOYMENT_PROPERTIES); Some(p) } None => None } } pub fn get_itw_config_file(os: &os_access::Os) -> Option { append_deployment_file(os.get_user_config_dir()) } pub fn get_itw_legacy_config_file(os: &os_access::Os) -> Option { append_deployment_file(os.get_legacy_user_config_dir()) } pub fn get_itw_legacy_global_config_file(os: &os_access::Os) -> Option { append_deployment_file(os.get_legacy_system_config_javadir()) } pub fn get_itw_global_config_file(os: &os_access::Os) -> Option { append_deployment_file(os.get_system_config_javadir()) } pub fn is_file(path: &std::path::PathBuf) -> bool { path.metadata().map(|md| md.is_file()).unwrap_or(false) } pub fn is_dir(path: &std::path::PathBuf) -> bool { path.metadata().map(|md| md.is_dir()).unwrap_or(false) } pub fn path_to_string(path: &std::path::PathBuf) -> String { path.to_str().expect("unwrap of os string failed").to_string() } pub fn current_program() -> std::path::PathBuf { env::current_exe().expect("unwrap of pgm path failed") } pub fn current_program_parent() -> std::path::PathBuf { std::path::PathBuf::from(current_program().parent().expect("getting of pgm dir failed")) } pub fn current_program_name() -> String { String::from(current_program().file_name().expect("unwrap of pgm name failed").to_str().expect("unwrap of pgm name failed")) } #[cfg(not(windows))] pub fn canonicalize(full_path: &std::path::PathBuf) -> Result { full_path.canonicalize() } #[cfg(windows)] pub fn canonicalize(full_path: &std::path::PathBuf) -> Result { dunce::canonicalize(&full_path) } /*tests*/ #[cfg(test)] mod tests { use std; use std::fs; use os_access; use utils::tests_utils as tu; #[cfg(not(windows))] fn get_os() -> os_access::Linux { os_access::Linux::new(false, false) } #[cfg(windows)] fn get_os() -> os_access::Windows { os_access::Windows::new(false, false, true) } #[test] fn check_config_files_paths() { let os = get_os(); let p3 = super::get_itw_config_file(&os); assert_ne!(None, p3); println!("{}", p3.clone().expect("unwrap failed").display()); assert_eq!(true, p3.clone().expect("unwrap failed").display().to_string().contains("icedtea-web")); assert_eq!(true, p3.clone().expect("unwrap failed").display().to_string().ends_with("deployment.properties")); } #[test] #[cfg(not(windows))] fn check_config_files_paths_global() { let os = os_access::Linux::new(false, false); let p6 = super::get_itw_global_config_file(&os); assert_ne!(None, p6); println!("{}", p6.clone().expect("unwrap failed").display()); assert_eq!(true, p6.clone().expect("unwrap failed").display().to_string().ends_with("deployment.properties")); } #[test] #[cfg(not(windows))] fn check_legacy_config_files_paths() { let os = os_access::Linux::new(false, false); let p4 = super::get_itw_legacy_config_file(&os); let p5 = super::get_itw_legacy_global_config_file(&os); assert_ne!(None, p4); assert_ne!(None, p5); println!("{}", p4.clone().expect("unwrap failed").display()); println!("{}", p5.clone().expect("unwrap failed").display()); assert_eq!(true, p4.clone().expect("unwrap failed").display().to_string().contains(".icedtea")); assert_eq!(true, p4.clone().expect("unwrap failed").display().to_string().ends_with("deployment.properties")); assert_eq!(true, p5.clone().expect("unwrap failed").display().to_string().contains("etc")); assert_eq!(true, p5.clone().expect("unwrap failed").display().to_string().contains(".java")); assert_eq!(true, p5.clone().expect("unwrap failed").display().to_string().contains(".deploy")); assert_eq!(true, p5.clone().expect("unwrap failed").display().to_string().ends_with("deployment.properties")); assert_eq!(true, p5.clone().expect("unwrap failed").display().to_string().contains("etc")); assert_eq!(true, p5.clone().expect("unwrap failed").display().to_string().contains(".java")); assert_eq!(true, p5.clone().expect("unwrap failed").display().to_string().contains("deployment")); } #[test] fn is_not_file() { let r = super::is_file(&std::path::PathBuf::from("/definitely/not/existing/file")); assert_eq!(false, r); } #[test] fn is_not_file_is_dir() { let dir = tu::create_tmp_file(); tu::debuggable_remove_file(&dir); let _cd = fs::create_dir(&dir); //silenting compiler worning let r = super::is_file(&dir); tu::debuggable_remove_dir(&dir); assert_eq!(false, r); } #[test] fn is_file() { let file = tu::create_tmp_file(); let r = super::is_file(&file); tu::debuggable_remove_file(&file); assert_eq!(true, r); } #[test] fn is_not_dir() { let r = super::is_dir(&std::path::PathBuf::from("/definitely/not/existing/file")); assert_eq!(false, r); } #[test] fn is_dir() { let dir = tu::create_tmp_file(); tu::debuggable_remove_file(&dir); let _cd = fs::create_dir(&dir); //silenting compiler worning let r = super::is_dir(&dir); tu::debuggable_remove_dir(&dir); assert_eq!(true, r); } #[test] fn is_not_dir_is_file() { let file = tu::create_tmp_file(); let r = super::is_dir(&file); tu::debuggable_remove_file(&file); assert_eq!(false, r); } } icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/log_helper.rs0000644000000000000000000000013213441742745021274 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.251253449 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/log_helper.rs0000644000175000002070000000656113441742745022114 0ustar00jvanekmock00000000000000//this module was created as std::io::Write; and std::fmt::Write; hcat be imoted together //adn still, there are different methods. Notably writeln is only in io version. but format! is only in fmt version use os_access; use std::fs::OpenOptions; use std::io::Write; use std::time::SystemTime; use std::time::UNIX_EPOCH; use std::fs::File; use property_from_files_resolver; static mut FIRST: bool = true; //0 critical //1 info //2 debug only pub fn log_impl(level: i32, os: &os_access::Os, s: &str) { if level == 0 { if os.advanced_logging().log_to_stdstreams { println!("{}", s); } if os.advanced_logging().log_to_system { let mut info2 = String::from("IcedTea-Web nativerustlauncher error. Consult - https://icedtea.classpath.org/wiki/IcedTea-Web\n"); info2.push_str(s); os.system_log(&info2); } } else if level == 1 { if os.advanced_logging().log_to_stdstreams { println!("{}", s); } } else if level == 2 { if os.is_verbose() { if os.advanced_logging().log_to_stdstreams { println!("{}", s); } } } if os.advanced_logging().log_to_file { unsafe { if FIRST { FIRST = false; std::fs::create_dir_all(os.advanced_logging().log_target_file.parent().expect("hard to imagine log file without parent")); let start = SystemTime::now(); let t = start.duration_since(UNIX_EPOCH).expect("time should be measureable"); let mut file = File::create(&os.advanced_logging().log_target_file).expect("failed to create file log"); let allsec = t.as_secs(); let sec = allsec % 60; let min = (allsec / 60) % 60; let h = allsec / (60 * 60); if let Err(e) = write!(&mut file, "itw-rust-debug: file log started: {}:{}:{}\n", h, min, sec) { println!("Couldn't write to file: {}", e); } file.sync_all(); } } let mut file = OpenOptions::new() .write(true) .append(true) .open(&os.advanced_logging().log_target_file) .expect("failed to append to file log"); if let Err(e) = writeln!(&mut file, "{}", s) { println!("Couldn't write to file: {}", e); } file.sync_all(); } } pub struct AdvancedLogging { pub log_to_file: bool, pub log_target_file: std::path::PathBuf, pub log_to_stdstreams: bool, pub log_to_system: bool, } impl Default for AdvancedLogging { fn default() -> AdvancedLogging { AdvancedLogging { log_to_file: false, log_target_file: std::path::PathBuf::from("undeffined"), log_to_stdstreams: true, log_to_system: true, } } } impl AdvancedLogging { pub fn load(os: &os_access::Os) -> AdvancedLogging { AdvancedLogging { log_to_file: property_from_files_resolver::try_log_to_file_from_properties(os), log_to_stdstreams: property_from_files_resolver::try_log_to_streams_from_properties(os), log_to_system: property_from_files_resolver::try_log_to_system_from_properties(os), log_target_file: property_from_files_resolver::try_logtarget_from_properties(os), } } }icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/property_from_file.rs0000644000000000000000000000013213441742745023062 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.251253449 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/property_from_file.rs0000644000175000002070000002100613441742745023671 0ustar00jvanekmock00000000000000use property; use hardcoded_paths; use dirs_paths_helper as dh; use std; use std::string::String; use std::fs::File; use std::fmt::Write; pub static JRE_PROPERTY_NAME: &'static str = "deployment.jre.dir"; pub static VERBOSE_PROPERTY_NAME: &'static str = "deployment.log"; pub static KEY_USER_LOG_DIR: &'static str = "deployment.user.logdir"; //custom log file; default to xdg_confgi/icedtea-web/log pub static KEY_ENABLE_LOGGING_TOFILE: &'static str = "deployment.log.file"; //is loging to file enabled? default false pub static KEY_ENABLE_LOGGING_TOSTREAMS: &'static str = "deployment.log.stdstreams";//is logging to stdouts enabled?defoult true pub static KEY_ENABLE_LOGGING_TOSYSTEMLOG: &'static str = "deployment.log.system";//is logging to system logs enabled? default true pub trait Validator { fn validate(&self, s: &str) -> bool; fn get_fail_message(&self, key: &str, value: &str, file: &Option) -> String; } pub struct JreValidator {} impl Validator for JreValidator { fn validate(&self, s: &str) -> bool { verify_jdk_string(&s) } fn get_fail_message(&self, key: &str, value: &str, file: &Option) -> String { let mut res = String::new(); write!(&mut res, "Your custom JRE {} read from {} under key {} is not valid.", value, file.clone().expect("jre path should be loaded").display(), key).expect("unwrap failed"); write!(&mut res, " Trying other config files, then using default ({}, {}, registry or JAVA_HOME) in attempt to start. Please fix this.", hardcoded_paths::get_java(), hardcoded_paths::get_jre()).expect("unwrap failed"); return res; } } pub struct BoolValidator {} impl Validator for BoolValidator { fn validate(&self, s: &str) -> bool { verify_bool_string(&s.to_string()) } fn get_fail_message(&self, key: &str, value: &str, file: &Option) -> String { let mut res = String::new(); write!(&mut res, "the boolean value of {} read from {} under key {} is not valid. Expected true or false (key insensitive)", value, file.clone().expect("jre path should be loaded").display(), key).expect("unwrap failed"); return res; } } pub struct NotMandatoryPathValidator {} impl Validator for NotMandatoryPathValidator { fn validate(&self, _s: &str) -> bool { true } fn get_fail_message(&self, key: &str, value: &str, file: &Option) -> String { let mut res = String::new(); write!(&mut res, "the String value of {} read from {} under key {} is not valid. Expected String", value, file.clone().expect("jre path should be loaded").display(), key).expect("unwrap failed"); return res; } } fn verify_bool_string(val: &String) -> bool { val.trim().to_lowercase() == "true" || val.trim().to_lowercase() == "false" } pub fn str_to_bool(val: &String) -> bool { val.trim().to_lowercase() == "true" } pub fn get_property_from_file(file: Option, key: &str) -> Option { match file { None => None, Some(path) => { get_property_from_file_direct(path, key) } } } fn get_property_from_file_direct(path: std::path::PathBuf, key: &str) -> Option { if !path.exists() { None } else if !dh::is_file(&path) { return None; } else { let fileresult = File::open(path); match fileresult { Err(_fe) => None, Ok(file) => { let result = check_file_for_property(file, key); result } } } } fn check_file_for_property(file: File, key: &str) -> Option { let p = property::Property::load(file, key); match p { None => { None } Some(property) => { Some(property.value) } } } fn verify_jdk_string(spath: &str) -> bool { let mut file = std::path::PathBuf::from(spath); file.push("bin"); file.push("java"); if !file.exists() { false } else if !dh::is_file(&file) { false } else { true } } /*tests*/ #[cfg(test)] mod tests { use std; use std::fs::File; use utils::tests_utils as tu; fn get_jre_from_file(file: Option) -> Option { super::get_property_from_file(file, super::JRE_PROPERTY_NAME) } #[test] fn check_file_for_property_jredir_not_found() { let path = tu::create_tmp_file(); let f = File::open(&path); let prop = super::check_file_for_property(f.expect("file was not opened"), super::JRE_PROPERTY_NAME); tu::debuggable_remove_file(&path); assert_eq!(None, prop); } #[test] fn check_file_for_property_jredir() { let path = tu::create_tmp_propfile_with_content(); let f = File::open(&path); let prop = super::check_file_for_property(f.expect("file was not opened"), super::JRE_PROPERTY_NAME); tu::debuggable_remove_file(&path); assert_eq!("/some/jre", prop.expect("property was supposed to be loaded")); } #[test] fn check_file_for_property_not_found() { let path = tu::create_tmp_propfile_with_content(); let f = File::open(&path); let k = "not_existing_key"; let prop = super::check_file_for_property(f.expect("file was not opened"), k); tu::debuggable_remove_file(&path); assert_eq!(None, prop); } #[test] fn check_file_for_property_item_exists() { let path = tu::create_tmp_propfile_with_content(); let f = File::open(&path); let k = "key2"; let prop = super::check_file_for_property(f.expect("file was not opened"), k); tu::debuggable_remove_file(&path); assert_eq!("val2", prop.expect("property was supposed to be loaded")); } #[test] fn get_jre_from_file_exists() { let path = tu::create_tmp_propfile_with_content(); let prop = get_jre_from_file(Some(path.clone())); tu::debuggable_remove_file(&path); assert_eq!("/some/jre", prop.expect("property was supposed to be loaded")); } #[test] fn get_jre_from_file_not_found() { let path = tu::create_tmp_file(); let prop = get_jre_from_file(Some(path.clone())); tu::debuggable_remove_file(&path); assert_eq!(None, prop); } #[test] fn verify_bool_string_true() { assert_eq!(true, super::verify_bool_string(&String::from("true"))); assert_eq!(true, super::verify_bool_string(&String::from("True"))); assert_eq!(true, super::verify_bool_string(&String::from("TRUE"))); assert_eq!(true, super::verify_bool_string(&String::from("false"))); assert_eq!(true, super::verify_bool_string(&String::from("FALSE"))); assert_eq!(true, super::verify_bool_string(&String::from("False"))); } #[test] fn verify_bool_string_false() { assert_eq!(false, super::verify_bool_string(&String::from("truee"))); assert_eq!(false, super::verify_bool_string(&String::from("WHATEVER"))); } #[test] fn str_to_bool_true() { assert_eq!(true, super::str_to_bool(&String::from("true"))); assert_eq!(true, super::str_to_bool(&String::from("True"))); assert_eq!(true, super::str_to_bool(&String::from("TRUE"))); } #[test] fn str_to_bool_false() { assert_eq!(false, super::str_to_bool(&String::from("truee"))); assert_eq!(false, super::str_to_bool(&String::from("WHATEVER"))); assert_eq!(false, super::str_to_bool(&String::from("false"))); assert_eq!(false, super::str_to_bool(&String::from("FALSE"))); assert_eq!(false, super::str_to_bool(&String::from("False"))); } #[test] fn get_jre_from_file_notexists() { let path = tu::create_tmp_file(); tu::debuggable_remove_file(&path); let prop = get_jre_from_file(Some(path)); assert_eq!(None, prop); } #[test] fn get_jre_from_file_none() { let prop = get_jre_from_file(None); assert_eq!(None, prop); } #[test] fn verify_jdk_string_verify_jdk_path_jdk_ok() { let master_dir = tu::fake_jre(true); let vs = super::verify_jdk_string(&master_dir.display().to_string()); tu::debuggable_remove_dir(&master_dir); assert_eq!(true, vs); } #[test] fn verify_jdk_string_verify_jdk_path_jdk_bad() { let master_dir = tu::fake_jre(false); let vs = super::verify_jdk_string(&master_dir.display().to_string()); tu::debuggable_remove_dir(&master_dir); assert_eq!(false, vs); } } icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/hardcoded_paths.rs0000644000000000000000000000013213441742745022270 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.251253449 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/hardcoded_paths.rs0000644000175000002070000001557413441742745023114 0ustar00jvanekmock00000000000000use os_access; use env; use std::string::String; use std::fmt::Write; use std::str::FromStr; /*legacy variables*/ const PROGRAM_NAME: Option<&'static str> = option_env!("PROGRAM_NAME"); const LAUNCHER_BOOTCLASSPATH: Option<&'static str> = option_env!("LAUNCHER_BOOTCLASSPATH"); const SPLASH_PNG: Option<&'static str> = option_env!("SPLASH_PNG"); const JAVA: Option<&'static str> = option_env!("JAVA"); const JRE: Option<&'static str> = option_env!("JRE"); const MAIN_CLASS: Option<&'static str> = option_env!("MAIN_CLASS"); const BIN_LOCATION: Option<&'static str> = option_env!("BIN_LOCATION"); const NETX_JAR: Option<&'static str> = option_env!("NETX_JAR"); const PLUGIN_JAR: Option<&'static str> = option_env!("PLUGIN_JAR"); const JSOBJECT_JAR: Option<&'static str> = option_env!("JSOBJECT_JAR"); const TAGSOUP_JAR: Option<&'static str> = option_env!("TAGSOUP_JAR"); const RHINO_JAR: Option<&'static str> = option_env!("RHINO_JAR"); const ITW_LIBS: Option<&'static str> = option_env!("ITW_LIBS"); const MODULARJDK_ARGS_LOCATION: Option<&'static str> = option_env!("MODULARJDK_ARGS_LOCATION"); const MSLINKS_JAR: Option<&'static str> = option_env!("MSLINKS_JAR"); pub fn get_jre() -> &'static str { JRE.unwrap_or("JRE-dev-unspecified") } pub fn get_java() -> &'static str { JAVA.unwrap_or("JAVA-dev-unspecified") } pub fn get_main() -> &'static str { MAIN_CLASS.unwrap_or("MAIN_CLASS-dev-unspecified") } pub fn get_name() -> &'static str { PROGRAM_NAME.unwrap_or("PROGRAM_NAME-dev-unspecified") } pub fn get_bin() -> &'static str { BIN_LOCATION.unwrap_or("BIN_LOCATION-dev-unspecified") } pub fn get_splash() -> &'static str { SPLASH_PNG.unwrap_or("SPLASH_PNG-dev-unspecified") } pub fn get_netx() -> &'static str { NETX_JAR.unwrap_or("NETX_JAR-dev-unspecified") } fn get_itwlibsearch() -> &'static str { ITW_LIBS.unwrap_or("ITW_LIBS-dev-unspecified") } pub fn get_bootcp() -> &'static str {LAUNCHER_BOOTCLASSPATH.unwrap_or("LAUNCHER_BOOTCLASSPATH-dev-unspecified") } // optional deps pub fn get_plugin() -> Option<&'static str> { sanitize(PLUGIN_JAR) } pub fn get_jsobject() -> Option<&'static str> { sanitize(JSOBJECT_JAR) } pub fn get_tagsoup() -> Option<&'static str> { sanitize(TAGSOUP_JAR) } pub fn get_rhino() -> Option<&'static str> { sanitize(RHINO_JAR) } pub fn get_mslinks() -> Option<&'static str> { sanitize(MSLINKS_JAR) } pub fn get_argsfile() -> &'static str { MODULARJDK_ARGS_LOCATION.unwrap_or("MODULARJDK_ARGS_LOCATION-dev-unspecified") } //unluckily, option_env can go wild and retunr Some("") isntead of None. Fixing here. fn sanitize(candidate: Option<&'static str>) -> Option<&'static str> { match candidate { Some(s) => { if !String::from(String::from(s).trim()).is_empty() { return candidate; } else { return None; } } _none => { return None; } } } #[derive(PartialEq)] pub enum ItwLibSearch { BUNDLED, DISTRIBUTION, BOTH, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct ParseItwLibSearch { _priv: () } impl FromStr for ItwLibSearch { type Err = ParseItwLibSearch; fn from_str(sstr: &str) -> Result { if sstr == "BOTH" { return Ok(ItwLibSearch::BOTH); } if sstr == "BUNDLED" { return Ok(ItwLibSearch::BUNDLED); } if sstr == "DISTRIBUTION" { return Ok(ItwLibSearch::DISTRIBUTION); } return Err(ParseItwLibSearch { _priv: () }) } } pub fn get_libsearch(logger: &os_access::Os) -> ItwLibSearch { let itw_libs_override = env::var("ITW_LIBS"); match itw_libs_override { Ok(result_of_override_var) => match ItwLibSearch::from_str(&result_of_override_var) { Ok(result_of_override_to_enum) => { return result_of_override_to_enum; } _err => { let mut info = String::new(); write!(&mut info, "ITW-LIBS provided, but have invalid value of {}. Use BUNDLED, DISTRIBUTION or BOTH", result_of_override_var); logger.important(&info); } } _error => { //no op, continuing via get_itwlibsearch } } match ItwLibSearch::from_str(get_itwlibsearch()) { Ok(v) => { return v } _err=> { panic!("itw-lib search out of range"); } } } /*new variables*/ /*tests*/ #[cfg(test)] mod tests { use std::str::FromStr; #[test] fn variables_non_default() { assert_ne!(String::from(super::get_jre()).trim(), String::from("JRE-dev-unspecified")); assert_ne!(String::from(super::get_java()).trim(), String::from("JAVA-dev-unspecified")); assert_ne!(String::from(super::get_main()).trim(), String::from("MAIN_CLASS-dev-unspecified")); assert_ne!(String::from(super::get_name()).trim(), String::from("PROGRAM_NAME-dev-unspecified")); assert_ne!(String::from(super::get_bin()).trim(), String::from("BIN_LOCATION-dev-unspecified")); assert_ne!(String::from(super::get_splash()).trim(), String::from("SPLASH_PNG-dev-unspecified")); assert_ne!(String::from(super::get_netx()).trim(), String::from("NETX_JAR-dev-unspecified")); assert_ne!(String::from(super::get_itwlibsearch()).trim(), String::from("ITW_LIBS-dev-unspecified")); assert_ne!(String::from(super::get_argsfile()).trim(), String::from("MODULARJDK_ARGS_LOCATION-dev-unspecified")); } #[test] fn variables_non_empty() { assert_ne!(String::from(super::get_jre()).trim(), String::from("")); assert_ne!(String::from(super::get_java()).trim(), String::from("")); assert_ne!(String::from(super::get_main()).trim(), String::from("")); assert_ne!(String::from(super::get_name()).trim(), String::from("")); assert_ne!(String::from(super::get_bin()).trim(), String::from("")); assert_ne!(String::from(super::get_splash()).trim(), String::from("")); assert_ne!(String::from(super::get_netx()).trim(), String::from("")); assert_ne!(String::from(super::get_itwlibsearch()).trim(), String::from("")); assert_ne!(String::from(super::get_argsfile()).trim(), String::from("")); } #[test] fn get_itwlibsearch_in_enumeration() { assert_eq!(super::get_itwlibsearch() == "BOTH" || super::get_itwlibsearch() == "BUNDLED" || super::get_itwlibsearch() == "DISTRIBUTION", true); } #[test] fn itw_libsearch_to_enum_test() { assert!(super::ItwLibSearch::from_str("BUNDLED") == Ok(super::ItwLibSearch::BUNDLED)); assert!(super::ItwLibSearch::from_str("BOTH") == Ok(super::ItwLibSearch::BOTH)); assert!(super::ItwLibSearch::from_str("DISTRIBUTION") == Ok(super::ItwLibSearch::DISTRIBUTION)); assert!(super::ItwLibSearch::from_str("") == Err(super::ParseItwLibSearch { _priv: () })); } } icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/property_from_files_resolver.rs0000644000000000000000000000013213441742745025166 xustar0030 mtime=1552401893.060832779 30 atime=1552402157.251253449 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/property_from_files_resolver.rs0000644000175000002070000002644513441742745026011 0ustar00jvanekmock00000000000000use property_from_file; use os_access; use dirs_paths_helper; use::log_helper; use std::time::SystemTime; use std::time::UNIX_EPOCH; use std; use std::string::String; use std::fmt::Write; fn get_basic_array(logger: &os_access::Os) -> [Option; 4] { //obviously search in jre dir is missing, when we search for jre let array: [Option; 4] = [ dirs_paths_helper::get_itw_config_file(logger), dirs_paths_helper::get_itw_legacy_config_file(logger), dirs_paths_helper::get_itw_legacy_global_config_file(logger), dirs_paths_helper::get_itw_global_config_file(logger) ]; array } pub fn try_jdk_from_properties(logger: &os_access::Os) -> Option { try_key_from_properties_files(logger, &get_basic_array(logger), property_from_file::JRE_PROPERTY_NAME, &property_from_file::JreValidator {}) } pub fn try_main_verbose_from_properties(logger: &os_access::Os) -> bool { let str_bool = try_key_from_properties_files(logger, &get_basic_array(logger), property_from_file::VERBOSE_PROPERTY_NAME, &property_from_file::BoolValidator {}); match str_bool { Some(val) => { property_from_file::str_to_bool(&val) } None => { false } } } pub fn try_log_to_file_from_properties(logger: &os_access::Os) -> bool { let str_bool = try_key_from_properties_files(logger, &get_basic_array(logger), property_from_file::KEY_ENABLE_LOGGING_TOFILE, &property_from_file::BoolValidator {}); match str_bool { Some(val) => { property_from_file::str_to_bool(&val) } None => { log_helper::AdvancedLogging::default().log_to_file } } } pub fn try_log_to_streams_from_properties(logger: &os_access::Os) -> bool { let str_bool = try_key_from_properties_files(logger, &get_basic_array(logger), property_from_file::KEY_ENABLE_LOGGING_TOSTREAMS, &property_from_file::BoolValidator {}); match str_bool { Some(val) => { property_from_file::str_to_bool(&val) } None => { log_helper::AdvancedLogging::default().log_to_stdstreams } } } pub fn try_log_to_system_from_properties(logger: &os_access::Os) -> bool { let str_bool = try_key_from_properties_files(logger, &get_basic_array(logger), property_from_file::KEY_ENABLE_LOGGING_TOSYSTEMLOG, &property_from_file::BoolValidator {}); match str_bool { Some(val) => { property_from_file::str_to_bool(&val) } None => { log_helper::AdvancedLogging::default().log_to_system } } } //this method is not in log_helpers because of io::write and fmt::write issue pub fn logfile_name() -> String { let start = SystemTime::now(); let t = start.duration_since(UNIX_EPOCH).expect("time should be measureable"); let m = t.as_secs(); //itw-javantx-2019-02-16_20:56:08.882.log let mut future_name = String::new(); write!(&mut future_name, "itw-nativerustlauncher-{}.log", m).expect("unwrap failed"); future_name } pub fn try_logtarget_from_properties(logger: &os_access::Os) -> std::path::PathBuf { let str_candidate = try_key_from_properties_files(logger, &get_basic_array(logger), property_from_file::KEY_USER_LOG_DIR, &property_from_file::NotMandatoryPathValidator {}); match str_candidate { Some(val) => { let mut future_file=std::path::PathBuf::from(val); future_file.push(logfile_name()); future_file } None => { let mut cfgdir_candidate = logger.get_user_config_dir(); match cfgdir_candidate { Some(mut cfgdir) => { cfgdir.push("log"); cfgdir.push(logfile_name()); cfgdir } None => { std::path::PathBuf::from("unloadable") } } } } } pub fn try_direct_key_from_properties(key: &str, logger: &os_access::Os) -> String { let str_candidate = try_key_from_properties_files(logger, &get_basic_array(logger), key, &property_from_file::NotMandatoryPathValidator {}); match str_candidate { Some(val) => { val } None => { return String::from("") } } } fn try_key_from_properties_files(logger: &os_access::Os, array: &[Option], key: &str, validator: &property_from_file::Validator) -> Option { for file in array { let mut info1 = String::new(); write!(&mut info1, "itw-rust-debug: checking {} in: {}", key, file.clone().unwrap_or(std::path::PathBuf::from("None")).display()).expect("unwrap failed"); logger.log(&info1); match property_from_file::get_property_from_file(file.clone(), &key) { Some(value) => { let mut info2 = String::new(); write!(&mut info2, "itw-rust-debug: located {} in file {}", value, file.clone().expect("file should be already verified").display()).expect("unwrap failed"); logger.log(&info2); if validator.validate(&value) { return Some(value); } else { //the only output out of verbose mode let res = validator.get_fail_message(&key, &value, file); logger.info(&res); } } None => { logger.log("itw-rust-debug: property not located or file inaccessible"); } } } None } /*tests*/ /*To print the diagnostic output use `cargo test -- --nocapture `*/ #[cfg(test)] mod tests { use std; use os_access; use utils::tests_utils as tu; use property_from_file; //if you wont to investigate files used for testing // use cargo test -- --nocapture to see files which needs delete static DELETE_TEST_FILES: bool = true; fn try_jdk_from_properties_files(logger: &os_access::Os, array: &[Option]) -> Option { super::try_key_from_properties_files(logger, &array, property_from_file::JRE_PROPERTY_NAME, &property_from_file::JreValidator {}) } #[test] fn try_jdk_from_properties_files_4nothing() { let array: [Option; 4] = [ None, None, None, None ]; let os = tu::TestLogger::create_new(); let r = try_jdk_from_properties_files(&os, &array); println!("{}", &os.get_log()); assert_eq!(None, r); } #[test] fn try_jdk_from_properties_files_4nonexisting() { let array: [Option; 4] = [ Some(std::path::PathBuf::from("Nonexisting file 1")), Some(std::path::PathBuf::from("Nonexisting file 2")), Some(std::path::PathBuf::from("Nonexisting file 3")), Some(std::path::PathBuf::from("Nonexisting file 4")), ]; let os = tu::TestLogger::create_new(); let r = try_jdk_from_properties_files(&os, &array); println!("{}", &os.get_log()); assert_eq!(None, r); } fn clean_fake_files(array: &[Option]) { for jdk in array { match jdk.clone() { Some(path) => { if DELETE_TEST_FILES { tu::debuggable_remove_file(&path); } else { println!("file {} intentionally not deleted!", path.display()); } } None => {} } } } #[test] fn try_jdk_from_properties_files_4empty() { let array: [Option; 4] = [ Some(std::path::PathBuf::from(tu::create_tmp_file())), Some(std::path::PathBuf::from(tu::create_tmp_file())), Some(std::path::PathBuf::from(tu::create_tmp_file())), Some(std::path::PathBuf::from(tu::create_tmp_file())), ]; let os = tu::TestLogger::create_new(); let r = try_jdk_from_properties_files(&os, &array); println!("{}", &os.get_log()); clean_fake_files(&array); assert_eq!(None, r); } #[test] fn try_jdk_from_properties_files_invalid_jdk() { let array: [Option; 4] = [ Some(std::path::PathBuf::from(tu::create_tmp_propfile_with_custom_jre_content("non/existing/jre1"))), Some(std::path::PathBuf::from(tu::create_tmp_propfile_with_custom_jre_content("non/existing/jre2"))), Some(std::path::PathBuf::from(tu::create_tmp_propfile_with_custom_jre_content("non/existing/jre3"))), Some(std::path::PathBuf::from(tu::create_tmp_propfile_with_custom_jre_content("non/existing/jre4"))), ]; let os = tu::TestLogger::create_new(); let r = try_jdk_from_properties_files(&os, &array); println!("{}", &os.get_log()); clean_fake_files(&array); assert_eq!(None, r); assert_eq!(true, os.get_log().contains("is not valid")); assert_eq!(true, os.get_log().contains("non/existing/jre1")); assert_eq!(true, os.get_log().contains("non/existing/jre2")); assert_eq!(true, os.get_log().contains("non/existing/jre3")); assert_eq!(true, os.get_log().contains("non/existing/jre4")); } #[test] fn try_jdk_from_properties_files_none_and_valid() { let master_dir = tu::fake_jre(true); let array: [Option; 4] = [ Some(std::path::PathBuf::from(tu::create_tmp_file())), Some(std::path::PathBuf::from(tu::create_tmp_propfile_with_custom_jre_content(&master_dir.display().to_string()))), Some(std::path::PathBuf::from(tu::create_tmp_propfile_with_custom_jre_content("non/existing/jre3"))), Some(std::path::PathBuf::from(tu::create_tmp_propfile_with_custom_jre_content("non/existing/jre4"))), ]; let os = tu::TestLogger::create_new(); let r = try_jdk_from_properties_files(&os, &array); println!("{}", &os.get_log()); clean_fake_files(&array); assert_ne!(None, r); assert_ne!(true, os.get_log().contains("is not valid")); assert_ne!(true, os.get_log().contains("non/existing/jre3")); assert_ne!(true, os.get_log().contains("non/existing/jre4")); assert_eq!(master_dir.display().to_string(), r.expect("r should be full")); } #[test] fn try_jdk_from_properties_files_none_and_more_valid() { let master_dir1 = tu::fake_jre(true); let master_dir2 = tu::fake_jre(true); let array: [Option; 4] = [ Some(std::path::PathBuf::from(tu::create_tmp_file())), Some(std::path::PathBuf::from(tu::create_tmp_propfile_with_custom_jre_content(&master_dir1.display().to_string()))), Some(std::path::PathBuf::from(tu::create_tmp_file())), Some(std::path::PathBuf::from(tu::create_tmp_propfile_with_custom_jre_content(&master_dir2.display().to_string()))), ]; let os = tu::TestLogger::create_new(); let r = try_jdk_from_properties_files(&os, &array); println!("{}", &os.get_log()); clean_fake_files(&array); assert_ne!(None, r); assert_ne!(true, os.get_log().contains("is not valid")); assert_eq!(master_dir1.display().to_string(), r.expect("also this r should be full")); } } icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/property.rs0000644000000000000000000000013213441742745021040 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.251253449 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/property.rs0000644000175000002070000001465413441742745021662 0ustar00jvanekmock00000000000000use std::fmt; use std::io::{BufReader, BufRead}; use std::fs::File; pub struct Property { pub key: String, pub value: String } impl fmt::Debug for Property { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "Property {{ k: {}, v: {} }}", self.key, self.value) } } impl PartialEq for Property { fn eq(&self, other: &Property) -> bool { self.key == other.key && self.value == other.value } } impl Property { pub fn load(file: File, key: &str) -> Option { let r = check_file_for_property(file, key); match r { None => { None } Some(value) => { Some(Property { key: key.to_string(), value: value }) } } } } /* *checked_split is not safe. If you are splitting out of bounds, you get thread panic */ fn checked_split(s: String, i: usize) -> Property { let key = &s[..i]; let val = &s[(i + 1)..]; Property { key: String::from(key.trim()), value: String::from(val.trim()) } } fn split_property(string: &String) -> Option { let trimmed = string.trim().to_string(); if trimmed.starts_with("#") { None } else { let eq_char = match trimmed.find("=") { Some(i) => i, None => usize::max_value() }; let doubledot_char = match trimmed.find(":") { Some(i) => i, None => usize::max_value() }; if eq_char == doubledot_char && doubledot_char == usize::max_value() { None } else if eq_char <= doubledot_char { Some(checked_split(trimmed, eq_char)) } else { Some(checked_split(trimmed, doubledot_char)) } } } //error[E0658]: use of unstable library feature 'str_escape': return type may change to be an iterator (see issue #27791) // // let a = kvv.value.escape_unicode(); //For more information about this error, try `rustc --explain E0658`. //https://icedtea.classpath.org/bugzilla/show_bug.cgi?id=3697 fn escape_unicode(src: String) -> String { src } fn check_file_for_property(file: File, key: &str) -> Option { let bf = BufReader::new(file); for lineresult in bf.lines() { match lineresult { Err(_le) => { return None; } Ok(line) => { let kv = split_property(&line); match kv { None => {} Some(kvv) => { if kvv.key.eq(key) { return Some(escape_unicode(kvv.value)); } } } } } } None } /*tests*/ #[cfg(test)] mod tests { use utils::tests_utils as tu; use std::fs::File; #[test] fn check_property() { let p1 = super::Property { key: String::from("k1"), value: String::from("v1") }; let p2 = super::Property { key: String::from("k1"), value: String::from("v1") }; let p3 = super::Property { key: String::from("k2"), value: String::from("v1") }; let p4 = super::Property { key: String::from("k1"), value: String::from("v2") }; let p5 = super::Property { key: String::from("k2"), value: String::from("v2") }; assert_eq!(p1, p2); assert_ne!(p1, p3); assert_ne!(p1, p4); assert_ne!(p1, p5); } #[test] fn checked_split() { let p1 = super::checked_split("aXb".to_string(), 1); assert_eq!("a".to_string(), p1.key); assert_eq!("b".to_string(), p1.value); let p2 = super::checked_split("aXb".to_string(), 0); assert_eq!("".to_string(), p2.key); assert_eq!("Xb".to_string(), p2.value); let p3 = super::checked_split("aXb".to_string(), 2); assert_eq!("aX".to_string(), p3.key); assert_eq!("".to_string(), p3.value); } #[test] fn split_property_nodelimiter() { let p = super::split_property(&"aXb".to_string()); assert_eq!(None, p); } #[test] fn split_property_colon_delimiter() { let p = super::split_property(&"a:b".to_string()).expect("should be some!"); assert_eq!("a".to_string(), p.key); assert_eq!("b".to_string(), p.value); } #[test] fn split_property_equals_delimiter() { let p = super::split_property(&"a=b".to_string()).expect("should be some!"); assert_eq!("a".to_string(), p.key); assert_eq!("b".to_string(), p.value); } #[test] fn split_property_mixed_delimiter() { let p1 = super::split_property(&"a=:b".to_string()).expect("should be some!"); assert_eq!("a".to_string(), p1.key); assert_eq!(":b".to_string(), p1.value); let p2 = super::split_property(&"a:=b".to_string()).expect("should be some!"); assert_eq!("a".to_string(), p2.key); assert_eq!("=b".to_string(), p2.value); } #[test] fn split_property_trimming() { let p1 = super::split_property(&" a = ".to_string()).expect("should be some!"); assert_eq!("a".to_string(), p1.key); assert_eq!("".to_string(), p1.value); let p2 = super::split_property(&"a : b".to_string()).expect("should be some!"); assert_eq!("a".to_string(), p2.key); assert_eq!("b".to_string(), p2.value); let p3 = super::split_property(&" a :b ".to_string()).expect("should be some!"); assert_eq!("a".to_string(), p3.key); assert_eq!("b".to_string(), p3.value) } #[test] fn split_property_reals() { let p1 = super::split_property(&"java.property = some:terrible:jdk".to_string()).expect("should be some!"); assert_eq!("java.property".to_string(), p1.key); assert_eq!("some:terrible:jdk".to_string(), p1.value); } #[test] fn check_load_not_found() { let path = tu::create_tmp_propfile_with_content(); let f = File::open(&path); let k = "not_existing_key"; let prop = super::Property::load(f.expect("file was not opened"), k); tu::debuggable_remove_file(&path); assert_eq!(None, prop); } #[test] fn check_load_item_exists() { let path = tu::create_tmp_propfile_with_content(); let f = File::open(&path); let k = "key2"; let prop = super::Property::load(f.expect("file was not opened"), k); tu::debuggable_remove_file(&path); assert_eq!("val2", prop.expect("property was supposed to be loaded").value); } } icedtea-web-1.8/rust-launcher/src/PaxHeaders.7406/jars_helper.rs0000644000000000000000000000013213441742745021452 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.251253449 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/src/jars_helper.rs0000644000175000002070000002503513441742745022267 0ustar00jvanekmock00000000000000use std; use env; use hardcoded_paths; use hardcoded_paths::ItwLibSearch; use property_from_files_resolver; use os_access; use dirs_paths_helper; use std::fmt::Write; //order important! const LOCAL_PATHS: &'static [&'static str] = &[ "share/icedtea-web", "linux-deps-runtime", "win-deps-runtime", "win-deps-all", "../share/icedtea-web", "../linux-deps-runtime", "../win-deps-runtime", "../win-deps-all", ".", "bin", "../bin"]; pub fn resolve_argsfile(logger: &os_access::Os) -> std::path::PathBuf { resolve_jar(hardcoded_paths::get_argsfile(), logger) } pub fn resolve_jsobject(logger: &os_access::Os) -> Option { match hardcoded_paths::get_jsobject() { Some(js) => { Some(resolve_jar(js, logger)) } None => { None } } } pub fn resolve_splash(logger: &os_access::Os) -> std::path::PathBuf { resolve_jar(hardcoded_paths::get_splash(), logger) } fn try_jar_in_subdirs(dir: &std::path::PathBuf, name: &std::ffi::OsStr, logger: &os_access::Os) -> Option { for path in LOCAL_PATHS { let mut candidate = std::path::PathBuf::from(dir); candidate.push(path); candidate.push(name); let mut info1 = String::new(); write!(&mut info1, "itw-rust-debug: trying {}", &dirs_paths_helper::path_to_string(&candidate)).expect("unwrap failed"); logger.log(&info1); if dirs_paths_helper::is_file(&candidate) { logger.log(&dirs_paths_helper::path_to_string(&candidate)); return Some(candidate); } } return None; } fn resolve_jar(full_hardcoded_path: &str, logger: &os_access::Os) -> std::path::PathBuf { let current_libsearch = hardcoded_paths::get_libsearch(logger); let full_path = std::path::PathBuf::from(full_hardcoded_path); let name = full_path.file_name().expect("Error obtaining file name form hardcoded jar"); //ITW_LIBS_DIR always, hopefully it is not set let itw_libs_override = env::var("ITW_HOME"); match itw_libs_override { Ok(result_of_override_var) => { let custom_dir = std::path::PathBuf::from(&result_of_override_var); if dirs_paths_helper::is_dir(&custom_dir) { match try_jar_in_subdirs(&custom_dir, name, logger) { Some(candidate) => { return candidate; } _none => { //nothing found, continuing } } } else { let mut info1 = String::new(); write!(&mut info1, "custom ITW_HOME provided, but do not exists or is not directory: {}", &(dirs_paths_helper::path_to_string(&custom_dir))); logger.important(&info1); } } _error => { //good, no messing with paths! } } //first local dir - if allowed if current_libsearch == ItwLibSearch::BUNDLED || current_libsearch == ItwLibSearch::BOTH { let pgmdir = dirs_paths_helper::current_program_parent(); let pgmparent: std::path::PathBuf = match pgmdir.parent() { Some(s) => { s.to_path_buf() } None => { pgmdir.clone() } }; match try_jar_in_subdirs(&pgmparent, &name, logger) { Some(candidate) => { return candidate; } _none => { //nothing found, continuing } } } //then installed dirs, if allowd if current_libsearch == ItwLibSearch::DISTRIBUTION || current_libsearch == ItwLibSearch::BOTH { let candidate = std::path::PathBuf::from(full_hardcoded_path); if dirs_paths_helper::is_file(&candidate) { logger.log(&dirs_paths_helper::path_to_string(&candidate)); return candidate; } } //fallback to hardcoded, but warn logger.important("Warning!, Fall back in resolve_jar to hardcoded paths: "); let result = std::path::PathBuf::from(full_hardcoded_path); logger.important(&dirs_paths_helper::path_to_string(&result)); result } fn append_if_exists(value: Option<&'static str>, os: &os_access::Os, vec: &mut Vec) { match value { Some(s) => { vec.push(resolve_jar(s, os)); } _none => {} } } pub static XCP_MODS_DELMITER: &'static str = " "; fn filter_out_val(val: String, vec: &mut Vec) { let mut i:i32 = 0; while i < (vec.len() as i32) { let cpstring=dirs_paths_helper::path_to_string(vec.get(i as usize).expect("string should be there")); for value in val.split(XCP_MODS_DELMITER) { if !String::from(String::from(value).trim()).is_empty() && cpstring.contains(value) { vec.remove(i as usize); i = i - 1; break; } } i = i + 1; } } fn filter_out_key(key: &str, os: &os_access::Os, vec: &mut Vec) { let val = property_from_files_resolver::try_direct_key_from_properties(key, os); filter_out_val(val, vec); } fn filter_in_val(val: String, vec: &mut Vec) { for value in val.split(" ") { vec.push(std::path::PathBuf::from(value)); } } fn filter_in_key(key: &str, os: &os_access::Os, vec: &mut Vec) { let val = property_from_files_resolver::try_direct_key_from_properties(key, os); filter_in_val(val, vec) } //TODO what to do with rt.jar, nashorn and javafx.jar with jdk11 and up? fn get_bootcp_members(jre_path: &std::path::PathBuf, os: &os_access::Os) -> Vec { let mut cp_parts = Vec::new(); cp_parts.push(resolve_jar(hardcoded_paths::get_netx(), os)); append_if_exists(hardcoded_paths::get_plugin(), os, &mut cp_parts); append_if_exists(hardcoded_paths::get_jsobject(), os, &mut cp_parts); append_if_exists(hardcoded_paths::get_rhino(), os, &mut cp_parts); append_if_exists(hardcoded_paths::get_tagsoup(), os, &mut cp_parts); append_if_exists(hardcoded_paths::get_mslinks(), os, &mut cp_parts); let mut nashorn_jar = jre_path.clone(); nashorn_jar.push("lib"); nashorn_jar.push("ext"); nashorn_jar.push("nashorn.jar"); cp_parts.push(nashorn_jar); filter_out_key("deployment.launcher.rust.bootcp.remove", os, &mut cp_parts, ); filter_in_key("deployment.launcher.rust.bootcp.add", os, &mut cp_parts); cp_parts } //can this be buggy? Shouldnt jfxrt.jar be in boot classapth? Copied from shell launchers... //see eg: http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2018-November/040492.html fn get_cp_members(jre_path: &std::path::PathBuf, os: &os_access::Os) -> Vec { let mut cp_parts = Vec::new(); let mut rt_jar = jre_path.clone(); rt_jar.push("lib"); rt_jar.push("rt.jar"); cp_parts.push(rt_jar); let mut jfxrt_jar = jre_path.clone(); jfxrt_jar.push("lib"); jfxrt_jar.push("ext"); jfxrt_jar.push("jfxrt.jar"); cp_parts.push(jfxrt_jar); filter_out_key("deployment.launcher.rust.cp.remove", os, &mut cp_parts, ); filter_in_key("deployment.launcher.rust.cp.add", os, &mut cp_parts); cp_parts } fn compose_class_path(members: Vec, os: &os_access::Os) -> String { let mut result = String::new(); for (i, mb) in members.iter().enumerate() { result.push_str(&dirs_paths_helper::path_to_string(&mb)); if i < members.len() - 1 { result.push(os.get_classpath_separator()); } } result } pub fn get_classpath(jre_path: &std::path::PathBuf, os: &os_access::Os) -> String { compose_class_path(get_cp_members(jre_path, os), os) } pub fn get_bootclasspath(jre_path: &std::path::PathBuf, os: &os_access::Os) -> String { let mut result = String::from("-Xbootclasspath/a:"); result.push_str(&compose_class_path(get_bootcp_members(jre_path, os), os)); result } /*tests*/ #[cfg(test)] mod tests { use utils::tests_utils as tu; use std::path::PathBuf; #[test] fn compose_class_path_test_emty() { assert_eq!("", super::compose_class_path(vec![], &tu::TestLogger::create_new())); } #[test] fn compose_class_path_test_two() { assert_eq!("a:b", super::compose_class_path(vec![std::path::PathBuf::from("a"), std::path::PathBuf::from("b")], &tu::TestLogger::create_new())); } #[test] fn compose_class_path_test_one() { assert_eq!("a", super::compose_class_path(vec![std::path::PathBuf::from("a")], &tu::TestLogger::create_new())); } #[test] fn compose_class_path_test_three() { assert_eq!("a/b:/a/b/:c:c:a/b", super::compose_class_path(vec![ std::path::PathBuf::from("a/b"), std::path::PathBuf::from("/a/b/"), std::path::PathBuf::from("c"), std::path::PathBuf::from("c"), std::path::PathBuf::from("a/b"), ], &tu::TestLogger::create_new())); } #[test] fn filter_out_val_test1() { let mut vec = vec![std::path::PathBuf::from("a"), std::path::PathBuf::from("b"), std::path::PathBuf::from("c")]; super::filter_out_val(String::from("a c"), &mut vec); assert_eq!(vec![std::path::PathBuf::from("b")], vec); super::filter_out_val(String::from(""), &mut vec); assert_eq!(vec![std::path::PathBuf::from("b")], vec); super::filter_out_val(String::from(" "), &mut vec); assert_eq!(vec![std::path::PathBuf::from("b")], vec); super::filter_out_val(String::from("b"), &mut vec); let mut empty: Vec = Vec::new(); assert_eq!(empty, vec); } #[test] fn filter_out_val_test2() { let mut vec = vec![std::path::PathBuf::from("a"), std::path::PathBuf::from("b"), std::path::PathBuf::from("c")]; super::filter_out_val(String::from("b"), &mut vec); assert_eq!(vec![std::path::PathBuf::from("a"), std::path::PathBuf::from("c")], vec); super::filter_out_val(String::from("a c"), &mut vec); let mut empty: Vec = Vec::new(); assert_eq!(empty, vec); } #[test] fn filter_in_val_test1() { let mut vec = vec![std::path::PathBuf::from("a")]; super::filter_in_val(String::from("b"), &mut vec); assert_eq!(vec![std::path::PathBuf::from("a"), std::path::PathBuf::from("b")], vec); } #[test] fn filter_in_val_test2() { let mut vec = vec![]; super::filter_in_val(String::from("b"), &mut vec); assert_eq!(vec![std::path::PathBuf::from("b")], vec); } } icedtea-web-1.8/rust-launcher/PaxHeaders.7406/Cargo.toml0000644000000000000000000000013213441742745017747 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.251253449 30 ctime=1552410887.058183571 icedtea-web-1.8/rust-launcher/Cargo.toml0000644000175000002070000000026013441742745020555 0ustar00jvanekmock00000000000000[package] name = "launcher" version = "1.8.0" authors = ["https://icedtea.classpath.org/wiki/IcedTea-Web"] [dependencies] [target.'cfg(windows)'.dependencies] dunce = "0.1.1" icedtea-web-1.8/PaxHeaders.7406/shell-launcher0000644000000000000000000000013213441742745016054 xustar0030 mtime=1552401893.057832785 30 atime=1552410887.113183443 30 ctime=1552410887.055183578 icedtea-web-1.8/shell-launcher/0000755000175000002070000000000013441742745016741 5ustar00jvanekmock00000000000000icedtea-web-1.8/shell-launcher/PaxHeaders.7406/launchers.sh.in0000644000000000000000000000013213441742745021056 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.248253456 30 ctime=1552410887.055183578 icedtea-web-1.8/shell-launcher/launchers.sh.in0000644000175000002070000001355313441742745021675 0ustar00jvanekmock00000000000000#!/bin/bash NASHORN=lib/ext/nashorn.jar JRE=@JRE@ #unused JAVA=$JRE/bin/java LAUNCHER_BOOTCLASSPATH='@LAUNCHER_BOOTCLASSPATH@' LAUNCHER_FLAGS=-Xms8m CLASSNAME=@MAIN_CLASS@ BINARY_LOCATION=@BIN_LOCATION@ SPLASH_LOCATION=@JAVAWS_SPLASH_LOCATION@ RUN_ARGS_LOCATION=@MODULARJDK_ARGS_LOCATION@ PROGRAM_NAME=@PROGRAM_NAME@ CP=$JRE/lib/rt.jar:$JRE/lib/ext/jfxrt.jar # individual parts of bootclasspath for more easy processing NETX_JAR=@NETX_JAR@ PLUGIN_JAR=@PLUGIN_JAR@ JSOBJECT_JAR=@JSOBJECT_JAR@ TAGSOUP_JAR=@TAGSOUP_JAR@ RHINO_JAR=@RHINO_JAR@ # windows only: #MSLINKS_JAR=@MSLINKS_JAR@ ## resolve folder of this script, following all symlinks: ## http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in SCRIPT_SOURCE="${BASH_SOURCE[0]}" while [ -h "$SCRIPT_SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink SCRIPT_DIR="$( cd -P "$( dirname "$SCRIPT_SOURCE" )" && pwd )" SCRIPT_SOURCE="$(readlink "$SCRIPT_SOURCE")" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located [[ $SCRIPT_SOURCE != /* ]] && SCRIPT_SOURCE="$SCRIPT_DIR/$SCRIPT_SOURCE" done readonly SCRIPT_DIR="$( cd -P "$( dirname "$SCRIPT_SOURCE" )" && pwd )" readonly PORTABLE_ITW_HOME="`dirname $SCRIPT_DIR`" ## resolve custom JRE: CONFIG_HOME=$XDG_CONFIG_HOME if [ "x$CONFIG_HOME" = "x" ] ; then CONFIG_HOME=~/.config fi; PROPERTY_NAME=deployment.jre.dir CUSTOM_JRE_REGEX="^$PROPERTY_NAME *= *" CUSTOM_JRE=`grep "$CUSTOM_JRE_REGEX" $CONFIG_HOME/icedtea-web/deployment.properties 2>/dev/null | sed "s/$CUSTOM_JRE_REGEX//g"` #now check in legacy one if [ "x$CUSTOM_JRE" = "x" ] ; then CUSTOM_JRE=`grep "$CUSTOM_JRE_REGEX" ~/.icedtea/deployment.properties 2>/dev/null | sed "s/$CUSTOM_JRE_REGEX//g"` fi; #now check in global one if [ "x$CUSTOM_JRE" = "x" ] ; then CUSTOM_JRE=`grep "$CUSTOM_JRE_REGEX" /etc/.java/.deploy/deployment.properties 2>/dev/null | sed "s/$CUSTOM_JRE_REGEX//g"` fi; if [ ! "x$JAVA_HOME" = "x" ] ; then echo "Warning! JAVA_HOME of $JAVA_HOME in play!" CUSTOM_JRE=$JAVA_HOME fi # Support portable ITW: # note, that this is temporary, experimental solution, moreover for 1.7 and will likely change since 1.8 # by this, sh launchers can be again a bit more portable then win ones, thats why we moved to native ones since 1.8 # still this is very dummy if [ ! -f $NETX_JAR ] ; then ITW_LIBS="BUNDLED"; fi if [ "x$ITW_LIBS" == "xBUNDLED" -o ! "x$ITW_HOME" = "x" ] ; then if [ "x$ITW_HOME" = "x" ] ; then ITW_HOME=$PORTABLE_ITW_HOME fi BINARY_LOCATION="$ITW_HOME/bin/`basename \"$BINARY_LOCATION\"`" SPLASH_LOCATION="$ITW_HOME/share/icedtea-web/`basename \"$SPLASH_LOCATION\"`" RUN_ARGS_LOCATION="$ITW_HOME/bin/`basename \"$RUN_ARGS_LOCATION\"`" NETX_JAR="$ITW_HOME/share/icedtea-web/`basename \"$NETX_JAR\"`" PLUGIN_JAR="$ITW_HOME/share/icedtea-web/`basename \"$PLUGIN_JAR\"`" JSOBJECT_JAR="$ITW_HOME/share/icedtea-web/`basename \"$JSOBJECT_JAR\"`" LAUNCHER_BOOTCLASSPATH="-Xbootclasspath/a:$NETX_JAR:$PLUGIN_JAR:$JSOBJECT_JAR:$ITW_HOME/linux-deps-runtime/`basename \"$TAGSOUP_JAR\"`:$ITW_HOME/linux-deps-runtime/`basename \"$RHINO_JAR\"`" echo "warning, using portable itw from $ITW_HOME: $LAUNCHER_BOOTCLASSPATH $BINARY_LOCATION $SPLASH_LOCATION" fi # Fix classpaths for custom JRE: if [ "x$CUSTOM_JRE" != "x" ] ; then if [ -e "$CUSTOM_JRE" -a -e "$CUSTOM_JRE/bin/java" ] ; then JAVA=$CUSTOM_JRE/bin/java CP=$CUSTOM_JRE/lib/rt.jar:$CUSTOM_JRE/lib/ext/jfxrt.jar LAUNCHER_BOOTCLASSPATH=$LAUNCHER_BOOTCLASSPATH:$CUSTOM_JRE/$NASHORN else echo "Your custom JRE $CUSTOM_JRE read from deployment.properties under key $PROPERTY_NAME as $CUSTOM_JRE is not valid. Using default ($JRE, $CP) in attempt to start. Please fix this." fi else LAUNCHER_BOOTCLASSPATH="$LAUNCHER_BOOTCLASSPATH:$JRE/$NASHORN" fi; # Support Modular JDK (jigsaw): MODULAR_JDK="NO" fullversion=`${JAVA} -version 2>&1` version=`echo $fullversion | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f1` if [ "$version" -eq "1" ]; then version=`echo $fullversion | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f2` fi if [ "$version" -ge "9" ]; then MODULAR_JDK="YES" fi # Build Java command line: JAVA_ARGS=( ) ARGS=( ) COMMAND=() i=0 j=0 # Filter script args: SPLASH="false" if [ "x$ICEDTEA_WEB_SPLASH" = "x" ] ; then SPLASH="true" fi; while [ "$#" -gt "0" ]; do case "$1" in -J*) JAVA_ARGS[$i]="${1##-J}" i=$((i+1)) ;; *) ARGS[$j]="$1" j=$((j+1)) if [[ "$1" =~ ^[-]*headless ]] ; then SPLASH="false" fi ;; esac shift done # TODO: inline args without using COMMAND[array] to unify linux/windows scripts k=0 COMMAND[k]="${JAVA}" k=$((k+1)) if [ "$SPLASH" = "true" ] ; then COMMAND[k]="-splash:${SPLASH_LOCATION}" k=$((k+1)) fi; COMMAND[k]="${LAUNCHER_BOOTCLASSPATH}" k=$((k+1)) COMMAND[k]="${LAUNCHER_FLAGS}" k=$((k+1)) if [ "x$MODULAR_JDK" == "xYES" ] ; then COMMAND[k]="--patch-module" k=$((k+1)) COMMAND[k]="java.desktop=$NETX_JAR:$PLUGIN_JAR" k=$((k+1)) # jsobject must be patched separately from plugin # otherwise netscape pkg would be shared by two modules, which is forbiden # plugin jar may not be built if [ ! "x$JSOBJECT_JAR" == "x" ] ; then COMMAND[k]="--patch-module" k=$((k+1)) COMMAND[k]="jdk.jsobject=$JSOBJECT_JAR" k=$((k+1)) fi # add JDK9+ arg file: COMMAND[k]="@$RUN_ARGS_LOCATION" k=$((k+1)) fi i=0 while [ "$i" -lt "${#JAVA_ARGS[@]}" ]; do COMMAND[k]="${JAVA_ARGS[$i]}" i=$((i+1)) k=$((k+1)) done COMMAND[k]="-classpath" k=$((k+1)) COMMAND[k]="${CP}" k=$((k+1)) COMMAND[k]="-Dicedtea-web.bin.name=${PROGRAM_NAME}" k=$((k+1)) COMMAND[k]="-Dicedtea-web.bin.location=${BINARY_LOCATION}" k=$((k+1)) COMMAND[k]="${CLASSNAME}" k=$((k+1)) j=0 while [ "$j" -lt "${#ARGS[@]}" ]; do COMMAND[k]="${ARGS[$j]}" j=$((j+1)) k=$((k+1)) done exec -a "$PROGRAM_NAME" "${COMMAND[@]}" exit $? icedtea-web-1.8/shell-launcher/PaxHeaders.7406/launchers.bat.in0000644000000000000000000000013213441742745021212 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.248253456 30 ctime=1552410887.055183578 icedtea-web-1.8/shell-launcher/launchers.bat.in0000644000175000002070000001451413441742745022027 0ustar00jvanekmock00000000000000@echo off setLocal EnableDelayedExpansion rem use JAVAWS_J_OPTIONS to pass java arguments, instead of -J opts for this script. This will be fixed in next releases rem use ITW_HOME to set location where ITW can be found. From there all binaries and jars and other resources are found rem use JAVA_HOME to set path to JRE rem any redistribution/installer can replace INST_ITW_HOME and INST_JAVA_HOME to create better defaults rem if not set, following defaults are used set "INST_ITW_HOME=" set "INST_JAVA_HOME=" rem Warning for linux users: when you put VAR="value" also quotes are stored in VAR! rem maybe set "VAR=value" is working better? rem Warning for if blocks: variables using %my_var% do not work (interpreter), use !my_var! with ENABLEDELAYEDEXPANSION instead rem convention to use for temporary variables use '_' prefix set "NASHORN=lib/ext/nashorn.jar" set "JRE=@JRE@" set "JAVA=%JRE%/bin/java" set "LAUNCHER_BOOTCLASSPATH=@LAUNCHER_BOOTCLASSPATH@" set "LAUNCHER_FLAGS=-Xms8m" set "CLASSNAME=@MAIN_CLASS@" set "BINARY_LOCATION=@BIN_LOCATION@.bat" set "SPLASH_LOCATION=@JAVAWS_SPLASH_LOCATION@" set "RUN_ARGS_LOCATION=@MODULARJDK_ARGS_LOCATION@" set "PROGRAM_NAME=@PROGRAM_NAME@" set "CP=%JRE%/lib/rt.jar;%JRE%/lib/ext/jfxrt.jar" rem individual parts of bootclasspath for more easy processing set "NETX_JAR=@NETX_JAR@" set "PLUGIN_JAR=@PLUGIN_JAR@" set "JSOBJECT_JAR=@JSOBJECT_JAR@" set "TAGSOUP_JAR=@TAGSOUP_JAR@" set "RHINO_JAR=@RHINO_JAR@" set "MSLINKS_JAR=@MSLINKS_JAR@" rem resolve folder of this script: if "%ITW_HOME%" == "" ( set "_BAD_SLASH_SCRIPT_DIR=%~dp0" set "_SCRIPT_DIR=!_BAD_SLASH_SCRIPT_DIR:\=/!" set "ITW_HOME=!_SCRIPT_DIR!../" set "_BAD_SLASH_SCRIPT_DIR=" & set "_SCRIPT_DIR=" ) rem resolve custom JRE: set "CUSTOM_JRE=" if not "%JAVA_HOME%" == "" ( "%JAVA_HOME%/bin/java.exe" -version > nul 2>&1 if errorlevel 0 if not errorlevel 1 ( set "CUSTOM_JRE=%JAVA_HOME%" ) else ( echo "Your custom JRE [%JAVA_HOME%] read from JAVA_HOME is not valid. Please fix this." ) ) if "%CUSTOM_JRE%" == "" ( if not "%INST_JAVA_HOME%" == "" ( "%INST_JAVA_HOME%/bin/java.exe" -version > nul 2>&1 if errorlevel 0 if not errorlevel 1 ( set "CUSTOM_JRE=%INST_JAVA_HOME%" ) else ( echo "Your custom JRE [%INST_JAVA_HOME%] read from INST_JAVA_HOME is not valid. Please fix this." ) ) ) if "%CUSTOM_JRE%" == "" ( rem the following is for testing-only and not intended to be robust rem will not work from 32-bit firefox for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit"') do set "_version_key=%%a" set "_version=!_version_key:~58!" for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit\!_version!" /v JavaHome') do set "_jh_key=%%a" set "_BAD_SLASH_JAVA_HOME=!_jh_key:~22!" set "_REG_JAVA_HOME=!_BAD_SLASH_JAVA_HOME:\=/!" "!_REG_JAVA_HOME!/bin/java.exe" -version > nul 2>&1 if errorlevel 0 if not errorlevel 1 ( set "CUSTOM_JRE=!_REG_JAVA_HOME!" ) else ( echo "Your custom JRE [!_REG_JAVA_HOME!] read from Registry HKLM\SOFTWARE\JavaSoft\Java Development Kit is not valid. Please fix this." ) set "_version_key=" & set "_version=" & set "_jh_key=" & set "_BAD_SLASH_JAVA_HOME=" & set "_REG_JAVA_HOME=" ) rem Support portable ITW: if "%ITW_HOME%" == "" if not "%INST_ITW_HOME%" == "" ( set "ITW_HOME=%INST_ITW_HOME%" ) if not "%ITW_HOME%" == "" ( set "BINARY_LOCATION=%ITW_HOME%/bin/%PROGRAM_NAME%.bat" set "SPLASH_LOCATION=%ITW_HOME%/share/icedtea-web/javaws_splash.png" set "RUN_ARGS_LOCATION=%ITW_HOME%/bin/itw-modularjdk.args" set "NETX_JAR=%ITW_HOME%/share/icedtea-web/javaws.jar" set "PLUGIN_JAR=%ITW_HOME%/share/icedtea-web/plugin.jar" set "JSOBJECT_JAR=%ITW_HOME%/share/icedtea-web/jsobject.jar" set "LAUNCHER_BOOTCLASSPATH=-Xbootclasspath/a:!NETX_JAR!;!PLUGIN_JAR!;!JSOBJECT_JAR!;%ITW_HOME%/win-deps-runtime/tagsoup.jar;%ITW_HOME%/win-deps-runtime/js.jar;%ITW_HOME%/win-deps-runtime/mslinks.jar" ) rem Fix classpaths for custom JRE: if not "%CUSTOM_JRE%" == "" ( set "JAVA=%CUSTOM_JRE%/bin/java" set "CP=%CUSTOM_JRE%/lib/rt.jar;%CUSTOM_JRE%/lib/ext/jfxrt.jar" set "LAUNCHER_BOOTCLASSPATH=%LAUNCHER_BOOTCLASSPATH%;%CUSTOM_JRE%/%NASHORN%" ) else ( set "LAUNCHER_BOOTCLASSPATH=%LAUNCHER_BOOTCLASSPATH%;%JRE%/%NASHORN%" ) rem Support Modular JDK (jigsaw): set "MODULAR_JDK=NO" rem Parse Java Version set "fullversion=" rem capture stderr with 2^>^&1 1^>con: for /f "tokens=*" %%a in ('"%JAVA%" -version 2^>^&1 1^>con:') do ( set "_versionLine=%%a" echo !_versionLine! if "!fullversion!" == "" ( set "_unquoted=!_versionLine:"=@!" for /f "tokens=2,3 delims=@.-" %%b in ("!_unquoted!") do ( set "fullversion=%%b" rem get second digit for "1.x.y" if !fullversion! EQU 1 ( set "fullversion=%%c" ) ) ) ) if %fullversion% GEQ 9 ( set "MODULAR_JDK=YES" ) set "_versionLine=" & set "_unquoted=" & set "fullversion=" set "MODULAR_ARGS=" if "%MODULAR_JDK%" == "YES" ( rem warning extra escaping set "MODULAR_ARGS=--patch-module "java.desktop=%NETX_JAR%;%PLUGIN_JAR%"" rem jsobject must be patched separately from plugin rem otherwise netscape pkg would be shared by two modules, which is forbiden rem plugin jar may not be built if not "%JSOBJECT_JAR%" == "" ( set "MODULAR_ARGS=!MODULAR_ARGS! --patch-module "jdk.jsobject=%JSOBJECT_JAR%"" ) rem add JDK9+ arg file: set "MODULAR_ARGS=!MODULAR_ARGS! "@%RUN_ARGS_LOCATION%"" ) rem Filter script args: set "SPLASH=false" if "%ICEDTEA_WEB_SPLASH%" == "" ( set "SPLASH=true" ) set "JAVA_ARGS=" set "ARGS=" for %%a IN (%*) do ( set "_arg=%%a" set "_beg=!_arg:~0,2!" if "!_beg!" == "-J" ( set "JAVA_ARGS=!JAVA_ARGS! !_arg:~2!" ) else ( set "ARGS=!ARGS! !_arg!" if "!_arg:~0,1!" == "-" if not "x!_arg:headless=!" == "x!_arg!" ( set "SPLASH=false" ) ) ) set "_arg=" & set "_beg=" rem Build Java command line: if "%SPLASH%" == "true" ( set "SPLASH="-splash:%SPLASH_LOCATION%"" ) else ( set "SPLASH=" ) "%JAVA%" %SPLASH% "%LAUNCHER_BOOTCLASSPATH%" %LAUNCHER_FLAGS% %MODULAR_ARGS% %JAVAWS_J_OPTIONS% %JAVA_ARGS% -classpath "%CP%" "-Dicedtea-web.bin.name=%PROGRAM_NAME%" "-Dicedtea-web.bin.location=%BINARY_LOCATION%" "%CLASSNAME%" %ARGS% SET "errno=%ERRORLEVEL%" echo Please press any key to close this window/get back prompt pause > nul EXIT /B %errno% icedtea-web-1.8/PaxHeaders.7406/completion0000644000000000000000000000013113441742745015316 xustar0029 mtime=1552401893.02183286 30 atime=1552410887.113183443 30 ctime=1552410887.052183585 icedtea-web-1.8/completion/0000755000175000002070000000000013441742745016204 5ustar00jvanekmock00000000000000icedtea-web-1.8/completion/PaxHeaders.7406/itweb-settings.bash.in0000644000000000000000000000013213441742745021610 xustar0030 mtime=1552401893.017832868 30 atime=1552402157.245253463 30 ctime=1552410887.052183585 icedtea-web-1.8/completion/itweb-settings.bash.in0000644000175000002070000000044013441742745022416 0ustar00jvanekmock00000000000000_itwebsettings() { local cur prev opts base cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" # Icedtea-web settings Options opts="@OPTIONS@" COMPREPLY=($(compgen -W "${opts}" -- ${cur})) return 0 } complete -F _itwebsettings itweb-settings icedtea-web-1.8/completion/PaxHeaders.7406/javaws.bash.in0000644000000000000000000000013213441742745020133 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.245253463 30 ctime=1552410887.052183585 icedtea-web-1.8/completion/javaws.bash.in0000644000175000002070000000142713441742745020747 0ustar00jvanekmock00000000000000_javaws() { local cur prev opts base cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" # JavaWs Options opts="@OPTIONS@" if [[ $prev == *"-jnlp" || $prev == *"-html" ]] ; then COMPREPLY=($(compgen -f -X "!*" -- ${cur})) if [ -d "$COMPREPLY" ] ; then COMPREPLY="$COMPREPLY/" fi return 0 fi if [[ $cur == "" ]] ; then COMPREPLY=($(compgen -W "aa_file_or_url ${opts} zz_file_or_url" -- ${cur})) return 0 fi if [[ $cur == "-"* ]] ; then COMPREPLY=($(compgen -W "${opts}" -- ${cur})) return 0 else COMPREPLY=($(compgen -f -X "!*" -- ${cur})) if [ -d "$COMPREPLY" ] ; then COMPREPLY="$COMPREPLY/" fi return 0 fi } complete -F _javaws javaws icedtea-web-1.8/completion/PaxHeaders.7406/policyeditor.bash.in0000644000000000000000000000013213441742745021346 xustar0030 mtime=1552401893.020832862 30 atime=1552402157.245253463 30 ctime=1552410887.052183585 icedtea-web-1.8/completion/policyeditor.bash.in0000644000175000002070000000042413441742745022156 0ustar00jvanekmock00000000000000_policyeditor() { local cur prev opts base cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" # PolicyEditor Options opts="@OPTIONS@" COMPREPLY=($(compgen -W "${opts}" -- ${cur})) return 0 } complete -F _policyeditor policyeditor icedtea-web-1.8/PaxHeaders.7406/policyeditor.desktop.in0000644000000000000000000000013213441742745017731 xustar0030 mtime=1552401893.067832765 30 atime=1552402157.242253469 30 ctime=1552410887.049183592 icedtea-web-1.8/policyeditor.desktop.in0000644000175000002070000000043513441742745020543 0ustar00jvanekmock00000000000000[Desktop Entry] Name=IcedTea-Web Policy Editor GenericName=Policy Tool Comment=Edit Java Applet policy and permission settings Exec=PATH_TO_POLICYEDITOR Icon=javaws Terminal=false Type=Application Categories=Settings; Keywords=IcedTea;IcedTea-Web;java;javaws;web;start;webstart;jnlp; icedtea-web-1.8/PaxHeaders.7406/itweb-settings.desktop.in0000644000000000000000000000013213441742745020173 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.241253472 30 ctime=1552410887.048183595 icedtea-web-1.8/itweb-settings.desktop.in0000644000175000002070000000110413441742745020777 0ustar00jvanekmock00000000000000[Desktop Entry] Name=IcedTea-Web Control Panel Name[de]=IcedTea-Web Systemsteuerung Name[pl]=Panel sterowania IcedTea-Web Name[cs]=OvlУЁdacУ­ panel IcedTea-Web GenericName=Control Panel Comment=Configure IcedTea-Web (javaws and plugin) Comment[de]=Konfiguriert IcedTea-Web (javaws und Plug-in) Comment[pl]=Konfiguruj IcedTea-Web (javaws i wtyczkФ™) Comment[cs]=Konfigurace aplikace IcedTea-Web (javaws a zУЁsuvnУН modul) Exec=PATH_TO_ITWEB_SETTINGS Icon=javaws Terminal=false Type=Application Categories=Settings; Keywords=IcedTea;IcedTea-Web;java;javaws;web;start;webstart;jnlp; icedtea-web-1.8/PaxHeaders.7406/javaws.desktop.in0000644000000000000000000000013213441742745016516 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.240253474 30 ctime=1552410887.046183599 icedtea-web-1.8/javaws.desktop.in0000644000175000002070000000045313441742745017330 0ustar00jvanekmock00000000000000[Desktop Entry] Name=IcedTea Web Start GenericName=Java Web Start Comment=IcedTea Application Launcher Exec=PATH_TO_JAVAWS %u Icon=javaws Terminal=false Type=Application NoDisplay=true Categories=Network;WebBrowser; MimeType=application/x-java-jnlp-file;x-scheme-handler/jnlp;x-scheme-handler/jnlps icedtea-web-1.8/PaxHeaders.7406/javaws.png0000644000000000000000000000013213441742745015224 xustar0030 mtime=1552401893.017832868 30 atime=1552402157.239253476 30 ctime=1552410887.045183602 icedtea-web-1.8/javaws.png0000644000175000002070000002424513441742745016043 0ustar00jvanekmock00000000000000‰PNG  IHDRSdњЭ bKGDџџџ НЇ“ pHYs  šœtIMEс#нЗšh IDATxкэy|]WuЈП3мsнAƒ5жlЩВ,[–чФзcœ„$d MRЪє4…@ОЖ<кз”–Ё Д<( „Ф $žЇ$–чQВdЭ’-kМЏю ;пsЮћCv'–c95„хпљУв=ћьѓнЕз^{­ЕЗ„}ћіq#ЫќьGцЈ,?ИњЖЈI1ІedfxoдОŠ72ШŸякi“SГћЖ<§щщ[vэЕмШ§НЁa:D!yЫ ?ЗЦуq‚!у#~јHQбМ”ЕПђкБ0–Єysю]гјЯ_ќ4-###ћЛ?8ў'ЭМJq:BгЙЦЂ_>ћг|-І šІБ{ћ6га№а/zЧ;NёO0ЏBЖwЄФуБя4œ}К%ѓO0ЏBўѕ_џЁjѓЫП­ xТ[78аЯ ›ž›їьГЯЮw:вŸ`N?М•#Э k]нн_Ћ;pиЂХдЗ}&sњt}т˜{фгO§ЫwВўsйvфhv0ўќpЯркА/0эф ЄЎsKFуRЇгЉќ цeфасЦ–ж–ycУЃWќ\$сќйюdЏлї@CУйЌ?СМŒдОђJйё#‡•p(єŽŸp{ uu'WlнњТЇг)ќ ц)p:ЅЇЗmн0щѕ~jt`0=‹Ну=~ПуЧЬъшh}tчЮЗ:Nгћоiw:ЦM;їЌžœџЫБaз-‘@№*ЕLgttиxіlзmЭЭ-ў’в’s@ћћZ3GB Йь=Пqh Oа5§ЊяUUЖЖ6ізXАѕw;8Nљ} гщtŠ/ўіWsЊ­шlя@ k3nc||œЎЮЎЂС~з‡Nж6•Нoavі ЮјѓЖЦ†ВЁžknЧ5<(=uЈєЅн›ŠпЗ0Зќn‹ЅЉО)m|hќ]ЭЦј'§ѓmvЧcѓц-Љ~_N@ЛьIшlj–Ч'Цоu[CC.ія5= ЇоДjхћK3-yГ—V/XјЄХdZєOОыі\.#Cc5‚Њ|9'БhёћJ3џьС;ЯШИyrЬsнк<нXG{gЋљпњхйgŸ}hцˆ_Кvѕ†oЅ8’VFЁыжn<#+7gХ‡zш)<Оф}ѓлп}ЪИ}ћVC_oпuo{h`€НлЗ‹џђ­o єУќTwOUAzю7F:К—‡<ўыоОзы%Ђбˆх^3м•^єрЌбAз{Зж/(ЎyшЁ%%%ЗќІгщ,[ПіЖЧ““§їь9^Џ‡––цœcGNЬўЃ…yИБеа{О?=ф ПЇіЬх Їћly(р§lIAUўLЇг)НzhwAэЁW-§яљѓzњКХНЏэЌјн–M•ПЏLця ц–ЖŒIŸя‘!з@щФи{ŸіЅЙЅ)зхќиЎ=Gg§бРt:rg{УвЖцІ%юс1њяч 3дзŸ\вЖuљя#<ї{љ“—З:NŸnјpsccцј;фwЎЇx<ДЕЖЄNLŒьшЋG“џрa:NyМЇwхё#GVѕ(КЊѓћџЄ_iюh^№Ь‹Пџрa<мœ$ФдїvtЭšœ№ѓћŸпЧ‰њ“rUѕ’ъїКhс=‡ЙѓхЭтйЮЮ*-ЂўфЗ#сю1wКлыyќ`cГђ гщtŠRЊБтаЁZЩу™рJМЏМcїіЅGНЇ_я)Ь­Лv™D‘oИнcY‘pxf7 `ŒˆЏБС@€3Їъэў я?lкє_ђLЇг)єŽЮyuзЮy“^яUй*Q”I0кHГІ‘gЯІPNЂLАR)иX*:X"Z)e†]NNJ{їюЌђљŒяYвэ=ћ–v9Њ ŠПhkmš LП“bСž8‹мєЊВ*(ДdcєF ѕД#і7#ш*fЃК†?ePp&юЇU ргcФбпбu ‡Уœ:uТzч]ї<їхќѓŠoэiэцБЧг6oк”ыq г ‘<[ЋЪVу\u•7W’W˜‰бj!дчЁѕЙ§Д=лСqeа!йh •цш‰єD‚4Фм4i>Ц‰ЃО“эєљ„я§шлyпўЮRс?˜ЕЊ*хххэьlNŠD"г~.еœФm%xфЎGЉКПKЁ$AАf*LŽ•біRzpьu; qР€H™йJЁ1Šш$ћЂ#Дi~ЎTXЃЉ*У}C–ЌФœf=5ѕщ7<Ь_y’У…EЖА7Ф•ДВ0Ѕ„хЋзR~пBJ,ЏУ%!б„ —ТК $Q BБ!Ђ‰ЦщаЎœQc*›7oЖЃ#мz›ѓКТ|O& йе5вБкнDЃгkeІœЬŠТХT/­Т‘gНШ№)ˆХ=йƒКтГ4@Ъw)Y,mШLс‹ЦЂќф'пC{-xнп§К7h6'Š}ьsУБhЬ6]н™EB хQ#‚/L$bЈыФ#*#g&8ќН}Д=Н=4&г;еEХЦz%rбŠ8 P]зёљ|ЃS™Pн‘”z˜‡BЭ кДШє#(IЩbHCчшЉ­GUЬ$ЭBW5F›{щоs’ёS‡‰uСpUЯеAШWl,GХ‰бЇ_оЗUU•џхП[яр# ™YЭgOxo8˜NЇSЈooЯљЗўg-‹IгјтиPАъ"QwН‡v0ве†ЩсM'<аKp -ъYсJAљ‹.‘Ž€€Š€,ŠЄЩ&2cF\j˜8 IВ,ЃiqMCWU&F&8tђ@jJЪ,=-Э~уiцїž}N,ЮЭоЛoчf9MkWL‚€,IшZŒјШ9&Gz   ЋAаb @Ў€1ŽJ˜Qdн„„ A1#’€ŒшХ…sX81-ШРФ0u‡ GјюžвМїЯ ПyџзjkkѕІгщm]ѓПћ§я—N ƒVЋ“Х‚=Щ†5!БQ7ўЁQт"&QIœšmд8z\}ЃGт45TbD… B‚UŒ"&5‹.! !`4*,ЈЊт“ў/Щ&†=C|љoŸЄхX=нчŒГ’“ВyѓЎ8ІБц7 GЕюйіКЊc˜yшс‡˜]XDљœR‰ЖэмХѓПј%“C>bšК0єт"ќ Яш2ЦA#Nœ(~Ђт$QбŠŠЎBœ˜Dг­€ ˆЁЃЂ ’шА“_–G~nPsцЭЅхX=z\zzК+Юытž{юКq†љo7oUѕxdёЈkЪ•YМЌšЯ?ўy223qиэ JŒК=lлВїа(“њд"Pа™В{Тє(qТ„ФIЂјQ…(КшSZЈKёз‘ыКN1T@аA$ QГХШ’…‹иbxMе8yВNџв_}Е xх†pœNЇьАˆЫ~ѕь/тZDC6H<єР‡)//#%9Y–‘Eмœl2sГёIНj у" BТ~q˜ш&.†ЇДQ“ІЎ CZBBF&ЈЉєЦ iS3ЙЩd&91 Ѓ$^ˆˆмrѓr sаuііѓйѓэ_KMЬ]sCРмwфЈQU…Џ4ž:Љ Crz VoDx‹нЫЩЪЂЂМнž@[м‹+MŸж'‚†q"B]гA}"ЂŠ.hКˆA7 Љp.:Щ™˜—Q=Š ‰фцф0{vFE]GEц––QГt ‚ 066"mніђкч_јЭзNеwЎK}л`Ў ЬЄ”Ќ›Z[[VG&C"@aI!YYoqkR’’Љ,Ÿ‹cVg аѓ1ІEа/Low|"„ˆIБ в… ЇЈЂ‹qtQŠ:щfDUЁ'фDдM—@2RвЈЎЌ&''ХhxнЭ2ЌКy5’ABUUj_{—Зќv§О§{ŸќСу_Z?q> ўР˜ ЎyeяŽ/эоБUR/ЬШ ц/@6Он[Ьf**цR6ЗŒЈAЂ^рdl‚‘x4э2C^@ФˆЈЪшшшbATDY”1ъЌš9nЇ/ GЃ^š5!4RR’ЈЉ^DѕќЄІЄ".ЭXЌZЙ’м‚й‚@<чtУ)NзПЅЛЋ§K';O­П–|‘єшЃ^Гƒўы-;жœСY=HјТz(7;‡U7­a^љ<в2RЩ/.Рd1_ъЦH2 ‰lйўпСkŸЯ+ Sh4гЧ‡|CљЋt‡†ЧЏ Јоѓ!ЂЁ/o~зРg4?У‘нёГхв›lФ ˆXб1ЂЂDŸŠЖkкTчд^І\#Y‘ЩLKeqѕ"Š ŠБZmЄЇg`NА\6рQ9.йЙйŒЙFбдЉРЛІiДД6 ЊІовыъ›Лšѕ nоsн`:NхЕУGьПyюЅ1]ћ˜k`pykг™”ўоžK†pVV<ђ’сЪцЦh’YT]…ЊЉФЕ8{ію`dhˆбPЗъІ^ѕbEТ!IТ@ 1РO7Q|Z”I4Фɘ{А;ьЬ)›УтъХ”—Ь%3=“ЬЌL2sГ‘ —yMA СlЂИЈ˜цК&Ђjє_IBШэ КњoŽD#ТР@ŸiЕsЭ‘>њaommmь]С<бtfegGч_юнГwU]н)[(0)Ž\ѕ7( їнw555WдЪзZ T/šb|ŒвтRŽ?L}cЎЁp„Щx”!-ŠШLˆ5єKR‚  Ш)Г’YRГŒ›–9ЩЬЬХ”`$ov%eХXэжщ’ŸH‚Рђe7ГsѓNЂ‘)˜f‹™YщГZюЙћC/ffцоМ{їі[њz–dff|eЯ‘Їd…кУt:вБ“g 'N]йђrызO8БІЃЕU/(,і-\P­ŸnЈГvЕЗЪ\ˆYšm6юЛї^хъѓќ f**ц`ЁЌt.7uїpцЬ кл[шю>ЯФ„›X<†ІщSЋЅ `EQФ ЫdЇІRXXТМЊE—`ГZA‘˜`#/+ЛЭўйP‘9……,2ј.ИyŽ$жЏ\OХьвНw=є№^K‚йДuћяжь~uћmZLЕopnќ’lSЮf}}ЧТ3-gўuыЖ­+юM˜•Ыэы7\PКрЩ§=uZRFв% к*^‚ —•EYy9КЎ_•f^ЋеBii‡ЄфD g ёћ#єіvбвR‡Чу%іbBA4›IN™EZjХEхЬJL› ЏщQ4-Œеf&#'{Šу?AШЩЭС’hС=фž2v;5‹j"wп}/­-u'>ђ‰џНХnцџ§ќ?зьxuыЪЌŒЌ[Vsѓ'CŒ7\ЬНЧWtvvўјрО}‹$р‹_ј+ж­^} 7#ѓk.збмxйЂуЋƒg{x}˜-fnЙcV›ѕš<EQШЮЮ 1б†kРХиŸЭOff KЏТaF]A@PˆiФтAT1ŽЊ…БZьфe–‘“=RVой‚ ‚@fz&9щ9 t `0*D ZуглžЂbaХ €Іƒћї—фцЏ­ЈYИЂ§Lћw~іЬ/–65Ж>SR4чО%ЮyгТLЪ›}њфБWЗОјli{Sw}№њШGпМzѕW=  РКЪе„ќlГ&Lй?ХШђъхШ’<#­|ыГйlиЪl”Ьб …BŒ 3<срСSБэ;Ж„№§я0ипSВtйђ}{іYНaУђ>ЙМjEвCŸzаМВЊfџ/љп…Ѓn§ƒїмzрўыVV§ѕ‰ЧОЕб–гѕєuw ‡@€’ŠŠŠ‹fЌo3/№§&8щY†Щ @xЌ&Ча@БO)dЊ H6Пћ/N’DцЬ)РhRТєєœзСА~ы­ЮЗ/Яvе'&&?БaУэ?xiгІš-[_,МџCялЕыШЊ—ШnŸЛБЃЙI8Йg_Жb0№ШŸ=t*+7я‰љѓЊ›ЪчјGjпОќ…-›Д‰с1ныѓaЕYYГz ‰‰‰зžg…П­ƒК ˜Ÿ$vbJыWФЂ kSs‰Ў!,{”зж>Са2;yжwS”$ђŠKАЅиёz= Žѕ*йљщIгІБгвіnэюјс–чŸЋйєТ3…wнy­н~ћ:б5ъЪqїeOњ|,\P=l6™?ПrйвуcНЕЕЕёЫ­ЩmВ5не;h‡B8’э8WЎ˜‘KєfyІиЏu‡йђ#„ubкёwH­ЛGЯ"zњНЎA”§?Џ‹}.№FЏCL”Ј((!''MеIБ&—нл§O8W:ЋІЛgeeхёЩ€їёєьє!Я„›;^.ŠDДWФIяdГІЉš Š€,”•-4\Љ†Блх›ЗbљЭŸБ%$”ЂщЬЮЫЇЄИIœyQюг№dœoщ@{ц/0эўGЄС3ОaˆGЇъ‹.^’$ТфBїQ~нb x}В›ьЬ,$Y"ЧЎЬњу- WКgсТErrJ*‚(166‚Ы5P$ЦУБж8oBзuZ[›R‚‘ЩП>нд1эСK/яњЉНЋ='Š ,_ВœфЄ™чђwїУПt€ыL#Ъц'‘^B№OAЅ7RМ‚tiДPVЛгачgауќfњOC™ЊрL›aц0A -5•ТќRъŸFд%—ієкŽkœ‡:zкЊЮы\мйбŠУa'7?_Qyй7эVёРыN{UvБ˜š“ћЋ—.“Z›n:нPЇЄfЄЏ‹†Ѓй"’bвг]\RќRаэqДЖ4[FFGЩHMЅЊВ ГyfЮžІУh ш:Œмs]ySQ–>R+П­ђШП§ђдЯ.зŽ(QД}#оqNхЯgѓТљ,ШY“ ЗdAъ }P›еNEy{6ќ“~ККкƒ M †SѕЇVїŸ?џЩqїX~я@Ѕћ\WšЫШЪЈMЯЬќЇ{6lxэ’PУ@—М–WTl,š[6ПГЙeVmэЋЪ@oп|I”@ fxhQ•ЩjV}nЯьx(Bff&s*0gжkW‚!ЦЛР3І7iЅ Ѓх, ~ѓЇ‘ўСн Вёэ5–ddUуsЛŸЂЄЏžE7qДe ;чldЫм*.‡П(†ВИОFЃBIQі$уЎ1ЮvuZћЮŸлЪлк[ющяэCс "yХ=Y™џіе'žxeкЕЙ;ш>И ІцР№РРЦG”њњ“W FЏЧSiБкs Ѓ( ХХded]Ёxрђе!"=—оЊЦ %}щŸ#Ј1ФcЯ€бrС^^*ёдbВc˜bA’#“мкВ“ѕ-;q–юр™ёЯђsЯFКvО[ љЖЋœ„dyйЙЄІЇв{Ж‡Сўў‚гѕЇŸOъъl=S[ofЅЅQZZ>YY5ЏсŠйЩя=љwъ’ъšZГХшЄ7^UU5:Лкi8}ŸЧCЂ#‘’Ђ’iЏW Й@T4]Лtц6˜аJV!”­Eйљ-0(—‰ЎŸ]УBW3ސ‡8ЂРКŽ}|ѓйЯqяОŸpЌбЭ?6Те-'Y™йфчЮЦ`щэяsьйГ3чШЁƒ >я‡j\Хчё‹}]НЪ;Ѕz …љe‰ŽЄ+žoaБXШЩЭСdšљ)‹Љ $XЬ ™.бJ-c.ёE†zўzћСKgїKд2хЗАЖѕUв&њЇ ]19Ъулўžліў˜c^h™СI?vЛЂ‚Bь6;‘hз ї„›7"­ы:q5vIšc:˜ўБ‘БчgЯ.IJš~ЌbRHLNМ|nх*$=UFJЭCSŒSnЌРьЄЬ9ўн8Эі)]GЫ(‡œ…˜t•АЄe4ABЛP=R#*{ыАI4ƒXFХHfv&f‹љ •EѓqыњлЏiЏ­­еяОїCнцsh Пї4›ь FVЋIКЖ}ЫS`оМy4ž˜‡Йџфз ЭПне†мђъЅ“в[mюўG,ЬІUAРlgEуRќ#h‚€.ШКЮАЩNSюBЬ =ƒ3ddYЦnГcИBЕВA6dKбГ3fkЙrЄ] Ђбh W\и-’эіk†Й. ЖЏ\EУСеаs =s.bV9ТЋ?@Ÿ&* ‹2ёВѕ(%kјчЇcmУf@НАCИ`_e %ЛŠЎš83 ЧIи­гєя>:6ЬяЖ>'з5œHќТ_~юЪх1Эч:шюяfТы™fщ%““ArњЕŸд Сš9VŠVпCdХGˆ;‰„УшmЏ‚с2vи`BЫ_Lќсџф3Џ~ŸšіЉЁі&ˆ3Ža Оp9Б•5|8w†0eЖФФЗ,\b§~К{zJ5EљяЗьЪКЂfU#Вj@Œ гL>V23sБ˜п]0ёС\hйИ’oІЎD0ƒ|zтРф7аH2ё›>CќжЏђиОџрЃ{П‹5фrБp#А­ђ6нќы-P>УЋ$XM&Ья0БњММЖo‹E%сО;7^ 3'л)Кћ5ЭєJК Ыгл‹Х2уѕјхфe Рo:ЁХ3б˜DDtGёъћ‰­ј…Б_§щ‡YбК%Й,H8“9—чV|‚Мe%<^zm}ВZ­˜ЬW†ЉЊ*>ЏГЩt‰“—Tи…Іѓg\Z›Ќе:zšE{м4к{љБlyEyXо§щ`yVxr>˜dјBуݘўjbjк{k›wrзІ/qSы$ME‰GІMўї'ц№ŸЗ~•К›юцыщА№wјHЂ„"+SpК­Њ:8Ь‰љŸўєуэšІŒОАu[ЭoЙg’]ЏI/™WВ;Кбhв%ƒЌ Ђx1LѓЖkQЭ"}чЮКІiњѕ’Г>]џY‹Њoщ ы?kзѕ‚oїш;2ЪѕFХЂ7ЫFНєŽЫ\э їОwVЁОёг/ъќDзПxDзcяЂk]н]њ> +eZSЎ­ [, К#1IŸ•“3іьo^ГВs^і&ŸзK$FХбЕщwл“ь$Ї$_ЗL$@О*ЙЃШHe tKГјљК/2‘Bb<ђњўщ‚ €щТџŸ^ў(ъі/К›ПЎ†o.љ]tЭh2‘’’ŽЩtх‘Їы:С`ЏgџиXЪо=ЛgЩQMћјъѕиtќезцŽ ˘œМТ)Ћ˜Ь& Ёы)Ђ­Я<&IDATхЧэгA2™IЭpАЂ0‘ЏdС‚Ф)э–ЏCQЙЂHJJТxяX\\ЬMkжœ<}трЇJK‹#2€saUCqёМOЖД7Ѕeхч=Y_wЂP‹ЊEБX\їLŒD"a[РчЗ‰‚ˆЩhКfg§ЊтšF4І@ˆ‘k†мЬ#Iр™›„&e‹$n3k…Ды|Œ$ۘЌWєVХРмЪ nнpыЁМЂт/?њ№УunїФ~fWWSгяјЭчЮ'$‹+Ыц}<ކлЯwwvtvllЊ?]3:<„pспѕ…B‚Aќ~?nЗ›Ё!Cƒ.‚šЎуіИ ‡B˜)Щ٘,DM&ЬЙГ™Ь v‹‹ХђЎ‹ ІЂG"В,!\h+СbA1‰ЦЂФуq’“ЉЌœЯкѕkїе,ZєЗВ$™жiЏ(,jўьЧ>о œBУ#YџяЇ?^йО‡Сў>bсиыUЖз*ўЩƒCCєєѕвпз‡kpОўzћzr 01ъ&‚Ёh„X,† ‰˜Э&dQЦ`0•CYi9Й99degPPOqq1йYYЦkџ‚5 5CХHА$P9О?Сjщщ:пх ‡Cbеќђmяp9ЮїxЦі_qt!рЁ y &:’“ Šй:CСз Cg*^ннндееsВюmэm р™˜Р7щGеU,Fv›ЛнŽ.шЬRR@ˆjabБВ.Sуtžэ ЕЅIp8ьффГpсBVЌXСтъjrssЏISЃб^ ййЙ8W­ы/**ќёS?јж1GBЂq^хxћl\ s+*xЇu†ЎыŒИ†ьэЧЈINхя>п][[Н.0kkkcI™щн…EХюЁ1FFGhhj`У† фdчМEУИ\.^л€Ї_x†ОЖГŒŽ„IKMбfeЄŸWЕ ЮjЕ>ŸbГЕЏYЕ6xлэЗѕжжжFћњњшы›йЙэЕЕЕЊ€аёЉ~ъ\пXпЉЛvXВgч—Ž тјбЃЗ;|X<зкA[KŸ§ьуЬЋ˜‹l˜оŽF"њz{ЧЄ˜уeЅsћжЌ]{е'M_UшчЎ[я3ЈžЈсls;ƒН}464тъМцшј8ЛwОТж­[9ptчЇРXШШLы^Зz]›ЩlўIёмђКПњмуCЗ€Меˆ_‹\Јжы*Э™CiЮœFё$&'ЪfГy}c]Я?џЁP˜<њq–.Y8эЦ`’3m-„У ’м ž{т‹7]mЏj‡кВŠ…)эK:;лчєѕі€љ…dff‰FrёпЯ<УSџј;v„h$BfF†KOх‚-ŽdЧ>xч?џ›ЏџM},ієєє\їЃУо,&A>З`ё’мйГгс udhШваи 4Д7ЃH2ТTtштЦу@(Ф‘К“<§ы_єљ™_YyЌККj“Ђ(CWэ№_ Ьоўž!O(0тvхz}озР Н=}ДДvАѓ•=ќтзПфwЯob||ŒфЄ$–/[>№ѕЏџ§P§žX,ђГзvьnё{§ў™ьC|ЗВЂfIпЌŒЬ­БXtqIieїљЎьж3M>pˆњцf|юIdLŒЏ—пmлТџу‡Д55“’š| ;7ыŸљГGŽЮШсŸЩ‹џѕіпЎjonћ?gZVК†Ї–•‚ŽЊj(yХГн_~ќKъЉКSѓПѕ­П‹66ЖИЙd<Ќjяh§е§ќG}mНЈq“бDjv.EЅхЈБЇŽт›єbБYZm‰ЖЯќњgПšБ§™L€Юб‘›Юvu=u№РЋ‹ЯwЕGЃZ„$kВxзšшш<[§ЙO|, (Ъ$7˜ЬЪЩ*ёMNюљ—o~+uліm–x<ŽІщ‚ˆ(hšJZz:7Џ[{|NХмOЏ_ОВ~ІЯ˜qюaЖh84ь8ХЁj$Цˆ8Тˆ4‚ЖШЧ_ЎџTœTЦњ;—9…+зЌpмљрCЛvюRŽеŸ&ьѓ’——KiЩЬ]а–dOўtaQA§Е<уџr`*‹пыIENDЎB`‚icedtea-web-1.8/PaxHeaders.7406/plugin0000644000000000000000000000013213441742745014444 xustar0030 mtime=1552401893.054832792 30 atime=1552410887.113183443 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/0000755000175000002070000000000013441742745015331 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/PaxHeaders.7406/tests0000644000000000000000000000013213441742745015606 xustar0030 mtime=1552401893.054832792 30 atime=1552410887.113183443 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/0000755000175000002070000000000013441742745016473 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/tests/PaxHeaders.7406/LiveConnect0000644000000000000000000000013213441742745020017 xustar0030 mtime=1552401893.082832733 30 atime=1552410887.113183443 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/0000755000175000002070000000000013441742745020704 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jsj_type_conversion_tests.js0000644000000000000000000000013213441742745025750 xustar0030 mtime=1552401893.082832733 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jsj_type_conversion_tests.js0000644000175000002070000006173413441742745026573 0ustar00jvanekmock00000000000000/************************************************************ * Tests for data type conversion from JS to Java variables * ************************************************************/ function typeCastingTests() { document.getElementById("results").innerHTML += "

JS -> Java type casting tests:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Test Type"; columnNames[1] = "Send Value"; columnNames[2] = "Expected Value"; columnNames[3] = "Actual Value"; columnNames[4] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); try { row = document.createElement("tr"); type = "Numeric -> java.lang.String (Integer)"; setto = 1; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, setto, now, row); check(now, setto, "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> java.lang.String (Double)"; setto = 1.1; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, setto, now, row); check(now, setto, "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> java.lang.Object (Integer)"; setto = 1.0; PluginTest.Object_type = setto; now = PluginTest.Object_type + " | Superclass = " + PluginTest.Object_type.getClass().getSuperclass().getName(); addResult (type, setto, setto + " | Superclass = java.lang.Number", now, row); check(now, setto + " | Superclass = java.lang.Number", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> java.lang.Object (Double)"; setto = 1.1; PluginTest.Object_type = setto; now = PluginTest.Object_type + " | Superclass = " + PluginTest.Object_type.getClass().getSuperclass().getName(); addResult (type, setto, setto + " | Superclass = java.lang.Number", now, row); check(now, setto + " | Superclass = java.lang.Number", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> boolean (0)"; setto = 0; PluginTest.boolean_type = setto; now = PluginTest.boolean_type; addResult (type, setto, false, now, row); check(now, false, "boolean", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> boolean (1.1)"; setto = 1.1; PluginTest.boolean_type = setto; now = PluginTest.boolean_type; addResult (type, setto, true, now, row); check(now, true, "boolean", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.Boolean (true)"; setto = true; PluginTest.Boolean_type = setto; now = PluginTest.Boolean_type; addResult (type, setto, "true", now, row); check(now, "true", "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.Boolean (false)"; setto = false; PluginTest.Boolean_type = setto; now = PluginTest.Boolean_type; addResult (type, setto, "false", now, row); check(now, "false", "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.Object"; setto = true; PluginTest.Boolean_type = setto; now = PluginTest.Boolean_type + " | Class = " + PluginTest.Boolean_type.getClass().getName(); addResult (type, setto, "true | Class = java.lang.Boolean", now, row); check(now, "true | Class = java.lang.Boolean", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.String"; setto = true; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, "true", now, row); check(now, "true", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.String"; setto = true; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, "true", now, row); check(now, "true", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> byte (true)"; setto = true; PluginTest.byte_type = setto; now = PluginTest.byte_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> char (true)"; setto = true; PluginTest.char_type = setto; now = PluginTest.char_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> short (true)"; setto = true; PluginTest.short_type = setto; now = PluginTest.short_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> int (true)"; setto = true; PluginTest.int_type = setto; now = PluginTest.int_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> long (true)"; setto = true; PluginTest.long_type = setto; now = PluginTest.long_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> float (true)"; setto = true; PluginTest.float_type = setto; now = PluginTest.float_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> double (true)"; setto = true; PluginTest.double_type = setto; now = PluginTest.double_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> byte (false)"; setto = false; PluginTest.byte_type = setto; now = PluginTest.byte_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> char (false)"; setto = false; PluginTest.char_type = setto; now = PluginTest.char_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> short (false)"; setto = false; PluginTest.short_type = setto; now = PluginTest.short_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> int (false)"; setto = false; PluginTest.int_type = setto; now = PluginTest.int_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> long (false)"; setto = false; PluginTest.long_type = setto; now = PluginTest.long_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> float (false)"; setto = false; PluginTest.float_type = setto; now = PluginTest.float_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> double (false)"; setto = false; PluginTest.double_type = setto; now = PluginTest.double_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> Object"; setto = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; PluginTest.Object_type = setto; // Some weird FF bug is causing getClass to not work correctly when set // to a String (hasProperty/hasMethod "getClass" doesn't come through // to the plugin at all, so it is definitely an ff issue). So for now, // we just compare values. //now = PluginTest.Object_type + " | Class = " + PluginTest.Object_type.getClass().getSuperclass().getName(); //addResult (type, setto, setto + " | Class = java.lang.String", now, row); //check(now, setto + " | Class = java.lang.String", "string", row); now = PluginTest.Object_type; PluginTest.Object_type.charAt(3); // try a String specific function to be sure it is a String addResult (type, setto, setto, now, row); check(now, setto, "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> byte"; setto = "1"; PluginTest.byte_type = setto; now = PluginTest.byte_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> short"; setto = "2"; PluginTest.short_type = setto; now = PluginTest.short_type; addResult (type, setto, 2, now, row); check(now, 2, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> int"; setto = "3"; PluginTest.int_type = setto; now = PluginTest.int_type; addResult (type, setto, 3, now, row); check(now, 3, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> long"; setto = "4"; PluginTest.long_type = setto; now = PluginTest.long_type; addResult (type, setto, 4, now, row); check(now, 4, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> float"; setto = "0.0"; PluginTest.float_type = setto; now = PluginTest.float_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> double"; setto = "6.2"; PluginTest.double_type = setto; now = PluginTest.double_type; addResult (type, setto, 6.2, now, row); check(now, 6.2, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> char"; setto = "7"; PluginTest.char_type = setto; now = PluginTest.char_type; addResult (type, setto, 7, now, row); check(now, 7, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> boolean (empty/false)"; setto = ""; PluginTest.boolean_type = setto; now = PluginTest.boolean_type; addResult (type, setto, false, now, row); check(now, false, "boolean", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> boolean (non-empty/true)"; setto = "A non-empty string"; PluginTest.boolean_type = setto; now = PluginTest.boolean_type; addResult (type, setto, true, now, row); check(now, true, "boolean", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> byte[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.byte_array = setto; now = PluginTest.getArrayAsStr(PluginTest.byte_array); addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> char[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.char_array = setto; // For char array, don't convert to string.. the empty/null/0 character messes it up now = PluginTest.char_array[0] + "," + PluginTest.char_array[1] + "," + PluginTest.char_array[2]; addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> short[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.short_array = setto; now = PluginTest.getArrayAsStr(PluginTest.short_array); addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> int[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.int_array = setto; now = PluginTest.getArrayAsStr(PluginTest.int_array); addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> long[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.long_array = setto; now = PluginTest.getArrayAsStr(PluginTest.long_array); addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> float[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.float_array = setto; now = PluginTest.getArrayAsStr(PluginTest.float_array); addResult (type, setto, "1.0,0.0,2.0", now, row); check(now, "1.0,0.0,2.0", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> double[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.double_array = setto; now = PluginTest.getArrayAsStr(PluginTest.double_array); addResult (type, setto, "1.0,0.0,2.0", now, row); check(now, "1.0,0.0,2.0", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> String[] (int)"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.String_array = setto; now = PluginTest.getArrayAsStr(PluginTest.String_array); addResult (type, setto, "1,null,2", now, row); check(now, "1,null,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> String[] (int)"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.String_array = setto; now = PluginTest.getArrayAsStr(PluginTest.String_array); addResult (type, setto, "1,null,2", now, row); check(now, "1,null,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { var a = []; a[0] = []; a[1] = []; a[2] = []; a[0][0] = "100"; a[0][2] = "102"; a[2][0] = "120"; a[2][1] = "121"; a[2][3] = "123"; // // a = [[00, , 02] // normal // [] // empty // [20, 21, , 23]] // length = element0.length + 1 // row = document.createElement("tr"); type = "Array -> char[][] (string to primitive)"; PluginTest.char_array_array = a; now = PluginTest.char_array_array[0][0] + "," + PluginTest.char_array_array[0][1] + "," + PluginTest.char_array_array[0][2] + "," + PluginTest.char_array_array[1][0] + "," + PluginTest.char_array_array[2][0] + "," + PluginTest.char_array_array[2][1] + "," + PluginTest.char_array_array[2][2] + "," + PluginTest.char_array_array[2][3]; expected = "100,0,102,undefined,120,121,0,123" addResult (type, a, expected, now, row); check(now, expected, "string", row); } catch (e) { error(type, a, e, row); } tblBody.appendChild(row); try { var a = []; a[0] = []; a[1] = []; a[2] = []; a[0][0] = 100; a[0][2] = 102; a[2][0] = 120; a[2][1] = 121; a[2][3] = 123; // // a = [[00, , 02] // normal // [] // empty // [20, 21, , 23]] // length = element0.length + 1 // row = document.createElement("tr"); type = "Array -> String[][] (int to complex)"; PluginTest.String_array_array = a; now = PluginTest.String_array_array[0][0] + "," + PluginTest.String_array_array[0][1] + "," + PluginTest.String_array_array[0][2] + "," + PluginTest.String_array_array[1][0] + "," + PluginTest.String_array_array[2][0] + "," + PluginTest.String_array_array[2][1] + "," + PluginTest.String_array_array[2][2] + "," + PluginTest.String_array_array[2][3]; expected = "100,null,102,undefined,120,121,null,123"; addResult (type, a, expected, now, row); check(now, expected, "string", row); } catch (e) { error(type, a, e, row); } tblBody.appendChild(row); try { var a = []; a[0] = []; a[1] = []; a[2] = []; a[0][0] = 100; a[0][2] = 102; a[2][0] = 120; a[2][1] = 121; a[2][3] = 123; // // a = [[00, , 02] // normal // [] // empty // [20, 21, , 23]] // length = element0.length + 1 // row = document.createElement("tr"); type = "Array -> String"; PluginTest.String_type = a; now = PluginTest.String_type; expected = "100,,102,,120,121,,123"; addResult (type, a, expected, now, row); check(now, expected, "string", row); } catch (e) { error(type, a, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "JSObject -> JSObject"; setto = window; PluginTest.JSObject_type = setto; now = PluginTest.JSObject_type; addResult (type, setto, "[object Window]", now, row); check(now, "[object Window]", "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "JSObject -> String"; setto = window; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, "[object Window]", now, row); check(now, "[object Window]", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Java Object -> Java Object"; PluginTest.Float_type = 1.111; orig_hash = PluginTest.Float_type.hashCode(); PluginTest.Object_type = PluginTest.Float_type; new_hash = PluginTest.Object_type.hashCode(); addResult (type, "hashcode=" + orig_hash, orig_hash, new_hash, row); check(new_hash, orig_hash, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Java Object -> String"; setto = new PluginTest.Packages.DummyObject("Test object"); PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, "Test object", now, row); check(now, "Test object", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "null -> Java Object (String)"; // Assuming the set tests have passed, we know that object is non-null after this PluginTest.String_type = "Not Null"; setto = null; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, null, now, row); check(now, null, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); /* // NULL -> primitive tests are disabled for now due to ambiguity. // Section 2.2 here: http://java.sun.com/javase/6/webnotes/6u10/plugin2/liveconnect/ // States that null to primitive is not allowed, yet, section 2.3.7 claims it is.. try { row = document.createElement("tr"); type = "null -> byte"; // Assuming the set tests have passed, we know that object is non-null after this PluginTest.byte_type = "100"; setto = null; PluginTest.byte_type = setto; now = PluginTest.byte_type; addResult (type, setto, null, now, row); check(now, null, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); */ } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jjs_get_tests.js0000644000000000000000000000013213441742745023301 xustar0030 mtime=1552401893.082832733 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jjs_get_tests.js0000644000175000002070000000654413441742745024122 0ustar00jvanekmock00000000000000/***************************************** * Tests for reading JS values from Java * *****************************************/ function jjsGetMemberTests() { initVars(); document.getElementById("results").innerHTML += "

JS -> Java get tests:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Member Type"; columnNames[1] = "Expected Value"; columnNames[2] = "Actual value"; columnNames[3] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); try { row = document.createElement("tr"); type = "int"; expectedvalue = intvar; tpassed = PluginTest.jjsReadIntTest(); actualValue = PluginTest.value; addResult(type, expectedvalue, PluginTest.value, row); check(tpassed, true, "boolean", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "double"; expectedvalue = doublevar; tpassed = PluginTest.jjsReadDoubleTest(); actualValue = PluginTest.value; addResult(type, expectedvalue, PluginTest.value, row); check(tpassed, true, "boolean", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "boolean"; expectedvalue = boolvar; tpassed = PluginTest.jjsReadBooleanTest(); actualValue = PluginTest.value; addResult(type, expectedvalue, PluginTest.value, row); check(tpassed, true, "boolean", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "string"; expectedvalue = stringvar; tpassed = PluginTest.jjsReadStringTest(); actualValue = PluginTest.value; addResult(type, expectedvalue, PluginTest.value, row); check(tpassed, true, "boolean", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "object"; expectedvalue = objectvar; tpassed = PluginTest.jjsReadObjectTest(); actualValue = PluginTest.value; addResult(type, expectedvalue, PluginTest.value, row); check(tpassed, true, "boolean", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "1D Array"; expectedvalue = 100; tpassed = PluginTest.jjsRead1DArrayTest(); actualValue = PluginTest.value; addResult(type, expectedvalue, PluginTest.value, row); check(tpassed, true, "boolean", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "2D Array"; expectedvalue = 200; tpassed = PluginTest.jjsRead2DArrayTest(); actualValue = PluginTest.value; addResult(type, expectedvalue, PluginTest.value, row); check(tpassed, true, "boolean", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); return; } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/OverloadTestHelper3.java0000644000000000000000000000013213441742745024575 xustar0030 mtime=1552401893.081832735 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/OverloadTestHelper3.java0000644000175000002070000000010113441742745025375 0ustar00jvanekmock00000000000000public class OverloadTestHelper3 extends OverloadTestHelper2 {} icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jsj_set_tests.js0000644000000000000000000000013213441742745023315 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jsj_set_tests.js0000644000175000002070000002130113441742745024122 0ustar00jvanekmock00000000000000/****************************************** * Tests for setting members on Java side * ******************************************/ function setMemberTests() { document.getElementById("results").innerHTML += "

JS -> Java set tests:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Member Type"; columnNames[1] = "Old Value"; columnNames[2] = "Setting To"; columnNames[3] = "New Value"; columnNames[4] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); PluginTest.setUpForSMTests(); try { row = document.createElement("tr"); type = "int"; setto = 42; curr = PluginTest.i; PluginTest.i = setto; now = PluginTest.i; addResult(type, curr, setto, now, row); check(now, setto, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "double"; setto = 42.42; curr = PluginTest.d; PluginTest.d = setto; now = PluginTest.d; addResult(type, curr, setto, now, row); check(now, setto, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "float"; setto = 42.421; curr = PluginTest.f; PluginTest.f = setto; now = PluginTest.f; addResult(type, curr, 42.42100143432617, now, row); check(now, 42.42100143432617, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "long"; setto = 4294967296; curr = PluginTest.l; PluginTest.l = setto; now = PluginTest.l; addResult(type, curr, setto, now, row); check(now, setto, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "boolean"; setto = true; curr = PluginTest.b; PluginTest.b = setto; now = PluginTest.b; addResult(type, curr, setto, now, row); check(now, setto, "boolean", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "char"; setto = 58; curr = PluginTest.c; PluginTest.c = setto; now = PluginTest.c; addResult(type, curr, setto, now, row); check(now, setto, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "byte"; setto = 43; curr = PluginTest.by; PluginTest.by = setto; now = PluginTest.by; addResult(type, curr, setto, now, row); check(now, setto, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "int[] (element)"; setto = 100; curr = PluginTest.ia[4]; PluginTest.ia[4] = setto; now = PluginTest.ia[4]; addResult(type, curr, setto, now, row); check(now, setto, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "int[] (beyond length)"; setto = 100; curr = PluginTest.ia[30]; PluginTest.ia[30] = setto; now = PluginTest.ia[30]; addResult(type, curr, setto, now, row); check(now, null, "undefined", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Regular string"; setto = 'Test string'; curr = PluginTest.rs; PluginTest.rs = setto; now = PluginTest.rs; addResult(type, curr, setto, now, row); check(now, setto, "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String with special chars"; setto = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; curr = PluginTest.ss; PluginTest.ss = setto; now = PluginTest.ss; addResult(type, curr, setto, now, row); check(now, setto, "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "null"; setto = null; curr = PluginTest.n; PluginTest.n = setto; now = PluginTest.n; addResult(type, curr, setto, now, row); check(now, setto, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Integer"; setto = 24; curr = PluginTest.I; PluginTest.I = setto; now = PluginTest.I; addResult(type, curr, setto, now, row); check(now, setto, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Double"; setto = 24.24; curr = PluginTest.D; PluginTest.D = setto; now = PluginTest.D; addResult(type, curr, setto, now, row); check(now, setto, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Float"; setto = 24.124; curr = PluginTest.F; PluginTest.F = setto; now = PluginTest.F; addResult(type, curr, setto, now, row); check(now, setto, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Long"; setto = 6927694924; curr = PluginTest.L; PluginTest.L = setto; now = PluginTest.L; addResult(type, curr, setto, now, row); check(now, setto, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean"; setto = new java.lang.Boolean("true"); curr = PluginTest.B; PluginTest.B = setto; now = PluginTest.B; addResult(type, curr, setto, now, row); check(now, setto, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Character"; setto = new java.lang.Character(64); curr = PluginTest.C; PluginTest.C = setto; now = PluginTest.C; addResult(type, curr, setto, now, row); check(now, setto, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Byte"; setto = new java.lang.Byte(39); curr = PluginTest.By; PluginTest.By = setto; now = PluginTest.By; addResult(type, curr, setto, now, row); check(now, setto, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Double[] (element)"; setto = 100.100; curr = PluginTest.Da1[9]; PluginTest.Da1[9] = setto; now = PluginTest.Da1[9]; addResult(type, curr, setto, now, row); check(now, setto, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Double[] (Full array)"; curr = PluginTest.Da2; PluginTest.Da2 = java.lang.reflect.Array.newInstance(java.lang.Double, 3); PluginTest.Da2[0] = 1.1; PluginTest.Da2[1] = 2.1; addResult(type, curr, "[1.1,2.1,null]", "["+PluginTest.Da2[0]+","+PluginTest.Da2[1]+","+PluginTest.Da2[2]+"]", row); check("["+PluginTest.Da2[0]+","+PluginTest.Da2[1]+","+PluginTest.Da2[2]+"]", "[1.1,2.1,null]", "string", row); } catch (e) { error(type, "[1.0,2.0,]", e, row); } tblBody.appendChild(row); } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jjs_func_parameters_tests.js0000644000000000000000000000013213441742745025700 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jjs_func_parameters_tests.js0000644000175000002070000000715413441742745026517 0ustar00jvanekmock00000000000000/****************************************************** * Tests for parameter conversion between Java and JS * ******************************************************/ function JJSParameterTypeCallTest(type_parameter) { return type_parameter + ":" + typeof(type_parameter); } function runSingleJjsCallParameterTest(type, control_arg, row) { try { expectedvalue = JJSParameterTypeCallTest(control_arg); actualvalue = PluginTest.jjsCallParamTest(type); addResult(type, expectedvalue, actualvalue, row); check(actualvalue, expectedvalue, "string", row); } catch (e) { error(type, "", e, row); } } function jjsCallParameterTests() { document.getElementById("results").innerHTML += "

Java -> JS Call tests (Parameter Type):

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Parameter Type (Java side)"; columnNames[1] = "Expecting Java to receive"; columnNames[2] = "Java Received"; columnNames[3] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); row = document.createElement("tr"); runSingleJjsCallParameterTest("int", 1, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("double", 1.1, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("float", 1.2000000476837158, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("long", 4294967296, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("short", 2, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("byte", 3, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("char", 8995, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("boolean", true, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("java.lang.Integer", 4, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("java.lang.Double", 4.1, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("java.lang.Float", 4.199999809265137, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("java.lang.Long", 4294967297, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("java.lang.Short", 5, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("java.lang.Byte", 6, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("java.lang.Boolean", false, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("java.lang.Character", 8996, row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("java.lang.String", "№ Žу€’ТЃ$ЧЃт‚Ќ№–", row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJjsCallParameterTest("PluginTest.Packages.DummyObject", (new PluginTest.Packages.DummyObject("d1")), row); tblBody.appendChild(row); } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/OverloadTestHelper1.java0000644000000000000000000000013213441742745024573 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/OverloadTestHelper1.java0000644000175000002070000000004413441742745025401 0ustar00jvanekmock00000000000000public class OverloadTestHelper1 {} icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jsj_func_overload_tests.js0000644000000000000000000000013213441742745025350 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jsj_func_overload_tests.js0000644000175000002070000001442513441742745026166 0ustar00jvanekmock00000000000000 /************************************************************** * Tests for overloaded function resolution when calling Java * * functions from JS * **************************************************************/ function frCallTests() { document.getElementById("results").innerHTML += "

JS -> Java Call tests [Overload and casting]:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Available functions"; columnNames[1] = "Expected reply"; columnNames[2] = "Reply"; columnNames[3] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); try { row = document.createElement("tr"); fname = "foo_null_to_nonprim"; available = fname + " [(Integer), (int)]"; expectedreply = fname + ":Integer"; reply = PluginTest.foo_null_to_nonprim(null); addResult(available, expectedreply, reply, row); check(fname + ":Integer", reply, "string", row); } catch (e) { error(null, null, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); fname = "foo_jso_to_jso"; available = fname + " [(JSObject), (String), (String[]), (Object)]"; expectedreply = fname + ":JSObject"; reply = PluginTest.foo_jso_to_jso(window); addResult(available, expectedreply, reply, row); check(fname + ":JSObject", reply, "string", row); } catch (e) { error(null, null, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); fname = "foo_ct_to_ct"; available = fname + " [(OverloadTestHelper1), (OverloadTestHelper2), (OverloadTestHelper3)]"; expectedreply = fname + ":OverloadTestHelper2"; reply = PluginTest.foo_ct_to_ct(new PluginTest.Packages.OverloadTestHelper2()); addResult(available, expectedreply, reply, row); check(fname + ":OverloadTestHelper2", reply, "string", row); } catch (e) { error(null, null, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); fname = "foo_multiprim"; available = fname + " [(double), (String)]"; expectedreply = fname + ":double"; reply = PluginTest.foo_multiprim(1.1); addResult(available, expectedreply, reply, row); check(fname + ":double", reply, "string", row); } catch (e) { error(null, null, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); fname = "foo_multiprim"; available = fname + " [(double), (String)]"; expectedreply = fname + ":double"; reply = PluginTest.foo_multiprim(1.1); addResult(available, expectedreply, reply, row); check(fname + ":double", reply, "string", row); } catch (e) { error(null, null, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); fname = "foo_strnum"; available = fname + " [(double), (OverloadTestHelper1)]"; expectedreply = fname + ":double"; reply = PluginTest.foo_strnum(1.1); addResult(available, expectedreply, reply, row); check(fname + ":double", reply, "string", row); } catch (e) { error(null, null, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); fname = "foo_ct_to_sc"; available = fname + " [(OverloadTestHelper1), (String)]"; expectedreply = fname + ":double"; reply = PluginTest.foo_ct_to_sc(new PluginTest.Packages.OverloadTestHelper2()); addResult(available, expectedreply, reply, row); check(fname + ":OverloadTestHelper1", reply, "string", row); } catch (e) { error(null, null, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); fname = "foo_jv_to_str"; available = fname + " [(String), (JSObject)]"; expectedreply = fname + ":String"; reply = PluginTest.foo_jv_to_str(new PluginTest.Packages.OverloadTestHelper1()); addResult(available, expectedreply, reply, row); check(fname + ":java.lang.String", reply, "string", row); } catch (e) { error(null, null, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); fname = "foo_jso_to_array"; available = fname + " [(int[]), (Integer), (Integer[])]"; expectedreply = fname + ":int[]"; arr = new Array(); arr[0] = 10; reply = PluginTest.foo_jso_to_array(arr); addResult(available, expectedreply, reply, row); check(fname + ":int[]", reply, "string", row); } catch (e) { error(null, null, e, row); } tblBody.appendChild(row); // Tests where exceptions are expected fname = "foo_null_to_prim"; available = fname + " [(int)] -- Not allowed"; try { row = document.createElement("tr"); expectedreply = null; reply = PluginTest.foo_null_to_prim(null); fail(row, "An exception was expected. Instead, got reply: " + reply); } catch (e) { addResult(available, "[An exception]", e.toString(), row); pass(row); } tblBody.appendChild(row); fname = "foo_jso_to_somethingelse"; available = fname + " [(OverloadTestHelper1)] -- Not allowed"; try { row = document.createElement("tr"); expectedreply = null; reply = PluginTest.foo_jso_to_somethingelse(window); fail(row, "An exception was expected. Instead, got reply: " + reply); } catch (e) { addResult(available, "[An exception]", e.toString(), row); pass(row); } tblBody.appendChild(row); fname = "foo_unsupported"; available = fname + " [(Object[] p)] -- Not allowed"; try { row = document.createElement("tr"); expectedreply = null; reply = PluginTest.foo_unsupported(25); fail(row, "An exception was expected. Instead, got reply: " + reply); } catch (e) { addResult(available, "[An exception]", e.toString(), row); pass(row); } tblBody.appendChild(row); } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/build0000644000000000000000000000013213441742745021116 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/build0000644000175000002070000000060613441742745021730 0ustar00jvanekmock00000000000000#!/bin/sh # change to dir with tests cd `dirname $0` JAVAC=javac JAR=jar if [ ! -z $JAVA_HOME ]; then JAVAC=$JAVA_HOME/bin/javac JAVAC=$JAVA_HOME/bin/jar fi $JAVAC PluginTest.java DummyObject.java OverloadTestHelper*java $JAR cf PluginTest.jar PluginTest.class DummyObject.class OverloadTestHelper*class rm -f *class echo "Done. Now launch \"firefox file://`pwd`/index.html\"" icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jsj_func_rettype_tests.js0000644000000000000000000000013213441742745025231 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jsj_func_rettype_tests.js0000644000175000002070000002121113441742745026036 0ustar00jvanekmock00000000000000/*********************************************************************** * Tests to process various return types from Java side function calls * ***********************************************************************/ function rtCallTests() { document.getElementById("results").innerHTML += "

JS -> Java Call tests [Return Type]:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Function return type"; columnNames[1] = "Expected Value"; columnNames[2] = "Actual Value"; columnNames[3] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); PluginTest.setUpForParameterTests(); try { row = document.createElement("tr"); type = "int"; expectedvalue = 41; addResult(type, expectedvalue, PluginTest.intReturnTest(), row); check(PluginTest.intReturnTest(), expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "double"; expectedvalue = 41.41; addResult(type, expectedvalue, PluginTest.doubleReturnTest(), row); check(PluginTest.doubleReturnTest(), expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "float"; expectedvalue = 41.4109992980957; addResult(type, expectedvalue, PluginTest.floatReturnTest(), row); check(PluginTest.floatReturnTest(), expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "long"; expectedvalue = 4294967297; addResult(type, expectedvalue, PluginTest.longReturnTest(), row); check(PluginTest.longReturnTest(), expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "boolean"; expectedvalue = true; addResult(type, expectedvalue, PluginTest.booleanReturnTest(), row); check(PluginTest.booleanReturnTest(), expectedvalue, "boolean", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "char"; expectedvalue = 9001; addResult(type, expectedvalue, PluginTest.charReturnTest(), row); check(PluginTest.charReturnTest(), expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "byte"; expectedvalue = 44; addResult(type, expectedvalue, PluginTest.byteReturnTest(), row); check(PluginTest.byteReturnTest(), expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "char[] (direct element access)"; expectedvalue = 9234; addResult(type, expectedvalue, PluginTest.charArrayReturnTest()[2], row); check(PluginTest.charArrayReturnTest()[2], expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Regular char string"; expectedvalue = "I'm a string too!"; addResult(type, expectedvalue, PluginTest.regularStringReturnTest(), row); check(PluginTest.regularStringReturnTest(), expectedvalue, "string", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Special char string"; expectedvalue = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; addResult(type, expectedvalue, PluginTest.specialStringReturnTest(), row); check(PluginTest.specialStringReturnTest(), expectedvalue, "string", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "void"; expectedvalue = null; addResult(type, "undefined", PluginTest.voidReturnTest(), row); check(PluginTest.voidReturnTest(), expectedvalue, "undefined", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "null"; expectedvalue = null; addResult(type, expectedvalue, PluginTest.nullReturnTest(), row); check(PluginTest.nullReturnTest(), expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Integer"; expectedvalue = 14; addResult(type, expectedvalue, PluginTest.IntegerReturnTest(), row); check(PluginTest.IntegerReturnTest(), expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Double"; expectedvalue = 14.14; addResult(type, expectedvalue, PluginTest.DoubleReturnTest(), row); check(PluginTest.DoubleReturnTest(), expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Float"; expectedvalue = 14.114; addResult(type, expectedvalue, PluginTest.FloatReturnTest(), row); check(PluginTest.FloatReturnTest(), expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Long"; expectedvalue = 6927694925; addResult(type, expectedvalue, PluginTest.LongReturnTest(), row); check(PluginTest.LongReturnTest(), expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean"; expectedvalue = "false"; addResult(type, expectedvalue, PluginTest.BooleanReturnTest(), row); check(PluginTest.BooleanReturnTest(), expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Character"; expectedvalue = "т—"; addResult(type, expectedvalue, PluginTest.CharacterReturnTest(), row); check(PluginTest.CharacterReturnTest(), expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Byte"; expectedvalue = 46; addResult(type, expectedvalue, PluginTest.ByteReturnTest(), row); check(PluginTest.ByteReturnTest(), expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Character[] (direct element access)"; expectedvalue = "т‘"; addResult(type, expectedvalue, PluginTest.CharacterArrayReturnTest()[1], row); check(PluginTest.CharacterArrayReturnTest()[1], expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Character[] (Full array)"; expectedvalue = "[Ljava.lang.Character;@"; addResult(type, expectedvalue+"*", PluginTest.CharacterArrayReturnTest(), row); if (PluginTest.CharacterArrayReturnTest().toString().substr(0,23) == "[Ljava.lang.Character;@") if (typeof(PluginTest.CharacterArrayReturnTest()) == "object") { pass(row); } else { fail(row, "Type mismatch: " + typeof(SMPluginTest.Da) + " != object"); } else fail(row, ""); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/index.html0000644000000000000000000000013213441742745022071 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/index.html0000644000175000002070000000723213441742745022705 0ustar00jvanekmock00000000000000
JS -> Java read tests
JS -> Java set tests
JS -> Java function parameter conversion tests
JS -> Java function return type tests
JS -> Java function resolution tests
JS -> Java type conversion tests
Java -> JS read tests
Java -> JS set tests
Java -> JS function parameter conversion tests
Java -> JS function return type tests
Java -> JS eval test

icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jsj_func_parameters_tests.js0000644000000000000000000000013213441742745025700 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jsj_func_parameters_tests.js0000644000175000002070000001524613441742745026520 0ustar00jvanekmock00000000000000 /******************************************************************** * Tests for function parameter coversion when calling Java from JS * ********************************************************************/ function fpCallTests() { document.getElementById("results").innerHTML += "

JS -> Java Call tests [Parameter type]:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Parameter type"; columnNames[1] = "Sending"; columnNames[2] = "Expected reply"; columnNames[3] = "Reply"; columnNames[4] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); PluginTest.setUpForReturnTests(); try { row = document.createElement("tr"); type = "int"; send = 1; reply = PluginTest.functioniParamTest(send); addResult(type, send, send, reply, row); check(send, reply, "number", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "double"; send = 1.1; reply = PluginTest.functiondParamTest(send); addResult(type, send, send, reply, row); check(send, reply, "number", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "float"; send = 1.11; reply = PluginTest.functionfParamTest(send); addResult(type, send, send, reply, row); check(send, reply, "number", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "long"; send = 4294967300; reply = PluginTest.functionlParamTest(send); addResult(type, send, send, reply, row); check(send, reply, "number", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "boolean"; send = true; reply = PluginTest.functionbParamTest(send); addResult(type, send, send, reply, row); check("true", reply, "string", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "char"; send = 75; reply = PluginTest.functioncParamTest(send); addResult(type, send, "K", reply, row); check("K", reply, "string", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "byte"; send = 76; reply = PluginTest.functionbyParamTest(send); addResult(type, send, send, reply, row); check(send, reply, "number", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "char[] (simple primitive)"; arr = new Array(); arr[0] = 80; arr[1] = 81; reply = PluginTest.functioncaParamTest(arr); addResult(type, "[80,81]", "P:Q", reply, row); check(reply, "P:Q", "string", row); } catch (e) { error(type, "P:Q", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String"; send = "$у€’ТЃт‚Ќ№–№ ŽЧЃ"; expectedreply = "$у€’ТЃт‚Ќ№–№ ŽЧЃ:java.lang.String"; reply = PluginTest.functionsParamTest(send); addResult(type, send, expectedreply, reply, row); check(expectedreply, reply, "string", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Integer"; send = "32"; expectedreply = send+":java.lang.Integer"; reply = PluginTest.functionIParamTest(send); addResult(type, send, expectedreply, reply, row); check(expectedreply, reply, "string", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Double"; send = 32.0; expectedreply = "32.0:java.lang.Double"; reply = PluginTest.functionDParamTest(send); addResult(type, send, expectedreply, reply, row); check(expectedreply, reply, "string", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Float"; send = 32.01; expectedreply = send+":java.lang.Float"; reply = PluginTest.functionFParamTest(send); addResult(type, send, expectedreply, reply, row); check(expectedreply, reply, "string", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Long"; send = 4294967301; expectedreply = send+":java.lang.Long"; reply = PluginTest.functionLParamTest(send); addResult(type, send, expectedreply, reply, row); check(expectedreply, reply, "string", row); } catch (e) { error(type, send, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String/Int [] (mixed)"; arr = new Array(); arr[0] = "s1"; arr[1] = 42; reply = PluginTest.functionsiaParamTest(arr); addResult(type, "[s1,42]", "s1:42", reply, row); check(reply, "s1:42", "string", row); } catch (e) { error(type, "s1:42", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "DummyObject[] (complex)"; arr = new Array(); arr[0] = new PluginTest.Packages.DummyObject("DummyObject1"); arr[1] = new PluginTest.Packages.DummyObject("DummyObject2"); reply = PluginTest.functioncomplexaParamTest(arr); addResult(type, "[DummyObject1,DummyObjec2]", "DummyObject1:DummyObject2", reply, row); check(reply, "DummyObject1:DummyObject2", "string", row); } catch (e) { error(type, "DummyObject1:DummyObject2", e, row); } tblBody.appendChild(row); } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/common.js0000644000000000000000000000013213441742745021722 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/common.js0000644000175000002070000001672713441742745022547 0ustar00jvanekmock00000000000000/* * Commonly used functions */ var cell, cellText; // reused function updateTotals() { document.getElementById("totals").innerHTML = "" + ""; } function pass(row) { cell = document.createElement("td"); cell.setAttribute("style","color:green;text-align:center;font-weight: bold"); cellText = document.createTextNode("passed"); cell.appendChild(cellText); row.appendChild(cell); passed++; updateTotals(); } function fail(row, reason) { cell = document.createElement("td"); cell.setAttribute("style","color:red;text-align:center;font-weight: bold"); if (reason) cellText = document.createTextNode(reason); else cellText = document.createTextNode("failed"); cell.appendChild(cellText); row.appendChild(cell); failed++; updateTotals(); } function error(type, expected, e, row) { cell = document.createElement("td"); cell.setAttribute("style","color:red;text-align:center;font-weight: bold"); cell.setAttribute("colspan","5"); cellText = document.createTextNode("An error occurred when running this test: " + e); cell.appendChild(cellText); row.appendChild(cell); errored++; updateTotals(); } function check(actual, expected, expectedtype, row) { if (actual == expected) { if (typeof(actual) == expectedtype) { pass(row); } else { fail(row, "Type mismatch: " + typeof(actual) + " != " + expectedtype); } } else { fail(row, "Failed: " + actual + " [" + typeof(actual) + "] != " + expected + " [" + typeof(expected) + "]"); } } function doTest() { passed = 0; failed = 0; errored = 0; document.getElementById("results").innerHTML = ""; updateTotals(); try { if (document.getElementById("testForm").jsjget.checked == 1) getMemberTests(); if (document.getElementById("testForm").jsjset.checked == 1) setMemberTests(); if (document.getElementById("testForm").jsjfp.checked == 1) fpCallTests(); if (document.getElementById("testForm").jsjfrt.checked == 1) rtCallTests(); if (document.getElementById("testForm").jsjfr.checked == 1) frCallTests(); if (document.getElementById("testForm").jsjtc.checked == 1) typeCastingTests(); if (document.getElementById("testForm").jjsget.checked == 1) jjsGetMemberTests(); if (document.getElementById("testForm").jjsset.checked == 1) jjsSetMemberTests(); if (document.getElementById("testForm").jjcparam.checked == 1) jjsCallParameterTests(); if (document.getElementById("testForm").jjcrt.checked == 1) jjsCallReturnTypeTests(); if (document.getElementById("testForm").jjeval.checked == 1) jjsEvalTests(); } catch (e) { document.getElementById("results").innerHTML += "ERROR:
" + e; } } function testAll() { document.getElementById("testForm").jsjget.checked = 1; document.getElementById("testForm").jsjset.checked = 1; document.getElementById("testForm").jsjfp.checked = 1; document.getElementById("testForm").jsjfrt.checked = 1; document.getElementById("testForm").jsjfr.checked = 1; document.getElementById("testForm").jsjtc.checked = 1; document.getElementById("testForm").jjsget.checked = 1; document.getElementById("testForm").jjsset.checked = 1; document.getElementById("testForm").jjcparam.checked = 1; document.getElementById("testForm").jjcrt.checked = 1; document.getElementById("testForm").jjeval.checked = 1; doTest(); } var intvar; var doublevar; var boolvar; var stringvar; var objectvar; var arrayvar; var arrayvar2; var setvar; function initVars() { intvar = 1; doublevar = 1.1; boolvar = true; stringvar = "stringvar"; objectvar = new PluginTest.Packages.DummyObject("DummyObject1"); arrayvar = new Array(); arrayvar[1] = 100; arrayvar2 = new Array(); arrayvar2[1] = new Array(); arrayvar2[1][2] = 200; } function createResultTable(tbl, tblBody, columnNames) { tbl.setAttribute("border", "5"); tbl.setAttribute("width", "100%"); tbl.setAttribute("class", "results"); row = document.createElement("tr"); for (var i=0; i < columnNames.length; i++) { cell = document.createElement("th"); cellText = document.createTextNode(columnNames[i]); cell.appendChild(cellText); row.appendChild(cell); } tblBody.appendChild(row); tbl.appendChild(tblBody); document.getElementById("results").appendChild(tbl); } function addResult() { var row = arguments[arguments.length-1]; // Different length arguments imply different width distributions if (arguments.length == 4) { cell = document.createElement("td"); cell.setAttribute("width","25%"); cellText = document.createTextNode(arguments[0]); cell.appendChild(cellText); row.appendChild(cell); cell = document.createElement("td"); cell.setAttribute("width","20%"); cellText = document.createTextNode(arguments[1]); cell.appendChild(cellText); row.appendChild(cell); cell = document.createElement("td"); cell.setAttribute("width","40%"); cellText = document.createTextNode(arguments[2]); cell.appendChild(cellText); row.appendChild(cell); } else if (arguments.length == 5) { cell = document.createElement("td"); cell.setAttribute("width","25%"); cellText = document.createTextNode(arguments[0]); cell.appendChild(cellText); row.appendChild(cell); cell = document.createElement("td"); cell.setAttribute("width","20%"); cellText = document.createTextNode(arguments[1]); cell.appendChild(cellText); row.appendChild(cell); cell = document.createElement("td"); cell.setAttribute("width","20%"); cellText = document.createTextNode(arguments[2]); cell.appendChild(cellText); row.appendChild(cell); cell = document.createElement("td"); cell.setAttribute("width","20%"); cellText = document.createTextNode(arguments[3]); cell.appendChild(cellText); row.appendChild(cell); } } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jjs_set_tests.js0000644000000000000000000000013213441742745023315 xustar0030 mtime=1552401893.067832765 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jjs_set_tests.js0000644000175000002070000002176013441742745024133 0ustar00jvanekmock00000000000000/***************************************** * Tests for setting JS values from Java * *****************************************/ function jjsSetMemberTests() { initVars(); document.getElementById("results").innerHTML += "

JS -> Java set tests:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Java Member Type"; columnNames[1] = "Old Value"; columnNames[2] = "Expected value"; columnNames[3] = "Actual Value"; columnNames[4] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); try { row = document.createElement("tr"); type = "int"; oldvalue = setvar; PluginTest.jjsSetIntTest(); expectedvalue = 1; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "java.lang.Integer"; oldvalue = setvar; PluginTest.jjsSetIntegerTest(); expectedvalue = 2; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "double"; oldvalue = setvar; PluginTest.jjsSetdoubleTest(); expectedvalue = 2.1; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "java.lang.Double"; oldvalue = setvar; PluginTest.jjsSetDoubleTest(); expectedvalue = 2.2; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "float"; oldvalue = setvar; PluginTest.jjsSetfloatTest(); expectedvalue = 2.299999952316284 ; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "java.lang.Float"; oldvalue = setvar; PluginTest.jjsSetFloatTest(); expectedvalue = 2.4000000953674316; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "long"; oldvalue = setvar; PluginTest.jjsSetlongTest(); expectedvalue = 4294967296; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "java.lang.Long"; oldvalue = setvar; PluginTest.jjsSetLongTest(); expectedvalue = 4294967297; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "short"; oldvalue = setvar; PluginTest.jjsSetshortTest(); expectedvalue = 3; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "java.lang.Short"; oldvalue = setvar; PluginTest.jjsSetShortTest(); expectedvalue = 4; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "byte"; oldvalue = setvar; PluginTest.jjsSetbyteTest(); expectedvalue = 5; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "java.lang.Byte"; oldvalue = setvar; PluginTest.jjsSetByteTest(); expectedvalue = 6; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "char"; oldvalue = setvar; PluginTest.jjsSetcharTest(); expectedvalue = 8995; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "java.lang.Character"; oldvalue = setvar; PluginTest.jjsSetCharacterTest(); expectedvalue = 8996; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "boolean"; oldvalue = setvar; PluginTest.jjsSetbooleanTest(); expectedvalue = true; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "boolean", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "java.lang.Boolean"; oldvalue = setvar; PluginTest.jjsSetBooleanTest(); expectedvalue = false; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "boolean", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "java.lang.String"; oldvalue = setvar; PluginTest.jjsSetStringTest(); expectedvalue = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "string", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "(Complex java object)"; oldvalue = setvar; PluginTest.jjsSetObjectTest(); expectedvalue = PluginTest.dummyObject; addResult(type, oldvalue, expectedvalue, setvar, row); check(setvar, expectedvalue, "object", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "1D Array"; setvar = new Array(); oldvalue = setvar[1]; PluginTest.jjsSet1DArrayTest(); expectedvalue = 100; addResult(type, oldvalue, expectedvalue, setvar[1], row); check(setvar[1], expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "2D Array"; setvar = new Array(); setvar[1] = new Array(); oldvalue = setvar[1][2]; PluginTest.jjsSet2DArrayTest(); expectedvalue = 200; addResult(type, oldvalue, expectedvalue, setvar[1][2], row); check(setvar[1][2], expectedvalue, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); } function java_to_js_call_test_info (type, expectedreply, functionreply, row) { cell = document.createElement("td"); cell.setAttribute("width","25%"); cellText = document.createTextNode(type); cell.appendChild(cellText); row.appendChild(cell); cell = document.createElement("td"); cell.setAttribute("width","20%"); cellText = document.createTextNode(expectedreply); cell.appendChild(cellText); row.appendChild(cell); cell = document.createElement("td"); cell.setAttribute("width","20%"); cellText = document.createTextNode(functionreply); cell.appendChild(cellText); row.appendChild(cell); } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/PluginTest.java0000644000000000000000000000013213441742745023035 xustar0030 mtime=1552401893.066832766 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/PluginTest.java0000644000175000002070000005176213441742745023660 0ustar00jvanekmock00000000000000import javax.swing.JApplet; import java.awt.Graphics; import java.awt.*; import java.applet.*; import java.awt.event.*; import netscape.javascript.JSObject; import java.lang.reflect.Array; public class PluginTest extends JApplet { public int i = 42; public double d = 42.42; public float f = 42.1F; public long l = 4294967296L; public boolean b = true; public char c = '\u2323'; public byte by = 43; public String rs = "I'm a string!"; public String ss = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; public Object n = null; public int[] ia = new int[5]; public Integer I = 24; public Double D = 24.24; public Float F = 24.124F; public Long L = 6927694924L; public Boolean B = false; public Character C = '\u1526'; public Byte By = 34; public Double[] Da1 = new Double[10]; public Double[] Da2 = null; public char[] ca = new char[3]; public Character[] Ca = new Character[3]; public void setUpForGMTests() { i = 42; d = 42.42; f = 42.1F; l = 4294967296L; b = true; c = '\u2323'; by = 43; rs = "I'm a string!"; ss = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; n = null; I = 24; D = 24.24; F = 24.124F; L = 6927694924L; B = false; C = '\u1526'; By = 34; ia[4] = 1024; Da1[9] = D; } public void setUpForSMTests() { i = 0; d = 0.0; f = 0F; l = 0L; b = false; c = 'A'; by = 0; rs = ""; ss = ""; n = new String("non-null object"); I = 0; D = 0.0; F = 0F; L = 0L; B = false; C = 'A'; By = null; ia[4] = 0; Da1[9] = D; } /* ***************************************** * JS -> Java Parameter conversion tests * ***************************************** */ public void setUpForReturnTests() { i = 41; d = 41.41; f = 41.411F; l = 4294967297L; b = true; c = '\u2329'; by = 44; rs = "I'm a string too!"; ss = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; n = null; I = 14; D = 14.14; F = 14.114F; L = 6927694925L; B = false; C = '\u2417'; By = 46; } /* ************************************** * JS -> Java invocation return tests * ************************************** */ public int intReturnTest() { return i; } public double doubleReturnTest() { return d; } public float floatReturnTest() { return f; } public long longReturnTest() { return l; } public boolean booleanReturnTest() { return b; } public char charReturnTest() { return c; } public byte byteReturnTest() { return by; } public char[] charArrayReturnTest() { ca[0] = '\u2410'; ca[1] = '\u2411'; ca[2] = '\u2412'; return ca; } public String regularStringReturnTest() { return rs; } public String specialStringReturnTest() { return ss; } public void voidReturnTest() { } public Object nullReturnTest() { return null; } public Integer IntegerReturnTest() { return I; } public Double DoubleReturnTest() { return D; } public void DoubleSetTest(double set) { D = set; } public Float FloatReturnTest() { return F; } public Long LongReturnTest() { return L; } public Boolean BooleanReturnTest() { return B; } public Character CharacterReturnTest() { return C; } public Byte ByteReturnTest() { return By; } public Character[] CharacterArrayReturnTest() { Ca[0] = '\u2350'; Ca[1] = '\u2351'; Ca[2] = '\u2352'; return Ca; } /* ************************************** * JS -> Java parameter passing tests * ************************************** */ public void setUpForParameterTests() { i = 41; d = 41.41; f = 41.411F; l = 4294967297L; b = true; c = '\u2329'; by = 44; rs = "I'm a string too!"; ss = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; n = null; I = 14; D = 14.14; F = 14.114F; L = 6927694925L; B = false; C = '\u2417'; By = 46; } public String functioniParamTest(int i) { String ret = Integer.toString(i); return ret; } public String functiondParamTest(double d) { String ret = Double.toString(d); return ret; } public String functionfParamTest(float f) { String ret = Float.toString(f); return ret; } public String functionlParamTest(long l) { String ret = Long.toString(l); return ret; } public String functionbParamTest(boolean b) { String ret = Boolean.toString(b); return ret; } public String functioncParamTest(char c) { String ret = Character.toString(c); return ret; } public String functionbyParamTest(byte b) { String ret = Byte.toString(b); return ret; } public String functioncaParamTest(char[] ca) { String ret = ""; ret += ca[0]; for (int i=1 ; i < ca.length; i++) { ret += ":" + ca[i]; } return ret; } public String functionsiaParamTest(String[] s) { String ret = s[0]; for (int i=1 ; i < s.length; i++) { ret += ":" + s[i]; } return ret; } public String functionsParamTest(String s) { return s + ":" + s.getClass().getName(); } public String functionIParamTest(Integer p) { String ret = p.toString() + ":" + p.getClass().getName(); return ret; } public String functionDParamTest(Double p) { String ret = p.toString() + ":" + p.getClass().getName(); return ret; } public String functionFParamTest(Float p) { String ret = p.toString() + ":" + p.getClass().getName(); return ret; } public String functionLParamTest(Long p) { String ret = p.toString() + ":" + p.getClass().getName(); return ret; } public String functionBParamTest(Boolean p) { String ret = p.toString() + ":" + p.getClass().getName(); return ret; } public String functionCParamTest(Character p) { String ret = p.toString() + ":" + p.getClass().getName(); return ret; } public String functionBParamTest(Byte p) { String ret = p.toString() + ":" + p.getClass().getName(); return ret; } public String functionCaParamTest(Character p) { String ret = p.toString() + ":" + p.getClass().getName(); return ret; } public String functioncomplexaParamTest(DummyObject[] ca) { String ret = ca[0].toString(); for (int i=1 ; i < ca.length; i++) { ret += ":" + ca[i].toString(); } return ret; } /* *********************************************** * JS -> Java overload resolution plugin tests * *********************************************** */ /* Numeric type to the analogous Java primitive type */ public String foo_num_to_num(int p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":int"; } // int -> int is lower than: // int to double public String foo_num_to_num(long p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":long"; } // int to String public String foo_num_to_num(String p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /* Null to any non-primitive type */ public String foo_null_to_nonprim(Integer p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":Integer"; } // Null to non-prim is better than: // null -> prim (not allowed) public String foo_null_to_nonprim(int p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":int"; } /* JSObject to JSObject */ public String foo_jso_to_jso(JSObject p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":JSObject"; } // JSO -> JSO is better than: // JSO -> String public String foo_jso_to_jso(String p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } // JSO -> Java array public String foo_jso_to_jso(String[] p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } // JSO -> Superclass (Object) public String foo_jso_to_jso(Object p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /* Class type to Class type where the types are equal */ public String foo_ct_to_ct(OverloadTestHelper2 p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } // CT -> CT is better than: // CT -> Superclass public String foo_ct_to_ct(OverloadTestHelper1 p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } // CT->Subclass public String foo_ct_to_ct(OverloadTestHelper3 p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /* Numeric type to a different primitive type */ public String foo_multiprim(double p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":double"; } // Num -> Diff. prim. is better than: // Better than anything else.. using string as a dummy public String foo_multiprim(String p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /* String to numeric */ public String foo_strnum(double p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":double"; } // Str -> Num is better than: // Anything else .. using OverloadTestHelper1 as a dummy public String foo_strnum(OverloadTestHelper1 p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /* Class type to superclass type (with subclass passed) */ public String foo_ct_to_sc(OverloadTestHelper1 p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":OverloadTestHelper1"; } // CT -> Superclass is better than CT to String public String foo_ct_to_sc(String p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /* Any Java value to String */ public String foo_jv_to_str(String p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } // JV -> Str is better than anything else allowed public String foo_jv_to_str(JSObject p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /* JSO to Array (lower cost) */ public String foo_jso_to_array(int[] p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":int[]"; } // JSO to array is better than: // something not possible public String foo_jso_to_array(Integer p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /****** Not allowed resolutions *******/ /* null to primitive */ public String foo_null_to_prim(int p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":int"; } /* JSObject to something else */ public String foo_jso_to_somethingelse(OverloadTestHelper1 p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /* Any other conversion not described ... e.g. sending non-array to array */ public String foo_unsupported(Object[] p) { return (new Throwable()).getStackTrace()[0].getMethodName() + ":" + p.getClass().getName(); } /* ****************************** * JS -> Java type conversion * ****************************** */ public byte byte_type = 0; public char char_type = 'A'; public short short_type = 0; public int int_type = 0; public long long_type = 0L; public float float_type = 0F; public double double_type = 0.0; public boolean boolean_type = false; public byte[] byte_array = null; public char[] char_array = null; public short[] short_array = null; public int[] int_array = null; public long[] long_array = null; public float[] float_array = null; public double[] double_array = null; public char[][] char_array_array = null; public Byte Byte_type = null; public Character Character_type = 'A'; public Short Short_type = 0; public Integer Integer_type = 0; public Long Long_type = 0L; public Float Float_type = 0F; public Double Double_type = 0.0; public String String_type = ""; public Boolean Boolean_type = false; public JSObject JSObject_type = null; public Byte[] Byte_array = null; public Character[] Character_array = null; public Short[] Short_array = null; public Integer[] Integer_array = null; public Long[] Long_array = null; public Float[] Float_array = null; public Double[] Double_array = null; public String[] String_array = null; public String[][] String_array_array = null; public Object Object_type = null; public String getArrayAsStr(Object array) { int size = Array.getLength(array); String ret = ""; for (int i=0; i < size; i++) { ret += Array.get(array, i) == null ? "null" : Array.get(array, i).toString(); ret += ","; } if (ret.length() > 0) { ret = ret.substring(0, ret.length()-1); } return ret; } /* ************************** ************************** * Begin Java -> JS tests * ************************** ************************** */ public DummyObject dummyObject = new DummyObject("DummyObject1"); public Object value; private JSObject window; /* ************************* * Java -> JS read tests * ************************* */ public boolean jjsReadIntTest() { value = new Integer(window.getMember("intvar").toString()); return ((Integer) value).equals(1); } public boolean jjsReadDoubleTest() { value = new Double(window.getMember("doublevar").toString()); return ((Double) value).equals(1.1); } public boolean jjsReadBooleanTest() { value = new Boolean(window.getMember("boolvar").toString()); return ((Boolean) value).equals(true); } public boolean jjsReadStringTest() { value = window.getMember("stringvar").toString(); return ((String) value).equals("stringvar"); } public boolean jjsReadObjectTest() { value = window.getMember("objectvar").toString(); return value.equals("DummyObject1"); } public boolean jjsRead1DArrayTest() { value = ((JSObject) window.getMember("arrayvar")).getSlot(1); return value.toString().equals("100"); } public boolean jjsRead2DArrayTest() { value = ((JSObject) ((JSObject) window.getMember("arrayvar2")).getSlot(1)).getSlot(2); return value.toString().equals("200"); } /* ************************** * Java -> JS write tests * ************************** */ public void jjsSetIntTest() { window.setMember("setvar", (int) 1); } public void jjsSetIntegerTest() { window.setMember("setvar", new Integer(2)); } public void jjsSetdoubleTest() { window.setMember("setvar", (double) 2.1); } public void jjsSetDoubleTest() { window.setMember("setvar", new Double(2.2)); } public void jjsSetfloatTest() { window.setMember("setvar", (float) 2.3); } public void jjsSetFloatTest() { window.setMember("setvar", new Float(2.4)); } public void jjsSetshortTest() { window.setMember("setvar", (short) 3); } public void jjsSetShortTest() { window.setMember("setvar", new Short((short) 4)); } public void jjsSetlongTest() { window.setMember("setvar", (long) 4294967296L); } public void jjsSetLongTest() { window.setMember("setvar", new Long(4294967297L)); } public void jjsSetbyteTest() { window.setMember("setvar", (byte) 5); } public void jjsSetByteTest() { window.setMember("setvar", new Byte((byte) 6)); } public void jjsSetcharTest() { window.setMember("setvar", (char) '\u2323'); } public void jjsSetCharacterTest() { window.setMember("setvar", new Character('\u2324')); } public void jjsSetbooleanTest() { window.setMember("setvar", (boolean) true); } public void jjsSetBooleanTest() { window.setMember("setvar", new Boolean(false)); } public void jjsSetStringTest() { window.setMember("setvar", "№ Žу€’ТЃ$ЧЃт‚Ќ№–"); } public void jjsSetObjectTest() { dummyObject = new DummyObject("DummyObject2"); window.setMember("setvar", dummyObject); } public void jjsSet1DArrayTest() { ((JSObject) window.getMember("setvar")).setSlot(1, 100); } public void jjsSet2DArrayTest() { ((JSObject) ((JSObject) window.getMember("setvar")).getSlot(1)).setSlot(2, 200); } /* **************************************** * Java -> JS call parameter conversion * **************************************** */ public String jjsCallParamTest(String type) { Object ret = new Object(); int i = 1; double d = 1.1; float f = 1.2F; long l = 4294967296L; short s = 2; byte b = 3; char c = '\u2323'; boolean bl = true; Integer I = 4; Double D = 4.1; Float F = 4.2F; Long L = 4294967297L; Short S = 5; Byte B = 6; Boolean Bl = false; Character C = '\u2324'; String str = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; Object o = new DummyObject("d1"); String callParamTestFuncName = "JJSParameterTypeCallTest"; if (type.equals("int")) ret = window.call(callParamTestFuncName, new Object[]{i}); else if (type.equals("double")) ret = window.call(callParamTestFuncName, new Object[]{d}); else if (type.equals("float")) ret = window.call(callParamTestFuncName, new Object[]{f}); else if (type.equals("long")) ret = window.call(callParamTestFuncName, new Object[]{l}); else if (type.equals("short")) ret = window.call(callParamTestFuncName, new Object[]{s}); else if (type.equals("byte")) ret = window.call(callParamTestFuncName, new Object[]{b}); else if (type.equals("char")) ret = window.call(callParamTestFuncName, new Object[]{c}); else if (type.equals("boolean")) ret = window.call(callParamTestFuncName, new Object[]{bl}); else if (type.equals("java.lang.Integer")) ret = window.call(callParamTestFuncName, new Object[]{I}); else if (type.equals("java.lang.Double")) ret = window.call(callParamTestFuncName, new Object[]{D}); else if (type.equals("java.lang.Float")) ret = window.call(callParamTestFuncName, new Object[]{F}); else if (type.equals("java.lang.Long")) ret = window.call(callParamTestFuncName, new Object[]{L}); else if (type.equals("java.lang.Short")) ret = window.call(callParamTestFuncName, new Object[]{S}); else if (type.equals("java.lang.Byte")) ret = window.call(callParamTestFuncName, new Object[]{B}); else if (type.equals("java.lang.Boolean")) ret = window.call(callParamTestFuncName, new Object[]{Bl}); else if (type.equals("java.lang.Character")) ret = window.call(callParamTestFuncName, new Object[]{C}); else if (type.equals("java.lang.String")) ret = window.call(callParamTestFuncName, new Object[]{str}); else if (type.equals("PluginTest.Packages.DummyObject")) ret = window.call(callParamTestFuncName, new Object[]{o}); else ret = "Unknown param type: " + type; return ret.toString(); } /* ******************************************* * Java -> JS invocation return type tests * ******************************************* */ public String jjsReturnTypeTest(String type) { String returnTypeTestFuncName = "JJSReturnTypeCallTest"; Object ret = window.call(returnTypeTestFuncName, new Object[]{type}); return ret.toString(); } /* *********************************** * Java -> JS invocation eval test * *********************************** */ public String jjsEvalTest(String str) { return window.eval(str).toString(); } public void init() { window = JSObject.getWindow(this); //JSObject.getWindow(this).call("appletLoaded", new Object[]{}); } } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jsj_type_casting_tests.js0000644000000000000000000000013213441742745025213 xustar0030 mtime=1552401893.063832773 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jsj_type_casting_tests.js0000644000175000002070000006173413441742745026036 0ustar00jvanekmock00000000000000/************************************************************ * Tests for data type conversion from JS to Java variables * ************************************************************/ function typeCastingTests() { document.getElementById("results").innerHTML += "

JS -> Java type casting tests:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Test Type"; columnNames[1] = "Send Value"; columnNames[2] = "Expected Value"; columnNames[3] = "Actual Value"; columnNames[4] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); try { row = document.createElement("tr"); type = "Numeric -> java.lang.String (Integer)"; setto = 1; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, setto, now, row); check(now, setto, "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> java.lang.String (Double)"; setto = 1.1; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, setto, now, row); check(now, setto, "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> java.lang.Object (Integer)"; setto = 1.0; PluginTest.Object_type = setto; now = PluginTest.Object_type + " | Superclass = " + PluginTest.Object_type.getClass().getSuperclass().getName(); addResult (type, setto, setto + " | Superclass = java.lang.Number", now, row); check(now, setto + " | Superclass = java.lang.Number", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> java.lang.Object (Double)"; setto = 1.1; PluginTest.Object_type = setto; now = PluginTest.Object_type + " | Superclass = " + PluginTest.Object_type.getClass().getSuperclass().getName(); addResult (type, setto, setto + " | Superclass = java.lang.Number", now, row); check(now, setto + " | Superclass = java.lang.Number", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> boolean (0)"; setto = 0; PluginTest.boolean_type = setto; now = PluginTest.boolean_type; addResult (type, setto, false, now, row); check(now, false, "boolean", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Numeric -> boolean (1.1)"; setto = 1.1; PluginTest.boolean_type = setto; now = PluginTest.boolean_type; addResult (type, setto, true, now, row); check(now, true, "boolean", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.Boolean (true)"; setto = true; PluginTest.Boolean_type = setto; now = PluginTest.Boolean_type; addResult (type, setto, "true", now, row); check(now, "true", "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.Boolean (false)"; setto = false; PluginTest.Boolean_type = setto; now = PluginTest.Boolean_type; addResult (type, setto, "false", now, row); check(now, "false", "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.Object"; setto = true; PluginTest.Boolean_type = setto; now = PluginTest.Boolean_type + " | Class = " + PluginTest.Boolean_type.getClass().getName(); addResult (type, setto, "true | Class = java.lang.Boolean", now, row); check(now, "true | Class = java.lang.Boolean", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.String"; setto = true; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, "true", now, row); check(now, "true", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> java.lang.String"; setto = true; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, "true", now, row); check(now, "true", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> byte (true)"; setto = true; PluginTest.byte_type = setto; now = PluginTest.byte_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> char (true)"; setto = true; PluginTest.char_type = setto; now = PluginTest.char_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> short (true)"; setto = true; PluginTest.short_type = setto; now = PluginTest.short_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> int (true)"; setto = true; PluginTest.int_type = setto; now = PluginTest.int_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> long (true)"; setto = true; PluginTest.long_type = setto; now = PluginTest.long_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> float (true)"; setto = true; PluginTest.float_type = setto; now = PluginTest.float_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> double (true)"; setto = true; PluginTest.double_type = setto; now = PluginTest.double_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> byte (false)"; setto = false; PluginTest.byte_type = setto; now = PluginTest.byte_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> char (false)"; setto = false; PluginTest.char_type = setto; now = PluginTest.char_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> short (false)"; setto = false; PluginTest.short_type = setto; now = PluginTest.short_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> int (false)"; setto = false; PluginTest.int_type = setto; now = PluginTest.int_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> long (false)"; setto = false; PluginTest.long_type = setto; now = PluginTest.long_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> float (false)"; setto = false; PluginTest.float_type = setto; now = PluginTest.float_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean -> double (false)"; setto = false; PluginTest.double_type = setto; now = PluginTest.double_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> Object"; setto = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; PluginTest.Object_type = setto; // Some weird FF bug is causing getClass to not work correctly when set // to a String (hasProperty/hasMethod "getClass" doesn't come through // to the plugin at all, so it is definitely an ff issue). So for now, // we just compare values. //now = PluginTest.Object_type + " | Class = " + PluginTest.Object_type.getClass().getSuperclass().getName(); //addResult (type, setto, setto + " | Class = java.lang.String", now, row); //check(now, setto + " | Class = java.lang.String", "string", row); now = PluginTest.Object_type; PluginTest.Object_type.charAt(3); // try a String specific function to be sure it is a String addResult (type, setto, setto, now, row); check(now, setto, "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> byte"; setto = "1"; PluginTest.byte_type = setto; now = PluginTest.byte_type; addResult (type, setto, 1, now, row); check(now, 1, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> short"; setto = "2"; PluginTest.short_type = setto; now = PluginTest.short_type; addResult (type, setto, 2, now, row); check(now, 2, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> int"; setto = "3"; PluginTest.int_type = setto; now = PluginTest.int_type; addResult (type, setto, 3, now, row); check(now, 3, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> long"; setto = "4"; PluginTest.long_type = setto; now = PluginTest.long_type; addResult (type, setto, 4, now, row); check(now, 4, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> float"; setto = "0.0"; PluginTest.float_type = setto; now = PluginTest.float_type; addResult (type, setto, 0, now, row); check(now, 0, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> double"; setto = "6.2"; PluginTest.double_type = setto; now = PluginTest.double_type; addResult (type, setto, 6.2, now, row); check(now, 6.2, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> char"; setto = "7"; PluginTest.char_type = setto; now = PluginTest.char_type; addResult (type, setto, 7, now, row); check(now, 7, "number", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> boolean (empty/false)"; setto = ""; PluginTest.boolean_type = setto; now = PluginTest.boolean_type; addResult (type, setto, false, now, row); check(now, false, "boolean", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String -> boolean (non-empty/true)"; setto = "A non-empty string"; PluginTest.boolean_type = setto; now = PluginTest.boolean_type; addResult (type, setto, true, now, row); check(now, true, "boolean", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> byte[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.byte_array = setto; now = PluginTest.getArrayAsStr(PluginTest.byte_array); addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> char[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.char_array = setto; // For char array, don't convert to string.. the empty/null/0 character messes it up now = PluginTest.char_array[0] + "," + PluginTest.char_array[1] + "," + PluginTest.char_array[2]; addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> short[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.short_array = setto; now = PluginTest.getArrayAsStr(PluginTest.short_array); addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> int[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.int_array = setto; now = PluginTest.getArrayAsStr(PluginTest.int_array); addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> long[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.long_array = setto; now = PluginTest.getArrayAsStr(PluginTest.long_array); addResult (type, setto, "1,0,2", now, row); check(now, "1,0,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> float[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.float_array = setto; now = PluginTest.getArrayAsStr(PluginTest.float_array); addResult (type, setto, "1.0,0.0,2.0", now, row); check(now, "1.0,0.0,2.0", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> double[]"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.double_array = setto; now = PluginTest.getArrayAsStr(PluginTest.double_array); addResult (type, setto, "1.0,0.0,2.0", now, row); check(now, "1.0,0.0,2.0", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> String[] (int)"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.String_array = setto; now = PluginTest.getArrayAsStr(PluginTest.String_array); addResult (type, setto, "1,null,2", now, row); check(now, "1,null,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Array -> String[] (int)"; setto = new Array(); setto[0] = 1; setto[2] = 2; PluginTest.String_array = setto; now = PluginTest.getArrayAsStr(PluginTest.String_array); addResult (type, setto, "1,null,2", now, row); check(now, "1,null,2", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { var a = []; a[0] = []; a[1] = []; a[2] = []; a[0][0] = "100"; a[0][2] = "102"; a[2][0] = "120"; a[2][1] = "121"; a[2][3] = "123"; // // a = [[00, , 02] // normal // [] // empty // [20, 21, , 23]] // length = element0.length + 1 // row = document.createElement("tr"); type = "Array -> char[][] (string to primitive)"; PluginTest.char_array_array = a; now = PluginTest.char_array_array[0][0] + "," + PluginTest.char_array_array[0][1] + "," + PluginTest.char_array_array[0][2] + "," + PluginTest.char_array_array[1][0] + "," + PluginTest.char_array_array[2][0] + "," + PluginTest.char_array_array[2][1] + "," + PluginTest.char_array_array[2][2] + "," + PluginTest.char_array_array[2][3]; expected = "100,0,102,undefined,120,121,0,123" addResult (type, a, expected, now, row); check(now, expected, "string", row); } catch (e) { error(type, a, e, row); } tblBody.appendChild(row); try { var a = []; a[0] = []; a[1] = []; a[2] = []; a[0][0] = 100; a[0][2] = 102; a[2][0] = 120; a[2][1] = 121; a[2][3] = 123; // // a = [[00, , 02] // normal // [] // empty // [20, 21, , 23]] // length = element0.length + 1 // row = document.createElement("tr"); type = "Array -> String[][] (int to complex)"; PluginTest.String_array_array = a; now = PluginTest.String_array_array[0][0] + "," + PluginTest.String_array_array[0][1] + "," + PluginTest.String_array_array[0][2] + "," + PluginTest.String_array_array[1][0] + "," + PluginTest.String_array_array[2][0] + "," + PluginTest.String_array_array[2][1] + "," + PluginTest.String_array_array[2][2] + "," + PluginTest.String_array_array[2][3]; expected = "100,null,102,undefined,120,121,null,123"; addResult (type, a, expected, now, row); check(now, expected, "string", row); } catch (e) { error(type, a, e, row); } tblBody.appendChild(row); try { var a = []; a[0] = []; a[1] = []; a[2] = []; a[0][0] = 100; a[0][2] = 102; a[2][0] = 120; a[2][1] = 121; a[2][3] = 123; // // a = [[00, , 02] // normal // [] // empty // [20, 21, , 23]] // length = element0.length + 1 // row = document.createElement("tr"); type = "Array -> String"; PluginTest.String_type = a; now = PluginTest.String_type; expected = "100,,102,,120,121,,123"; addResult (type, a, expected, now, row); check(now, expected, "string", row); } catch (e) { error(type, a, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "JSObject -> JSObject"; setto = window; PluginTest.JSObject_type = setto; now = PluginTest.JSObject_type; addResult (type, setto, "[object Window]", now, row); check(now, "[object Window]", "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "JSObject -> String"; setto = window; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, "[object Window]", now, row); check(now, "[object Window]", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Java Object -> Java Object"; PluginTest.Float_type = 1.111; orig_hash = PluginTest.Float_type.hashCode(); PluginTest.Object_type = PluginTest.Float_type; new_hash = PluginTest.Object_type.hashCode(); addResult (type, "hashcode=" + orig_hash, orig_hash, new_hash, row); check(new_hash, orig_hash, "number", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Java Object -> String"; setto = new PluginTest.Packages.DummyObject("Test object"); PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, "Test object", now, row); check(now, "Test object", "string", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "null -> Java Object (String)"; // Assuming the set tests have passed, we know that object is non-null after this PluginTest.String_type = "Not Null"; setto = null; PluginTest.String_type = setto; now = PluginTest.String_type; addResult (type, setto, null, now, row); check(now, null, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); /* // NULL -> primitive tests are disabled for now due to ambiguity. // Section 2.2 here: http://java.sun.com/javase/6/webnotes/6u10/plugin2/liveconnect/ // States that null to primitive is not allowed, yet, section 2.3.7 claims it is.. try { row = document.createElement("tr"); type = "null -> byte"; // Assuming the set tests have passed, we know that object is non-null after this PluginTest.byte_type = "100"; setto = null; PluginTest.byte_type = setto; now = PluginTest.byte_type; addResult (type, setto, null, now, row); check(now, null, "object", row); } catch (e) { error(type, setto, e, row); } tblBody.appendChild(row); */ } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jjs_func_rettype_tests.js0000644000000000000000000000013213441742745025231 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jjs_func_rettype_tests.js0000644000175000002070000000336113441742745026044 0ustar00jvanekmock00000000000000/****************************************************** * Tests for parameter conversion between Java and JS * ******************************************************/ function JJSReturnTypeCallTest(type) { if (type == "Number") return 1; if (type == "Boolean") return false; if (type == "String") return "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; if (type == "Object") return window; } function runSingleJJSReturnTypeTest(type, row) { try { expectedvalue = JJSReturnTypeCallTest(type); actualvalue = PluginTest.jjsReturnTypeTest(type); addResult(type, expectedvalue, actualvalue, row); check(actualvalue, expectedvalue + "", "string", row); } catch (e) { error(type, "", e, row); } } function jjsCallReturnTypeTests() { document.getElementById("results").innerHTML += "

Java -> JS Call tests (Return Type):

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Parameter Type (Java side)"; columnNames[1] = "Expected return value"; columnNames[2] = "Actual return value"; columnNames[3] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); row = document.createElement("tr"); runSingleJJSReturnTypeTest("Number", row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJJSReturnTypeTest("Boolean", row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJJSReturnTypeTest("String", row); tblBody.appendChild(row); row = document.createElement("tr"); runSingleJJSReturnTypeTest("Object", row); tblBody.appendChild(row); } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/OverloadTestHelper2.java0000644000000000000000000000013213441742745024574 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/OverloadTestHelper2.java0000644000175000002070000000010013441742745025373 0ustar00jvanekmock00000000000000public class OverloadTestHelper2 extends OverloadTestHelper1 {} icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jsj_get_tests.js0000644000000000000000000000013213441742745023301 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jsj_get_tests.js0000644000175000002070000001743713441742745024125 0ustar00jvanekmock00000000000000/******************************************** * Tests for getting members from Java side * ********************************************/ function getMemberTests() { document.getElementById("results").innerHTML += "

JS -> Java get tests:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Member Type"; columnNames[1] = "Expected Value"; columnNames[2] = "Actual Value"; columnNames[3] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); PluginTest.setUpForGMTests(); try { row = document.createElement("tr"); type = "int"; expectedvalue = 42; addResult(type, expectedvalue, PluginTest.i, row); check(PluginTest.i, expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "double"; expectedvalue = 42.42; addResult(type, expectedvalue, PluginTest.d, row); check(PluginTest.d, expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "float"; expectedvalue = 42.099998474121094; addResult(type, expectedvalue, PluginTest.f, row); check(PluginTest.f, expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "long"; expectedvalue = 4294967296; addResult(type, expectedvalue, PluginTest.l, row); check(PluginTest.l, expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "boolean"; expectedvalue = true; addResult(type, expectedvalue, PluginTest.b, row); check(PluginTest.b, expectedvalue, "boolean", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "char"; expectedvalue = 8995; addResult(type, expectedvalue, PluginTest.c, row); check(PluginTest.c, expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "byte"; expectedvalue = 43; addResult(type, expectedvalue, PluginTest.by, row); check(PluginTest.by, expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "int[] (element access)"; expectedvalue = "1024"; addResult(type, expectedvalue, PluginTest.ia[4], row); check(PluginTest.ia[4], expectedvalue, "number", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "int[] (beyond length)"; expectedvalue = null; addResult(type, expectedvalue, PluginTest.ia[30], row); check(PluginTest.ia[30], expectedvalue, "undefined", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Regular String"; expectedvalue = "I'm a string!"; addResult(type, expectedvalue, PluginTest.rs, row); check(PluginTest.rs, expectedvalue, "string", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "String with special characters"; expectedvalue = "№ Žу€’ТЃ$ЧЃт‚Ќ№–"; addResult(type, expectedvalue, PluginTest.ss, row); check(PluginTest.ss, expectedvalue, "string", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "null"; expectedvalue = null; addResult(type, expectedvalue, PluginTest.n, row); check(PluginTest.n, expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Integer"; expectedvalue = 24; addResult(type, expectedvalue, PluginTest.I, row); check(PluginTest.I, expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Double"; expectedvalue = 24.24; addResult(type, expectedvalue, PluginTest.D, row); check(PluginTest.D, expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Float"; expectedvalue = 24.124; addResult(type, expectedvalue, PluginTest.F, row); check(PluginTest.F, expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Long"; expectedvalue = 6927694924; addResult(type, expectedvalue, PluginTest.L, row); check(PluginTest.L, expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Boolean"; expectedvalue = "false"; addResult(type, expectedvalue, PluginTest.B, row); check(PluginTest.B, expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Character"; expectedvalue = 'с”І'; addResult(type, expectedvalue, PluginTest.C, row); check(PluginTest.C, expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Byte"; expectedvalue = 34; addResult(type, expectedvalue, PluginTest.By, row); check(PluginTest.By, expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Double[] (element access)"; expectedvalue = "24.24"; addResult(type, expectedvalue, PluginTest.Da1[9], row); check(PluginTest.Da1[9], expectedvalue, "object", row); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); type = "Double[] (Full array)"; expectedvalue = "[Ljava.lang.Double;@"; addResult(type, expectedvalue+"*", PluginTest.Da1, row); if (PluginTest.Da1.toString().substr(0,20) == expectedvalue) if (typeof(PluginTest.Da1) == "object") { pass(row); } else { fail(row, "Type mismatch: " + typeof(PluginTest.Da1) + " != object"); } else fail(row, ""); } catch (e) { error(type, expectedvalue, e, row); } tblBody.appendChild(row); } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/jjs_eval_test.js0000644000000000000000000000013213441742745023266 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/jjs_eval_test.js0000644000175000002070000000337213441742745024103 0ustar00jvanekmock00000000000000/****************************************************** * Tests for parameter conversion between Java and JS * ******************************************************/ function jjsEvalTests() { document.getElementById("results").innerHTML += "

Java -> JS Eval Test:

"; var tbl = document.createElement("table"); var tblBody = document.createElement("tbody"); var columnNames = new Array(); columnNames[0] = "Evaluating"; columnNames[1] = "Expected result"; columnNames[2] = "Result"; columnNames[3] = "Status"; var row; createResultTable(tbl, tblBody, columnNames); try { row = document.createElement("tr"); evalstr = "document.location"; expectedvalue = eval(evalstr); actualValue = PluginTest.jjsEvalTest(evalstr); addResult(evalstr, expectedvalue, actualValue, row); check(actualValue, expectedvalue, "string", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); evalstr = "1+1"; expectedvalue = eval(evalstr); actualValue = PluginTest.jjsEvalTest(evalstr); addResult(evalstr, expectedvalue, actualValue, row); check(actualValue, expectedvalue, "string", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); try { row = document.createElement("tr"); evalstr = "typeof(true)"; expectedvalue = eval(evalstr); actualValue = PluginTest.jjsEvalTest(evalstr); addResult(evalstr, expectedvalue, actualValue, row); check(actualValue, expectedvalue, "string", row); } catch (e) { error(type, "", e, row); } tblBody.appendChild(row); } icedtea-web-1.8/plugin/tests/LiveConnect/PaxHeaders.7406/DummyObject.java0000644000000000000000000000013213441742745023161 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/tests/LiveConnect/DummyObject.java0000644000175000002070000000040513441742745023770 0ustar00jvanekmock00000000000000public class DummyObject { private String str; public DummyObject(String s) { this.str = s; } public void setStr(String s) { this.str = s; } public String toString() { return str; } } icedtea-web-1.8/plugin/PaxHeaders.7406/icedteanp0000644000000000000000000000013213441742745016400 xustar0030 mtime=1552401893.079832739 30 atime=1552410887.113183443 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/0000755000175000002070000000000013441742745017265 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaPluginUtils.h0000644000000000000000000000013213441742745022324 xustar0030 mtime=1552401893.079832739 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/IcedTeaPluginUtils.h0000644000175000002070000004655513441742745023153 0ustar00jvanekmock00000000000000/* IcedTeaPluginUtils.h Copyright (C) 2009, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /** * Utility classes for the IcedTeaPlugin */ #ifndef __ICEDTEAPLUGINUTILS_H__ #define __ICEDTEAPLUGINUTILS_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "IcedTeaParseProperties.h" void *flush_pre_init_messages(void* data); void push_pre_init_messages(char * ldm); void reset_pre_init_messages(); // debugging macro. #define initialize_debug() \ do \ { \ if (!debug_initiated) { \ debug_initiated = true; \ plugin_debug = getenv ("ICEDTEAPLUGIN_DEBUG") != NULL || is_debug_on(); \ plugin_debug_headers = is_debug_header_on(); \ plugin_debug_to_file = is_logging_to_file(); \ plugin_debug_to_streams = is_logging_to_stds(); \ plugin_debug_to_system = is_logging_to_system(); \ plugin_debug_to_console = is_java_console_enabled(); \ if (plugin_debug_to_file) { \ IcedTeaPluginUtilities::initFileLog(); \ file_logs_initiated = true; \ } \ if (plugin_debug_to_console) { \ /*initialisation done during jvm startup*/ \ } \ IcedTeaPluginUtilities::printDebugStatus(); \ } \ } while (0) #define HEADER_SIZE 500 #define BODY_SIZE 500 #define MESSAGE_SIZE HEADER_SIZE + BODY_SIZE #define LDEBUG_MESSAGE_SIZE MESSAGE_SIZE+50 //header is destination char array #define CREATE_HEADER(ldebug_header) \ do \ { \ char times[100]; \ time_t t = time(NULL); \ struct tm p; \ localtime_r(&t, &p); \ strftime(times, 100, "%a %b %d %H:%M:%S %Z %Y", &p);\ const char *userNameforDebug = (getenv("USERNAME") == NULL) ? "unknown user" : getenv("USERNAME"); \ /*this message is parsed in JavaConsole*/ \ snprintf(ldebug_header, HEADER_SIZE, "[%s][ITW-C-PLUGIN][MESSAGE_DEBUG][%s][%s:%d] ITNPP Thread# %ld, gthread %p: ", \ userNameforDebug, times, __FILE__, __LINE__, pthread_self(), g_thread_self ()); \ } while (0) #define PLUGIN_DEBUG(...) \ do \ { \ initialize_debug(); \ if (plugin_debug) { \ char ldebug_header[HEADER_SIZE]; \ char ldebug_body[BODY_SIZE]; \ char ldebug_message[MESSAGE_SIZE];\ if (plugin_debug_headers) { \ CREATE_HEADER(ldebug_header); \ } else { \ sprintf(ldebug_header,""); \ } \ snprintf(ldebug_body, BODY_SIZE, __VA_ARGS__); \ if (plugin_debug_to_streams) { \ snprintf(ldebug_message, MESSAGE_SIZE, "%s%s", ldebug_header, ldebug_body); \ fprintf (stdout, "%s", ldebug_message);\ } \ if (plugin_debug_to_file && file_logs_initiated) { \ snprintf(ldebug_message, MESSAGE_SIZE, "%s%s", ldebug_header, ldebug_body); \ fprintf (plugin_file_log, "%s", ldebug_message); \ fflush(plugin_file_log); \ } \ if (plugin_debug_to_console) { \ /*headers are always going to console*/ \ if (!plugin_debug_headers){ \ CREATE_HEADER(ldebug_header); \ } \ snprintf(ldebug_message, MESSAGE_SIZE, "%s%s", ldebug_header, ldebug_body); \ char ldebug_channel_message[LDEBUG_MESSAGE_SIZE]; \ struct timeval current_time; \ gettimeofday (¤t_time, NULL);\ if (jvm_up) { \ snprintf(ldebug_channel_message, LDEBUG_MESSAGE_SIZE, "%s %ld %s", "plugindebug", current_time.tv_sec*1000000L+current_time.tv_usec, ldebug_message); \ push_pre_init_messages(ldebug_channel_message); \ } else { \ snprintf(ldebug_channel_message, LDEBUG_MESSAGE_SIZE, "%s %ld %s", "preinit_plugindebug", current_time.tv_sec*1000000L+current_time.tv_usec, ldebug_message); \ push_pre_init_messages(ldebug_channel_message); \ } \ } \ if (plugin_debug_to_system){ \ /*no debug messages to systemlog*/\ } \ } \ } while (0) #define PLUGIN_ERROR(...) \ do \ { \ initialize_debug(); \ char ldebug_header[HEADER_SIZE]; \ char ldebug_body[BODY_SIZE]; \ char ldebug_message[MESSAGE_SIZE]; \ if (plugin_debug_headers) { \ CREATE_HEADER(ldebug_header); \ } else { \ sprintf(ldebug_header,""); \ } \ snprintf(ldebug_body, BODY_SIZE, __VA_ARGS__); \ if (plugin_debug_to_streams) { \ snprintf(ldebug_message, MESSAGE_SIZE, "%s%s", ldebug_header, ldebug_body); \ fprintf (stderr, "%s", ldebug_message); \ } \ if (plugin_debug_to_file && file_logs_initiated) { \ snprintf(ldebug_message, MESSAGE_SIZE, "%s%s", ldebug_header, ldebug_body); \ fprintf (plugin_file_log, "%s", ldebug_message); \ fflush(plugin_file_log); \ } \ if (plugin_debug_to_console) { \ /*headers are always going to console*/ \ if (!plugin_debug_headers){ \ CREATE_HEADER(ldebug_header); \ } \ snprintf(ldebug_message, MESSAGE_SIZE, "%s%s", ldebug_header, ldebug_body); \ char ldebug_channel_message[LDEBUG_MESSAGE_SIZE]; \ struct timeval current_time; \ gettimeofday (¤t_time, NULL);\ if (jvm_up) { \ snprintf(ldebug_channel_message, LDEBUG_MESSAGE_SIZE, "%s %ld %s", "pluginerror", current_time.tv_sec*1000000L+current_time.tv_usec, ldebug_message); \ push_pre_init_messages(ldebug_channel_message); \ } else { \ snprintf(ldebug_channel_message, LDEBUG_MESSAGE_SIZE, "%s %ld %s", "preinit_pluginerror", current_time.tv_sec*1000000L+current_time.tv_usec, ldebug_message); \ push_pre_init_messages(ldebug_channel_message); \ } \ } \ if (plugin_debug_to_system){ \ /*java can not have prefix*/ \ openlog("", LOG_NDELAY, LOG_USER);\ syslog(LOG_ERR, "%s", "IcedTea-Web c-plugin - for more info see itweb-settings debug options or console. See http://icedtea.classpath.org/wiki/IcedTea-Web#Filing_bugs for help.");\ syslog(LOG_ERR, "%s", "IcedTea-Web c-plugin error manual log:");\ /*no headers to syslog*/ \ syslog(LOG_ERR, "%s", ldebug_body); \ closelog(); \ } \ } while (0) #define CHECK_JAVA_RESULT(result_data) \ { \ if (((JavaResultData*) result_data)->error_occurred) \ { \ PLUGIN_ERROR("Error: Error occurred on Java side: %s.\n", \ ((JavaResultData*) result_data)->error_msg->c_str()); \ return; \ } \ } #define HEX_TO_INT(c) \ ((*c >= 'a') ? *c - 'a' + 10 : \ (*c >= 'A') ? *c - 'A' + 10 : \ *c - '0') #define IS_VALID_HEX(c) \ ((*c >= '0' && *c <= '9') || \ (*c >= 'a' && *c <= 'f') || \ (*c >= 'A' && *c <= 'F')) //long long max ~ 19 chars + terminator //leave some room for converting strings like " = %d" const size_t NUM_STR_BUFFER_SIZE = 32; /* * This struct holds data specific to a Java operation requested by the plugin */ typedef struct java_result_data { // Return identifier (if applicable) int return_identifier; // Return string (if applicable) std::string* return_string; // Return wide/mb string (if applicable) std::wstring* return_wstring; // Error message (if an error occurred) std::string* error_msg; // Boolean indicating if an error occurred bool error_occurred; } JavaResultData; /** * This struct holds data to do calls that need to be run in the plugin thread */ typedef struct plugin_thread_call { // The plugin instance NPP instance; // The function to call void (*func) (void *); // The data to pass to the function void *userData; } PluginThreadCall; /** * Data structure passed to functions called in a new thread. */ typedef struct async_call_thread_data { std::vector parameters; std::string result; bool result_ready; bool call_successful; } AsyncCallThreadData; /* * Misc. utility functions * * This class is never instantiated and should contain static functions only */ /* Function to process all pending async calls */ void processAsyncCallQueue(void*); class IcedTeaPluginUtilities { private: static int reference; /* Reference count */ /* Mutex lock for updating reference count */ static pthread_mutex_t reference_mutex; /* Map holding window pointer<->instance relationships */ static std::map* instance_map; /* Map holding java-side-obj-key->NPObject relationship */ static std::map* object_map; /* Posts a call in the async call queue */ static bool postPluginThreadAsyncCall(NPP instance, void (*func) (void *), void* data); public: /* Constructs message prefix with given context */ static void constructMessagePrefix(int context, std::string* result); /* Constructs message prefix with given context and reference */ static void constructMessagePrefix(int context, int reference, std::string* result); /* Constructs message prefix with given context, reference and src */ static void constructMessagePrefix(int context, int reference, std::string address, std::string* result); /* Converts given pointer to a string representation */ static void JSIDToString(void* id, std::string* result); /* Converts the given string representation to a pointer */ static void* stringToJSID(std::string id_str); static void* stringToJSID(std::string* id_str); /* Increments reference count and returns it */ static int getReference(); /* Decrements reference count */ static void releaseReference(); /* Converts the given integer to a string */ static void itoa(int i, std::string* result); /* Copies a variant data type into a C++ string */ static std::string NPVariantAsString(NPVariant variant); /* This must be freed with browserfunctions.memfree */ static NPString NPStringCopy(const std::string& result); /* This must be freed with browserfunctions.releasevariantvalue */ static NPVariant NPVariantStringCopy(const std::string& result); /* Returns an std::string represented by the given identifier. */ static std::string NPIdentifierAsString(NPIdentifier id); /* Frees the given vector and the strings that its contents point to */ static void freeStringPtrVector(std::vector* v); /* Splits the given string based on the delimiter provided */ static std::vector* strSplit(const char* str, const char* delim); /* Converts given unicode integer byte array to UTF8 string */ static void getUTF8String(int length, int begin, std::vector* unicode_byte_array, std::string* result_unicode_str); /* Converts given UTF8 string to unicode integer byte array */ static void convertStringToUTF8(std::string* str, std::string* utf_str); /* Converts given unicode integer byte array to UTF16LE/UCS-2 string */ static void getUTF16LEString(int length, int begin, std::vector* unicode_byte_array, std::wstring* result_unicode_str); /* Prints contents of given string vector */ static void printStringVector(const char* prefix, std::vector* cv); /* Prints contents of given string pointer vector */ static void printStringPtrVector(const char* prefix, std::vector* cv); static std::string* variantToClassName(NPVariant variant); static void printNPVariant(NPVariant variant); static void NPVariantToString(NPVariant variant, std::string* result); static bool javaResultToNPVariant(NPP instance, std::string* java_result, NPVariant* variant); static const gchar* getSourceFromInstance(NPP instance); static void storeInstanceID(void* member_ptr, NPP instance); static void removeInstanceID(void* member_ptr); /* Clear object_map. Useful for tests. */ static void clearInstanceIDs(); static NPP getInstanceFromMemberPtr(void* member_ptr); static NPObject* getNPObjectFromJavaKey(std::string key); static void storeObjectMapping(std::string key, NPObject* object); static void removeObjectMapping(std::string key); /* Clear object_map. Useful for tests. */ static void clearObjectMapping(); static void invalidateInstance(NPP instance); static bool isObjectJSArray(NPP instance, NPObject* object); static void decodeURL(const char* url, char** decoded_url); /* Returns a vector of gchar* pointing to the elements of the vector string passed in*/ static std::vector vectorStringToVectorGchar(const std::vector* stringVec); /* Posts call in async queue and waits till execution completes */ static void callAndWaitForResult(NPP instance, void (*func) (void *), AsyncCallThreadData* data); /*cutting whitespaces from end and start of string*/ static void trim(std::string& str); /*Unescape various escaped chars like \\ -> \ or \= -> = or \: -> \*/ static void unescape(std::string& str); static bool file_exists(std::string filename); static bool is_directory(std::string filename); //file-loggers helpers static std::string generateLogFileName(); static void initFileLog(); static void printDebugStatus(); static std::string getTmpPath(); static std::string getRuntimePath(); static bool create_dir(std::string); }; /* * A bus subscriber interface. Implementors must implement the newMessageOnBus * method. */ class BusSubscriber { private: public: BusSubscriber() {} /* Notifies this subscriber that a new message as arrived */ virtual bool newMessageOnBus(const char* message) = 0; }; /* * This implementation is very simple and is therefore folded into this file * rather than a new one. */ class JavaMessageSender : public BusSubscriber { private: public: /* Sends given message to Java side */ virtual bool newMessageOnBus(const char* message); }; /* * Represents a message bus. * The bus can also have subscribers who are notified when a new message * arrives. */ class MessageBus { private: /* Mutex for locking the message queue */ pthread_mutex_t msg_queue_mutex; /* Mutex used when adjusting subscriber list */ pthread_mutex_t subscriber_mutex; /* Subscriber list */ std::list subscribers; /* Queued messages */ std::queue msgQueue; public: MessageBus(); ~MessageBus(); /* subscribe to this bus */ void subscribe(BusSubscriber* b); /* unsubscribe from this bus */ void unSubscribe(BusSubscriber* b); /* Post a message on to the bus (it is safe to free the message pointer after this function returns) */ void post(const char* message); }; #endif // __ICEDTEAPLUGINUTILS_H__ icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaJavaRequestProcessor.h0000644000000000000000000000013213441742745024177 xustar0030 mtime=1552401893.078832742 30 atime=1552402157.238253478 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/IcedTeaJavaRequestProcessor.h0000644000175000002070000002141213441742745025007 0ustar00jvanekmock00000000000000/* IcedTeaJavaRequestProcessor.h Copyright (C) 2009, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #ifndef ICEDTEAJAVAREQUEST_H_ #define ICEDTEAJAVAREQUEST_H_ #include #include #include #include #include "IcedTeaNPPlugin.h" #include "IcedTeaPluginUtils.h" #define REQUESTTIMEOUT 180 /* * This struct holds data specific to a Java operation requested by the plugin */ typedef struct java_request { // Instance id (if applicable) int instance; // Context id (if applicable) int context; // request specific data std::vector* data; // source of the request std::string* source; } JavaRequest; /* Creates a argument on java-side with appropriate type */ void createJavaObjectFromVariant(NPP instance, NPVariant variant, std::string* id); /* Returns the type of array based on the given element */ void getArrayTypeForJava(NPP instance, NPVariant element, std::string* type); class JavaRequestProcessor : BusSubscriber { private: // instance and references are constant throughout this objects // lifecycle int instance; int reference; bool result_ready; JavaResultData* result; /* Post message on bus and wait */ void postAndWaitForResponse(std::string message); // Call a method, static or otherwise, depending on supplied arg JavaResultData* call(std::string source, bool isStatic, std::string objectID, std::string methodName, std::vector args); // Set a static/non-static field to given value JavaResultData* set(std::string source, bool isStatic, std::string classID, std::string objectID, std::string fieldName, std::string value_id); /* Resets the results */ void resetResult(); public: JavaRequestProcessor(); ~JavaRequestProcessor(); virtual bool newMessageOnBus(const char* message); /* Increments reference count by 1 */ void addReference(std::string object_id); /* Decrements reference count by 1 */ void deleteReference(std::string object_id); /* Returns the toString() value, given an object identifier */ JavaResultData* getToStringValue(std::string object_id); /* Returns the value, given an object identifier */ JavaResultData* getValue(std::string object_id); /* Returns the string, given the identifier */ JavaResultData* getString(std::string string_id); /* Returns the field object */ JavaResultData* getField(std::string source, std::string classID, std::string objectID, std::string fieldName); /* Returns the static field object */ JavaResultData* getStaticField(std::string source, std::string classID, std::string fieldName); /* Sets the field object */ JavaResultData* setField(std::string source, std::string classID, std::string objectID, std::string fieldName, std::string value_id); /* Sets the static field object */ JavaResultData* setStaticField(std::string source, std::string classID, std::string fieldName, std::string value_id); /* Returns the field id */ JavaResultData* getFieldID(std::string classID, std::string fieldName); /* Returns the static field id */ JavaResultData* getStaticFieldID(std::string classID, std::string fieldName); /* Returns the method id */ JavaResultData* getMethodID(std::string classID, NPIdentifier methodName, std::vector args); /* Returns the static method id */ JavaResultData* getStaticMethodID(std::string classID, NPIdentifier methodName, std::vector args); /* Calls a static method */ JavaResultData* callStaticMethod(std::string source, std::string classID, std::string methodName, std::vector args); /* Calls a method on an instance */ JavaResultData* callMethod(std::string source, std::string objectID, std::string methodName, std::vector args); /* Returns the class of the given object */ JavaResultData* getObjectClass(std::string objectID); /* Creates a new object with choosable constructor */ JavaResultData* newObject(std::string source, std::string classID, std::vector args); /* Creates a new object when constructor is undetermined */ JavaResultData* newObjectWithConstructor(std::string source, std::string classID, std::string methodID, std::vector args); /* Returns the class ID */ JavaResultData* findClass(int plugin_instance_id, std::string name); /* Returns the type class name */ JavaResultData* getClassName(std::string objectID); /* Returns the type class id */ JavaResultData* getClassID(std::string objectID); /* Returns the length of the array object. -1 if not found */ JavaResultData* getArrayLength(std::string objectID); /* Returns the item at the given index for the array */ JavaResultData* getSlot(std::string objectID, std::string index); /* Sets the item at the given index to the given value */ JavaResultData* setSlot(std::string objectID, std::string index, std::string value_id); /* Creates a new array of given length */ JavaResultData* newArray(std::string component_class, std::string length); /* Creates a new string in the Java store */ JavaResultData* newString(std::string str); /* Check if package exists */ JavaResultData* hasPackage(int plugin_instance_id, std::string package_name); /* Check if method exists */ JavaResultData* hasMethod(std::string classID, std::string method_name); /* Check if field exists */ JavaResultData* hasField(std::string classID, std::string method_name); /* Check if given object is instance of given class */ JavaResultData* isInstanceOf(std::string objectID, std::string classID); /* Returns the instance ID of the java applet */ JavaResultData* getAppletObjectInstance(std::string instanceID); }; #endif /* ICEDTEAJAVAREQUESTPROCESSOR_H_ */ icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaPluginRequestProcessor.h0000644000000000000000000000013213441742745024554 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.237253481 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/IcedTeaPluginRequestProcessor.h0000644000175000002070000001115413441742745025366 0ustar00jvanekmock00000000000000/* IcedTeaPluginRequestProcessor.h Copyright (C) 2009, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #ifndef __ICEDTEAPLUGINREQUESTPROCESSOR_H__ #define __ICEDTEAPLUGINREQUESTPROCESSOR_H__ #include #include #include #include #include #include #include #include "IcedTeaPluginUtils.h" #include "IcedTeaJavaRequestProcessor.h" /* Internal request reference counter */ static long internal_req_ref_counter; /* Given a value and type, performs the appropriate Java->JS type * mapping and puts it in the given variant */ static void convertToNPVariant(std::string value, std::string type, NPVariant* result_variant); // Internal methods that need to run in main thread void _getMember(void* data); void _setMember(void* data); void _call(void* data); void _eval(void* data); void _getString(void* data); void _loadURL(void* data); void* queue_processor(void* data); /** * Processes requests made TO the plugin (by java or anyone else) */ class PluginRequestProcessor : public BusSubscriber { private: /* Mutex to ensure that the request queue is accessed synchronously */ pthread_mutex_t message_queue_mutex; /* Condition on which the queue processor waits */ pthread_cond_t cond_message_available; /* Queue for holding messages that get processed in a separate thread */ std::vector< std::vector* >* message_queue; /* Mutex to ensure synchronized writes */ pthread_mutex_t syn_write_mutex; /* Dispatch request processing to a new thread for asynch. processing */ void dispatch(void* func_ptr (void*), std::vector* message, std::string* src); /* Send main window pointer to Java */ void sendWindow(std::vector* message_parts); /* Stores the variant on java side */ void storeVariantInJava(NPVariant variant, std::string* result); /* Send member ID to Java */ void sendMember(std::vector* message_parts); /* Set member to given value */ void setMember(std::vector* message_parts); /* Send string value of requested object */ void sendString(std::vector* message_parts); /* Evaluate the given script */ void eval(std::vector* message_parts); /* Evaluate the given script */ void call(std::vector* message_parts); /* Decrements reference count for given object */ void finalize(std::vector* message_parts); /* Loads a URL into the specified target */ void loadURL(std::vector* message_parts); public: PluginRequestProcessor(); /* Constructor */ ~PluginRequestProcessor(); /* Destructor */ /* Process new requests (if applicable) */ virtual bool newMessageOnBus(const char* message); /* Thread run method for processing queued messages */ void queueProcessorThread(); }; #endif // __ICEDTEAPLUGINREQUESTPROCESSOR_H__ icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/java0000644000000000000000000000013213441742745017321 xustar0030 mtime=1552401893.052832796 30 atime=1552410887.113183443 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/java/0000755000175000002070000000000013441742745020206 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/icedteanp/java/PaxHeaders.7406/sun0000644000000000000000000000013213441742745020126 xustar0030 mtime=1552401893.052832796 30 atime=1552410887.113183443 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/java/sun/0000755000175000002070000000000013441742745021013 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/icedteanp/java/sun/PaxHeaders.7406/applet0000644000000000000000000000013213441742745021413 xustar0030 mtime=1552401893.081832735 30 atime=1552410887.113183443 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/0000755000175000002070000000000013441742745022300 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginProxySelector.java0000644000000000000000000000013213441742745026334 xustar0030 mtime=1552401893.081832735 30 atime=1552402157.237253481 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginProxySelector.java0000644000175000002070000001521613441742745027151 0ustar00jvanekmock00000000000000/* PluginProxySelector -- proxy selector for all connections from applets and the plugin Copyright (C) 2009 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import java.io.UnsupportedEncodingException; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import com.sun.jndi.toolkit.url.UrlUtil; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPProxySelector; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.TimedHashMap; /** * Proxy selector implementation for plugin network functions. * * This class fetches proxy information from the web browser and * uses that information in the context of all network connection * (plugin specific and applet connections) as applicable * */ public class PluginProxySelector extends JNLPProxySelector { private final TimedHashMap proxyCache = new TimedHashMap<>(); public PluginProxySelector(DeploymentConfiguration config) { super(config); } /** * Selects the appropriate proxy (or DIRECT connection method) for the given URI * * @param uri The URI being accessed * @return A list of Proxy objects that are usable for this URI */ @Override protected List getFromBrowser(URI uri) { List proxyList = new ArrayList<>(); // check cache first Proxy cachedProxy = checkCache(uri); if (cachedProxy != null) { proxyList.add(cachedProxy); return proxyList; } // Nothing usable in cache. Fetch info from browser String requestURI; try { requestURI = convertUriSchemeForProxyQuery(uri); } catch (Exception e) { PluginDebug.debug("Cannot construct URL from ", uri.toString(), " ... falling back to DIRECT proxy"); OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); proxyList.add(Proxy.NO_PROXY); return proxyList; } Proxy proxy = Proxy.NO_PROXY; Object o = getProxyFromRemoteCallToBrowser(requestURI); // If the browser returned anything, try to parse it. If anything in the try block fails, the fallback is direct connection try { if (o != null) { PluginDebug.debug("Proxy URI = ", o); URI proxyURI = (URI) o; // If origin uri is http/ftp, we're good. If origin uri is not that, the proxy _must_ be socks, else we fallback to direct if (uri.getScheme().startsWith("http") || uri.getScheme().equals("ftp") || proxyURI.getScheme().startsWith("socks")) { Proxy.Type type = proxyURI.getScheme().equals("http") ? Proxy.Type.HTTP : Proxy.Type.SOCKS; InetSocketAddress socketAddr = new InetSocketAddress(proxyURI.getHost(), proxyURI.getPort()); proxy = new Proxy(type, socketAddr); String uriKey = computeKey(uri); proxyCache.put(uriKey, proxy); } else { PluginDebug.debug("Proxy ", proxyURI, " cannot be used for ", uri, ". Falling back to DIRECT"); } } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } proxyList.add(proxy); PluginDebug.debug("Proxy for ", uri.toString(), " is ", proxy); return proxyList; } /** For tests to override. * @param uri of proxy * @return information about proxy */ protected Object getProxyFromRemoteCallToBrowser(String uri) { return PluginAppletViewer.requestPluginProxyInfo(uri); } /** * Checks to see if proxy information is already cached. * * @param uri The URI to check * @return The cached Proxy. null if there is no suitable cached proxy. */ private Proxy checkCache(URI uri) { String uriKey = computeKey(uri); if (proxyCache.get(uriKey) != null) { return proxyCache.get(uriKey); } return null; } /** Compute a key to use for the proxy cache */ private String computeKey(URI uri) { return uri.getScheme() + "://" + uri.getHost(); } public static String convertUriSchemeForProxyQuery(URI uri) throws URISyntaxException, UnsupportedEncodingException { // there is no easy way to get SOCKS proxy info. So, we tell mozilla that we want proxy for // an HTTP uri in case of non http/ftp protocols. If we get back a SOCKS proxy, we can // use that, if we get back an http proxy, we fallback to DIRECT connect String scheme = uri.getScheme(); if (!scheme.startsWith("http") && !scheme.equals("ftp")) { scheme = "http"; } URI result = new URI(scheme, uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(), uri.getFragment()); return UrlUtil.encode(result.toString(), "UTF-8"); } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginDebug.java0000644000000000000000000000013213441742745024540 xustar0030 mtime=1552401893.080832738 30 atime=1552402157.237253481 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginDebug.java0000644000175000002070000000453113441742745025353 0ustar00jvanekmock00000000000000/* VoidPluginCallRequest -- represent Java-to-JavaScript requests Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; public class PluginDebug { static final boolean DEBUG = JNLPRuntime.isDebug(); public static void debug(Object... messageChunks) { if (DEBUG) { if (messageChunks == null) { messageChunks = new Object[] {null}; } StringBuilder b = new StringBuilder(); for (Object chunk : messageChunks) { b.append(chunk); } OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, b.toString()); } } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginAppletPanelFactory.java0000644000000000000000000000013213441742745027247 xustar0030 mtime=1552401893.080832738 30 atime=1552402157.237253481 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java0000644000175000002070000002340313441742745030061 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /* * Copyright 1995-2004 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package sun.applet; import java.applet.Applet; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import javax.swing.SwingUtilities; import net.sourceforge.jnlp.NetxPanel; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.PluginParameters; import net.sourceforge.jnlp.util.logging.OutputController; /** * Lets us construct one using unix-style one shot behaviors */ class PluginAppletPanelFactory { public AppletPanel createPanel(PluginStreamHandler streamhandler, final int identifier, final long handle, final URL doc, final PluginParameters params, final PluginBridge pb) { final NetxPanel panel = AccessController.doPrivileged(new PrivilegedAction() { public NetxPanel run() { NetxPanel panel = new NetxPanel(doc, params, pb); OutputController.getLogger().log("Using NetX panel"); PluginDebug.debug(params.toString()); return panel; } }); // Framing the panel needs to happen in a thread whose thread group // is the same as the threadgroup of the applet thread. If this // isn't the case, the awt eventqueue thread's context classloader // won't be set to a JNLPClassLoader, and when an applet class needs // to be loaded from the awt eventqueue, it won't be found. Thread panelInit = new Thread(panel.getThreadGroup(), new Runnable() { @Override public void run() { panel.createNewAppContext(); // create the frame. PluginDebug.debug("X and Y are: " + params.getWidth() + " " + params.getHeight()); panel.setAppletViewerFrame(PluginAppletViewer.framePanel(identifier, handle, params.getWidth(), params.getHeight(), panel)); panel.init(); // Start the applet initEventQueue(panel); } }, "NetXPanel initializer"); panelInit.start(); try { panelInit.join(); } catch (InterruptedException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } setAppletViewerSize(panel, params.getWidth(), params.getHeight()); // Wait for the panel to initialize PluginAppletViewer.waitForAppletInit(panel); Applet a = panel.getApplet(); // Still null? if (a == null) { streamhandler.write("instance " + identifier + " reference " + -1 + " fatalError: " + "Initialization timed out"); return null; } PluginDebug.debug("Applet ", a.getClass(), " initialized"); streamhandler.write("instance " + identifier + " reference 0 initialized"); panel.removeSplash(); AppletSecurityContextManager.getSecurityContext(0).associateSrc(panel.getAppletClassLoader(), doc); AppletSecurityContextManager.getSecurityContext(0).associateInstance(identifier, panel.getAppletClassLoader()); return panel; } /* AppletViewerPanel sometimes doesn't set size right initially. This * causes the parent frame to be the default (10x10) size. * * Normally it goes unnoticed since browsers like Firefox make a resize * call after init. However some browsers (e.g. Midori) don't. * * We therefore manually set the parent to the right size. */ static private void setAppletViewerSize(final AppletPanel panel, final int width, final int height) { try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { panel.getParent().setSize(width, height); } }); } catch (InvocationTargetException e) { // Not being able to resize is non-fatal PluginDebug.debug("Unable to resize panel: "); OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } catch (InterruptedException e) { // Not being able to resize is non-fatal PluginDebug.debug("Unable to resize panel: "); OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } } /** * Send the initial set of events to the appletviewer event queue. * On start-up the current behaviour is to load the applet and call * Applet.init() and Applet.start(). */ private void initEventQueue(AppletPanel panel) { // appletviewer.send.event is an undocumented and unsupported system // property which is used exclusively for testing purposes. PrivilegedAction pa = new PrivilegedAction() { public String run() { return System.getProperty("appletviewer.send.event"); } }; String eventList = AccessController.doPrivileged(pa); if (eventList == null) { // Add the standard events onto the event queue. panel.sendEvent(AppletPanel.APPLET_LOAD); panel.sendEvent(AppletPanel.APPLET_INIT); panel.sendEvent(AppletPanel.APPLET_START); } else { // We're testing AppletViewer. Force the specified set of events // onto the event queue, wait for the events to be processed, and // exit. // The list of events that will be executed is provided as a // ","-separated list. No error-checking will be done on the list. String[] events = eventList.split(","); for (String event : events) { PluginDebug.debug("Adding event to queue: ", event); if ("dispose".equals(event)) panel.sendEvent(AppletPanel.APPLET_DISPOSE); else if ("load".equals(event)) panel.sendEvent(AppletPanel.APPLET_LOAD); else if ("init".equals(event)) panel.sendEvent(AppletPanel.APPLET_INIT); else if ("start".equals(event)) panel.sendEvent(AppletPanel.APPLET_START); else if ("stop".equals(event)) panel.sendEvent(AppletPanel.APPLET_STOP); else if ("destroy".equals(event)) panel.sendEvent(AppletPanel.APPLET_DESTROY); else if ("quit".equals(event)) panel.sendEvent(AppletPanel.APPLET_QUIT); else if ("error".equals(event)) panel.sendEvent(AppletPanel.APPLET_ERROR); else // non-fatal error if we get an unrecognized event PluginDebug.debug("Unrecognized event name: ", event); } while (!panel.emptyEventQueue()) ; } } }icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginParameterParser.java0000644000000000000000000000013213441742745026607 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.237253481 30 ctime=1552410887.044183604 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginParameterParser.java0000644000175000002070000000562313441742745027425 0ustar00jvanekmock00000000000000package sun.applet; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import net.sourceforge.jnlp.PluginParameters; class PluginParameterParser { static private final char DELIMITER_ESCAPE = ':'; static private final String KEY_VALUE_DELIMITER = ";"; /** * Unescape characters passed from C++. * Specifically, "\n" -> new line, "\\" -> "\", "\:" -> ";" * * @param str The string to unescape * @return The unescaped string */ static String unescapeString(String str) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char chr = str.charAt(i); if (chr != '\\') { sb.append(chr); } else { i++; // Skip ahead one chr = str.charAt(i); if (chr == 'n') { sb.append('\n'); } else if (chr == '\\') { sb.append('\\'); } else if (chr == DELIMITER_ESCAPE) { sb.append(KEY_VALUE_DELIMITER); } } } return sb.toString(); } /** * Parse semi-colon delimited key-value pairs. * @param keyvalString the escaped, semicolon-delimited, string * @return a map of the keys to the values */ static Map parseEscapedKeyValuePairs(String keyvalString) { // Split on ';', ensuring empty strings at end are kept String[] strs = keyvalString.split(KEY_VALUE_DELIMITER, -1 /* Keep empty strings */); Map attributes = new HashMap(); /* Note that we will typically have one empty string at end */ for (int i = 0; i < strs.length - 1; i += 2) { String key = unescapeString(strs[i]).toLowerCase(); String value = unescapeString(strs[i + 1]); attributes.put(key, value); } return attributes; } static boolean isInt(String s) { try { Integer.parseInt(s); return true; } catch(NumberFormatException e) { return false; } } /** * Parsers parameters given a string containing * parameters in quotes. * * @param width default applet width * @param height default applet height * @param parameterString the parameters * @return the attributes in a hash table */ public PluginParameters parse(String width, String height, String parameterString) { Map params = parseEscapedKeyValuePairs(parameterString); if (params.get("width") == null || !isInt(params.get("width"))) { params.put("width", width); } if (params.get("height") == null || !isInt(params.get("height"))) { params.put("height", height); } return new PluginParameters(params); } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginCookieInfoRequest.java0000644000000000000000000000013213441742745027110 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java0000644000175000002070000000555013441742745027725 0ustar00jvanekmock00000000000000/* PluginCookieInfoRequest -- Object representing a request for cookie information from the browser Copyright (C) 2009 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; /** * This class represents a request object for cookie information for a given URI */ public class PluginCookieInfoRequest extends PluginCallRequest { String cookieString = new String(); public PluginCookieInfoRequest(String message, Long reference) { super(message, reference); } public void parseReturn(String cookieInfo) { // try to parse the proxy information. If things go wrong, do nothing .. // this will keep internal = null which forces a direct connection PluginDebug.debug("PluginCookieInfoRequest GOT: ", cookieInfo); // skip 'plugin' marker cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ') + 1); // skip 'PluginCookieInfo' tag cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ') + 1); // skip 'reference' tag cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ') + 1); // skip reference # and get the rest cookieString = cookieInfo.substring(cookieInfo.indexOf(' ') + 1); setDone(true); } public String getObject() { return this.cookieString; } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/GetWindowPluginCallRequest.java0000644000000000000000000000013213441742745027566 xustar0030 mtime=1552401893.052832796 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java0000644000175000002070000000461213441742745030401 0ustar00jvanekmock00000000000000/* GetWindowPluginCallRequest -- represent Java-to-JavaScript requests Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; public class GetWindowPluginCallRequest extends PluginCallRequest { // FIXME: look into int vs long JavaScript internal values. long internal; public GetWindowPluginCallRequest(String message, Long reference) { super(message, reference); } public void parseReturn(String message) { PluginDebug.debug("GetWindowParseReturn GOT: ", message); String[] args = message.split(" "); // FIXME: add thread ID to messages to support multiple // threads using the netscape.javascript package. internal = Long.parseLong(args[3]); setDone(true); } public Long getObject() { return this.internal; } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/RequestQueue.java0000644000000000000000000000013213441742745024770 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/RequestQueue.java0000644000175000002070000000473613441742745025612 0ustar00jvanekmock00000000000000/* VoidPluginCallRequest -- represent Java-to-JavaScript requests Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; public class RequestQueue { PluginCallRequest head = null; PluginCallRequest tail = null; private int size = 0; public void post(PluginCallRequest request) { PluginDebug.debug("Securitymanager=", System.getSecurityManager()); if (head == null) { head = tail = request; tail.setNext(null); } else { tail.setNext(request); tail = request; tail.setNext(null); } size++; } public PluginCallRequest pop() { if (head == null) return null; PluginCallRequest ret = head; head = head.getNext(); ret.setNext(null); size--; return ret; } public int size() { return size; } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginMain.java0000644000000000000000000000013213441742745024376 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginMain.java0000644000175000002070000002747113441742745025221 0ustar00jvanekmock00000000000000/* VoidPluginCallRequest -- represent Java-to-JavaScript requests Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /* * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package sun.applet; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Field; import java.net.Authenticator; import java.net.CookieHandler; import java.net.CookieManager; import java.net.ProxySelector; import java.net.URL; import java.net.URLStreamHandler; import java.util.Enumeration; import java.util.Map; import java.util.Properties; import javax.swing.JFrame; import net.sourceforge.jnlp.PluginBridge; import sun.awt.AppContext; import sun.awt.SunToolkit; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.JNLPAuthenticator; import net.sourceforge.jnlp.util.logging.JavaConsole; import net.sourceforge.jnlp.util.logging.OutputController; /** * The main entry point into PluginAppletViewer. */ public class PluginMain { // This is used in init(). Getting rid of this is desirable but depends // on whether the property that uses it is necessary/standard. private static final String theVersion = System.getProperty("java.version"); /* Install a handler directly using reflection. This ensures that java doesn't error-out * when javascript is used in a URL. We can then handle these URLs correctly in eg PluginAppletViewer.showDocument(). */ static private void installDummyJavascriptProtocolHandler() { try { Field handlersField = URL.class.getDeclaredField("handlers"); handlersField.setAccessible(true); //hashtable implements map @SuppressWarnings("unchecked") Map handlers = (Map)handlersField.get(null); // Place an arbitrary handler, we only need the URL construction to not error-out handlers.put("javascript", new sun.net.www.protocol.http.Handler()); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Unable to install 'javascript:' URL protocol handler!"); OutputController.getLogger().log(e); } } /** * The main entry point into AppletViewer. * @param args regular command-line arguments to be passed from native part * @throws java.io.IOException if IO issues occur */ public static void main(String args[]) throws IOException { //we are polite, we reprint start arguments OutputController.getLogger().log("startup arguments: "); for (int i = 0; i < args.length; i++) { String string = args[i]; OutputController.getLogger().log(i + ": "+string); } if (AppContext.getAppContext() == null) { SunToolkit.createNewAppContext(); } installDummyJavascriptProtocolHandler(); if (args.length < 2 || !(new File(args[0]).exists()) || !(new File(args[1]).exists())) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Invalid pipe names provided. Refusing to proceed."); JNLPRuntime.exit(1); } DeploymentConfiguration.move14AndOlderFilesTo15StructureCatched(); if (JavaConsole.isEnabled()) { if ((args.length < 3) || !new File(args[2]).exists()) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Warning, although console is on, plugin debug connection do not exists. No plugin information will be displayed in console (only java ones)."); } else { JavaConsole.getConsole().createPluginReader(new File(args[2])); } } try { PluginStreamHandler streamHandler = connect(args[0], args[1]); initSecurityContext(streamHandler); PluginAppletViewer.setStreamhandler(streamHandler); PluginAppletViewer.setPluginCallRequestFactory(new PluginCallRequestFactory()); init(); // Streams set. Start processing. streamHandler.startProcessing(); setCookieHandler(streamHandler); JavaConsole.getConsole().setClassLoaderInfoProvider(new JavaConsole.ClassLoaderInfoProvider() { @Override public Map getLoaderInfo() { return PluginAppletSecurityContext.getLoaderInfo(); } }); } catch (Exception e) { OutputController.getLogger().log(e); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Something very bad happened. I don't know what to do, so I am going to exit :("); JNLPRuntime.exit(1); } } public static void initSecurityContext(PluginStreamHandler streamHandler) { PluginAppletSecurityContext sc = new PluginAppletSecurityContext(0); sc.prePopulateLCClasses(); PluginAppletSecurityContext.setStreamhandler(streamHandler); AppletSecurityContextManager.addContext(0, sc); } private PluginMain() { // The PluginMain constructor should never, EVER, be called } private static PluginStreamHandler connect(String inPipe, String outPipe) { PluginStreamHandler streamHandler = null; try { streamHandler = new PluginStreamHandler(new FileInputStream(inPipe), new FileOutputStream(outPipe)); PluginDebug.debug("Streams initialized"); } catch (IOException ioe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,ioe); } return streamHandler; } private static void init() { Properties avProps = new Properties(); // ADD OTHER RANDOM PROPERTIES // XXX 5/18 need to revisit why these are here, is there some // standard for what is available? // Standard browser properties avProps.put("browser", "sun.applet.AppletViewer"); avProps.put("browser.version", "1.06"); avProps.put("browser.vendor", "Sun Microsystems Inc."); avProps.put("http.agent", "Java(tm) 2 SDK, Standard Edition v" + theVersion); // Define which packages can be extended by applets // XXX 5/19 probably not needed, not checked in AppletSecurity avProps.put("package.restrict.definition.java", "true"); avProps.put("package.restrict.definition.sun", "true"); // Define which properties can be read by applets. // A property named by "key" can be read only when its twin // property "key.applet" is true. The following ten properties // are open by default. Any other property can be explicitly // opened up by the browser user by calling appletviewer with // -J-Dkey.applet=true avProps.put("java.version.applet", "true"); avProps.put("java.vendor.applet", "true"); avProps.put("java.vendor.url.applet", "true"); avProps.put("java.class.version.applet", "true"); avProps.put("os.name.applet", "true"); avProps.put("os.version.applet", "true"); avProps.put("os.arch.applet", "true"); avProps.put("file.separator.applet", "true"); avProps.put("path.separator.applet", "true"); avProps.put("line.separator.applet", "true"); avProps.put("javaplugin.nodotversion", "160_17"); avProps.put("javaplugin.version", "1.6.0_17"); avProps.put("javaplugin.vm.options", ""); // Read in the System properties. If something is going to be // over-written, warn about it. Properties sysProps = System.getProperties(); for (Enumeration e = sysProps.propertyNames(); e.hasMoreElements();) { String key = (String) e.nextElement(); String val = sysProps.getProperty(key); avProps.setProperty(key, val); } // INSTALL THE PROPERTY LIST System.setProperties(avProps); // plug in a custom authenticator and proxy selector boolean installAuthenticator = Boolean.valueOf(JNLPRuntime.getConfiguration() .getProperty(DeploymentConfiguration.KEY_SECURITY_INSTALL_AUTHENTICATOR)); if (installAuthenticator) { Authenticator.setDefault(new JNLPAuthenticator()); } // override the proxy selector set by JNLPRuntime ProxySelector.setDefault(new PluginProxySelector(JNLPRuntime.getConfiguration())); } private static void setCookieHandler(PluginStreamHandler streamHandler) { CookieManager ckManager = new PluginCookieManager(streamHandler); CookieHandler.setDefault(ckManager); } public static JFrame javawsHtmlMain(PluginBridge pb, URL html) { PluginAppletViewer.setStreamhandler(PluginStreamHandler.DummyHandler); PluginMain.initSecurityContext(PluginStreamHandler.DummyHandler); AppletPanel p = PluginAppletViewer.initialize(pb.getParams(), 0, html, 0, pb); JFrame f = new JFrame(); f.setSize(p.getAppletWidth(), p.getAppletHeight()); f.add(p); return f; } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginAppletViewer.java0000644000000000000000000000013213441742745026121 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java0000644000175000002070000017214313441742745026741 0ustar00jvanekmock00000000000000/* PluginAppletViewer -- Handles embedding of the applet panel Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /* * Copyright 1995-2004 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package sun.applet; import com.sun.jndi.toolkit.url.UrlUtil; import java.applet.Applet; import java.applet.AppletContext; import java.applet.AudioClip; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.Insets; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.SocketPermission; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.security.AccessController; import java.security.AllPermission; import java.security.PrivilegedAction; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import javax.swing.SwingUtilities; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.NetxPanel; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.PluginParameters; import net.sourceforge.jnlp.runtime.JNLPClassLoader; import net.sourceforge.jnlp.runtime.JNLPRuntime; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.security.ConnectionFactory; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletStartupSecuritySettings; import net.sourceforge.jnlp.splashscreen.SplashController; import net.sourceforge.jnlp.splashscreen.SplashPanel; import net.sourceforge.jnlp.splashscreen.SplashUtils; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; import sun.awt.AppContext; import sun.awt.SunToolkit; import sun.awt.X11.XEmbeddedFrame; /* * Waring! Warious EmbeddedFrames are sedded during windows builds! */ // FIXME: declare JSProxy implementation @SuppressWarnings("serial") public class PluginAppletViewer extends XEmbeddedFrame implements AppletContext, Printable, SplashController { /** * Enumerates the current status of an applet * * PRE_INIT -> Parsing and initialization phase * INIT_COMPLETE -> Initialization complete, reframe pending * REFRAME_COMPLETE -> Reframe complete, applet is initialized and usable by the user * INACTIVE -> Browser has directed that the applet be destroyed (this state is non-overridable except by DESTROYED) * DESTROYED -> Applet has been destroyed */ private static enum PAV_INIT_STATUS { PRE_INIT, INIT_COMPLETE, REFRAME_COMPLETE, INACTIVE, DESTROYED }; /** * The panel in which the applet is being displayed. */ private NetxPanel panel; static final ReentrantLock panelLock = new ReentrantLock(); // CONDITION PREDICATE: panel.isAlive() static final Condition panelLive = panelLock.newCondition(); private int identifier; // Instance identifier -> PluginAppletViewer object. private static final ConcurrentMap applets = new ConcurrentHashMap<>(); private static final ReentrantLock appletsLock = new ReentrantLock(); // CONDITION PREDICATE: !applets.containsKey(identifier) private static final Condition appletAdded = appletsLock.newCondition(); private static PluginStreamHandler streamhandler; private static PluginCallRequestFactory requestFactory; private static final ConcurrentMap status = new ConcurrentHashMap<>(); private static final ReentrantLock statusLock = new ReentrantLock(); // CONDITION PREDICATE: !status.get(identifier).equals(PAV_INIT_STATUS.INIT_COMPLETE) private static final Condition initComplete = statusLock.newCondition(); private WindowListener windowEventListener = null; private AppletEventListener appletEventListener = null; public static final long APPLET_TIMEOUT = 180000000000L; // 180s in ns private static final Object requestMutex = new Object(); private static long requestIdentityCounter = 0L; private Image bufFrameImg; private Graphics bufFrameImgGraphics; private SplashPanel splashPanel; private static long REQUEST_TIMEOUT=60000;//60s private static void waitForRequestCompletion(PluginCallRequest request) { try { if (!request.isDone()) { request.wait(REQUEST_TIMEOUT); } if (!request.isDone()) { // Do not wait indefinitely to avoid the potential of deadlock throw new RuntimeException("Possible deadlock, releasing"); } } catch (InterruptedException ex) { throw new RuntimeException("Interrupted waiting for call request.", ex); } } /** * Null constructor to allow instantiation via newInstance() */ public PluginAppletViewer() { } public static PluginAppletViewer framePanel(int identifier, long handle, int width, int height, NetxPanel panel) { PluginDebug.debug("Framing ", panel); // SecurityManager MUST be set, and only privileged code may call framePanel() System.getSecurityManager().checkPermission(new AllPermission()); PluginAppletViewer appletFrame = new PluginAppletViewer(handle, identifier, panel); appletFrame.setSize(width, height); appletFrame.appletEventListener = new AppletEventListener(appletFrame, appletFrame); panel.addAppletListener(appletFrame.appletEventListener); // Clear references, if any if (applets.containsKey(identifier)) { PluginAppletViewer oldFrame = applets.get(identifier); oldFrame.remove(panel); panel.removeAppletListener(oldFrame.appletEventListener); } appletsLock.lock(); try { applets.put(identifier, appletFrame); appletAdded.signalAll(); } finally { appletsLock.unlock(); } PluginDebug.debug(panel, " framed"); return appletFrame; } /** * Create new plugin appletviewer frame */ private PluginAppletViewer(long handle, final int identifier, NetxPanel appletPanel) { super(handle, true); this.identifier = identifier; this.panel = appletPanel; synchronized(appletPanels) { if (!appletPanels.contains(panel)) appletPanels.addElement(panel); } windowEventListener = new WindowAdapter() { @Override public void windowClosing(WindowEvent evt) { destroyApplet(identifier); } @Override public void windowIconified(WindowEvent evt) { appletStop(); } @Override public void windowDeiconified(WindowEvent evt) { appletStart(); } }; addWindowListener(windowEventListener); final AppletPanel fPanel = panel; try { SwingUtilities.invokeAndWait(new SplashCreator(fPanel)); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); // Not much we can do other than print } } @Override public void replaceSplash(final SplashPanel newSplash) { if (splashPanel == null) { return; } if (newSplash == null) { removeSplash(); return; } try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { splashPanel.getSplashComponent().setVisible(false); splashPanel.stopAnimation(); remove(splashPanel.getSplashComponent()); newSplash.setPercentage(splashPanel.getPercentage()); newSplash.setSplashWidth(splashPanel.getSplashWidth()); newSplash.setSplashHeight(splashPanel.getSplashHeight()); newSplash.adjustForSize(); splashPanel = newSplash; add("Center", splashPanel.getSplashComponent()); pack(); } }); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); // Not much we can do other than print } } @Override public void removeSplash() { if (splashPanel == null) { return; } try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { splashPanel.getSplashComponent().setVisible(false); splashPanel.stopAnimation(); removeAll(); setLayout(new BorderLayout()); //remove(splashPanel.getSplashComponent()); splashPanel = null; //remove(panel); // Re-add the applet to notify container add(panel); panel.setVisible(true); pack(); } }); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); // Not much we can do other than print } } @Override public int getSplashWidth() { if (splashPanel != null) { return splashPanel.getSplashWidth(); } else { return -1; } } @Override public int getSplashHeigth() { if (splashPanel != null) { return splashPanel.getSplashHeight(); } else { return -1; } } private static class AppletEventListener implements AppletListener { final Frame frame; final PluginAppletViewer appletViewer; public AppletEventListener(Frame frame, PluginAppletViewer appletViewer) { this.frame = frame; this.appletViewer = appletViewer; } @Override public void appletStateChanged(AppletEvent evt) { AppletPanel src = (AppletPanel) evt.getSource(); panelLock.lock(); try { panelLive.signalAll(); } finally { panelLock.unlock(); } switch (evt.getID()) { case AppletPanel.APPLET_RESIZE: { if (src != null) { appletViewer.setSize(appletViewer.getPreferredSize()); appletViewer.validate(); } break; } case AppletPanel.APPLET_LOADING_COMPLETED: { Applet a = src.getApplet(); // sun.applet.AppletPanel // Fixed #4754451: Applet can have methods running on main // thread event queue. // // The cause of this bug is that the frame of the applet // is created in main thread group. Thus, when certain // AWT/Swing events are generated, the events will be // dispatched through the wrong event dispatch thread. // // To fix this, we rearrange the AppContext with the frame, // so the proper event queue will be looked up. // // Swing also maintains a Frame list for the AppContext, // so we will have to rearrange it as well. // if (a != null) { AppletPanel.changeFrameAppContext(frame, SunToolkit.targetToAppContext(a)); } else { AppletPanel.changeFrameAppContext(frame, AppContext.getAppContext()); } updateStatus(appletViewer.identifier, PAV_INIT_STATUS.INIT_COMPLETE); break; } case AppletPanel.APPLET_START: { if (src.status != AppletPanel.APPLET_INIT && src.status != AppletPanel.APPLET_STOP) { String s="Applet started, but but reached invalid state"; PluginDebug.debug(s); SplashPanel sp=SplashUtils.getErrorSplashScreen(appletViewer.panel.getWidth(), appletViewer.panel.getHeight(), new Exception(s)); appletViewer.replaceSplash(sp); } break; } case AppletPanel.APPLET_ERROR: { String s="Undefined error causing applet not to staart appeared"; PluginDebug.debug(s); SplashPanel sp=SplashUtils.getErrorSplashScreen(appletViewer.panel.getWidth(), appletViewer.panel.getHeight(), new Exception(s)); appletViewer.replaceSplash(sp); break; } } } } public static void setStreamhandler(PluginStreamHandler sh) { streamhandler = sh; } public static void setPluginCallRequestFactory(PluginCallRequestFactory rf) { requestFactory = rf; } private static void handleInitializationMessage(int identifier, String message) throws IOException, LaunchException { /* The user has specified via a global setting that applets should not be run.*/ if (AppletStartupSecuritySettings.getInstance().getSecurityLevel() == AppletSecurityLevel.DENY_ALL) { throw new LaunchException(null, null, R("LSFatal"), R("LCClient"), R("LUnsignedApplet"), R("LUnsignedAppletPolicyDenied")); } // If there is a key for this status, it means it // was either initialized before, or destroy has been // processed. Stop moving further. if (updateStatus(identifier, PAV_INIT_STATUS.PRE_INIT) != null) { return; } // Extract the information from the message String[] msgParts = new String[4]; for (int i = 0; i < 3; i++) { int spaceLocation = message.indexOf(' '); int nextSpaceLocation = message.indexOf(' ', spaceLocation + 1); msgParts[i] = message.substring(spaceLocation + 1, nextSpaceLocation); message = message.substring(nextSpaceLocation + 1); } long handle = Long.parseLong(msgParts[0]); String width = msgParts[1]; String height = msgParts[2]; int spaceLocation = message.indexOf(' ', "tag".length() + 1); String documentBase = message.substring("tag".length() + 1, spaceLocation); String paramString = message.substring(spaceLocation + 1); PluginDebug.debug("Handle = ", handle, "\n", "Width = ", width, "\n", "Height = ", height, "\n", "DocumentBase = ", documentBase, "\n", "Params = ", paramString); JNLPRuntime.saveHistory(documentBase); AppletMessageHandler amh = new AppletMessageHandler("appletviewer"); URL url = new URL(documentBase); URLConnection conn = ConnectionFactory.getConnectionFactory().openConnection(url); /* The original URL may have been redirected - this * sets it to whatever URL/codebase we ended up getting */ url = conn.getURL(); ConnectionFactory.getConnectionFactory().disconnect(conn); PluginParameters params = new PluginParameterParser().parse(width, height, paramString); // Let user know we are starting up streamhandler.write("instance " + identifier + " status " + amh.getMessage("status.start")); initialize(params, handle, url, identifier, null); } public static AppletPanel initialize(PluginParameters params, long handle, URL url, int identifier, PluginBridge pb) { PluginAppletPanelFactory factory = new PluginAppletPanelFactory(); AppletPanel p = factory.createPanel(streamhandler, identifier, handle, url, params, pb); long maxTimeToSleep = APPLET_TIMEOUT; appletsLock.lock(); try { while (!applets.containsKey(identifier) && maxTimeToSleep > 0) { // Map is populated only by reFrame maxTimeToSleep -= waitTillTimeout(appletsLock, appletAdded, maxTimeToSleep); } } finally { appletsLock.unlock(); } // If wait exceeded maxWait, we timed out. Throw an exception if (maxTimeToSleep <= 0) { // Caught in handleMessage throw new RuntimeException("Applet initialization timeout"); } // We should not try to destroy an applet during // initialization. It may cause an inconsistent state, // which would bad if it's a trusted applet that // read/writes to files waitForAppletInit(applets.get(identifier).panel); // Should we proceed with reframing? PluginDebug.debug("Init complete"); if (updateStatus(identifier, PAV_INIT_STATUS.REFRAME_COMPLETE).equals(PAV_INIT_STATUS.INACTIVE)) { destroyApplet(identifier); return null; } return p; } /** * Handle an incoming message from the plugin. * @param identifier id of plugin * @param reference reference id of message * @param message text itself */ public static void handleMessage(int identifier, int reference, String message) { PluginDebug.debug("PAV handling: ", message); try { if (message.startsWith("handle")) { handleInitializationMessage(identifier, message); } else if (message.startsWith("destroy")) { // Set it inactive, and try to do cleanup is applicable PAV_INIT_STATUS previousStatus = updateStatus(identifier, PAV_INIT_STATUS.INACTIVE); PluginDebug.debug("Destroy status set for ", identifier); if (previousStatus != null && previousStatus.equals(PAV_INIT_STATUS.REFRAME_COMPLETE)) { destroyApplet(identifier); } } else { PluginDebug.debug("Handling message: ", message, " instance ", identifier, " ", Thread.currentThread()); // Wait till initialization finishes while (!applets.containsKey(identifier) && ( !status.containsKey(identifier) || status.get(identifier).equals(PAV_INIT_STATUS.PRE_INIT) )) ; // don't bother processing further for inactive applets if (status.get(identifier).equals(PAV_INIT_STATUS.INACTIVE)) { return; } applets.get(identifier).handleMessage(reference, message); } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); // If an exception happened during pre-init, we need to update status updateStatus(identifier, PAV_INIT_STATUS.INACTIVE); throw new RuntimeException("Failed to handle message: " + message + " for instance " + identifier, e); } } /** * Sets the status unless an overriding status is set (e.g. if * status is DESTROYED, it may not be overridden). * * @param identifier The identifier for which the status is to be set * @param status The status to switch to * @return The previous status */ private static synchronized PAV_INIT_STATUS updateStatus(int identifier, PAV_INIT_STATUS newStatus) { PAV_INIT_STATUS prev = status.get(identifier); // If the status is set if (status.containsKey(identifier)) { // Nothing may override destroyed status if (status.get(identifier).equals(PAV_INIT_STATUS.DESTROYED)) { return prev; } // If status is inactive, only DESTROYED may override it if (status.get(identifier).equals(PAV_INIT_STATUS.INACTIVE)) { if (!newStatus.equals(PAV_INIT_STATUS.DESTROYED)) { return prev; } } } statusLock.lock(); try { status.put(identifier, newStatus); initComplete.signalAll(); } finally { statusLock.unlock(); } return prev; } /** * Destroys the given applet instance. * * This function may be called multiple times without problems. * It does a synchronized check on the status and will only * attempt to destroy the applet if not previously destroyed. * * @param identifier The instance which is to be destroyed */ private static synchronized void destroyApplet(int identifier) { // We should not try to destroy an applet during // initialization. It may cause an inconsistent state. waitForAppletInit( applets.get(identifier).panel ); PluginDebug.debug("DestroyApplet called for ", identifier); PAV_INIT_STATUS prev = updateStatus(identifier, PAV_INIT_STATUS.DESTROYED); // If already destroyed, return if (prev.equals(PAV_INIT_STATUS.DESTROYED)) { PluginDebug.debug(identifier, " already destroyed. Returning."); return; } PluginDebug.debug("Attempting to destroy frame ", identifier); // Try to dispose the panel right away final PluginAppletViewer pav = applets.get(identifier); if (pav != null) { pav.dispose(); // If panel is already disposed, return if (pav.panel.getApplet() == null) { PluginDebug.debug(identifier, " panel inactive. Returning."); return; } PluginDebug.debug("Attempting to destroy panel ", identifier); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { pav.appletClose(); } }); } PluginDebug.debug(identifier, " destroyed"); } /** * Function to block until applet initialization is complete. * * This function will return if the wait is longer than {@link #APPLET_TIMEOUT} * * @param panel the instance to wait for. */ public static void waitForAppletInit(NetxPanel panel) { PluginDebug.debug("Waiting for applet init"); // Wait till initialization finishes long maxTimeToSleep = APPLET_TIMEOUT; panelLock.lock(); try { while (!panel.isInitialized() && maxTimeToSleep > 0) { PluginDebug.debug("Waiting for applet panel ", panel, " to initialize..."); maxTimeToSleep -= waitTillTimeout(panelLock, panelLive, maxTimeToSleep); } } finally { panelLock.unlock(); } PluginDebug.debug("Applet panel ", panel, " initialized"); } /* Resizes an applet panel, waiting for the applet to initialze. * Should be done asynchronously to avoid the chance of deadlock. */ private void resizeAppletPanel(final int width, final int height) { // Wait for panel to come alive waitForAppletInit(panel); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { panel.updateSizeInAtts(height, width); setSize(width, height); // There is a rather odd drawing bug whereby resizing // the panel makes no difference on initial call // because the panel thinks that it is already the // right size. Validation has no effect there either. // So we work around by setting size to 1, validating, // and then setting to the right size and validating // again. This is not very efficient, and there is // probably a better way -- but resizing happens // quite infrequently, so for now this is how we do it panel.setSize(1, 1); panel.validate(); panel.setSize(width, height); panel.validate(); if (panel.getApplet() != null) { panel.getApplet().resize(width, height); panel.getApplet().validate(); } } }); } public void handleMessage(int reference, String message) { if (message.startsWith("width")) { // 0 => width, 1=> width_value, 2 => height, 3=> height_value String[] dimMsg = message.split(" "); final int width = Integer.parseInt(dimMsg[1]); final int height = Integer.parseInt(dimMsg[3]); /* Resize the applet asynchronously, to avoid the chance of * deadlock while waiting for the applet to initialize. * * In general, worker threads should spawn new threads for any blocking operations. */ Thread resizeAppletThread = new Thread("resizeAppletThread") { @Override public void run() { resizeAppletPanel(width, height); } }; /* Let it eventually complete */ resizeAppletThread.start(); } else if (message.startsWith("GetJavaObject")) { // FIXME: how do we determine what security context this // object should belong to? Object o; // Wait for the panel to initialize // (happens in a separate thread) waitForAppletInit(panel); PluginDebug.debug(panel, " -- ", panel.getApplet(), " -- initialized: ", panel.isInitialized()); // Still null? if (panel.getApplet() == null) { streamhandler.write("instance " + identifier + " reference " + -1 + " fatalError: " + "Initialization failed"); streamhandler.write("context 0 reference " + reference + " Error"); return; } o = panel.getApplet(); PluginDebug.debug("Looking for object ", o, " panel is ", panel); AppletSecurityContextManager.getSecurityContext(0).store(o); PluginDebug.debug("WRITING 1: ", "context 0 reference ", reference, " GetJavaObject " , AppletSecurityContextManager.getSecurityContext(0).getIdentifier(o)); streamhandler.write("context 0 reference " + reference + " GetJavaObject " + AppletSecurityContextManager.getSecurityContext(0).getIdentifier(o)); PluginDebug.debug("WRITING 1 DONE"); } } /* * Methods for java.applet.AppletContext */ final private static Map audioClips = new HashMap<>(); /** * Get an audio clip. */ @Override public AudioClip getAudioClip(URL url) { checkConnect(url); synchronized (audioClips) { AudioClip clip = audioClips.get(url); if (clip == null) { audioClips.put(url, clip = new AppletAudioClip(url)); } return clip; } } final private static Map imageRefs = new HashMap<>(); /** * Get an image. */ @Override public Image getImage(URL url) { return getCachedImage(url); } private Image getCachedImage(URL url) { return (Image) getCachedImageRef(url).get(); } /** * Get an image ref. */ private synchronized AppletImageRef getCachedImageRef(URL url) { PluginDebug.debug("getCachedImageRef() searching for ", url); try { String originalURL = url.toString(); String codeBase = panel.getCodeBase().toString(); if (originalURL.startsWith(codeBase)) { PluginDebug.debug("getCachedImageRef() got URL = ", url); PluginDebug.debug("getCachedImageRef() plugin codebase = ", codeBase); String resourceName = originalURL.substring(codeBase.length()); if (panel.getAppletClassLoader() instanceof JNLPClassLoader) { JNLPClassLoader loader = (JNLPClassLoader) panel.getAppletClassLoader(); URL localURL = null; if (loader.resourceAvailableLocally(resourceName)) { url = loader.getResource(resourceName); } url = localURL != null ? localURL : url; } } PluginDebug.debug("getCachedImageRef() getting img from URL = ", url); synchronized (imageRefs) { AppletImageRef ref = imageRefs.get(url); if (ref == null) { ref = new AppletImageRef(url); imageRefs.put(url, ref); } return ref; } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Error occurred when trying to fetch image:"); OutputController.getLogger().log(e); return null; } } /** * Flush the image cache. */ static void flushImageCache() { imageRefs.clear(); } final private static Vector appletPanels = new Vector<>(); /** * Get an applet by name. */ @Override public Applet getApplet(String name) { name = name.toLowerCase(); SocketPermission panelSp = new SocketPermission(UrlUtils.getHostAndPort(panel.getCodeBase()), "connect"); synchronized(appletPanels) { for (Enumeration e = appletPanels.elements(); e.hasMoreElements();) { AppletPanel p = e.nextElement(); String param = p.getParameter("name"); if (param != null) { param = param.toLowerCase(); } if (name.equals(param) && p.getDocumentBase().equals(panel.getDocumentBase())) { SocketPermission sp = new SocketPermission(UrlUtils.getHostAndPort(p.getCodeBase()), "connect"); if (panelSp.implies(sp)) { return p.applet; } } } } return null; } /** * Return an enumeration of all the accessible * applets on this page. */ @Override public Enumeration getApplets() { Vector v = new Vector(); SocketPermission panelSp = new SocketPermission(UrlUtils.getHostAndPort(panel.getCodeBase()), "connect"); synchronized(appletPanels) { for (Enumeration e = appletPanels.elements(); e.hasMoreElements();) { AppletPanel p = e.nextElement(); if (p.getDocumentBase().equals(panel.getDocumentBase())) { SocketPermission sp = new SocketPermission(UrlUtils.getHostAndPort(p.getCodeBase()), "connect"); if (panelSp.implies(sp)) { v.addElement(p.applet); } } } } return v.elements(); } @Override public void showDocument(URL url) { PluginDebug.debug("Showing document..."); showDocument(url, "_self"); } @Override public void showDocument(URL url, String target) { // If it is a javascript document, eval on current page. if ("javascript".equals(url.getProtocol())) { // Snip protocol off string String evalString = url.toString().substring("javascript:".length()); eval(getWindow(), evalString); return; } try { Long reference = getRequestIdentifier(); write("reference " + reference + " LoadURL " + UrlUtil.encode(url.toString(), "UTF-8") + " " + target); } catch (IOException exception) { // Deliberately ignore IOException. showDocument may be // called from threads other than the main thread after // streamhandler.pluginOutputStream has been closed. } } /** * Show status. */ @Override public void showStatus(String status) { try { // FIXME: change to postCallRequest // For statuses, we cannot have a newline status = status.replace("\n", " "); write("status " + status); } catch (IOException exception) { // Deliberately ignore IOException. showStatus may be // called from threads other than the main thread after // streamhandler.pluginOutputStream has been closed. } } /** * Returns an incremental number (unique identifier) for a message. * If identifier hits Long.MAX_VALUE it loops back starting at 0. * * @return A unique Long identifier for the request */ private static long getRequestIdentifier() { synchronized(requestMutex) { if (requestIdentityCounter == Long.MAX_VALUE) { requestIdentityCounter = 0L; } return requestIdentityCounter++; } } public long getWindow() { PluginDebug.debug("STARTING getWindow"); Long reference = getRequestIdentifier(); PluginCallRequest request = requestFactory.getPluginCallRequest("window", "instance " + identifier + " reference " + +reference + " " + "GetWindow", reference); PluginDebug.debug("STARTING postCallRequest"); streamhandler.postCallRequest(request); PluginDebug.debug("STARTING postCallRequest done"); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait request 1"); synchronized (request) { PluginDebug.debug("wait request 2"); while ((Long) request.getObject() == 0) request.wait(); PluginDebug.debug("wait request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug("STARTING getWindow DONE"); return (Long) request.getObject(); } // FIXME: make private, access via reflection. public static Object getMember(long internal, String name) { AppletSecurityContextManager.getSecurityContext(0).store(name); int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name); Long reference = getRequestIdentifier(); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("member", "instance " + 0 + " reference " + reference + " GetMember " + internal + " " + nameID, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait getMEM request 1"); synchronized (request) { PluginDebug.debug("wait getMEM request 2"); while (request.isDone() == false) request.wait(); PluginDebug.debug("wait getMEM request 3 GOT: ", request.getObject().getClass()); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug(" getMember DONE"); return request.getObject(); } public static void setMember(long internal, String name, Object value) { PluginDebug.debug("Setting to class " + value.getClass() + ":" + value.getClass().isPrimitive()); PluginAppletSecurityContext securityContext = AppletSecurityContextManager.getSecurityContext(0); securityContext.store(name); int nameID = securityContext.getIdentifier(name); Long reference = getRequestIdentifier(); // work on a copy of value, as we don't want to be manipulating // complex objects String objIDStr = securityContext.toObjectIDString(value, value.getClass(), true /* unbox primitives */); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("void", "instance " + 0 + " reference " + reference + " SetMember " + internal + " " + nameID + " " + objIDStr, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait setMem request: ", request.getMessage()); PluginDebug.debug("wait setMem request 1"); synchronized (request) { PluginDebug.debug("wait setMem request 2"); while (request.isDone() == false) request.wait(); PluginDebug.debug("wait setMem request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug(" setMember DONE"); } // FIXME: handle long index as well. public static void setSlot(long internal, int index, Object value) { PluginAppletSecurityContext securityContext = AppletSecurityContextManager.getSecurityContext(0); securityContext.store(value); Long reference = getRequestIdentifier(); String objIDStr = securityContext.toObjectIDString(value, value.getClass(), true /* unbox primitives */); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("void", "instance " + 0 + " reference " + reference + " SetSlot " + internal + " " + index + " " + objIDStr, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait setSlot request 1"); synchronized (request) { PluginDebug.debug("wait setSlot request 2"); while (request.isDone() == false) request.wait(); PluginDebug.debug("wait setSlot request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug(" setSlot DONE"); } public static Object getSlot(long internal, int index) { Long reference = getRequestIdentifier(); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("member", "instance " + 0 + " reference " + reference + " GetSlot " + internal + " " + index, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait getSlot request 1"); synchronized (request) { PluginDebug.debug("wait getSlot request 2"); while (request.isDone() == false) request.wait(); PluginDebug.debug("wait getSlot request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug(" getSlot DONE"); return request.getObject(); } public static Object eval(long internal, String s) { AppletSecurityContextManager.getSecurityContext(0).store(s); int stringID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(s); Long reference = getRequestIdentifier(); // Prefix with dummy instance for convenience. // FIXME: rename GetMemberPluginCallRequest ObjectPluginCallRequest. PluginCallRequest request = requestFactory.getPluginCallRequest("member", "instance " + 0 + " reference " + reference + " Eval " + internal + " " + stringID, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait eval request 1"); synchronized (request) { PluginDebug.debug("wait eval request 2"); while (request.isDone() == false) { request.wait(); } PluginDebug.debug("wait eval request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug(" getSlot DONE"); return request.getObject(); } public static void removeMember(long internal, String name) { AppletSecurityContextManager.getSecurityContext(0).store(name); int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name); Long reference = getRequestIdentifier(); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("void", "instance " + 0 + " reference " + reference + " RemoveMember " + internal + " " + nameID, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait removeMember request 1"); synchronized (request) { PluginDebug.debug("wait removeMember request 2"); while (request.isDone() == false) request.wait(); PluginDebug.debug("wait removeMember request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug(" RemoveMember DONE"); } public static Object call(long internal, String name, Object args[]) { // FIXME: when is this removed from the object store? // FIXME: reference should return the ID. // FIXME: convenience method for this long line. AppletSecurityContextManager.getSecurityContext(0).store(name); int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name); Long reference = getRequestIdentifier(); String argIDs = ""; for (Object arg : args) { AppletSecurityContextManager.getSecurityContext(0).store(arg); argIDs += AppletSecurityContextManager.getSecurityContext(0).getIdentifier(arg) + " "; } argIDs = argIDs.trim(); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("member", "instance " + 0 + " reference " + reference + " Call " + internal + " " + nameID + " " + argIDs, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait call request 1"); synchronized (request) { PluginDebug.debug("wait call request 2"); while (request.isDone() == false) { request.wait(); } PluginDebug.debug("wait call request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug(" Call DONE"); return request.getObject(); } public static Object requestPluginCookieInfo(URI uri) { PluginCallRequest request; Long reference = getRequestIdentifier(); try { String encodedURI = UrlUtil.encode(uri.toString(), "UTF-8"); request = requestFactory.getPluginCallRequest("cookieinfo", "plugin PluginCookieInfo " + "reference " + reference + " " + encodedURI, reference); } catch (UnsupportedEncodingException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); return null; } PluginMessageConsumer.registerPriorityWait(reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait cookieinfo request 1"); synchronized (request) { PluginDebug.debug("wait cookieinfo request 2"); while (request.isDone() == false) { request.wait(); } PluginDebug.debug("wait cookieinfo request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for cookieinfo request.", e); } PluginDebug.debug(" Cookieinfo DONE"); return request.getObject(); } /** * Obtain information about the proxy from the browser. * * @param uri a String in url-encoded form * @return a {@link URI} that indicates a proxy. */ public static Object requestPluginProxyInfo(String uri) { Long reference = getRequestIdentifier(); PluginCallRequest request = requestFactory.getPluginCallRequest("proxyinfo", "plugin PluginProxyInfo reference " + reference + " " + uri, reference); PluginMessageConsumer.registerPriorityWait(reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait call request 1"); synchronized (request) { PluginDebug.debug("wait call request 2"); while (request.isDone() == false) { request.wait(); } PluginDebug.debug("wait call request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug(" Call DONE"); return request.getObject(); } public static void JavaScriptFinalize(long internal) { Long reference = getRequestIdentifier(); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("void", "instance " + 0 + " reference " + reference + " Finalize " + internal, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); try { PluginDebug.debug("wait finalize request 1"); synchronized (request) { PluginDebug.debug("wait finalize request 2"); while (request.isDone() == false) { request.wait(); } PluginDebug.debug("wait finalize request 3"); } } catch (InterruptedException e) { throw new RuntimeException("Interrupted waiting for call request.", e); } PluginDebug.debug(" finalize DONE"); } public static String javascriptToString(long internal) { Long reference = getRequestIdentifier(); // Prefix with dummy instance for convenience. PluginCallRequest request = requestFactory.getPluginCallRequest("member", "instance " + 0 + " reference " + reference + " ToString " + internal, reference); streamhandler.postCallRequest(request); streamhandler.write(request.getMessage()); PluginDebug.debug("wait ToString request 1"); synchronized (request) { PluginDebug.debug("wait ToString request 2"); waitForRequestCompletion(request); PluginDebug.debug("wait ToString request 3"); } PluginDebug.debug(" ToString DONE"); return (String) request.getObject(); } // FIXME: make this private and access it from JSObject using // reflection. private void write(String message) throws IOException { PluginDebug.debug("WRITING 2: ", "instance ", identifier, " " + message); streamhandler.write("instance " + identifier + " " + message); PluginDebug.debug("WRITING 2 DONE"); } @Override public void setStream(String key, InputStream stream) throws IOException { // We do nothing. } @Override public InputStream getStream(String key) { // We do nothing. return null; } @Override public Iterator getStreamKeys() { // We do nothing. return null; } /** * System parameters. */ private final static Map systemParam = new HashMap<>(); static { systemParam.put("codebase", "codebase"); systemParam.put("code", "code"); systemParam.put("alt", "alt"); systemParam.put("width", "width"); systemParam.put("height", "height"); systemParam.put("align", "align"); systemParam.put("vspace", "vspace"); systemParam.put("hspace", "hspace"); } /** * Make sure the atrributes are uptodate. */ public void updateAtts() { Dimension d = panel.getSize(); Insets in = panel.getInsets(); int width = d.width - (in.left + in.right); int height = d.height - (in.top + in.bottom); panel.updateSizeInAtts(height, width); } /** * Restart the applet. */ void appletRestart() { panel.sendEvent(AppletPanel.APPLET_STOP); panel.sendEvent(AppletPanel.APPLET_DESTROY); panel.sendEvent(AppletPanel.APPLET_INIT); panel.sendEvent(AppletPanel.APPLET_START); } /** * Reload the applet. */ void appletReload() { panel.sendEvent(AppletPanel.APPLET_STOP); panel.sendEvent(AppletPanel.APPLET_DESTROY); panel.sendEvent(AppletPanel.APPLET_DISPOSE); /** * Fixed #4501142: Classloader sharing policy doesn't * take "archive" into account. This will be overridden * by Java Plug-in. [stanleyh] */ AppletPanel.flushClassLoader(panel.getClassLoaderCacheKey()); /* * Make sure we don't have two threads running through the event queue * at the same time. */ try { ((AppletViewerPanelAccess)panel).joinAppletThread(); ((AppletViewerPanelAccess)panel).release(); } catch (InterruptedException e) { return; // abort the reload } AccessController.doPrivileged(new PrivilegedAction() { @Override public Void run() { ((AppletViewerPanelAccess)panel).createAppletThread(); return null; } }); panel.sendEvent(AppletPanel.APPLET_LOAD); panel.sendEvent(AppletPanel.APPLET_INIT); panel.sendEvent(AppletPanel.APPLET_START); } @Override public int print(Graphics graphics, PageFormat pf, int pageIndex) { return Printable.NO_SUCH_PAGE; } /** * Start the applet. */ void appletStart() { panel.sendEvent(AppletPanel.APPLET_START); } /** * Stop the applet. */ void appletStop() { panel.sendEvent(AppletPanel.APPLET_STOP); } /** * Shutdown a viewer. * Stop, Destroy, Dispose and Quit a viewer */ private void appletShutdown(AppletPanel p) { p.sendEvent(AppletPanel.APPLET_STOP); p.sendEvent(AppletPanel.APPLET_DESTROY); p.sendEvent(AppletPanel.APPLET_DISPOSE); p.sendEvent(AppletPanel.APPLET_QUIT); } /** * Close this viewer. * Stop, Destroy, Dispose and Quit an AppletView, then * reclaim resources and exit the program if this is * the last applet. */ void appletClose() { // The caller thread is event dispatch thread, so // spawn a new thread to avoid blocking the event queue // when calling appletShutdown. // final AppletPanel p = panel; new Thread(new Runnable() { @SuppressWarnings("deprecation") @Override public void run() { ClassLoader cl = p.applet.getClass().getClassLoader(); // Since we want to deal with JNLPClassLoader, extract it if this // is a codebase loader if (cl instanceof JNLPClassLoader.CodeBaseClassLoader) { cl = ((JNLPClassLoader.CodeBaseClassLoader) cl).getParentJNLPClassLoader(); } appletShutdown(p); appletPanels.removeElement(p); // Mark classloader unusable if (cl instanceof JNLPClassLoader) { ((JNLPClassLoader) cl).decrementLoaderUseCount(); } try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { dispose(); } }); } catch (Exception e) { // ignore, we are just disposing it } if (countApplets() == 0) { appletSystemExit(); } updateStatus(identifier, PAV_INIT_STATUS.DESTROYED); } }).start(); } /** * Exit the program. * Exit from the program (if not stand alone) - do no clean-up */ private void appletSystemExit() { // Do nothing. Exit is handled by another // block of code, called when _all_ applets are gone } /** * How many applets are running? * @return number of applets run in this JVM */ public static int countApplets() { return appletPanels.size(); } private static void checkConnect(URL url) { SecurityManager security = System.getSecurityManager(); if (security != null) { try { URLConnection conn = ConnectionFactory.getConnectionFactory().openConnection(url); java.security.Permission perm = conn.getPermission(); ConnectionFactory.getConnectionFactory().disconnect(conn); if (perm != null) { security.checkPermission(perm); } else { security.checkConnect(url.getHost(), url.getPort()); } } catch (java.io.IOException ioe) { security.checkConnect(url.getHost(), url.getPort()); } } } /** * {@inheritDoc} * * This method calls paint directly, rather than via super.update() since * the parent class's update() just does a couple of checks (both of * which are accounted for) and then calls paint anyway. */ @Override public void paint(Graphics g) { // If the image or the graphics don't exist, create new ones if (bufFrameImg == null || bufFrameImgGraphics == null) { // although invisible applets do not have right to paint // we rather paint to 1x1 to be sure all callbacks will be completed bufFrameImg = createImage(Math.max(1, getWidth()), Math.max(1, getHeight())); bufFrameImgGraphics = bufFrameImg.getGraphics(); } // Paint off-screen for (Component c: this.getComponents()) { c.paint(bufFrameImgGraphics); } // Draw the painted image g.drawImage(bufFrameImg, 0, 0, this); } @Override public void update(Graphics g) { paint(g); } /** * Waits on a given condition queue until timeout. * * This function assumes that the monitor lock has already been * acquired by the caller. * * If the given lock is null, this function returns immediately. * * @param lock the lock that must be held when this method is called. * @param cond the condition queue on which to wait for notifications. * @param timeout The maximum time to wait (nanoseconds) * @return Approximate time spent sleeping (not guaranteed to be perfect) */ public static long waitTillTimeout(ReentrantLock lock, Condition cond, long timeout) { // Can't wait on null. Return 0 indicating no wait happened. if (lock == null) { return 0; } assert lock.isHeldByCurrentThread(); // Record when we started sleeping long sleepStart = 0L; try { sleepStart = System.nanoTime(); cond.await(timeout, TimeUnit.NANOSECONDS); } catch (InterruptedException ie) {} // Discarded, time to return // Return the difference return System.nanoTime() - sleepStart; } private class SplashCreator implements Runnable { private final AppletPanel fPanel; public SplashCreator(AppletPanel fPanel) { this.fPanel = fPanel; } @Override public void run() { add("Center", fPanel); fPanel.setVisible(false); splashPanel = SplashUtils.getSplashScreen(fPanel.getWidth(), fPanel.getHeight()); if (splashPanel != null) { splashPanel.startAnimation(); PluginDebug.debug("Added splash " + splashPanel); add("Center", splashPanel.getSplashComponent()); } pack(); } } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/VoidPluginCallRequest.java0000644000000000000000000000013213441742745026560 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/VoidPluginCallRequest.java0000644000175000002070000000410313441742745027366 0ustar00jvanekmock00000000000000/* VoidPluginCallRequest -- represent Java-to-JavaScript requests Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; public class VoidPluginCallRequest extends PluginCallRequest { public VoidPluginCallRequest(String message, Long reference) { super(message, reference); PluginDebug.debug("VoidPluginCall ", message); } public void parseReturn(String message) { setDone(true); } public Object getObject() { return null; } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginMessageHandlerWorker.java0000644000000000000000000000013213441742745027566 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java0000644000175000002070000001163413441742745030403 0ustar00jvanekmock00000000000000/* PluginMessageHandlerWorker -- worker thread for handling messages Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import net.sourceforge.jnlp.util.logging.OutputController; class PluginMessageHandlerWorker extends Thread { private boolean free = true; private final boolean isPriorityWorker; private final int id; private volatile String message; private PluginStreamHandler streamHandler; private PluginMessageConsumer consumer; public synchronized void notifyHasWork() { notifyAll(); } public synchronized void waitForWork() { try { // Do not wait indefinitely to avoid the potential of deadlock wait(1000); } catch (InterruptedException e) { // Should not typically occur OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } } public PluginMessageHandlerWorker( PluginMessageConsumer consumer, PluginStreamHandler streamHandler, int id, boolean isPriorityWorker) { super("PluginMessageHandlerWorker" + id); this.id = id; this.streamHandler = streamHandler; this.isPriorityWorker = isPriorityWorker; this.consumer = consumer; PluginDebug.debug("Worker ", this.id, " (priority=", isPriorityWorker, ") created."); } public void setmessage(String message) { this.message = message; } public void run() { while (true) { if (message != null) { PluginDebug.debug("Consumer (priority=", isPriorityWorker, ") thread ", id, " consuming ", message); // ideally, whoever returns this object should mark it // busy first, but just in case.. busy(); try { streamHandler.handleMessage(message); } catch (PluginException pe) { /* catch the exception and DO NOTHING. The plugin should take over after this error and let the user know. We don't quit because otherwise the exception will spread to the rest of the applets which is a no-no */ } this.message = null; PluginDebug.debug("Consumption (priority=", isPriorityWorker, ") completed by consumer thread ", id); // mark ourselves free again free(); } else { waitForWork(); // Someone woke us up, see if there is work to do // PluginDebug.debug("Consumer thread ", id, " woken..."); } } } public int getWorkerId() { return id; } public void busy() { synchronized (this) { this.free = false; } } public void free() { synchronized (this) { this.free = true; } } public boolean isPriority() { return isPriorityWorker; } public boolean isFree(boolean prioritized) { synchronized (this) { return free && (prioritized == isPriorityWorker); } } public String toString() { return "Worker #" + this.id + "/IsPriority=" + this.isPriorityWorker + "/IsFree=" + this.free + "/Message=" + message; } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginCallRequestFactory.java0000644000000000000000000000013213441742745027266 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java0000644000175000002070000000506713441742745030106 0ustar00jvanekmock00000000000000/* PluginCallRequestFactory -- contains factory methods for dispatching an appropriate PluginCallRequest. Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; public class PluginCallRequestFactory { public PluginCallRequest getPluginCallRequest(String id, String message, Long reference) { if ("member".equals(id)) { return new GetMemberPluginCallRequest(message, reference); } else if ("void".equals(id)) { return new VoidPluginCallRequest(message, reference); } else if ("window".equals(id)) { return new GetWindowPluginCallRequest(message, reference); } else if ("proxyinfo".equals(id)) { return new PluginProxyInfoRequest(message, reference); } else if ("cookieinfo".equals(id)) { return new PluginCookieInfoRequest(message, reference); } else { throw new RuntimeException("Unknown plugin call request type requested from factory"); } } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/AppletSecurityContextManager.java0000644000000000000000000000013213441742745030150 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java0000644000175000002070000000571513441742745030770 0ustar00jvanekmock00000000000000/* AppletSecurityContextManager -- handles messages in an appropriate security context Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import java.security.AccessControlContext; import java.util.HashMap; public class AppletSecurityContextManager { // Context identifier -> PluginAppletSecurityContext object. private static HashMap contexts = new HashMap(); public static void addContext(int identifier, PluginAppletSecurityContext context) { contexts.put(identifier, context); } public static PluginAppletSecurityContext getSecurityContext(int identifier) { return contexts.get(identifier); } public static void dumpStore(int identifier) { contexts.get(identifier).dumpStore(); } public static void handleMessage(int identifier, int reference, String src, String[] privileges, String message) { PluginDebug.debug(identifier, " -- ", src, " -- ", reference, " -- ", message, " CONTEXT= ", contexts.get(identifier)); AccessControlContext callContext = null; privileges = privileges != null ? privileges : new String[0]; callContext = contexts.get(identifier).getAccessControlContext(privileges, src); contexts.get(identifier).handleMessage(reference, src, callContext, message); } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/TestEnv.java0000644000000000000000000000013213441742745023723 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/TestEnv.java0000644000175000002070000001221713441742745024536 0ustar00jvanekmock00000000000000/* TestEnv -- test JavaScript-to-Java calls Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; public class TestEnv { public static int intField = 103; public int intInstanceField = 7822; public String stringField = "hello"; // z public String complexStringField = "z\uD834\uDD1E\u6C34"; public static void TestIt() { PluginDebug.debug("TestIt"); } public static void TestItBool(boolean arg) { PluginDebug.debug("TestItBool: " + arg); } public static void TestItByte(byte arg) { PluginDebug.debug("TestItByte: " + arg); } public static void TestItChar(char arg) { PluginDebug.debug("TestItChar: " + arg); } public static void TestItShort(short arg) { PluginDebug.debug("TestItShort: " + arg); } public static void TestItInt(int arg) { PluginDebug.debug("TestItInt: " + arg); } public static void TestItLong(long arg) { PluginDebug.debug("TestItLong: " + arg); } public static void TestItFloat(float arg) { PluginDebug.debug("TestItFloat: " + arg); } public static void TestItDouble(double arg) { PluginDebug.debug("TestItDouble: " + arg); } public static void TestItObject(TestEnv arg) { PluginDebug.debug("TestItObject: " + arg); } public static void TestItObjectString(String arg) { PluginDebug.debug("TestItObjectString: " + arg); } public static void TestItIntArray(int[] arg) { PluginDebug.debug("TestItIntArray: " + arg); for (int i = 0; i < arg.length; i++) PluginDebug.debug("ELEMENT: " + i + " " + arg[i]); } public static void TestItObjectArray(String[] arg) { PluginDebug.debug("TestItObjectArray: " + arg); for (int i = 0; i < arg.length; i++) PluginDebug.debug("ELEMENT: " + i + " " + arg[i]); } public static void TestItObjectArrayMulti(String[][] arg) { PluginDebug.debug("TestItObjectArrayMulti: " + arg); for (int i = 0; i < arg.length; i++) for (int j = 0; j < arg[i].length; j++) PluginDebug.debug("ELEMENT: " + i + " " + j + " " + arg[i][j]); } public static boolean TestItBoolReturnTrue() { return true; } public static boolean TestItBoolReturnFalse() { return false; } public static byte TestItByteReturn() { return (byte) 0xfe; } public static char TestItCharReturn() { return 'K'; } public static char TestItCharUnicodeReturn() { return '\u6C34'; } public static short TestItShortReturn() { return 23; } public static int TestItIntReturn() { return 3445; } public static long TestItLongReturn() { return 3242883; } public static float TestItFloatReturn() { return 9.21E4f; } public static double TestItDoubleReturn() { return 8.33E88; } public static Object TestItObjectReturn() { return new String("Thomas"); } public static int[] TestItIntArrayReturn() { return new int[] { 6, 7, 8 }; } public static String[] TestItObjectArrayReturn() { return new String[] { "Thomas", "Brigitte" }; } public static String[][] TestItObjectArrayMultiReturn() { return new String[][] { { "Thomas", "Brigitte" }, { "Lindsay", "Michael" } }; } public int TestItIntInstance(int arg) { PluginDebug.debug("TestItIntInstance: " + this + " " + arg); return 899; } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginMessageConsumer.java0000644000000000000000000000013213441742745026612 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java0000644000175000002070000002177513441742745027436 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import java.util.ArrayList; import java.util.LinkedList; import net.sourceforge.jnlp.util.logging.OutputController; class PluginMessageConsumer { private static final int MAX_PARALLEL_INITS = 1; // Each initialization requires 5 responses (tag, handle, width, proxy, cookie) // before the message stack unlocks/collapses. This works out well because we // want to allow upto 5 parallel tasks anyway private static final int MAX_WORKERS = MAX_PARALLEL_INITS * 4; private static final int PRIORITY_WORKERS = MAX_PARALLEL_INITS * 2; private static LinkedList priorityWaitQueue = new LinkedList(); private LinkedList readQueue = new LinkedList(); private ArrayList workers = new ArrayList(); private PluginStreamHandler streamHandler; private ConsumerThread consumerThread = new ConsumerThread(); public PluginMessageConsumer(PluginStreamHandler streamHandler) { this.streamHandler = streamHandler; this.consumerThread.start(); } /** * Registers a reference to wait for. Responses to registered priority * references get handled by priority worker if normal workers are busy. * * @param reference The reference to give priority to */ public static void registerPriorityWait(Long reference) { PluginDebug.debug("Registering priority for reference ", reference); registerPriorityWait("reference " + reference.toString()); } /** * Registers a string to wait for. * * @param searchString the string to look for in a response */ private static void registerPriorityWait(String searchString) { PluginDebug.debug("Registering priority for string ", searchString); synchronized (priorityWaitQueue) { if (!priorityWaitQueue.contains(searchString)) { priorityWaitQueue.add(searchString); } } } /** * Unregisters a priority string to wait for. * * @param searchString The string to unregister from the priority list */ private static void unRegisterPriorityWait(String searchString) { synchronized (priorityWaitQueue) { priorityWaitQueue.remove(searchString); } } private static String getPriorityStrIfPriority(String message) { // Destroy messages are permanently high priority if (message.endsWith("destroy")) { return "destroy"; } synchronized (priorityWaitQueue) { for (String priorityStr : priorityWaitQueue) { if (message.indexOf(priorityStr) > 0) { return priorityStr; } } } return null; } public void queue(String message) { synchronized (readQueue) { readQueue.addLast(message); } // Wake that lazy consumer thread consumerThread.notifyHasWork(); } protected class ConsumerThread extends Thread { public ConsumerThread() { super("PluginMessageConsumer.ConsumerThread"); this.setDaemon(true); } // Notify that either work is ready to do, or a worker is available public synchronized void notifyHasWork() { notifyAll(); } // Wait a bit until either work is ready to do, or a worker is available public synchronized void waitForWork() { try { // Do not wait indefinitely to avoid the potential of deadlock wait(1000); } catch (InterruptedException e) { // Should not typically occur OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } } /** * Scans the readQueue for priority messages and brings them to the front */ private void bringPriorityMessagesToFront() { synchronized (readQueue) { // iterate through the list for (int i = 0; i < readQueue.size(); i++) { // remove element at i to inspect it String message = readQueue.remove(i); // if element at i is a priority msg, bring it forward if (getPriorityStrIfPriority(message) != null) { readQueue.addFirst(message); } else { // else keep it where it was readQueue.add(i, message); } // by the end the queue size is the same, so the // position indicator (i) is still valid } } } public void run() { while (true) { String message = null; synchronized (readQueue) { message = readQueue.poll(); } if (message != null) { String priorityStr = getPriorityStrIfPriority(message); boolean isPriorityResponse = (priorityStr != null); //PluginDebug.debug("Message " + message + " (priority=" + isPriorityResponse + ") ready to be processed. Looking for free worker..."); final PluginMessageHandlerWorker worker = getFreeWorker(isPriorityResponse); if (worker == null) { synchronized (readQueue) { readQueue.addFirst(message); } // re-scan to see if any priority message came in bringPriorityMessagesToFront(); continue; // re-loop to try next msg } if (isPriorityResponse) { unRegisterPriorityWait(priorityStr); } worker.setmessage(message); worker.notifyHasWork(); } else { waitForWork(); } } } } private PluginMessageHandlerWorker getFreeWorker(boolean prioritized) { for (PluginMessageHandlerWorker worker : workers) { if (worker.isFree(prioritized)) { PluginDebug.debug("Found free worker (", worker.isPriority(), ") with id ", worker.getWorkerId()); // mark it busy before returning worker.busy(); return worker; } } // If we have less than MAX_WORKERS, create a new worker if (workers.size() <= MAX_WORKERS) { PluginMessageHandlerWorker worker = null; if (workers.size() < (MAX_WORKERS - PRIORITY_WORKERS)) { PluginDebug.debug("Cannot find free worker, creating worker ", workers.size()); worker = new PluginMessageHandlerWorker(this, streamHandler, workers.size(), false); } else if (prioritized) { PluginDebug.debug("Cannot find free worker, creating priority worker ", workers.size()); worker = new PluginMessageHandlerWorker(this, streamHandler, workers.size(), true); } else { return null; } worker.start(); worker.busy(); workers.add(worker); return worker; } // No workers available. Better luck next time! return null; } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginCallRequest.java0000644000000000000000000000013213441742745025736 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginCallRequest.java0000644000175000002070000000542613441742745026555 0ustar00jvanekmock00000000000000/* PluginCallRequest -- represent Java-to-JavaScript requests Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; public abstract class PluginCallRequest { private String message; private Long reference; private PluginCallRequest next; private boolean done = false; public PluginCallRequest(String message, Long reference) { this.message = message; this.reference = reference; } public String getMessage() { return this.message; } public boolean isDone() { return this.done; } public boolean setDone(boolean done) { return this.done = done; } public void setNext(PluginCallRequest next) { this.next = next; } public PluginCallRequest getNext() { return this.next; } /** * Returns whether the given message is serviceable by this object * * @param message The message to service * @return boolean indicating if message is serviceable */ public boolean serviceable(String message) { return message.contains("reference " + reference); } public abstract void parseReturn(String message); public abstract Object getObject(); } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginStreamHandler.java0000644000000000000000000000013213441742745026243 xustar0030 mtime=1552401893.066832766 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginStreamHandler.java0000644000175000002070000003406413441742745027062 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.JavaConsole; import net.sourceforge.jnlp.util.logging.OutputController; public class PluginStreamHandler { public static final PluginStreamHandler DummyHandler = new PluginStreamHandler( new InputStream() { @Override public int read() throws IOException { return 0; } }, new OutputStream() { @Override public void write(int b) throws IOException { // } }); private final BufferedReader pluginInputReader; private final BufferedWriter pluginOutputWriter; private final RequestQueue queue = new RequestQueue(); private final PluginMessageConsumer consumer; private volatile boolean shuttingDown = false; public PluginStreamHandler(InputStream inputstream, OutputStream outputstream) { PluginDebug.debug("Current context CL=", Thread.currentThread().getContextClassLoader()); PluginDebug.debug("Creating consumer..."); consumer = new PluginMessageConsumer(this); // Set up input and output pipes. Use UTF-8 encoding. pluginInputReader = new BufferedReader(new InputStreamReader(inputstream, Charset.forName("UTF-8"))); pluginOutputWriter = new BufferedWriter(new OutputStreamWriter (outputstream, Charset.forName("UTF-8"))); } public void startProcessing() { Thread listenerThread = new Thread("PluginStreamHandlerListenerThread") { @Override public void run() { while (true) { PluginDebug.debug("Waiting for data..."); String s = read(); if (s != null) { consumer.queue(s); } else { try { // Close input/output channels to plugin. pluginInputReader.close(); pluginOutputWriter.close(); } catch (IOException exception) { // Deliberately ignore IOException caused by broken // pipe since plugin may have already detached. } AppletSecurityContextManager.dumpStore(0); PluginDebug.debug("APPLETVIEWER: exiting appletviewer"); JNLPRuntime.exit(0); } } } }; listenerThread.start(); } /** * Given a string, reads the first two (space separated) tokens. * * @param message The string to read * @param start The position to start reading at * @param array The array into which the first two tokens are placed * @return Position where the next token starts */ private int readPair(String message, int start, String[] array) { int end = start; array[0] = null; array[1] = null; if (message.length() > start) { int firstSpace = message.indexOf(' ', start); if (firstSpace == -1) { array[0] = message.substring(start); end = message.length(); } else { array[0] = message.substring(start, firstSpace); if (message.length() > firstSpace + 1) { int secondSpace = message.indexOf(' ', firstSpace + 1); if (secondSpace == -1) { array[1] = message.substring(firstSpace + 1); end = message.length(); } else { array[1] = message.substring(firstSpace + 1, secondSpace); end = secondSpace + 1; } } } } PluginDebug.debug("readPair: '", array[0], "' - '", array[1], "' ", end); return end; } public void handleMessage(String message) throws PluginException { int reference = -1; String src = null; String[] privileges = null; String rest = ""; String[] msgComponents = new String[2]; int oldPos = 0; int pos = readPair(message, oldPos, msgComponents); if (msgComponents[0] == null || msgComponents[1] == null) { return; } if (msgComponents[0].startsWith("plugin")) { handlePluginMessage(message); return; } // type and identifier are guaranteed to be there String type = msgComponents[0]; final int identifier = Integer.parseInt(msgComponents[1]); // reference, src and privileges are optional components, // and are guaranteed to be in that order, if they occur oldPos = pos; pos = readPair(message, oldPos, msgComponents); // is there a reference ? if ("reference".equals(msgComponents[0])) { reference = Integer.parseInt(msgComponents[1]); oldPos = pos; pos = readPair(message, oldPos, msgComponents); } // is there a src? if ("src".equals(msgComponents[0])) { src = msgComponents[1]; oldPos = pos; pos = readPair(message, oldPos, msgComponents); } // is there a privileges? if ("privileges".equals(msgComponents[0])) { String privs = msgComponents[1]; privileges = privs.split(","); oldPos = pos; } // rest if (message.length() > oldPos) { rest = message.substring(oldPos); } try { PluginDebug.debug("Breakdown -- type: ", type, " identifier: ", identifier, " reference: ", reference, " src: ", src, " privileges: ", privileges, " rest: \"", rest, "\""); if (rest.contains("JavaScriptGetWindow") || rest.contains("JavaScriptGetMember") || rest.contains("JavaScriptSetMember") || rest.contains("JavaScriptGetSlot") || rest.contains("JavaScriptSetSlot") || rest.contains("JavaScriptEval") || rest.contains("JavaScriptRemoveMember") || rest.contains("JavaScriptCall") || rest.contains("JavaScriptFinalize") || rest.contains("JavaScriptToString")) { finishCallRequest("reference " + reference + " " + rest); return; } final int freference = reference; final String frest = rest; switch (type) { case "instance": PluginAppletViewer.handleMessage(identifier, freference, frest); break; case "context": PluginDebug.debug("Sending to PASC: ", identifier, "/", reference, " and ", rest); AppletSecurityContextManager.handleMessage(identifier, reference, src, privileges, rest); break; } } catch (Exception e) { throw new PluginException(this, identifier, reference, e); } } private void handlePluginMessage(String message) { switch (message) { case "plugin showconsole": if (JavaConsole.isEnabled()){ JavaConsole.getConsole().showConsoleLater(); } else { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, Translator.R("DPJavaConsoleDisabledHint")); } break; case "plugin hideconsole": if (JavaConsole.isEnabled()){ JavaConsole.getConsole().hideConsoleLater(); } else { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, Translator.R("DPJavaConsoleDisabledHint")); } break; default: // else this is something that was specifically requested finishCallRequest(message); break; } } public void postCallRequest(PluginCallRequest request) { synchronized (queue) { queue.post(request); } } private void finishCallRequest(String message) { PluginDebug.debug("DISPATCHCALLREQUESTS 1"); synchronized (queue) { PluginDebug.debug("DISPATCHCALLREQUESTS 2"); PluginCallRequest request = queue.pop(); // make sure we give the message to the right request // in the queue.. for the love of God, MAKE SURE! // first let's be efficient.. if there was only one // request in queue, we're already set if (queue.size() != 0) { int size = queue.size(); int count = 0; while (!request.serviceable(message)) { PluginDebug.debug(request, " cannot service ", message); // something is very wrong.. we have a message to // process, but no one to service it if (count >= size) { throw new RuntimeException("Unable to find processor for message " + message); } // post request at the end of the queue queue.post(request); // Look at the next request request = queue.pop(); count++; } } PluginDebug.debug("DISPATCHCALLREQUESTS 3"); if (request != null) { PluginDebug.debug("DISPATCHCALLREQUESTS 5"); synchronized (request) { request.parseReturn(message); request.notifyAll(); } PluginDebug.debug("DISPATCHCALLREQUESTS 6"); PluginDebug.debug("DISPATCHCALLREQUESTS 7"); } } PluginDebug.debug("DISPATCHCALLREQUESTS 8"); } /** * Read string from plugin. * * @return the read string */ private String read() { String message = null; try { message = pluginInputReader.readLine(); PluginDebug.debug(" PIPE: appletviewer read: ", message); if (message == null || message.equals("shutdown")) { shuttingDown = true; try { // Close input/output channels to plugin. pluginInputReader.close(); pluginOutputWriter.close(); } catch (IOException exception) { // Deliberately ignore IOException caused by broken // pipe since plugin may have already detached. } AppletSecurityContextManager.dumpStore(0); PluginDebug.debug("APPLETVIEWER: exiting appletviewer"); JNLPRuntime.exit(0); } } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } return message; } /** * Write string to plugin. * * @param message the message to write */ public void write(String message) { PluginDebug.debug(" PIPE: appletviewer wrote: ", message); synchronized (pluginOutputWriter) { try { pluginOutputWriter.write(message + "\n", 0, message.length()); pluginOutputWriter.write(0); pluginOutputWriter.flush(); } catch (IOException e) { // if we are shutting down, ignore write failures as // pipe may have closed if (!shuttingDown) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } // either ways, if the pipe is broken, there is nothing // we can do anymore. Don't hang around. PluginDebug.debug("Unable to write to PIPE. APPLETVIEWER exiting"); JNLPRuntime.exit(1); } } } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginException.java0000644000000000000000000000013213441742745025450 xustar0030 mtime=1552401893.065832769 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginException.java0000644000175000002070000000435413441742745026266 0ustar00jvanekmock00000000000000/* PluginException -- represents an exception in handling a plugin message Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import net.sourceforge.jnlp.util.logging.OutputController; public class PluginException extends Exception { public PluginException(PluginStreamHandler sh, int instance, int reference, Throwable t) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,t); this.setStackTrace(t.getStackTrace()); AppletSecurityContextManager.dumpStore(0); String message = "instance " + instance + " reference " + reference + " Error " + t.getMessage(); sh.write(message); } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginAppletSecurityContext.java0000644000000000000000000000013213441742745030034 xustar0030 mtime=1552401893.064832771 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java0000644000175000002070000015547413441742745030664 0ustar00jvanekmock00000000000000/* PluginAppletSecurityContext -- execute plugin JNI messages Copyright (C) 2008, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.security.AccessControlContext; import java.security.AccessControlException; import java.security.AccessController; import java.security.AllPermission; import java.security.BasicPermission; import java.security.CodeSource; import java.security.Permissions; import java.security.PrivilegedAction; import java.security.ProtectionDomain; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.DefaultLaunchHandler; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; import netscape.javascript.JSObject; import netscape.javascript.JSObjectCreatePermission; import netscape.javascript.JSUtil; class Signature { private String signature; private int currentIndex; private List> typeList; private static final char ARRAY = '['; private static final char OBJECT = 'L'; private static final char SIGNATURE_ENDCLASS = ';'; private static final char SIGNATURE_FUNC = '('; private static final char SIGNATURE_ENDFUNC = ')'; private static final char VOID = 'V'; private static final char BOOLEAN = 'Z'; private static final char BYTE = 'B'; private static final char CHARACTER = 'C'; private static final char SHORT = 'S'; private static final char INTEGER = 'I'; private static final char LONG = 'J'; private static final char FLOAT = 'F'; private static final char DOUBLE = 'D'; private String nextTypeName() { char key = signature.charAt(currentIndex++); switch (key) { case ARRAY: return nextTypeName() + "[]"; case OBJECT: int endClass = signature.indexOf(SIGNATURE_ENDCLASS, currentIndex); String retVal = signature.substring(currentIndex, endClass); retVal = retVal.replace('/', '.'); currentIndex = endClass + 1; return retVal; // FIXME: generated bytecode with classes named after // primitives will not work in this scheme -- those // classes will be incorrectly treated as primitive // types. case VOID: return "void"; case BOOLEAN: return "boolean"; case BYTE: return "byte"; case CHARACTER: return "char"; case SHORT: return "short"; case INTEGER: return "int"; case LONG: return "long"; case FLOAT: return "float"; case DOUBLE: return "double"; case SIGNATURE_ENDFUNC: return null; case SIGNATURE_FUNC: return nextTypeName(); default: throw new IllegalArgumentException( "Invalid JNI signature character '" + key + "'"); } } public Signature(String signature, ClassLoader cl) { this.signature = signature; currentIndex = 0; typeList = new ArrayList<>(10); String elem; while (currentIndex < signature.length()) { elem = nextTypeName(); if (elem == null) { continue; } Class primitive = primitiveNameToType(elem); if (primitive != null) { typeList.add(primitive); } else { int dimsize = 0; int n = elem.indexOf('['); if (n != -1) { String arrayType = elem.substring(0, n); dimsize++; n = elem.indexOf('[', n + 1); while (n != -1) { dimsize++; n = elem.indexOf('[', n + 1); } int[] dims = new int[dimsize]; primitive = primitiveNameToType(arrayType); if (primitive != null) { typeList.add(Array.newInstance(primitive, dims) .getClass()); } else { typeList.add(Array.newInstance( getClass(arrayType, cl), dims).getClass()); } } else { typeList.add(getClass(elem, cl)); } } } if (signature.length() < 2) { throw new IllegalArgumentException("Invalid JNI signature '" + signature + "'"); } } public static Class getClass(String name, ClassLoader cl) { Class c = null; try { c = Class.forName(name); } catch (ClassNotFoundException cnfe) { PluginDebug.debug("Class ", name, " not found in primordial loader. Looking in ", cl); try { c = cl.loadClass(name); } catch (ClassNotFoundException e) { throw (new RuntimeException(new ClassNotFoundException("Unable to find class " + name))); } } return c; } public static Class primitiveNameToType(String name) { switch (name) { case "void": return Void.TYPE; case "boolean": return Boolean.TYPE; case "byte": return Byte.TYPE; case "char": return Character.TYPE; case "short": return Short.TYPE; case "int": return Integer.TYPE; case "long": return Long.TYPE; case "float": return Float.TYPE; case "double": return Double.TYPE; default: return null; } } public Class[] getClassArray() { return typeList.subList(0, typeList.size()).toArray(new Class[] {}); } } public class PluginAppletSecurityContext { private static Map classLoaders = new HashMap<>(); private static Map instanceClassLoaders = new HashMap<>(); private PluginObjectStore store = PluginObjectStore.getInstance(); private Throwable throwable = null; private ClassLoader liveconnectLoader = ClassLoader.getSystemClassLoader(); int identifier = 0; private static PluginStreamHandler streamhandler; long startTime = 0; /* Package-private constructor that allows for bypassing security manager installation. * This is useful for testing. Note that while the public constructor should be used otherwise, * the security installation can't be bypassed if it has already occurred.*/ PluginAppletSecurityContext(int identifier, boolean ensureSecurityContext) { this.identifier = identifier; if (ensureSecurityContext) { // We need a security manager.. and since there is a good chance that // an applet will be loaded at some point, we should make it the SM // that JNLPRuntime will try to install if (System.getSecurityManager() == null) { JNLPRuntime.initialize(/* isApplication */false); JNLPRuntime.setDefaultLaunchHandler(new DefaultLaunchHandler(OutputController.getLogger())); } JNLPRuntime.disableExit(); } URL u = null; try { u = new URL("file://"); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } PluginAppletSecurityContext.classLoaders.put(liveconnectLoader, u); } public PluginAppletSecurityContext(int identifier) { this(identifier, true); } private static V parseCall(String s, ClassLoader cl, Class c) { if (c == Integer.class) { return c.cast(new Integer(s)); } else if (c == String.class) { return c.cast(s); } else if (c == Signature.class) { return c.cast(new Signature(s, cl)); } else { throw new RuntimeException("Unexpected call value."); } } private Object parseArgs(String s, Class c) { if (c == Boolean.TYPE || c == Boolean.class) { return Boolean.valueOf(s); } else if (c == Byte.TYPE || c == Byte.class) { return new Byte(s); } else if (c == Character.TYPE || c == Character.class) { String[] bytes = s.split("_"); int low = Integer.parseInt(bytes[0]); int high = Integer.parseInt(bytes[1]); int full = ((high << 8) & 0x0ff00) | (low & 0x0ff); return (char) full; } else if (c == Short.TYPE || c == Short.class) { return new Short(s); } else if (c == Integer.TYPE || c == Integer.class) { return new Integer(s); } else if (c == Long.TYPE || c == Long.class) { return new Long(s); } else if (c == Float.TYPE || c == Float.class) { return new Float(s); } else if (c == Double.TYPE || c == Double.class) { return new Double(s); } else { return store.getObject(new Integer(s)); } } public void associateSrc(ClassLoader cl, URL src) { PluginDebug.debug("Associating ", cl, " with ", src); PluginAppletSecurityContext.classLoaders.put(cl, src); } public void associateInstance(Integer i, ClassLoader cl) { PluginDebug.debug("Associating ", cl, " with instance ", i); PluginAppletSecurityContext.instanceClassLoaders.put(i, cl); } public static void setStreamhandler(PluginStreamHandler sh) { streamhandler = sh; } public static PluginStreamHandler getStreamhandler() { return streamhandler; } public static Map getLoaderInfo() { Map map = new HashMap<>(); for (ClassLoader loader : PluginAppletSecurityContext.classLoaders.keySet()) { map.put(loader.getClass().getName(), classLoaders.get(loader).toString()); } return map; } private static long privilegedJSObjectUnbox(final JSObject js) { return AccessController.doPrivileged(new PrivilegedAction() { @Override public Long run() { return JSUtil.getJSObjectInternalReference(js); } }); } /** * Create a string that identifies a Java object precisely, for passing to * Javascript. * * For builtin value types, a 'literalreturn' prefix is used and the object * is passed with a string representation. * * For JSObject's, a 'jsobject' prefix is used and the object is passed * with the JSObject's internal identifier. * * For other Java objects, an object store reference is used. * * @param obj the object for which to create an identifier * @param type the type to use for representation decisions * @param unboxPrimitives whether to treat boxed primitives as value types * @return an identifier string */ public String toObjectIDString(Object obj, Class type, boolean unboxPrimitives) { /* Void (can occur from declared return type), pass special "void" string: */ if (type == Void.TYPE) { return "literalreturn void"; } /* Null, pass special "null" string: */ if (obj == null) { return "literalreturn null"; } /* Primitive, accurately represented by its toString() form: */ boolean returnAsString = ( type == Boolean.TYPE || type == Byte.TYPE || type == Short.TYPE || type == Integer.TYPE || type == Long.TYPE ); if (unboxPrimitives) { returnAsString = ( returnAsString || type == Boolean.class || type == Byte.class || type == Short.class || type == Integer.class || type == Long.class); } if (returnAsString) { return "literalreturn " + obj.toString(); } /* Floating point number, we ensure we give enough precision: */ if ( type == Float.TYPE || type == Double.TYPE || ( unboxPrimitives && (type == Float.class || type == Double.class) )) { return "literalreturn " + String.format("%308.308e", obj); } /* Character that should be returned as number: */ if (type == Character.TYPE || (unboxPrimitives && type == Character.class)) { return "literalreturn " + (int) (Character) obj; } /* JSObject, unwrap underlying Javascript reference: */ if (type == netscape.javascript.JSObject.class) { long reference = privilegedJSObjectUnbox((JSObject)obj); return "jsobject " + Long.toString(reference); } /* Other kind of object, track this object and return our reference: */ store.reference(obj); return store.getIdentifier(obj).toString(); } public void handleMessage(int reference, String src, AccessControlContext callContext, String message) { startTime = new java.util.Date().getTime(); try { if (message.startsWith("FindClass")) { ClassLoader cl; Class c; cl = liveconnectLoader; String[] args = message.split(" "); Integer instance = new Integer(args[1]); String className = args[2].replace('/', '.'); PluginDebug.debug("Searching for class ", className, " in ", cl); try { c = cl.loadClass(className); store.reference(c); write(reference, "FindClass " + store.getIdentifier(c)); } catch (ClassNotFoundException cnfe) { cl = PluginAppletSecurityContext.instanceClassLoaders.get(instance); PluginDebug.debug("Not found. Looking in ", cl); if (instance != 0 && cl != null) { try { c = cl.loadClass(className); store.reference(c); write(reference, "FindClass " + store.getIdentifier(c)); } catch (ClassNotFoundException cnfe2) { write(reference, "FindClass 0"); } } else { write(reference, "FindClass 0"); } } } else if (message.startsWith("GetStaticMethodID") || message.startsWith("GetMethodID")) { String[] args = message.split(" "); Integer classID = parseCall(args[1], null, Integer.class); String methodName = parseCall(args[2], null, String.class); Signature signature = parseCall(args[3], ((Class) store.getObject(classID)).getClassLoader(), Signature.class); Object[] a = signature.getClassArray(); Class c; if (message.startsWith("GetStaticMethodID") || methodName.equals("") || methodName.equals("")) { c = (Class) store.getObject(classID); } else { c = store.getObject(classID).getClass(); } Method m; Constructor cs; Object o; if (methodName.equals("") || methodName.equals("")) { o = cs = c.getConstructor(signature.getClassArray()); store.reference(cs); } else { o = m = c.getMethod(methodName, signature.getClassArray()); store.reference(m); } PluginDebug.debug(o, " has id ", store.getIdentifier(o)); write(reference, args[0] + " " + store.getIdentifier(o)); } else if (message.startsWith("GetStaticFieldID") || message.startsWith("GetFieldID")) { String[] args = message.split(" "); Integer classID = parseCall(args[1], null, Integer.class); Integer fieldID = parseCall(args[2], null, Integer.class); String fieldName = (String) store.getObject(fieldID); Class c = (Class) store.getObject(classID); PluginDebug.debug("GetStaticFieldID/GetFieldID got class=", c.getName()); Field f; f = c.getField(fieldName); store.reference(f); write(reference, "GetStaticFieldID " + store.getIdentifier(f)); } else if (message.startsWith("GetStaticField")) { String[] args = message.split(" "); String type = parseCall(args[1], null, String.class); Integer classID = parseCall(args[1], null, Integer.class); Integer fieldID = parseCall(args[2], null, Integer.class); final Class c = (Class) store.getObject(classID); final Field f = (Field) store.getObject(fieldID); AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext(); checkPermission(src, c, acc); Object ret = AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { try { return f.get(c); } catch (Throwable t) { return t; } } }, acc); if (ret instanceof Throwable) { throw (Throwable) ret; } String objIDStr = toObjectIDString(ret, f.getType(), false /*do not unbox primitives*/); write(reference, "GetStaticField " + objIDStr); } else if (message.startsWith("GetValue")) { String[] args = message.split(" "); Integer index = parseCall(args[1], null, Integer.class); Object ret = store.getObject(index); Class retClass = ret != null ? ret.getClass() : null; String objIDStr = toObjectIDString(ret, retClass, true /*unbox primitives*/); write(reference, "GetValue " + objIDStr); } else if (message.startsWith("SetStaticField") || message.startsWith("SetField")) { String[] args = message.split(" "); Integer classOrObjectID = parseCall(args[1], null, Integer.class); Integer fieldID = parseCall(args[2], null, Integer.class); Object value = store.getObject(parseCall(args[3], null, Integer.class)); final Object o = store.getObject(classOrObjectID); final Field f = (Field) store.getObject(fieldID); final Object fValue = MethodOverloadResolver.getCostAndCastedObject(value, f.getType()).getCastedObject(); AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext(); checkPermission(src, message.startsWith("SetStaticField") ? (Class) o : o.getClass(), acc); Object ret = AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { try { f.set(o, fValue); } catch (Throwable t) { return t; } return null; } }, acc); if (ret instanceof Throwable) { throw (Throwable) ret; } write(reference, "SetField"); } else if (message.startsWith("GetObjectArrayElement")) { String[] args = message.split(" "); Integer arrayID = parseCall(args[1], null, Integer.class); Integer index = parseCall(args[2], null, Integer.class); Object array = store.getObject(arrayID); Object ret = Array.get(array, index); Class retClass = array.getClass().getComponentType(); // prevent auto-boxing influence String objIDStr = toObjectIDString(ret, retClass, false /*do not unbox primitives*/); write(reference, "GetObjectArrayElement " + objIDStr); } else if (message.startsWith("SetObjectArrayElement")) { String[] args = message.split(" "); Integer arrayID = parseCall(args[1], null, Integer.class); Integer index = parseCall(args[2], null, Integer.class); Integer objectID = parseCall(args[3], null, Integer.class); Object value = store.getObject(objectID); // Cast the object to appropriate type before insertion value = MethodOverloadResolver.getCostAndCastedObject(value, store.getObject(arrayID).getClass().getComponentType()).getCastedObject(); Array.set(store.getObject(arrayID), index, value); write(reference, "SetObjectArrayElement"); } else if (message.startsWith("GetArrayLength")) { String[] args = message.split(" "); Integer arrayID = parseCall(args[1], null, Integer.class); Object o = store.getObject(arrayID); int len = 0; len = Array.getLength(o); write(reference, "GetArrayLength " + Array.getLength(o)); } else if (message.startsWith("GetField")) { String[] args = message.split(" "); String type = parseCall(args[1], null, String.class); Integer objectID = parseCall(args[1], null, Integer.class); Integer fieldID = parseCall(args[2], null, Integer.class); final Object o = store.getObject(objectID); final Field f = (Field) store.getObject(fieldID); AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext(); checkPermission(src, o.getClass(), acc); Object ret = AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { try { return f.get(o); } catch (Throwable t) { return t; } } }, acc); if (ret instanceof Throwable) { throw (Throwable) ret; } String objIDStr = toObjectIDString(ret, f.getType(), false /*do not unbox primitives*/); write(reference, "GetField " + objIDStr); } else if (message.startsWith("GetObjectClass")) { int oid = Integer.parseInt(message.substring("GetObjectClass" .length() + 1)); Class c = store.getObject(oid).getClass(); store.reference(c); write(reference, "GetObjectClass " + store.getIdentifier(c)); } else if (message.startsWith("CallMethod") || message.startsWith("CallStaticMethod")) { String[] args = message.split(" "); Integer objectID = parseCall(args[1], null, Integer.class); String methodName = parseCall(args[2], null, String.class); Object o = null; Class c; if (message.startsWith("CallMethod")) { o = store.getObject(objectID); c = o.getClass(); } else { c = (Class) store.getObject(objectID); } // Discard first 3 parts of message Object[] arguments = new Object[args.length - 3]; for (int i = 0; i < arguments.length; i++) { arguments[i] = store.getObject(parseCall(args[3 + i], null, Integer.class)); PluginDebug.debug("GOT ARG: ", arguments[i]); } MethodOverloadResolver.ResolvedMethod rm = MethodOverloadResolver.getBestMatchMethod(c, methodName, arguments); if (rm == null) { write(reference, "Error: No suitable method named " + methodName + " with matching args found"); return; } final Method m = rm.getMethod(); final Object[] castedArgs = rm.getCastedParameters(); PluginDebug.debug("Calling method ", m, " on object ", o , " (", c, ") with ", Arrays.toString(castedArgs)); AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext(); checkPermission(src, c, acc); final Object[] fArguments = castedArgs; final Object callableObject = o; // Set the method accessible prior to calling. See: // http://forums.sun.com/thread.jspa?threadID=332001&start=15&tstart=0 m.setAccessible(true); Object ret = AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { try { return m.invoke(callableObject, fArguments); } catch (Throwable t) { return t; } } }, acc); if (ret instanceof Throwable) { throw (Throwable) ret; } String retO; if (ret == null) { retO = "null"; } else { retO = m.getReturnType().toString(); } PluginDebug.debug("Calling ", m, " on ", o, " with ", Arrays.toString(castedArgs), " and that returned: ", ret, " of type ", retO); String objIDStr = toObjectIDString(ret, m.getReturnType(), false /*do not unbox primitives*/); write(reference, "CallMethod " + objIDStr); } else if (message.startsWith("GetSuperclass")) { String[] args = message.split(" "); Integer classID = parseCall(args[1], null, Integer.class); Class c; Class ret; c = (Class) store.getObject(classID); ret = c.getSuperclass(); store.reference(ret); write(reference, "GetSuperclass " + store.getIdentifier(ret)); } else if (message.startsWith("IsAssignableFrom")) { String[] args = message.split(" "); Integer classID = parseCall(args[1], null, Integer.class); Integer superclassID = parseCall(args[2], null, Integer.class); Class clz = (Class) store.getObject(classID); Class sup = (Class) store.getObject(superclassID); boolean result = sup.isAssignableFrom(clz); write(reference, "IsAssignableFrom " + (result ? "1" : "0")); } else if (message.startsWith("IsInstanceOf")) { String[] args = message.split(" "); Integer objectID = parseCall(args[1], null, Integer.class); Integer classID = parseCall(args[2], null, Integer.class); Object o = store.getObject(objectID); Class c = (Class) store.getObject(classID); boolean result = c.isInstance(o); write(reference, "IsInstanceOf " + (result ? "1" : "0")); } else if (message.startsWith("GetStringUTFLength")) { String[] args = message.split(" "); Integer stringID = parseCall(args[1], null, Integer.class); String o; byte[] b = null; o = (String) store.getObject(stringID); b = o.getBytes("UTF-8"); write(reference, "GetStringUTFLength " + o.length()); } else if (message.startsWith("GetStringLength")) { String[] args = message.split(" "); Integer stringID = parseCall(args[1], null, Integer.class); String o; byte[] b = null; o = (String) store.getObject(stringID); b = o.getBytes("UTF-16LE"); write(reference, "GetStringLength " + o.length()); } else if (message.startsWith("GetStringUTFChars")) { String[] args = message.split(" "); Integer stringID = parseCall(args[1], null, Integer.class); String o; StringBuffer buf = null; o = (String) store.getObject(stringID); byte[] b = o.getBytes("UTF-8"); buf = new StringBuffer(b.length * 2); buf.append(b.length); for (int i = 0; i < b.length; i++) { buf.append(" ").append(Integer.toString(((int) b[i]) & 0x0ff, 16)); } write(reference, "GetStringUTFChars " + buf); } else if (message.startsWith("GetStringChars")) { String[] args = message.split(" "); Integer stringID = parseCall(args[1], null, Integer.class); String o; StringBuffer buf = null; o = (String) store.getObject(stringID); // FIXME: LiveConnect uses UCS-2. byte[] b = o.getBytes("UTF-16LE"); buf = new StringBuffer(b.length * 2); buf.append(b.length); for (int i = 0; i < b.length; i++) { buf.append(" ").append(Integer.toString(((int) b[i]) & 0x0ff, 16)); } PluginDebug.debug("Java: GetStringChars: ", o); PluginDebug.debug(" String BYTES: ", buf); write(reference, "GetStringChars " + buf); } else if (message.startsWith("GetToStringValue")) { String[] args = message.split(" "); Integer objectID = parseCall(args[1], null, Integer.class); String o; StringBuffer buf = null; o = store.getObject(objectID).toString(); byte[] b = o.getBytes("UTF-8"); buf = new StringBuffer(b.length * 2); buf.append(b.length); for (int i = 0; i < b.length; i++) { buf.append(" ").append(Integer.toString(((int) b[i]) & 0x0ff, 16)); } write(reference, "GetToStringValue " + buf); } else if (message.startsWith("NewArray")) { String[] args = message.split(" "); String type = parseCall(args[1], null, String.class); Integer length = parseCall(args[2], null, Integer.class); Object newArray; Class c; if (type.equals("bool")) { c = Boolean.class; } else if (type.equals("double")) { c = Double.class; } else if (type.equals("int")) { c = Integer.class; } else if (type.equals("string")) { c = String.class; } else if (isInt(type)) { c = (Class) store.getObject(Integer.parseInt(type)); } else { c = JSObject.class; } if (args.length > 3) { newArray = Array.newInstance(c, new int[] { length, parseCall(args[3], null, Integer.class) }); } else { newArray = Array.newInstance(c, length); } store.reference(newArray); write(reference, "NewArray " + store.getIdentifier(newArray)); } else if (message.startsWith("HasMethod")) { String[] args = message.split(" "); Integer classNameID = parseCall(args[1], null, Integer.class); Integer methodNameID = parseCall(args[2], null, Integer.class); Class c = (Class) store.getObject(classNameID); String methodName = (String) store.getObject(methodNameID); Method method = null; Method[] classMethods = c.getMethods(); for (Method m : classMethods) { if (m.getName().equals(methodName)) { method = m; break; } } int hasMethod = (method != null) ? 1 : 0; write(reference, "HasMethod " + hasMethod); } else if (message.startsWith("HasPackage")) { String[] args = message.split(" "); Integer instance = parseCall(args[1], null, Integer.class); Integer nameID = parseCall(args[2], null, Integer.class); String pkgName = (String) store.getObject(nameID); Package pkg = Package.getPackage(pkgName); int hasPkg = (pkg != null) ? 1 : 0; write(reference, "HasPackage " + hasPkg); } else if (message.startsWith("HasField")) { String[] args = message.split(" "); Integer classNameID = parseCall(args[1], null, Integer.class); Integer fieldNameID = parseCall(args[2], null, Integer.class); Class c = (Class) store.getObject(classNameID); String fieldName = (String) store.getObject(fieldNameID); Field field = null; Field[] classFields = c.getFields(); for (Field f : classFields) { if (f.getName().equals(fieldName)) { field = f; break; } } int hasField = (field != null) ? 1 : 0; write(reference, "HasField " + hasField); } else if (message.startsWith("NewObjectArray")) { String[] args = message.split(" "); Integer length = parseCall(args[1], null, Integer.class); Integer classID = parseCall(args[2], null, Integer.class); Integer objectID = parseCall(args[3], null, Integer.class); Object newArray; newArray = Array.newInstance((Class) store.getObject(classID), length); Object[] array = (Object[]) newArray; for (int i = 0; i < array.length; i++) { array[i] = store.getObject(objectID); } store.reference(newArray); write(reference, "NewObjectArray " + store.getIdentifier(newArray)); } else if (message.startsWith("NewObjectWithConstructor")) { String[] args = message.split(" "); Integer classID = parseCall(args[1], null, Integer.class); Integer methodID = parseCall(args[2], null, Integer.class); final Constructor m = (Constructor) store.getObject(methodID); Class[] argTypes = m.getParameterTypes(); Object[] arguments = new Object[argTypes.length]; for (int i = 0; i < argTypes.length; i++) { arguments[i] = parseArgs(args[3 + i], argTypes[i]); } final Object[] fArguments = arguments; AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext(); Class c = (Class) store.getObject(classID); checkPermission(src, c, acc); Object ret = AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { try { return m.newInstance(fArguments); } catch (Throwable t) { return t; } } }, acc); if (ret instanceof Throwable) { throw (Throwable) ret; } store.reference(ret); write(reference, "NewObject " + store.getIdentifier(ret)); } else if (message.startsWith("NewObject")) { String[] args = message.split(" "); Integer classID = parseCall(args[1], null, Integer.class); Class c = (Class) store.getObject(classID); // Discard first 2 parts of message Object[] arguments = new Object[args.length - 2]; for (int i = 0; i < arguments.length; i++) { arguments[i] = store.getObject(parseCall(args[2 + i], null, Integer.class)); PluginDebug.debug("GOT ARG: ", arguments[i]); } MethodOverloadResolver.ResolvedMethod resolvedConstructor = MethodOverloadResolver.getBestMatchConstructor(c, arguments); if (resolvedConstructor == null) { write(reference, "Error: No suitable constructor with matching args found"); return; } final Constructor cons = resolvedConstructor.getConstructor(); final Object[] castedArgs = resolvedConstructor.getCastedParameters(); PluginDebug.debug("Calling constructor on class ", c, " with ", Arrays.toString(castedArgs)); AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext(); checkPermission(src, c, acc); Object ret = AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { try { return cons.newInstance(castedArgs); } catch (Throwable t) { return t; } } }, acc); if (ret instanceof Throwable) { throw (Throwable) ret; } store.reference(ret); write(reference, "NewObject " + store.getIdentifier(ret)); } else if (message.startsWith("NewStringUTF")) { PluginDebug.debug("MESSAGE: ", message); String[] args = message.split(" "); int length = new Integer(args[1]); byte[] byteArray = new byte[length]; int i = 0; int j = 2; int c; while (i < length) { c = Integer.parseInt(args[j++], 16); byteArray[i++] = (byte) c; } String ret = new String(byteArray, "UTF-8"); PluginDebug.debug("NEWSTRINGUTF: ", ret); store.reference(ret); write(reference, "NewStringUTF " + store.getIdentifier(ret)); } else if (message.startsWith("NewString")) { PluginDebug.debug("MESSAGE: ", message); String[] args = message.split(" "); Integer strlength = parseCall(args[1], null, Integer.class); int bytelength = 2 * strlength; byte[] byteArray = new byte[bytelength]; String ret; for (int i = 0; i < strlength; i++) { int c = parseCall(args[2 + i], null, Integer.class); PluginDebug.debug("char ", i, " ", c); // Low. byteArray[2 * i] = (byte) (c & 0x0ff); // High. byteArray[2 * i + 1] = (byte) ((c >> 8) & 0x0ff); } ret = new String(byteArray, 0, bytelength, "UTF-16LE"); PluginDebug.debug("NEWSTRING: ", ret); store.reference(ret); write(reference, "NewString " + store.getIdentifier(ret)); } else if (message.startsWith("ExceptionOccurred")) { PluginDebug.debug("EXCEPTION: ", throwable); if (throwable != null) { store.reference(throwable); } write(reference, "ExceptionOccurred " + store.getIdentifier(throwable)); } else if (message.startsWith("ExceptionClear")) { if (throwable != null && store.contains(throwable)) { store.unreference(store.getIdentifier(throwable)); } throwable = null; write(reference, "ExceptionClear"); } else if (message.startsWith("DeleteGlobalRef")) { String[] args = message.split(" "); Integer id = parseCall(args[1], null, Integer.class); store.unreference(id); write(reference, "DeleteGlobalRef"); } else if (message.startsWith("DeleteLocalRef")) { String[] args = message.split(" "); Integer id = parseCall(args[1], null, Integer.class); store.unreference(id); write(reference, "DeleteLocalRef"); } else if (message.startsWith("NewGlobalRef")) { String[] args = message.split(" "); Integer id = parseCall(args[1], null, Integer.class); store.reference(store.getObject(id)); write(reference, "NewGlobalRef " + id); } else if (message.startsWith("GetClassName")) { String[] args = message.split(" "); Integer objectID = parseCall(args[1], null, Integer.class); Object o = store.getObject(objectID); write(reference, "GetClassName " + o.getClass().getName()); } else if (message.startsWith("GetClassID")) { String[] args = message.split(" "); Integer objectID = parseCall(args[1], null, Integer.class); store.reference(store.getObject(objectID).getClass()); write(reference, "GetClassID " + store.getIdentifier(store.getObject(objectID).getClass())); } } catch (Throwable t) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,t); String msg = t.getCause() != null ? t.getCause().getMessage() : t.getMessage(); // add an identifier string to let javaside know of the type of error // check for cause as well, since the top level exception will be InvocationTargetException in most cases if (t instanceof AccessControlException || t.getCause() instanceof AccessControlException) { msg = "LiveConnectPermissionNeeded " + msg; } write(reference, " Error " + msg); // ExceptionOccured is only called after Callmethod() by mozilla. So // for exceptions that are not related to CallMethod, we need a way // to log them. This is how we do it.. send an error message to the // c++ side to let it know that something went wrong, and it will do // the right thing to let mozilla know // Store the cause as the actual exception. This is needed because // the exception we get here will always be an // "InvocationTargetException" due to the use of reflection above if (message.startsWith("CallMethod") || message.startsWith("CallStaticMethod")) { throwable = t.getCause(); } } } /** * Checks if the calling script is allowed to access the specified class * * @param jsSrc The source of the script * @param target The target class that the script is trying to access * @param acc AccessControlContext for this execution * @throws AccessControlException If the script has insufficient permissions */ public void checkPermission(String jsSrc, Class target, AccessControlContext acc) throws AccessControlException { // NPRuntime does not allow cross-site calling. We therefore always // allow this, for the time being } private void write(int reference, String message) { PluginDebug.debug("appletviewer writing ", message); streamhandler.write("context " + identifier + " reference " + reference + " " + message); } public void prePopulateLCClasses() { int classID; prepopulateClass("netscape/javascript/JSObject"); classID = prepopulateClass("netscape/javascript/JSException"); prepopulateMethod(classID, "", "(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;I)"); prepopulateMethod(classID, "", "(ILjava/lang/Object;)"); prepopulateField(classID, "lineno"); prepopulateField(classID, "tokenIndex"); prepopulateField(classID, "source"); prepopulateField(classID, "filename"); prepopulateField(classID, "wrappedExceptionType"); prepopulateField(classID, "wrappedException"); classID = prepopulateClass("netscape/javascript/JSUtil"); prepopulateMethod(classID, "getStackTrace", "(Ljava/lang/Throwable;)"); prepopulateClass("java/lang/Object"); classID = prepopulateClass("java/lang/Class"); prepopulateMethod(classID, "getMethods", "()"); prepopulateMethod(classID, "getConstructors", "()"); prepopulateMethod(classID, "getFields", "()"); prepopulateMethod(classID, "getName", "()"); prepopulateMethod(classID, "isArray", "()"); prepopulateMethod(classID, "getComponentType", "()"); prepopulateMethod(classID, "getModifiers", "()"); classID = prepopulateClass("java/lang/reflect/Method"); prepopulateMethod(classID, "getName", "()"); prepopulateMethod(classID, "getParameterTypes", "()"); prepopulateMethod(classID, "getReturnType", "()"); prepopulateMethod(classID, "getModifiers", "()"); classID = prepopulateClass("java/lang/reflect/Constructor"); prepopulateMethod(classID, "getParameterTypes", "()"); prepopulateMethod(classID, "getModifiers", "()"); classID = prepopulateClass("java/lang/reflect/Field"); prepopulateMethod(classID, "getName", "()"); prepopulateMethod(classID, "getType", "()"); prepopulateMethod(classID, "getModifiers", "()"); classID = prepopulateClass("java/lang/reflect/Array"); prepopulateMethod(classID, "newInstance", "(Ljava/lang/Class;I)"); classID = prepopulateClass("java/lang/Throwable"); prepopulateMethod(classID, "toString", "()"); prepopulateMethod(classID, "getMessage", "()"); classID = prepopulateClass("java/lang/System"); prepopulateMethod(classID, "identityHashCode", "(Ljava/lang/Object;)"); classID = prepopulateClass("java/lang/Boolean"); prepopulateMethod(classID, "booleanValue", "()"); prepopulateMethod(classID, "", "(Z)"); classID = prepopulateClass("java/lang/Double"); prepopulateMethod(classID, "doubleValue", "()"); prepopulateMethod(classID, "", "(D)"); classID = prepopulateClass("java/lang/Void"); prepopulateField(classID, "TYPE"); prepopulateClass("java/lang/String"); prepopulateClass("java/applet/Applet"); } private int prepopulateClass(String name) { name = name.replace('/', '.'); ClassLoader cl = liveconnectLoader; Class c = null; try { c = cl.loadClass(name); store.reference(c); } catch (ClassNotFoundException cnfe) { // do nothing ... this should never happen OutputController.getLogger().log(OutputController.Level.ERROR_ALL,cnfe); } return store.getIdentifier(c); } private int prepopulateMethod(int classID, String methodName, String signatureStr) { Signature signature = parseCall(signatureStr, ((Class) store.getObject(classID)).getClassLoader(), Signature.class); Object[] a = signature.getClassArray(); Class c = (Class) store.getObject(classID); Method m = null; try { if (methodName.equals("") || methodName.equals("")) { Constructor cs = c.getConstructor(signature.getClassArray()); store.reference(cs); } else { m = c.getMethod(methodName, signature.getClassArray()); store.reference(m); } } catch (NoSuchMethodException e) { // should never happen OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } return store.getIdentifier(m); } private int prepopulateField(int classID, String fieldName) { Class c = (Class) store.getObject(classID); Field f = null; try { f = c.getField(fieldName); } catch (SecurityException e) { // should never happen OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } catch (NoSuchFieldException e) { // should never happen OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } store.reference(f); return store.getIdentifier(f); } public void dumpStore() { store.dump(); } public Object getObject(int identifier) { return store.getObject(identifier); } public int getIdentifier(Object o) { return store.getIdentifier(o); } public void store(Object o) { store.reference(o); } /** * @return a "closed" AccessControlContext i.e. no permissions to get out of sandbox. */ public AccessControlContext getClosedAccessControlContext() { // Deny everything Permissions p = new Permissions(); ProtectionDomain pd = new ProtectionDomain(null, p); return new AccessControlContext(new ProtectionDomain[] { pd }); } public AccessControlContext getAccessControlContext(String[] nsPrivilegeList, String src) { Permissions grantedPermissions = new Permissions(); for (String privilege : nsPrivilegeList) { switch (privilege) { case "UniversalBrowserRead": BrowserReadPermission bp = new BrowserReadPermission(); grantedPermissions.add(bp); break; case "UniversalJavaPermission": AllPermission ap = new AllPermission(); grantedPermissions.add(ap); break; } } CodeSource cs = new CodeSource((URL) null, (java.security.cert.Certificate[]) null); if (src != null && src.length() > 0) { try { cs = new CodeSource(new URL(src + "/"), (java.security.cert.Certificate[]) null); } catch (MalformedURLException mfue) { // do nothing } if (src.equals("[System]")) { grantedPermissions.add(new JSObjectCreatePermission()); } } else { JSObjectCreatePermission perm = new JSObjectCreatePermission(); grantedPermissions.add(perm); } ProtectionDomain pd = new ProtectionDomain(cs, grantedPermissions, null, null); // Add to hashmap return new AccessControlContext(new ProtectionDomain[] { pd }); } // private static final == inline private static final boolean isInt(Object o) { boolean isInt = false; try { Integer.parseInt((String) o); isInt = true; } catch (Exception e) { // don't care } return isInt; } class BrowserReadPermission extends BasicPermission { public BrowserReadPermission() { super("browserRead"); } } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginProxyInfoRequest.java0000644000000000000000000000013213441742745027020 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java0000644000175000002070000000612113441742745027630 0ustar00jvanekmock00000000000000/* PluginProxyInfoRequest -- Object representing a request for proxy information from the browser Copyright (C) 2009 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import java.net.URI; import net.sourceforge.jnlp.util.logging.OutputController; /** * This class represents a request object for proxy information for a given URI */ public class PluginProxyInfoRequest extends PluginCallRequest { URI internal = null; public PluginProxyInfoRequest(String message, Long reference) { super(message, reference); } public void parseReturn(String proxyInfo) { // try to parse the proxy information. If things go wrong, do nothing .. // this will keep internal = null which forces a direct connection PluginDebug.debug("PluginProxyInfoRequest GOT: ", proxyInfo); String[] messageComponents = proxyInfo.split(" "); try { String protocol = messageComponents[4].equals("PROXY") ? "http" : "socks"; String host = messageComponents[5].split(":")[0]; int port = Integer.parseInt(messageComponents[5].split(":")[1]); internal = new URI(protocol, null, host, port, null, null, null); } catch (ArrayIndexOutOfBoundsException aioobe) { // Nothing.. this is expected if there is no proxy } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); } setDone(true); } public URI getObject() { return this.internal; } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginCookieManager.java0000644000000000000000000000013213441742745026216 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginCookieManager.java0000644000175000002070000001027513441742745027033 0ustar00jvanekmock00000000000000/* PluginCookieManager -- Cookie manager for the plugin Copyright (C) 2009 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import java.io.IOException; import java.net.CookieManager; import java.net.HttpCookie; import java.net.URI; import java.util.Collections; import java.util.List; import java.util.Map; import com.sun.jndi.toolkit.url.UrlUtil; public class PluginCookieManager extends CookieManager { private PluginStreamHandler streamHandler; public PluginCookieManager(PluginStreamHandler streamHandler) { this.streamHandler = streamHandler; } @Override public Map> get(URI uri, Map> requestHeaders) throws IOException { // pre-condition check if (uri == null || requestHeaders == null) { throw new IllegalArgumentException("Argument is null"); } Map> cookieMap = new java.util.HashMap>(); String cookies = (String) PluginAppletViewer .requestPluginCookieInfo(uri); List cookieHeader = new java.util.ArrayList(); if (cookies != null && cookies.length() > 0) cookieHeader.add(cookies); // Add anything else that mozilla didn't add for (HttpCookie cookie : getCookieStore().get(uri)) { // apply path-matches rule (RFC 2965 sec. 3.3.4) if (pathMatches(uri.getPath(), cookie.getPath())) { cookieHeader.add(cookie.toString()); } } cookieMap.put("Cookie", cookieHeader); return Collections.unmodifiableMap(cookieMap); } private boolean pathMatches(String path, String pathToMatchWith) { if (path == pathToMatchWith) return true; if (path == null || pathToMatchWith == null) return false; if (path.startsWith(pathToMatchWith)) return true; return false; } @Override public void put(URI uri, Map> responseHeaders) throws IOException { super.put(uri, responseHeaders); for (Map.Entry> headerEntry : responseHeaders.entrySet()) { String type = headerEntry.getKey(); if ("Set-Cookie".equalsIgnoreCase(type) || "Set-Cookie2".equalsIgnoreCase(type)) { List cookies = headerEntry.getValue(); for (String cookie : cookies) { streamHandler.write("plugin PluginSetCookie reference -1 " + UrlUtil.encode(uri.toString(), "UTF-8") + " " + cookie); } } } } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/MethodOverloadResolver.java0000644000000000000000000000013213441742745026771 xustar0030 mtime=1552401893.060832779 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java0000644000175000002070000004672113441742745027613 0ustar00jvanekmock00000000000000/* MethodOverloadResolver -- Resolves overloaded methods Copyright (C) 2009 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /* * This class resolved overloaded methods in Java objects using a cost * based-approach described here: * * http://jdk6.java.net/plugin2/liveconnect/#OVERLOADED_METHODS */ public class MethodOverloadResolver { static final int NUMERIC_SAME_COST = 1; static final int NULL_TO_OBJECT_COST = 2; static final int CLASS_SAME_COST = 3; static final int NUMERIC_CAST_COST = 4; static final int NUMERIC_BOOLEAN_COST = 5; static final int STRING_NUMERIC_CAST_COST = 5; static final int CLASS_SUPERCLASS_COST = 6; static final int CLASS_STRING_COST = 7; static final int ARRAY_CAST_COST = 8; /* A method signature with its casted parameters * We pretend a Constructor is a normal 'method' for ease of code reuse */ static class ResolvedMethod { private java.lang.reflect.AccessibleObject method; private Object[] castedParameters; private int cost; public ResolvedMethod(int cost, java.lang.reflect.AccessibleObject method, Object[] castedParameters) { this.cost = cost; this.method = method; this.castedParameters = castedParameters; } java.lang.reflect.AccessibleObject getAccessibleObject() { return method; } public Method getMethod() { return (Method)method; } public Constructor getConstructor() { return (Constructor)method; } public Object[] getCastedParameters() { return castedParameters; } public int getCost() { return cost; } } /* A cast with an associated 'cost', used for picking method overloads */ static class WeightedCast { private int cost; private final int distance; private Object castedObject; public WeightedCast(int cost, Object castedObject) { this.cost = cost; this.castedObject = castedObject; this.distance = 0; } public WeightedCast(int cost, Object castedObject, int distance) { this.cost = cost; this.castedObject = castedObject; this.distance = distance; } public Object getCastedObject() { return castedObject; } public int getCost() { return cost; } public int getDistance() { return distance; } } public static ResolvedMethod getBestMatchMethod(Class c, String methodName, Object[] args) { Method[] matchingMethods = getMatchingMethods(c, methodName, args.length); if (PluginDebug.DEBUG) { /* avoid toString if not needed */ PluginDebug.debug("getMatchingMethod called with: " + Arrays.toString(args)); } return getBestOverloadMatch(c, args, matchingMethods); } public static ResolvedMethod getBestMatchConstructor(Class c, Object[] args) { Constructor[] matchingConstructors = getMatchingConstructors(c, args.length); if (PluginDebug.DEBUG) { /* avoid toString if not needed */ PluginDebug.debug("getMatchingConstructor called with: " + Arrays.toString(args)); } return getBestOverloadMatch(c, args, matchingConstructors); } /* * Get best-matching method based on a cost based overload resolution * algorithm is used, described here: * * http://jdk6.java.net/plugin2/liveconnect/#OVERLOADED_METHODS * * Note that we consider Constructor's to be 'methods' for convenience. We * use the common parent class of Method/Constructor, 'AccessibleObject' * * NB: Although the spec specifies that ambiguous method calls (ie, same * cost) should throw errors, we simply pick the first overload for * simplicity. Method overrides should not be doing wildly different things * anyway. */ static ResolvedMethod getBestOverloadMatch(Class c, Object[] args, java.lang.reflect.AccessibleObject[] candidates) { int lowestCost = Integer.MAX_VALUE; int lowestDistance = Integer.MAX_VALUE; java.lang.reflect.AccessibleObject cheapestMethod = null; Object[] cheapestArgs = null; boolean ambiguous = false; methodLoop: for (java.lang.reflect.AccessibleObject candidate : candidates) { int methodCost = 0; int distance = 0; Class[] paramTypes = getParameterTypesFor(candidate); Object[] castedArgs = new Object[paramTypes.length]; // Figure out which of the matched methods best represents what we // want for (int i = 0; i < paramTypes.length; i++) { Class paramTypeClass = paramTypes[i]; Object suppliedParam = args[i]; Class suppliedParamClass = suppliedParam != null ? suppliedParam .getClass() : null; WeightedCast weightedCast = getCostAndCastedObject( suppliedParam, paramTypeClass); if (weightedCast == null) { continue methodLoop; // Cannot call this constructor! } methodCost += weightedCast.getCost(); distance = weightedCast.getDistance(); Object castedObj = paramTypeClass.isPrimitive() ? weightedCast.getCastedObject() : paramTypeClass.cast(weightedCast.getCastedObject()); castedArgs[i] = castedObj; if (PluginDebug.DEBUG) { /* avoid toString if not needed */ Class castedObjClass = castedObj == null ? null : castedObj.getClass(); boolean castedObjIsPrim = castedObj == null ? false : castedObj.getClass().isPrimitive(); PluginDebug.debug("Param " + i + " of method " + candidate + " has cost " + weightedCast.getCost() + " distance " + weightedCast.getDistance() + " original param type " + suppliedParamClass + " casted to " + castedObjClass + " isPrimitive=" + castedObjIsPrim + " value " + castedObj); } } if (methodCost < lowestCost || (methodCost == lowestCost && distance <= lowestDistance)) { if (methodCost < lowestCost || argumentsAreSubclassesOf(castedArgs, cheapestArgs)) { lowestCost = methodCost; cheapestArgs = castedArgs; cheapestMethod = candidate; lowestDistance = distance; ambiguous = false; } else { ambiguous = true; } } } // The spec says we should error out if the method call is ambiguous // Instead we will report it in debug output if (ambiguous) { PluginDebug.debug("*** Warning: Ambiguous overload of ", c.getClass(), "#", cheapestMethod, "!"); } if (cheapestMethod == null) { return null; } return new ResolvedMethod(lowestCost, cheapestMethod, cheapestArgs); } public static WeightedCast getCostAndCastedObject(Object suppliedParam, Class paramTypeClass) { Class suppliedParamClass = suppliedParam != null ? suppliedParam .getClass() : null; boolean suppliedParamIsArray = suppliedParamClass != null && suppliedParamClass.isArray(); if (suppliedParamIsArray) { if (paramTypeClass.isArray()) { return getArrayToArrayCastWeightedCost(suppliedParam, paramTypeClass); } // Target type must be an array, Object or String // If it an object, we return "as is" [Everything can be narrowed to an // object, cost=CLASS_SUPERCLASS_COST] // If it is a string, we need to convert according to the JS engine // rules if (paramTypeClass != String.class && paramTypeClass != Object.class) { return null; } if (paramTypeClass.equals(String.class)) { return new WeightedCast(ARRAY_CAST_COST, arrayToJavascriptStyleString(suppliedParam)); } } // If this is null, there are only 2 possible cases if (suppliedParamClass == null) { if (!paramTypeClass.isPrimitive()) { return new WeightedCast(NULL_TO_OBJECT_COST, null); // Null to any non-primitive type } return null;// Null to primitive not allowed } // Numeric type to the analogous Java primitive type if (paramTypeClass.isPrimitive() && paramTypeClass == getPrimitiveType(suppliedParam.getClass())) { return new WeightedCast(NUMERIC_SAME_COST, suppliedParam); } // Class type to Class type where the types are the same if (suppliedParamClass == paramTypeClass) { return new WeightedCast(CLASS_SAME_COST, suppliedParam); } // Numeric type to a different primitive type boolean wrapsPrimitive = (getPrimitiveType(suppliedParam.getClass()) != null); if (wrapsPrimitive && paramTypeClass.isPrimitive()) { double val; // Coerce booleans if (suppliedParam.equals(Boolean.TRUE)) { val = 1.0; } else if (suppliedParam.equals(Boolean.FALSE)){ val = 0.0; } else if (suppliedParam instanceof Character) { val = (double)(Character)suppliedParam; } else { val = ((Number)suppliedParam).doubleValue(); } int castCost = NUMERIC_CAST_COST; Object castedObj; if (paramTypeClass.equals(Boolean.TYPE)) { castedObj = (val != 0D && !Double.isNaN(val)); if (suppliedParam.getClass() != Boolean.class) { castCost = NUMERIC_BOOLEAN_COST; } } else { castedObj = toBoxedPrimitiveType(val, paramTypeClass); } return new WeightedCast(castCost, castedObj); } // Numeric string to numeric type if (isNumericString(suppliedParam) && paramTypeClass.isPrimitive()) { Object castedObj; if (paramTypeClass.equals(Character.TYPE)) { castedObj = (char) Short.decode((String)suppliedParam).shortValue(); } else { castedObj = stringAsPrimitiveType((String)suppliedParam, paramTypeClass); } return new WeightedCast(STRING_NUMERIC_CAST_COST, castedObj); } // Same cost as above if (suppliedParam instanceof java.lang.String && (paramTypeClass == java.lang.Boolean.class || paramTypeClass == java.lang.Boolean.TYPE)) { return new WeightedCast(STRING_NUMERIC_CAST_COST, !suppliedParam.equals("")); } // Class type to superclass type; if (paramTypeClass.isAssignableFrom(suppliedParamClass)) { return new WeightedCast(CLASS_SUPERCLASS_COST, paramTypeClass.cast(suppliedParam), classDistance(suppliedParamClass, paramTypeClass)); } // Any java value to String if (paramTypeClass.equals(String.class)) { return new WeightedCast(CLASS_STRING_COST, suppliedParam.toString()); } return null; } private static int classDistance(Class subClass, Class superClass) { int distance = 0; if (superClass.isAssignableFrom(subClass)) { while (!subClass.equals(superClass)) { subClass = subClass.getSuperclass(); distance++; } } return distance; } private static WeightedCast getArrayToArrayCastWeightedCost(Object suppliedArray, Class paramTypeClass) { int arrLength = Array.getLength(suppliedArray); Class arrType = paramTypeClass.getComponentType(); // If it is an array, we need to copy/cast as we scan the array Object newArray = Array.newInstance(arrType, arrLength); for (int i = 0; i < arrLength; i++) { Object original = Array.get(suppliedArray, i); // When dealing with arrays, we represent empty slots with // null. We need to convert this to 0 before recursive // calling, since normal transformation does not allow // null -> primitive if (original == null && arrType.isPrimitive()) { original = 0; } WeightedCast costAndCastedObject = getCostAndCastedObject(original, paramTypeClass.getComponentType()); if (costAndCastedObject == null) { return null; } Array.set(newArray, i, costAndCastedObject.getCastedObject()); } return new WeightedCast(ARRAY_CAST_COST, newArray); } private static Method[] getMatchingMethods(Class c, String name, int paramCount) { List matchingMethods = new ArrayList(); for (Method m : c.getMethods()) { if (m.getName().equals(name)) { if (m.getParameterTypes().length == paramCount) { matchingMethods.add(m); } } } return matchingMethods.toArray(new Method[0]); } private static Constructor[] getMatchingConstructors(Class c, int paramCount) { List> matchingConstructors = new ArrayList>(); for (Constructor cs : c.getConstructors()) { if (cs.getParameterTypes().length == paramCount) { matchingConstructors.add(cs); } } return matchingConstructors.toArray(new Constructor[0]); } private static Class getPrimitiveType(Class c) { if (c.isPrimitive()) { return c; } if (c == Byte.class) { return Byte.TYPE; } else if (c == Character.class) { return Character.TYPE; } else if (c == Short.class) { return Short.TYPE; } else if (c == Integer.class) { return Integer.TYPE; } else if (c == Long.class) { return Long.TYPE; } else if (c == Float.class) { return Float.TYPE; } else if (c == Double.class) { return Double.TYPE; } else if (c == Boolean.class) { return Boolean.TYPE; } else { return null; } } private static boolean isNumericString(Object o) { // At this point, it _has_ to be a string else automatically // return false if (!(o instanceof java.lang.String)) { return false; } try { Long.parseLong((String) o); // whole number test return true; } catch (NumberFormatException nfe) { } try { Float.parseFloat((String) o); // decimal return true; } catch (NumberFormatException nfe) { } return false; } private static Object toBoxedPrimitiveType(double val, Class c) { Class prim = getPrimitiveType(c); // See if we need to collapse first if (prim == Integer.TYPE) { return (int)val; } else if (prim == Long.TYPE) { return (long)val; } else if (prim == Short.TYPE) { return (short)val; } else if (prim == Float.TYPE) { return (float)val; } else if (prim == Double.TYPE) { return val; } else if (prim == Byte.TYPE) { return (byte)val; } else if (prim == Character.TYPE) { return (char)(short)val; } return val; } private static Object stringAsPrimitiveType(String s, Class c) throws NumberFormatException { double val = Double.parseDouble(s); return toBoxedPrimitiveType(val, c); } // Test whether we can get from 'args' to 'testArgs' only by using widening conversions, // eg String -> Object private static boolean argumentsAreSubclassesOf(Object[] args, Object[] testArgs) { for (int i = 0; i < args.length; i++) { if (!testArgs[i].getClass().isAssignableFrom(args[i].getClass())) { return false; } } return true; } static Class[] getParameterTypesFor(java.lang.reflect.AccessibleObject method) { if (method instanceof Method) { return ((Method)method).getParameterTypes(); } else /*m instanceof Constructor*/ { return ((Constructor)method).getParameterTypes(); } } private static String arrayToJavascriptStyleString(Object array) { int arrLength = Array.getLength(array); StringBuilder sb = new StringBuilder(); for (int i = 0; i < arrLength; i++) { Object element = Array.get(array, i); if (element != null) { if (element.getClass().isArray()) { sb.append(arrayToJavascriptStyleString(element)); } else { sb.append(element); } } sb.append(','); } // Trim the final "," if (arrLength > 0) { sb.setLength(sb.length() - 1); } return sb.toString(); } }icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginObjectStore.java0000644000000000000000000000013213441742745025735 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginObjectStore.java0000644000175000002070000001125013441742745026544 0ustar00jvanekmock00000000000000/* PluginObjectStore -- manage identifier-to-object mapping Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; import java.util.HashMap; import java.util.Map; // Enums are the best way to implement singletons: // Bloch, Joshua. Effective Java, 2nd Edition. Item 3, Chapter 2. ISBN: 0-321-35668-3. enum PluginObjectStore { INSTANCE; private final Map objects = new HashMap(); private final Map counts = new HashMap(); private final Map identifiers = new HashMap(); private final Object lock = new Object(); private boolean wrapped = false; private int nextUniqueIdentifier = 1; public static PluginObjectStore getInstance() { return INSTANCE; } public Object getObject(Integer identifier) { synchronized(lock) { return objects.get(identifier); } } public Integer getIdentifier(Object object) { if (object == null) return 0; synchronized(lock) { return identifiers.get(object); } } public boolean contains(Object object) { if (object != null) { synchronized(lock) { return identifiers.containsKey(object); } } return false; } public boolean contains(int identifier) { synchronized(lock) { return objects.containsKey(identifier); } } private boolean checkNeg() { if (nextUniqueIdentifier < 1) { wrapped = true; nextUniqueIdentifier = 1; } return wrapped; } private int getNextID() { while (checkNeg() && objects.containsKey(nextUniqueIdentifier)) nextUniqueIdentifier++; return nextUniqueIdentifier++; } public void reference(Object object) { synchronized(lock) { Integer identifier = identifiers.get(object); if (identifier == null) { int next = getNextID(); objects.put(next, object); counts.put(next, 1); identifiers.put(object, next); } else { counts.put(identifier, counts.get(identifier) + 1); } } } public void unreference(int identifier) { synchronized(lock) { Integer currentCount = counts.get(identifier); if (currentCount == null) { return; } if (currentCount == 1) { Object object = objects.get(identifier); objects.remove(identifier); counts.remove(identifier); identifiers.remove(object); } else { counts.put(identifier, currentCount - 1); } } } public void dump() { synchronized(lock) { if (PluginDebug.DEBUG) { for (Map.Entry e : objects.entrySet()) { PluginDebug.debug(e.getKey(), "::", e.getValue()); } } } } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/PluginClassLoader.java0000644000000000000000000000013213441742745025706 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PluginClassLoader.java0000644000175000002070000000373213441742745026523 0ustar00jvanekmock00000000000000/* VoidPluginCallRequest -- represent Java-to-JavaScript requests Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; public class PluginClassLoader extends ClassLoader { public PluginClassLoader() { super(); } public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { return super.loadClass(name, resolve); } } icedtea-web-1.8/plugin/icedteanp/java/sun/applet/PaxHeaders.7406/GetMemberPluginCallRequest.java0000644000000000000000000000013213441742745027526 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java0000644000175000002070000000476113441742745030346 0ustar00jvanekmock00000000000000/* GetMemberPluginCallRequest -- represent Java-to-JavaScript requests Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package sun.applet; public class GetMemberPluginCallRequest extends PluginCallRequest { Object object = null; public GetMemberPluginCallRequest(String message, Long reference) { super(message, reference); PluginDebug.debug("GetMemberPluginCall ", message); } public void parseReturn(String message) { PluginDebug.debug("GetMemberParseReturn GOT: ", message); String[] args = message.split(" "); // FIXME: Is it even possible to distinguish between null and void // here? if (!"null".equals(args[3]) && !"void".equals(args[3])) object = AppletSecurityContextManager.getSecurityContext(0).getObject(Integer.parseInt(args[3])); setDone(true); } public Object getObject() { return this.object; } } icedtea-web-1.8/plugin/icedteanp/java/PaxHeaders.7406/netscape0000644000000000000000000000013213441742745021123 xustar0030 mtime=1552401893.051832798 30 atime=1552410887.113183443 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/0000755000175000002070000000000013441742745022010 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/icedteanp/java/netscape/PaxHeaders.7406/javascript0000644000000000000000000000013213441742745023271 xustar0030 mtime=1552401893.079832739 30 atime=1552410887.113183443 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/0000755000175000002070000000000013441742745024156 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/PaxHeaders.7406/JSRunnable.java0000644000000000000000000000013213441742745026214 xustar0030 mtime=1552401893.079832739 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/JSRunnable.java0000644000175000002070000000517513441742745027034 0ustar00jvanekmock00000000000000/* -*- Mode: Java; tab-width: 8; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ package netscape.javascript; import net.sourceforge.jnlp.util.logging.OutputController; import sun.applet.PluginDebug; /** * Runs a JavaScript object with a run() method in a separate thread. */ public class JSRunnable implements Runnable { private JSObject runnable; public JSRunnable(JSObject runnable) { this.runnable = runnable; synchronized (this) { new Thread(this).start(); try { this.wait(); } catch (InterruptedException ie) { } } } public void run() { try { runnable.call("run", null); synchronized (this) { notifyAll(); } } catch (Throwable t) { PluginDebug.debug(t.toString()); OutputController.getLogger().log(OutputController.Level.ERROR_ALL,t); } } } icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/PaxHeaders.7406/JSObjectUnboxPermission.ja0000644000000000000000000000013213441742745030412 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/JSObjectUnboxPermission.java0000644000175000002070000000366213441742745031560 0ustar00jvanekmock00000000000000/* JSObjectUnboxPermission.java Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package netscape.javascript; import java.security.BasicPermission; /** * Permission to access internal reference of JSObject */ public class JSObjectUnboxPermission extends BasicPermission { public JSObjectUnboxPermission() { super("JSObjectUnbox"); } } icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/PaxHeaders.7406/JSObject.java0000644000000000000000000000013213441742745025654 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/JSObject.java0000644000175000002070000002425413441742745026473 0ustar00jvanekmock00000000000000/* -*- Mode: Java; tab-width: 8; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* more doc TODO: * threads * gc * * */ package netscape.javascript; import java.applet.Applet; import java.security.AccessControlException; import java.security.AccessController; import sun.applet.PluginAppletViewer; import sun.applet.PluginDebug; /** * JSObject allows Java to manipulate objects that are * defined in JavaScript. * Values passed from Java to JavaScript are converted as * follows:
    *
  • JSObject is converted to the original JavaScript object *
  • Any other Java object is converted to a JavaScript wrapper, * which can be used to access methods and fields of the java object. * Converting this wrapper to a string will call the toString method * on the original object, converting to a number will call the * doubleValue method if possible and fail otherwise. Converting * to a boolean will try to call the booleanValue method in the * same way. *
  • Java arrays are wrapped with a JavaScript object that understands * array.length and array[index] *
  • A Java boolean is converted to a JavaScript boolean *
  • Java byte, char, short, int, long, float, and double are converted * to JavaScript numbers *
* Values passed from JavaScript to Java are converted as follows:
    *
  • objects which are wrappers around java objects are unwrapped *
  • other objects are wrapped with a JSObject *
  • strings, numbers and booleans are converted to String, Double, * and Boolean objects respectively *
* This means that all JavaScript values show up as some kind * of java.lang.Object in Java. In order to make much use of them, * you will have to cast them to the appropriate subclass of Object, * e.g. (String) window.getMember("name"); or * (JSObject) window.getMember("document");. */ public final class JSObject { /* the internal object data */ private long internal; /** * initialize */ private static void initClass() { PluginDebug.debug("JSObject.initClass"); } static { PluginDebug.debug("JSObject INITIALIZER"); } /** * Package-private method used through JSUtil#getJSObjectInternalReference. * We make this package-private to avoid polluting the public interface. * @return the internal identifier */ long getInternalReference() { AccessController.getContext().checkPermission(new JSObjectUnboxPermission()); return internal; } /** * it is illegal to construct a JSObject manually * @param jsobj_addr integer to become jsobject */ public JSObject(int jsobj_addr) { this((long) jsobj_addr); } /** * it is illegal to construct a JSObject manually * @param jsobj_addr string to become jsobject */ public JSObject(String jsobj_addr) { this(Long.parseLong(jsobj_addr)); } public JSObject(long jsobj_addr) { // See if the caller has permission try { AccessController.getContext().checkPermission(new JSObjectCreatePermission()); } catch (AccessControlException ace) { // If not, only caller with JSObject.getWindow on the stack may // make this call unprivileged. // Although this check is inefficient, it should happen only once // during applet init, so we look the other way StackTraceElement[] stack = Thread.currentThread().getStackTrace(); boolean mayProceed = false; for (StackTraceElement element : stack) { if (element.getClassName().equals("netscape.javascript.JSObject") && element.getMethodName().equals("getWindow")) { mayProceed = true; } } if (!mayProceed) throw ace; } PluginDebug.debug("JSObject long CONSTRUCTOR"); internal = jsobj_addr; } /** * Retrieves a named member of a JavaScript object. * Equivalent to "this.name" in JavaScript. * @param name name of the memebr to be searched in * @return object which is member of name */ public Object getMember(String name) { PluginDebug.debug("JSObject.getMember ", name); Object o = PluginAppletViewer.getMember(internal, name); PluginDebug.debug("JSObject.getMember GOT ", o); return o; } /** * Retrieves an indexed member of a JavaScript object. * Equivalent to "this[index]" in JavaScript. * @param index as in array-like touch in javascript array * @return object on index position */ // public Object getMember(int index) { return getSlot(index); } public Object getSlot(int index) { PluginDebug.debug("JSObject.getSlot ", index); return PluginAppletViewer.getSlot(internal, index); } /** * Sets a named member of a JavaScript object. * Equivalent to "this.name = value" in JavaScript. * @param name name of the member * @param value value to best to the named member */ public void setMember(String name, Object value) { PluginDebug.debug("JSObject.setMember ", name, " ", value); PluginAppletViewer.setMember(internal, name, value); } /** * Sets an indexed member of a JavaScript object. * Equivalent to "this[index] = value" in JavaScript. * @param index as in array-like touch in javascript array * @param value value to be set on the index palce */ // public void setMember(int index, Object value) { // setSlot(index, value); // } public void setSlot(int index, Object value) { PluginDebug.debug("JSObject.setSlot ", index, " ", value); PluginAppletViewer.setSlot(internal, index, value); } /** * Removes a named member of a JavaScript object. * @param name name of member of given name */ public void removeMember(String name) { PluginDebug.debug("JSObject.removeMember ", name); PluginAppletViewer.removeMember(internal, name); } /** * Calls a JavaScript method. * Equivalent to "this.methodName(args[0], args[1], ...)" in JavaScript. * @param methodName - name of the method to be called * @param args parameters for method * @return result of method call */ public Object call(String methodName, Object args[]) { if (args == null) args = new Object[0]; PluginDebug.debug("JSObject.call ", methodName); for (Object arg : args) { PluginDebug.debug(" ", arg); } PluginDebug.debug(""); return PluginAppletViewer.call(internal, methodName, args); } /** * Evaluates a JavaScript expression. The expression is a string * of JavaScript source code which will be evaluated in the context * given by "this". * @param s expression to be evaluated * @return result of evaluation */ public Object eval(String s) { PluginDebug.debug("JSObject.eval ", s); return PluginAppletViewer.eval(internal, s); } /** * Converts a JSObject to a String. * @return string representation of this object */ @Override public String toString() { PluginDebug.debug("JSObject.toString"); return PluginAppletViewer.javascriptToString(internal); } // should use some sort of identifier rather than String // is "property" the right word? // native String[] listProperties(); /** * get a JSObject for the window containing the given applet * @param applet applet which will be searched for window * @return the JSObject representing window of applet */ public static JSObject getWindow(Applet applet) { PluginDebug.debug("JSObject.getWindow"); // FIXME: handle long case as well. long internal = ((PluginAppletViewer) applet.getAppletContext()).getWindow(); PluginDebug.debug("GOT IT: ", internal); return new JSObject(internal); } /** * Finalization decrements the reference count on the corresponding * JavaScript object. */ @Override protected void finalize() { // Proceed if this is a valid object (0L == default long == invalid) if (internal == 0L) return; PluginDebug.debug("JSObject.finalize "); PluginAppletViewer.JavaScriptFinalize(internal); } } icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/PaxHeaders.7406/JSException.java0000644000000000000000000000013213441742745026404 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/JSException.java0000644000175000002070000001220513441742745027214 0ustar00jvanekmock00000000000000/* -*- Mode: Java; tab-width: 8; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ package netscape.javascript; /** * JSException is an exception which is thrown when JavaScript code * returns an error. */ public class JSException extends RuntimeException { public static final int EXCEPTION_TYPE_EMPTY = -1; public static final int EXCEPTION_TYPE_VOID = 0; public static final int EXCEPTION_TYPE_OBJECT = 1; public static final int EXCEPTION_TYPE_FUNCTION = 2; public static final int EXCEPTION_TYPE_STRING = 3; public static final int EXCEPTION_TYPE_NUMBER = 4; public static final int EXCEPTION_TYPE_BOOLEAN = 5; public static final int EXCEPTION_TYPE_ERROR = 6; public String filename; public int lineno; public String source; public int tokenIndex; public int wrappedExceptionType; public Object wrappedException; /** * Constructs a JSException without a detail message. * A detail message is a String that describes this particular exception. * * @deprecated Not for public use in future versions. */ @Deprecated public JSException() { super(); filename = "unknown"; lineno = 0; source = ""; tokenIndex = 0; wrappedExceptionType = EXCEPTION_TYPE_EMPTY; } /** * Constructs a JSException with a detail message. * A detail message is a String that describes this particular exception. * @param s the detail message * * @deprecated Not for public use in future versions. */ @Deprecated public JSException(String s) { super(s); filename = "unknown"; lineno = 0; source = ""; tokenIndex = 0; wrappedExceptionType = EXCEPTION_TYPE_EMPTY; } /** * Constructs a JSException with a wrapped JavaScript exception object. * This constructor needs to be public so that Java users can throw * exceptions to JS cleanly. * @param wrappedExceptionType type of exception * @param wrappedException actual exception */ public JSException(int wrappedExceptionType, Object wrappedException) { super(); this.wrappedExceptionType = wrappedExceptionType; this.wrappedException = wrappedException; } /** * Constructs a JSException with a detail message and all the * other info that usually comes with a JavaScript error. * @param s the detail message * @param filename source file where exception raised * @param lineno line where exception raised * @param source source text of exception * @param tokenIndex index on line where exception raised * * @deprecated Not for public use in future versions. */ @Deprecated public JSException(String s, String filename, int lineno, String source, int tokenIndex) { super(s); this.filename = filename; this.lineno = lineno; this.source = source; this.tokenIndex = tokenIndex; wrappedExceptionType = EXCEPTION_TYPE_EMPTY; } /** * Instance method getWrappedExceptionType returns the int mapping of the * type of the wrappedException Object. * @return type of exception */ public int getWrappedExceptionType() { return wrappedExceptionType; } /** * Instance method getWrappedException. * @return actual exception */ public Object getWrappedException() { return wrappedException; } } icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/PaxHeaders.7406/JSUtil.java0000644000000000000000000000013213441742745025363 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/JSUtil.java0000644000175000002070000000520313441742745026173 0ustar00jvanekmock00000000000000/* -*- Mode: Java; tab-width: 8; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* ** */ package netscape.javascript; import java.io.*; public class JSUtil { /* Return the stack trace of an exception or error as a String */ public static String getStackTrace(Throwable t) { ByteArrayOutputStream captureStream; PrintWriter p; captureStream = new ByteArrayOutputStream(); p = new PrintWriter(captureStream); t.printStackTrace(p); p.flush(); return captureStream.toString(); } /** * Uses package-private method JSObject.getInternalReference. * This is package-private to avoid polluting the public interface. * @param js JSObject to unbox * @return the internal reference stored by the JSObject */ public static long getJSObjectInternalReference(JSObject js) { // NB: permission is checked in JSObject return js.getInternalReference(); } }icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/PaxHeaders.7406/JSProxy.java0000644000000000000000000000013213441742745025567 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/JSProxy.java0000644000175000002070000000463313441742745026405 0ustar00jvanekmock00000000000000/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /** * The JSProxy interface allows applets and plugins to * share javascript contexts. */ package netscape.javascript; import java.applet.Applet; public interface JSProxy { Object getMember(JSObject jso, String name); Object getSlot(JSObject jso, int index); void setMember(JSObject jso, String name, Object value); void setSlot(JSObject jso, int index, Object value); void removeMember(JSObject jso, String name); Object call(JSObject jso, String methodName, Object args[]); Object eval(JSObject jso, String s); String toString(JSObject jso); JSObject getWindow(Applet applet); } icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/PaxHeaders.7406/JSObjectCreatePermission.j0000644000000000000000000000013213441742745030361 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/javascript/JSObjectCreatePermission.java0000644000175000002070000000356713441742745031674 0ustar00jvanekmock00000000000000/* JSObjectCreatePermission.java Copyright (C) 2009 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package netscape.javascript; import java.security.BasicPermission; public class JSObjectCreatePermission extends BasicPermission { public JSObjectCreatePermission() { super("JSObjectCreate"); } } icedtea-web-1.8/plugin/icedteanp/java/netscape/PaxHeaders.7406/security0000644000000000000000000000013213441742745022772 xustar0030 mtime=1552401893.056832787 30 atime=1552410887.113183443 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/security/0000755000175000002070000000000013441742745023657 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/icedteanp/java/netscape/security/PaxHeaders.7406/ForbiddenTargetException.jav0000644000000000000000000000013213441742745030473 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/security/ForbiddenTargetException.java0000644000175000002070000000372213441742745031450 0ustar00jvanekmock00000000000000/* ForbiddenTargetException.java Copyright (C) 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package netscape.security; public class ForbiddenTargetException extends RuntimeException { private static final long serialVersionUID = 1271219852541058396L; public ForbiddenTargetException() { super(); } public ForbiddenTargetException(String s) { super(s); } } icedtea-web-1.8/plugin/icedteanp/java/netscape/security/PaxHeaders.7406/PrivilegeManager.java0000644000000000000000000000013213441742745027133 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/java/netscape/security/PrivilegeManager.java0000644000175000002070000000537313441742745027753 0ustar00jvanekmock00000000000000/* PrivilegeManager.java Copyright (C) 2011 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /** * * This class does not implement any functionality and exists for backward * compatibility only. * * At one point Netscape required applets to request specific permissions to * do things. This is not longer the case with IcedTea-Web (and other modern * plug-ins). However because some old applets may still have code calling * this class, an empty stub is needed to prevent a ClassNotFoundException. * */ package netscape.security; import sun.applet.PluginDebug; public class PrivilegeManager { /** * Stub for enablePrivilege. Not used by IcedTea-Web, kept for compatibility * * @param privilege privilege to eb enabled */ public static void enablePrivilege(String privilege) { PluginDebug.debug("netscape.security.enablePrivilege stub called"); } /** * Stub for disablePrivilege. Not used by IcedTea-Web, kept for compatibility * * @param privilege privilege to be disabled */ public static void disablePrivilege(String privilege) { PluginDebug.debug("netscape.security.disablePrivilege stub called"); } } icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaScriptablePluginObject.h0000644000000000000000000000013013441742745024441 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/IcedTeaScriptablePluginObject.h0000644000175000002070000001673113441742745025263 0ustar00jvanekmock00000000000000/* IcedTeaScriptablePluginObject.h Copyright (C) 2009, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #ifndef __ICEDTEASCRIPTABLEPLUGINOBJECT_H_ #define __ICEDTEASCRIPTABLEPLUGINOBJECT_H_ #include #include #include "IcedTeaJavaRequestProcessor.h" #include "IcedTeaNPPlugin.h" /** * IcedTeaScriptablePluginObject, an extended NPObject that implements * static functions whose pointers are supplied to NPClass. */ class IcedTeaScriptablePluginObject: public NPObject { private: NPP instance; public: IcedTeaScriptablePluginObject(NPP instance); static void deAllocate(NPObject *npobj); static void invalidate(NPObject *npobj); static bool hasMethod(NPObject *npobj, NPIdentifier name_id); static bool invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args, uint32_t argCount, NPVariant *result); static bool invokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); static bool hasProperty(NPObject *npobj, NPIdentifier name_id); static bool getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result); static bool setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value); static bool removeProperty(NPObject *npobj, NPIdentifier name_id); static bool enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); static bool construct(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); }; NPObject* allocate_scriptable_jp_object(NPP npp, NPClass *aClass); class IcedTeaScriptableJavaPackageObject: public NPObject { private: NPP instance; std::string* package_name; public: IcedTeaScriptableJavaPackageObject(NPP instance); ~IcedTeaScriptableJavaPackageObject(); void setPackageName(const NPUTF8* name); std::string getPackageName(); static void deAllocate(NPObject *npobj); static void invalidate(NPObject *npobj); static bool hasMethod(NPObject *npobj, NPIdentifier name_id); static bool invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args, uint32_t argCount, NPVariant *result); static bool invokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); static bool hasProperty(NPObject *npobj, NPIdentifier name_id); static bool getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result); static bool setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value); static bool removeProperty(NPObject *npobj, NPIdentifier name_id); static bool enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count); static bool construct(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); static NPObject* get_scriptable_java_package_object(NPP instance, const NPUTF8* name); static bool is_valid_java_object(NPObject* object_ptr); }; class IcedTeaScriptableJavaObject: public NPObject { private: NPP instance; bool is_object_array; /* These may be empty if 'is_applet_instance' is true * and the object has not yet been used */ std::string class_id, instance_id; public: IcedTeaScriptableJavaObject(NPP instance) { this->instance = instance; is_object_array = false; } static void deAllocate(NPObject *npobj) { delete (IcedTeaScriptableJavaObject*)npobj; } std::string getInstanceID() { return instance_id; } std::string getClassID() { return class_id; } std::string objectKey() { return getClassID() + ":" + getInstanceID(); } static void invalidate(NPObject *npobj) { IcedTeaPluginUtilities::removeInstanceID(npobj); IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*) npobj; IcedTeaPluginUtilities::removeObjectMapping(scriptable_object->objectKey()); } static bool hasMethod(NPObject *npobj, NPIdentifier name_id); static bool invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args, uint32_t argCount, NPVariant *result); static bool invokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaObject::invokeDefault %p\n", npobj); return false; } static bool hasProperty(NPObject *npobj, NPIdentifier name_id); static bool getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result); static bool setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value); static bool removeProperty(NPObject *npobj, NPIdentifier name_id) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaObject::removeProperty %p\n", npobj); return false; } static bool enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaObject::enumerate %p\n", npobj); return false; } static bool construct(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result); /* Creates and retains a scriptable java object (intended to be called asynch.) */ static NPObject* get_scriptable_java_object(NPP instance, std::string class_id, std::string instance_id, bool isArray); }; /* Creates and retains a scriptable java object (intended to be called asynch.) */ void _createAndRetainJavaObject(void* data); #endif /* __ICEDTEASCRIPTABLEPLUGINOBJECT_H_ */ icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaNPPlugin.h0000644000000000000000000000013013441742745021537 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/IcedTeaNPPlugin.h0000644000175000002070000001335213441742745022355 0ustar00jvanekmock00000000000000/* IcedTeaNPPlugin.h Copyright (C) 2009, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #ifndef __ICEDTEANPPLUGIN_H__ #define __ICEDTEANPPLUGIN_H__ #include #include #include // GLib includes. #include #include #include "IcedTeaPluginUtils.h" #include "IcedTeaPluginRequestProcessor.h" // ITNPPluginData stores all the data associated with a single plugin // instance. A separate plugin instance is created for each // tag. For now, each plugin instance spawns its own applet viewer // process but this may need to change if we find pages containing // multiple applets that expect to be running in the same VM. struct ITNPPluginData { // A unique identifier for this plugin window. gchar* instance_id; // The parameter list string sent to Java side gchar* parameters_string; // Mutex to protect appletviewer_alive. GMutex* appletviewer_mutex; // Back-pointer to the plugin instance to which this data belongs. // This should not be freed but instead simply set to NULL. NPP owner; // The address of the plugin window. This should not be freed but // instead simply set to NULL. gpointer window_handle; // The last plugin window width sent to us by the browser. guint32 window_width; // The last plugin window height sent to us by the browser. guint32 window_height; // The source location for this instance std::string source; // If this is an actual applet instance, or a dummy instance for static calls bool is_applet_instance; ITNPPluginData() { instance_id = NULL; parameters_string = NULL; appletviewer_mutex = NULL; owner = (NPP)NULL; window_handle = NULL; window_width = 0; window_height = 0; is_applet_instance = false; } ~ITNPPluginData() { if (appletviewer_mutex) { g_mutex_free (appletviewer_mutex); } // cleanup_instance_string: g_free (instance_id); // cleanup applet tag g_free (parameters_string); } }; // Have the browser allocate a new ITNPPluginData structure. ITNPPluginData* plugin_data_new (); void plugin_data_destroy (NPP instance); NPError initialize_data_directory(); NPError start_jvm_if_needed(); // ID of plug-in thread extern pthread_t itnp_plugin_thread_id; /* Mutex around plugin async call queue ops */ extern pthread_mutex_t pluginAsyncCallMutex; /*to sync pipe to apletviewer console*/ extern pthread_mutex_t debug_pipe_lock; // debug switches extern bool debug_initiated; extern bool file_logs_initiated; extern int plugin_debug; extern bool plugin_debug_headers; extern bool plugin_debug_to_file; extern bool plugin_debug_to_streams; extern bool plugin_debug_to_system; extern bool plugin_debug_to_console; extern FILE * plugin_file_log; extern std::string plugin_file_log_name; extern gchar* debug_pipe_name; extern gboolean jvm_up; // Browser function table. extern NPNetscapeFuncs browser_functions; // messages to the java side extern MessageBus* plugin_to_java_bus; // messages from the java side extern MessageBus* java_to_plugin_bus; // internal messages (e.g ones that need processing in main thread) //extern MessageBus* internal_bus; // subscribes to plugin_to_java_bus and sends messages over the link extern JavaMessageSender java_request_processor; // processes requests made to the plugin extern PluginRequestProcessor plugin_request_processor; /* Given an instance pointer, return its id */ void get_instance_from_id(int id, NPP& instance); /* Given an instance id, return its pointer */ int get_id_from_instance(NPP instance); /* Sends a message to the appletviewer */ void plugin_send_message_to_appletviewer(gchar const* message); /*this method is not logging, do not add \n and is using different pipe*/ void plugin_send_message_to_appletviewer_console(gchar const* message); void flush_plugin_send_message_to_appletviewer_console(); /* Returns an appropriate (package/object) scriptable npobject */ NPObject* get_scriptable_object(NPP instance); /* Creates a new scriptable plugin object and returns it */ NPObject* allocate_scriptable_object(NPP npp, NPClass *aClass); NPError plugin_start_appletviewer (ITNPPluginData* data); #endif /* __ICEDTEANPPLUGIN_H__ */ icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaParseProperties.h0000644000000000000000000000013213441742745023174 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/IcedTeaParseProperties.h0000644000175000002070000000453613441742745024014 0ustar00jvanekmock00000000000000/* IcedTeaPluginUtils.h Copyright (C) 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /** * Utility classes for parsing values from properties files */ #include #include //public api std::string user_properties_file(); std::string get_log_dir(); bool find_system_config_file(std::string& dest); bool find_custom_jre(std::string& dest); bool read_deploy_property_value(std::string property, std::string& dest); bool is_debug_on(); bool is_debug_header_on(); bool is_logging_to_file(); bool is_logging_to_stds(); bool is_logging_to_system(); bool is_java_console_enabled(); //half public api extern const std::string default_file_ITW_deploy_props_name; extern const std::string default_itw_log_dir_name; extern const std::string custom_jre_key; //end of public api icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaParseProperties.cc0000644000000000000000000000013213441742745023332 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/IcedTeaParseProperties.cc0000644000175000002070000002366513441742745024156 0ustar00jvanekmock00000000000000/* IcedTeaRunnable.cc Copyright (C) 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include #include #include #include #include #include #include #include #include #include #include "IcedTeaPluginUtils.h" #include "IcedTeaNPPlugin.h" #include "IcedTeaParseProperties.h" /* The public api is nearly impossible to test due to "hardcoded paths" All public methods have theirs equivalents wit set-up-able files, and those are tested. */ using namespace std; //private api void remove_all_spaces(string& str); bool get_property_value(string c, string& dest); bool starts_with(string c1, string c2); string user_properties_file(); string main_properties_file(); string default_java_properties_file(); //for passing three dummy files bool find_system_config_file(string main_file, string custom_jre_file, bool usecustom_jre, string default_java_file, string& dest); bool find_property(string filename, string property, string& dest); //for passing two dummy files bool read_deploy_property_value(string user_file, string system_file, bool usesystem_file, string property, string& dest); //for passing two dummy files bool find_custom_jre(string user_file, string main_file,string& dest); //end of non-public IcedTeaParseProperties api const std::string default_file_ITW_deploy_props_name = "deployment.properties"; const std::string default_itw_log_dir_name = "log"; const std::string custom_jre_key = "deployment.jre.dir"; void remove_all_spaces(string& str) { for(int i=0; ipw_dir)+"/.icedtea/"+default_file_ITW_deploy_props_name; //exists? then itw was not yet migrated. Use it if (IcedTeaPluginUtilities::file_exists(old_name)) { PLUGIN_ERROR("IcedTea-Web plugin is using out-dated configuration\n"); return old_name; } //we are probably on XDG specification now //is specified custom value? if (getenv ("XDG_CONFIG_HOME") != NULL){ return string(getenv ("XDG_CONFIG_HOME"))+"/icedtea-web/"+default_file_ITW_deploy_props_name; } //if not then use default return string(mypasswd->pw_dir)+"/.config/icedtea-web/"+default_file_ITW_deploy_props_name; } string get_log_dir(){ string value; if (!read_deploy_property_value("deployment.user.logdir", value)) { string config_dir; if (getenv ("XDG_CONFIG_HOME") != NULL){ config_dir = string(getenv("XDG_CONFIG_HOME")); } else { int myuid = getuid(); struct passwd *mypasswd = getpwuid(myuid); config_dir = string(mypasswd->pw_dir) + "/.config"; } string itw_dir = config_dir+"/icedtea-web"; string log_dir = itw_dir+"/"+default_itw_log_dir_name; bool created_config = IcedTeaPluginUtilities::create_dir(itw_dir); bool created_log = IcedTeaPluginUtilities::create_dir(log_dir); if (!created_config || !created_log){ PLUGIN_ERROR("IcedTea-Web log directory creation failed. IcedTea-Web may fail to work!"); } return log_dir; } return value; } string main_properties_file(){ return "/etc/.java/deployment/"+default_file_ITW_deploy_props_name; } string default_java_properties_file(){ return ICEDTEA_WEB_JRE "/lib/"+default_file_ITW_deploy_props_name; } /* this is the same search done by icedtea-web settings: try the main file in /etc/.java/deployment if found, then return this file try to find setUp jre if found, then try if this file exists and end if no jre custom jvm is set, then tries default jre if its deploy file exists, then return not found otherwise*/ bool find_system_config_file(string& dest){ string jdest; bool found = find_custom_jre(jdest); if (found) { jdest = jdest + "/lib/"+default_file_ITW_deploy_props_name; } return find_system_config_file(main_properties_file(), jdest, found, default_java_properties_file(), dest); } bool is_java_console_enabled(){ string value; if (!read_deploy_property_value("deployment.console.startup.mode", value)) { return true; } if (value == "DISABLE") { return false; } else { return true; } } bool read_bool_property(string key, bool defaultValue){ string value; if (!read_deploy_property_value(key, value)) { return defaultValue; } if (value == "true") { return true; } else { return false; } } bool is_debug_on(){ return read_bool_property("deployment.log",false); } bool is_debug_header_on(){ return read_bool_property("deployment.log.headers",false); } bool is_logging_to_file(){ return read_bool_property("deployment.log.file",false); } bool is_logging_to_stds(){ return read_bool_property("deployment.log.stdstreams",true); } bool is_logging_to_system(){ return read_bool_property("deployment.log.system",true); } //abstraction for testing purposes bool find_system_config_file(string main_file, string custom_jre_file, bool usecustom_jre, string default_java_file, string& dest){ if (IcedTeaPluginUtilities::file_exists(main_file)) { dest = main_file; return true; } else { if (usecustom_jre){ if(IcedTeaPluginUtilities::file_exists(custom_jre_file) ) { dest = custom_jre_file; return true; } } else { if(IcedTeaPluginUtilities::file_exists(default_java_file)) { dest = default_java_file; return true; } } } return false; //nothing of above found } //Returns whether property was found, if found stores result in 'dest' bool find_property(string filename, string property, string& dest){ string property_matcher(property); IcedTeaPluginUtilities::trim( property_matcher); property_matcher= property_matcher+"="; ifstream input( filename.c_str() ); for( string line; getline( input, line ); ){ /* read a line */ string copy = line; //java tolerates spaces around = char, remove them for matching remove_all_spaces(copy); if (starts_with(copy, property_matcher)) { //provide non-spaced value, trimming is done in get_property_value get_property_value(line, dest); return true; } } return false; } /* this is reimplementation of itw-settings operations first check in user's settings, if found, return then check in global file (see the magic of find_system_config_file)*/ bool read_deploy_property_value(string property, string& dest){ string futurefile; bool found = find_system_config_file(futurefile); return read_deploy_property_value(user_properties_file(), futurefile, found, property, dest); } //abstraction for testing purposes bool read_deploy_property_value(string user_file, string system_file, bool usesystem_file, string property, string& dest){ //is it in user's file? bool found = find_property(user_file, property, dest); if (found) { return true; } //is it in global file? if (usesystem_file) { return find_property(system_file, property, dest); } return false; } //This is different from common get property, as it is avoiding to search in *java* //properties files bool find_custom_jre(string& dest){ return find_custom_jre(user_properties_file(), main_properties_file(), dest); } //abstraction for testing purposes bool find_custom_jre(string user_file, string main_file,string& dest){ string key = custom_jre_key; if(IcedTeaPluginUtilities::file_exists(user_file)) { bool a = find_property(user_file, key, dest); if (a) { return true; } } if(IcedTeaPluginUtilities::file_exists(main_file)) { return find_property(main_file, key, dest); } return false; } int test_main(void){ cout << ("user's settings file\n"); cout << user_properties_file(); cout << ("\nmain settings file:\n"); cout << (main_properties_file()); cout << ("\njava settings file \n"); cout << (default_java_properties_file()); cout << ("\nsystem config file\n"); string a1; find_system_config_file(a1); cout << a1; cout << ("\ncustom jre\n"); string a2; find_custom_jre(a2); cout << a2; cout << ("\nsome custom property\n"); string a3; read_deploy_property_value("deployment.security.level", a3); cout << a3; cout << ("\n"); return 0; } icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaScriptablePluginObject.cc0000644000000000000000000000013213441742745024601 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/IcedTeaScriptablePluginObject.cc0000644000175000002070000007026213441742745025420 0ustar00jvanekmock00000000000000/* IcedTeaScriptablePluginObject.cc Copyright (C) 2009, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include "IcedTeaScriptablePluginObject.h" IcedTeaScriptablePluginObject::IcedTeaScriptablePluginObject(NPP instance) { this->instance = instance; IcedTeaPluginUtilities::storeInstanceID(this, instance); } void IcedTeaScriptablePluginObject::deAllocate(NPObject *npobj) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::deAllocate %p\n", npobj); } void IcedTeaScriptablePluginObject::invalidate(NPObject *npobj) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::invalidate %p\n", npobj); } bool IcedTeaScriptablePluginObject::hasMethod(NPObject *npobj, NPIdentifier name_id) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::hasMethod %p\n", npobj); return false; } bool IcedTeaScriptablePluginObject::invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args, uint32_t argCount,NPVariant *result) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::invoke %p\n", npobj); return false; } bool IcedTeaScriptablePluginObject::invokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::invokeDefault %p\n", npobj); return false; } bool IcedTeaScriptablePluginObject::hasProperty(NPObject *npobj, NPIdentifier name_id) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::hasProperty %p\n", npobj); return false; } bool IcedTeaScriptablePluginObject::getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result) { // Package request? if (IcedTeaPluginUtilities::NPIdentifierAsString(name_id) == "java") { //NPObject* obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(getInstanceFromMemberPtr(npobj), name); //OBJECT_TO_NPVARIANT(obj, *result); //PLUGIN_ERROR ("Filling variant %p with object %p\n", result); } return false; } bool IcedTeaScriptablePluginObject::setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::setProperty %p\n", npobj); return false; } bool IcedTeaScriptablePluginObject::removeProperty(NPObject *npobj, NPIdentifier name_id) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::removeProperty %p\n", npobj); return false; } bool IcedTeaScriptablePluginObject::enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::enumerate %p\n", npobj); return false; } bool IcedTeaScriptablePluginObject::construct(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptablePluginObject::construct %p\n", npobj); return false; } NPObject* allocate_scriptable_jp_object(NPP npp, NPClass *aClass) { PLUGIN_DEBUG("Allocating new scriptable Java Package object\n"); return new IcedTeaScriptableJavaPackageObject(npp); } static NPClass scriptable_plugin_object_class() { NPClass np_class; np_class.structVersion = NP_CLASS_STRUCT_VERSION; np_class.allocate = allocate_scriptable_jp_object; np_class.deallocate = IcedTeaScriptableJavaPackageObject::deAllocate; np_class.invalidate = IcedTeaScriptableJavaPackageObject::invalidate; np_class.hasMethod = IcedTeaScriptableJavaPackageObject::hasMethod; np_class.invoke = IcedTeaScriptableJavaPackageObject::invoke; np_class.invokeDefault = IcedTeaScriptableJavaPackageObject::invokeDefault; np_class.hasProperty = IcedTeaScriptableJavaPackageObject::hasProperty; np_class.getProperty = IcedTeaScriptableJavaPackageObject::getProperty; np_class.setProperty = IcedTeaScriptableJavaPackageObject::setProperty; np_class.removeProperty = IcedTeaScriptableJavaPackageObject::removeProperty; np_class.enumerate = IcedTeaScriptableJavaPackageObject::enumerate; np_class.construct = IcedTeaScriptableJavaPackageObject::construct; return np_class; } NPObject* IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(NPP instance, const NPUTF8* name) { /* Shared NPClass instance for IcedTeaScriptablePluginObject */ static NPClass np_class = scriptable_plugin_object_class(); NPObject* scriptable_object = browser_functions.createobject(instance, &np_class); PLUGIN_DEBUG("Returning new scriptable package class: %p from instance %p with name %s\n", scriptable_object, instance, name); ((IcedTeaScriptableJavaPackageObject*) scriptable_object)->setPackageName(name); IcedTeaPluginUtilities::storeInstanceID(scriptable_object, instance); return scriptable_object; } IcedTeaScriptableJavaPackageObject::IcedTeaScriptableJavaPackageObject(NPP instance) { PLUGIN_DEBUG("Constructing new scriptable java package object\n"); this->instance = instance; this->package_name = new std::string(); } IcedTeaScriptableJavaPackageObject::~IcedTeaScriptableJavaPackageObject() { delete this->package_name; } void IcedTeaScriptableJavaPackageObject::setPackageName(const NPUTF8* name) { this->package_name->assign(name); } std::string IcedTeaScriptableJavaPackageObject::getPackageName() { return *this->package_name; } void IcedTeaScriptableJavaPackageObject::deAllocate(NPObject *npobj) { delete (IcedTeaScriptableJavaPackageObject*)npobj; } void IcedTeaScriptableJavaPackageObject::invalidate(NPObject *npobj) { // nothing to do for these } bool IcedTeaScriptableJavaPackageObject::hasMethod(NPObject *npobj, NPIdentifier name_id) { // Silly caller. Methods are for objects! return false; } bool IcedTeaScriptableJavaPackageObject::invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args, uint32_t argCount,NPVariant *result) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::invoke %p\n", npobj); return false; } bool IcedTeaScriptableJavaPackageObject::invokeDefault(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::invokeDefault %p\n", npobj); return false; } bool IcedTeaScriptableJavaPackageObject::hasProperty(NPObject *npobj, NPIdentifier name_id) { std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id); PLUGIN_DEBUG("IcedTeaScriptableJavaPackageObject::hasProperty %s\n", name.c_str()); bool hasProperty = false; JavaResultData* java_result; JavaRequestProcessor* java_request = new JavaRequestProcessor(); NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); int plugin_instance_id = get_id_from_instance(instance); IcedTeaScriptableJavaPackageObject* scriptable_obj = (IcedTeaScriptableJavaPackageObject*)npobj; PLUGIN_DEBUG("Object package name: \"%s\"\n", scriptable_obj->getPackageName().c_str()); // "^java" is always a package if (scriptable_obj->getPackageName().empty() && (name == "java" || name == "javax")) { return true; } std::string property_name = scriptable_obj->getPackageName(); if (!property_name.empty()) property_name += "."; property_name += name; PLUGIN_DEBUG("Looking for name \"%s\"\n", property_name.c_str()); java_result = java_request->hasPackage(plugin_instance_id, property_name); if (!java_result->error_occurred && java_result->return_identifier != 0) hasProperty = true; // No such package. Do we have a class with that name? if (!hasProperty) { java_result = java_request->findClass(plugin_instance_id, property_name); } if (java_result->return_identifier != 0) hasProperty = true; delete java_request; return hasProperty; } bool IcedTeaScriptableJavaPackageObject::getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result) { std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id); PLUGIN_DEBUG("IcedTeaScriptableJavaPackageObject::getProperty %s\n", name.c_str()); if (!browser_functions.identifierisstring(name_id)) return false; bool isPropertyClass = false; JavaResultData* java_result; JavaRequestProcessor java_request = JavaRequestProcessor(); NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); int plugin_instance_id = get_id_from_instance(instance); IcedTeaScriptableJavaPackageObject* scriptable_obj = (IcedTeaScriptableJavaPackageObject*)npobj; std::string property_name = scriptable_obj->getPackageName(); if (!property_name.empty()) property_name += "."; property_name += name; java_result = java_request.findClass(plugin_instance_id, property_name); isPropertyClass = (java_result->return_identifier == 0); //NPIdentifier property = browser_functions.getstringidentifier(property_name.c_str()); NPObject* obj; if (isPropertyClass) { PLUGIN_DEBUG("Returning package object\n"); obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object( IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj), property_name.c_str()); } else { PLUGIN_DEBUG("Returning Java object\n"); obj = IcedTeaScriptableJavaObject::get_scriptable_java_object( IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj), *(java_result->return_string), "0", false); } OBJECT_TO_NPVARIANT(obj, *result); return true; } bool IcedTeaScriptableJavaPackageObject::setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value) { // Can't be going around setting properties on namespaces.. that's madness! return false; } bool IcedTeaScriptableJavaPackageObject::removeProperty(NPObject *npobj, NPIdentifier name_id) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::removeProperty %p\n", npobj); return false; } bool IcedTeaScriptableJavaPackageObject::enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::enumerate %p\n", npobj); return false; } bool IcedTeaScriptableJavaPackageObject::construct(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { PLUGIN_ERROR ("** Unimplemented: IcedTeaScriptableJavaPackageObject::construct %p\n", npobj); return false; } NPObject* allocate_scriptable_java_object(NPP npp, NPClass *aClass) { PLUGIN_DEBUG("Allocating new scriptable Java object\n"); return new IcedTeaScriptableJavaObject(npp); } static NPClass scriptable_java_package_object_class() { NPClass np_class; np_class.structVersion = NP_CLASS_STRUCT_VERSION; np_class.allocate = allocate_scriptable_java_object; np_class.deallocate = IcedTeaScriptableJavaObject::deAllocate; np_class.invalidate = IcedTeaScriptableJavaObject::invalidate; np_class.hasMethod = IcedTeaScriptableJavaObject::hasMethod; np_class.invoke = IcedTeaScriptableJavaObject::invoke; np_class.invokeDefault = IcedTeaScriptableJavaObject::invokeDefault; np_class.hasProperty = IcedTeaScriptableJavaObject::hasProperty; np_class.getProperty = IcedTeaScriptableJavaObject::getProperty; np_class.setProperty = IcedTeaScriptableJavaObject::setProperty; np_class.removeProperty = IcedTeaScriptableJavaObject::removeProperty; np_class.enumerate = IcedTeaScriptableJavaObject::enumerate; np_class.construct = IcedTeaScriptableJavaObject::construct; return np_class; } NPObject* IcedTeaScriptableJavaObject::get_scriptable_java_object(NPP instance, std::string class_id, std::string instance_id, bool isArray) { /* Shared NPClass instance for IcedTeaScriptablePluginObject */ static NPClass np_class = scriptable_java_package_object_class(); std::string obj_key = class_id + ":" + instance_id; PLUGIN_DEBUG("get_scriptable_java_object searching for %s...\n", obj_key.c_str()); IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*) IcedTeaPluginUtilities::getNPObjectFromJavaKey(obj_key); if (scriptable_object != NULL) { PLUGIN_DEBUG("Returning existing object %p\n", scriptable_object); browser_functions.retainobject(scriptable_object); return scriptable_object; } // try to create normally scriptable_object = (IcedTeaScriptableJavaObject*)browser_functions.createobject(instance, &np_class); // didn't work? try creating asynch if (!scriptable_object) { AsyncCallThreadData thread_data = AsyncCallThreadData(); thread_data.result_ready = false; thread_data.parameters = std::vector(); thread_data.result = std::string(); thread_data.parameters.push_back(instance); thread_data.parameters.push_back(&np_class); thread_data.parameters.push_back(&scriptable_object); IcedTeaPluginUtilities::callAndWaitForResult(instance, &_createAndRetainJavaObject, &thread_data); } else { // Else retain object and continue browser_functions.retainobject(scriptable_object); } PLUGIN_DEBUG("Constructed new Java Object with classid=%s, instanceid=%s, isArray=%d and scriptable_object=%p\n", class_id.c_str(), instance_id.c_str(), isArray, scriptable_object); scriptable_object->class_id = class_id; scriptable_object->is_object_array = isArray; if (instance_id != "0") scriptable_object->instance_id = instance_id; IcedTeaPluginUtilities::storeInstanceID(scriptable_object, instance); IcedTeaPluginUtilities::storeObjectMapping(obj_key, scriptable_object); PLUGIN_DEBUG("Inserting into object_map key %s->%p\n", obj_key.c_str(), scriptable_object); return scriptable_object; } /* Creates and retains a scriptable java object (intended to be called asynch.) */ void _createAndRetainJavaObject(void* data) { PLUGIN_DEBUG("Asynchronously creating/retaining object ...\n"); std::vector parameters = ((AsyncCallThreadData*) data)->parameters; NPP instance = (NPP) parameters.at(0); NPClass* np_class = (NPClass*) parameters.at(1); NPObject** scriptable_object = (NPObject**) parameters.at(2); *scriptable_object = browser_functions.createobject(instance, np_class); browser_functions.retainobject(*scriptable_object); ((AsyncCallThreadData*) data)->result_ready = true; } bool IcedTeaScriptableJavaPackageObject::is_valid_java_object(NPObject* object_ptr) { return IcedTeaPluginUtilities::getInstanceFromMemberPtr(object_ptr) != NULL; } bool IcedTeaScriptableJavaObject::hasMethod(NPObject *npobj, NPIdentifier name_id) { std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id); IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*) npobj; PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasMethod %s (ival=%d)\n", name.c_str(), browser_functions.intfromidentifier(name_id)); bool hasMethod = false; // If object is an array and requested "method" may be a number, check for it first if ( !scriptable_object->is_object_array || (browser_functions.intfromidentifier(name_id) < 0)) { if (!browser_functions.identifierisstring(name_id)) return false; JavaResultData* java_result; JavaRequestProcessor java_request = JavaRequestProcessor(); java_result = java_request.hasMethod(scriptable_object->class_id, name); hasMethod = java_result->return_identifier != 0; } PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasMethod returning %d\n", hasMethod); return hasMethod; } bool IcedTeaScriptableJavaObject::invoke(NPObject *npobj, NPIdentifier name_id, const NPVariant *args, uint32_t argCount, NPVariant *result) { std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id); // Extract arg type array PLUGIN_DEBUG("IcedTeaScriptableJavaObject::invoke %s. Args follow.\n", name.c_str()); for (int i=0; i < argCount; i++) { IcedTeaPluginUtilities::printNPVariant(args[i]); } JavaResultData* java_result; JavaRequestProcessor java_request = JavaRequestProcessor(); IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj; std::string instance_id = scriptable_object->instance_id; std::string class_id = scriptable_object->class_id; NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); // First, load the arguments into the java-side table std::string id = std::string(); std::vector arg_ids = std::vector(); for (int i=0; i < argCount; i++) { id.clear(); createJavaObjectFromVariant(instance, args[i], &id); if (id == "-1") { PLUGIN_ERROR("Unable to create arguments on Java side\n"); return false; } arg_ids.push_back(id); } if (instance_id.length() == 0) // Static { PLUGIN_DEBUG("Calling static method\n"); java_result = java_request.callStaticMethod( IcedTeaPluginUtilities::getSourceFromInstance(instance), scriptable_object->class_id, name, arg_ids); } else { PLUGIN_DEBUG("Calling method normally\n"); java_result = java_request.callMethod( IcedTeaPluginUtilities::getSourceFromInstance(instance), scriptable_object->instance_id, name, arg_ids); } if (java_result->error_occurred) { browser_functions.setexception(npobj, java_result->error_msg->c_str()); return false; } PLUGIN_DEBUG("IcedTeaScriptableJavaObject::invoke converting and returning.\n"); return IcedTeaPluginUtilities::javaResultToNPVariant(instance, java_result->return_string, result); } bool IcedTeaScriptableJavaObject::hasProperty(NPObject *npobj, NPIdentifier name_id) { std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id); PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasProperty %s (ival=%d)\n", name.c_str(), browser_functions.intfromidentifier(name_id)); bool hasProperty = false; IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj; // If it is an array, only length and indexes are valid if (scriptable_object->is_object_array) { if (browser_functions.intfromidentifier(name_id) >= 0 || name == "length") hasProperty = true; } else { if (!browser_functions.identifierisstring(name_id)) return false; if (name == "Packages") { hasProperty = true; } else { JavaResultData* java_result; JavaRequestProcessor java_request = JavaRequestProcessor(); java_result = java_request.hasField(scriptable_object->class_id, name); hasProperty = java_result->return_identifier != 0; } } PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasProperty returning %d\n", hasProperty); return hasProperty; } bool IcedTeaScriptableJavaObject::getProperty(NPObject *npobj, NPIdentifier name_id, NPVariant *result) { std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id); bool is_string_id = browser_functions.identifierisstring(name_id); PLUGIN_DEBUG("IcedTeaScriptableJavaObject::getProperty %s (ival=%d)\n", name.c_str(), browser_functions.intfromidentifier(name_id)); JavaResultData* java_result; JavaRequestProcessor java_request = JavaRequestProcessor(); IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj; std::string instance_id = scriptable_object->getInstanceID(); std::string class_id = scriptable_object->getClassID(); NPP instance = scriptable_object->instance; if (instance_id.length() > 0) // Could be an array or a simple object { // If array and requesting length if ( scriptable_object->is_object_array && name == "length") { java_result = java_request.getArrayLength(instance_id); } else if ( scriptable_object->is_object_array && browser_functions.intfromidentifier(name_id) >= 0) // else if array and requesting index { java_result = java_request.getArrayLength(instance_id); if (java_result->error_occurred) { PLUGIN_ERROR("ERROR: Couldn't fetch array length\n"); return false; } int length = atoi(java_result->return_string->c_str()); // Access beyond size? if (browser_functions.intfromidentifier(name_id) >= length) { VOID_TO_NPVARIANT(*result); return true; } std::string index = std::string(); IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name_id), &index); java_result = java_request.getSlot(instance_id, index); } else // Everything else { if (!is_string_id) { return false; } if (name == "Packages") { NPObject* pkgObject = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(instance, ""); OBJECT_TO_NPVARIANT(pkgObject, *result); return true; } java_result = java_request.getField( IcedTeaPluginUtilities::getSourceFromInstance(instance), class_id, instance_id, name); } } else { if (!is_string_id) { return false; } java_result = java_request.getStaticField( IcedTeaPluginUtilities::getSourceFromInstance(instance), class_id, name); } if (java_result->error_occurred) { return false; } PLUGIN_DEBUG("IcedTeaScriptableJavaObject::getProperty converting and returning.\n"); return IcedTeaPluginUtilities::javaResultToNPVariant(instance, java_result->return_string, result); } bool IcedTeaScriptableJavaObject::setProperty(NPObject *npobj, NPIdentifier name_id, const NPVariant *value) { std::string name = IcedTeaPluginUtilities::NPIdentifierAsString(name_id); PLUGIN_DEBUG("IcedTeaScriptableJavaObject::setProperty %s (ival=%d) to:\n", name.c_str(), browser_functions.intfromidentifier(name_id)); IcedTeaPluginUtilities::printNPVariant(*value); JavaResultData* java_result; JavaRequestProcessor java_request = JavaRequestProcessor(); IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj; std::string instance_id = scriptable_object->getInstanceID(); std::string class_id = scriptable_object->getClassID(); NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); if (instance_id.length() > 0) // Could be an array or a simple object { // If array if (scriptable_object->is_object_array && name == "length") { PLUGIN_ERROR("ERROR: Array length is not a modifiable property\n"); return false; } else if ( scriptable_object->is_object_array && browser_functions.intfromidentifier(name_id) >= 0) // else if array and requesting index { java_result = java_request.getArrayLength(instance_id); if (java_result->error_occurred) { PLUGIN_ERROR("ERROR: Couldn't fetch array length\n"); return false; } int length = atoi(java_result->return_string->c_str()); // Access beyond size? if (browser_functions.intfromidentifier(name_id) >= length) { return true; } std::string index = std::string(); IcedTeaPluginUtilities::itoa(browser_functions.intfromidentifier(name_id), &index); std::string value_id = std::string(); createJavaObjectFromVariant(instance, *value, &value_id); java_result = java_request.setSlot(instance_id, index, value_id); } else // Everything else { std::string value_id = std::string(); createJavaObjectFromVariant(instance, *value, &value_id); java_result = java_request.setField( IcedTeaPluginUtilities::getSourceFromInstance(instance), class_id, instance_id, name, value_id); } } else { std::string value_id = std::string(); createJavaObjectFromVariant(instance, *value, &value_id); java_result = java_request.setStaticField( IcedTeaPluginUtilities::getSourceFromInstance(instance), class_id, name, value_id); } if (java_result->error_occurred) { return false; } PLUGIN_DEBUG("IcedTeaScriptableJavaObject::setProperty returning.\n"); return true; } bool IcedTeaScriptableJavaObject::construct(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { IcedTeaScriptableJavaObject* scriptable_object = (IcedTeaScriptableJavaObject*)npobj; // Extract arg type array PLUGIN_DEBUG("IcedTeaScriptableJavaObject::construct %s. Args follow.\n", scriptable_object->getClassID().c_str()); for (int i=0; i < argCount; i++) { IcedTeaPluginUtilities::printNPVariant(args[i]); } JavaResultData* java_result; JavaRequestProcessor java_request = JavaRequestProcessor(); NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj); // First, load the arguments into the java-side table std::string id = std::string(); std::vector arg_ids = std::vector(); for (int i=0; i < argCount; i++) { id.clear(); createJavaObjectFromVariant(instance, args[i], &id); if (id == "0") { browser_functions.setexception(npobj, "Unable to create argument on Java side"); return false; } arg_ids.push_back(id); } java_result = java_request.newObject( IcedTeaPluginUtilities::getSourceFromInstance(instance), scriptable_object->class_id, arg_ids); if (java_result->error_occurred) { browser_functions.setexception(npobj, java_result->error_msg->c_str()); return false; } std::string return_obj_instance_id = *java_result->return_string; std::string return_obj_class_id = scriptable_object->class_id; NPObject* obj = IcedTeaScriptableJavaObject::get_scriptable_java_object( IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj), return_obj_class_id, return_obj_instance_id, false); OBJECT_TO_NPVARIANT(obj, *result); PLUGIN_DEBUG("IcedTeaScriptableJavaObject::construct returning.\n"); return true; } icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaNPPlugin.cc0000644000000000000000000000013213441742745021677 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/IcedTeaNPPlugin.cc0000644000175000002070000023310213441742745022510 0ustar00jvanekmock00000000000000/* IcedTeaNPPlugin.cc -- web browser plugin to execute Java applets Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc. Copyright (C) 2009, 2010 Red Hat This file is part of GNU Classpath. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ // System includes. #include #include #include #include #include #include #include #include #include #include #include #include #include #include //IcedTea-plugin includes #include "IcedTeaPluginUtils.h" #include "IcedTeaParseProperties.h" // Liveconnect extension #include "IcedTeaScriptablePluginObject.h" #include "IcedTeaNPPlugin.h" // Plugin information passed to about:plugins. #define PLUGIN_FULL_NAME PLUGIN_NAME " (using " PLUGIN_VERSION ")" #define PLUGIN_DESC "The " PLUGIN_NAME " executes Java applets." #ifdef HAVE_JAVA9 #define JPI_VERSION "1.9.0_" JDK_UPDATE_VERSION #define PLUGIN_APPLET_MIME_DESC \ "application/x-java-applet;version=1.8:class,jar:IcedTea;"\ "application/x-java-applet;version=1.9:class,jar:IcedTea;" #define PLUGIN_BEAN_MIME_DESC \ "application/x-java-bean;version=1.8:class,jar:IcedTea;" \ "application/x-java-bean;version=1.9:class,jar:IcedTea;" #elif HAVE_JAVA8 #define JPI_VERSION "1.8.0_" JDK_UPDATE_VERSION #define PLUGIN_APPLET_MIME_DESC \ "application/x-java-applet;version=1.8:class,jar:IcedTea;" #define PLUGIN_BEAN_MIME_DESC \ "application/x-java-bean;version=1.8:class,jar:IcedTea;" #else #define JPI_VERSION "1.7.0_" JDK_UPDATE_VERSION #define PLUGIN_APPLET_MIME_DESC #define PLUGIN_BEAN_MIME_DESC #endif #define PLUGIN_MIME_DESC \ "application/x-java-vm:class,jar:IcedTea;" \ "application/x-java-applet:class,jar:IcedTea;" \ "application/x-java-applet;version=1.1:class,jar:IcedTea;" \ "application/x-java-applet;version=1.1.1:class,jar:IcedTea;" \ "application/x-java-applet;version=1.1.2:class,jar:IcedTea;" \ "application/x-java-applet;version=1.1.3:class,jar:IcedTea;" \ "application/x-java-applet;version=1.2:class,jar:IcedTea;" \ "application/x-java-applet;version=1.2.1:class,jar:IcedTea;" \ "application/x-java-applet;version=1.2.2:class,jar:IcedTea;" \ "application/x-java-applet;version=1.3:class,jar:IcedTea;" \ "application/x-java-applet;version=1.3.1:class,jar:IcedTea;" \ "application/x-java-applet;version=1.4:class,jar:IcedTea;" \ "application/x-java-applet;version=1.4.1:class,jar:IcedTea;" \ "application/x-java-applet;version=1.4.2:class,jar:IcedTea;" \ "application/x-java-applet;version=1.5:class,jar:IcedTea;" \ "application/x-java-applet;version=1.6:class,jar:IcedTea;" \ "application/x-java-applet;version=1.7:class,jar:IcedTea;" \ "application/x-java-applet;version=1.8:class,jar:IcedTea;" \ PLUGIN_APPLET_MIME_DESC \ "application/x-java-applet;jpi-version=" JPI_VERSION ":class,jar:IcedTea;" \ "application/x-java-bean:class,jar:IcedTea;" \ "application/x-java-bean;version=1.1:class,jar:IcedTea;" \ "application/x-java-bean;version=1.1.1:class,jar:IcedTea;" \ "application/x-java-bean;version=1.1.2:class,jar:IcedTea;" \ "application/x-java-bean;version=1.1.3:class,jar:IcedTea;" \ "application/x-java-bean;version=1.2:class,jar:IcedTea;" \ "application/x-java-bean;version=1.2.1:class,jar:IcedTea;" \ "application/x-java-bean;version=1.2.2:class,jar:IcedTea;" \ "application/x-java-bean;version=1.3:class,jar:IcedTea;" \ "application/x-java-bean;version=1.3.1:class,jar:IcedTea;" \ "application/x-java-bean;version=1.4:class,jar:IcedTea;" \ "application/x-java-bean;version=1.4.1:class,jar:IcedTea;" \ "application/x-java-bean;version=1.4.2:class,jar:IcedTea;" \ "application/x-java-bean;version=1.5:class,jar:IcedTea;" \ "application/x-java-bean;version=1.6:class,jar:IcedTea;" \ "application/x-java-bean;version=1.7:class,jar:IcedTea;" \ "application/x-java-bean;version=1.8:class,jar:IcedTea;" \ PLUGIN_BEAN_MIME_DESC \ "application/x-java-bean;jpi-version=" JPI_VERSION ":class,jar:IcedTea;" \ "application/x-java-vm-npruntime::IcedTea;" #define PLUGIN_URL NS_INLINE_PLUGIN_CONTRACTID_PREFIX NS_JVM_MIME_TYPE #define PLUGIN_MIME_TYPE "application/x-java-vm" #define PLUGIN_FILE_EXTS "class,jar,zip" #define PLUGIN_MIME_COUNT 1 #define FAILURE_MESSAGE "icedteanp plugin error: Failed to run %s." \ " For more detail rerun \"firefox -g\" in a terminal window." // Data directory for plugin. static std::string data_directory; static DIR *data_directory_descriptor; // Fully-qualified appletviewer default executable and rt.jar static const char* appletviewer_default_executable = ICEDTEA_WEB_JRE "/bin/java"; static const char* appletviewer_default_rtjar = ICEDTEA_WEB_JRE "/lib/rt.jar"; static const char* appletviewer_default_jfxrtjar = ICEDTEA_WEB_JRE "/lib/jfxrt.jar"; static const char* appletviewer_default_nashonrjar = ICEDTEA_WEB_JRE "/lib/ext/nashorn.jar"; //javaws name and binary static const char* javaws_bin_property = "-Dicedtea-web.bin.location=" JAVAWS_BIN; static const char* javaws_name_property = "-Dicedtea-web.bin.name=" JAVAWS_NAME; // Applet viewer input channel (needs to be static because it is used in plugin_in_pipe_callback) static GIOChannel* in_from_appletviewer = NULL; // Applet viewer input pipe name. gchar* in_pipe_name; // Applet viewer input watch source. gint in_watch_source; // Applet viewer output pipe name. gchar* out_pipe_name; // Applet viewer debug pipe name. gchar* debug_pipe_name = NULL; // Applet viewer output watch source. gint out_watch_source; // Thread ID of plug-in thread pthread_t itnp_plugin_thread_id; // Mutex to lock async call queue pthread_mutex_t pluginAsyncCallMutex; /*to sync pipe to apletviewer console*/ pthread_mutex_t debug_pipe_lock = PTHREAD_MUTEX_INITIALIZER; // Applet viewer output channel. GIOChannel* out_to_appletviewer; // Applet viewer debug channel. GIOChannel* debug_to_appletviewer = NULL; // Tracks jvm status gboolean jvm_up = FALSE; // Keeps track of initialization. NP_Initialize should only be // called once. gboolean initialized = false; int javaVersion = 0; // browser functions into mozilla NPNetscapeFuncs browser_functions; // Various message buses carrying information to/from Java, and internally MessageBus* plugin_to_java_bus; MessageBus* java_to_plugin_bus; //MessageBus* internal_bus = new MessageBus(); // Processor for plugin requests PluginRequestProcessor* plugin_req_proc; // Sends messages to Java over the bus JavaMessageSender* java_req_proc; // Queue processing threads static pthread_t plugin_request_processor_thread1; static pthread_t plugin_request_processor_thread2; static pthread_t plugin_request_processor_thread3; // Static instance helper functions. // Retrieve the current document's documentbase. static std::string plugin_get_documentbase (NPP instance); // Callback used to monitor input pipe status. static gboolean plugin_in_pipe_callback (GIOChannel* source, GIOCondition condition, gpointer plugin_data); // Callback used to monitor output pipe status. static gboolean plugin_out_pipe_callback (GIOChannel* source, GIOCondition condition, gpointer plugin_data); std::string plugin_parameters_string (int argc, char* argn[], char* argv[]); static void plugin_stop_appletviewer (); NPError get_cookie_info(const char* siteAddr, char** cookieString, uint32_t* len); NPError get_proxy_info(const char* siteAddr, char** proxy, uint32_t* len); void consume_message(gchar* message); static void appletviewer_monitor(GPid pid, gint status, gpointer data); void plugin_send_initialization_message(char* instance, gulong handle, int width, int height, char* url); /* Returns JVM options set in itw-settings */ std::vector* get_jvm_args(); // Global instance counter. // Mutex to protect plugin_instance_counter. static GMutex* plugin_instance_mutex = NULL; // A global variable for reporting GLib errors. This must be free'd // and set to NULL after each use. static GError* channel_error = NULL; static GHashTable* instance_to_id_map = g_hash_table_new(NULL, NULL); static GHashTable* id_to_instance_map = g_hash_table_new(NULL, NULL); static gint instance_counter = 1; static GPid appletviewer_pid = -1; static guint appletviewer_watch_id = -1; bool debug_initiated = false; bool file_logs_initiated = false; int plugin_debug = getenv ("ICEDTEAPLUGIN_DEBUG") != NULL; bool plugin_debug_headers = false; bool plugin_debug_to_file = false ; bool plugin_debug_to_streams = true ; bool plugin_debug_to_system = false; bool plugin_debug_to_console = true; FILE * plugin_file_log = NULL; std::string plugin_file_log_name; int plugin_debug_suspend = (getenv("ICEDTEAPLUGIN_DEBUG") != NULL) && (strcmp(getenv("ICEDTEAPLUGIN_DEBUG"), "suspend") == 0); #ifdef LEGACY_GLIB // Returns key from first item stored in hashtable gboolean find_first_item_in_hash_table(gpointer key, gpointer value, gpointer user_data) { user_data = key; return (gboolean)TRUE; } int g_strcmp0(char *str1, char *str2) { if (str1 != NULL) return str2 != NULL ? strcmp(str1, str2) : 1; else // str1 == NULL return str2 != NULL ? 1 : 0; } #endif static std::string get_plugin_executable(){ std::string custom_jre; bool custom_jre_defined = find_custom_jre(custom_jre); if (custom_jre_defined) { if (IcedTeaPluginUtilities::file_exists(custom_jre+"/bin/java")){ return custom_jre+"/bin/java"; } else { PLUGIN_ERROR("Your custom jre (/bin/java check) %s is not valid. Please fix %s in your %s. In attempt to run using default one. \n", custom_jre.c_str(), custom_jre_key.c_str(), default_file_ITW_deploy_props_name.c_str()); } } return appletviewer_default_executable; } static std::string get_plugin_rt_jar(){ std::string custom_jre; bool custom_jre_defined = find_custom_jre(custom_jre); if (custom_jre_defined) { if (IcedTeaPluginUtilities::file_exists(custom_jre+"/lib/rt.jar")){ return custom_jre+"/lib/rt.jar"; } else { PLUGIN_ERROR("Your custom jre (/lib/rt.jar check) %s is not valid. Please fix %s in your %s. In attempt to run using default one. \n", custom_jre.c_str(), custom_jre_key.c_str(), default_file_ITW_deploy_props_name.c_str()); } } return appletviewer_default_rtjar; } static std::string get_plugin_jfx_jar(){ std::string custom_jre; bool custom_jre_defined = find_custom_jre(custom_jre); if (custom_jre_defined) { if (IcedTeaPluginUtilities::file_exists(custom_jre+"/lib/jfxrt.jar")){ return custom_jre+"/lib/jfxrt.jar"; } else { PLUGIN_ERROR("Your custom jre (/lib/jfxrt.jar check) %s is not valid. Please fix %s in your %s. In attempt to run using default one. \n", custom_jre.c_str(), custom_jre_key.c_str(), default_file_ITW_deploy_props_name.c_str()); } } return appletviewer_default_jfxrtjar; } static std::string get_plugin_nashorn_jar(){ std::string custom_jre; bool custom_jre_defined = find_custom_jre(custom_jre); if (custom_jre_defined) { if (IcedTeaPluginUtilities::file_exists(custom_jre+"/lib/ext/nashorn.jar")){ return custom_jre+"/lib/ext/nashorn.jar"; } else { PLUGIN_ERROR("Your custom jre (/lib/ext/nashorn.jar check) %s is not valid. Please fix %s in your %s. In attempt to run using default one. \n", custom_jre.c_str(), custom_jre_key.c_str(), default_file_ITW_deploy_props_name.c_str()); } } return appletviewer_default_nashonrjar; } static void cleanUpDir(){ //free data_directory descriptor if (data_directory_descriptor != NULL) { closedir(data_directory_descriptor); } //clean up pipes directory PLUGIN_DEBUG ("Removing runtime directory %s \n", data_directory.c_str()); int removed = rmdir(data_directory.c_str()); if (removed != 0) { PLUGIN_ERROR ("Failed to remove runtime directory %s, because of %s \n", data_directory.c_str(), strerror(errno)); } else { PLUGIN_DEBUG ("Removed runtime directory %s \n", data_directory.c_str()); } data_directory_descriptor = NULL; } /* * Find first member in GHashTable* depending on version of glib */ gpointer getFirstInTableInstance(GHashTable* table) { gpointer id, instance; #ifndef LEGACY_GLIB GHashTableIter iter; g_hash_table_iter_init (&iter, table); g_hash_table_iter_next (&iter, &instance, &id); #else g_hash_table_find(table, (GHRFunc)find_first_item_in_hash_table, &instance); #endif return instance; } // Functions prefixed by ITNP_ are instance functions. They are called // by the browser and operate on instances of ITNPPluginData. // Functions prefixed by plugin_ are static helper functions. // Functions prefixed by NP_ are factory functions. They are called // by the browser and provide functionality needed to create plugin // instances. // INSTANCE FUNCTIONS // Creates a new icedtea np plugin instance. This function creates a // ITNPPluginData* and stores it in instance->pdata. The following // ITNPPluginData fields are initialized: instance_id, in_pipe_name, // in_from_appletviewer, in_watch_source, out_pipe_name, // out_to_appletviewer, out_watch_source, appletviewer_mutex, owner, // appletviewer_alive. In addition two pipe files are created. All // of those fields must be properly destroyed, and the pipes deleted, // by ITNP_Destroy. If an error occurs during initialization then this // function will free anything that's been allocated so far, set // instance->pdata to NULL and return an error code. NPError ITNP_New (NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved) { PLUGIN_DEBUG("ITNP_New\n"); static NPObject *window_ptr; NPIdentifier identifier; NPVariant member_ptr; browser_functions.getvalue(instance, NPNVWindowNPObject, &window_ptr); identifier = browser_functions.getstringidentifier("document"); if (!browser_functions.hasproperty(instance, window_ptr, identifier)) { PLUGIN_ERROR("%s not found!\n", "document"); } browser_functions.getproperty(instance, window_ptr, identifier, &member_ptr); PLUGIN_DEBUG("Got variant %p\n", &member_ptr); if (!instance) { PLUGIN_ERROR ("Browser-provided instance pointer is NULL.\n"); return NPERR_INVALID_INSTANCE_ERROR; } // data ITNPPluginData* data = plugin_data_new (); if (data == NULL) { PLUGIN_ERROR ("Failed to allocate plugin data.\n"); return NPERR_OUT_OF_MEMORY_ERROR; } // start the jvm if needed NPError startup_error = start_jvm_if_needed(); if (startup_error != NPERR_NO_ERROR) { PLUGIN_ERROR ("Failed to start JVM\n"); return startup_error; } // Initialize data->instance_id. // // instance_id should be unique for this process so we use a // combination of getpid and plugin_instance_counter. // // Critical region. Reference and increment plugin_instance_counter // global. g_mutex_lock (plugin_instance_mutex); // data->instance_id data->instance_id = g_strdup_printf ("%d", instance_counter); g_mutex_unlock (plugin_instance_mutex); // data->appletviewer_mutex data->appletviewer_mutex = g_mutex_new (); g_mutex_lock (data->appletviewer_mutex); std::string documentbase = plugin_get_documentbase (instance); // Documentbase retrieval. if (argc != 0) { // Send parameters to appletviewer. std::string params_string = plugin_parameters_string(argc, argn, argv); data->parameters_string = g_strdup_printf("tag %s %s", documentbase.c_str(), params_string.c_str()); data->is_applet_instance = true; } else { data->is_applet_instance = false; } g_mutex_unlock (data->appletviewer_mutex); // If initialization succeeded entirely then we store the plugin // data in the instance structure and return. Otherwise we free the // data we've allocated so far and set instance->pdata to NULL. // Set back-pointer to owner instance. data->owner = instance; // source of this instance // don't use documentbase, it is cleared later data->source = plugin_get_documentbase(instance); instance->pdata = data; // store an identifier for this plugin PLUGIN_DEBUG("Mapping id %d and instance %p\n", instance_counter, instance); g_hash_table_insert(instance_to_id_map, instance, GINT_TO_POINTER(instance_counter)); g_hash_table_insert(id_to_instance_map, GINT_TO_POINTER(instance_counter), instance); instance_counter++; PLUGIN_DEBUG ("ITNP_New return\n"); return NPERR_NO_ERROR; } // Starts the JVM if it is not already running NPError start_jvm_if_needed() { // This is asynchronized function. It must // have exclusivity when running. GMutex *vm_start_mutex = g_mutex_new(); g_mutex_lock(vm_start_mutex); PLUGIN_DEBUG("Checking JVM status...\n"); // If the jvm is already up, do nothing if (jvm_up) { PLUGIN_DEBUG("JVM is up. Returning.\n"); return NPERR_NO_ERROR; } PLUGIN_DEBUG("No JVM is running. Attempting to start one...\n"); NPError np_error = NPERR_NO_ERROR; ITNPPluginData* data = NULL; // Create appletviewer-to-plugin pipe which we refer to as the input // pipe. // in_pipe_name in_pipe_name = g_strdup_printf ("%s/%d-icedteanp-appletviewer-to-plugin", data_directory.c_str(), getpid()); if (!in_pipe_name) { PLUGIN_ERROR ("Failed to create input pipe name.\n"); np_error = NPERR_OUT_OF_MEMORY_ERROR; // If in_pipe_name is NULL then the g_free at // cleanup_in_pipe_name will simply return. goto cleanup_in_pipe_name; } // clean up any older pip unlink (in_pipe_name); PLUGIN_DEBUG ("ITNP_New: creating input fifo: %s\n", in_pipe_name); if (mkfifo (in_pipe_name, 0600) == -1 && errno != EEXIST) { PLUGIN_ERROR ("Failed to create input pipe\n", strerror (errno)); np_error = NPERR_GENERIC_ERROR; goto cleanup_in_pipe_name; } PLUGIN_DEBUG ("ITNP_New: created input fifo: %s\n", in_pipe_name); // Create plugin-to-appletviewer pipe which we refer to as the // output pipe. // out_pipe_name out_pipe_name = g_strdup_printf ("%s/%d-icedteanp-plugin-to-appletviewer", data_directory.c_str(), getpid()); if (!out_pipe_name) { PLUGIN_ERROR ("Failed to create output pipe name.\n"); np_error = NPERR_OUT_OF_MEMORY_ERROR; goto cleanup_out_pipe_name; } // clean up any older pip unlink (out_pipe_name); PLUGIN_DEBUG ("ITNP_New: creating output fifo: %s\n", out_pipe_name); if (mkfifo (out_pipe_name, 0600) == -1 && errno != EEXIST) { PLUGIN_ERROR ("Failed to create output pipe\n", strerror (errno)); np_error = NPERR_GENERIC_ERROR; goto cleanup_out_pipe_name; } PLUGIN_DEBUG ("ITNP_New: created output fifo: %s\n", out_pipe_name); // Create plugin-debug-to-appletviewer pipe which we refer to as the // debug pipe. initialize_debug();//should be already initialized, but... if (plugin_debug_to_console){ // debug_pipe_name debug_pipe_name = g_strdup_printf ("%s/%d-icedteanp-plugin-debug-to-appletviewer", data_directory.c_str(), getpid()); if (!debug_pipe_name) { PLUGIN_ERROR ("Failed to create debug pipe name.\n"); np_error = NPERR_OUT_OF_MEMORY_ERROR; goto cleanup_debug_pipe_name; } // clean up any older pip unlink (debug_pipe_name); PLUGIN_DEBUG ("ITNP_New: creating debug fifo: %s\n", debug_pipe_name); if (mkfifo (debug_pipe_name, 0600) == -1 && errno != EEXIST) { PLUGIN_ERROR ("Failed to create debug pipe\n", strerror (errno)); np_error = NPERR_GENERIC_ERROR; goto cleanup_debug_pipe_name; } PLUGIN_DEBUG ("ITNP_New: created debug fifo: %s\n", debug_pipe_name); } // Start a separate appletviewer process for each applet, even if // there are multiple applets in the same page. We may need to // change this behaviour if we find pages with multiple applets that // rely on being run in the same VM. np_error = plugin_start_appletviewer (data); // Create plugin-to-appletviewer channel. The default encoding for // the file is UTF-8. // out_to_appletviewer out_to_appletviewer = g_io_channel_new_file (out_pipe_name, "w", &channel_error); if (!out_to_appletviewer) { if (channel_error) { PLUGIN_ERROR ("Failed to create output channel, '%s'\n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to create output channel\n"); np_error = NPERR_GENERIC_ERROR; goto cleanup_out_to_appletviewer; } // Watch for hangup and error signals on the output pipe. out_watch_source = g_io_add_watch (out_to_appletviewer, (GIOCondition) (G_IO_ERR | G_IO_HUP), plugin_out_pipe_callback, (gpointer) out_to_appletviewer); // Create appletviewer-to-plugin channel. The default encoding for // the file is UTF-8. // in_from_appletviewer in_from_appletviewer = g_io_channel_new_file (in_pipe_name, "r", &channel_error); if (!in_from_appletviewer) { if (channel_error) { PLUGIN_ERROR ("Failed to create input channel, '%s'\n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to create input channel\n"); np_error = NPERR_GENERIC_ERROR; goto cleanup_in_from_appletviewer; } // Watch for hangup and error signals on the input pipe. in_watch_source = g_io_add_watch (in_from_appletviewer, (GIOCondition) (G_IO_IN | G_IO_ERR | G_IO_HUP), plugin_in_pipe_callback, (gpointer) in_from_appletviewer); // Create plugin-to-appletviewer console debug channel. The default encoding for // the file is UTF-8. // debug_to_appletviewer if (plugin_debug_to_console){ debug_to_appletviewer = g_io_channel_new_file (debug_pipe_name, "w", &channel_error); if (!debug_to_appletviewer) { if (channel_error) { PLUGIN_ERROR ("Failed to debug output channel, '%s'\n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to create debug channel\n"); np_error = NPERR_GENERIC_ERROR; goto cleanup_debug_to_appletviewer; } } jvm_up = TRUE; if (plugin_debug_to_console){ //jvm is up, we can start console producer thread pthread_t debug_to_console_consumer; pthread_create(&debug_to_console_consumer,NULL,&flush_pre_init_messages,NULL); } goto done; // Free allocated data in case of error cleanup_debug_to_appletviewer: if (plugin_debug_to_console){ if (debug_to_appletviewer) g_io_channel_unref (debug_to_appletviewer); debug_to_appletviewer = NULL; } cleanup_in_watch_source: // Removing a source is harmless if it fails since it just means the // source has already been removed. g_source_remove (in_watch_source); in_watch_source = 0; cleanup_in_from_appletviewer: if (in_from_appletviewer) g_io_channel_unref (in_from_appletviewer); in_from_appletviewer = NULL; // cleanup_out_watch_source: g_source_remove (out_watch_source); out_watch_source = 0; cleanup_out_to_appletviewer: if (out_to_appletviewer) g_io_channel_unref (out_to_appletviewer); out_to_appletviewer = NULL; if (plugin_debug_to_console){ // cleanup_debug_pipe: // Delete output pipe. PLUGIN_DEBUG ("ITNP_New: deleting debug fifo: %s\n", debug_pipe_name); unlink (debug_pipe_name); PLUGIN_DEBUG ("ITNP_New: deleted debug fifo: %s\n", debug_pipe_name); } cleanup_debug_pipe_name: if (plugin_debug_to_console){ g_free (debug_pipe_name); debug_pipe_name = NULL; } // cleanup_out_pipe: // Delete output pipe. PLUGIN_DEBUG ("ITNP_New: deleting input fifo: %s\n", in_pipe_name); unlink (out_pipe_name); PLUGIN_DEBUG ("ITNP_New: deleted input fifo: %s\n", in_pipe_name); cleanup_out_pipe_name: g_free (out_pipe_name); out_pipe_name = NULL; // cleanup_in_pipe: // Delete input pipe. PLUGIN_DEBUG ("ITNP_New: deleting output fifo: %s\n", out_pipe_name); unlink (in_pipe_name); PLUGIN_DEBUG ("ITNP_New: deleted output fifo: %s\n", out_pipe_name); cleanup_in_pipe_name: g_free (in_pipe_name); in_pipe_name = NULL; cleanUpDir(); done: IcedTeaPluginUtilities::printDebugStatus(); // Now other threads may re-enter.. unlock the mutex g_mutex_unlock(vm_start_mutex); return np_error; } NPError ITNP_GetValue (NPP instance, NPPVariable variable, void* value) { PLUGIN_DEBUG ("ITNP_GetValue\n"); NPError np_error = NPERR_NO_ERROR; switch (variable) { // This plugin needs XEmbed support. case NPPVpluginNeedsXEmbed: { PLUGIN_DEBUG ("ITNP_GetValue: returning TRUE for NeedsXEmbed.\n"); bool* bool_value = (bool*) value; *bool_value = true; } break; case NPPVpluginScriptableNPObject: { *(NPObject **)value = get_scriptable_object(instance); } break; default: PLUGIN_ERROR ("Unknown plugin value requested.\n"); np_error = NPERR_GENERIC_ERROR; break; } PLUGIN_DEBUG ("ITNP_GetValue return\n"); return np_error; } NPError ITNP_Destroy (NPP instance, NPSavedData** save) { PLUGIN_DEBUG ("ITNP_Destroy %p\n", instance); ITNPPluginData* data = (ITNPPluginData*) instance->pdata; int id = get_id_from_instance(instance); // Let Java know that this applet needs to be destroyed gchar* msg = (gchar*) g_malloc(512*sizeof(gchar)); // 512 is more than enough. We need < 100 g_sprintf(msg, "instance %d destroy", id); plugin_send_message_to_appletviewer(msg); g_free(msg); msg = NULL; if (data) { // Free plugin data. plugin_data_destroy (instance); } g_hash_table_remove(instance_to_id_map, instance); g_hash_table_remove(id_to_instance_map, GINT_TO_POINTER(id)); IcedTeaPluginUtilities::invalidateInstance(instance); PLUGIN_DEBUG ("ITNP_Destroy return\n"); return NPERR_NO_ERROR; } NPError ITNP_SetWindow (NPP instance, NPWindow* window) { PLUGIN_DEBUG ("ITNP_SetWindow\n"); if (instance == NULL) { PLUGIN_ERROR ("Invalid instance.\n"); return NPERR_INVALID_INSTANCE_ERROR; } gpointer id_ptr = g_hash_table_lookup(instance_to_id_map, instance); gint id = 0; if (id_ptr) { id = GPOINTER_TO_INT(id_ptr); } ITNPPluginData* data = (ITNPPluginData*) instance->pdata; // Simply return if we receive a NULL window. if ((window == NULL) || (window->window == NULL)) { PLUGIN_DEBUG ("ITNP_SetWindow: got NULL window.\n"); return NPERR_NO_ERROR; } if (data->window_handle) { // The window already exists. if (data->window_handle == window->window) { // The parent window is the same as in previous calls. PLUGIN_DEBUG ("ITNP_SetWindow: window already exists.\n"); // Critical region. Read data->appletviewer_mutex and send // a message to the appletviewer. g_mutex_lock (data->appletviewer_mutex); if (jvm_up) { gboolean dim_changed = FALSE; // The window is the same as it was for the last // SetWindow call. if (window->width != data->window_width) { PLUGIN_DEBUG ("ITNP_SetWindow: window width changed.\n"); // The width of the plugin window has changed. // Store the new width. data->window_width = window->width; dim_changed = TRUE; } if (window->height != data->window_height) { PLUGIN_DEBUG ("ITNP_SetWindow: window height changed.\n"); // The height of the plugin window has changed. // Store the new height. data->window_height = window->height; dim_changed = TRUE; } if (dim_changed) { gchar* message = g_strdup_printf ("instance %d width %d height %d", id, window->width, window->height); plugin_send_message_to_appletviewer (message); g_free (message); message = NULL; } } else { // The appletviewer is not running. PLUGIN_DEBUG ("ITNP_SetWindow: appletviewer is not running.\n"); } g_mutex_unlock (data->appletviewer_mutex); } else { // The parent window has changed. This branch does run but // doing nothing in response seems to be sufficient. PLUGIN_DEBUG ("ITNP_SetWindow: parent window changed.\n"); } } else { // Else this is initialization PLUGIN_DEBUG ("ITNP_SetWindow: setting window.\n"); // Critical region. Send messages to appletviewer. g_mutex_lock (data->appletviewer_mutex); // Store the window handle and dimensions data->window_handle = window->window; data->window_width = window->width; data->window_height = window->height; // Now we have everything. Send this data to the Java side plugin_send_initialization_message( data->instance_id, (gulong) data->window_handle, data->window_width, data->window_height, data->parameters_string); g_mutex_unlock (data->appletviewer_mutex); } PLUGIN_DEBUG ("ITNP_SetWindow return\n"); return NPERR_NO_ERROR; } NPError ITNP_NewStream (NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype) { PLUGIN_DEBUG ("ITNP_NewStream\n"); PLUGIN_DEBUG ("ITNP_NewStream return\n"); return NPERR_GENERIC_ERROR; } void ITNP_StreamAsFile (NPP instance, NPStream* stream, const char* filename) { PLUGIN_DEBUG ("ITNP_StreamAsFile\n"); PLUGIN_DEBUG ("ITNP_StreamAsFile return\n"); } NPError ITNP_DestroyStream (NPP instance, NPStream* stream, NPReason reason) { PLUGIN_DEBUG ("ITNP_DestroyStream\n"); PLUGIN_DEBUG ("ITNP_DestroyStream return\n"); return NPERR_NO_ERROR; } int32_t ITNP_WriteReady (NPP instance, NPStream* stream) { PLUGIN_DEBUG ("ITNP_WriteReady\n"); PLUGIN_DEBUG ("ITNP_WriteReady return\n"); return 0; } int32_t ITNP_Write (NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer) { PLUGIN_DEBUG ("ITNP_Write\n"); PLUGIN_DEBUG ("ITNP_Write return\n"); return 0; } void ITNP_Print (NPP instance, NPPrint* platformPrint) { PLUGIN_DEBUG ("ITNP_Print\n"); PLUGIN_DEBUG ("ITNP_Print return\n"); } int16_t ITNP_HandleEvent (NPP instance, void* event) { PLUGIN_DEBUG ("ITNP_HandleEvent\n"); PLUGIN_DEBUG ("ITNP_HandleEvent return\n"); return 0; } void ITNP_URLNotify (NPP instance, const char* url, NPReason reason, void* notifyData) { PLUGIN_DEBUG ("ITNP_URLNotify\n"); PLUGIN_DEBUG ("ITNP_URLNotify return\n"); } NPError get_cookie_info(const char* siteAddr, char** cookieString, uint32_t* len) { // Only attempt to perform this operation if there is a valid plugin instance if (g_hash_table_size(instance_to_id_map) <= 0) { return NPERR_GENERIC_ERROR; } // getvalueforurl needs an NPP instance. Quite frankly, there is no easy way // to know which instance needs the information, as applets on Java side can // be multi-threaded and the thread making a proxy.cookie request cannot be // easily tracked. // Fortunately, XULRunner does not care about the instance as long as it is // valid. So we just pick the first valid one and use it. Proxy/Cookie // information is not instance specific anyway, it is URL specific. if (browser_functions.getvalueforurl) { gpointer instance=getFirstInTableInstance(instance_to_id_map); return browser_functions.getvalueforurl((NPP) instance, NPNURLVCookie, siteAddr, cookieString, len); } else { return NPERR_GENERIC_ERROR; } return NPERR_NO_ERROR; } static NPError set_cookie_info(const char* siteAddr, const char* cookieString, uint32_t len) { // Only attempt to perform this operation if there is a valid plugin instance if (g_hash_table_size(instance_to_id_map) > 0 && browser_functions.getvalueforurl) { // We arbitrarily use the first valid instance we can grab // For an explanation of the logic behind this, see get_cookie_info gpointer instance = getFirstInTableInstance(instance_to_id_map); return browser_functions.setvalueforurl((NPP) instance, NPNURLVCookie, siteAddr, cookieString, len); } return NPERR_GENERIC_ERROR;; } // HELPER FUNCTIONS ITNPPluginData* plugin_data_new () { PLUGIN_DEBUG ("plugin_data_new\n"); ITNPPluginData* data = (ITNPPluginData*)browser_functions.memalloc(sizeof (struct ITNPPluginData)); if (data) { // Call constructor on allocated data new (data) ITNPPluginData(); } PLUGIN_DEBUG ("plugin_data_new return\n"); return data; } // Documentbase retrieval. This function gets the current document's // documentbase. This function relies on browser-private data so it // will only work when the plugin is loaded in a Mozilla-based // browser. static std::string plugin_get_documentbase (NPP instance) { PLUGIN_DEBUG ("plugin_get_documentbase\n"); // FIXME: This method is not ideal, but there are no known NPAPI call // for this. See thread for more information: // http://www.mail-archive.com/chromium-dev@googlegroups.com/msg04844.html // Additionally, since it is insecure, we cannot use it for making // security decisions. NPObject* window; browser_functions.getvalue(instance, NPNVWindowNPObject, &window); NPVariant location; NPIdentifier location_id = browser_functions.getstringidentifier("location"); browser_functions.getproperty(instance, window, location_id, &location); NPVariant href; NPIdentifier href_id = browser_functions.getstringidentifier("href"); browser_functions.getproperty(instance, NPVARIANT_TO_OBJECT(location), href_id, &href); std::string href_str = IcedTeaPluginUtilities::NPVariantAsString(href); // Release references. browser_functions.releasevariantvalue(&href); browser_functions.releasevariantvalue(&location); PLUGIN_DEBUG ("plugin_get_documentbase return\n"); PLUGIN_DEBUG("plugin_get_documentbase returning: %s\n", href_str.c_str()); return href_str; } // plugin_in_pipe_callback is called when data is available on the // input pipe, or when the appletviewer crashes or is killed. It may // be called after data has been destroyed in which case it simply // returns FALSE to remove itself from the glib main loop. static gboolean plugin_in_pipe_callback (GIOChannel* source, GIOCondition condition, gpointer plugin_data) { PLUGIN_DEBUG ("plugin_in_pipe_callback\n"); gboolean keep_installed = TRUE; if (condition & G_IO_IN) { gchar* message = NULL; if (g_io_channel_read_line (in_from_appletviewer, &message, NULL, NULL, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { PLUGIN_ERROR ("Failed to read line from input channel, %s\n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to read line from input channel\n"); } else { consume_message(message); } g_free (message); message = NULL; keep_installed = TRUE; } if (condition & (G_IO_ERR | G_IO_HUP)) { PLUGIN_DEBUG ("appletviewer has stopped.\n"); keep_installed = FALSE; } PLUGIN_DEBUG ("plugin_in_pipe_callback return\n"); return keep_installed; } static void consume_plugin_message(gchar* message) { // internal plugin related message gchar** parts = g_strsplit (message, " ", 5); if (g_str_has_prefix(parts[1], "PluginProxyInfo")) { gchar* proxy = NULL; uint32_t len = 0; gchar* decoded_url = (gchar*) calloc(strlen(parts[4]) + 1, sizeof(gchar)); IcedTeaPluginUtilities::decodeURL(parts[4], &decoded_url); PLUGIN_DEBUG("parts[0]=%s, parts[1]=%s, reference, parts[3]=%s, parts[4]=%s -- decoded_url=%s\n", parts[0], parts[1], parts[3], parts[4], decoded_url); gchar* proxy_info = NULL; proxy_info = g_strconcat ("plugin PluginProxyInfo reference ", parts[3], " ", NULL); if (get_proxy_info(decoded_url, &proxy, &len) == NPERR_NO_ERROR) { proxy_info = g_strconcat (proxy_info, proxy, NULL); } PLUGIN_DEBUG("Proxy info: %s\n", proxy_info); plugin_send_message_to_appletviewer(proxy_info); free(decoded_url); decoded_url = NULL; g_free(proxy_info); proxy_info = NULL; g_free(proxy); proxy = NULL; } else if (g_str_has_prefix(parts[1], "PluginCookieInfo")) { gchar* decoded_url = (gchar*) calloc(strlen(parts[4])+1, sizeof(gchar)); IcedTeaPluginUtilities::decodeURL(parts[4], &decoded_url); gchar* cookie_info = g_strconcat ("plugin PluginCookieInfo reference ", parts[3], " ", NULL); gchar* cookie_string = NULL; uint32_t len; if (get_cookie_info(decoded_url, &cookie_string, &len) == NPERR_NO_ERROR) { cookie_info = g_strconcat (cookie_info, cookie_string, NULL); } PLUGIN_DEBUG("Cookie info: %s\n", cookie_info); plugin_send_message_to_appletviewer(cookie_info); free(decoded_url); decoded_url = NULL; g_free(cookie_info); cookie_info = NULL; g_free(cookie_string); cookie_string = NULL; } else if (g_str_has_prefix(parts[1], "PluginSetCookie")) { // Message structure: plugin PluginSetCookie reference -1 gchar** cookie_parts = g_strsplit (message, " ", 6); if (g_strv_length(cookie_parts) < 6) { g_strfreev (parts); g_strfreev (cookie_parts); return; // Defensive, message _should_ be properly formatted } gchar* decoded_url = (gchar*) calloc(strlen(cookie_parts[4])+1, sizeof(gchar)); IcedTeaPluginUtilities::decodeURL(cookie_parts[4], &decoded_url); gchar* cookie_string = cookie_parts[5]; uint32_t len = strlen(cookie_string); if (set_cookie_info(decoded_url, cookie_string, len) == NPERR_NO_ERROR) { PLUGIN_DEBUG("Setting cookie for URL %s to %s\n", decoded_url, cookie_string); } else { PLUGIN_DEBUG("Not able to set cookie for URL %s to %s\n", decoded_url, cookie_string); } free(decoded_url); decoded_url = NULL; g_strfreev (cookie_parts); cookie_parts = NULL; } g_strfreev (parts); parts = NULL; } void consume_message(gchar* message) { PLUGIN_DEBUG (" PIPE: plugin read: %s\n", message); if (g_str_has_prefix (message, "instance")) { ITNPPluginData* data; gchar** parts = g_strsplit (message, " ", -1); guint parts_sz = g_strv_length (parts); int instance_id = atoi(parts[1]); NPP instance = (NPP) g_hash_table_lookup(id_to_instance_map, GINT_TO_POINTER(instance_id)); if (instance_id > 0 && !instance) { PLUGIN_DEBUG("Instance %d is not active. Refusing to consume message \"%s\"\n", instance_id, message); return; } else if (instance) { data = (ITNPPluginData*) instance->pdata; } if (g_str_has_prefix (parts[2], "status")) { // clear the "instance X status" parts strcpy(parts[0], ""); strcpy(parts[1], ""); strcpy(parts[2], ""); // join the rest gchar* status_message = g_strjoinv(" ", parts); PLUGIN_DEBUG ("plugin_in_pipe_callback: setting status %s\n", status_message); (*browser_functions.status) (data->owner, status_message); g_free(status_message); status_message = NULL; } else if (g_str_has_prefix (parts[1], "internal")) { //s->post(message); } else { // All other messages are posted to the bus, and subscribers are // expected to take care of them. They better! java_to_plugin_bus->post(message); } g_strfreev (parts); parts = NULL; } else if (g_str_has_prefix (message, "context")) { java_to_plugin_bus->post(message); } else if (g_str_has_prefix (message, "plugin ")) { consume_plugin_message(message); } else { g_print (" Unable to handle message: %s\n", message); } } void get_instance_from_id(int id, NPP& instance) { instance = (NPP) g_hash_table_lookup(id_to_instance_map, GINT_TO_POINTER(id)); } int get_id_from_instance(NPP instance) { int id = GPOINTER_TO_INT(g_hash_table_lookup(instance_to_id_map, instance)); PLUGIN_DEBUG("Returning id %d for instance %p\n", id, instance); return id; } NPError get_proxy_info(const char* siteAddr, char** proxy, uint32_t* len) { // Only attempt to perform this operation if there is a valid plugin instance if (g_hash_table_size(instance_to_id_map) <= 0) { return NPERR_GENERIC_ERROR; } if (browser_functions.getvalueforurl) { NPError err; // As in get_cookie_info, we use the first active instance gpointer instance=getFirstInTableInstance(instance_to_id_map); err = browser_functions.getvalueforurl((NPP) instance, NPNURLVProxy, siteAddr, proxy, len); if (err != NPERR_NO_ERROR) { *proxy = (char *) malloc(sizeof **proxy * 7); *len = g_strlcpy(*proxy, "DIRECT", 7); } } else { return NPERR_GENERIC_ERROR; } return NPERR_NO_ERROR; } // plugin_out_pipe_callback is called when the appletviewer crashes or // is killed. It may be called after data has been destroyed in which // case it simply returns FALSE to remove itself from the glib main // loop. static gboolean plugin_out_pipe_callback (GIOChannel* source, GIOCondition condition, gpointer plugin_data) { PLUGIN_DEBUG ("plugin_out_pipe_callback\n"); ITNPPluginData* data = (ITNPPluginData*) plugin_data; PLUGIN_DEBUG ("plugin_out_pipe_callback: appletviewer has stopped.\n"); PLUGIN_DEBUG ("plugin_out_pipe_callback return\n"); return FALSE; } // remove all components from LD_LIBRARY_PATH, which start with // MOZILLA_FIVE_HOME; firefox has its own NSS based security provider, // which conflicts with the one configured in nss.cfg. static gchar* plugin_filter_ld_library_path(gchar *path_old) { gchar *moz_home = g_strdup (g_getenv ("MOZILLA_FIVE_HOME")); gchar *moz_prefix; gchar *path_new; gchar** components; int i1, i2; if (moz_home == NULL || path_old == NULL || strlen (path_old) == 0) return path_old; if (g_str_has_suffix (moz_home, "/")) moz_home[strlen (moz_home - 1)] = '\0'; moz_prefix = g_strconcat (moz_home, "/", NULL); components = g_strsplit (path_old, ":", -1); for (i1 = 0, i2 = 0; components[i1] != NULL; i1++) { if (g_strcmp0 (components[i1], moz_home) == 0 || g_str_has_prefix (components[i1], moz_home)) components[i2] = components[i1]; else components[i2++] = components[i1]; } components[i2] = NULL; if (i1 > i2) path_new = g_strjoinv (":", components); g_strfreev (components); g_free (moz_home); g_free (moz_prefix); g_free (path_old); if (path_new == NULL || strlen (path_new) == 0) { PLUGIN_DEBUG("Unset LD_LIBRARY_PATH\n"); return NULL; } else { PLUGIN_DEBUG ("Set LD_LIBRARY_PATH: %s\n", path_new); return path_new; } } // build the environment to pass to the external plugin process static gchar** plugin_filter_environment(void) { gchar **var_names = g_listenv(); gchar **new_env = (gchar**) malloc(sizeof(gchar*) * (g_strv_length (var_names) + 1)); int i_var, i_env; for (i_var = 0, i_env = 0; var_names[i_var] != NULL; i_var++) { gchar *env_value = g_strdup (g_getenv (var_names[i_var])); if (g_str_has_prefix (var_names[i_var], "LD_LIBRARY_PATH")) env_value = plugin_filter_ld_library_path (env_value); if (env_value != NULL) { new_env[i_env++] = g_strdup_printf ("%s=%s", var_names[i_var], env_value); g_free (env_value); } } new_env[i_env] = NULL; return new_env; } static NPError plugin_test_appletviewer () { PLUGIN_DEBUG ("plugin_test_appletviewer: %s\n", get_plugin_executable().c_str()); NPError error = NPERR_NO_ERROR; gchar* command_line[3] = { NULL, NULL, NULL }; gchar** environment; command_line[0] = g_strdup (get_plugin_executable().c_str()); command_line[1] = g_strdup("-version"); command_line[2] = NULL; environment = plugin_filter_environment(); if (!g_spawn_async (NULL, command_line, environment, (GSpawnFlags) 0, NULL, NULL, NULL, &channel_error)) { if (channel_error) { PLUGIN_ERROR ("Failed to spawn applet viewer %s\n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to spawn applet viewer\n"); error = NPERR_GENERIC_ERROR; } g_strfreev (environment); g_free (command_line[0]); command_line[0] = NULL; g_free (command_line[1]); command_line[1] = NULL; g_free (command_line[2]); command_line[2] = NULL; PLUGIN_DEBUG ("plugin_test_appletviewer return\n"); return error; } static int plugin_get_java_version () { PLUGIN_DEBUG ("plugin_get_java_version: %s\n", get_plugin_executable().c_str()); gchar* command_line[3] = { NULL, NULL, NULL }; gchar** environment; gchar* standard_output; gchar* standard_error; gint exit_status; command_line[0] = g_strdup (get_plugin_executable().c_str()); command_line[1] = g_strdup("-version"); command_line[2] = NULL; environment = plugin_filter_environment(); gboolean result = g_spawn_sync (NULL, command_line, environment, (GSpawnFlags) 0, NULL/*GSpawnChildSetupFunc*/, NULL/*user_data*/, &standard_output, &standard_error, &exit_status, &channel_error); if (channel_error) { g_error_free (channel_error); channel_error = NULL; } PLUGIN_DEBUG ("got_out: %s\n", standard_output); PLUGIN_DEBUG ("got_err: %s\n", standard_error); g_strfreev (environment); g_free (command_line[0]); command_line[0] = NULL; g_free (command_line[1]); command_line[1] = NULL; g_free (command_line[2]); command_line[2] = NULL; if ( standard_error != NULL ){ int major = 0; int minor = 0; sscanf(standard_error, "%*s %*s \"%d.%d", &major, &minor); if (major == 1) major = minor; PLUGIN_DEBUG ("detected version %d\n", major); PLUGIN_DEBUG ("plugin_get_java_version return\n"); return major; } PLUGIN_DEBUG ("detected 8 (or generally non nine)\n"); PLUGIN_DEBUG ("plugin_get_java_version return\n"); return 8; } const char *knownExports[]{ "java.desktop/sun.awt=ALL-UNNAMED,java.desktop", "java.base/sun.security.provider=ALL-UNNAMED,java.desktop", "java.base/sun.security.util=ALL-UNNAMED,java.desktop", "java.base/sun.security.x509=ALL-UNNAMED,java.desktop", "java.base/jdk.internal.util.jar=ALL-UNNAMED,java.desktop", "java.base/sun.security.validator=ALL-UNNAMED,java.desktop", "java.base/com.sun.net.ssl.internal.ssl=ALL-UNNAMED,java.desktop", "java.base/sun.net.www.protocol.jar=ALL-UNNAMED,java.desktop", "java.desktop/sun.awt.X11=ALL-UNNAMED,java.desktop", "java.naming/com.sun.jndi.toolkit.url=ALL-UNNAMED,java.desktop", "java.desktop/sun.applet=ALL-UNNAMED,java.desktop", "java.base/sun.security.action=ALL-UNNAMED,java.desktop", "java.base/sun.net.www.protocol.http=ALL-UNNAMED,java.desktop", "java.desktop/sun.applet=ALL-UNNAMED,jdk.jsobject" }; NPError plugin_start_appletviewer (ITNPPluginData* data) { PLUGIN_DEBUG ("plugin_start_appletviewer\n"); NPError error = NPERR_NO_ERROR; std::vector command_line; gchar** environment = NULL; std::vector* jvm_args = get_jvm_args(); // Construct command line parameters command_line.push_back(get_plugin_executable()); //for javaws shortcuts command_line.push_back(javaws_bin_property); command_line.push_back(javaws_name_property); //Add JVM args to command_line for (int i = 0; i < jvm_args->size(); i++) { command_line.push_back(*jvm_args->at(i)); } command_line.push_back(PLUGIN_BOOTCLASSPATH":"+get_plugin_nashorn_jar()); if (javaVersion < 9 ) { // for jdk8 set the classpath to avoid using the default (cwd). command_line.push_back("-classpath"); command_line.push_back(get_plugin_rt_jar()+":"+get_plugin_jfx_jar()); } else { command_line.push_back("-classpath"); command_line.push_back(get_plugin_jfx_jar()); command_line.push_back("--patch-module"); command_line.push_back("java.desktop="PLUGIN_JAR":"NETX_JAR); command_line.push_back("--patch-module"); command_line.push_back("jdk.jsobject="JSOBJECT_JAR); command_line.push_back("--add-reads"); command_line.push_back("java.base=ALL-UNNAMED,java.desktop"); command_line.push_back("--add-reads"); command_line.push_back("java.desktop=ALL-UNNAMED,java.naming"); command_line.push_back("--add-reads"); command_line.push_back("java.naming=ALL-UNNAMED,java.desktop"); for(int i = 0; i < sizeof(knownExports)/sizeof(knownExports[0]); i++) { command_line.push_back("--add-exports"); command_line.push_back(knownExports[i]); } } // Enable coverage agent if we are running instrumented plugin #ifdef COVERAGE_AGENT command_line.push_back(COVERAGE_AGENT); #endif if (plugin_debug) { command_line.push_back("-Xdebug"); command_line.push_back("-Xnoagent"); //Debug flags std::string debug_flags = "-Xrunjdwp:transport=dt_socket,address=8787,server=y,"; debug_flags += plugin_debug_suspend ? "suspend=y" : "suspend=n"; command_line.push_back(debug_flags); } command_line.push_back("sun.applet.PluginMain"); command_line.push_back(out_pipe_name); command_line.push_back(in_pipe_name); if (plugin_debug_to_console){ command_line.push_back(debug_pipe_name); } // Finished command line parameters environment = plugin_filter_environment(); std::vector vector_gchar = IcedTeaPluginUtilities::vectorStringToVectorGchar(&command_line); gchar **command_line_args = &vector_gchar[0]; if (!g_spawn_async (NULL, command_line_args, environment, (GSpawnFlags) G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &appletviewer_pid, &channel_error)) { if (channel_error) { PLUGIN_ERROR ("Failed to spawn applet viewer %s\n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to spawn applet viewer\n"); error = NPERR_GENERIC_ERROR; } //Free memory g_strfreev(environment); IcedTeaPluginUtilities::freeStringPtrVector(jvm_args); jvm_args = NULL; command_line_args = NULL; if (appletviewer_pid) { PLUGIN_DEBUG("Initialized VM with pid=%d\n", appletviewer_pid); appletviewer_watch_id = g_child_watch_add(appletviewer_pid, (GChildWatchFunc) appletviewer_monitor, (gpointer) appletviewer_pid); } PLUGIN_DEBUG ("plugin_start_appletviewer return\n"); return error; } /* * Returns JVM options set in itw-settings */ std::vector* get_jvm_args() { std::string output; std::vector* tokenOutput = NULL; bool args_defined = read_deploy_property_value("deployment.plugin.jvm.arguments", output); if (!args_defined){ return new std::vector(); } tokenOutput = IcedTeaPluginUtilities::strSplit(output.c_str(), " \n"); return tokenOutput; } /* * Escape characters for passing to Java. * "\n" for new line, "\\" for "\", "\:" for ";" */ std::string escape_parameter_string(const char* to_encode) { std::string encoded; if (to_encode == NULL) { return encoded; } size_t length = strlen(to_encode); for (int i = 0; i < length; i++) { if (to_encode[i] == '\n') encoded += "\\n"; else if (to_encode[i] == '\\') encoded += "\\\\"; else if (to_encode[i] == ';') encoded += "\\:"; else encoded += to_encode[i]; } return encoded; } /* * Build a string containing an encoded list of parameters to send to the applet viewer. * The parameters are separated as 'key1;value1;key2;value2;'. As well, they are * separated and escaped as: * "\n" for new line, "\\" for "\", "\:" for ";" */ std::string plugin_parameters_string (int argc, char* argn[], char* argv[]) { PLUGIN_DEBUG ("plugin_parameters_string\n"); std::string parameters; for (int i = 0; i < argc; i++) { if (argv[i] != NULL) { std::string name_escaped = escape_parameter_string(argn[i]); std::string value_escaped = escape_parameter_string(argv[i]); //Encode parameters and send as 'key1;value1;key2;value2;' etc parameters += name_escaped; parameters += ';'; parameters += value_escaped; parameters += ';'; } } PLUGIN_DEBUG ("plugin_parameters_string return\n"); return parameters; } // plugin_send_message_to_appletviewer must be called while holding // data->appletviewer_mutex. void plugin_send_message_to_appletviewer (gchar const* message) { PLUGIN_DEBUG ("plugin_send_message_to_appletviewer\n"); if (jvm_up) { gchar* newline_message = NULL; gsize bytes_written = 0; // Send message to appletviewer. newline_message = g_strdup_printf ("%s\n", message); // g_io_channel_write_chars will return something other than // G_IO_STATUS_NORMAL if not all the data is written. In that // case we fail rather than retrying. if (g_io_channel_write_chars (out_to_appletviewer, newline_message, -1, &bytes_written, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { PLUGIN_ERROR ("Failed to write bytes to output channel '%s' \n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to write bytes to output channel for %s", newline_message); } if (g_io_channel_flush (out_to_appletviewer, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { PLUGIN_ERROR ("Failed to flush bytes to output channel '%s'\n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to flush bytes to output channel for %s", newline_message); } g_free (newline_message); newline_message = NULL; PLUGIN_DEBUG (" PIPE: plugin wrote(?): %s\n", message); } PLUGIN_DEBUG ("plugin_send_message_to_appletviewer return\n"); } // unlike like plugin_send_message_to_appletviewer // do not debug // do not error // do not have its own line end // is accesed by only one thread // have own pipe // jvm must be up void plugin_send_message_to_appletviewer_console (gchar const* newline_message) { gsize bytes_written = 0; if (g_io_channel_write_chars (debug_to_appletviewer, newline_message, -1, &bytes_written, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { //error must be freed g_error_free (channel_error); channel_error = NULL; } } } //flush only when its full void flush_plugin_send_message_to_appletviewer_console (){ if (g_io_channel_flush (debug_to_appletviewer, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { g_error_free (channel_error); channel_error = NULL; } } } /* * Sends the initialization message (handle/size/url) to the plugin */ void plugin_send_initialization_message(char* instance, gulong handle, int width, int height, char* url) { PLUGIN_DEBUG ("plugin_send_initialization_message\n"); gchar *window_message = g_strdup_printf ("instance %s handle %ld width %d height %d %s", instance, handle, width, height, url); plugin_send_message_to_appletviewer (window_message); g_free (window_message); window_message = NULL; PLUGIN_DEBUG ("plugin_send_initialization_message return\n"); } // Stop the appletviewer process. When this is called the // appletviewer can be in any of three states: running, crashed or // hung. If the appletviewer is running then sending it "shutdown" // will cause it to exit. This will cause // plugin_out_pipe_callback/plugin_in_pipe_callback to be called and // the input and output channels to be shut down. If the appletviewer // has crashed then plugin_out_pipe_callback/plugin_in_pipe_callback // would already have been called and data->appletviewer_alive cleared // in which case this function simply returns. If the appletviewer is // hung then this function will be successful and the input and output // watches will be removed by plugin_data_destroy. // plugin_stop_appletviewer must be called with // data->appletviewer_mutex held. static void plugin_stop_appletviewer () { PLUGIN_DEBUG ("plugin_stop_appletviewer\n"); if (jvm_up) { // Shut down the appletviewer. gsize bytes_written = 0; if (out_to_appletviewer) { if (g_io_channel_write_chars (out_to_appletviewer, "shutdown", -1, &bytes_written, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { PLUGIN_ERROR ("Failed to write shutdown message to " " appletviewer, %s \n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to write shutdown message to\n"); } if (g_io_channel_flush (out_to_appletviewer, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { PLUGIN_ERROR ("Failed to write shutdown message to" " appletviewer %s \n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to write shutdown message to\n"); } if (g_io_channel_shutdown (out_to_appletviewer, TRUE, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { PLUGIN_ERROR ("Failed to shut down appletviewer" " output channel %s \n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to shut down appletviewer\n"); } } if (in_from_appletviewer) { if (g_io_channel_shutdown (in_from_appletviewer, TRUE, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { PLUGIN_ERROR ("Failed to shut down appletviewer" " input channel %s \n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to shut down appletviewer\n"); } } } jvm_up = FALSE; sleep(2); /* Needed to prevent crashes during debug (when JDWP port is not freed by the kernel right away) */ PLUGIN_DEBUG ("plugin_stop_appletviewer return\n"); } static void appletviewer_monitor(GPid pid, gint status, gpointer data) { PLUGIN_DEBUG ("appletviewer_monitor\n"); jvm_up = FALSE; pid = -1; PLUGIN_DEBUG ("appletviewer_monitor return\n"); } void plugin_data_destroy (NPP instance) { PLUGIN_DEBUG ("plugin_data_destroy\n"); ITNPPluginData* tofree = (ITNPPluginData*) instance->pdata; // Remove instance from map gpointer id_ptr = g_hash_table_lookup(instance_to_id_map, instance); if (id_ptr) { gint id = GPOINTER_TO_INT(id_ptr); g_hash_table_remove(instance_to_id_map, instance); g_hash_table_remove(id_to_instance_map, id_ptr); } /* Explicitly call destructor */ tofree->~ITNPPluginData(); (*browser_functions.memfree) (tofree); PLUGIN_DEBUG ("plugin_data_destroy return\n"); } static bool initialize_browser_functions(const NPNetscapeFuncs* browserTable) { #define NPNETSCAPEFUNCS_LAST_FIELD_USED (browserTable->setvalueforurl) //Determine the size in bytes, as a difference of the address past the last used field //And the browser table address size_t usedSize = (char*)(1 + &NPNETSCAPEFUNCS_LAST_FIELD_USED) - (char*)browserTable; // compare the reported size versus the size we required if (browserTable->size < usedSize) { return false; } //Ensure any unused fields are NULL memset(&browser_functions, 0, sizeof(NPNetscapeFuncs)); //browserTable->size can be larger than sizeof(NPNetscapeFuncs) (PR1106) size_t copySize = browserTable->size < sizeof(NPNetscapeFuncs) ? browserTable->size : sizeof(NPNetscapeFuncs); //Copy fields according to given size memcpy(&browser_functions, browserTable, copySize); return true; } /* Set the plugin table to the correct contents, taking care not to write past * the provided object space */ static bool initialize_plugin_table(NPPluginFuncs* pluginTable) { #define NPPLUGINFUNCS_LAST_FIELD_USED (pluginTable->getvalue) //Determine the size in bytes, as a difference of the address past the last used field //And the browser table address size_t usedSize = (char*)(1 + &NPPLUGINFUNCS_LAST_FIELD_USED) - (char*)pluginTable; // compare the reported size versus the size we required if (pluginTable->size < usedSize) return false; pluginTable->version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR; pluginTable->size = sizeof (NPPluginFuncs); pluginTable->newp = NPP_NewProcPtr (ITNP_New); pluginTable->destroy = NPP_DestroyProcPtr (ITNP_Destroy); pluginTable->setwindow = NPP_SetWindowProcPtr (ITNP_SetWindow); pluginTable->newstream = NPP_NewStreamProcPtr (ITNP_NewStream); pluginTable->destroystream = NPP_DestroyStreamProcPtr (ITNP_DestroyStream); pluginTable->asfile = NPP_StreamAsFileProcPtr (ITNP_StreamAsFile); pluginTable->writeready = NPP_WriteReadyProcPtr (ITNP_WriteReady); pluginTable->write = NPP_WriteProcPtr (ITNP_Write); pluginTable->print = NPP_PrintProcPtr (ITNP_Print); pluginTable->urlnotify = NPP_URLNotifyProcPtr (ITNP_URLNotify); pluginTable->getvalue = NPP_GetValueProcPtr (ITNP_GetValue); return true; } // Make sure the plugin data directory exists, creating it if necessary. NPError initialize_data_directory() { data_directory = IcedTeaPluginUtilities::getRuntimePath() + "/icedteaplugin-"; if (getenv("USER") != NULL) { data_directory = data_directory + getenv("USER") + "-"; } data_directory += "XXXXXX"; // Now create a icedteaplugin subdir char fileNameX[data_directory.length()+1]; std::strcpy (fileNameX, data_directory.c_str()); char * fileName = mkdtemp(fileNameX); if (fileName == NULL) { PLUGIN_ERROR ("Failed to create data directory %s, %s\n", data_directory.c_str(), strerror (errno)); return NPERR_GENERIC_ERROR; } data_directory = std::string(fileName); //open uniques icedteaplugin subdir for one single run data_directory_descriptor = opendir(data_directory.c_str()); if (data_directory_descriptor == NULL) { PLUGIN_ERROR ("Failed to open data directory %s %s\n", data_directory.c_str(), strerror (errno)); return NPERR_GENERIC_ERROR; } return NPERR_NO_ERROR; } // FACTORY FUNCTIONS // Provides the browser with pointers to the plugin functions that we // implement and initializes a local table with browser functions that // we may wish to call. Called once, after browser startup and before // the first plugin instance is created. // The field 'initialized' is set to true once this function has // finished. If 'initialized' is already true at the beginning of // this function, then it is evident that NP_Initialize has already // been called. There is no need to call this function more than once and // this workaround avoids any duplicate calls. __attribute__ ((visibility ("default"))) NPError NP_Initialize (NPNetscapeFuncs* browserTable, NPPluginFuncs* pluginTable) { PLUGIN_DEBUG ("NP_Initialize\n"); if ((browserTable == NULL) || (pluginTable == NULL)) { PLUGIN_ERROR ("Browser or plugin function table is NULL.\n"); return NPERR_INVALID_FUNCTABLE_ERROR; } // Ensure that the major version of the plugin API that the browser // expects is not more recent than the major version of the API that // we've implemented. if ((browserTable->version >> 8) > NP_VERSION_MAJOR) { PLUGIN_ERROR ("Incompatible version.\n"); return NPERR_INCOMPATIBLE_VERSION_ERROR; } // Copy into a global table (browser_functions) the browser functions that we may use. // If the browser functions needed change, update NPNETSCAPEFUNCS_LAST_FIELD_USED // within this function bool browser_functions_supported = initialize_browser_functions(browserTable); // Check if everything we rely on is supported if ( !browser_functions_supported ) { PLUGIN_ERROR ("Invalid browser function table.\n"); return NPERR_INVALID_FUNCTABLE_ERROR; } // Return to the browser the plugin functions that we implement. // If the plugin functions needed change, update NPPLUGINFUNCS_LAST_FIELD_USED // within this function bool plugin_functions_supported = initialize_plugin_table(pluginTable); // Check if everything we rely on is supported if ( !plugin_functions_supported ) { PLUGIN_ERROR ("Invalid plugin function table.\n"); return NPERR_INVALID_FUNCTABLE_ERROR; } // Re-setting the above tables multiple times is OK (as the // browser may change its function locations). However // anything beyond this point should only run once. if (initialized) return NPERR_NO_ERROR; // create directory for pipes NPError np_error = initialize_data_directory(); if (np_error != NPERR_NO_ERROR) { PLUGIN_ERROR("Unable to create data directory %s\n", data_directory.c_str()); return np_error; } // Set appletviewer_executable. PLUGIN_DEBUG("Executing java at %s\n", get_plugin_executable().c_str()); np_error = plugin_test_appletviewer (); if (np_error != NPERR_NO_ERROR) { PLUGIN_ERROR("Unable to find java executable %s\n", get_plugin_executable().c_str()); return np_error; } javaVersion = plugin_get_java_version(); initialized = true; // Initialize threads (needed for mutexes). if (!g_thread_supported ()) g_thread_init (NULL); plugin_instance_mutex = g_mutex_new (); PLUGIN_DEBUG ("NP_Initialize: using %s\n", get_plugin_executable().c_str()); plugin_req_proc = new PluginRequestProcessor(); java_req_proc = new JavaMessageSender(); java_to_plugin_bus = new MessageBus(); plugin_to_java_bus = new MessageBus(); java_to_plugin_bus->subscribe(plugin_req_proc); plugin_to_java_bus->subscribe(java_req_proc); pthread_create (&plugin_request_processor_thread1, NULL, &queue_processor, (void*) plugin_req_proc); pthread_create (&plugin_request_processor_thread2, NULL, &queue_processor, (void*) plugin_req_proc); pthread_create (&plugin_request_processor_thread3, NULL, &queue_processor, (void*) plugin_req_proc); itnp_plugin_thread_id = pthread_self(); pthread_mutexattr_t attribute; pthread_mutexattr_init(&attribute); pthread_mutexattr_settype(&attribute, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&pluginAsyncCallMutex, &attribute); pthread_mutexattr_destroy(&attribute); PLUGIN_DEBUG ("NP_Initialize return\n"); return NPERR_NO_ERROR; } // Returns a string describing the MIME type that this plugin // handles. __attribute__ ((visibility ("default"))) #ifdef LEGACY_XULRUNNERAPI char* #else const char* #endif NP_GetMIMEDescription () { //this function is called severaltimes between lunches PLUGIN_DEBUG ("NP_GetMIMEDescription\n"); PLUGIN_DEBUG ("NP_GetMIMEDescription return\n"); return (char*) PLUGIN_MIME_DESC; } // Returns a value relevant to the plugin as a whole. The browser // calls this function to obtain information about the plugin. __attribute__ ((visibility ("default"))) NPError NP_GetValue (void* future, NPPVariable variable, void* value) { PLUGIN_DEBUG ("NP_GetValue\n"); NPError result = NPERR_NO_ERROR; gchar** char_value = (gchar**) value; switch (variable) { case NPPVpluginNameString: PLUGIN_DEBUG ("NP_GetValue: returning plugin name.\n"); *char_value = g_strdup (PLUGIN_FULL_NAME); break; case NPPVpluginDescriptionString: PLUGIN_DEBUG ("NP_GetValue: returning plugin description.\n"); *char_value = g_strdup (PLUGIN_DESC); break; default: PLUGIN_ERROR ("Unknown plugin value requested.\n"); result = NPERR_GENERIC_ERROR; break; } PLUGIN_DEBUG ("NP_GetValue return\n"); return result; } // Shuts down the plugin. Called after the last plugin instance is // destroyed. __attribute__ ((visibility ("default"))) NPError NP_Shutdown (void) { PLUGIN_DEBUG ("NP_Shutdown\n"); // Free mutex. if (plugin_instance_mutex) { g_mutex_free (plugin_instance_mutex); plugin_instance_mutex = NULL; } // stop the appletviewer plugin_stop_appletviewer(); // remove monitor if (appletviewer_watch_id != -1) g_source_remove(appletviewer_watch_id); // Removing a source is harmless if it fails since it just means the // source has already been removed. g_source_remove (in_watch_source); in_watch_source = 0; // cleanup_in_from_appletviewer: if (in_from_appletviewer) g_io_channel_unref (in_from_appletviewer); in_from_appletviewer = NULL; // cleanup_out_watch_source: g_source_remove (out_watch_source); out_watch_source = 0; // cleanup_out_to_appletviewer: if (out_to_appletviewer) g_io_channel_unref (out_to_appletviewer); out_to_appletviewer = NULL; // cleanup_out_pipe: // Delete output pipe. PLUGIN_DEBUG ("NP_Shutdown: deleting output fifo: %s\n", out_pipe_name); unlink (out_pipe_name); PLUGIN_DEBUG ("NP_Shutdown: deleted output fifo: %s\n", out_pipe_name); // cleanup_out_pipe_name: g_free (out_pipe_name); out_pipe_name = NULL; // cleanup_in_pipe: // Delete input pipe. PLUGIN_DEBUG ("NP_Shutdown: deleting input fifo: %s\n", in_pipe_name); unlink (in_pipe_name); PLUGIN_DEBUG ("NP_Shutdown: deleted input fifo: %s\n", in_pipe_name); // cleanup_in_pipe_name: g_free (in_pipe_name); in_pipe_name = NULL; if (plugin_debug_to_console){ //jvm_up is now false if (g_io_channel_shutdown (debug_to_appletviewer, TRUE, &channel_error) != G_IO_STATUS_NORMAL) { if (channel_error) { PLUGIN_ERROR ("Failed to shut down appletviewer" " debug channel\n", channel_error->message); g_error_free (channel_error); channel_error = NULL; } else PLUGIN_ERROR ("Failed to shut down debug to appletviewer\n"); } // cleanup_out_to_appletviewer: if (debug_to_appletviewer) g_io_channel_unref (debug_to_appletviewer); out_to_appletviewer = NULL; // cleanup_debug_pipe: // Delete debug pipe. PLUGIN_DEBUG ("NP_Shutdown: deleting debug fifo: %s\n", debug_pipe_name); unlink (debug_pipe_name); PLUGIN_DEBUG ("NP_Shutdown: deleted debug fifo: %s\n", debug_pipe_name); // cleanup_out_pipe_name: g_free (debug_pipe_name); debug_pipe_name = NULL; } // Destroy the call queue mutex pthread_mutex_destroy(&pluginAsyncCallMutex); initialized = false; pthread_cancel(plugin_request_processor_thread1); pthread_cancel(plugin_request_processor_thread2); pthread_cancel(plugin_request_processor_thread3); pthread_join(plugin_request_processor_thread1, NULL); pthread_join(plugin_request_processor_thread2, NULL); pthread_join(plugin_request_processor_thread3, NULL); java_to_plugin_bus->unSubscribe(plugin_req_proc); plugin_to_java_bus->unSubscribe(java_req_proc); //internal_bus->unSubscribe(java_req_proc); //internal_bus->unSubscribe(plugin_req_proc); delete plugin_req_proc; delete java_req_proc; delete java_to_plugin_bus; delete plugin_to_java_bus; //delete internal_bus; cleanUpDir(); PLUGIN_DEBUG ("NP_Shutdown return\n"); if (plugin_debug_to_file){ fflush (plugin_file_log); //fclose (plugin_file_log); //keep writing untill possible! } return NPERR_NO_ERROR; } NPObject* get_scriptable_object(NPP instance) { NPObject* obj; ITNPPluginData* data = (ITNPPluginData*) instance->pdata; if (data->is_applet_instance) // dummy instance/package? { JavaRequestProcessor java_request = JavaRequestProcessor(); JavaResultData* java_result; std::string instance_id = std::string(); std::string applet_class_id = std::string(); int id = get_id_from_instance(instance); gchar* id_str = g_strdup_printf ("%d", id); // Some browsers.. (e.g. chromium) don't call NPP_SetWindow // for 0x0 plugins and therefore require initialization with // a 0 handle if (!data->window_handle) { plugin_send_initialization_message(data->instance_id, 0, 0, 0, data->parameters_string); } java_result = java_request.getAppletObjectInstance(id_str); g_free(id_str); if (java_result->error_occurred) { PLUGIN_ERROR("Error: Unable to fetch applet instance id from Java side.\n"); return NULL; } instance_id.append(*(java_result->return_string)); java_result = java_request.getClassID(instance_id); if (java_result->error_occurred) { PLUGIN_ERROR("Error: Unable to fetch applet instance id from Java side.\n"); return NULL; } applet_class_id.append(*(java_result->return_string)); obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(instance, applet_class_id, instance_id, false); } else { obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_package_object(instance, ""); } return obj; } NPObject* allocate_scriptable_object(NPP npp, NPClass *aClass) { PLUGIN_DEBUG("Allocating new scriptable object\n"); return new IcedTeaScriptablePluginObject(npp); } icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaPluginUtils.cc0000644000000000000000000000013213441742745022462 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/IcedTeaPluginUtils.cc0000644000175000002070000011651313441742745023301 0ustar00jvanekmock00000000000000/* IcedTeaPluginUtils.cc Copyright (C) 2009, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include "IcedTeaNPPlugin.h" #include "IcedTeaScriptablePluginObject.h" #include "IcedTeaPluginUtils.h" #include /** * Misc. utility functions used by the plugin */ /*********************************************** * Begin IcedTeaPluginUtilities implementation * ************************************************/ // Initialize static variables int IcedTeaPluginUtilities::reference = -1; pthread_mutex_t IcedTeaPluginUtilities::reference_mutex = PTHREAD_MUTEX_INITIALIZER; std::map* IcedTeaPluginUtilities::instance_map = new std::map(); std::map* IcedTeaPluginUtilities::object_map = new std::map(); std::queue pre_jvm_message; /* Plugin async call queue */ static std::vector< PluginThreadCall* >* pendingPluginThreadRequests = new std::vector< PluginThreadCall* >(); bool IcedTeaPluginUtilities::create_dir(std::string dir) { if (file_exists(dir)) { if (!is_directory(dir)) { PLUGIN_ERROR("WARNING: Needed to create directory %s but there is already a file of the same name at this location.\n", dir.c_str()); return false; } PLUGIN_DEBUG("Directory %s already exists\n", dir.c_str()); } else { PLUGIN_DEBUG("Directory %s does not yet exist\n", dir.c_str()); const int PERMISSIONS_MASK = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; // 0755 bool created_directory = (g_mkdir(dir.c_str(), PERMISSIONS_MASK) == 0); int err = errno; if (!created_directory) { PLUGIN_ERROR("WARNING: Failed to create new directory %s. Reason: %s\n", dir.c_str(), strerror(err)); return false; } PLUGIN_DEBUG("Directory %s created\n", dir.c_str()); } return true; } void *flush_pre_init_messages(void* data) { while (true){ struct timespec ts; ts.tv_sec = 1; ts.tv_nsec = 0; nanosleep(&ts ,0); if (jvm_up) { while (!pre_jvm_message.empty()) { pthread_mutex_lock(&debug_pipe_lock); std::string message = pre_jvm_message.front(); pre_jvm_message.pop(); pthread_mutex_unlock(&debug_pipe_lock); plugin_send_message_to_appletviewer_console(message.c_str()); } flush_plugin_send_message_to_appletviewer_console(); } } return NULL; } void push_pre_init_messages(char * ldm){ pthread_mutex_lock(&debug_pipe_lock); pre_jvm_message.push(std::string(ldm)); pthread_mutex_unlock(&debug_pipe_lock); } void reset_pre_init_messages(){ pre_jvm_message = std::queue(); } /** * Given a context number, constructs a message prefix to send to Java * * @param context The context of the request * @return The string prefix (allocated on heap) */ void IcedTeaPluginUtilities::constructMessagePrefix(int context, std::string *result) { std::string context_str = std::string(); itoa(context, &context_str); result->append("context "); result->append(context_str); result->append(" reference -1"); } /** * Given a context number, and reference number, constructs a message prefix to * send to Java * * @param context The context of the request * @param rerefence The reference number of the request * @param result The message */ void IcedTeaPluginUtilities::constructMessagePrefix(int context, int reference, std::string* result) { // Until security is implemented, use file:// source for _everything_ std::string context_str = std::string(); std::string reference_str = std::string(); itoa(context, &context_str); itoa(reference, &reference_str); *result += "context "; result->append(context_str); *result += " reference "; result->append(reference_str); } /** * Given a context number, reference number, and source location, constructs * a message prefix to send to Java * * @param context The context of the request * @param rerefence The reference number of the request * @param address The address for the script that made the request * @param result The message */ void IcedTeaPluginUtilities::constructMessagePrefix(int context, int reference, std::string address, std::string* result) { std::string context_str = std::string(); std::string reference_str = std::string(); itoa(context, &context_str); itoa(reference, &reference_str); *result += "context "; result->append(context_str); *result += " reference "; result->append(reference_str); if (address.length() > 0) { *result += " src "; result->append(address); } } /** * Returns a string representation of a void pointer * * @param id The pointer * @param result The string representation */ void IcedTeaPluginUtilities::JSIDToString(void* id, std::string* result) { char id_str[NUM_STR_BUFFER_SIZE]; if (sizeof(void*) == sizeof(long long)) { snprintf(id_str, NUM_STR_BUFFER_SIZE, "%llu", id); } else { snprintf(id_str, NUM_STR_BUFFER_SIZE, "%lu", id); // else use long } result->append(id_str); PLUGIN_DEBUG("Converting pointer %p to %s\n", id, id_str); } /** * Returns a void pointer from a string representation * * @param id_str The string representation * @return The pointer */ void* IcedTeaPluginUtilities::stringToJSID(std::string id_str) { void* ptr; if (sizeof(void*) == sizeof(long long)) { PLUGIN_DEBUG("Casting (long long) \"%s\" -- %llu\n", id_str.c_str(), strtoull(id_str.c_str(), NULL, 0)); ptr = reinterpret_cast ((unsigned long long) strtoull(id_str.c_str(), NULL, 0)); } else { PLUGIN_DEBUG("Casting (long) \"%s\" -- %lu\n", id_str.c_str(), strtoul(id_str.c_str(), NULL, 0)); ptr = reinterpret_cast ((unsigned long) strtoul(id_str.c_str(), NULL, 0)); } PLUGIN_DEBUG("Casted: %p\n", ptr); return ptr; } /** * Returns a void pointer from a string representation * * @param id_str The pointer to the string representation * @return The pointer */ void* IcedTeaPluginUtilities::stringToJSID(std::string* id_str) { void* ptr; if (sizeof(void*) == sizeof(long long)) { PLUGIN_DEBUG("Casting (long long) \"%s\" -- %llu\n", id_str->c_str(), strtoull(id_str->c_str(), NULL, 0)); ptr = reinterpret_cast ((unsigned long long) strtoull(id_str->c_str(), NULL, 0)); } else { PLUGIN_DEBUG("Casting (long) \"%s\" -- %lu\n", id_str->c_str(), strtoul(id_str->c_str(), NULL, 0)); ptr = reinterpret_cast ((unsigned long) strtoul(id_str->c_str(), NULL, 0)); } PLUGIN_DEBUG("Casted: %p\n", ptr); return ptr; } /** * Increments the global reference number and returns it. * * This function is thread-safe. */ int IcedTeaPluginUtilities::getReference() { pthread_mutex_lock(&reference_mutex); // If we are nearing the max, reset if (reference < -0x7FFFFFFF + 10) { reference = -1; } reference--; pthread_mutex_unlock(&reference_mutex); return reference; } /** * Decrements the global reference number. * * This function is thread-safe. */ void IcedTeaPluginUtilities::releaseReference() { // do nothing for now } /** * Converts integer to char* * * @param i The integer to convert to ascii * @param result The resulting string */ void IcedTeaPluginUtilities::itoa(int i, std::string* result) { char int_str[NUM_STR_BUFFER_SIZE]; snprintf(int_str, NUM_STR_BUFFER_SIZE, "%d", i); result->append(int_str); } /** * Frees memory from a string* vector * * The vector deconstructor will only delete string pointers upon being * called. This function frees the associated string memory as well. * * @param v The vector whose strings are to be freed */ void IcedTeaPluginUtilities::freeStringPtrVector(std::vector* v) { if (v) { for (int i=0; i < v->size(); i++) { delete v->at(i); } delete v; } } /** * Given a string, splits it on the given delimiters. * * @param str The string to split * @param The delimiters to split on * @return A string vector containing the split components */ std::vector* IcedTeaPluginUtilities::strSplit(const char* str, const char* delim) { std::vector* v = new std::vector(); v->reserve(strlen(str)/2); char* copy; // Tokenization is done on a copy copy = (char*) malloc (sizeof(char)*strlen(str) + 1); strcpy(copy, str); char* tok_ptr; tok_ptr = strtok (copy, delim); while (tok_ptr != NULL) { // Allocation on heap since caller has no way to knowing how much will // be needed. Make sure caller cleans up! std::string* s = new std::string(); s->append(tok_ptr); v->push_back(s); tok_ptr = strtok (NULL, delim); } free(copy); return v; } /** * Given a unicode byte array, converts it to a UTF8 string * * The actual contents in the array may be surrounded by other data. * * e.g. with length 5, begin = 3, * unicode_byte_array = "37 28 5 48 45 4c 4c 4f 9e 47": * * We'd start at 3 i.e. "48" and go on for 5 i.e. upto and including "4f". * So we convert "48 45 4c 4c 4f" which is "hello" * * @param length The length of the string * @param begin Where in the array to begin conversion * @param result_unicode_str The return variable in which the * converted string is placed */ void IcedTeaPluginUtilities::getUTF8String(int length, int begin, std::vector* unicode_byte_array, std::string* result_unicode_str) { result_unicode_str->clear(); result_unicode_str->reserve(unicode_byte_array->size()/2); for (int i = begin; i < begin+length; i++) result_unicode_str->push_back((char) strtol(unicode_byte_array->at(i)->c_str(), NULL, 16)); PLUGIN_DEBUG("Converted UTF-8 string: %s. Length=%d\n", result_unicode_str->c_str(), result_unicode_str->length()); } /** * Given a UTF8 string, converts it to a space delimited string of hex characters * * The first element in the return array is the length of the string * * e.g. "hello" would convert to: "5 48 45 4c 4c 4f" * * @param str The string to convert * @param urt_str The result */ void IcedTeaPluginUtilities::convertStringToUTF8(std::string* str, std::string* utf_str) { std::ostringstream ostream; std::string length = std::string(); itoa(str->length(), &length); ostream << length; char hex_value[NUM_STR_BUFFER_SIZE]; for (int i = 0; i < str->length(); i++) { snprintf(hex_value, NUM_STR_BUFFER_SIZE," %hx", str->at(i)); ostream << hex_value; } utf_str->clear(); *utf_str = ostream.str(); PLUGIN_DEBUG("Converted %s to UTF-8 string %s\n", str->c_str(), utf_str->c_str()); } /** * Given a unicode byte array, converts it to a UTF16LE/UCS-2 string * * This works in a manner similar to getUTF8String, except that it reads 2 * slots for each byte. * * @param length The length of the string * @param begin Where in the array to begin conversion * @param result_unicode_str The return variable in which the * converted string is placed */ void IcedTeaPluginUtilities::getUTF16LEString(int length, int begin, std::vector* unicode_byte_array, std::wstring* result_unicode_str) { wchar_t c; PLUGIN_DEBUG("Converted UTF-16LE string: \n"); result_unicode_str->clear(); for (int i = begin; i < begin+length; i+=2) { int low = strtol(unicode_byte_array->at(i)->c_str(), NULL, 16); int high = strtol(unicode_byte_array->at(i+1)->c_str(), NULL, 16); c = ((high << 8) | low); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) { PLUGIN_DEBUG("%c\n", c); } result_unicode_str->push_back(c); } // not routing via debug print macros due to wide-string issues PLUGIN_DEBUG(". Length=%d\n", result_unicode_str->length()); } /* * Prints the given string vector (if debug is true) * * @param prefix The prefix to print before printing the vector contents * @param cv The string vector whose contents are to be printed */ void IcedTeaPluginUtilities::printStringVector(const char* prefix, std::vector* str_vector) { // This is a CPU intensive function. Run only if debugging if (!plugin_debug) return; std::string* str = new std::string(); *str += "{ "; for (int i=0; i < str_vector->size(); i++) { *str += str_vector->at(i); if (i != str_vector->size() - 1) *str += ", "; } *str += " }"; PLUGIN_DEBUG("%s %s\n", prefix, str->c_str()); delete str; } const gchar* IcedTeaPluginUtilities::getSourceFromInstance(NPP instance) { // At the moment, src cannot be securely fetched via NPAPI // See: // http://www.mail-archive.com/chromium-dev@googlegroups.com/msg04872.html // Since we use the insecure window.location.href attribute to compute // source, we cannot use it to make security decisions. Therefore, // instance associated source will always return empty //ITNPPluginData* data = (ITNPPluginData*) instance->pdata; //return (data->source) ? data->source : ""; return "http://null.null"; } /** * Stores a window pointer <-> instance mapping * * @param member_ptr The pointer key * @param instance The instance to associate with this pointer */ void IcedTeaPluginUtilities::storeInstanceID(void* member_ptr, NPP instance) { PLUGIN_DEBUG("Storing instance %p with key %p\n", instance, member_ptr); instance_map->insert(std::make_pair(member_ptr, instance)); } /** * Removes a window pointer <-> instance mapping * * @param member_ptr The key to remove */ void IcedTeaPluginUtilities::removeInstanceID(void* member_ptr) { PLUGIN_DEBUG("Removing key %p from instance map\n", member_ptr); instance_map->erase(member_ptr); } /* Clear instance_map. Useful for tests. */ void IcedTeaPluginUtilities::clearInstanceIDs() { delete instance_map; instance_map = new std::map(); } /** * Removes all mappings to a given instance, and all associated objects */ void IcedTeaPluginUtilities::invalidateInstance(NPP instance) { PLUGIN_DEBUG("Invalidating instance %p\n", instance); std::map::iterator iterator; for (iterator = instance_map->begin(); iterator != instance_map->end(); ) { if ((*iterator).second == instance) { instance_map->erase(iterator++); } else { ++iterator; } } } /** * Given the window pointer, returns the instance associated with it * * @param member_ptr The pointer key * @return The associated instance */ NPP IcedTeaPluginUtilities::getInstanceFromMemberPtr(void* member_ptr) { NPP instance = NULL; PLUGIN_DEBUG("getInstanceFromMemberPtr looking for %p\n", member_ptr); std::map::iterator iterator = instance_map->find(member_ptr); if (iterator != instance_map->end()) { instance = instance_map->find(member_ptr)->second; PLUGIN_DEBUG("getInstanceFromMemberPtr found %p. Instance = %p\n", member_ptr, instance); } return instance; } /** * Given a java id key ('classid:instanceid'), returns the associated valid NPObject, if any * * @param key the key * @return The associated active NPObject, NULL otherwise */ NPObject* IcedTeaPluginUtilities::getNPObjectFromJavaKey(std::string key) { NPObject* object = NULL; PLUGIN_DEBUG("getNPObjectFromJavaKey looking for %s\n", key.c_str()); std::map::iterator iterator = object_map->find(key); if (iterator != object_map->end()) { NPObject* mapped_object = object_map->find(key)->second; if (getInstanceFromMemberPtr(mapped_object) != NULL) { object = mapped_object; PLUGIN_DEBUG("getNPObjectFromJavaKey found %s. NPObject = %p\n", key.c_str(), object); } } return object; } /** * Stores a java id key <-> NPObject mapping * * @param key The Java ID Key * @param object The object to map to */ void IcedTeaPluginUtilities::storeObjectMapping(std::string key, NPObject* object) { PLUGIN_DEBUG("Storing object %p with key %s\n", object, key.c_str()); object_map->insert(std::make_pair(key, object)); } /** * Removes a java id key <-> NPObject mapping * * @param key The key to remove */ void IcedTeaPluginUtilities::removeObjectMapping(std::string key) { PLUGIN_DEBUG("Removing key %s from object map\n", key.c_str()); object_map->erase(key); } /* Clear object_map. Useful for tests. */ void IcedTeaPluginUtilities::clearObjectMapping() { std::map::iterator iter = object_map->begin(); for (; iter != object_map->end(); ++iter) { browser_functions.releaseobject(iter->second); } delete object_map; object_map = new std::map(); } /* * Similar to printStringVector, but takes a vector of string pointers instead * * @param prefix The prefix to print before printing the vector contents * @param cv The string* vector whose contents are to be printed */ void IcedTeaPluginUtilities::printStringPtrVector(const char* prefix, std::vector* str_ptr_vector) { // This is a CPU intensive function. Run only if debugging if (!plugin_debug) return; std::string* str = new std::string(); *str += "{ "; for (int i=0; i < str_ptr_vector->size(); i++) { *str += *(str_ptr_vector->at(i)); if (i != str_ptr_vector->size() - 1) *str += ", "; } *str += " }"; PLUGIN_DEBUG("%s %s\n", prefix, str->c_str()); delete str; } void IcedTeaPluginUtilities::printNPVariant(NPVariant variant) { // This is a CPU intensive function. Run only if debugging if (!plugin_debug) return; if (NPVARIANT_IS_VOID(variant)) { PLUGIN_DEBUG("VOID %d\n", variant); } else if (NPVARIANT_IS_NULL(variant)) { PLUGIN_DEBUG("NULL\n", variant); } else if (NPVARIANT_IS_BOOLEAN(variant)) { PLUGIN_DEBUG("BOOL: %d\n", NPVARIANT_TO_BOOLEAN(variant)); } else if (NPVARIANT_IS_INT32(variant)) { PLUGIN_DEBUG("INT32: %d\n", NPVARIANT_TO_INT32(variant)); } else if (NPVARIANT_IS_DOUBLE(variant)) { PLUGIN_DEBUG("DOUBLE: %f\n", NPVARIANT_TO_DOUBLE(variant)); } else if (NPVARIANT_IS_STRING(variant)) { std::string str = IcedTeaPluginUtilities::NPVariantAsString(variant); PLUGIN_DEBUG("STRING: %s (length=%d)\n", str.c_str(), str.size()); } else { PLUGIN_DEBUG("OBJ: %p\n", NPVARIANT_TO_OBJECT(variant)); } } void IcedTeaPluginUtilities::NPVariantToString(NPVariant variant, std::string* result) { char conv_str[NUM_STR_BUFFER_SIZE]; // conversion buffer bool was_string_already = false; if (NPVARIANT_IS_STRING(variant)) { result->append(IcedTeaPluginUtilities::NPVariantAsString(variant)); was_string_already = true; } else if (NPVARIANT_IS_VOID(variant)) { snprintf(conv_str, NUM_STR_BUFFER_SIZE, "%p", variant); } else if (NPVARIANT_IS_NULL(variant)) { snprintf(conv_str, NUM_STR_BUFFER_SIZE, "NULL"); } else if (NPVARIANT_IS_BOOLEAN(variant)) { if (NPVARIANT_TO_BOOLEAN(variant)) snprintf(conv_str, NUM_STR_BUFFER_SIZE, "true"); else snprintf(conv_str, NUM_STR_BUFFER_SIZE, "false"); } else if (NPVARIANT_IS_INT32(variant)) { snprintf(conv_str, NUM_STR_BUFFER_SIZE, "%d", NPVARIANT_TO_INT32(variant)); } else if (NPVARIANT_IS_DOUBLE(variant)) { snprintf(conv_str, NUM_STR_BUFFER_SIZE, "%f", NPVARIANT_TO_DOUBLE(variant)); } else { snprintf(conv_str, NUM_STR_BUFFER_SIZE, "[Object %p]", variant); } if (!was_string_already){ result->append(conv_str); } } /** * Convert either a void, boolean, or a number */ static void javaPrimitiveResultToNPVariant(const std::string& value, NPVariant* variant) { if (value == "void") { PLUGIN_DEBUG("Method call returned void\n"); VOID_TO_NPVARIANT(*variant); } else if (value == "null") { PLUGIN_DEBUG("Method call returned null\n"); NULL_TO_NPVARIANT(*variant); } else if (value == "true") { PLUGIN_DEBUG("Method call returned a boolean (true)\n"); BOOLEAN_TO_NPVARIANT(true, *variant); } else if (value == "false") { PLUGIN_DEBUG("Method call returned a boolean (false)\n"); BOOLEAN_TO_NPVARIANT(false, *variant); } else { double d = strtod(value.c_str(), NULL); // See if it is convertible to int if (value.find(".") != std::string::npos || d < -(0x7fffffffL - 1L) || d > 0x7fffffffL) { PLUGIN_DEBUG("Method call returned a double %f\n", d); DOUBLE_TO_NPVARIANT(d, *variant); } else { int32_t i = (int32_t) d; PLUGIN_DEBUG("Method call returned an int %d\n", i); INT32_TO_NPVARIANT(i, *variant); } } } static bool javaStringResultToNPVariant(const std::string& jobject_id, NPVariant* variant) { JavaRequestProcessor jrequest_processor; JavaResultData* jstring_result = jrequest_processor.getString(jobject_id); if (jstring_result->error_occurred) { return false; } std::string str = *jstring_result->return_string; PLUGIN_DEBUG( "Method call returned a string:\"%s\"\n", str.c_str()); *variant = IcedTeaPluginUtilities::NPVariantStringCopy(str); return true; } static bool javaJSObjectResultToNPVariant(const std::string& js_id, NPVariant* variant) { NPVariant* result_variant = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(js_id); *variant = *result_variant; return true; } static bool javaObjectResultToNPVariant(NPP instance, const std::string& jclass_name, const std::string& jobject_id, NPVariant* variant) { // Reference the class object so we can construct an NPObject with it and the instance JavaRequestProcessor jrequest_processor; JavaResultData* jclass_result = jrequest_processor.getClassID(jobject_id); if (jclass_result->error_occurred) { return false; } std::string jclass_id = *jclass_result->return_string; NPObject* obj; if (jclass_name.at(0) == '[') // array { PLUGIN_DEBUG( "javaObjectResultToNPVariant Array detected: \"%s\"\n", jclass_name.c_str()); obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(instance, jclass_id, jobject_id, true); } else { PLUGIN_DEBUG( "javaObjectResultToNPVariant Scalar object: \"%s\"\n", jclass_name.c_str()); obj = IcedTeaScriptableJavaObject::get_scriptable_java_object(instance, jclass_id, jobject_id, false); } OBJECT_TO_NPVARIANT(obj, *variant); return true; } bool IcedTeaPluginUtilities::javaResultToNPVariant(NPP instance, std::string* java_value, NPVariant* variant) { int literal_n = sizeof("literalreturn"); // Accounts for one space char int jsobject_n = sizeof("jsobject"); // Accounts for one space char if (strncmp("literalreturn ", java_value->c_str(), literal_n) == 0) { javaPrimitiveResultToNPVariant(java_value->substr(literal_n), variant); } else if (strncmp("jsobject ", java_value->c_str(), jsobject_n) == 0) { javaJSObjectResultToNPVariant(java_value->substr(jsobject_n), variant); } else { std::string jobject_id = *java_value; JavaRequestProcessor jrequest_processor; JavaResultData* jclassname_result = jrequest_processor.getClassName(jobject_id); if (jclassname_result->error_occurred) { return false; } // Special-case for NPString if string if (*jclassname_result->return_string == "java.lang.String") { return javaStringResultToNPVariant(jobject_id, variant); } else // Else this needs a java object wrapper { return javaObjectResultToNPVariant(instance, *jclassname_result->return_string, jobject_id, variant); } } return true; } bool IcedTeaPluginUtilities::isObjectJSArray(NPP instance, NPObject* object) { NPVariant constructor_v = NPVariant(); NPIdentifier constructor_id = browser_functions.getstringidentifier("constructor"); browser_functions.getproperty(instance, object, constructor_id, &constructor_v); IcedTeaPluginUtilities::printNPVariant(constructor_v); // void constructor => not an array if (NPVARIANT_IS_VOID(constructor_v)) return false; NPObject* constructor = NPVARIANT_TO_OBJECT(constructor_v); NPVariant constructor_str; NPIdentifier toString = browser_functions.getstringidentifier("toString"); browser_functions.invoke(instance, constructor, toString, NULL, 0, &constructor_str); IcedTeaPluginUtilities::printNPVariant(constructor_str); std::string constructor_name = IcedTeaPluginUtilities::NPVariantAsString(constructor_str); PLUGIN_DEBUG("Constructor for NPObject is %s\n", constructor_name.c_str()); return constructor_name.find("function Array") == 0; } void IcedTeaPluginUtilities::decodeURL(const gchar* url, gchar** decoded_url) { PLUGIN_DEBUG("GOT URL: %s -- %s\n", url, *decoded_url); int length = strlen(url); for (int i=0; i < length; i++) { if (url[i] == '%' && i < length - 2) { unsigned char code1 = (unsigned char) url[i+1]; unsigned char code2 = (unsigned char) url[i+2]; if (!IS_VALID_HEX(&code1) || !IS_VALID_HEX(&code2)) continue; // Convert hex value to integer int converted1 = HEX_TO_INT(&code1); int converted2 = HEX_TO_INT(&code2); // bitshift 4 to simulate *16 int value = (converted1 << 4) + converted2; char decoded = value; strncat(*decoded_url, &decoded, 1); i += 2; } else { strncat(*decoded_url, &url[i], 1); } } PLUGIN_DEBUG("SENDING URL: %s\n", *decoded_url); } /* Copies a variant data type into a C++ string */ std::string IcedTeaPluginUtilities::NPVariantAsString(NPVariant variant) { return std::string( NPVARIANT_TO_STRING(variant).UTF8Characters, NPVARIANT_TO_STRING(variant).UTF8Length); } /** * Posts a function for execution on the plug-in thread and wait for result. * * @param instance The NPP instance * @param func The function to post * @param data Arguments to *func */ NPString IcedTeaPluginUtilities::NPStringCopy(const std::string& result) { char* utf8 = (char*)browser_functions.memalloc(result.size() + 1); strncpy(utf8, result.c_str(), result.size() + 1); NPString npstr = {utf8, result.size()}; return npstr; } NPVariant IcedTeaPluginUtilities::NPVariantStringCopy(const std::string& result) { NPString npstr = NPStringCopy(result); NPVariant npvar; STRINGN_TO_NPVARIANT(npstr.UTF8Characters, npstr.UTF8Length, npvar); return npvar; } void IcedTeaPluginUtilities::callAndWaitForResult(NPP instance, void (*func) (void *), AsyncCallThreadData* data) { struct timespec t; struct timespec curr_t; clock_gettime(CLOCK_REALTIME, &t); t.tv_sec += REQUESTTIMEOUT; // timeout // post request postPluginThreadAsyncCall(instance, func, data); do { clock_gettime(CLOCK_REALTIME, &curr_t); if (data != NULL && !data->result_ready && (curr_t.tv_sec < t.tv_sec)) { usleep(2000); } else { break; } } while (1); } /** * Posts a request that needs to be handled in a plugin thread. * * @param instance The plugin instance * @param func The function to execute * @param userData The userData for the function to consume/write to * @return if the call was posted successfully */ bool IcedTeaPluginUtilities::postPluginThreadAsyncCall(NPP instance, void (*func) (void *), void* data) { if (instance) { PluginThreadCall* call = new PluginThreadCall(); call->instance = instance; call->func = func; call->userData = data; pthread_mutex_lock(&pluginAsyncCallMutex); pendingPluginThreadRequests->push_back(call); pthread_mutex_unlock(&pluginAsyncCallMutex); browser_functions.pluginthreadasynccall(instance, &processAsyncCallQueue, NULL); // Always returns immediately PLUGIN_DEBUG("Pushed back call evt %p\n", call); return true; } // Else PLUGIN_DEBUG("Instance is not active. Call rejected.\n"); return false; } /** * Returns a vector of gchar* pointing to the elements of the vector string passed in. * @param stringVec The vector of strings reference. */ std::vector IcedTeaPluginUtilities::vectorStringToVectorGchar(const std::vector* stringVec) { std::vector charVec; for (int i = 0; i < stringVec->size(); i++) { gchar* element = (gchar*) stringVec->at(i).c_str(); //cast from const char charVec.push_back(element); } charVec.push_back(NULL); return charVec; } /** * Runs through the async call wait queue and executes all calls * * @param param Ignored -- required to conform to NPN_PluginThreadAsynCall API */ void processAsyncCallQueue(void* param /* ignored */) { do { PluginThreadCall* call = NULL; pthread_mutex_lock(&pluginAsyncCallMutex); if (pendingPluginThreadRequests->size() > 0) { call = pendingPluginThreadRequests->front(); pendingPluginThreadRequests->erase(pendingPluginThreadRequests->begin()); } pthread_mutex_unlock(&pluginAsyncCallMutex); if (call) { PLUGIN_DEBUG("Processing call evt %p\n", call); call->func(call->userData); PLUGIN_DEBUG("Call evt %p processed\n", call); delete call; } else { break; } } while(1); } void IcedTeaPluginUtilities::trim(std::string& str) { size_t start = str.find_first_not_of(" \t\n"), end = str.find_last_not_of(" \t\n"); if (start == std::string::npos) { return; } str = str.substr(start, end - start + 1); } /*Unescape various escaped chars like \\ -> \ or \= -> = or \: -> , \t -> TAB , \n -> NwLine\*/ /* examples * \\= -> \= * \= -> = * \\ -> \ * \e -> \e * \: -> : * \ -> \ * \\ -> \ */ void IcedTeaPluginUtilities::unescape(std::string& str) { std::string result = ""; int len = str.length(); for (unsigned int i = 0; i < len; i++) { bool processed = false; char c1 = str[i]; if (c1 == '\\') { if (i < len - 1) { char c2 = str[i + 1]; if (c2 == '=' || c2 == '\\' || c2 == ':') { result += c2; i++; processed = true; } if (c2 == 't') { result += '\t'; i++; processed = true; } if (c2 == 'n') { result += '\n'; i++; processed = true; } if (c2 == 'r') { result += '\r'; i++; processed = true; } } } if (!processed) { result += c1; } } str = result; } std::string IcedTeaPluginUtilities::NPIdentifierAsString(NPIdentifier id) { NPUTF8* cstr = browser_functions.utf8fromidentifier(id); if (cstr == NULL) { /* Treat not-existing strings as empty. To tell if it was a valid string, * use browser_functions.identifierisstring. */ return std::string(); } std::string str = cstr; browser_functions.memfree(cstr); return str; } bool IcedTeaPluginUtilities::file_exists(std::string filename) { std::ifstream infile(filename.c_str()); return infile.good(); } bool IcedTeaPluginUtilities::is_directory(std::string filename) { if (!file_exists) { return false; } struct stat buf; stat(filename.c_str(), &buf); return S_ISDIR(buf.st_mode); } void IcedTeaPluginUtilities::initFileLog(){ if (plugin_file_log != NULL ) { //reusing return; } plugin_file_log_name = get_log_dir() + "/" + IcedTeaPluginUtilities::generateLogFileName(); int plugin_file_log_fd = open(plugin_file_log_name.c_str(), O_WRONLY | O_CREAT | O_EXCL, 0600); if (plugin_file_log_fd <=0 ) { plugin_debug_to_file = false; } else { plugin_file_log = fdopen(plugin_file_log_fd, "w"); } if (plugin_file_log == NULL ) { plugin_debug_to_file = false; } } std::string IcedTeaPluginUtilities::generateLogFileName(){ char times[96]; char result[100]; time_t t = time(NULL); struct tm p; localtime_r(&t, &p); struct timeval current_time; \ gettimeofday (¤t_time, NULL);\ strftime(times, 96, "%Y-%m-%d_%H:%M:%S", &p); snprintf(result, 100, "%s.%i",times, current_time.tv_usec/1000); return "itw-cplugin-"+std::string(result)+".log"; } void IcedTeaPluginUtilities::printDebugStatus(){ if (plugin_debug){ PLUGIN_DEBUG("plugin_debug: true, initialised\n"); if (plugin_debug_headers){ PLUGIN_DEBUG("plugin_debug_headers: true\n"); } else { PLUGIN_DEBUG("plugin_debug_headers: false\n"); } if (plugin_debug_to_file){ PLUGIN_DEBUG("plugin_debug_to_file: true, using %s\n", plugin_file_log_name.c_str()); } else { PLUGIN_DEBUG("plugin_debug_to_file: false\n"); } if (plugin_debug_to_streams){ PLUGIN_DEBUG("plugin_debug_to_streams: true\n"); } else { PLUGIN_DEBUG("plugin_debug_to_streams: false\n"); } if (plugin_debug_to_system){ PLUGIN_DEBUG("plugin_debug_to_system: true\n"); } else { PLUGIN_DEBUG("plugin_debug_to_system: false\n"); } if (plugin_debug_to_console){ if (debug_pipe_name){ PLUGIN_DEBUG("plugin_debug_to_console: true, pipe %s\n", debug_pipe_name); } else { PLUGIN_DEBUG("plugin_debug_to_console: true, pipe not yet known or broken\n"); } } else { PLUGIN_DEBUG("plugin_debug_to_console: false\n"); } } } std::string IcedTeaPluginUtilities::getTmpPath(){ const char* tmpdir_env = getenv("TMPDIR"); if (tmpdir_env != NULL && g_file_test (tmpdir_env, (GFileTest) (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) { return std::string(tmpdir_env); } else if (g_file_test (P_tmpdir, (GFileTest) (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) { return std::string(P_tmpdir); } else { // If TMPDIR and P_tmpdir do not exist, try /tmp directly return "/tmp"; } } std::string IcedTeaPluginUtilities::getRuntimePath(){ const char* rntdir_env = getenv("XDG_RUNTIME_DIR"); if (rntdir_env != NULL && g_file_test (rntdir_env, (GFileTest) (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) { return std::string(rntdir_env); } return IcedTeaPluginUtilities::getTmpPath(); } /****************************************** * Begin JavaMessageSender implementation * ****************************************** * * This implementation is very simple and is therefore folded into this file * rather than a new one. */ /** * Sends to the Java side * * @param message The message to send. * @param returns whether the message was consumable (always true) */ bool JavaMessageSender::newMessageOnBus(const char* message) { char* msg = (char*) malloc(sizeof(char)*strlen(message) + 1); strcpy(msg, message); plugin_send_message_to_appletviewer(msg); free(msg); msg = NULL; // Always successful return true; } /*********************************** * Begin MessageBus implementation * ***********************************/ /** * Constructor. * * Initializes the mutexes needed by the other functions. */ MessageBus::MessageBus() { int ret; ret = pthread_mutex_init(&subscriber_mutex, NULL); if(ret) PLUGIN_DEBUG("Error: Unable to initialize subscriber mutex: %d\n", ret); ret = pthread_mutex_init(&msg_queue_mutex, NULL); if(ret) PLUGIN_DEBUG("Error: Unable to initialize message queue mutex: %d\n", ret); PLUGIN_DEBUG("Mutexes %p and %p initialized\n", &subscriber_mutex, &msg_queue_mutex); } /** * Destructor. * * Destroy the mutexes initialized by the constructor. */ MessageBus::~MessageBus() { PLUGIN_DEBUG("MessageBus::~MessageBus\n"); int ret; ret = pthread_mutex_destroy(&subscriber_mutex); if(ret) PLUGIN_DEBUG("Error: Unable to destroy subscriber mutex: %d\n", ret); ret = pthread_mutex_destroy(&msg_queue_mutex); if(ret) PLUGIN_DEBUG("Error: Unable to destroy message queue mutex: %d\n", ret); } /** * Adds the given BusSubscriber as a subscriber to self * * @param b The BusSubscriber to subscribe */ void MessageBus::subscribe(BusSubscriber* b) { // Applets may initialize in parallel. So lock before pushing. PLUGIN_DEBUG("Subscribing %p to bus %p\n", b, this); pthread_mutex_lock(&subscriber_mutex); subscribers.push_back(b); pthread_mutex_unlock(&subscriber_mutex); } /** * Removes the given BusSubscriber from the subscriber list * * @param b The BusSubscriber to ubsubscribe */ void MessageBus::unSubscribe(BusSubscriber* b) { // Applets may initialize in parallel. So lock before pushing. PLUGIN_DEBUG("Un-subscribing %p from bus %p\n", b, this); pthread_mutex_lock(&subscriber_mutex); subscribers.remove(b); pthread_mutex_unlock(&subscriber_mutex); } /** * Notifies all subscribers with the given message * * @param message The message to send to the subscribers */ void MessageBus::post(const char* message) { bool message_consumed = false; PLUGIN_DEBUG("Trying to lock %p...\n", &msg_queue_mutex); pthread_mutex_lock(&subscriber_mutex); PLUGIN_DEBUG("Message %s received on bus. Notifying subscribers.\n", message); std::list::const_iterator i; for( i = subscribers.begin(); i != subscribers.end() && !message_consumed; ++i ) { PLUGIN_DEBUG("Notifying subscriber %p of %s\n", *i, message); message_consumed = ((BusSubscriber*) *i)->newMessageOnBus(message); } pthread_mutex_unlock(&subscriber_mutex); if (!message_consumed) PLUGIN_DEBUG("Warning: No consumer found for message %s\n", message); PLUGIN_DEBUG("%p unlocked...\n", &msg_queue_mutex); } icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaJavaRequestProcessor.cc0000644000000000000000000000013213441742745024335 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/IcedTeaJavaRequestProcessor.cc0000644000175000002070000012507113441742745025153 0ustar00jvanekmock00000000000000/* IcedTeaJavaRequestProcessor.cc Copyright (C) 2009, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include "IcedTeaJavaRequestProcessor.h" #include "IcedTeaScriptablePluginObject.h" /* * This class processes LiveConnect requests from JavaScript to Java. * * It sends the requests to Java, gets the return information, and sends it * back to the browser/JavaScript */ /** * Processes return information from JavaSide (return messages of requests) * * @param message The message request to process * @return boolean indicating whether the message is serviceable by this object */ bool JavaRequestProcessor::newMessageOnBus(const char* message) { // Anything we are waiting for _MUST_ have and instance id and reference # std::vector* message_parts = IcedTeaPluginUtilities::strSplit(message, " "); IcedTeaPluginUtilities::printStringPtrVector("JavaRequest::newMessageOnBus:", message_parts); if (*(message_parts->at(0)) == "context" && *(message_parts->at(2)) == "reference") if (atoi(message_parts->at(1)->c_str()) == this->instance && atoi(message_parts->at(3)->c_str()) == this->reference) { // Gather the results // Let's get errors out of the way first if (!message_parts->at(4)->find("Error")) { for (int i=5; i < message_parts->size(); i++) { result->error_msg->append(*(message_parts->at(i))); result->error_msg->append(" "); } PLUGIN_ERROR("Error on Java side: %s\n", result->error_msg->c_str()); result->error_occurred = true; result_ready = true; } else if (!message_parts->at(4)->find("GetStringUTFChars") || !message_parts->at(4)->find("GetToStringValue")) { // first item is length, and it is radix 10 int length = strtol(message_parts->at(5)->c_str(), NULL, 10); IcedTeaPluginUtilities::getUTF8String(length, 6 /* start at */, message_parts, result->return_string); result_ready = true; } else if (!message_parts->at(4)->find("GetStringChars")) // GetStringChars (UTF-16LE/UCS-2) { // first item is length, and it is radix 10 int length = strtol(message_parts->at(5)->c_str(), NULL, 10); IcedTeaPluginUtilities::getUTF16LEString(length, 6 /* start at */, message_parts, result->return_wstring); result_ready = true; } else if (!message_parts->at(4)->find("FindClass") || !message_parts->at(4)->find("GetClassName") || !message_parts->at(4)->find("GetClassID") || !message_parts->at(4)->find("GetMethodID") || !message_parts->at(4)->find("GetStaticMethodID") || !message_parts->at(4)->find("GetObjectClass") || !message_parts->at(4)->find("NewObject") || !message_parts->at(4)->find("NewStringUTF") || !message_parts->at(4)->find("HasPackage") || !message_parts->at(4)->find("HasMethod") || !message_parts->at(4)->find("HasField") || !message_parts->at(4)->find("GetStaticFieldID") || !message_parts->at(4)->find("GetFieldID") || !message_parts->at(4)->find("GetJavaObject") || !message_parts->at(4)->find("IsInstanceOf") || !message_parts->at(4)->find("NewArray")) { result->return_identifier = atoi(message_parts->at(5)->c_str()); result->return_string->append(*(message_parts->at(5))); // store it as a string as well, for easy access result_ready = true; } else if (!message_parts->at(4)->find("DeleteLocalRef") || !message_parts->at(4)->find("NewGlobalRef")) { result_ready = true; // nothing else to do } else if (!message_parts->at(4)->find("CallMethod") || !message_parts->at(4)->find("CallStaticMethod") || !message_parts->at(4)->find("GetField") || !message_parts->at(4)->find("GetStaticField") || !message_parts->at(4)->find("GetValue") || !message_parts->at(4)->find("GetObjectArrayElement")) { if (!message_parts->at(5)->find("literalreturn") || !message_parts->at(5)->find("jsobject")) { // literal returns don't have a corresponding jni id result->return_identifier = 0; result->return_string->append(*(message_parts->at(5))); result->return_string->append(" "); result->return_string->append(*(message_parts->at(6))); } else { // Else it is a complex object result->return_identifier = atoi(message_parts->at(5)->c_str()); result->return_string->append(*(message_parts->at(5))); // store it as a string as well, for easy access } result_ready = true; } else if (!message_parts->at(4)->find("GetArrayLength")) { result->return_identifier = 0; // length is not an "identifier" result->return_string->append(*(message_parts->at(5))); result_ready = true; } else if (!message_parts->at(4)->find("SetField") || !message_parts->at(4)->find("SetObjectArrayElement")) { // nothing to do result->return_identifier = 0; result_ready = true; } IcedTeaPluginUtilities::freeStringPtrVector(message_parts); return true; } IcedTeaPluginUtilities::freeStringPtrVector(message_parts); return false; } /** * Constructor. * * Initializes the result data structure (heap) */ JavaRequestProcessor::JavaRequestProcessor() { PLUGIN_DEBUG("JavaRequestProcessor constructor\n"); // caller frees this result = new JavaResultData(); result->error_msg = new std::string(); result->return_identifier = 0; result->return_string = new std::string(); result->return_wstring = new std::wstring(); result->error_occurred = false; result_ready = false; } /** * Destructor * * Frees memory used by the result struct */ JavaRequestProcessor::~JavaRequestProcessor() { PLUGIN_DEBUG("JavaRequestProcessor::~JavaRequestProcessor\n"); if (result) { if (result->error_msg) delete result->error_msg; if (result->return_string) delete result->return_string; if (result->return_wstring) delete result->return_wstring; delete result; } } /** * Resets the results */ void JavaRequestProcessor::resetResult() { // caller frees this result->error_msg->clear(); result->return_identifier = 0; result->return_string->clear(); result->return_wstring->clear(); result->error_occurred = false; result_ready = false; } void JavaRequestProcessor::postAndWaitForResponse(std::string message) { struct timespec t; clock_gettime(CLOCK_REALTIME, &t); t.tv_sec += REQUESTTIMEOUT; // 1 minute timeout // Clear the result resetResult(); java_to_plugin_bus->subscribe(this); plugin_to_java_bus->post(message.c_str()); // Wait for result to be filled in. struct timespec curr_t; bool isPluginThread = false; if (pthread_self() == itnp_plugin_thread_id) { isPluginThread = true; PLUGIN_DEBUG("JRP is in plug-in thread...\n"); } do { clock_gettime(CLOCK_REALTIME, &curr_t); if (!result_ready && (curr_t.tv_sec < t.tv_sec)) { if (isPluginThread) { processAsyncCallQueue(NULL); // Let the browser run its pending events too if (g_main_context_pending(NULL)) { g_main_context_iteration(NULL, false); } else { usleep(1000); // 1ms } } else { usleep(1000); // 1ms } } else { break; } } while (1); if (curr_t.tv_sec >= t.tv_sec) { result->error_occurred = true; result->error_msg->append("Error: Timed out when waiting for response"); // Report error PLUGIN_DEBUG("Error: Timed out when waiting for response to %s\n", message.c_str()); } java_to_plugin_bus->unSubscribe(this); } /** * Given an object id, fetches the toString() value from Java * * @param object_id The ID of the object * @return A JavaResultData struct containing the result of the request */ JavaResultData* JavaRequestProcessor::getToStringValue(std::string object_id) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" GetToStringValue "); // get it in UTF8 message.append(object_id); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } /** * Given an object id, fetches the value of that ID from Java * * @param object_id The ID of the object * @return A JavaResultData struct containing the result of the request */ JavaResultData* JavaRequestProcessor::getValue(std::string object_id) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" GetValue "); // get it in UTF8 message.append(object_id); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } /** * Given a string id, fetches the actual string from Java side * * @param string_id The ID of the string * @return A JavaResultData struct containing the result of the request */ JavaResultData* JavaRequestProcessor::getString(std::string string_id) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" GetStringUTFChars "); // get it in UTF8 message.append(string_id); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } /** * Decrements reference count by 1 * * @param object_id The ID of the object */ void JavaRequestProcessor::deleteReference(std::string object_id) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" DeleteLocalRef "); message.append(object_id); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); } /** * Increments reference count by 1 * * @param object_id The ID of the object */ void JavaRequestProcessor::addReference(std::string object_id) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" NewGlobalRef "); message.append(object_id); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); } JavaResultData* JavaRequestProcessor::findClass(int plugin_instance_id, std::string name) { std::string message = std::string(); std::string plugin_instance_id_str = std::string(); IcedTeaPluginUtilities::itoa(plugin_instance_id, &plugin_instance_id_str); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" FindClass "); message.append(plugin_instance_id_str); message.append(" "); message.append(name); postAndWaitForResponse(message); return result; } JavaResultData* JavaRequestProcessor::getClassName(std::string objectID) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" GetClassName "); message.append(objectID); postAndWaitForResponse(message); return result; } JavaResultData* JavaRequestProcessor::getClassID(std::string objectID) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" GetClassID "); message.append(objectID); postAndWaitForResponse(message); return result; } JavaResultData* JavaRequestProcessor::getArrayLength(std::string objectID) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" GetArrayLength "); message.append(objectID); postAndWaitForResponse(message); return result; } JavaResultData* JavaRequestProcessor::getSlot(std::string objectID, std::string index) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" GetObjectArrayElement "); message.append(objectID); message.append(" "); message.append(index); postAndWaitForResponse(message); return result; } JavaResultData* JavaRequestProcessor::setSlot(std::string objectID, std::string index, std::string value_id) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" SetObjectArrayElement "); message.append(objectID); message.append(" "); message.append(index); message.append(" "); message.append(value_id); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::newArray(std::string array_class, std::string length) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" NewArray "); message.append(array_class); message.append(" "); message.append(length); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::getFieldID(std::string classID, std::string fieldName) { JavaResultData* java_result; JavaRequestProcessor* java_request = new JavaRequestProcessor(); std::string message = std::string(); java_result = java_request->newString(fieldName); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" GetFieldID "); message.append(classID); message.append(" "); message.append(java_result->return_string->c_str()); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); delete java_request; return result; } JavaResultData* JavaRequestProcessor::getStaticFieldID(std::string classID, std::string fieldName) { JavaResultData* java_result; JavaRequestProcessor* java_request = new JavaRequestProcessor(); std::string message = std::string(); java_result = java_request->newString(fieldName); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" GetStaticFieldID "); message.append(classID); message.append(" "); message.append(java_result->return_string->c_str()); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); delete java_request; return result; } JavaResultData* JavaRequestProcessor::getField(std::string source, std::string classID, std::string objectID, std::string fieldName) { JavaResultData* java_result; JavaRequestProcessor* java_request = new JavaRequestProcessor(); std::string message = std::string(); java_result = java_request->getFieldID(classID, fieldName); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, source, &message); message.append(" GetField "); message.append(objectID); message.append(" "); message.append(java_result->return_string->c_str()); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); delete java_request; return result; } JavaResultData* JavaRequestProcessor::getStaticField(std::string source, std::string classID, std::string fieldName) { JavaResultData* java_result; JavaRequestProcessor* java_request = new JavaRequestProcessor(); std::string message = std::string(); java_result = java_request->getStaticFieldID(classID, fieldName); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, source, &message); message.append(" GetStaticField "); message.append(classID); message.append(" "); message.append(java_result->return_string->c_str()); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); delete java_request; return result; } JavaResultData* JavaRequestProcessor::set(std::string source, bool isStatic, std::string classID, std::string objectID, std::string fieldName, std::string value_id) { JavaResultData* java_result; JavaRequestProcessor java_request = JavaRequestProcessor(); std::string message = std::string(); java_result = java_request.getFieldID(classID, fieldName); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, source, &message); if (isStatic) { message.append(" SetStaticField "); message.append(classID); } else { message.append(" SetField "); message.append(objectID); } message.append(" "); message.append(java_result->return_string->c_str()); message.append(" "); message.append(value_id); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::setStaticField(std::string source, std::string classID, std::string fieldName, std::string value_id) { return set(source, true, classID, "", fieldName, value_id); } JavaResultData* JavaRequestProcessor::setField(std::string source, std::string classID, std::string objectID, std::string fieldName, std::string value_id) { return set(source, false, classID, objectID, fieldName, value_id); } JavaResultData* JavaRequestProcessor::getMethodID(std::string classID, NPIdentifier methodName, std::vector args) { std::string message, signature = "("; // FIXME: Need to determine how to extract array types and complex java objects for (int i=0; i < args.size(); i++) { signature += args[i]; } signature += ")"; this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message += " GetMethodID " + classID + " "; message += IcedTeaPluginUtilities::NPIdentifierAsString(methodName) + " "; message += signature; postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::getStaticMethodID(std::string classID, NPIdentifier methodName, std::vector args) { std::string message, signature = "("; // FIXME: Need to determine how to extract array types and complex java objects for (int i=0; i < args.size(); i++) { signature += args[i]; } signature += ")"; this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message += " GetStaticMethodID " + classID + " "; message += IcedTeaPluginUtilities::NPIdentifierAsString(methodName) + " "; message += signature; postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } void getArrayTypeForJava(NPP instance, NPVariant element, std::string* type) { if (NPVARIANT_IS_BOOLEAN(element)) { type->append("string"); } else if (NPVARIANT_IS_INT32(element)) { type->append("string"); } else if (NPVARIANT_IS_DOUBLE(element)) { type->append("string"); } else if (NPVARIANT_IS_STRING(element)) { type->append("string"); } else if (NPVARIANT_IS_OBJECT(element)) { NPObject* first_element_obj = NPVARIANT_TO_OBJECT(element); if (IcedTeaScriptableJavaPackageObject::is_valid_java_object(first_element_obj)) { std::string class_id = std::string(((IcedTeaScriptableJavaObject*) first_element_obj)->getClassID()); type->append(class_id); } else { type->append("jsobject"); } } else { type->append("jsobject"); // Else it is a string } } void createJavaObjectFromVariant(NPP instance, NPVariant variant, std::string* id) { JavaResultData* java_result; std::string className; std::string jsObjectClassID = std::string(); std::string jsObjectConstructorID = std::string(); std::string stringArg = std::string(); std::vector args = std::vector(); JavaRequestProcessor java_request = JavaRequestProcessor(); bool alreadyCreated = false; if (NPVARIANT_IS_VOID(variant)) { PLUGIN_DEBUG("VOID %d\n", variant); id->append("0"); return; // no need to go further } else if (NPVARIANT_IS_NULL(variant)) { PLUGIN_DEBUG("NULL\n", variant); id->append("0"); return; // no need to go further } else if (NPVARIANT_IS_BOOLEAN(variant)) { className = "java.lang.Boolean"; if (NPVARIANT_TO_BOOLEAN(variant)) stringArg = "true"; else stringArg = "false"; } else if (NPVARIANT_IS_INT32(variant)) { className = "java.lang.Integer"; char* valueStr = (char*) malloc(sizeof(char)*32); sprintf(valueStr, "%d", NPVARIANT_TO_INT32(variant)); stringArg += valueStr; free(valueStr); } else if (NPVARIANT_IS_DOUBLE(variant)) { className = "java.lang.Double"; char* valueStr = (char*) malloc(sizeof(char)*1024); sprintf(valueStr, "%f", NPVARIANT_TO_DOUBLE(variant)); stringArg += valueStr; free(valueStr); } else if (NPVARIANT_IS_STRING(variant)) { className = "java.lang.String"; stringArg = IcedTeaPluginUtilities::NPVariantAsString(variant); } else if (NPVARIANT_IS_OBJECT(variant)) { NPObject* obj = NPVARIANT_TO_OBJECT(variant); if (IcedTeaScriptableJavaPackageObject::is_valid_java_object(obj)) { PLUGIN_DEBUG("NPObject is a Java object\n"); alreadyCreated = true; } else { PLUGIN_DEBUG("NPObject is not a Java object\n"); NPIdentifier length_id = browser_functions.getstringidentifier("length"); bool isJSObjectArray = false; // FIXME: We currently only handle <= 2 dim arrays. Do we really need more though? // Is it an array? if (IcedTeaPluginUtilities::isObjectJSArray(instance, obj)) { PLUGIN_DEBUG("NPObject is an array\n"); std::string array_id = std::string(); std::string java_array_type = std::string(); NPVariant length = NPVariant(); browser_functions.getproperty(instance, obj, length_id, &length); std::string length_str = std::string(); IcedTeaPluginUtilities::itoa(NPVARIANT_TO_INT32(length), &length_str); if (NPVARIANT_TO_INT32(length) >= 0) { NPIdentifier id_0 = browser_functions.getintidentifier(0); NPVariant first_element = NPVariant(); browser_functions.getproperty(instance, obj, id_0, &first_element); // Check for multi-dim array if (NPVARIANT_IS_OBJECT(first_element) && IcedTeaPluginUtilities::isObjectJSArray(instance, NPVARIANT_TO_OBJECT(first_element))) { NPVariant first_nested_element = NPVariant(); browser_functions.getproperty(instance, NPVARIANT_TO_OBJECT(first_element), id_0, &first_nested_element); getArrayTypeForJava(instance, first_nested_element, &java_array_type); length_str.append(" 0"); // secondary array is created on the fly } else { getArrayTypeForJava(instance, first_element, &java_array_type); } } // For JSObject arrays, we create a regular object (accessible via JSObject.getSlot()) if (NPVARIANT_TO_INT32(length) < 0 || !java_array_type.compare("jsobject")) { isJSObjectArray = true; goto createRegularObject; } java_result = java_request.newArray(java_array_type, length_str); if (java_result->error_occurred) { PLUGIN_ERROR("Unable to create array\n"); id->append("-1"); return; } id->append(*(java_result->return_string)); NPIdentifier index_id = NPIdentifier(); for (int i=0; i < NPVARIANT_TO_INT32(length); i++) { NPVariant value = NPVariant(); index_id = browser_functions.getintidentifier(i); browser_functions.getproperty(instance, obj, index_id, &value); std::string value_id = std::string(); createJavaObjectFromVariant(instance, value, &value_id); if (value_id == "-1") { PLUGIN_ERROR("Unable to populate array\n"); id->clear(); id->append("-1"); return; } std::string value_str = std::string(); IcedTeaPluginUtilities::itoa(i, &value_str); java_result = java_request.setSlot(*id, value_str, value_id); } // Got here => no errors above. We're good to return! return; } createRegularObject: if (!IcedTeaPluginUtilities::isObjectJSArray(instance, obj) || isJSObjectArray) // Else it is not an array { NPVariant* variant_copy = new NPVariant(); OBJECT_TO_NPVARIANT(NPVARIANT_TO_OBJECT(variant), *variant_copy); className = "netscape.javascript.JSObject"; IcedTeaPluginUtilities::JSIDToString(variant_copy, &stringArg); browser_functions.retainobject(NPVARIANT_TO_OBJECT(variant)); std::string jsObjectClassID = std::string(); std::string jsObjectConstructorID = std::string(); std::vector args = std::vector(); java_result = java_request.findClass(0, "netscape.javascript.JSObject"); // the result we want is in result_string (assuming there was no error) if (java_result->error_occurred) { PLUGIN_ERROR("Unable to get JSObject class id\n"); id->clear(); id->append("-1"); return; } jsObjectClassID.append(*(java_result->return_string)); args.push_back("J"); java_result = java_request.getMethodID(jsObjectClassID, browser_functions.getstringidentifier(""), args); // the result we want is in result_string (assuming there was no error) if (java_result->error_occurred) { PLUGIN_ERROR("Unable to get JSObject constructor id\n"); id->clear(); id->append("-1"); return; } jsObjectConstructorID.append(*(java_result->return_string)); // We have the method id. Now create a new object. args.clear(); args.push_back(stringArg); java_result = java_request.newObjectWithConstructor("", jsObjectClassID, jsObjectConstructorID, args); // Store the instance ID for future reference IcedTeaPluginUtilities::storeInstanceID(variant_copy, instance); // the result we want is in result_string (assuming there was no error) // the result we want is in result_string (assuming there was no error) if (java_result->error_occurred) { PLUGIN_ERROR("Unable to create JSObject\n"); id->clear(); id->append("-1"); return; } id->append(*(java_result->return_string)); return; } } } if (!alreadyCreated) { java_result = java_request.findClass(0, className); // the result we want is in result_string (assuming there was no error) if (java_result->error_occurred) { PLUGIN_ERROR("Unable to find classid for %s\n", className.c_str()); id->append("-1"); return; } jsObjectClassID.append(*(java_result->return_string)); std::string stringClassName = "Ljava/lang/String;"; args.push_back(stringClassName); java_result = java_request.getMethodID(jsObjectClassID, browser_functions.getstringidentifier(""), args); // the result we want is in result_string (assuming there was no error) if (java_result->error_occurred) { PLUGIN_ERROR("Unable to find string constructor for %s\n", className.c_str()); id->append("-1"); return; } jsObjectConstructorID.append(*(java_result->return_string)); // We have class id and constructor ID. So we know we can create the // object.. now create the string that will be provided as the arg java_result = java_request.newString(stringArg); if (java_result->error_occurred) { PLUGIN_ERROR("Unable to create requested object\n"); id->append("-1"); return; } // Create the object args.clear(); std::string arg = std::string(); arg.append(*(java_result->return_string)); args.push_back(arg); java_result = java_request.newObjectWithConstructor("[System]", jsObjectClassID, jsObjectConstructorID, args); if (java_result->error_occurred) { PLUGIN_ERROR("Unable to create requested object\n"); id->append("-1"); return; } id->append(*(java_result->return_string)); } else { // Else already created std::string classId = std::string(((IcedTeaScriptableJavaObject*) NPVARIANT_TO_OBJECT(variant))->getClassID()); std::string instanceId = std::string(((IcedTeaScriptableJavaObject*) NPVARIANT_TO_OBJECT(variant))->getInstanceID()); if (instanceId.length() == 0) id->append(classId.c_str()); else id->append(instanceId.c_str()); } } JavaResultData* JavaRequestProcessor::callStaticMethod(std::string source, std::string classID, std::string methodName, std::vector args) { return call(source, true, classID, methodName, args); } JavaResultData* JavaRequestProcessor::callMethod(std::string source, std::string objectID, std::string methodName, std::vector args) { return call(source, false, objectID, methodName, args); } JavaResultData* JavaRequestProcessor::call(std::string source, bool isStatic, std::string objectID, std::string methodName, std::vector args) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, source, &message); if (isStatic) message += " CallStaticMethod "; else message += " CallMethod "; message += objectID; message += " "; message += methodName; message += " "; for (int i=0; i < args.size(); i++) { message += args[i]; message += " "; } postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::getObjectClass(std::string objectID) { JavaRequestProcessor* java_request; std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message += " GetObjectClass "; message += objectID; postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::newObject(std::string source, std::string classID, std::vector args) { JavaRequestProcessor* java_request; std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, source, &message); message += " NewObject "; message += classID; message += " "; for (int i=0; i < args.size(); i++) { message += args[i]; message += " "; } postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::newObjectWithConstructor(std::string source, std::string classID, std::string methodID, std::vector args) { JavaRequestProcessor* java_request; std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, source, &message); message += " NewObjectWithConstructor "; message += classID; message += " "; message += methodID; message += " "; for (int i=0; i < args.size(); i++) { message += args[i]; message += " "; } postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::newString(std::string str) { std::string utf_string = std::string(); std::string message = std::string(); IcedTeaPluginUtilities::convertStringToUTF8(&str, &utf_string); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" NewStringUTF "); message.append(utf_string); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::hasPackage(int plugin_instance_id, std::string package_name) { JavaResultData* java_result; JavaRequestProcessor* java_request = new JavaRequestProcessor(); std::string plugin_instance_id_str = std::string(); IcedTeaPluginUtilities::itoa(plugin_instance_id, &plugin_instance_id_str); java_result = java_request->newString(package_name); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); std::string message; IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message += " HasPackage " + plugin_instance_id_str + " " + *java_result->return_string; postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); delete java_request; return result; } JavaResultData* JavaRequestProcessor::hasMethod(std::string classID, std::string method_name) { JavaResultData* java_result; JavaRequestProcessor* java_request = new JavaRequestProcessor(); std::string message = std::string(); java_result = java_request->newString(method_name); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" HasMethod "); message.append(classID); message.append(" "); message.append(java_result->return_string->c_str()); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); delete java_request; return result; } JavaResultData* JavaRequestProcessor::hasField(std::string classID, std::string method_name) { JavaResultData* java_result; JavaRequestProcessor java_request = JavaRequestProcessor(); std::string message = std::string(); java_result = java_request.newString(method_name); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" HasField "); message.append(classID); message.append(" "); message.append(java_result->return_string->c_str()); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::isInstanceOf(std::string objectID, std::string classID) { std::string message = std::string(); this->instance = 0; // context is always 0 (needed for java-side backwards compat.) this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &message); message.append(" IsInstanceOf "); message.append(objectID); message.append(" "); message.append(classID); postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } JavaResultData* JavaRequestProcessor::getAppletObjectInstance(std::string instanceID) { std::string message = std::string(); std::string ref_str = std::string(); this->instance = 0; this->reference = IcedTeaPluginUtilities::getReference(); IcedTeaPluginUtilities::itoa(reference, &ref_str); message = "instance "; message += instanceID; message += " reference "; message += ref_str; message += " GetJavaObject"; postAndWaitForResponse(message); IcedTeaPluginUtilities::releaseReference(); return result; } icedtea-web-1.8/plugin/icedteanp/PaxHeaders.7406/IcedTeaPluginRequestProcessor.cc0000644000000000000000000000013213441742745024712 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.237253481 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc0000644000175000002070000007620313441742745025532 0ustar00jvanekmock00000000000000/* IcedTeaPluginRequestProcessor.cc Copyright (C) 2009, 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include #include "IcedTeaScriptablePluginObject.h" #include "IcedTeaNPPlugin.h" #include "IcedTeaPluginRequestProcessor.h" /* * This class processes requests made by Java. The requests include pointer * information, script execution and variable get/set */ /** * PluginRequestProcessor constructor. * * Initializes various complex data structures used by the class. */ PluginRequestProcessor::PluginRequestProcessor() { this->message_queue = new std::vector< std::vector* >(); internal_req_ref_counter = 0; pthread_mutex_init(&this->message_queue_mutex, NULL); pthread_mutex_init(&this->syn_write_mutex, NULL); pthread_cond_init(&this->cond_message_available, NULL); } /** * PluginRequestProcessor destructor. * * Frees memory used by complex objects. */ PluginRequestProcessor::~PluginRequestProcessor() { PLUGIN_DEBUG("PluginRequestProcessor::~PluginRequestProcessor\n"); if (message_queue) delete message_queue; pthread_mutex_destroy(&message_queue_mutex); pthread_mutex_destroy(&syn_write_mutex); pthread_cond_destroy(&cond_message_available); } /** * Processes plugin (C++ side) requests from the Java side, and internally. * * @param message The message request to process * @return boolean indicating whether the message is serviceable by this object */ bool PluginRequestProcessor::newMessageOnBus(const char* message) { PLUGIN_DEBUG("PluginRequestProcessor processing %s\n", message); std::string* type; std::string* command; int counter = 0; std::vector* message_parts = IcedTeaPluginUtilities::strSplit(message, " "); std::vector::iterator the_iterator; the_iterator = message_parts->begin(); IcedTeaPluginUtilities::printStringPtrVector("PluginRequestProcessor::newMessageOnBus:", message_parts); type = message_parts->at(0); command = message_parts->at(4); if (!type->find("instance")) { if (!command->find("GetWindow")) { // Window can be queried from the main thread only. And this call // returns immediately, so we do it in the same thread. this->sendWindow(message_parts); return true; } else if (!command->find("Finalize")) { // Object can be finalized from the main thread only. And this // call returns immediately, so we do it in the same thread. this->finalize(message_parts); return true; } else if (!command->find("GetMember") || !command->find("SetMember") || !command->find("ToString") || !command->find("Call") || !command->find("GetSlot") || !command->find("SetSlot") || !command->find("Eval") || !command->find("LoadURL")) { // Update queue synchronously pthread_mutex_lock(&message_queue_mutex); message_queue->push_back(message_parts); pthread_cond_signal(&cond_message_available); pthread_mutex_unlock(&message_queue_mutex); return true; } } IcedTeaPluginUtilities::freeStringPtrVector(message_parts); // If we got here, it means we couldn't process the message. Let the caller know. return false; } /** * Sends the window pointer to the Java side. * * @param message_parts The request message. */ void PluginRequestProcessor::sendWindow(std::vector* message_parts) { std::string* type; std::string* command; int reference; std::string response = std::string(); std::string window_ptr_str = std::string(); NPVariant* variant = new NPVariant(); static NPObject* window_ptr; int id; type = message_parts->at(0); id = atoi(message_parts->at(1)->c_str()); reference = atoi(message_parts->at(3)->c_str()); command = message_parts->at(4); NPP instance; get_instance_from_id(id, instance); browser_functions.getvalue(instance, NPNVWindowNPObject, &window_ptr); PLUGIN_DEBUG("ID=%d, Instance=%p, WindowPTR = %p\n", id, instance, window_ptr); OBJECT_TO_NPVARIANT(window_ptr, *variant); browser_functions.retainobject(window_ptr); IcedTeaPluginUtilities::JSIDToString(variant, &window_ptr_str); // We need the context 0 for backwards compatibility with the Java side IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response += " JavaScriptGetWindow "; response += window_ptr_str; plugin_to_java_bus->post(response.c_str()); // store the instance pointer for future reference IcedTeaPluginUtilities::storeInstanceID(variant, instance); } /** * Evaluates the given script * * @param message_parts The request message. */ void PluginRequestProcessor::eval(std::vector* message_parts) { JavaRequestProcessor request_processor = JavaRequestProcessor(); JavaResultData* java_result; NPVariant* window_ptr; NPP instance; std::string script; NPVariant result; int reference; std::string response = std::string(); std::string return_type = std::string(); int id; reference = atoi(message_parts->at(3)->c_str()); window_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(message_parts->at(5)); instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(window_ptr); // If instance is invalid, do not proceed further if (!instance) return; java_result = request_processor.getString(*(message_parts->at(6))); CHECK_JAVA_RESULT(java_result); script.append(*(java_result->return_string)); AsyncCallThreadData thread_data = AsyncCallThreadData(); thread_data.result_ready = false; thread_data.parameters = std::vector(); thread_data.result = std::string(); thread_data.parameters.push_back(instance); thread_data.parameters.push_back(NPVARIANT_TO_OBJECT(*window_ptr)); thread_data.parameters.push_back(&script); IcedTeaPluginUtilities::callAndWaitForResult(instance, &_eval, &thread_data); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response += " JavaScriptEval "; response += thread_data.result; plugin_to_java_bus->post(response.c_str()); } /** * Calls the given javascript script * * @param message_parts The request message. */ void PluginRequestProcessor::call(std::vector* message_parts) { NPP instance; std::string* window_ptr_str; NPVariant* window_ptr; int reference; std::string window_function_name; std::vector args = std::vector(); std::vector arg_ids = std::vector(); int arg_count; std::string response = std::string(); JavaRequestProcessor java_request = JavaRequestProcessor(); JavaResultData* java_result; NPVariant* result_variant; std::string result_variant_jniid = std::string(); NPVariant* args_array = NULL; AsyncCallThreadData thread_data = AsyncCallThreadData(); reference = atoi(message_parts->at(3)->c_str()); // window window_ptr_str = message_parts->at(5); window_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(window_ptr_str); // instance instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(window_ptr); // If instance is invalid, do not proceed further if (!instance) goto cleanup; // function name java_result = java_request.getString(*(message_parts->at(6))); CHECK_JAVA_RESULT(java_result); window_function_name.append(*(java_result->return_string)); // arguments for (int i=7; i < message_parts->size(); i++) { arg_ids.push_back(*(message_parts->at(i))); } // determine arguments for (int i=0; i < arg_ids.size(); i++) { NPVariant* variant = new NPVariant(); java_result = java_request.getValue(arg_ids[i]); CHECK_JAVA_RESULT(java_result); IcedTeaPluginUtilities::javaResultToNPVariant(instance, java_result->return_string, variant); args.push_back(*variant); } arg_count = args.size(); args_array = (NPVariant*) malloc(sizeof(NPVariant)*args.size()); for (int i=0; i < args.size(); i++) args_array[i] = args[i]; thread_data.result_ready = false; thread_data.parameters = std::vector(); thread_data.result = std::string(); thread_data.parameters.push_back(instance); thread_data.parameters.push_back(NPVARIANT_TO_OBJECT(*window_ptr)); thread_data.parameters.push_back(&window_function_name); thread_data.parameters.push_back(&arg_count); thread_data.parameters.push_back(args_array); IcedTeaPluginUtilities::callAndWaitForResult(instance, &_call, &thread_data); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response += " JavaScriptCall "; response += thread_data.result; plugin_to_java_bus->post(response.c_str()); cleanup: free(args_array); } /** * Sends the string value of the requested variable * * @param message_parts The request message. */ void PluginRequestProcessor::sendString(std::vector* message_parts) { std::string variant_ptr; NPVariant* variant; JavaRequestProcessor java_request = JavaRequestProcessor(); JavaResultData* java_result; int reference; std::string response = std::string(); reference = atoi(message_parts->at(3)->c_str()); variant_ptr = *(message_parts->at(5)); variant = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(variant_ptr); AsyncCallThreadData thread_data = AsyncCallThreadData(); thread_data.result_ready = false; thread_data.parameters = std::vector(); thread_data.result = std::string(); NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(variant); // If instance is invalid, do not proceed further if (!instance) return; thread_data.parameters.push_back(instance); thread_data.parameters.push_back(variant); IcedTeaPluginUtilities::callAndWaitForResult(instance, &_getString, &thread_data); // We need the context 0 for backwards compatibility with the Java side IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response += " JavaScriptToString "; response += thread_data.result; plugin_to_java_bus->post(response.c_str()); } /** * Sets variable to given value * * @param message_parts The request message. */ void PluginRequestProcessor::setMember(std::vector* message_parts) { std::string propertyNameID; std::string value = std::string(); std::string response = std::string(); int reference; NPP instance; NPVariant* member; std::string property_id = std::string(); bool int_identifier; JavaRequestProcessor java_request = JavaRequestProcessor(); JavaResultData* java_result; IcedTeaPluginUtilities::printStringPtrVector("PluginRequestProcessor::_setMember - ", message_parts); reference = atoi(message_parts->at(3)->c_str()); member = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(*(message_parts->at(5)))); propertyNameID = *(message_parts->at(6)); if (*(message_parts->at(7)) == "literalreturn" || *(message_parts->at(7)) == "jsobject" ) { value.append(*(message_parts->at(7))); value.append(" "); value.append(*(message_parts->at(8))); } else { value.append(*(message_parts->at(7))); } instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(member); // If instance is invalid, do not proceed further if (!instance) return; if (*(message_parts->at(4)) == "SetSlot") { property_id.append(*(message_parts->at(6))); int_identifier = true; } else { java_result = java_request.getString(propertyNameID); // the result we want is in result_string (assuming there was no error) if (java_result->error_occurred) { PLUGIN_ERROR("Unable to get member name for setMember. Error occurred: %s\n", java_result->error_msg->c_str()); //goto cleanup; } property_id.append(*(java_result->return_string)); int_identifier = false; } AsyncCallThreadData thread_data = AsyncCallThreadData(); thread_data.result_ready = false; thread_data.parameters = std::vector(); thread_data.result = std::string(); thread_data.parameters.push_back(instance); thread_data.parameters.push_back(NPVARIANT_TO_OBJECT(*member)); thread_data.parameters.push_back(&property_id); thread_data.parameters.push_back(&value); thread_data.parameters.push_back(&int_identifier); IcedTeaPluginUtilities::callAndWaitForResult(instance, &_setMember, &thread_data); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response.append(" JavaScriptSetMember "); plugin_to_java_bus->post(response.c_str()); } /** * Sends request member pointer to the Java side. * * This is a static function, called in another thread. Since certain data * can only be requested from the main thread in Mozilla, this function * does whatever it can separately, and then makes an internal request that * causes _getMember to do the rest of the work. * * @param message_parts The request message */ void PluginRequestProcessor::sendMember(std::vector* message_parts) { // member initialization std::vector args; JavaRequestProcessor java_request = JavaRequestProcessor(); JavaResultData* java_result; NPVariant* parent_ptr; NPVariant* member_ptr; //int reference; std::string member_id = std::string(); std::string response = std::string(); std::string result_id = std::string(); NPIdentifier member_identifier; int method_id; int instance_id; int reference; bool int_identifier; // debug printout of parent thread data IcedTeaPluginUtilities::printStringPtrVector("PluginRequestProcessor::getMember:", message_parts); reference = atoi(message_parts->at(3)->c_str()); // store info in local variables for easy access instance_id = atoi(message_parts->at(1)->c_str()); parent_ptr = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(message_parts->at(5))); member_id.append(*(message_parts->at(6))); /** Request data from Java if necessary **/ if (*(message_parts->at(4)) == "GetSlot") { int_identifier=true; } else { // make a new request for getString, to get the name of the identifier java_result = java_request.getString(member_id); // the result we want is in result_string (assuming there was no error) if (java_result->error_occurred) { PLUGIN_ERROR("Unable to process getMember request. Error occurred: %s\n", java_result->error_msg->c_str()); //goto cleanup; } member_id.assign(*(java_result->return_string)); int_identifier=false; } AsyncCallThreadData thread_data = AsyncCallThreadData(); thread_data.result_ready = false; thread_data.parameters = std::vector(); thread_data.result = std::string(); NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(parent_ptr); // If instance is invalid, do not proceed further if (!instance) return; thread_data.parameters.push_back(instance); thread_data.parameters.push_back(NPVARIANT_TO_OBJECT(*parent_ptr)); thread_data.parameters.push_back(&member_id); thread_data.parameters.push_back(&int_identifier); IcedTeaPluginUtilities::callAndWaitForResult(instance, &_getMember, &thread_data); IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); if (*(message_parts->at(4)) == "GetSlot") { response.append(" JavaScriptGetSlot "); } else { response.append(" JavaScriptGetMember "); } response.append(thread_data.result); plugin_to_java_bus->post(response.c_str()); } /** * Decrements reference count to given object * * @param message_parts The request message. */ void PluginRequestProcessor::finalize(std::vector* message_parts) { std::string* type; std::string* command; int reference; std::string response = std::string(); std::string* variant_ptr_str; NPVariant* variant_ptr; NPObject* window_ptr; int id; type = message_parts->at(0); id = atoi(message_parts->at(1)->c_str()); reference = atoi(message_parts->at(3)->c_str()); variant_ptr_str = message_parts->at(5); NPP instance; get_instance_from_id(id, instance); variant_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(variant_ptr_str); window_ptr = NPVARIANT_TO_OBJECT(*variant_ptr); browser_functions.releaseobject(window_ptr); // remove reference IcedTeaPluginUtilities::removeInstanceID(variant_ptr); // clear memory free(variant_ptr); // We need the context 0 for backwards compatibility with the Java side IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response); response += " JavaScriptFinalize"; plugin_to_java_bus->post(response.c_str()); } /** * Fetches the URL and loads it into the given target * * @param message_parts The request message. */ void PluginRequestProcessor::loadURL(std::vector* message_parts) { int id = atoi(message_parts->at(1)->c_str()); AsyncCallThreadData thread_data = AsyncCallThreadData(); thread_data.result_ready = false; thread_data.parameters = std::vector(); thread_data.result = std::string(); NPP instance; get_instance_from_id(id, instance); // If instance is invalid, do not proceed further if (!instance) return; thread_data.parameters.push_back(instance); thread_data.parameters.push_back(message_parts->at(5)); // push url thread_data.parameters.push_back(message_parts->at(6)); // push target thread_data.result_ready = false; IcedTeaPluginUtilities::callAndWaitForResult(instance, &_loadURL, &thread_data); } static void queue_cleanup(void* data) { PLUGIN_DEBUG("Queue processing stopped.\n"); } static void queue_wait_cleanup(void* data) { pthread_mutex_unlock((pthread_mutex_t*) data); } void* queue_processor(void* data) { PluginRequestProcessor* processor = (PluginRequestProcessor*) data; processor->queueProcessorThread(); return NULL; } void PluginRequestProcessor::queueProcessorThread() { std::vector* message_parts = NULL; std::string command; PLUGIN_DEBUG("Queue processor initialized. Queue = %p\n", message_queue); pthread_cleanup_push(queue_cleanup, NULL); while (true) { pthread_mutex_lock(&message_queue_mutex); if (message_queue->size() > 0) { message_parts = message_queue->front(); message_queue->erase(message_queue->begin()); } pthread_mutex_unlock(&message_queue_mutex); if (message_parts) { command = *(message_parts->at(4)); if (command == "GetMember") { sendMember(message_parts); } else if (command == "ToString") { sendString(message_parts); } else if (command == "SetMember") { // write methods are synchronized pthread_mutex_lock(&syn_write_mutex); setMember(message_parts); pthread_mutex_unlock(&syn_write_mutex); } else if (command == "Call") { // write methods are synchronized pthread_mutex_lock(&syn_write_mutex); call(message_parts); pthread_mutex_unlock(&syn_write_mutex); } else if (command == "Eval") { // write methods are synchronized pthread_mutex_lock(&syn_write_mutex); eval(message_parts); pthread_mutex_unlock(&syn_write_mutex); } else if (command == "GetSlot") { // write methods are synchronized pthread_mutex_lock(&syn_write_mutex); sendMember(message_parts); pthread_mutex_unlock(&syn_write_mutex); } else if (command == "SetSlot") { // write methods are synchronized pthread_mutex_lock(&syn_write_mutex); setMember(message_parts); pthread_mutex_unlock(&syn_write_mutex); } else if (command == "LoadURL") // For instance X url { // write methods are synchronized pthread_mutex_lock(&syn_write_mutex); loadURL(message_parts); pthread_mutex_unlock(&syn_write_mutex); } else { // Nothing matched IcedTeaPluginUtilities::printStringPtrVector("Error: Unable to process message: ", message_parts); } // Free memory for message_parts IcedTeaPluginUtilities::freeStringPtrVector(message_parts); } else { pthread_mutex_lock(&message_queue_mutex); if (message_queue->size() == 0) { pthread_cleanup_push(queue_wait_cleanup, &message_queue_mutex); pthread_cond_wait(&cond_message_available, &message_queue_mutex); pthread_cleanup_pop(0); } pthread_mutex_unlock(&message_queue_mutex); } message_parts = NULL; pthread_testcancel(); } pthread_cleanup_pop(1); } /****************************************** * Functions delegated to the main thread * ******************************************/ void _setMember(void* data) { std::string* value; NPP instance; NPVariant value_variant = NPVariant(); NPObject* member; NPIdentifier property_identifier; std::vector parameters = ((AsyncCallThreadData*) data)->parameters; instance = (NPP) parameters.at(0); member = (NPObject*) parameters.at(1); std::string* property_id = (std::string*) parameters.at(2); value = (std::string*) parameters.at(3); bool* int_identifier = (bool*) parameters.at(4); if(*int_identifier==true) property_identifier = browser_functions.getintidentifier(atoi(property_id->c_str())); else property_identifier = browser_functions.getstringidentifier(property_id->c_str()); PLUGIN_DEBUG("Setting %s on instance %p, object %p to value %s\n", IcedTeaPluginUtilities::NPIdentifierAsString(property_identifier).c_str(), instance, member, value->c_str()); IcedTeaPluginUtilities::javaResultToNPVariant(instance, value, &value_variant); ((AsyncCallThreadData*) data)->call_successful = browser_functions.setproperty(instance, member, property_identifier, &value_variant); ((AsyncCallThreadData*) data)->result_ready = true; } void _getMember(void* data) { NPObject* parent_ptr; NPVariant* member_ptr = new NPVariant(); std::string member_ptr_str = std::string(); NPP instance; std::vector parameters = ((AsyncCallThreadData*) data)->parameters; instance = (NPP) parameters.at(0); parent_ptr = (NPObject*) parameters.at(1); std::string* member_id = (std::string*) parameters.at(2); NPIdentifier member_identifier; bool* int_identifier = (bool*) parameters.at(3); if(*int_identifier==true) member_identifier = browser_functions.getintidentifier(atoi(member_id->c_str())); else member_identifier = browser_functions.getstringidentifier(member_id->c_str()); // Get the NPVariant corresponding to this member PLUGIN_DEBUG("Looking for %p %p %p (%s)\n", instance, parent_ptr, member_identifier, IcedTeaPluginUtilities::NPIdentifierAsString(member_identifier).c_str()); if (!browser_functions.hasproperty(instance, parent_ptr, member_identifier)) { PLUGIN_ERROR("%s not found!\n", IcedTeaPluginUtilities::NPIdentifierAsString(member_identifier).c_str()); } ((AsyncCallThreadData*) data)->call_successful = browser_functions.getproperty(instance, parent_ptr, member_identifier, member_ptr); IcedTeaPluginUtilities::printNPVariant(*member_ptr); if (((AsyncCallThreadData*) data)->call_successful) { createJavaObjectFromVariant(instance, *member_ptr, &member_ptr_str); ((AsyncCallThreadData*) data)->result.append(member_ptr_str); } else { ((AsyncCallThreadData*) data)->result.append("null"); } ((AsyncCallThreadData*) data)->result_ready = true; // store member -> instance link IcedTeaPluginUtilities::storeInstanceID(member_ptr, instance); PLUGIN_DEBUG("_getMember returning.\n"); } void _eval(void* data) { NPP instance; NPObject* window_ptr; std::string* script_str; NPIdentifier script_identifier; NPString script = NPString(); NPVariant* eval_variant = new NPVariant(); std::string eval_variant_str = std::string(); PLUGIN_DEBUG("_eval called\n"); std::vector* call_data = (std::vector*) data; instance = (NPP) call_data->at(0); window_ptr = (NPObject*) call_data->at(1); script_str = (std::string*) call_data->at(2); script.UTF8Characters = script_str->c_str(); script.UTF8Length = script_str->size(); PLUGIN_DEBUG("Evaluating: %s\n", script_str->c_str()); ((AsyncCallThreadData*) data)->call_successful = browser_functions.evaluate(instance, window_ptr, &script, eval_variant); IcedTeaPluginUtilities::printNPVariant(*eval_variant); if (((AsyncCallThreadData*) data)->call_successful) { if (eval_variant) { createJavaObjectFromVariant(instance, *eval_variant, &eval_variant_str); } else { eval_variant_str = "0"; } } else { eval_variant_str = "0"; } ((AsyncCallThreadData*) data)->result.append(eval_variant_str); ((AsyncCallThreadData*) data)->result_ready = true; PLUGIN_DEBUG("_eval returning\n"); } void _call(void* data) { NPP instance; NPObject* window_ptr; std::string* function_name; NPIdentifier function; int* arg_count; NPVariant* args; NPVariant* call_result = new NPVariant(); std::string call_result_ptr_str = std::string(); PLUGIN_DEBUG("_call called\n"); std::vector* call_data = (std::vector*) data; instance = (NPP) call_data->at(0); window_ptr = (NPObject*) call_data->at(1); function_name = (std::string*) call_data->at(2); function = browser_functions.getstringidentifier(function_name->c_str()); arg_count = (int*) call_data->at(3); args = (NPVariant*) call_data->at(4); for (int i=0; i < *arg_count; i++) { IcedTeaPluginUtilities::printNPVariant(args[i]); } PLUGIN_DEBUG("_calling\n"); ((AsyncCallThreadData*) data)->call_successful = browser_functions.invoke(instance, window_ptr, function, args, *arg_count, call_result); PLUGIN_DEBUG("_called\n"); IcedTeaPluginUtilities::printNPVariant(*call_result); if (((AsyncCallThreadData*) data)->call_successful) { if (call_result) { createJavaObjectFromVariant(instance, *call_result, &call_result_ptr_str); } else { call_result_ptr_str = "0"; } } else { call_result_ptr_str = "0"; } ((AsyncCallThreadData*) data)->result.append(call_result_ptr_str); ((AsyncCallThreadData*) data)->result_ready = true; PLUGIN_DEBUG("_call returning\n"); } void _getString(void* data) { NPP instance; NPObject* object; NPIdentifier toString = browser_functions.getstringidentifier("toString"); NPVariant tostring_result; std::string result = std::string(); std::vector* call_data = (std::vector*) data; instance = (NPP) call_data->at(0); NPVariant* variant = (NPVariant*) call_data->at(1); PLUGIN_DEBUG("_getString called with %p and %p\n", instance, variant); if (NPVARIANT_IS_OBJECT(*variant)) { ((AsyncCallThreadData*) data)->call_successful = browser_functions.invoke(instance, NPVARIANT_TO_OBJECT(*variant), toString, NULL, 0, &tostring_result); } else { IcedTeaPluginUtilities::NPVariantToString(*variant, &result); tostring_result = NPVariant(); STRINGZ_TO_NPVARIANT(result.c_str(), tostring_result); ((AsyncCallThreadData*) data)->call_successful = true; } PLUGIN_DEBUG("ToString result: "); IcedTeaPluginUtilities::printNPVariant(tostring_result); if (((AsyncCallThreadData*) data)->call_successful) { createJavaObjectFromVariant(instance, tostring_result, &(((AsyncCallThreadData*) data)->result)); } else { ((AsyncCallThreadData*) data)->result.append("null"); } ((AsyncCallThreadData*) data)->result_ready = true; PLUGIN_DEBUG("_getString returning\n"); } void _loadURL(void* data) { PLUGIN_DEBUG("_loadURL called\n"); NPP instance; std::string* url; std::string* target; std::vector parameters = ((AsyncCallThreadData*) data)->parameters; instance = (NPP) parameters.at(0); url = (std::string*) parameters.at(1); target = (std::string*) parameters.at(2); PLUGIN_DEBUG("Launching %s in %s\n", url->c_str(), target->c_str()); // Each decode can expand to 4 chars at the most gchar* decoded_url = (gchar*) calloc(strlen(url->c_str())*4 + 1, sizeof(gchar)); IcedTeaPluginUtilities::decodeURL(url->c_str(), &decoded_url); ((AsyncCallThreadData*) data)->call_successful = (*browser_functions.geturl) (instance, decoded_url, target->c_str()); ((AsyncCallThreadData*) data)->result_ready = true; free(decoded_url); decoded_url = NULL; PLUGIN_DEBUG("_loadURL returning %d\n", ((AsyncCallThreadData*) data)->call_successful); } icedtea-web-1.8/plugin/PaxHeaders.7406/docs0000644000000000000000000000013213441742745015374 xustar0030 mtime=1552401893.055832789 30 atime=1552410887.113183443 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/docs/0000755000175000002070000000000013441742745016261 5ustar00jvanekmock00000000000000icedtea-web-1.8/plugin/docs/PaxHeaders.7406/npplugin_liveconnect_design.html0000644000000000000000000000013013441742745024113 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.236253483 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/docs/npplugin_liveconnect_design.html0000644000175000002070000001353713441742745024736 0ustar00jvanekmock00000000000000 IcedTeaNPPlugin LiveConnect Design

IcedTeaNPPlugin LiveConnect Design

Plugin Architecture

  • Divided into C++ and Java components
    • C++ side talks to the browser
    • Java side talks to the JVM
    • Linked via a FIFO link
    • Common string exchange format (UTF-8)
  • Over 95% of changes in NPPlugin have been on the C++ side
  • Java side has been reused as much as possible to re-use the proven stable code

C++ Architecture

  • Encompassing classes from the LiveConnect engine (which previously resided in Mozilla and was exposed via OJI)
  • Each JavaScript var corresponding to a Java object has a corresponding IcedTeaScriptableJavaObject
  • Engine controls the object life and services all requests (get field, set field, invoke method, etc.)

C++ Architecture (Browser Interface)

  • Browser interface consists primarily of IcedTeaScriptableJavaPackageObject, IcedTeaScriptableJavaObject and IcedTeaPluginRequestProcessor.
  • Above classes are unaware of Java interactions and delegate to the Java interfaces for Java interaction.
  • They process all requests coming from the browser and going to the browser (getMember, call, eval, etc.)

C++ Architecture (Java Interface)

  • Java interface consists primarily of IcedTeaJavaRequestProcessor.
  • This class has full knowledge of how the Java side works, and constructs appropriate requests to get all information from Java.
  • The class processes all requests to the JVM.

Java Architecture

  • Java side has two core classes aside from helpers: PluginAppletViewer and PluginAppletSecurityContext.
  • PluginAppletViewer is an interface to NetX and processes JS-related requests to and from NetX (the applet).
  • PluginAppletSecurityContext is a direct reflection-based interface to the VM. It processes all LiveConnect requests to and from the JVM.
  • Request processing is asynchronous, with scalable generic request processing workers.

Java Architecture (PluginAppletViewer)

  • Control of applet (initialize, resize, destroy, etc.) from browser.
  • Access to JavaScript from the applet (getMember, setMember, call, eval, etc.)

Java Architecture (PluginAppletSecurityContext)

  • Direct access to the JVM from the browser (LiveConnect) via reflection.
  • All reflection is built-in, so C++ side never needs to be aware of the complexities, unlike how OJI was.
  • All VM calls are inside a sandbox, so JavaScript can not do things that the default sandboxed VM can't.

MessageBus Architecture (C++)

  • The link to Java is exposed to the rest of the code via a uniform "MessageBus" interface.
  • Since the code is unaware of the link specifics and has no synchronicity guarantee, the communication medium can be switched relatively easily.
  • Classes interested in the messages implement a BusSubscriber class and subscribe to the bus of interest.
  • When messages come in, the bus notifies all subscribers.

Example JS->Java Workflow

  • Example shows how NPP_HasProperty() works
  • Browser has a link to an IcedTeaScriptableJavaObject representing a Java object instance.
  • It call IcedTeaScriptableJavaObject::HasProperty()
  • HasProperty() creates an IcedTeaJavaRequestProcessor ("Java processor")
  • The Java processor exposes all necessary APIs to the VM, including hasProperty (called hasField for Java naming consistency).
  • Before making a hasField request, the processor subscribes itself to the "from Java" bus, so that it can read the response.
  • The hasField request is made by the processor and posted to the "to Java" bus.
  • The processor waits for either a response or a timeout.
  • Once a response is received, the processor unsubscribes itself from the "from Java" bus, performs post-processing and returns.
  • The IcedTeaScriptableJavaObject object reads the response and sends it to the browser.

Example Java->JS Workflow

  • All access to JS is via JSObject instances as defined in the LiveConnect specification.
  • If an applet wants to access a member of JSObject, "window" for example, it will call getMember on the window's JSObject.
  • getMember calls a similarly named function in PluginAppletViewer.
  • PluginAppletViewer constructs a request for the C++ side and posts it on the FIFO link.
  • On the C++ side, IcedTeaPluginRequestProcessor (the plugin processor) is always subscribed to the "from Java" bus.
  • When the getMember request comes through, the plugin processor gets notified.
  • The embedded request
icedtea-web-1.8/plugin/docs/PaxHeaders.7406/MessageBusArchitecture.png0000644000000000000000000000013213441742745022560 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.236253483 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/docs/MessageBusArchitecture.png0000644000175000002070000011737313441742745023404 0ustar00jvanekmock00000000000000‰PNG  IHDRл2ђ EСsBITлсOр IDATxœьнy`Eојџ2!!3ЩdBH„$\йEP.AYDt ф |ЂИЫх#ЋXX9”[\`бeW<У"F<`IИ%„p%Ы\ф˜§ћЃч7›9Ш1™юIоЏПzЊЋЋЊЛkК>гS=Ѓ‘$IPH Ѕ\MЃбh4Ѕ[рџ‘€sтъ‡ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆšŽДДДРРРВlй2Ѓби№ršГ†ŸЇœJю‚ˆQjjЊFЃбџfьиБrЂЗЗЗНЕВoОљf№рС~~~FЃёќу/ПќR›ъ:wюœ““гПђЪ+ЧŽЋG9ГfЭjзЎNЇ:thzzzCšсюъq"ЬНЂо%p_DфаИМММŠѓс‡жfэз_§ју?џќѓyyyїнwп AƒЎ^Нъ‚жfeeyxxtюмЙ6™+++-_vъдщФ‰љљљ=zє˜:ujу4š "rPyѓцНўњыcЦŒбjЕ­ZЕzс…ЦŒГtщRЫ<ђ-еЭ›7‡††њљљЭš5ЋЂЂТђюЛѕZyУ’’’ИИИРР@Ѓб8}њєђђrs™iiiбббхххzНўЩ'ŸBфхх7Ю`0О№Т •••rЩoП§vHHHllЌe“цЮьщщ9cЦŒџќч?жћЕeЫ–ЇžzJQUUхыыЛhб"!Ф•+WŒFcuuЕbУ† ;vдщt§ћїOKKBМўњы“&M2—№рƒnлЖЭВЬТТТииXЃбh0&Nœ(':hvpppXXи‘#GVЏ^rєшQѓsAќїmьддTН^oN\Зn]PPPhhш‘#G„е oыFZящ№сУх#ЏзыЏ\ЙbY‚НнЉQ)їEDъRXXјѓЯ?7Ю21&&цЋЏОЊ‘гd2}ћэЗчЯŸПxёbrrђВeЫjГ6>>>??џвЅKзЎ]ЫЮЮNHH0oвЙsчффdљЖ§ћяП/„˜6mšЇЇgffцйГg9ђЦoШ%ЇІІІЅЅНћюЛ6wс‡~шоНЛuњ Aƒ>,„јЯў$/>|xрР-ZДBDDD?~}zYYйхЫ—sssŸ{ю99б^ГoоМ™™™9uъдqуЦfffޘ1cоМyц#ц8ƒ=&“)77їЦSІLБ™йК‘ж{Кџ~ѓ&ЁЁЁ–›ллЧ•p'Рl^T/\И „0ќцŸџќЇœшххeoэЅK—ДZmrЮž=ыяяo]ђѕызх—ћіэыкЕk’kЌ•$ЉЄЄФгг3##CNџёЧЛtщRЃXЙI’Š‹‹=<<Ь…$&&FEEЩ%чххй;зЏ_oгІЭз_msmPPPZZкЊUЋ/^R^^З|љђйŽ;жІMyyа A|№$IkжЌyт‰',Геhсm›]PP IвщгЇ5Э­[Зфх€€ѓsЁЦСЙpс‚NЇ3oXXX(IRJJŠбht|ээЉх&–/ьNJы„P­Ы?@ѓтхх•ŸŸ_ћЕUUUyyyцФЌЌ,ы_оаjЕэкЕ“—;vьxуЦлЎЭЪЪЊЈЈшж­›œ.I’———НЖeggk4s!aaa7oо”лl4mnRZZњиc§љЯ2dˆ9Qžн!„(..8pрсУ‡>>>>>>ђВyоЮm3иухххыы+„hеЊ•Щdr|ьЉMvЧAЅм ГV@]ќќќњєщѓСX&юоНћЈ‘ГВВ2##C^ОrхJ›6mnЛ600аггѓњѕыљљљљљљYYYіZT]]m.фђхЫ5ЊЈA’ЄЇŸ~КOŸ>/Нє’eКљбU!Ф Aƒ<јѓЯ?їэлwа A{їюMOOџ§я/„ШЯЯ‹‹{чw Ољцsœ:vьиЄЄЄуЧџђЫ/#GŽЌбBI’Ь-Ќ_ГkЏeЫ–•••ђ”їьььZneнH›{ЊбhьmоHЛ@=ˆШ@u–/_ОpсТ={іTVV–––ЎYГfЯž=/ПќrlfсТ…ЅЅЅЙЙЙ ђC“Žзъtʘ˜˜9sц!222’’’ь5CЇг=zўќљЅЅЅ999ЏОњЊќИЇ= ,ИuыжКuыф4hа‡~иЙsg//ЏСƒoмИБoпО-[ЖB˜LІЊЊЊ€€“ЩДzѕjѓ&FЃёxњщЇŸxт‰wєu:н˜1c^zщЅЂЂЂЪЪЪ~јЁЭЎНіэлыѕњН{їšLІЗоzЋ–[Y7вцžFy"ЛѕцД;дƒˆTgшаЁџњзПжЌYc4лЕkїѕз_>|8$$ЄFЖ–-[іяп?22ВSЇN=zє˜?~mжnмИQЋеFDDјњњ:єЬ™3ZВuыж’’’ЖmлFEEн}їн .tyљђхп|ѓС`аыѕmлЖЕ™Їwяо’$ <иМщяяхЪЫЭiwЈ‡Цёє5@-ЩГ\vQMMMэйГЇќ#$u]ыvŽ;ішЃ^ЙrEўI4œ‹Л+ЧИДдюэЗпŽ%аTquЈWnnЎOrrrЇE )aж 8грFшЎ€ЊpP9 $"rhDЉЉЉоооJЗBвввЌџvT‘ššjўSЯFт‚*SpпИ"rP EТw—UкЙsчœœTT{пџ§№сУ§§§ѕz§нwпНsчЮFЊH…ћ@UˆШЭбСƒ}єбiгІeeeОљц›0Џu|їš{лœ‹ˆнцЭ›CCC§ќќfЭšUQQ!„())‰‹‹ 4гЇO///B >МММ\ЏзыѕњW^yEўпћЊЊ*__пE‹ !Ў\Йb4ЋЋЋэ•`(п_Зn]PPPhhш‘#G7uУ† ;vдщt§ћїOKKB,YВф™gž1g1bФж­[mцДДqуЦааPŸЖmлОљц›тПoЦчццŽ5JЏзGEE™у`›{фИmіЮf–цЮЛ|љђqуЦЕlйВE‹мО}ЛуƒS{5vџЖћ^›на„‘@у2™Lп~ћэљѓч/^̘œœМlй2!D|||~~ўЅK—Ў]Л– „иПП——Wqqqqqё„ >,„јЯў$/>|xрРђхи,СfЂЩdЪЭЭНqуЦ”)SцЭ›чИЕЧЯЯЯŠŠzёХ…111{їю5™LBˆмммУ‡?ўју6sšхццЦЧЧяйГЇЄЄфмЙsУ† ЋQЫєщг CvvіЗп~kž+bГёŽлц`яlVaVTTєгO?Щ;тtŽwп^УnЛћš2 р 6/Њ.\B\П~]~ЙoпОЎ]Л–””xzzfddШ‰?ўјc—.]фЬ^^^цmƒ‚‚вввV­ZЕxётђђђИИИхЫ—K’dГ›‰r %IJII1ж-ДЌдьиБcmкД‘—{їю§Щ'ŸH’ДiгІ‘#G:Ш)+,,єііоО}{QQ‘uEХХХцc’˜˜Јгщь›Ь5кл;›UX–žžЎеjэ•/—\c“кЏЕо}Чћ.й9ЁšзpФ€Њhњ Э…VЋmзЎМмБcЧ7ndeeUTTtыжMN”$ЩЫЫЫzУ>|ј№сУsцЬ9vьиЯ?џ|ј№сI“& !l–`ЏX///___!DЋV­ф[нlлЖmйВe7nм3~ќјнЛw5jїюн“'OvSцыыћЏ§ыoћлsЯ=НjеЊ~§њ™зfggk4ѓ1 ГЗGЕi›ЭНГY…Ѕ€€€ЊЊЊ‚‚ƒСPc•ПППЂККњж­[ђВ"??П6kээ~ыж­7Ќ–]@“Ѕм‡hRl^Tkм#џїПџU\\ьщщY\\\#sjjЊхэъП§эoSІLщаЁCYYйЊUЋўќч?ћјј”——K’dГ›‰–ЗРmойЕЬ№ыЏПjЕкC‡UWW;vЬœљвЅK~~~—.]вщtrж`2™V­Z%йПOМoп>Ngя˜˜йЌбоойЌЂF}ћінЖm›НъrмЬМћŽї]Вsю1 *Ь#€ЦЅбh.\XZZš›››№дSOщtʘ˜˜9sц!222’’’„FЃбd2нМySоpа A~јaчЮНМММqуЦО}ћЖlйRaГ{ХжžЩdЊЊЊ 0™LЋWЏ6Ї‡……uяо}ъдЉУ‡їѓѓsS–™™љХ_”••iЕZ___љQT3N7jдЈљѓч—––цфф,]КдоеІm6йЌЂ†+VЬ›7oЯž=&“I’ЄЃGšoџ7ƒнЗзА†Ÿ;nˆъFЃбh4šкчoйВeџў§###;uъдЃGљѓч !6nмЈеj#""|}}‡zцЬ!D@@РГЯ>щяяхЪ•оН{K’4x№`!„М|јm‹­ ЧЛoЏaѕ;wЄЎ@iЄџžќpЬ2RБМ„ЪщnwQ=uъд!CјџšцЦ^wЕзН4*žь€њsг(мвО}ћЂЃЃ•n”ЧMq@ADф€ы0р5U–gVЃqЇяЇL™ђЭ7пМїо{J7JВwiт’хюмшZw9wЧ№жLp]…њq9jИЙю‘ЎЦ%внЪ Щ/GіК4+їХeЪэ№[+аPђЏЩ*н  žшР€тИGѕGƒ&Уё§rŠˆъƒXMq9 "rЈbq4ytrР՘G(‰ˆP9 $"r@IDфрL<Ј+"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ДJ7Иš$IJ7Рџ{ф€’ИGЮСMG@§pP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 $"r@IDф€’ˆШ%‘J""”DD(‰ˆP9 ™вh4FщVрПpRа<‘p' е€І‡ˆ€›!(‡I’Єt№_$IтЄ ""рNЊсDt'*ADРЭEС‰јЪEm˜GŽц‰ˆ€;aЈ†бЈ97C'т+Еa9š'"rю„ЁNDw Dфм QœˆЏ\д†yфhžˆШИ†j8н €J‘p3DQp"ОrQц‘Ѓy""рNЊсDt'*ADРЭEС‰јЪEm˜GŽц‰ˆ€;aЈ†бЈ97C'т+Еa9š'"rю„ЁNDw Dфм QœˆЏ\д†yфhžДJ7Э зYСAhXH­бhˆШс,МЈ97CP'Ђ/ЉSЮŸЕdЭќ8ИзЛ›ˆ pЏ7 œЈсУƒ$IЭ|Œq- Dфм QœˆЏ\дFўШэ”“Т™mЖмёЦ Ovp'юx…jбЈ97C'т6Њк№{фhžˆШИ†j8н €J‘p3DQp"ОrQ~Э9wТP 'Ђ;P "rn†( NФW.jУ{іь1Џвыѕ­ZЕ §рƒь%^О|йггѓŽ;юЈSуНММnмИсяя_Ї­д( NФW.Ј“ДД4­V[VVж№ЂфЋ§=їмcNILLдh4уЧoxс !IвъеЋ###u:]@@РУ?мРЯœ9гГgOЇД­ #"GS–œœсууSПЭ+**.]КДjеЊттттттЉSЇЮš5K^>tшPэлvрР“Щ$„ЈЊЊ:}њє]wн%ЏъйГgqqqIIЩЬ™3gЭše/ёдЉS\ЮЇ#G]ј€[р+дЩЩ“'ЃЃЃ… ~nnn‹-JKKхЬџњзПњѕыg3Ї"99yР€зЏ_BьмЙ3""ТЫЫKhlŽ2ЇN|xщвЅц8X’$ЫˆмцЖЗnнZМxqNNЮљѓч:єХ_˜л0jдЈO>љD~-п™KNNў§я/„ШЬЬ\Жlйc=f/бђyrrђwоYcљOњгѕыз/_О|шаЁ„„9sJJŠ9чЩ“'ПџўћчŸ>77ЗOŸ>[ЖliєЃЈс8ъЪ‘лМрЗnн:((HОэ-Iв_ўђ—ЅK—кЬ)~zіьyіьйВВВ„„„E‹?^hlŽ21113gЮ,**ЪШШПAЕNБYЭ1Т^-­[З~ы­Зіюн[PP`оq›9э,6GR›%ЄЄЄњЈFЂљ‚/Iв!Cоџ}I’оџ§ћюЛЯAЮ№№№МќђЫkжЌYБbХЬ™3;(йe УЖmл***ЬZЇXWgoŒАWKzzњєщглЖmЋеj'NœXZZj/ЇЭ‘ХцHjЏ„>}њМљц›З=ьuхŽcжх)..NKKыеЋз—_~yЯ=їДoпоrэЪЪЪЬ3лЊЊЊ&OžќеW_н{яНFЃQNЬЫЫ9rЄМ,OI—gАимVБuыжЗп~ћвЅKrэѓцЭ3ЗЁuыжоооЧONN~єбGх —.]ЪЯЯїѕѕЕlГubeeхЙsчф{ зЎ]ЋЈЈ “WЅЄЄLš4ЉFГ‹‹‹{єшQ]]}цЬљyUUе™3gЬћrъдЉ|а9GpgЬ#G˜LІ .ШїШ­/јrž=zœ;wЎЊЊъЕз^лКuЋНœцб!;;ћЃ>њўћяњщЇФФDљЙНQfїюнЏПўњ‚ bbbVЎ\щщщib]Э1ТA-;vмМyГт№сУ#GŽ:tЈЇЇЇuN{#‹Э‘дf]ђ8ѕју7ЦЩr;ЬZA“•’’b4;tш••e§{#YYY'NЬџMQQбКuыВВВќќќф ПўњkRR’љЋ=Ы)+6ЗнЛwякЕkwэк•——wётХV­Zuяо=%%Ѕ]Лv­[ЗBŒ=њ“O>9qт„\NJJJћіэ-#o{‰.\–чи>}К[Зnr‘’’mžWTTєэЗпіьй355е`0ШUЇІІњљљ™ЊХr6 аЬIL\A­={жллЛsчЮ6/јržюнЛŸ={vзЎ]aaa А—3%%хŽ;ю ŒŽŽўрƒ&OžмЖm[ѓLK›ЃŒтСНИИИkзЎ5&‘››QZZš––Ц/З‚putђфЩ=zh4›|9OїюнO:Еxёт%K–;CƒАSЂЂЂхчц[?6G™O>љфъеЋBˆМММ[ЗnEDDXЇиЌЮцaЏ–ПўѕЏЧ—$щж­[+WЎЬШШxќёЧmцД7ВиIm–`yЋ DфhВЬзЛ|pЦŒ ащt“&Mђ№№Bќс˜9sц!Ct:нwољ§їп !FѕРDEE 4шЎЛюŠŠŠвjЕцвЬЎЭmŸ~њщœœЃбјдSOuяо]ЮlЙеР фiтђ*ы_ƒВ™hљXч}їнвН{їЧ{,44Tюyф‘x ""bР€=zєˆŠŠђђђ:yђЄЭˆќдЉS;wvЪOwMWP{цЧ:m^№e=zє8sцLttДќŒОНœцJЋеŽ1BЬЊЭQfџў§Пџ§я}||Цїж[oEEEYЇиЌЮцaЏ–ЬЬЬ'žxBЇгЕokэE0 IDATпўаЁC‡nзЎЭœіF›#ЉНџЉGѕаp‡Ў$~єКЦГhбЂќќќЕkз*нлшP:dSеHgіўћяŸ0a‚љWeн‘ЪЧgqЧЗ6Ovnя‡~ ўьГЯ6lиpєшQЅ[ЄwМўB ш3ЈН'NШџИь^#м9ріŽ=њаC™LІnнКэйГGўћЁц‰ИuBWq_ŠМйwяорЪ‚1Т-0k.EРдЬ5^Аž L7Cmh4ŒƒnЩђ-o}kš9wьм#рjЎy–ЮЏШp1ыlxГЃ рЗV4e†Ј Ц5МйсжИGРе\3kЅёъB“Aїp:ХcbХдїШс6yф‘C‡й[›––ш‚fЄІІЪ?ЙjНаРUCjIMM•+wгІM ,pjЛ‘$IФ[И-И&†7>м9мУO?§”““3x№`{:wюœ““уЪ&Љ\cњ“'O–џœйЙХ:C2j‰pмщ$WБWЕыwp "rИ‡-[Ж<љф“JЗЂЙѓђђz№СwэкЅtCьbHF]бašојhˆШсіэл7dШyYОћЛyѓцааP??ПYГfUTTд˜CRc­МaIII\\\`` бhœ>}zyyЙe………БББFЃб`0Lœ8QNмАaCЧŽu:]џў§гввДаf67ЗY‘l§њѕwоyчЭ›7-х=zћэЗƒƒƒУТТŽ9Вzѕърррѓ=Xяк№сУЫЫЫѕzН^ЏПrхŠœmнКuAAAЁЁЁGŽ‘SђђђЦg0_xс…ЪЪJ9=77wдЈQzН>**ъРцЦмwп}‰‰‰ŽO–"’QєwЧM9м@~~ўеЋW###Э)&“щлoП=ўќХ‹“““—-[f™покјјјќќќK—.]Лv-;;;!!СrЋщгЇ—••]О|977їЙчž“#""Ž?žŸŸѕт‹/кkЁНmnnГ"!ФЪ•+Зlй’””дІMыђoоМ™™™9uъдqуЦfffޘ1cоМyіvmџў§^^^ХХХХХХЁЁЁr!ЙЙЙ7nм˜2eŠyУiгІyzzfffž={іШ‘#oМё†Й‘ƒ!;;ћлoПнЙsЇЙ%QQQ'OžД{ЊwУФ7ЅўXмёГOФ‰ѓЭOg5ЄLїzњHaЎšёHвoWЯКn•žžюссa~yсТ!Фѕызх—ћіэыкЕы… МММь­•$ЉЄЄФгг3##CNџёЧЛtщb.ГИИиУУУМ•ЕcЧŽЕiгF.п\‘уmnn]‘\ЮkЏНжЇOŸММ<ыЊхђ $I:}њДFЃЙuы–М`oзЬЭГ,ЄААP’Є””Ѓбhн˜ФФФЈЈ(›щ:N^>{іЌ^ЏЗw”n‹ЫT…йT)~fќёЧ~§њЩЫђхWЇгщt:Н^џ§їŸ?ОNЅ;vlа A>>>ОООwоyчЧl/g+ПS4ЄЬВВВмм\ч6щЖяѕР=rИƒСPUUUZZjNбjЕэкЕ“—;vьxуЦ Ыќ6зfeeUTTtыжЭпппппиАaцMВГГ5y+ГmлЖEFFњљљ 2фж­[іZhЏ=ж›лЌЈВВrЭš5/Нє’бhДYО———ŸŸŸЂeЫ–>>>>>>ђВ<ёЦёЎYтыы+„hеЊ•ЩdВnLXX˜™ŸŸџыЏПnйВХоHсDцŒ ,A§OЉ9м€ПП‡ЮŸ?oNЉЌЌЬШШ—Џ\ЙRcš‡ЭЕžžžзЏ_ЯЯЯЯЯЯ/((ШЪЪ2o$I’y+Y~~~\\м;яМSPP№Э7п8Йmжhss›iЕкФФФйГgYђђђš4iв/Пќ"ў{6ˆљGf…7n ѕёёiлЖэ›oО™‘‘‘••5}њtOOOО}ћ4ШоЖ2ычšj”)l=бd~f)$$$66ЖЦdы2­Ÿ_ЊQ‚МЁjŸ>R"rИ‡‡zШ2Zеh4 .,--ЭЭЭMHHxъЉЇ,3л\ЋгщbbbцЬ™#п?ЮШШHJJ2oЂгщЦŒѓвK/UVVў№УB“ЩTUU`2™VЏ^э y6kДЙЙЭŠ„}ћі§рƒbbb~њщЇК›Лf4хйчŽ7=zєќљѓKKKsrr^}ѕUљІŽNЇ5j”9}щвЅцM:4bФˆКЖP-ц‘УщЌŸ}2+++лО}ћ=їмcoлмммјјј={і”””œ;wnиАaэлЗ yђЩ'?ўјcЧ—t™ѕsMжe ;O4™LІдддДДДwп}зq™ТЮЃYж%№єQm)8cЭPН{]9y^^^›6mъаЁƒЏЏяŒ3ЪЫЫkLяЎБVоАИИјџ§ПџЄзы###з­[gYE~~ў„  ƒППllЌœјђЫ/ыtКААА•+WЪsЉmЮ#ЗWЃѕцжYNбKLLМуŽ;Nžs№ŸpИИИ?4 И5‰yфhжЯ>™y{{?§єгпџНЂeЫ–•••еееBˆььlsž‡zшЫ/ПЬЩЩyќёЧ'MšdЙypp№мЙsOŸ>mo[aчЙІeк|ЂЩы2?še‰Їj‰ˆа|1ЁЦГOf&“iзЎ]BˆіэлыѕњН{їšLІЗоzKЮ™™љХ_”••iЕZ__пъъъœœœз_]О'ŸŸП~§њ>}њимVf§\“u™іžhВЧКLЧfYтщЃZ""‡ћщвЅKYYY§ж€с8Щєщгпџ}ѓKѓ?(ž8qbћіэBЕkзN›6-""Ђ_П~rЮЊЊЊЅK—ыѕњЭ›7oпОнЫЫыдЉSєёёщмЙsnnюЛяОks[YЫ–-ћїяйЉSЇ=zЬŸ?пКL!ФІM›<<љф“ЦЈЂВВВ1Š­“ќќ|yя~ќёЧsчЮ)нœлxц™gтууУТТў§я?ощхЛ,Œ!"рfTЬЁi ;Љz>Ге№ўћя !bcc…яНї^ЕћіэывЅ‹OlllYY™тѓЯ?ŽŽnйВeЋV­zіьЙgЯaё9АSЇNђВѓ-YВ$((hЩ’%BˆФФФnнКy{{{{{їяпџјёуBI’ўњзП†‡‡{zzЖkзnзЎ]6KKII6l˜бhœ6mZqqБœЁЌЌlвЄI>>>ћїяwА›ƒaЧŽBˆ;v †kэ•osgm&км;Ы†‡‡oоМй лЋQЖhбЂЕkзnпО]aО‘oy_пrйf{дBР…}рŽ ННН§ќќ ZЗnэщщ™››+Џ’ЛєwмзЖm[!ФМyѓ$I BŒ7...юо{яMHH$iіьйrўgžyfіьйцЭ[ЗnїќC’ЄmлЖ=њшЃёёё<№€"22R’Є7оxCЁгщžyц™1cЦМўњыжЅхххЖjеjђфЩƒ BL˜0AnфмЙsЭlзЎЭЗЁœ8}њt­V{ѕъеж­[ߘ1CNМtщ’$IЪЗЙГ6mюЙ…ССС3fЬЃТAцўљч{їю-„˜?Ох*ЙЭ–Ы6лЃ\И‚9wЇЊˆ\=-™Њzˆ™|vђфЩ’$ХХХ !6oо,Џ’Мwя^I’іюн+„шаЁƒ$IƒСУУcчЮЇOŸЎЊЊЊЌЌДЬ/Чˆц—Лvэ2зU^^О}ћіЙsчЦЧЧЫkГГГ;vь(„иБc‡œЇЂЂТКДmлЖ !zѕъ5{іьYГf !ДZmII‰$IэлЗB|ђЩ'цFк‹Ш:дЂE‹ЁC‡ !ОћюЛZ–osgm&км;I’:tш „јшЃ$Iњч?џ)ЏrPЃјoООО‰‰‰жЧФrйоQеѕx41ъМАТ}бЃрDt'uRчy1b„тЮ;я|јс‡яКы.!Ф!CфUrƒЯŸ?/I’<ёZЋеJ’ДuыVљІЌЂM›6'OžДЬ_#"—7—3ІFИ™žžЎеj…gЯž­б0ЫвфI/5\О|Y’$Д‘_КtщўћяBtщвЅіхлмY›‰6їЮ^ дhnXEEХКuы„5vФ)„шаЁУ!CкДiѓ§їп !ŒFЃœГmлЖ™™™ёёё‘‘‘ЋWЏЖЎ.((шкЕkЋV­*,,4'Юœ9sС‚3gЮLJJ*..ОыЎЛ,XPЃДE‹Э;wчЮПўњkћіэ“““KKKџѓŸџШMZЙre\\мчŸ~лŠ;vlpppпО}kЄ?іиcіЪЗЙГ6mютЉЇžZБbХдЉSG-GэŽk”%$$јјјШЯЊо}їнrb=’““чЭ›—ŸŸoY…Н3т€ыКn#пƒ'Ћг…‹ г5ќЊъЄдh‰‹†оцЇЎ'ЅЎ›4Ж !6mкdN‘Ї•їщгGњ­С6lїііž0a‚<бyєшбmлЖmбЂE@@РДiгЪЪЪфmпyчРР@ѓnЪ цI,’$энЛ7888 @žE-Џ­ЎЎ^О|yЇN<<<кЖm+?j]к‰'ф_&ёђђКыЎЛжЎ]+g+))™8qЂЗЗwXXикЕkmdы–X'к+пцЮкLДЙw’$•––>§єгооо;w~ы­З„jДь`ƒaєшбцF~љх—wмq‡ППџŠ+,ЋАwFд@#qBcRЯЭ04 uэQє@ЇkJ‡дz_šвоЉD=)gЁy*))ёііnбЂ…bЯž=cЧŽэдЉSi'ЎчВоШЌn†qNDwR!NJѓ”’’2cЦŒ?ўё&“iѓцЭBˆgŸ}VщFЙ9V8=Њ PЯP5Д€,((ШггsХŠUUU‘‘‘ЏНіšљчфВЋГVИІ.ѕMFУЉЊNJюЄЊЖ5 ЬZjƒ_?Dуjb?”ХЙВ;ЅЇЇk4š{юЙЧœ’˜˜ЈбhЦяВ6и$7LЏзћјјјљљЭš5ЫНbљ1&Ѕ[!ПЌрv\Ц‘p3. ц’““УУУхŸяBTWWЯŸ??<<\ўs%''wяоНИИИЄЄфрСƒ›7o>zєЈВMr_*љlKъљЬИ 9V8—+ЛSrrђ€Ў_П.„иЙsgDD„——WЏ^Н„еее‹/ бщtуЧ/++Bœ:uj№рСzНо`0ܘ1УfЪ•+W†  гщbcc+**фъL&S||Мбh пКukчЮэе"GфђVН{їжщtђџвНјт‹‹/–гПњъЋ~§њЩЫ–mpйбs@=_9З;ёЅ ь‘ћ|zzzVA \Ц‘p3. ц’““{ѕъеГgЯГgЯ–••%$$,ZДшќљѓrDОhбЂЄЄЄcЧŽнМy3;;{§њѕBˆ˜˜˜™3geddЬš5ЫfЪ­[З/^œ““sўќљC‡}ёХruњгŸЎ_П~љђхC‡%$$єьйг^-цˆМЌЌlйВe;vМїо{хє;яМгмxѓВe\sшмˆЛ_Њ8‹z>ГЙРьйГgЯžэчч'ПlH€NpяжˆШбИšе….рЪю$GфбббgЮœYЗnн№сУ+++FcЛvэ233зЌYГkзЎрр`Н^џф“OЪџ!w§њѕђђђЊЊ*NзЛwo›)нКuЛїо{[ДhбЁC‡{юЙчж­[rЖ;vlлЖЭЯЯЏ}ћі§ћїяйГЇНZ’““WЎ\щяяЏзызЌYѓЯўSўЫhЫ(<%%%::Z^ЖlƒЫŽžъљъЬЙн‰/U и:YНzѕъеЋЃ=ЗU77Ь#л\ЬЇЅЅЩїШПћюЛЕkзўх/‘ct!ФЪЪЪКwяюяяяяяџт‹/њћћ !vяо§їПџНC‡ГgЯ–#'ы”­[Зіюн[оpЯž=нКuB|ѕеWїо{Џљ/‹‹‹{єшaГЙaЩЩЩљљљЗnнzјс‡џєЇ? !Ў]ЛVQQ&—`‘[ЖС‡ЮН8Б;ёЅŠГЈч3›ЅФФФnнКy{{{{{їяпџјёуrКБ-YВ$((hЩ’%BI’ўњзП†‡‡{zzЖkзnзЎ]rЮO?§4$$$ рНїо3kycлљuъдIЃбЄЄЄШџUi4ЇM›V\\,ЏЕY~m­KЎБlй`{СЅœђЯŸ NѕОа}їнwэкЕ“$щдЉSBˆџљŸџ‘$iіьйsцЬ‘$iхЪ•“'OЖЗэеЋW;uъєщЇŸZЇ|єбGбббЇOŸЎЊЊЪЩЩбыѕђп8Џ\Й2&&FЮ\XXh0Nœ8aГ–яОћЮ`0TWWЫ/џўїПGGGK’ДoпОО}ћЪ‰YYYйййж­ЊЧЁЈЁсc‡šGŸ†Д-<<ќР/Пќђš5kVЌX1sцЬcЧŽJ’”‘‘ЁзыЏ_П.чмВeЫФ‰%I2 лЖmЋЈЈ0bb)&&fзЎ]’$]ЛvЭ`0фхх™г,X`Џ–№№pƒС џћњљѓчх iiiђђЄI“жЌYS›6д•šOwlлЖэбGр„‘‘‘rКМƒ­[ЗŽ‹‹“џйў7оBшtКgžyfܘ1ЏПўКœЇSЇN#GŽBTUUYn.џЧЛљ3ѓ3Я<иЊUЋЩ“'4H1aТyыђkl;{іь%[/›œ——gЏ"ИRSx“hVъ4Кз;XП~§C=$IREEEbbbQQ‘$IC‡нО}Л$IћїяПуŽ;Юœ9#IR~~ўW_}%IвЧ|хЪI’’““ƒƒƒЯ;gВtщв‡zЈЂЂ"33ѓЁ‡ъоНЛ\ноН{лЖm{ѕъеТТҘ˜ВВ2›ЕЌ_П~Ш!ђV.\шгЇЯТ… х&uыж­ЊЊЪd2ХФФДmлVЮSЃ ѕ854БˆМFKънЖЂЂ"F“§ўћя7ЎC‡™™™лЖm{р$IкБc‡VЋ5ќFЏзЧЧЧK’ДoпОСƒЗiгцљчŸ7™L6SЖlйrз]wЩzxx?~\’ЄэлЗ1Т\ћУ?ќќУf-rУ.\И IRYYйдЉSG%IвеЋW}}}Ээzїю””$/[ЖЁ‡Ђ†zRUѕГђђђэлЗЯ;зќЗ5ђ‡^yYўЄ$ыиБЃbЧŽђKѓDЃЯ>ћЌЈЈH^6pВŒ•-_nлЖMбЋWЏйГgЫп–hЕк’’›х;.ЪцВЙС6+jЄcTзубФЈѓТ їUзUя7ўќ‰­[З>qт„МќкkЏћјј„††.^МX’ЄgŸ}6((ЈUЋVQQQ|№Э”+WЎм}їнzН~шаЁ/Нєвјёухв*++'L˜рээ`Žд­k‰‹‹гjЕ:NЇгuъдщ/љKeeЅ$IхххУ‡ŠŠ9rфŸџќч?ќсr жmh ІєІЖо—zя_Њигd"ђ1cЦˆџ–žž.§жZѓ7’$ЩЯuœ={жœ"чIMM•ЦЭ–/хљ$5\О|йfљŽ‹2OЗŒШЭ ЖY‘“;sйс Ѓqёо†s5ЁнБW^yхЙчžSКvЙу!ЕЧzGъНw|ЉbO“щ0^^^Bˆ§ћїчффXИц8XњэЖ<ƒE’$›БНˆ\ž~ётХwоyGk.іъеЋіЪЏБ­ќRмOŸ>§Ы/П8h€ƒŠ ЙАk­?NdюЭ€S4еѕУ?„……ійg6lPљг5zў#н‰m0?ѕЋеjGŒ!'ІЄЄШ‰јУfЮœ9dШтттРРРщгЇпџ§ћїя—ŸЂ }ы­ЗЂЂЂж­[W#хщЇŸоЛwЏбhМћюЛїЛп™ќф‘Gyр""""""ЦŽ{ђфI///›Е$''ћэЗzН^ћЪ+Џ!юЛяОюнЛ‡‡‡їшбУќpV9ыј4AAAзЎ][ЕjUaaЁуœ3gЮ\А`СЬ™3“’’Š‹‹ыєѓ—mлЖЭЬЬŒ lнКѕЮ;§ѕзіэл'''—––ЪПЖd]ў‚ ,ЗŒŒ\Нzu=’““чЭ›—ŸŸя ЦЧ{lюмЙ6+‚pх•ЪQ?8Q.\юrЁ[НzЕбhдщt}њєљц›o”nŽ# ?ЄЊ:)ТIГVдєОTQчYиЛwoppp@@€<ёZиПG^]]Н|љђN:ЩвўуџpПЦЫwоy'00PNєаC&“Љ[Зn{іьQm8^?nzR€†р9€ІŒ›mNз№CЊц“ЂцЖЙ))Pќg'7уš?4F3AwR!—§o9 ЬZAутюœ‹qК PЯюР1ц‘€mъ‰чааTˆ“‚fˆˆ‹ +œ‹еЈчЋ35Д€šЙь*съyфiiiцЫ„pЦсЂЙaІœˆюЄBЬ#G3єљїп?|јpН^їнwямЙг)ЅЇІІz{{[ІtюмйќїГuвH-Ќ%ыq–z'–аЈИАТЙшNM€ќwJЗBut'Н^Џзыu:FЃбџЦAўЦXsYгBq№рСG}tкДiYYY………oОљцnЛeeeeу7яџдЏ…š$ХƒЙддTЫрiьиБQQ—k(оŠ‹‹‹‹‹“““u:]ёo”m’тдѓ™ p™BˆЙsч._О|мИq-[ЖlбЂХРЗoп.„ШЫЫ7nœС` |с…*++хAтэЗп ‰B”””ФХХЦщгЇ———;ЎЯ<Ь,YВф™gž1Ї1bыж­і ДзB\Зn]PPPhhш‘#GЬѕжH”йЌБАА066жh4 †‰'>МММ\}Џ\ЙbЙG67ЗW]VVжШ‘#ѕz}TTдІM›єzНхИko+ЧйВ„7†††њјјДmліЭ7пЌe'hT\Xс\*щN^^^црщУ?Д\хЪЛnJ=_ЉЄ;е`=ЎйЫЙaУ†Ž;ъtКў§ћЇЅЅЩ‰6‡W›9м–ЫҘEEE?§єгу?nНnкДižžž™™™gЯž=rфШoМ!„0™LЉЉЉiiiяОћЎ">>>??џвЅKзЎ]ЫЮЮNHHЈeХ111{їю5™LBˆмммУ‡ЫmА.аA 4277їЦSІL™7ožœгfЂН]˜>}zYYйхЫ—sssŸ{юЙ§ћї›рааPЫи;6Ћ›6mZ```vvіwп}їўћя[яŽЭ­jysssуууїьйSRRrюмЙaУ†еђ\юE%СœЅw+lFTц<СССaaaGŽYНzupppHHШбЃGnKйЛЃAдU*ьN6Ч5›"""Ž?žŸŸѕт‹/Ъ‰6‡W›9UK=ŸйзIOOзjЕ’•ттbызЏЫ/ЃЂЂ.\И „ШЫЫ“KJJ<==322ф—?ўјc—.], Йpс‚———Н”оН{ђЩ'’$mкДiфШ‘і ДзBЧ,,,”$)%%Хh4ЪѕZ'кЋБFБ6wФёАY]qqq‹-Ь™їяпЏгщ,KЖЙUэraaЁЗЗїіэл‹ŠŠl.EШнLщV щЈkjŒhѓЪІбh^xс“ЩTVVіЧ?ўёЉЇžКuыVVVVпО}Ьy^yх•ЪЪЪ„„„:МікkђђрСƒTёх—_цфф˜LІЩ“'=Z’Є_~љХппПММ\’ЄœœŸмм\›9CSzS[я‹R{wсТN'йзjфДŽ;жІMѓKысе^NЈЧ!mJ} юЮeНQj4šќќќ+.]КdŸ={жппПЦ… ==]aјŸŸ_PPe!Ž#ђхЫ—O˜0A’ЄћяПЧŽі ДзТк4в|Г™hЏЦХкмЧGРfuж­ЕŽШ­ЗЊгAўт‹/† цчч7`Р€ЃGZ7иѕИАТЙд0ДЫžЭяЪўѓŸ–w+ьETrž‚‚I’NŸ>­бhnнК%/XWс8ъrrIu5Ѕ7ЕѕŽ(‘лзjф4їwоy'""ТзззззWЏз›ѓXЏіrК@Sъ0h†\ж[јњњо}їнџњзПjм; ЊЎЎЮШШ_^О|ЙM›65ђzzz^П~=?????П   ++ЫжxлЦїщЇŸІЇЇџ№У>њЈНэЕА–tЬfrШk.VиџZГNG@nэ7ф—WЏ^­w эe~шЁ‡ф›d?ўјЄI“jS~cГьа@УЉЄ;yyyхџFžSчххe4…йййІ]ЛvrЮААА›7ošЗђѓѓBДlйвЧЧЧЧЧG^vќЮЖmл"##§ќќ† rыж-9qќјёЛwяBьоН{ќјёrЊzц$ЈЄ;YЊ§И–ŸŸїЮ;я|ѓЭ7–ћRcxu€c. cZ!VЌX1oоМ={і˜L&I’Ž=:yђdN7zєшљѓч—––цффМњъЋO>љdu:]LLЬœ9s „IIIжu”YАL ыоНћдЉS‡.Rі ДйB9џmщ˜Эu:н˜1c^zщЅЂЂЂЪЪЪ~јСh4šL&ѓАZз#`ЮќШ#Ш­ЭЭЭu05А~Udff~ёХeeeZ­жззЗККК–p/* цьiјKіb)ы;D]ѕЃЖюTћqЭd2UUU˜LІеЋW[ЎЊ1М:ШЉNъљЬИL !Ф}їнїбGmкД)((ШЯЯяљчŸ>|Иbыж­%%%mлЖŠŠКћюЛ.\hН§ЦЕZ­ќ]иаЁCЯœ9S#Cyyy+ зЎ]Г\“””уИ@{-Ќe#ГYуІM›<<јрƒлЖmГ,ЊАА066жh4 †‰'кlLeeЅ"77wдЈQzН>**ъРrЮлю—Эƒ#„иМyshhЈŸŸпЌYГ***ьUКdЩ’gžyЦМеˆ#ЖnнZ›z]I=7Уа4аšѕ|uFwр˜ЫТЛГVL&Snnю7ў?ію=<Њъ\ќјrШLn (&`4„›т,&ˆ•ƒ…z+ AА@ˆœb+вDыБ ŠO ‚BХУAёСZjRЕ1(Х "  I Щр„ !™\цїЧўuЮtn™$3;kя§§ќ5ййГік{­йѓЮšwжš9sцТ… =лГГГїэлчp8rrrцЯŸ/„ШЫЫ+..B|ѕеW6›My\\\œ››л­[7џ§=х—”””––ОњъЋѓцЭs8'Nœ8}њtuuѕ’%K|*3{іьИИИЪЪЪУ‡яоН{ыж­ћїя7›ЭNЇѓ7о№й9рžЮдЉSпyч††!ФйГg?ћьГ‰'zUPPаааPVVfЗл~јс€•yійg•=“““ЋЋЋwэкЕyѓfeЯ6Я+XUwэкuєшбуЧяпПљђхСšŸŸПmл6—Ы%„АлэХХХ&LчИ€ІЕ+˜‹єЊjјџЂзО* иLˆœŽ5JЧžhXР…;&„8ўМлэ>pр@jjЊџэxяоНН{їVлlЖвввчŸ~щвЅ………Я=ї\А§•ђЯ;чvЛыыыутт***”}ёХW^yЅїNgLLLyyЙђч|““уПŠuˆ†8МММ7п|гэvП№Т 'N qм•ёпhБXк<ЏUѕЕ}ћі<ЈђјкkЏ}їнwнnїКuыЦЮѕT™вЭКАаz"ШП;Љџ.ll ЋЈжƒ&p›ЭцФФD!D=”QXХЦ—/_~цЬсѕ}_nnnqqqqqёЃ>Кwяо/ПќВИИXI ИПR~jjЊЂЊЊЊЉЉiа Ažs6›Эо5ЉЎЎ6™L—^zЉђgџў§Яž=тe№ˆСNgкДi[ЖlЙїо{Зlйт§U€џqCTЦc8чЌЊБББžЂњѕыwцЬ™WрОћюлКuыwоЙuыж|0Ьуšц&lBфјt'z— hPЗјјјцццжжV!DuuuшНGaaс+ЏМR[[ћЩ'Ÿx^3yyy;wюќђЫ/‡ž——ЗmлЖ“'O^§ѕСії–––W^^юp8GmmmUU•ї6›­ЕЕЕЂЂBљГЌЌЌwяоэ­a0їо{яŽ;іэлїнwп?очИnЗлsм•ёйГЌЌ,œѓ VеццfOQЇNRЪv&Ožќо{яГЊщГjеЊйГgggg1"єощщщ‹/1bФР‡ цй~эЕзКнюQЃFyчхх…ипGQQQlllvvvbbт­Зоzша!Ÿ^~љхњњњ>}њфффмxу‹/no C˜6mкЁC‡ІNъџЏuыжХФФdddиlЖ5kж„ЈЬњѕыэvЛЭfЫЭЭUfžiѓМ‚U5>>~фШ‘ ИќђЫ‡ ВhбЂаW ??ЧŽљљљс_O5qcEdбt@žЏЮшNBS-Œ1Ir[ьB{їюНћюЛO:е­›VзK’™IšхВЁ&w-D н @hЊ…1]ПBP—{щЅ—ІOŸN8%Мл!ВшQ: Яuъ@fЊн% =<`Зл322 єс‡іъеЋЋЋЃ%ќЧЇз|{Б‘ƒrPЪA9ЈŽкљ$­œ)х ž:"G‡iЂsPЪA9h{Ћу3еаAєс ђдSlTУqa№1rЈ@žЏЇЁ$ў"‚шNBS-ŒсfPдР‡яЯKJJКwяюГБДД4--­ЭВ<Я sш€Юч˜t' ™L&кFг-`ю#++ЋІІ&ќBлЛ?tŒ+"‹юЄnЗ[’rК€аT c˜§€ЦHЬAшNЂQ`@нЦŽлииhЕZ­VыЉSЇ”­ЋWЏЖйl™™™ЛwяџšЪRTT”™™™аЇOŸ+V,д{хБOBˆњњњТТТДДДддд‚‚‚ЦЦЦшž(Кˆ<ƒaаК“Шѓен @hЊ…1н>ќ№CГйьt:NgffІТхrйэі3gЮЬœ9sсТ…о{лэіyѓцНѕж[ѕѕѕGŽ3fL8ЧXрМyѓЧ‰'NŸ>]]]НdЩ’ˆŸ]’$˜ƒ>а$$Яg6@5ЊtЛн ,ˆ‰‰™8qтСƒНџwфШЇг™’’rеUW…s џ/^МјкkЏ­\Й211бbБ<ўјуoОљfDЮВсЦŠШЂ;щ€<_б„ІZ "7›Э‰‰‰Bˆ=zИ\.я%&&О§іл›7oюлЗonnюž={Т9†UUUMMMƒ JIIIII3fLmmmЮ€HЬAшN’ч3 šиіўуЦ7n\SSгъеЋgܘqфШ‘5---..ЎММмbБtрщаюЊˆ,z”Ш3Й u 3еюнRSS].зйГgУйЛВВђ§їпohhˆMLLlmmэиQ-K~~ўЃ>Њ WTTьиБЃcE02 At' ‘юъжГgЯ_ќт HIIёЬЕLKKЫВeЫвгг­Vыњѕы7mкдсХЦЦfgg'&&оzы­‡ъpQ7VDнIфЩI ;MЕ0Ц$Щmz%Язга“‰Л"†ю 4еТnFUёA|˜kdFІ"ˆю$!вa@Б]]шƒaˆ,оЇu@žн @hЊ…1Dф4Fžx:@w’" *О:ф‘а2 At' ‘G"kбХ`"‹їiч†@wyф˜<ёt€ю$!D9@U|u>Ш# 1d ‚шN"Dж Ђ‹С0Dяг: Я ю 4ђШ 0yт9шнIB4 ˆЋДД4---ѕ‰yrtпt’ja 9‰H0зБР7Вe–””˜L&ЋеjБXFŒёЭ7пtјаYYY555э:ЈеjMLLМэЖлОћюЛW$љloђ|fTCDŽштЦŠШвYw2›ЭNЇѓќљѓcЦŒ™3gŽšu:555У† {№Се9Ў‡<_щЌ;ˆ8еТ"rё`nэкЕ§њѕГX,#GŽ,--U6>§єг?џљЯ=ћќф'?yљх—ющ1vьиЦЦFeјљдЉSBˆsчЮMž<9999--э‘GinnX˜˜˜ќќќ#GŽxoєq/))БZ­ЪуЊЊЊёуЧ[­жœœœuыж)л=;+VЏ^mГй233wяотФЭfѓŒ3”1ђ`‡Beff&$$єщг'ф…д$I>Р›<Ÿйе‘#КИБ"ВЂбВГГїэлчp8rrrцЯŸЏlЬЯЯпЖm›ЫхBиэіттт &мгуУ?є ?gff !fЯžWYYyј№снЛw?ћьГ+аммМeЫ–†SлйГgЇЅЅUWWійgoМё†џ.—ЫnЗŸ9sfцЬ™ . QTCCУІM›nКщІћиэіyѓцНѕж[ѕѕѕ>Ÿ:LžЏЮИ;>ОЙЙЙЕЕUQ]]э]ц™3g”?ПџўћvžюПшоНћ<№љчŸ;œbмИq}єQMMЭ„ :s89IђйофљЬЈ†ˆбХ’sЙ\---={іtЙ\+WЎєўWџў§љљљ;vьШЯЯosO!DЯž=ё‹_ 0 %%E™kхх—_ЎЏЏягЇONNЮ7оИxёт№ЋГjеЊйГgggg1ТГ}У† gЯžЕйl7п|ѓЄI“bcлНєВgB˜ДДДЏПўzгІM!зввВlйВєєtЋеК~§њіK~сї%йoвжВPэ"Яg6@5&FUЪ]•n†ŠHЇ:x№ршбЃУ\UGZлЗoŸ?ўсУ‡ЛК"ZЌ/•””dgg[,Зл=tша—_~љЊЋЎ*)):thCCC”*эђУЌƒrтB“Щ4|ј№Еkз0@хj№ЦyЈж# 1љqћіэW]uUDъЃВƒ:tHQ^^ўдSOMœ8БЋkЄmСњR—,о$ƒ._@JюC""Gtqc…œжЌYгЩ$ьЎrюмЙЛюКЫjЕ^}ѕез\sЭO<бе5j7yrкМ;Еkё&h§І№ojя Sое№_Л*рWї &œЄМWZБbEш‹ hyфXDтЙввва+уHkдЈQ%%%NЇгnЗu ГоBїЅv-о$кZП)єтM^aJZх*рWї ІЭЄ|V3fLW'lђ|fTгюŸэB: ђмB„}Ъ:JBˆЁC‡†Гx“јчњMЇOŸюбЃG=ќёŸ§ьgо;x/оza&ёЯІN:•№ћпџў‘Gљня~pgO4ќ№У?^x-quчwz–И ИgАw:iiiЪф˜yV^у0 "rD7V>фЩIшин)иjJ\ПЉУ+L[ЛЪg‰Ћ{ЮRоЋGݘ1Ѓ]ч hyф˜<ёt })иjJ\ПЉУ+L[ЛЪg‰Ћ{+6єR>ЋG)ёzD№‡‘#КИБ№!ЯWgЛ;[MItn§ІЏ0bэ*я%ЎBящўR>ЋG){:ЃZУ Aˆ.~й @Z&SпЃН~гБcЧЎЙцš€Йр"…_vB'ф  yО:‹јнIЭѕ›<ЈL’ zШ#€Рф‰ч ‘эKЊ­пєвK/,]К4Jхw-^у0 ВV]d­ тшTˆњ’œhШCЕоШ A4†їiDнIB4 ˆ1r€Њф‘аrLAє% ё‡‘Е‚шb0 €yn„}B#“'ž‹6>аЊ€Ы+!D9HJЏЙ^Я :ŒеТВVhŒ$СєAнIёЗh/ЭџўєJž|ыШвыyu•`9WаВVh ЉPˆ ­ї%­з? ^у0 ВV] †№!Я AaŸчbrГЂљШ 0bDнIB4 ˆˆбХ€yFseЈ™19жи IDATFŽ)"ˆО$!^у0 ЦШ]ђ †„<7Т>Ё‘GЩЯAшNЂQ`@Dфˆ.nЌ|Шѓе™ u 3ђШ 0rLAє% ё‡1FŽш’g0 €$фЙ!іУžxTqU%DЃР€Ш#љЪшцvMЦs4pUM#k€Ц3ŠH+J и—фgЬз8 ŽˆбХш‡рф‘а ђШ 0I‚9ИнnBЦh3NwвDDŽштЦ tžЮ^Gђd<ЫP2Sэ.Aж 1T*!cДЇ/iˆЁ^у€‚1rD—<ƒa€Fщях#ЯіMЕ0†ˆ€ЦШЯAшNЂQ`@ЬGP_EWа4ђШh 9Іˆ њ’„xУ€ШZAt1lР‡<7Т>Ё‘GЩЯAшNЂQ`@ф‘TХWgбРU4nPкЄЮ‚_vа˜.Н@Iе‚&“NоЅКЊЄЇsТDж @UђDZоља…ˆШhŒ<ёt€ю$!D9@U&“I’Сi"?’ " 1ђФsањ’„xУ€ШZЈJž‘iТ>’ " 1ђФsаК“„hY+UЩ““@ф@Dф4Fžx:@_’ЏqY+UЩ32Mи@Dф4Fžx:@w’"k *yrˆќH‚ˆ€ЦШЯAшKт5"k *yFІ ћH‚ˆ€ЦШЯAшNЂQ`@d­T%ON‘I‘аyт9ш}IBМЦa@d­T%ЯШ4aI‘аyт9шнIB4 ˆЌ€ЊфЩI ђ "r#O< /Iˆз8 ˆЌ€Њф™&ь "r#O< ;IˆF‘ЕP•<9 D~$AD@cф‰ч є% ё‡‘ЕP•<#гz ћфЙЊ:РФk`L&o‚ЄРЭ *edšw№ €ЦcŠЂ/Iˆз8 ˆ’ " 1ђФsаК“„hY+аЄфффЪЪЪv=ЅБББOŸ>‡#JU&yrˆќH‚ˆR;yђЄЩdВZ­=zєШЬЬ|ѓЭ7…eeeqqq—\rIЛŠ2›ЭgЮœIII чXYYYяОћngkпNnЗ;99ЙЂЂТП>žsY’|6€7y>ГЊ!"‡діяп?tшPЇгY__џаCЭ;Wq№рСЁC‡FуXƒVŽѕРЬ™3'т‡эфЩ“БББ—^zЉЇ>ўчю­ЅЅEхсvЛ%œ&ь "rHmџў§з]wТd2н|ѓЭѕѕѕBˆoОљF‰ШчЯŸПtщReЯП§эo#FŒPЛ\ЎyѓцЅІІ^qХ/ПќrVV–т…^˜5k–тљчŸŸўју›nКЩѓ#бККК!C†ЋOР„[Зn§ЯџќЯЫ.ЛьWПњUSS“bџў§JОJАsWЮbТ„ Ъ>;vьШЭЭMNNі<%--эЃ>КщІ›њіэыЙŒсWРgKРђ…>еˆy†QqЪлOWзBђШHƒˆђ:pр@пО}Н7;v,===99љлoП4hђ†Z]]э‰€ЋЋЋ=Ad]]нЎ]Л†ZRR’œœмЋWЏ’’’ЄЄ$Я<-žT–єюнЛWЏ^&“iоМyNЇѓѓЯ?BTUUM›6ЭёOuuuЋWЏ>{іЌчЕЕЕŸ|ђЩаЁCƒе'` BˆлoП}чЮ_~љх{яНїзПўехr}їнwЪS‚{II‰ХbQrж…‡CбBДЖЖnпО}ܘ1UUU>ѓЩ„Yџ-ЫїЏFФ‹CM’|6€7y>ГЊ!"‡МіяпЏ `{ѓќЌГ[Зnuuu­­­MMM?ќАЭfSFpЏМђЪ;wž>}КЎЎЎ  Рщt8а;‰м3}ётХввRO И'Ž§ёќС!ЎОњъПўѕЏ‡BджжюиБCqХWьмЙГЂЂТсpЬœ9гщt4(X}–№юЛя~џ§їBˆsчЮ]Иp!;;ЛЎЎЮd2)ѓСЮ§РžЪ !ЎЛюКO?§ДММќтХ‹ПњеЏВВВF5tша;v(?W§ц›o***ТЌ€џ–€хћW#‚ˆХ Bž†&ь "rШK™ŽаgЃчgЗмrKFFЦрСƒяЙчžЬЬLO<}Чwмvлmййй7п|ѓ!CrrrЬfѓ7п|у‘r€q‘и !ц#‡1FP•<#—„}њ&ЯЗ1а(ВVPсš„h9@UђŒ\ЪPDэ‹N"5И"!ђШa@Œ‘T%ЯШ%aŸОЩѓm 4Š+VЌЈЈЈЈЊЊ*((ˆ‹‹‹‰‰>|x^^^Ач*жЏ_Ÿ™™™””4wюмІІ&џ2…чЯŸŸ>}zjjjrrђДiг<ѕyщЅ—222ІOŸю“Ќт_f}}}aaaZZZjjjAAAccЃO ЪoЙх–>ј ‚заI>Р›<Ÿйе‘CЗЧїп?`Рџ544lкДщІ›n і\Лн>oоМЗоzЋООўШ‘#cЦŒщлЗoFFЦ”)SоyчГgЯЖyt—ЫЕkзЎЃG?~|џў§Ы—/ї/SQPPаааPVVfЗл~јaЯsKJJJKK_}ѕеаe !цЭ›чp8Nœ8qњєщъъъ%K–,!''ч›oО їкiЃ_к%Oліщ‘=:Iе.фЂЌЋzкЩ“'cbb<;vL‘œœœœœгЛwяуЧ+лЭfГg‹ХтvЛЯŸ?пН{їM›6еееyјаC]qХ&“iдЈQЧј\ЯБЪЫЫ•?Зoп>pр@џ2NgLLŒg7ячž;wЮѓЇrˆ€eжззЧХХUTT(Пјт‹+ЏМвЇХсУ‡­VkЇ.hGEЉpг.ЉкNžšРCЊв^оя ЧяеЋW—д'4i+яЗ]`ŒК•œœмввrётEЯГйьp8‡гщœ6mкќљѓƒ=711ёэЗпоМysпО}sssїьй#„шзЏпкЕkKJJЮœ9“™™: =66івK/UїызяЬ™3ўeVWW›L&Яnоѕ ˜Єю_fUUUSSг AƒRRRRRRЦŒS[[А„ККК”””жхжеЕ@GШгv’ е#JкѕmЬрСƒЏОњъ%œ‰А"ђ§ˆ№Љm'+С‰ХфD9)))—]vйбЃG§џеН{їxрѓЯ?BФЧЧ777ЗЖЖ !ЊЋЋ=ћŒ7юЃ>ЊЉЉ™0aТŒ3МŸžžžўлпўілoП і\!DsssEE…ђјдЉSН{їі/гfГЙнnЯnmђ/3---..ЎММ\љЄQ[[[UU№ЙGŽЙъЊЋТ<`’|6€7ѕ?ГэнЛї‡~(//?pр€šЧ<ˆШЁgуЦлЙsЇџv—ЫѕњыЏggg !њіэkЕZЗmлцrЙ^|ёEe‡ЪЪЪїпПЁЁ!66611БЕЕЕІІц™gž9yђЄТсpЌYГц†nј\…ЩdZМxёХ‹эvћ’%KюПџ~џ2-ЫЄI“,XPWWзммЌŒФ‡р_ІХbЩЯЯєбG•ЁёŠŠŠ;v|юЇŸ~њ“ŸќЄнWPbђф"ЃНфi;Тq} ?ВэЕз~іГŸн}їнЏНіšВE§]НzЕЭfЫЬЬмН{Зт™gžё Й§іл7nм8vьиЦЦFejнSЇN)џђyЂЯ4ў% !ЊЊЊЦoЕZsrrж­[ч3UР† юПџ~!DKKKbbт“O>)„8uъTjjЊ2*Дvэк~§њY,–‘#G–––;Om=ыX­ќЯ§мЙs“'ONNNNKK{ф‘Gќg ѓŸс иќў•Bиэі;яМSЉЯЧьп”ўзЁ3дќpHD=+((xу7<zniii_§ѕІM›„111ЋV­š={vvvіˆ#”=[ZZ–-[–žžnЕZзЏ_Пiг&Гй|№рСммм„„„ЌЌ,ЛнўъЋЏ|Ў">>~фШ‘ ИќђЫ‡ Вhб"џ2…ыж­‹‰‰ЩШШАйlkжЌ }:ўe !ŠŠŠbccГГГoНѕжC‡љ?БББqћіэSЇNэмхtH’Я№ІђgЖ–––7оxcтФ‰“&MкВe‹р !\.—нn?sцЬЬ™3.\(„˜:uъ;яМгаа „8{іьgŸ}6qтФ?ќа3ЕnfffР'њИУьйГгввЊЋЋ?ћь3яw.E^^^qqБтЋЏОВйlЪутттмммnнК !ВГГїэлчp8rrr<9™ўђЏmgjх_кьйГутт*++>М{їюgŸ}ж{џ€3›Ÿ р5,((HNNЎЎЎоЕkзцЭ›§ЏmРы  *цЌУ КЖЇ§єЇ?нЙsgW]EEE .ьЊЃsЋДшœrŠTЛ„YЮ|аЋWЏІІІЦЦЦ”””?ўи§ЯгŸ?оэv8p 55Uй9//яЭ7пtЛн/М№ТФ‰н~?х јDŸiќwp:нКuѓќLџУ?єџЭЂЭf+--}ўљч—.]š‘‘бииXXXјмsЯљьЖwяооН{‡SЗпфэ­•Oi>г|№С999оћћЯpb~џ‹я_~ˆ_vzЎCgЈy‹`Œ:ї—ПќEYГгШ •Љјp“И"я`H›7oОчž{bccуууяМѓNЯШЋйlNLLBєшбУхr)ЇM›ЖeЫ!Ф–-[‚}ё№‰ЁwЈЎЎюж­л%—\Ђь‘‘сџЌмммтттттт[nЙхњыЏџђЫ/‹‹‹ѓђђ”џnмИqР€IIIЃGОpсB˜5щ|­МљLWаПŸЩ‚§g81?Э§ЫїЏCРы  Dф4Iž\dД—}њєщГmлЖЗп~л{’.їо{яŽ;іэлїнwп?^D(ёЩfГЕЖЖž9sFљѓћяПїп'//oчЮ_~љЅВDнЖmлNž ЋМ§іл)))G§њыЏПўњыЃG*ПзЖjjъmЗніРLœ8бl6+[\.W8+Ч…`БXюИуŽE‹)ПнїIПVфхх§щOЪЪЪ2›ЭЃF***>|x||МТхrЕДДєьйгхr­\Й2ФкUл6kхSšХbЙыЎЛ”§kjjžzъЉ)SІxяp†ƒ0ч'PЪПѓЮ;=х/[ЖЬg‡№Џƒ„ˆШh’ЪпkЫЌДД4--MyМ|љђддTЯŸ!іьBђДсИО…ѓmЬkЏН6sцЬK.ЙD#Пф’KfЭšх™q% iгІ:tШ“ВвГgЯ_ќт HIIёЬЕв6l8{іЌЭfЛљц›'MšыГУЕз^ыvЛ•}њфффмxу‹/іо?р сЬOрБ~§zЛнnГйrss•ЩgМ…ТЄцz&In‹а1Ѕ7гг K ЄЄdшаЁЪ .—kвЄI яМѓN=КЖ2оœNgjjъбЃGГВВдЏ•™LМ ъY”n>{їюНћюЛO:ЅLr лЗoŸ?ўсУ‡ЃT~ЧШYЋЈRѓ§‹1ršдUЙШ.—kтФ‰яОћn—„у!TUUХФФШŽ“GuDщл˜—^ziњєщЧ<Ј ———?ѕдS'NŒlљ#g­TC9ШШхrM˜0СхrНѓЮ;ЪВўk[мЈ,xБ~§њЬЬЬЄЄЄЙsч655y—bE џ7ЎёQZZzеUW)лЇL™p)“NЎЂK’|6€&иэі„„„§ћї/XА т…Ÿ;wюЎЛюВZ­W_}ѕ5з\ѓФODќ g­t‰ˆ€&ЉŸ‹ьvЛ'L˜аммь ЧEЕ-‚-xБkзЎЃG?~|џў§ўѓQ[УХ€k|deeэпП_йўЦo\ЪЄЭУ…^ $RШ#‡:"ўmLЏ^НъыыїюнлЋWЏЋ5jTII‰гщДлэEEEž›Lз’ГVЊQѕ НЯoјЁЇœ>:РБcЧКuы–№_џѕ_žзЖБр…ga‹элЗ8аЇ|оŠ999!жј№оb)“ЏQЂ3:ш™A7t!5Ля/y@дџСh\\мџїOœ8БWЏ^Ъ<ФžЕ-”мnЗйlИQыYиЂ_П~ž)~=Т\#ќIж”ЅLюНїо-[Жј/хнље@:LžћЪPDэ‹NRГ ‘Ес;vьІM›ђѓѓwюм)„ИЖEА/š››= [œ:uЪсŒ€ЎИцЗЈўK™„sЌаk”ш‰+@чyЯЌъѓ{•.­—–‘а$яЏе4aТ„—^zщЎЛюњт‹/ЎmlС “ЩДxёbeЁ%K–јЯЄPР7Т\уУ)“6ец%бUmчp\пф™еЇѓкнЊ geeеддЈp `чЅѓUГ ‘@ћLŸ>§йgŸ7nм7п|pm‹€уууGŽ9`Р€Ы/П|Ш!‹- ѓpў+n„ПЦ‡ЯR&mjs§‘фГ|ш)˜ТЂNК:ŒЌЋћ8ЄЅ~ёbЃФч7—ЊљђЫ/ћіэлвввч~№С>??mЕTећ†?хЕљт‹/кlЖ~§њ}ўљч+VЌАйl—]vйюнЛ•}.\И0gЮœ^НzЅЄЄЬž=ЛЁЁAйОvэкŒŒŒ=zєюнћќcР-kжЌЩЬЬLHHјб~tќјqх‰gЯž7nœХb0`@QQ‘ђъ`GQ\~љхB‹ХbБXЪЪЪмnЗнnПїо{“’’zѕъѕЋ_§ЊЉЉЩџМ”ЧўuXКtщƒ>шйљілoпАaCАкzЌ_П~Ъ”)nЗЛЙЙйjЕўюwПsЛнeee)))Gѕ.иoЭНџЛnнКŒŒŒФФФ‡zШхr;џыщ^ŸаGNŒ‘€nЕw)У§ЋМƒIDATЎТ@ЌTКjйЏГgЯVVVЮš5kђфЩчЯŸЏЌЌœ3gŽчїач3ЕлэѓцЭ{ы­Зъыы92fЬџ-Bˆььь}ћі9Žœœœљѓч+œf4рQ<ќч<ѕŸ5и њз!??лЖmЪOКэv{qqё„ ‚еж#//ЏИИXёеW_йl6хqqqqnnnЛжK 8ЌџщМžч~ѕпўХ‘HW$§SŒМІІІGз]w]MMMјЯкЙsчW\aБXzіьYXXxётХшеPМЪЃЋтe&аккZЗл§эЗпšLІ .({іьщ2ЩЉлэ>ў|їюн7mкTWWЇќЫ‹ЗН{їіюнлdšб`GёЎЇї=$рМЈ!іїЉƒлэОікkп}ї]ЗлНnнКёуЧ‡иг›Эf+--}ўљч—.]š‘‘бииXXXјмsЯyЎЭ1rс7lРг x=ƒнKНЗЗyqТЇц-‚1rˆК+ЏМRYЌG5[ЪФ€ЋИЩЌ“@з~Sa6›“’’„ёёё Ъce ^Я|І))))))cЦŒQ~Д˜˜јілooоМЙoпОЙЙЙ{іьёп"„иИqу€’’’F}сТdšб`G І]ѓЂњзAqп}їmнКUБuыжћюЛ/Фžоrss‹‹‹‹‹‹oЙх–ыЏПўЫ/П,..ЮЫЫkЧх4lРг x=Уб™IcЛ9Mт‡_к%OлŽwЙа!"CЌaАљL…уЦћшЃjjj&L˜0cЦ џ-‡ЃАА№•W^Љ­­§ф“O”Ъœf4ФQ<ЪћЯ€ѓЂЌР:!&Ožќо{я|x^^оЖmлNžйb<8zєhuVэimн4дьBŒ‘а$yr‘ЃЁЙЙY’BЂAžЖ“}VЌXсАQRRbЕZ={Ў_П>333))iюмЙMMMŸ.„8ўќєщгSSS“““ЇM›ІјвK/eddLŸ>н'!$`™ѕѕѕ………iiiЉЉЉ>…<ЎGРSP6Ў^НкfГeffюоН[1vьиЦЦFЋеjЕZO:%a"M‡Iђй†rюмЙЛюКЫjЕ^}ѕез\sЭO<йђgЮœЙfЭmLТвџ ЩtIхЁ/e­ŠЯ?џ|ј№с‡C™! ЯтNЇѓюЛя^О|љя~їЛ€O/((pЛнeee {їюUž[RRRZZкккъ}ˆ€e !цЭ›wсТ…'NtыжmъдЉK–,љљЯю]Hјеі9Лн~цЬ™ЅK—.\И№гO?§№У‡ъt:•JJJ:s1хЖ$з7iГV”iFЃWўЦЃWx'Љ?lgЕr‰‹‹;rфˆгщLII ёuАлэ^О|y=l6лќЧlйВ%рг/\И№ч?џyхЪ•IIIБББ#FŒPžћф“OЦХХ™Эц6ЫМxётkЏНЖrхЪФФD‹ХђјуПљц›>…„_mŸУ-XА &&fтФ‰ьЬu“Ÿ„с"" I*ч"‡ПV…џтŸюГ†…Тl6ЇІІ†YfА%EМ щиfГ911QбЃGeэШ"ъ6ZA9HЧg­ŠјјјццfeŠмъъjЯnў‹_|КЭfsЛнž=C Xf›KŠ<ЎїП‚‚?IшhаёЉЁўFТ3нgž „‰ˆ€&Љ<њхПVEпО}­VыЖmл\.з‹/Ошйгё‹€OЗX,“&MZА`A]]]sssшбы€eЖЙЄHРуzџ7и)ј Ж*GЧШ3rI8Ўoс|N••%с4‚Pš_ш‘@лќзЊˆ‰‰YЕjеьйГГГГ•,pEРХ/.uБnнʘ˜˜ŒŒ ›ЭЖfЭšGXІhkI‘`Чѕv ў‚­ЪЁ’|6`p,Ž@“ЄEmЂэ ЌЌЌ'NX,!ФЁC‡\.заЁCџ№‡?,YВЄG[Зn§б~фНЈMQQб3Я h9M’gNkД—Euьmj~ЁЧь‡ OоSЖЕkЯ№ŸЈu&o‚zЦ<›ш$5ЛPЌ Ч€ˆуНVЛфi;ъ€€"вIh_t’š]ˆЌЫЙsч&Ožœœœœ––іШ#477+йЋWЏЖйl™™™Лwяіь\___XX˜–––ššZPPаииш]дкЕkћѕыgБXFŽYZZъй~ўќљщгЇЇІІ&''O›6-рџ’•jЌ_П>333))iюмЙMMMBˆБcЧ666Z­VЋеzъдЉЂЂЂЬЬЬ„„„>}њЌXБТЛ>>{*§Я+єIi‰+d@D@“дЯEž={v\\\eeхсУ‡wяо§ьГЯŠр‹‰Ь›7Ясpœ8qтєщгеееK–,ё.*;;{пО}‡#''Ч{ЭП‚‚‚†††ВВ2Лнў№УмАф€ы’x/}bБXBЌlц")ЁO*|ф‘ЃMщ$ђЬъRЕ Йmq:111хххЪŸ|№ANNЮБcЧ„чЯŸwЛнHMMUў[__WQQЁќљХ_\yх•‹нЛwoяоН"р–€%+е№ьЖ}ћіКнюcЧŽ™ЭfeуљѓчЛwяОiгІКК:џjxяЉќщ^сŸ”†№&ЈoФ9ш$5Лyф4Iх\фъъj“ЩфYћЃџўЪtiЉЊЊjjj4hђЇлэ6›ЭоЅmмИqљђхЪъ!žS№9DР-СJns]e9’?ўё?ќ№UW]ѕќѓЯ{OћрЯџМк<Љ№‘GŽ6‘GЈй…ШZ€ЖйlЖжжVЯкeeeН{їЖsZZZ\\\yyЙУсp8ЕЕЕUUUžџ:ŽТТТW^yЅЖЖі“O>ёмёm6›лэі"р–`%ћЏK"ќR2BЌlЮзВЁOJЛШj "ršф§•Ђ ,Ы]wнЕhбЂ‹/ждд<ѕдSSІL Бs~~ўЃ>Z[[+„ЈЈЈиБc‡чП.—ЋЅЅЅgЯž.—kхЪ•оЯš4iв‚ ъъъš››їьйpKР’§з%џКєIш•MТY$%єIЕ‹ЪmсИД"вIШ#G'Љй…ˆШ ,/Пќr}}}Ÿ>}rrrnМёЦХ‹‡иЙЈЈ(666;;;11ёж[o=tшч_щщщ‹/1bФР‡ ц§ЌuыжХФФdddиlЖ5kжмАdџuIФП.}rтФ‰+›„ЙHJˆ“в.I>08G Iђф"w9Э-шCлЁMt cфу"Ћ€ ˜k€&1xІ]ђДсИД"вIhG'Љй…ШZ”ЩФ› ž‘Ѓ“ˆШ  Мзjm‡6бI`4ф‘Œ‹Ф2`Œ`P Фъэ‹NRГ 1F0.Т52`Œ€&1њЅ]ДкD'б0Fm+))щоНћK/Н”žžоПџнЛwЏ\Й2===##уяџЛВO}}}aaaZZZjjjAAAccЃВНЈЈ(333!!ЁOŸ>+VЌИeэкЕ§њѕГX,#GŽ,--UžXUU5~ќxЋеš““Гnн:Ћет(шђШШ€ˆ€&Йнn•ЧЯ\.зйГg+++gЭš5yђфѓчЯWVVЮ™3gсТ…ЪѓцЭs8'Nœ8}њtuuѕ’%K„vЛ}оМyoНѕV}}§‘#GЦŒуПE‘Нoп>‡У‘““3ў|ЅРйГgЇЅЅUWWійgoМёFˆЃh‹њm сИД"вIL&MŒЮPГ ‘Еm+))ЩЮЮЎ­­MJJ:tшааЁCNgBBТЁC‡ђђђьvћХ‹“““ЫЪЪ.Йф!Ф?ўёћяПџиБcuuuщщщыж­›0a‚2ШэПХлО}ћЦцЬ™ .$%%>}Z)№Ѓ>њйЯ~V]]№(Њ_`>r}#ѕФ/;  ъ~™ЭцЄЄ$!D|||BBBBB‚ђXЩЉЊЊjjj4hPJJJJJژ1cjkk…‰‰‰oП§іцЭ›ћіэ›››ЛgЯџ-Bˆ70 ))iєшб.\BTWWwыжM‰М…!ŽЂ-ђŒ\ЋI+"Džoc Qjv!"rˆ€ДДДИИИђђr‡Усp8jkkЋЊЊ”7юЃ>ЊЉЉ™0aТŒ3ќЗ8ŽТТТW^yЅЖЖі“O>Qоl6[kkы™3g”BОџўћаGAЧHђй€С‘а$йFП,K~~ўЃ>Њ ZWTTьиБCQYYљўћя744ФЦЦ&&&ЖЖЖњoqЙ\---={іtЙ\+WЎєxЧw,ZДштХ‹vЛ§йgŸ qm‘ЇэЧЅСёФ]]ЃШЇэИ)IKžNЈƒЌЈ‡7?оh!ѓ‘cфPя†йdЄ™j—333))iюмЙMMMBˆЂЂЂЬЬЬ„„„>}њЌXБBqўќљщгЇЇІІ&''O›6Mќ3;хЅ—^ЪШШ9rЄOІŠ™ѕѕѕ………iiiЉЉЉо%LŸ>нчD~ћлпІЇЇЧХХЭ™3чЋЏОŠк‹bqCqЛн’ NгыЄ%O'дADќŸО}ћfddL™2хwо9{іl›ћЛ\Ў]Лv=zєјёућїя_О|ЙнnŸ7oо[oНU__фШ‘1cЦ! ЪЪЪьvћУ?ьynIIIiiщЋЏОКL!ФМyѓЧ‰'NŸ>]]]НdЩ’%xлГgЯрСƒ;sMЂ-t,nŠ>5O"ь 7 MtЙ“'O>єаCW\q…Щd5jдёуЧ;f6›•џ;vЬbБx !ЪЫЫ•?Зoп>pрРѓчЯwяо}гІMuuuЪvЇгуйЭћЙчЮS{—я_f}}}\\\EE…Вё‹/ОИђЪ+НKІМММwяоџћПџлщЋ!:@змўЄяо4Wсєt.ˆ: Œ†1rр_єызoэкЕ%%%gЮœЩЬЬ|№СCь{щЅ—zžxцЬ™ФФФЗп~{ѓцЭ}ћіЭЭЭнГgOuuЕЩdђьцa6›&Љћ—YUUедд4hа ””””””1cЦджж†(AqётХ{юЙч7ПљЭшбЃлqў]DЙл=ъŸ)dУї$d@D–žžўлпўілoПonnnmmBTWW{ягмм\QQЁ<>uъTяоН…уЦћшЃjjj&L˜0cЦ ›ЭцvЛ=ЛЕЩПЬДДДИИИђђr‡Усp8jkkЋЊЊBтvЛxрnИaС‚э:ыЎE”lђ44сИДфщ$€:ˆШџSSSѓЬ3Я(г:Ž5kжмpУ }ћіЕZ­лЖmsЙ\/ОјЂїў&“iётХ/^ДлэK–,Йџўћ+++пџ§†††иииФФФжжV‹Х2iвЄ дее577яйГ'tќЫДX,љљљ>њЈ24^QQБcЧŽа…<іиc.\XНzuЇ.GсjЂГ9№ЬfѓСƒsssВВВьvћЋЏОГjеЊйГgggg1Т{џјјј‘#G0рђЫ/2dШЂE‹ZZZ–-[–žžnЕZзЏ_Пiг&!ФКuыbbb222l6лš5kBзСПL!DQQQlllvvvbbт­ЗоzшаЁа…<їмsŸ|ђIrrВеjэгЇOчЎJз .з1y~SK“–<P‡‰ћTcвб2рш:@gшщъIu.&яƒ2’Њ“*ˆэъ ŒEž0‹QXiЩгIuЕ0."?2 "ЈJžaТqiЩгIu‘Œ‹А€ Ш#ЈJž‘iТqiЩгIu0F0."?2 "ЈJžaТqiЩгIu‘Œ‹А€ Ш#ЈJž‘iТqiЩгIu0F0."?2 " 1$˜j<-H8.-y:  "r€qіyф4†qM­“Ї ЧЅ%O'дС9РИˆќШ€ˆ€Ц`ЊuђД сИДфщ$€:ˆШЦEи@ф‘аЦ5ЕNž$—–<Pcфу"ђ "rC‚ЉжЩг‚„ув’Ї“ъ "aG@cзд:yZp\Zђt@Œ‘Œ‹Ш€ ˆШh ІZ'O ŽKKžNЈƒˆ`\„}d@9a\SыфiAТqiЩгIu0F0."?2 " 1$˜j<-H8.-y:  "r€qіyф4†qM­“Ї ЧЅ%O'дAD’ђНЗВD—€ ШZ 1ЦI0еkА(O ъѕ ы€<PcфP7Y ѓ%#Хd2q1t9"rcЈјЩэvыяCЌ<-ЈПkЋђt@DфPwX "x)E€ Ш# 1FK0е_Ш(O ъякъ†<P9h AddіПh №ŽмД#HЙЊ\R]Ž1rа bЧˆу’91f‚ЉžGyZPOWUgфщ$€:ˆШ@ЃА€ Ш#yф$С9РИЧШ€1rУИІжб‚hFУ9РИШ# ЦШХ@,I0F0.Тq2`Œ€Ц0ЎЉuД кD'б0F0.ђШШ€1r€A1 @Œ‘Œ‹p€ # 1Œkj-ˆ6бI`4Œ‘Œ‹Й$ДБ‘аЫ;r`9Ѕ БР6rzЩq`9pŒ]ѓ:'Ш'—„66rzyGl`# ”!XТF@/9l`#ŽБk^чљф’аЦFI6rHВ‘@’"Ž™Ќ;Э ђЩ%ЁЭ_њўёЄ–6о‘@’W+ЄШ I‘@’"€$EIŠ’9$)rHRфЄШ!iffцyžє‡1Š’9$ЭћОщo€^6rHRфЄШ I‘@’"€$EIŠ’9$)rHRфЄШ I‘@’"€$EIŠ’9$)rHRфєщ5›tѕ$IENDЎB`‚icedtea-web-1.8/plugin/docs/PaxHeaders.7406/js-java-wf.png0000644000000000000000000000013213441742745020124 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.236253483 30 ctime=1552410887.043183606 icedtea-web-1.8/plugin/docs/js-java-wf.png0000644000175000002070000007765613441742745020761 0ustar00jvanekmock00000000000000‰PNG  IHDRсюV)ЮsBITлсOр IDATxœьнy`SUо№ёš6ДIšД6Рta{hK*„В= HEД€P:њдe^eSЧб—GPZ”E,ˆЈ8 у((•iЁЕeknЄ%н—ћўqЧ2оД;ЕЇyT'Уn7бŽš З%яЩэЋчАФЮыСмsˆцтHћхV hQ79џЃКџ^сžG uаѓРm1DУ%шHш$Ir&ЌkOѓЈ2v`t(NюЩ€жчЖCД[5ЮpЯŽДgFЮN­лЄf1ЏїБ CЁч€лbˆ†kб‘амtфlO1ЊрH€ŽŠžn‹!.AGB‡тИУЗГUАЃЃЂч€лbˆ†Kа‘аЁ8ш№э/FьРшЈшљрЖЂсt$t(і:|ЛŒQ;0:*z>И-†hИ ŠЭп^cTСŒŽŠžn‹!.AGB‡bнслqŒ*ибQбѓРm1DУ%шHшPtјіЃ v`tTє|p[ бp :<Т>ЫlЪЖjŸ Йэ?hЭЧa мC4ZgЙ№$7эУэђ^_'УnРcH7гж €Ž‹!­ЃнЭІ4H­VwюмЙЩ%dggЙАI65П­Іu6ˆ[i71*GKYYYІ­[ёЎнmВВВlю6ŽиkЇЌ%`Я„ Оћю;Ы”хЫ—ћћћk4šєєєЖjUг$''/^МИ­[Ядю&cВВВ …FЃQЋеC† 9sцŒœ~шаЁ“'O6ЇфоН{:“ѓУ?T(яПџ~jiT;­OќвввnЛэ6??ПО}ћ~ўљчMh€ѓlnЧчЂ–V­ZеЛwoЕZ}ы­З:tЈБЕ;_‘ o71ЊgwcyvU)eYlЃJnўцќ8вœ.юќ8rќјqyƒИ0 -++›9sІNЇ3 ‹/Ощ5чЗ‰Еfмœ|V—˜˜(П2dH›_sД<бМыЎЛЬ'š.qшаЁввв!C†˜SL&гŸўєЇ'N˜LІЈЈ(жeЉ%ŽBˆйГgЇІІЛАL@ДлЩ•Je2™JJJюОћюyѓцЕ~>џќѓ;юИу‹/ОhхzkkkЇM›ЖxётВВВўѓŸzНО•рМwп}їнwп§ъЋЏЪЪЪ6oоЌTЖ_zкQ[єˆеa™LІ“'OЊеj“Щd2™\Ufƒb/Йэ`Ю0`€МA\XцЂE‹jkkЏ^НšžžўеW_­_По……шhT*еБcЧъыыѓђђŠŠŠкК9BќrЂi2™ІNъкЭwоygЦŒ–)љљљ^^^Н{їva-жZтX „PЉTcЧŽMMMumБh жјюЦcІх•JхУ?œ‘‘a/ƒхѕwЫ›O:јЧ?ўбœјлпўЖСе%yёПўѕЏƒЁ[ЗnџўїПхtI’vяо§ќѓЯљх—ѕѕѕцœПџ§яЕZэАaУ ь%кSVV–˜˜h0єz§œ9s*++…ьзЏ_UU•<єбG]ЙrЅ   ..NЁPєщгчюЛяvАxIII|||`` ^ЏќёЧl9§Нїо ещtлЖmГЙAl6iџў§–уъ„ ’““…ЏНікыЏП.4pрРпќц7BˆгЇOїяп_ЃбŒ3F> йлШжй\ЭќќќааагЇO !~њщЇ_§ъWyyyіw†Ѓyд–;bС’uЧvКј‰'ф=yѕъеŽЫДЙјš5kzєшсчч}ъд)!„НЬf“œмmь 6ћЈu“dђтБББMGlВЎшЫ/ПьпПП9CLLŒ|Юf“ЖlйђмsЯљњњ-XА`Ы–-кй­[ЗлФЩЫоVрy|рР;vмwп}rŠЭbнКu={іTЋе!!!+WЎ”sкLД9vй<џs0r*ŠёуЧŸ={Vи?…ВYЛЛwяŽ5П8pрэЗпnхф{}m_lžBљјјмqЧёёёaaaO?§tc7{3Виии]Лv5Жъ6Ч~snSbZоБъъъM›65сЖˆљѓч?ђШ#зЏ_7'юйГЧњъRuuu}}§Еkз’’’–,Y"'=zДЎЎnЪ”)ооо?ќ№ƒœXUUеН{wЃбёмsЯ9HДщёЧП|љrffц•+WЪЫЫ_xсЙЂ“'OZFFнКu3 ПћняŽ;f9Ыmsёљѓчзее]Мx1??ܘ1ŽЗImmэў§ћЯ;—››;`Р{ФКIwп}wmmэбЃG…FЃёлoП6mšбh§Ё‡КqуFUUеЧ,'ЦЧЧO˜0сњѕыхххгЇO_ИpЁ$Iбббћлпjkkууув X›‹џуџ8ў|]]н’%K,IRuuu—.]цЮ{єшбњњzЧMЪЬЬєђђJHH(++ЛqуЦЙsчЬщцЎ"ПBќѕЏ­­­}єбG-?ВЬiГI–‹Яš5ыwПћƒХmЎІЭЬ6з= @юЅ—/_жыѕUUU6s^ЛvMЁPдддШE?~<88иA;­kЗйN›йцj:р>н@ŽЏ{їю}ђЩ'GuрРyєЖ(Š‹‹•JЅ|tэкЕяПџ^’$›‰’­БK’ЄЛюКkйВeЕЕЕsцЬ1#Ќ+2;ЕЕЕ/М№Т=їм#§пБШ|ˆБWЛ=ђyЇ|XoАЄX_ dcхC‰<№~ійg …bзЎ]НzѕКщЗрТcйЁC‡BCCoZЕдFCДуŽ]WW—››брDЂѕ™Пњњњз^{­СvnІ„„„еЋWлЌЎЩš_‚ЕyѓцНљц›ЮфlУ#ОƒN%„ащt:nј№сщщщ–589ДOJJJфhJ’$ѓHhoq!„Щd’$щєщг:NNџѓŸџўју &и;Жй<ƒЗнt•к\ЃbT›зцwп ?9ˆQtйщгЇфзж;˜Э&INя6Ю6›ф’qФA]–ы>kжЌз_]’ЄеЋWЯœ9г^ЮььlsњйГg§§§ДГAэЮX7нJжмЇлhРёсЕЖЖіЖлn9rЄ>>gЯžѕѓѓ;{іЌх)”=.<˜ЅЇЇk4š›V-ЙeŒњФOьлЗoеЊUЯ<ѓŒќкœ'А9Ѓ`3qѕъенЛwїѕѕ8pр?ў('ўју}ћі XА`љфФК"›г!іЮнmжю@XX˜Й=’$§ц7ПёѓѓBЈеjЕZ-ŸЃZOБ8ж ;YЏћПўѕЏ~§њ™3 4шѓЯ?ЗЗ•dяНїојёуoZЕфЎ1ЊН3gbдььlsј”‘‘с8FЕй+ $GјoНѕжo~ѓљSЫ2хQТfЂЭŠЮŸ?oŽКu:ПППС`pМВЅЅЅ=іиwоioёœœЅRщ`ћ4ˆQ-Я9эЕг^т‘#Gzїю-IвЄI“6nм(I’|JyyЙeЖ[оМ•l6ЉQ[iяоНBˆнЛwпДёі8ЃZБ$Ї$ЏМђЪтХ‹Џ_ПЎгщ Ÿ{юЙ?џљЯ6mі" {бMWЉЭ5*FЕйqm~їіфХкы:6lˆˆˆ№їїзjЕ ŽЏ–;˜Э&INя6Ю6›ф’qDЮмЙsgI’єйgŸ :T’ЄQЃFэиБУ^ЮЋWЏкœGЕзЮMu~РВЗ•pŸn ›žе=ћьГ6lGo{кчŸ>~ќxƒСаПџЏОњJ.СfЂѕиeѓЈaГ"s“ЊЋЋ-ZtяНїJіЯWlжn|†рЬ-ЏŽƒuЏЌЌдыѕщщщ:Nо—lцЌЏЏзыѕЇOŸ–—њрƒ~ћлп:hgƒmтќ€es+9ц>н@Nžе™чQ huuu+VЌhpП†eЂЭБЫцљŸЭŠ,›єу?оrЫ-’§S(MВ),,ьфЩ“Ж€ЭЇPце™[U]x,0лДi“;O|9юxLр›пкœbqЌNЫ;ЎкAŒZYYщыы{№рAљmUU•ŸŸпЁC‡$IZКtЉyŸ’/gдееЭ;ЗБ1ъ{яНgy]пО}зЏ_ŸљЫOБъъъ}єбyѓцIПœ[6HДйNI’yф‘љѓчЫјмЙsŸ}і™œ^\\ЌP(233ЭkєїПџНДДДККњщЇŸОћюЛ,>mкД™3gоИqЃККњгO?uАAЃ6h’ьйgŸŒŒМяОћЬ)kжЌщпПNNŽ$I'Nœ8zєЈ$Iбббц 4 і6ВНŠlЎц3Я<ѓ№УK’4gЮœ?ќсŽлiЙГнќПgМННzш!ЫЃ5ј›І€€€ššš7n!ŠŠŠ…ббб'Nœјц›o–/_ОgЯžуЧ4H1aТ„/ОјтъеЋГgЯNHHB Ÿмм\Ѓбh4KJJђѓѓmVф‘дjѕ§їпџєгO›LІššš;w !ќќќттт,X є™™™џќч?u:]LLLJJJ]]]JJŠƒ2m.^]]]WWзЕkзšššUЋVЩ9ЋЋЋпxу7nдддlоМљзПўЕН&5VJJJ}}§ЛяО;zєhsb```uuuVV–Йvы&™—WsмИqцФрр`oooѓп:й\ЭЗоzыЬ™3’$эмЙS^ЉTЊ &ЬŸ?џž{юёѕѕЕ—SЁPLŸ>§Ѕ—^ЊЈЈ(**zу7|№AэlРf;lф[ @G`s (((иЙsgyyЙBЁ$IЅR !l&кЛќ§§яКыЎ5kждззoиАСAEцfH’ДkзЎАА0!DppАЯ‘#G„~јЁœСfэŽ7.--­БDЏзGGG'''ЫcЌхЁФ-q,0лЗoŸƒ1пЭyyyнwп}ёёёђл‚‚‚ккꘘН^ЏзыЧŒSRRтяяПcЧŽЭ›7їьйsР€_§ЕТfЂbуЦ‘‘‘:n№рС555BˆЂЂ"oooN'„Их–[T$„PЉTFЃБЌЌlюмЙЯ<ѓŒНfлЋнН^_WWчрIŠBˆттbooo­V+ЗгЩYžšZЏЛbкДiќБту?6?ЦfNYiiЉgќЋB*•ъoћл=їмЃбh>ьууѓкkЏMš4iј№с–л0%%хНїо3 AAArњсУ‡5хѓ#ЫЪЪlVёХ_м{яНцЗ“'O–xІRЉ.\И гщ222ўђ—П˜лchнN!ФлoПэххЁбhўћПџ[žKBќПџїџbbbBCCwюмщххѕэЗпіьйSЇгэпПп|fnsёuыж !ТТТ ƒќФ5{Фšƒ в IrтŒ3Юž=ћР˜KxќёЧуууGŒЁVЋxръъj!Фњѕы7oоьяяљђхeЫ–9ќ2mTdНšHMM}ѓЭ7…џћп?њш#љО_{эt–ƒxНООўеW_эпППƒ8о:—$щілoŽŽ–$iШ!’$хччњщЇeeeѕѕѕoМёFпО}ФтКуQrЇ %-QЋе–?‡Џ_П>sцLН^ЏгщЬо1™L=іX—.]дjuxxјЊUЋ$I:qт„ќЇžzЪё3“l.ўќѓЯk4šюнЛПњъЋrцкккЩ“'њњњ<јЇŸ~rа$ыoфаЁC жШd2Щй’’’4Э!CЎ^НjЙШгO?"_FВn’хтђc-_ГfПППZ­–Џrфˆ“ї<;цфя6=XaaЁZ­–;v{dюlŽbT›G,'$’$Э›7/>>^’Є„„yцзоБЭцМGЦЈA‡ьIOOoч%v№ЮИ3Зк=]uўз4уЧџюЛякЊvзzћэЗ-ZфdfїQ%[ѓ6gl&ЪЯНџщЇŸЊЊЊ,zjѓNыŠlN‡иМво$‡жЯѕЕОсац‹Е5kжќєгOѕѕѕЫ—/7_pБЗю’$=єаCУ† 3?кдANI’цЮЛrхЪ›ЎŽфЁ1ъсУ‡ГВВъъъўчўЧњжш& F}с…ІOŸож­hК›ЧЈэŽћЌˆћДЄMtЈРžффdѓ­-Њƒw6РЙУющђѓ?4JЛˆQ;ЮОdu›’Э)kyZОЅЋўф“O‚ƒƒеjѕ№сУNЊ|ИАА066V~;{іьдддттт–nаrфНLон\dЪEYлЈ’?./~г]вIцёDЃбФЦЦfddИЄиЦЖЁСЈhт† rцЬ™жo‰лH›У•1ЊGо[ЅRЉL&SiiщшбЃчЯŸпргккZжхdiыж­›1c†e ЧŽ›ššъТ–­Ьd2}КNЇ zђЩ'х8SЮ“’’вН{wџЧ{ЌІІFQ^^ž˜˜PUUе Д1cЦTUUЩ3-/^\О|љЌYГЬЭ;vьњѕыwяо=bФЫu>|јЎ]ЛZ~›ЁЕ93ЏюСJJJтууѕz§у?.'–••%&& Н^?gЮœЪЪJ!Ф‰'ЂЂЂWЏ^эИL›‹ЏYГІG~~~бббŽo—АЮљх—_іяппœ!&&ц‹/Оp\ІRЉ|ф‘GЬѓЈ6›tђфIyў№‡?ШгП–СђЎ›‹Џ[ЗЎgЯžjЕ:$$dхЪ•rЮіызЯ<Т|єбG–Mzјс‡ЭM’ыzяНїBCCu:нЖmл„ЇOŸюпППFЃ3fLQQQcП#›MВ™hГ"›MЉуў5<<ќиБcFЃ122ђЉЇžB%%%mпОНММ<##cєшбцЬЕЕЕ[ЖlщлЗЏќЖКК:+++;;{У† ѓцЭѓііОrхJzzњїпџђЫ/›ѓьпПџьйГ?џќѓЩ“'_yх!DRR’бhЬЩЩЙ|љrAAС‹/Ои Д/ПќRžж0™LнЛwŸ9sцЇŸ~*Ÿс]ЛvэРЃFКtщRDD„хКDFFЖТ}Ш$Љ   iŸšЙvю]vэкЕ&|фўцЯŸ_WWwётХќќќ1cЦШ‰?ўјхЫ—333Џ\ЙR^^ўТ /!цЭ›WPPp§њuЧeк\<((hпО}&“iьиБ‰‰‰ЗЮ9rфШ‹/цфф!rssЯ;'ЪЌ­­§№УяКы.MJLLlђ]П~§ёЧџјуЫЪЪŽ?#ч–ЅЩ ЊT*Ыц 6lлЖm’$­\ЙrъдЉчЯŸїђђjА щщщІљ[ЌИ['qвЯ?џќќѓЯїшбу•W^qцг’’’GyDЏзћћћЯœ9SўZWЏ^:cЦ I’ЪЪЪцЯŸЫ-ЗшѕњyѓцUVVJ’єж[oЩгјƒўљчŸ%IъеЋ—B­VЋеъ .и\J’$F3iвЄ?ўИКККAл|дњЇ™™™–Ь#Оp IDAT{ЈМs™їYYY™RЉЬШШпў№У}њє1BˆввRI’8а`7З,жцт–™OŸ>а`ёЛЄuЮYГfНўњы’$­^НzцЬ™іršЧ//Џ\П~н^“JJJЬkДџ~Й§–-1Џ”НХU*е–-[ЪЪЪЌ7ВхъXqУ‡OOOЗL7`’$5иШНzѕ’ѓйl’ЭD›йl’cn5€€Fё№yT•JeќХБcЧ,?ZП~}DD„ППџˆ#ЪЪЪ„Z­vЧŽ›7o :tшСƒ-KиПџmЗнf.6 @QPP P(‚ƒƒхєž={šЇ­”JЅ9НGWЏ^ЭЯЯЏЉЉ‰ŠŠвыѕzН~єшбђ™ЈЙ4›~јс-[Ж!Жlй2sцLNWWWWQQa™чЦzНол џWyyљ{яН7rфШAƒlнКuсТ…Ю|šPYYyсТ…ЂЂЂ'žxBќпйragFнznПСМКЭЅ„—.]š0aТkЏНК`СЫIuЙ9yчњеЏ~е БЖЖ6&&Fо‰ЦŒSRRR\\ьээ­еj…Змr‹у2­BlмИ122RЇг >>Юк`v]f9[noFнznп’НЅ,…††FEE…‡‡чфф:љ‘{RЋеїпџгO?m2™jjjvюм)„№ѓѓГм‰233џљЯъtʘ˜˜”””ККК””eк\\ КvэZSSГjе*9ч[oНuцЬI’vюмљы_џZNД™SЁRЉ&L˜0ўќ{юЙЧзззANГ)SІфччянЛзоEGGЇЄЄдззЏ[ЗN^$88иЧЧчШ‘#Bˆ?ќаСьмЙГММ\ЁPH’$2yаЫЪЪjьзЁзыЃЃЃ“““х,џцжљяШf“l&кЌt,.Œw/ахUлф`U’ЄЅK—Њеъž={ўэo“г/]К4dШ­V+?ŠѓЛяОЛщ<Њ$I………SЇNѕїї |т‰'ф_§Щy’““CCCЕZэќљѓхЉ6“Щєју FБjе*ы*’’’ќ§§u:н… фљё›{їю•п:t(&&ЦœПВВ244ДААа›ЌхЙ['qььйГ‹- 8pр›oОYPPрЬЇ6чQ-Пe›3ъ6чі-gНl.%ЋЏЏџілo}єб€€€qуЦmнКеќSUЕ>пЉZ­іѓѓПќјVNМ~§њЬ™3ѕzНNЇћня~''šLІЧ{ЌK—.jЕ:<<|еЊU’$8qЂoпОO=ѕ”ƒyT{‹?џќѓІ{їюЏОњЊœ9%%ЅG;wюлЗяїпo^м:ЇLоIЗlйт gƒnАtщвЩ“'лkвёуЧ#""ž|ђIsEЋWЏюж­[llьГЯ>kNД^ќъеЋC‡•‡В;яМѓ‡~Ам O?§t```HHШЇŸ~ъќ<Њ$I?ўјуwмсчч7jдЈќќќF}G6›dЏ6+bаОpj…фКчЁЩПкrІ@чsЖSYYYЗнv›ќ<оц;zєшфЩ“/^МиЉгцН'NœјЬ3ЯФЦЦ !’““srrфчЛПіиIъъъОќђЫ 6ькЕkХŠsчЮНщЇ>ј BЁHIIёѕѕ=zєш-Змв ?<ђШ#~~~ЏНіšNЇЫЫЫЫШШИэЖлКuыvъдЉ>}њ$$$ьиБУd2]ЙrЅkзЎ6—њэo+„шнЛЗЗЗїьйГуууCBB,›чрЃжч>пi;’••еПW§glЧAgsђ$y[Зк`stа{}л—5kжФЧЧ›T!Ф?џљO9@B$&&Ж—Еђђђ?~ќЖmл.\И0x№`g>MNNіђђ 3 oНѕ–u™kзЎU*•сссZ­vфШ‘gЮœщвЅЫ’%KbbbњіэлЏ_?9[``рџќЯџDDDшѕњ‹/Z/%gлМyѓйГg/^l…:јpCЬЃЖWЭЃ………EEE}љх—ŽXк^аI:2Ог&`Еiшln‚iД4њмГ9ˆQбЊш$п)Z ЭMpІ–FƒлЂs6їњм1*Р](лКhф›шdмУР…ˆQб,цx•`ЕCс:€œ 51*\ƒ`ЕУтЋ`У  к2FЕœŠЧ bщАœќъйёрѓЈh)Ў V iкЎSZР#ЕeŒЪАвN94ђ§ЂAАJ—ИЉЦ^‘a“ЯУ<*\Ьх'Эœ…Л!ЎSД(gЖїOEŒ з MFŒŠf!ЭGŒŠF#%њ@ …‚sЄ&#FаhŒЙœС)  :ЕuјbTДK<ф№HФЈwAŒ pФЈwAŒ pФЈрJќѓVsЃ€С)  ˆQю‚эsѕ€G"FИ bT€Л FИ ЅЫKT(./а0 ЎФМ]sИr•GЋ3…BСЙ Б˜GИ bTxХ/кК! ѕpш<’ыŸ™ДŽL€‡!FEћCh xЊжˆQyd\‚а№xЬЃТ­56.uпо…{‹Ÿќm•ŸЫ1 ##F…[sе‰Л;$ф'?wšрa8И7Gkм…ЫНО0“Ябщr6aВxN2Ф<*кѓбˆ["УџЃЂ“~бж Z—cР&ЮФ<*<‡(Р30 p­Ѓ2ЧpѓЈwAŒ ЎФѓ›ƒДNбM@Œ pФЈрюxђиФ\=р‘ˆQюЂ5bT.qœС<*Р]Ѓм1*ИЯ;lbTа"8E41*Р]Ѓ€Лущш`sѕ€G"FИ bT нЫЪЪъмЙГ ЬЮЮ jluYYYЦќvтФ‰ћіэB$''/^Ми…Э€k•л0w–••ЅP(4Пxрzїю]XXиœ2>\XX+„˜={vjjjqqБ‹к OЦ<*ЁRЉLПј№У›_рКuыfܘa.|ьиБЉЉЉЭ/№ЋV­2 нЛwџўћях”Зп~ЛGjЕzШ!йййцœkзЎэоНЛŸŸ_Зnноxу ыЂ,яц-//OLL HHHЈЊЊВЬYTTtяНїj4šШШШЏОњЪœО{їю#F˜п>|зЎ]Ў[WЅАУоGmн^`‡щц FјрљuUUеюнЛgЮœщК•€ЧRДТГ7ŠжЈэ‚<ЉюLp>'мгФ‰Ÿyц™ииифффœœœW^yЅ­[дАƒРУp€–FƒлЂs61*ZЇр€ь №0œ ЅбЧФНО E<š@йж dљЌ8NгœGŒ -ЫЏЌ€k1Ў‰\ЯђДЩЃЌмTkФЈœшШЬc С*РM1 ­ФAА*ˆW„ФЈps–g№€‡‘$ЩВ‡глџ=mЅAPЪ<*ƒKЯЭС<*мgэ№$ж‡+z8<›BЁ “‹ZЁ)€ѓˆQРѕlосCh ЎХ\=р‘ј=*Д,щmн—••еЙsg—•дД2'NœИoп>љurrђтХ‹]в$7ЇАУоGmн^€[k•Ѓ€ŽFВажmAЃѕюнЛААА >|ИАА066V~;{іьдддттb—ЖЧ<*џЋЖЖЖЩЫЎ[ЗnЦŒцЗ*•jьиБЉЉЉЎhW; 9Ё­лhˆQюnэкЕнЛwїѓѓыж­лoМay nVV–FЃ1чLIIщоНЛППџc=VSScsq!Diii|||@@€NЇ{јс‡хзЌYпр_›e–——'&&$$$TUU !vяо=bФЫ–>|зЎ]-Иi№8ФЈЗVTT”””Д}ћіђђђŒŒŒбЃGлЫY]]НџўГgЯўќѓЯ'Ož|х•Wь-žPYYyсТ…ЂЂЂ'žxB^6+++;;{У† 7-S‘””d4srr._О\PP№т‹/ЦK—.EDDX.yъд)—o€›уЮ‘ц FИ5ooяŒŒ “ЩЄзыoП§v{9%Izх•W|}} УŸўєЇ-[Жи\МЌЌьЃ>ZБb…ПППRЉŒ‰‰‘—}ўљчНННU*еMЫЌЈЈxџ§їWЌXЁеjеjѕвЅKЗmлVRRтхххыыkЙИVЋ5-В]№PФЈЗІеjwьиБyѓцЁC‡44єьйГ–‹gdd8˜јаLмN x$bT€[ЛrхЪ_|QYYЉT*ЕZm}}}HHˆFЃљф“OЊЋЋWЏ^mЮЉP(–,YRQQQTTєт‹/>єаC6WЋегІMћуџxуЦккZГіЪTЋеqqq ,())BфххэйГG1~ќјoП§жrё}ћі7Ў%6 žЊ5bT.qšЌЎЎnйВe]Кtбh4)))›6mђђђzѓЭ7чЭ›.џšTцуу3dШˆˆˆ^Нz§њзП^Дh‘ЭХ…ЩЩЩ^^^aaaƒс­ЗоrPЛЭ2…kзЎU*•сссZ­vфШ‘gЮœB$$$|№СцeЋЊЊvяо=sцЬ–и,x*$Z“BЁЮ]Жp>'р1иA<РФ‰Ÿyц™ииX!DrrrNNŽљQРŒЎ p!bTД*ЮcиAаNбu.ФяQР•фKrhbT€Л FИ e[7ИЫЛдјљ(м–BСЃUDŒ 1ЧЋ€Vаїњђ‹a<€тmн€'cк+BДfV-‡4J.GŒ эSXh9NŸr'$R€8F71*hЮН-‡8…аа ˆQ€#„Іp[tNР#Ѓ€†8ѕД•жјTŽsgДFŒ €3ˆQю‚\‰?ŽnbT€Л FИ bTДKмN x$bTmтФ‰ћіэ“_'''/^МИmл€Чh•K\аоeee)Š;яМгœRUUuЫ-Зh4š6l•й7п|ыяяpџ§їŸ;wЮAfy]4FЃбjЕЃFrœпксУ‡ cccхЗГgЯNMM-..nњ €_0 pŠOaaсO?§$П§єгO Cл6IЖwяо)SІќўїП/..ЮЫЫ>|јАaУ.]Кф`•Je2™L&SaaaП~§fЯžнЈз­[7cЦ ЫвЦŽ›ššкДіИ)…і>jыіhbT№dYYY;w^Еj•С`шоНћїп/Ї———'&&$$$TUU !ж­[їаC !ъъъДZэѓЯ?/„Иxёb@@@}}НBЁˆпИqЃ\Т† ,C;›Ў]ЛЖ{їю~~~нКu{у7lІМ§іл=zєPЋеC† ЩЮЮ6˜ŸŸ?aТF™œœ,OикЌeсТ…Ы—/Ÿ6mšRЉєѕѕ}ђЩ'ЇM›Жlй2{ыnIЅRЭš5KžG•ѓ›З›yŠиКЭЛwя1b„e9У‡пЕkWГО* „ FW]]]TTtѕъеG}tсТ…rbRR’бhЬЩЩЙ|љrAAС‹/О(„6lXZZšтјёуƒA~––6tшаN: !fЭš•ššZWW—››{єшбI“&™kБ.АЈЈ())iћіэхххЃGЖNB„‡‡;vЬh4FFF>ѕдSцчЭ›TPPpрР>јР^-ЅЅЅGŽ™>}Кх*ЧХХ}§ѕзіжнReeхІM›юКы.{[ЯКЭFЃёвЅK–й"##O:嘏Хй›щbv Ў"9Ё­лќНБYœйл›ЉujAЛр|ЏkЕў И–иA233…ЅЅЅ’$§ју’$•——{{{чххЩy:дЇOљЕС`ШЮЮ~§ѕз_zщЅАААЊЊЊФФФW_}533SЅRI’4|ј№Я?џ|љђхIII™™™jЕк^ЅЅЅ;wоДiг7фtыKGэкЕЋќкd2uъдЩ\р—_~ЉVЋmж’““ЃT*•žžЎзыmЎЛy›шt:NчххеЕkзŸўYN—зQ~-Џšu›ЯŸ?яххe]ЃFЃqцёHnxюУљаЁ0 NЅRiЕZ!„ЏЏouuЕ"??ПІІ&**JЏзыѕњбЃG—””Ш™‡š–––––6|ј№9r$--mиАaцвfЯžНqуЦ7ZошkГ@­VЛcЧŽЭ›7‡„„ :єрСƒж)BˆѕызGDDјћћ1ЂЌЌL.А   SЇNПњеЏфЗaaaіj ЌЋЋk№МЂќќќ   ›ыnо&FЃбh4šLІ‡~иrўЖы6ыtККККŠŠ Ыl7nмаыѕ§jкКНЗFŒ NPPЗЗwnnЎЇ•””фччЫ 6ьлoП=rфШ Aƒ† іЩ'Ÿœ?~рРцeЇM›Ж{їn•Je™hЏРёуЧџћпџ.,,œ2eЪЌYГЌSŒFcbbтЛяО[RRђЭ7ƒСP__ѕъUљ­ќ$›ЕјћћGGGoлЖЭrЗnн:jд(g6EчЮyф‘яОћNсууS[[[__/„(((0чiаfН^zіьYЫr222nП§vч6?p„:ЕZЗ`Сyњ4//oЯž=ђGУ† ћ№У{їю­RЉbccзЎ];hа ѓВцЋЏОњЧ?ўqгЏ\ЙђХ_TVV*•J­V[__oR]]]WWX]]НbХ Ы'NœИhбЂŠŠŠЂЂЂ—_~йAГ_}ѕе%K–lпОНЖЖЖЂЂbхЪ•лЗo_КtЉ3›ЂКК:555<<\Ђбh>љф“ъъъеЋWЫЌл,„?~ќЗп~kYЮО}ћЦзШяиа1*wѕ€ЛYЛv­RЉ зjЕ#GŽ`РI’фў”_[ош+4hа­Зоzгыъъ–-[жЅKF“’’Вiг&ы”.]К,YВ$&&ІoпО§њѕГ,pнКuзЎ]3 wп}ЗќЬ^{Э9rфŽ;VЎ\МwяоДД4љі`{ЊЊЊфџG :qтФІM›„^^^oОљцМyѓТУУcbbфœжmB$$$˜у$—Ж{їю™3g6њkVhMђCщuЮч<;ˆ=Лwя~ъЉЇвгглК!џkтФ‰Я<ѓŒЬ'''чффМђЪ+mн(Рc1< 1*ZЧРvKЇOŸюдЉг­Зоš››;uъдбЃGџх/iыFh @‡ТяQюЈИИxвЄIцŽ;юшпПџГЯ>лж-РYќ#ts0ŠVХuPРvx…‚г ИУ#мVccQ:Ї3”mнt,–ЇѕœВh€{}аfПhы†И@VV–BЁаќт;wюь ƒт›oО‰ѕїїИџўћЯ;зfы€&‘œажmlO˜G@л3‡Љ-w6/IRaaЁС`pa™ЕЕЕђŸcЩT*•Щdrп:УоН{ЇNš’’rп}їедд$''6ьШ‘#ђh]Лv­kзЎ.l0рўZcе3.Œ ДФЬjvvіŸўєЇ^Нz­_П^N)..ž>}КNЇ zђЩ'kkkџђ—ПЬ™3ЧМШИqуоyч!DyyybbbPPP@@@BBBUU•<5КfЭšАААјјјfЖmсТ…Ы—/—џкззїЩ'Ÿœ6mкВeЫфOћєщ3yђфO>љЄІІІ™эѓЈр^œ?-у мНЭбќўS^^О}ћі 6œ:ujњєщ[Зn‰‰‘?š7ožЏЏя•+WЪЪЪ&NœјђЫ/?јрƒƒ JNNіёё)**JKKлВe‹"))ЉЌЌ,''ЇSЇN3gЮ|ёХчЬ™S]]•••]__пœ–––9rdїюн–‰qqqsчЮ•__Кtiыж­ЏНіZbbтЬ™3чЬ™sћэЗ7ЇF pццщfjZа.8пыZ­юЃЭŽр– ЮЄђыЙsчо{яНлЗoЏЊЊВЬf2™МММrssхЗЛvэŠŒŒ”$iР€;wю”$)99yТ„ ’$•——{{{чххЩ9:дЇOŸЬЬL!Dqqqƒкхtн/>њш#9QЅRйЫ““ЃT*”“žžЎзы$ž;wюйgŸэюFЪя IDATбЃЧРПўњkgЖZAг:'cм…d'Lх<аNбuaу RWu›єєtЅRеЗo_Ы  EppАќЖgЯžзЎ]B<јрƒ[ЗnНїо{Зnн:{іl!D~~~MMMTT”Йm*•JЁRЉЌ+UЉTFЃбAЋd(--­ЋЋ+.. 4'цчч5X0444***<<ќиБc………Юn тЙОрю8ЫG;EзEЃ˜ЇP\Uрввв:uъ4vьишшшUЋV™C;ƒСP__Ÿ——'ПНpс‚ќ\ЂщгЇійgчЯŸ?x№рфЩ“…AAAоооЙЙЙFЃбh4–””фччЛЊ…BџшшшmлЖY&nнКuдЈQђkI’іэл7wюмЭ›7'$$фххMŸ>н…mм 1*hќЮpyhj)""тх—_ОpсТK/Н”––жЋWЏwп}WЁVЋ'MšДhбЂŠŠŠТТТ^xaЦŒBˆž={оzы­sчЮ3fŒПППœ3..nС‚%%%BˆМММ={іИЖ‘ЏОњъ’%KЖoп^[[[QQБrхЪэлЗ/]КTўєПўыПњєщsъдЉ]ЛvMŸ>]žШ<1*Z•хЯZЁ://ЏёуЧoлЖэТ… ƒ–пyчђђђnнКEFFоyчK–,‘гуттіьйg^|экЕJЅ2<<\ЋеŽ9ђЬ™3ЎmоШ‘#wьиБrхЪ€€€рррН{їІЅЅЩ<#„иМyѓйГg/^ткzЗе?сч(0“ЏЉ;гœЯ pOœРU8€лЂsЖ„ж˜Gх›8ƒ{}ю‚р.јTx+ Д_ЬЃ€ЛуL ЗвšІю€˜G-‚Г7Д!КšЩцbњUы F!l…ІФЅ­@‡FhъVZуїЈќ’ €3ВВВ …ц<№€œиЙsg„п|ѓMllЌПП@@Р§їпюм9Ч),˜љЁЉ;`€Г$I*,,4 .,ГЖЖVЉќпРDЅR™L&љ­3ьнЛwъдЉ)))їнw_MMMrrђАaУŽ9&„ИvэZзЎ]HPъVxЎ/hE#Еu{б^бЛк\vvіŸўєЇ^Нz­_П^N)..ž>}КNЇ zђЩ'kkkџђ—ПЬ™3ЧМШИqуоyч!DyyybbbPPP@@@BBBUU•<5КfЭšАААјјјfЖmсТ…Ы—/Ÿ6mšRЉєѕѕ}ђЩ'ЇM›Жlй2љг>}њLž<љ“O>ЉЉЉ1/"Yhfэp-bTv•——Пїо{#GŽ4hPAAСж­[.\(4oоbTpќ†IљwоyЇ9ЅЊЊъ–[nбh4mи*ГF=ŠУђyZ­vдЈQ7}tG‡.,,Œ•пЮž=;55ЕИИИщ+M’žžЎT*ЃЂЂњіэыууcљQAABЁ–піьйѓкЕkBˆ|pыж­Bˆ­[З>јрƒBˆќќќšššЈЈ(9Њ=ztII‰BЅRXWЊRЉŒПЇag ЌЋЋk0Hцчч5X0444***<<<''ЧСТнЃм…OaaсO?§$П§єгO]ћLŽ&лЛwя”)S~џћпчхх >|иАa—.]rАˆќ<“ЩTXXиЏ_ПйГg7ЊЦuыжݘ1УВДБcЧІІІ6­§э‘Ї^‹k1eк 8––жЉSЇБcЧFGGЏZЕЪк †њњњММ<љэ… фчMŸ>§ГЯ>;ўќСƒ'Ož,„ ђііЮЭЭ•ЃЪ’’’ќќ|6впп?::Zž›5лКuыЈQЃфз’$элЗoюмЙ!!!›7oNHHШЫЫkpo0м1*И—vwУЄќа‹UЋV †юнЛџ§їrКѕу1„ыж­{шЁ‡„uuuZ­іљчŸB\Мx1  ОО^ЁPФЧЧoмИQ.aУ† –ЁЭзЎ]лН{w??ПnнКНёЦ6Sо~ћэ=zЈеъ!C†dgg› ЬЯЯŸ0a‚FЃ‰ŒŒLNN–'lmжbяQіжн’JЅš5k–<крПЬSФжmоН{їˆ#,Ы>|јЎ]ЛšѕUЕжЁ)a*ац"""^~љх .МєвKiiiНzѕzїнw…jЕzвЄI‹-ЊЈЈ(,,|с…ф‹k={іМѕж[чЮ;fЬ9g\\м‚ фщгММ<—пgћъЋЏ.YВdћіэЕЕЕ+WЎмО}ћвЅKхOџыПў+!!ЁOŸ>ЇNкЕkзєщгм] Зв1ЊЛN\ЋКККЈЈшъеЋ>њЈљA61lиАДД4!ФёуЧ ƒќ:--mшаЁ:uBЬš5+55ЕЎЎ.77їшбЃ“&M2зb]`QQQRRвіэлЫЫЫ322Fm"„?vь˜бhŒŒŒ|ъЉЇЬЮ›7/((Ј  рР|№НZ?ŠУцК[ЊЌЌмДiг]wнeoыYЗйh4^Кt)""Т2[ddЄ?фУ:4uл‹2@‡ххх5~ќјmлЖ]Иpa№рСrт;яМS^^о­[ЗШШШ;яМsЩ’%rz\\мž={тттЬ‹Џ]ЛVЉT†‡‡kЕк‘#Gž9sЦЕЭ9rфŽ;VЎ\МwяоДД4љg„›7o>{іьтХ‹CBB\[/Z„3ьWqОзб?бЕг$33SQZZ*Iв?ў IRyyЙЗЗw^^žœчаЁC}њє‘_ †ьььз_§Ѕ—^ ЋЊЊJLL|ѕеW333U*•$IУ‡џќѓЯ—/_ž”””™™ЉVЋэXZZкЙsчM›6нИqCNЗNБtєшбЎ]ЛЪЏM&SЇNЬ~љх—jЕкf-999JЅВAQщщщzНоцК›З‰NЇгщt^^^]Лv§љчŸхtyхзђЊYЗљќљѓ^^^ж5j4ЇП–VефЎЫi €іЎЛнїњšKЅRiЕZ!„ЏЏЏќі!„:thZZZZZк№сУxфШ‘ДДДaУ†™K›={іЦ7nмhyЃЏЭЕZэŽ;6oо2tшаƒZЇ!жЏ_сяџџлЛѓИЈъ§ёуŸ˜‘%РZЎ€™–Rц.iзю5ћюз$Ўeїf^MБ2MŒ6ѕк"рM3гОšзОхїЁ|Гыі5— в4ХBLTPжa‘цїЧљ:ПЙГ93 Ьax=џ‚s>чsоч3g{ŸЯY:>ќЦR…EEEнКu“ў•ЎЕ›‹ѕWq˜.ЛОMЄЧЎЊЊЊІNjиkФ4fџІІІššУb•••іў4ђdЅзд…QфТ…љ1: лз:жOt@эt1л7XUUЅRЉЊЊЊLЫЏZЕjжЌY={іЌ­­}яНї,Xрыы[WWЇЏЇВВRЃбDGGлXЁNЇЋЏЏяНї"##M‡”••)•ЪC‡577gffJЕщnіЃHџJ§Ј–ц2`Р€uыжyюЙчЭ.ЛQ›шtК“'OыtКK—.yzz655щtК#GŽшЫ›.EЯž=ќёGУБŸ~њщиБcЭ.ОЫйВBЖэй Д)gэ*!Ёр|V^1dШ/ОјтЮ;яєіі:thjjъР Пg VЋП§ілџќЯџМe…ЛwяЎ­­U*•ІЙЙйtH}}}SSSPPP}}§š5k +Œ‹‹“^ѕQRRђц›oZ лњЋ8ЌЋЏЏ—>(„шбЃ‡Z­–ОnџСHLcBŒ;ірСƒ†ѕ:tшБЧГѓwщДУеQкrT@ЋАєzŒ~§њщt:щЫŸвп†7њJxїнwпВТІІІфффааPЕZžžОiг&г!ЁЁЁIII111QQQ}ћі5Ќp§њѕзЏ_ yф‘GЄwіZ лњЋ8ЬЊЋЋ“О|ђфЩM›6 !<==зЎ];{іьоН{ЧФФH%McB$$$ш_у$е–‘‘1eЪЛYrхХyp*WяPн“‚–E[’ž>Вe­ГН$р6и@\(##cоМyчЮsu џ_\\мТ… Ѕd>--этХ‹)))ЎЪxўДwфЈаю‘šЗAŽ эЉ)€ŽЧЗDŽ юŒ<Д/mё^_.qрЎ8Ъœ‹~ThЏєЙ•ЮRђаОЃ@ЛgKВ а.Ѓ€ћ Yэ9*И!nёэT[М3 [Ѓ ]тЙР-‘Ѓм_NNNЇNZ^OnnnppАcuЦХХ:tHњ;--mётХ-їг9*—И­!++kшаЁ~~~;wюлЗяз_нкsМѓЮ;‹‹‹˜№Ф‰ХХХC‡•ў9sц–-[JKKю€~T@ЛдиијјуЧЧЧkЕкВВВѕызЖіžv§њѕёёёњНННЧŒГeЫgФ€[!GШ…снГ999jЕZ?№§їп ;zєЈT ??ПАА0!!AЅRyzz8pШ!fkаKOO ымЙѓœ9s„ЉЉЉaaaООО]Лv]НzЕЂЂЂbњєщўўўSЇN•*ќ№У{ѕъ5}њtгћ{MыЌЎЎNLL  LHHЈЋЋBddd >мpТaУ†эйГЧљ@;GŽ Лњњњ’’’kзЎЭš5ых—_–ішбЃWЏ^ёёё_}ѕеѕызmЉф№сУчЯŸПpсТЉSЇRRRJJJцЮЛcЧŽъъъьььииX!DBBBmmэЅK—JJJ^xсiТœœœммм7оВN!ФмЙsЕZэХ‹Џ\ЙRTTД|љr­V{љђхˆˆУi###OŸ>э”іРЃфNЇгЭŸ?пггѓЩ'ŸјРzсттт•+WўілoB­VћбG=јрƒVjP(III555%%%Ы—/ŸsцЬрСƒ}}}яМѓЮ’’’7ZЉСЫЫkа AwмqЧ=їмГhбЂІІІфффааPЕZžžОiг&!DZZšЇЇgЏ^НBBB>њш#ы1˜ж)„HMMU*•Н{їжh4#FŒ8{іЌ"!!сѓЯ?зOXWW—‘‘1eЪЧ 7І D[’^˜aЫZg{IРmАИЗИИИ… :T‘––vётEщ=РnLЁр4€›уин8x MБVАРА–ш8vЗžG­‚S1€ШQrAŽ Дc999:urb…ЙЙЙСССіЮ.''G­Vыџ‹‹;tш"--mётХN nшИrrr …њІЇžzъЮ;я,..nI'Nœ(..–о 3sцЬ-[Ж”––:)^ўє€7Ѓtu\ЩллЛЊЊЪ‰Ў_П>>>^_љ˜1cЖlйђТ /8qк†сйП•'K­$ fGё*РКЖшGхаЊоџ§АААЃGJCж­[ючч7hа мм\}ЩдддАА0__пЎ]ЛЎ^НкД*УЛyЋЋЋƒƒƒъъъ K–””ќўїПWЋе‘‘‘п~ћ­~xFFЦ№сУѕџ6lЯž=Ю[VЎЁИЩемїњэ[}}}IIЩЕkзfЭšѕђЫ/K{їю••Ѕеj###чЭ›' ,))™;wюŽ;ЊЋЋГГГccc­зс›|BЪЉrrrzїю]QQЁбhNŸ>=lи0Ѓ‡?ГВВЦwэк5!DeeehhhZZк„ ЄWI“ћћћK…7lиpп}їн{яНЕЕЕ555ўўў—.]ъж­›тФ‰“'OоГg4іЦўўўyyyнЛwBdddLœ8БЊЊъвЅKwнuWccЃ>€ьььTVVЖY›Дkіn €|Аc‡Kp’ —уфЖ5№<*аОy{{k4!„O}}Н4pУ† )))RjЊпj4š;wЎZЕъ…^ˆŽŽ~яНїnЛэ6ooo­VЋЏ-''GњЃАААЁЁЁOŸ>вП:Юлл[_ЌЈЈHЁPH Њтілo—ў№їїojjЊЉЉёёё‘†TVVДЪ’ƒуœHьhœyЏЏ•{ЋИч h3Z­611ёу?.//?pр€a3vьиН{їO˜0aЦŒV* VЉTWЏ^еjЕZ­ЖМММААP?6$$DЇгхччKџ^КtIњ#  gЯžчЯŸз—ЬЮЮŽŽŽvцтŽВхfTrѕ/ш xp7ѕѕѕMMMAAAѕѕѕkжЌб/((иН{wmm­RЉдh4ЭЭЭV*ёѓѓ›4iвK/НT^^.„ШЯЯпЗoŸсипџўї‹-ЊЉЉ)..NNNж;vьСƒѕџ:tшБЧsцтRY@+q~ŽЪЅYРЕBCC“’’bbbЂЂЂњіэЋодд”œœЊVЋггг7mкdНžддTЅRйЛwoF3bФˆГgЯŽMOO/)) џќsщяКККŒŒŒ)SІ8oсИ‡rШ Ћ"р–œљ 9O у–XI:‚ИИИ… :4--этХ‹)))ЎŽЈн`Ќ(ьљ>*ы-€Ž‰}`k GE›b%Ќ`A{Фz  #cиx фЈЙрћЈhпєKqурШQб.ё}]Р-‘ЃЂ=!5мЯЃК­ИИИC‡IЇЅЅ-^МиЕёД„т&Wd„sР-uє5''ЇSЇN†џЊеj{kP(jЕкЯЯ/&&цєщгЮŽбЬ c6ыФ‰ХХХC‡•ў9sц–-[JKK[;6ЇГ=5UXfя$”ЇМЪtL=Gu ooяЊЊЊŠŠŠиииgŸ}жhlccЃчecmызЏ7Œpܘ1[Жlqb$mCЇгЕ№eH–&З”Pžђr(аa‘ЃZГnнК№№p??ПAƒхццJSSSУТТ|}}ЛvэКzѕj}aOOЯI“&egg‹›]~јaЏ^НІOŸ^ZZњџёўўўССС/ОјЂ”gJeвггУТТ:wюмpY† ЖgЯžжoГVЁЛЩ–2F(OљіX У"GЕІwяоYYYZ­622rоМyBˆ’’’ЙsчюиБЃКК:;;;66V_ИББqыж­QQQвПѕѕѕ999ЙЙЙ7nœ={ЖJЅ*((8wюмбЃGп|ѓM}™У‡Ÿ?ўТ… ЇNJIIBЬ;WЋе^МxёЪ•+EEEЫ—/7Њэ›oО‘znЋЊЊТТТІL™ђеW_ежж !Ў_Пўнwп5ъђхЫ†Ыйї!З6ЮьїFŽ*ъъъnъпППсЈииилnЛMЅRН№Т ЧBxyyЉTЊьььЊЊЊ€€€шшh} ССС‡^П~Н4­NЇ{эЕзT*Uccуз_§Ю;яјњњ†„„,[ЖLЯ­NЇKIIёёё YКtщж­[kjj>ћьГ5kжh4??П%K–lпОнА6oooЃјУУУяЛяО]Лv !Жmліиc !<==}|| ‹i4­Vл ш$Ћ€["Gооок›ВВВ GmиА!""ЂsчЮУ‡Пqу†BЃбьмЙsѓцЭ=zєо–ЫЬЬ|т‰'ђђђ<<ўяКC\\мТ… ‡*„HKKЛxёЂєо`зb%Ќ`A{dщѓП–Аоp'Л[9ЊЫ87G5kVзЎ]WЎ\щ”кZ+ `к#rTЧюжРНОэ^II‰ЏЏяЉSЇцЯŸяъXŽЮKЃ\/@юшGE›b%Ќ`;Q(œyŽђФБЛ5а ‹vЃ*nru р­КOco к5љцЈЄІм[kьпЄ:йsш инnIv9*Љ)ЗЇХЙћ:}m<ык/ЅЋј?ЖœЈY*cщlŒђђ,@Ёгщє}žNI)IP€{pe?ЊТ@ ы1;\nЙхrbo* *pЎьG5<—ВхЭs/{'Ё|k—Їs0ф”оTTШ+$Р1ry•O{ш˜Zи›J‚ м,јйяBIDATŒ\žGеkЅW‰€lщ{SэE‚ €Й8—\њQMбГ  уhЩОŽ§$p'ВыG5Хщ€ŽРБgSйCшШиТхX [ƒ|ћQ УВ~ЫЗј7FŽ rd)Mх‰роШQ@^ЌМ:ŽИ=rTГi*ЗјЂ}с’ Р1фЈ GFi* *эзщZЂМз:ыЗјrЬю~T€\а razЏQЏ)7њ€!Л>(  Н dЪєTnєnфШ(A%M9*ШŽйЗј’І€Ž€фХЪgfHSбŽ№” Р1фЈ #Зќ*i*ђЧuК– GЙИe‚j4–4ИrTTЃ2ЄЉРЭЃ€ый• •$Mаaq;%р–”ЎЇд€!T}yiZОbм§ЈрJ'ЈFSqщИњQбІ,…г „ŽЉ… Њ~ZzS€л ВР‰5: Ї$ЈF5а› љ`m8†\Р‰ ЊQ=$И‡у–pўНОќ`гT}mмє к;њQР5Z#”ъ$Aэ—3ћQ9+[Дъо’]1€ŽƒлFЗD?*@.к"Gх U€-шGШ9*dЮvp3<%p 9*8зщZ‚ фЈЙ G@ЛФэ”€["GШE[фЈ\ти‚~T€\ЃBшl7У‡ЏŽ!Ggт:]KЃф‚ фЈh—ИpKфЈЙh‹•K\[а  rTШэрfј№5Р1фЈрL\Їk rT€\ЃBИдьХљр–ШQrЁрњ@&шGШ9*@.ШQrAŽ  rT€\Ѓф‚ фЈЙ GШ9*@.ШQrAŽ  rT€\Ѓф‚ фЈЙ GШ9*@.ШQrAŽ  rT€\Ѓф‚ фЈЙ GШ9*@.ШQrAŽ  rT€\Ѓф‚ фЈЙ GШ9*@.ШQrAŽ  rT€\Ѓф‚ фЈЙ GШ9*@.ШQrAŽ  rT€\Ѓф‚ фЈЙ GШ9*@.ШQrAŽ  rT€\Ѓф‚ фЈЙ GШ9*@.ШQrAŽ  rT€\Ѓф‚ фЈЙ GШ9*@.ШQrAŽ  rT€\Ѓф‚юOЋеЎZЕjфШ‘]КtёђђђёёщеЋзˆ#цЯŸџѕз_пИqУеТиŠ+ …BЁ0. \Бb…KЂjЇ80~ќјЎ]ЛЊT*Г­к^Xљѕлћ6оЎWlYЏ0сяяпЗoпyѓцхццК::€­ШQсц<5ўќ§ћї644джж^ЙrхРЋV­zт‰'6nмшъжВ{їюQЃFэкЕыњѕыЎЇUАУŠŠŠŠŸ~њiЭš5ббб;vьpu8­Ыве=Дh=фЈpgПўњыИqуЎ_ПђілoŸ:uЊЄЄфњѕы?ўјcZZZ\\œJЅruŒ@+JNNnnnџюЛяДZmeeeeeЅЋƒr&Жq˜zѕеW+oњэЗпRSSƒ‚‚ЊЋЋЇM›vўќyWGИ5ЅЋZбŠ+ЊЋЋПџўћлoП]?<44єўћяійg ЪЫЫ] ьЃгщ\B;sђфI!D||ќ Aƒ\KЋ`‡)///ЕZ-§­VЋ 0pрРкккеЋWЇІІК6<Р-б wЖwя^!ФгO?mxђjЈ[ЗnQQQmа†ЊЋЋ…~~~ЎЄЕДх6ўЩ'ŸTUU9Ѕ*ДБў§ћ?іиcBˆ}ћіЙ:Р­‘ЃТ !‚ƒƒэ№мЙsЯ=ї\TT”Яя~їЛФФФ_~љХlсњњњwп}їОћюѓіііѓѓ‹‰‰IKKknn6ћЄŠ•ї‹XВХі gёщЇŸ>ќ№У~~~ООО§њѕ[ЛvmSS“ЅЅўх—_^|ёХшшhЕZ­RЉBCCGѕж[oЖЄ}ЌАдt–Ъ[jН+WЎЌYГ&...,,Ьлл[­VGEE=џќѓ999fыЉЋЋ{ы­ЗЂЃЃЅљ>єаCќБNЇЛхЛšš››ггг дЙsg…BёњыЏ;€a…|№AП~§:uъЄбhЦŽћу?JešššўўїПKЃќ§§Ч—••eCЃўл,ЄП_}ѕUУЗШHu:н–-[}єб   OOЯ   бЃGўљчf;ЋoйVил8vqxwРŸўєЇ.]КL›6mяоНVжR'ВБщЪЪЪ:uъЄP(оyчГѕ466vщвEЁPќх/БЗrЛиОУБkюUUU)))?ќpPPRЉєѕѕНѓЮ;ЧПfЭля]ялЗЏтъеЋњ!З\ЋоFвввшчччээнЗoпеЋW744X Ь}Лй€ ХЋЏОjXRяђхЫžžž …тџј‡й***ќќќ Errђ-[в–НAыCE›FmYхЌ4ј-Z€-t€ћъвЅ‹b№рСvMѕж[o)•fnƒWЉT›6m2*\QQё№У›ž0aТВeЫLЗ2iШoМa:п7оxУвViWHвЈхЫ—OŸ>нt’Щ“'лЕдBˆЅK—:Œі6•жыйГЇйШ}||Оњъ+ЃТeee>ј iсЇžzЪњ|—.]:~ќxГ-cWњ —-[6aТгIОџўћкккбЃGђѕѕ§ўћяml^Гёш—юЦRЗ’ЉЧМККкоАТоЦБОDFПОcлИcєЗ !zєшёђЫ/џќѓЯNЉйьЂщьiК?ўёBˆО}ћš­їюнв„Чw r[‚Зw‡cћмЏ^Нzз]w™-,„8zєЈ--Љгщ–,Y"еoTивZэи6bvЃB 2ЄЊЊЪ4*іэ–ЖдDBN7fЬ!Ф#}zfffqqё?ќ0yђd!DЏ^НLW\э I*цссБ`С‚3gЮ”””9rdрРвЈџўяџ6šХкЕkЅQQQQ›6mЪЭЭ-++ЫЩЩйЖmлФ‰ ЃЕ7+ьm:+­Л|љђ§ћї_О|YЋецххэиБЃџўBFsљђeУТ'N”ъyц™g~ќёЧ’’’ЌЌЌ?§щORЃY™Џ”%&&fff–––ž;w.33гєіьйSЅRНёЦ.\(,,мИqЃbР€/Нє’——WrrВ~TЇN„ДБy _dј ™ЪЪJNЇO'ІL™ђУ?H/ œ5k–Н-`…Нc‰й_пmмaUUU›7o=zДЇЇЇўdєXЛvmQQQKjnљŠ§ЯўSЊфЬ™3ІѕK­сXхЖoзЧЎЙKС{xx,^МјфЩ“ЅЅЅEEE'OžLKK9rфБcЧliINїФO!юКы.ЃТ–жjЧЖiп5mк4iŸ–™™9uъTiдŒ3Œ&qlпn)рЪЪJ}З^хПгщtлЗo—F§њыЏІ#ЭqєшбІЃLYЃЕЁКж?ŒкИЪYop-DŽ wіыЏПњћћыЯ&CCCутт–.]њЭ7п˜^зщtR&№ц›oЊЏЏ:tЈЂ_П~њ'Nœjž3gŽQљйГgычk8моƒЋН!щ .юОџўћ†У‹‹‹5тЉЇž2~љђe///aљJCCƒУСXт@гщЌЖžЉššщAФ%K–ш9rDЊфХ_4*?wю\ыѓBМікkЖЬкJFnиАСpјЪ•+ЅсF—іѕ7ЖeggлƒйћўћяЅс FхgЭš%2J>k+Ќ4Ž%f—Хоmм)ђѓѓп}ї]щоQ‰JЅ?~ќŽ;ъъъЈАх+vmmm@@€bётХFхЋЊЊЄ’—-[цXхЖoћЧоЙ s ž•`L[ђьйГвž sK+kuKЖг}ZBB‚4*++K?А%ћvK›Ё•^ФКККлnЛЭь/ЋПйUКљ–Ќ„бЧP]ыFm_хЌ48€bЛ‚›;sцŒйћˆ:wюќ—ПќЅИИиА№вЅK…MMMІU1бВеоєГИыЎЛš››ЪK]ˆЗп~ЛсРХ‹ !<==/^Мh:‹c‰MЇГѓT^wsбzш!§?џљЯBЕZmzЉ[z"ЫЪ|ƒƒƒэЭ@L0Ќ022вhјйГgo9ъГЯ>Г=Г-6gЮ!„OYY™Qљ’’щdюљчŸ7­ЧАТRуXbщзЗkwЎŸ~њiС‚=zєаЯ4((hЮœ9F7 оRЫWlнЭD(<<мhУпВe‹TNNŽУ•п2xлw8іЮ]К‚Ж`Слƒ1lЩ’’’­[ЗvыжMЁT*њщ'ЃТfзj‡ЗыћДЙsчъ:МoЗВZO™^|ёE!DXX˜б“’’„555f'4b%Œ68†ъZџ0jћ*GŽ До™7wЯ=ї9rфшбЃ ,ˆ‰‰‘Ю-„kзЎэпППс+:О§і[!ФЈQЃЊЋЋЋLєщгG*ІПє{ј№a!ФШ‘# {r$#FŒhyќі†Єkњц†оН{ !Ў_Пn:‹aУ†Yz3jЫƒ1хєІ;x№рєщг#""дjЕўХoОљІТ№•R?ъШ‘# Ÿ-”h4ыѓ•Ю]Z€!гйнqЧв#GŽД4ЪшчsРwп}'ЭBъy3$E%§@FЌЗ€4ŽэькЦ+::њэЗпЮЫЫлЛwяєщгеjuiiщКuы~јсШШШ={іД|Ж7tOщЅK—ЄпWOЪQzш!гGьœјЛиОУБwюїпПb§њѕлЗoЗђц!C†/ ЛэЖл&Ož\PP RЉвггЃЃЃM#7]ЋоFЌяг š–ьлл Ÿyц!D^^žсЫ›››7oо,„ˆзo;Ж0† ЁDхР*РщШQб!<єаCoП§іБcЧ*++333“““Ѕ7vфххIЯНHВГГ…ыж­г˜*+**’ўјэЗп„–ОlЁ?ђЕ„Н!щI§F|}}…555†/\И n•[)SЮmКПўѕЏУ‡пМyѓЏПўzуЦ ЃБ†ŸЧ”цiЖы)бg‰- РPзЎ]†шЯЅgНЬŽ2њљpщв%aЙ‘яОћn!D^^žщ(+-`…cc/ЗqKLЯ\mџЬŒ‡‡GllьІM›Ў_Пž’’"нSњЫ/П?~М%K$ьlК!C†„‡‡ !>ћь3§РЂЂЂoОљFмЬ`Ўќ–lпси;ї•+WzyyiЕкI“&…„„Œ?ўwоБ§зžžžwмqЧьйГѕ1ЛV;МXпЇIћ‰УЛSЧ6C!ФНїо+=$ќЩ'Ÿшўы_џК|љВТlуXa6 CˆЊ…ЋЇ GEЧЂT*ћїяŸ””tюм9ЉЋъФ‰ЧŽ“ЦкxZV[[+§!ХšіШI, З‹Н!щОжХКŠŠ !„єфX+cЪ‰MЗyѓfщO111[Зn=wю\qqБєтŠW^yEaјѕ щlивїB­ЯW:сna†ЌќFVFщЌОOвЖ4ОйOzXj+n‡YпЦ-1{ђjћL+**6lи—””$uМЈT*§_coг) )џт‹/є?лЖmkllT*•“&MjIхЗdћЧоЙ5ъиБcјУМММЪЫЫwэкЕpсТx OŸ>_§Ейњѕ/ ЋЊЊjhhШЭЭ]П~§НїоkЖАйЕксmФіIо:АъI]Љ_~љЅДл7ѓе{юЙgР€vUe6 CˆЪU€г™џдрідjѕъеЋЅЗždff>єаCBooяЦЦЦЄЄ$[О'UR^^nЉПХі~IccЃщ@{Cr€FЃ)++Гх3ƒN Ц‰M—––&„ˆŒŒ8}њєјјј~ЕеІ›:uъ›oОYZZКgЯщЛ вОcЦŒ1 ЦЕ+­НsязЏп—_~Y]]}ќјёЃGюнЛїаЁCйййO<ёФіэлŸzъ)Ѓђ^^^-LoоFlŸЄ іэІž~њщyѓцUWWoпО}іьй_~љЅАПезC…ѓЃіЎrœŽ~Tt\њћ‹ЊЋЋЅ?ЄчЕЄ{_m!=Р)нGdъмЙsІЅ;6ЭоќVPP`:ао№Лп§NqђфЩ[–tb04%?§є“bќјёІG§ќѓЯFCЄ›!-=kwўќyлчыXr 5‚ЅF–†KeZЮЕcК[bі… VЪ9rфЙчžыж­лO<ёХ_джжіьйѓх—_>{іь‰'^xс…&ЈТЁІЛћюЛћѕы'nІІ.\:Moєuэятим}}}GŒ‘””Дџў3gЮHЏЊвПДЦЙоFЌяг Ÿљoƒ}ЛЉЮ;Kљ•д}КmлЖššЅRiК†8І ŽЁЂ ЃmЙЪ0BŽŠŽKџhPїюнЅ?F-„ШШШАёж Сƒ !іэлЇПoJOЋеюпПпtщDг—ИшtК§ы_Іхэ Щ>њЈтрСƒв#XV81šЮ’КК:!„щЧй‹‹‹ _ "yф‘GЄљšvЅVUU™–wzr 5ўў§ћMЧВВ2ЉёЅ†j9з6Žщ6оBПќђЫkЏНvз]w=ђШ#ыж­+))ёѓѓ›6mкоН{/]К”’’тЌ'ш„ЃM'%ЛvэЊЌЌмКuЋBЃбHŸmyхЮвђЙїщгgкДiТбыJЗф№6b}Ÿf8IkьлЅgЁ…е[ЕЅл}ПћюЛœœ)S7nœщ№ŽiƒcЈpбaдь*gKƒp 9*мй3Я щ_:‘mЙжn{Зё–8p`ddфoМ‘››ЋP(FŒёЩ'Ÿ\ЛvэгO?ѕ№pђёдБІ‹їєєЌЉЉйЙsЇд›:aТ§7љ$''ЇЌЌ,??џШ‘#ЋV­zф‘GКvэjX~Ъ”)RљщгЇџју%%%™™™в@§S ЫяоН[8hа cЧŽ•––ўќѓЯћлп<<<єwŽ-…Н!I…mџvœNЇ[Гf4ќž{юљєгOћэЗВВВ .lлЖэЩ'Ÿ4ЌЪо`ЌАЗщ,-šєq?!D||ќ™3gJKK;&uIЗ1е3aТi`BBТЉSЇJKKOž<)n†……й>_‡А^ЁcЃ,Б4ЩŒ3єŸ••eијBˆgžyІхГ–8а8v-‹Аw˜T[dddrrr^^žSъ4ЌЙ…+Жžtg„ўЖвoОљЦДLkџ.K;ЛцЎP(}єбuыжeee–––fffЮ;зьkзŠjНАcлˆє6i§$YYYвu1!ФŒ3Œ&qтО]"нD-„HHHИrхJ}}}CCCCCƒQБ””qSHHH}}Н-Эec­} еЕўaдіUЮЦрrTИГЮ; Ы Хœ9sІJOOЗђ™И^НzЎЈЈxјс‡M‹§ё\Жl™йƒхєщгMЫЯœ9sљђхfЫл’4аЎSFi”Ѕ7s.]Кдс`Ќp щЬ.ZEE…щ7…ГfЭ2ЛМЅЅЅв3{F&NœјњыЏ !<==m™ЏУXЏаБQ–XšфЦcЦŒ1ћ >ўјуеее-ŸЕФЦБО,+VЌ0ши6ю˜чž{юиБcNЉЪˆйEsИщ6mкЄ/м­[ЗІІ&г2Nџ]ькси5w+ПяШ‘#ЋЊЊl ЦЎШuŽn#Ы–-ћУў`:ЩрСƒB•8kпЎ'нзjФЈLAAўFkЎрм2Œж>†ъZљ0jЉŒ0ЗЪйврРНОpg………Лwя^А`С№сУ{єшсээ­RЉnЛэЖЮ›7/++ыЃ>2MЬrss_}ѕе˜˜˜   OOOЕZѕєгOoиАсєщг†…5Эоyчшшh•Jхууѓрƒ~јс‡;vьАtяпЦпџ§~§њљјјјјјФФФ|њщЇ7nT(–ФЎѓЪ+Џœ:ujЮœ9‘‘‘оооJЅВK—.ЃFzїнwŸўљжЦІГTЯџўяџўэoЛуŽ;”JЅFЃ2dШцЭ›?ўјcГх9ВrхЪЛяО[šя€RSSЗmл&НYЧzкгђфРззWz!mlll`` ‡‡G```llьж­[wэкezkЈУœе8њЧНŒоВуи6ю˜?ќ0&&Ц)UВДh7н„ єп‰7Л5ЙvЅЕkюЧŽ[КtщЃ>кГgO/////ЏюнЛЧХХmнКѕлoПЕєЉ–slё№№иБcЧ|№Рјјјxyyнwп}яНїоО}ћЬ†ъє}ћ—_~ЙtщвћяП_­V[:ІtэкuмИqвпNМбWЏЕЁЂ•Ѓv­rЖ48(t-ўдГVЌXёъЋЏ g|аmуЩ'ŸмЙsgttДў.Ш„VЋ BЄІІ&&&К:grуEыPЄќф7о>ё*sO?§єЖmлxр~јСеБXФ1шШшG!„ЈЎЎ–о љрƒК:гПIњŒ„;qуEƒ<•••}ѕеWЂu:QР)ШQt,•••f_эИhб"щЫO?§t›…[јђЫ/…*•Ъ§Ў ИёЂAžвввjkk}}}ѕYTp:уЏ“€{ЫЬЬœ={vbbblllxxxCCУщгЇпџ§ЏПўZ1|јpщЕЈƒЊЊ*­VЛsчЮwп}W1aТ„€€WхnМhЇЦЦЦІІІ}ћі%'' !ž}іYWц‘Ѓшp.\ИАpсBгс§ћїџќѓЯyя…|h4§псссяНїž ƒq.7^4Ш“JЅвџнН{wщQO'юѕаБєызoеЊUqqqссс:uR*•ЁЁЁ>њhzzњБcЧКvэъъёo|||ЂЂЂ,X№У?єшбУес8“/dKЃбФХХ8p ((ШеБ€EМз єЃф‚ фЈЙ GШ9*@.ШQrAŽ  rT€\Ѓф‚ фЈЙ GШ9*@.ўІN?nЛн™РIENDЎB`‚icedtea-web-1.8/plugin/docs/PaxHeaders.7406/OverallArchitecture.png0000644000000000000000000000013213441742745022126 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.236253483 30 ctime=1552410887.042183609 icedtea-web-1.8/plugin/docs/OverallArchitecture.png0000644000175000002070000027403013441742745022744 0ustar00jvanekmock00000000000000‰PNG  IHDRG<Ѓф?TsBITлсOр IDATxœьн{@Tео№ёŠЈр… E3ЭP3УK‚fЧу­TдN’Љ:OІiWэd^’дВѓjyy*ёšhGSSeiІž|žRдQМ›^Qfц§cНэ3ЭРАчТ†СячЏЭš5{]fя=‹п^ГЖŸеj€0•uŸсччWжUˆъЎ А €2GT|€ŸŸŸštHT| Q]eC›l=ш. !Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ \рW<#ЋqсТЧBд­є*Љv[ЗnнТТBЧє .Y=“Щ~п}їЅЇЇз йь 2F‘1:<|ј№"_§љчŸ?wућЇ8уЦѓїїпН{wYWОЭЯjЕ–uп ОЈ8eМ…ё•Kш.”ЉЉЉjcбЂE"’’’ЄR.\hX5.\И)|XDš6mjdЙ_}ѕUЇNFŽ™‘‘Ё'йЈE?~ќДiгВВВzѕъUжuбЦЌРрЉЎ]ЛnкДщиБc.Н+::zкДi"ВbХ ЯГЬппПiгІ‡tEфэЗп‘ЇŸ~крrНhфШ‘ђ{CїеЅ%777--­YГfaaaСССЭš5;vl^^žmž'NŒ5ЊI“&!!!UЋVэиБувЅKэіc6›gЭšеМyѓрррКuыІЅЅ]НzеУК•XЎйl^Иpaџў§cccƒ‚‚BCC›5k6~ќј"Wh9rЄХb™7ožЋеhгІˆфццz%[‘Š\Xж1бbБМїо{Њ“ыеЋ7fܘММ<Ч•sГГГѕ,UЌ^:wюм”)SbbbcbbfЭšхF§mххх­_ПОI“&­ZЕr{':?йФФD???лљзЪ‰'L&STT”ZIйЅуD‰MHHјц›o8рv+p›#Њ JХњѕы[Дh1kжЌkзЎѕшбЃwяоўўўщщщѓчЯзђlоМљЎЛюš={ЖЩdълЗoЧŽїюн›’’2vьXл]=љф“iiiЧябЃG›6mцЮ;pр@OъІЇм_§ѕ‰'žXЛvmэкЕћѕызГgЯ›7oN›6­uыжŽбе.]КФХХ}єбGvЯL+‘ OWЊTЩ+й<ёЬ3Я<їмs999ЩЩЩэкЕЫШШјЫ_ўт˜-<<|шаЁC‡MII)qŸiii3gЮlлЖmbbтБcЧвввд*ЗnЫЪЪВX,нЛwїd':?й!C†ˆHffІнл333­VыРєяЭЮC=$"ЋV­ђЄ!И­YшУ)р]ŒЏ\BwЁR‡хљѓч‹|5''G=зkжЌYfГYKпО}ћЇŸ~ЊЖOœ8n2™цЮЋe8yђd\\œˆlмИQЅЌ[ЗNDЂЂЂŽ=ЊR>Ќ­‘ъF u–{љђхЙsчцччky,Ы3Я<#"ƒ r,%==]DVЎ\Y\щEжgвЄI"’˜˜шjЖ›щ<ƒ]т–-[DЄFййй*хшбЃQQQN:љќљѓN^U/ХЧЧ_МxQЅМёЦ"’P\=ѕxєбGEфу?жџЧцыќd/\И~уЦ лоsЯ="ВcЧ—іfgэкЕ"вЕkW§ Ќ6уЦ€^ ЃМ‹ё•Kш.”CЮƒ‰Я>ћЌˆЄІІ:йCZZšˆ >м.]­лЗo_ѕч#<""гЇOЗЭ3eЪЗЃК:Ы-вЁC‡DЄN:ŽЅœ?>((Ј[ЗnХ•n›bБXЮœ9ѓілoŠШђхЫ]ЭVb3gАKTo'Ožl›G-цыITW‹р[­жуЧ‹H```aaaqU-‘ŠМџ§їњпRbџ(ŽŸЌеjэйГЇˆ|ійgZЪСƒEфŽ;юpcoЖŽ9""5kждбр?Д“.@МmУ† "2tшP'yжЏ_/"ƒЖKoлЖ­ˆьмЙS§Йkз.y№Сmѓ$%%НєвKюеMgЙЪž={ЖlйrьиБkзЎY­ж‚‚)rЩдš5kіыз/333'''&&ІИв###mџ œ6mšš‚ъF6oйБc‡ˆ$''л&vэкеУнЊ.Uъж­+"ЗnнК|љrЕjемлсЩ“'EЄV­ZVLє}ВC† љќѓЯ333ћєщЃR–,Y"E<њЅvэк*CAAAPPчЭСэ†Ј.№>51ГqуЦNђЈUGэТЕm*шйГgEЄN:ЖЏЊЁ{t–{ѕъеСƒЏYГЦ1Я­[ЗŠ|яSO=ЕdЩ’yѓцMž<ЙИвSRR‚‚‚L&S•*Uтуу{ѕъUd[tfѓ–3gЮˆHНzѕlэњм ссскЖПППкpuщa[зЏ_У њ?й^Нz………­]ЛіъеЋЁЁЁђћ2ЛjЩ]Wїf+88Xm\ЛvЈ.м@T”ЅjЎ"љљљ•IЙ/Нєвš5kbccпyчŽ;FDDјљљ={VЭВ,RЇNš4iђбGЉ5d‹4{іlmQ`'tfsі;nŸrѕъU5V­Ѕ&“IKдџЩVЎ\ЙOŸ>ќёкЕkSRR~јс‡ььь{яНЗI“&nьЭ– OЋ"tЖАETx_ttєЁC‡>\П~}'y<8aТ„јјx'ЛЊ]ЛvnnющгЇmЇŽž:uЪ“Кщ)wйВe"Вxёт:h‰ЇOŸvОѓ‘#GО№Т YYYnWЯыќ§§ЭfГХbбR~ћэ7Л<Њ“Ož<щ­N.%ѕыз?x№р™3g4h 'џЕkзд†šiЋИєЩ2фу?ЮЬЬLIIqœЈыъо4jrtdd$uсSЩY\дН{wYИpa‰yV­Zх|WэкЕ‘­[Зк&nоМйУК•XюХ‹EЄaУ†Ж‰ЋWЏvўЎЁC‡Э;зэъЙJMіМ|љrqЊWЏ."yyyZŠнкС"вО}{йИqЃmт—_~щХzzХнwп-"ъ‘eŽДе34‡‘кЕkлO]њd“’’ЂЂЂОјт‹K—.-]Кдd2Љ'ЫЙЗ7Эў§ћЕцn Њ Мoєшбaaa‹/ž9sІэ,бН{ї._О\ЫSЅJ•7п|SЭvдdee­\ЙR§љф“OŠHzzКZWDŽ9’žžюIнє”лДiSYА`–aЫ–-oП§ЖѓзЈQу‘G12кЂE YЛvmqZЗn-"Z 9??џеW_ЕЫ3|јp™1c†0ЭЩЩ™1cFiTи;w‘яОћЎШW[ЕjЕtщRлуэ§їп‡ЧОЙєЩ 0   рХ_hЗмА{Ч‰jB—.]œgŠучЛ ЉS 9qЪx у+—а](?RSSеЦЂE‹фї‡zЉЛ™ЙызЏ0`Р•+W6lиІMџььь}ћіM˜0aтФ‰*ЯЦћїяŸŸŸлКuыJ•*хххэнЛїЪ•+уЦ›:uЊЪ6lиА „……%%%Y­жM›6ЕlйrЧŽтєМP'ЮљѓчЈеSюŠ+њїя/"mлЖНѓЮ;;іэЗп>|оМyЖх:–ђеW_uъдImлІ;ЉЮjiЩ’%ƒшйГЇz:™нБfЭšоН{‹HЫ–-4hАsчЮоН{јс‡vЅŒ1bўќљ!!!III›6mъиБуКuыфЌjE‚ЁC‡jЏjEй W›цшфЩ“ббб7.rКЎкTTTЛvэЊTЉђяџћРЁЁЁпџНэj:?YЭЮ;е\fYА`жюэMIHHиГgЯў§ћ/иљЯxР @uђ”u-*ЦW.ЁЛP~8 78f>vьиsЯ=зДiгJ•*5mк4--эјёуЖyNœ81fܘЛюК+444  nнКнЛwŸ>}z^^ž–ЇААpЦŒёёё•*UЊSЇЮшбЃЕyЛ%VѕќљѓEОЊЇмЕkзоџ§!!!ЁЁЁ sчЮе~уяМ5г.нy}\ЭfkоМyqqqўўўХѕЩМyѓ7nPЏ^Нз^{­ААаБГйCеЧjЕž={vлЖm7nмhгІЭ–-[ТТТ\ЪfїAxђX їљЃG[Зn=zєhнКuэ^*,,2dШВeЫ‚‚‚###?ўнwп–v=/]КдЈQЃјјxѕlb|хК @i[ЕjеG}ДoпО3gЮЦХХ 0`єшбСССe]5џŸ6 Њ шХ0З'ЯŸQы =!EcjЈJёѓѓыж­л_|сЄtЧ”уЧ''':tшх—_~ы­З\ЪцЄ c˜Эfѕ$эqЦP9rdFF†уЋуЦ{ћэЗ;tшА|љђ:uъЈФгЇOO˜0С€щКуЧŸ6mZVVVЏ^НJЛ, Тc|хК е\Ц0З'ЂКЖЅ$%%mйВхШ‘#5*Ўє"ыГzѕъО}ћЦХХњшЃ7оx# Р…яPžЎTЉ’WВyт™gžЩШШ INN ЬШШиГgcЖ№№№ЁC‡ŠHAAAffІѓ}ІЅЅmкДЉK—.111[ЗnMKK‹ˆˆPowOVV–ХbщоН{‘ЏnлЖMD|№AЗїяЙ‡zhїюнЋV­zх•WЪАn_VњpЪріЄŽќѓчЯљjNNŽzЎзЌYГЬfГ–О}ћіO?§TmŸ8q"<<мd2Э;WЫpђфЩИИ8йИqЃJYЗnˆDEE=zTЅ>|X[mРъ,їђхЫsчЮЭЯЯзђX,–gžyFD фXJzzКˆЌ\ЙВИв‹ЌЯЄI“D$11беl%6гyЛФ-[ЖˆH5ВГГUЪбЃGЃЂЂœtђљѓчМЊ^ŠПxёЂJyу7D$!!ЁИzъёшЃŠШЧ\фЋЕjе‘шпЁѓVИšЭjЕЎ]ЛVDКvэЊПŠФјЪ%tаЦЌРpпŒ3Ў\Й’ššњмsЯ™LџљNщаЁУ AƒД<П§ілАaУFŒЁeЈ[ЗюфЩ“EdЮœ9*хУ?‘БcЧЦФФЈ”ЦП№Т žдMOЙaaa#FŒЈRЅŠ–ЧЯЯяљчŸ‘§ы_ŽЛ:thPPP‘№rdЕZЯž=;}њtы5j”'й<Їž$іТ /4iвDЅФФФxвЩЪkЏНЁЖŸxт йЗoŸйlv{‡џћПџ+"Z%э\КtIDТУУноПчš5k&"ћіэ+У:ИБР}6lчПЕ_П~Нˆ <и.НmлЖ"ВsчNѕчЎ]ЛФсgѕIII/Нє’{uгYЎВgЯž-[Ж;vькЕkVЋЕ  @DŠ\ZЗfЭš§њѕЫЬЬЬЩЩбаŽдCо4гІMSSPнШц-jE‹ффdлФЎ]ЛzИ[еЅJнКuEфж­[—/_ЎV­š{;|иЩ\ншшшƒN˜0!>>оЩЎjзЎ››{њєiЛiЄžдMOЙЫ–-‘Х‹wшаAK<}њДѓ9ђ…^ШЪЪrЛz^чяяo6›-‹–ђлoПйхQ|ђфIour)Љ_ПўСƒЯœ9г AЧWПњъЋ-[ЖєъеЫјК)gЮœ‘ШШH–_P&xZР}нЛw—bЕЫГjе*чЛjзЎˆlнКе6qѓцЭж­Фr/^М(" 6ДM\НzЕѓwЉgІЉ‡CЭ Н|љrqЊWЏ."yyyZŠнкС"вО}{йИqЃmт—_~щХzzХнwп-",ђеддT“ЩДhбЂ_~љХиz§Чў§ћхїz€ёˆъм7zєшАААХ‹Яœ9гv–шоН{—/_ЎхЉRЅЪ›oОЉfХj ВВВVЎ\Љў|ђЩ'E$===77WЅ9r$==н“Кщ)W§ŠС‚Z†-[ЖМ§ілЮw^ЃFGyФШxh‹-DdэкЕХehнКЕˆhцќќќW_}е.Я№сУEdЦŒZР4''gЦŒЅQaOtюмYDОћюЛ"_mмИёЈQЃ.]КдЛwo5gV9wюм_џњWcjЈъжЅKcŠ;<- а‹ЧSрЖ’ššЊ6-Z$П?дKЅиЭЬ]П~§€Ў\ЙвАaУ6mкјћћgggялЗoТ„ 'NTy6nмиПџќќќиииж­[WЊT)//oяоНWЎ\7nмдЉSUЖaУ†-XА ,,,))ЩjЕnкДЉeЫ–;vьЗž–ІГм+Vєяп_DкЖm{чw;vьлoП>|јМyѓЄ˜ЇЅЉ”ЏОњЊSЇNjлёii%>+ЬеGŠ-YВd№рС={і ‡bЭš5Н{ї‘–-[6hа`чЮН{їў№УэJ1bФќљѓCBB’’’6mкдБcЧuыжЩ;Y; 233EdшаЁкЋZбЅєДД“'OFGG7nмИИщК7oо8pръеЋƒƒƒ###ѓђђvюмyѓцM7žљцj6IHHиГgЯў§ћЏя DŒЏ\Bwm<@Tа‹a4n+Nž]цxфццЮœ9sУ† ЙЙЙfГ966ЖGiiiЖ‹ЂцххНћюЛ_|ёENNNAAATTT‹-’’’ TЏ^=•Чl6Пїо{ѓцЭ;rфH5 ємsЯЉЕм‹ъъ,їѓЯ?Ÿ2eЪПџ§o“Щ?rфШО}ћкEїŠ,%>>>;;[ ‰ъŠШќљѓЇOŸ~фШГй\dŸЬŸ?кДiЧŽЋUЋжАaУ&L˜`WŠХbyяНї222Ž=9hа П§эo111UЊTЩЯЯЗЋ^qœw‹чQ]щеЋзкЕkїюн{Я=їW‡ЅK—ЮŸ?Яž=—/_ЎV­ZЋV­ 0rфHЗ ещчŸОѓЮ;;tшА}ћів. Ј№_Й„юDu—1ŒP!mпО=11БM›6Лvэ*ыКќ‡Њеˆ#Œ\МXЇБcЧІЇЇЏ^НZMŽр ЦW.ЁЛ€6`]]n#?ўјуѕызЕ? &Mš$"jŠђуxјс‡/^|ъдЉВЎЫ\КtiюмЙэкЕ#Є   1Wа‹Щ*€”””ЌЌЌ„„„шшш‚‚‚oОљцЬ™3элЗпКuЋЖtr9qј№с-Z<іиcѓчЯ/ыКќЧ‹/ОјЮ;я|їнw e] "`|хК Ар2†б*€UЋV}єбGћіэ;sцL```\\м€F\жUp;b|хК е\Ц0РЛ_Й„юЌЋ >‰Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.ђ;-] IDATјЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.јЂКрKˆъ€/!Њ О„Ј.`??????Жйf›mЖйf›эŠН еŒРџ9 ТcР`?ЋеZжu|ƒњGХНSЦ“ї”юv#Й„юкx  Ќkм|€Šб€‘X| Q]Р}КіЦmлЖ‰Шƒ>Xbѕ† ЖhбЂаааЎ]ЛњћћoоМљљчŸпЖmлЪ•+‹iii›6mъвЅKLLЬж­[гвв"""Tы\ЪІГ"В~§њ^О|ЙaУ†=zє0™LћїяOOO U.гvЛhб")f1мRUbcŸyц™ŒŒŒфффРРРŒŒŒ={і8юGЯqЂПPqЅ“лЃCYшУ)”6u–?^gўѓчЯwb^Иp!000<<ќЦЖщїмsˆьиБC§yтФ‰№№p“Щ4wю\-ЯЩ“'уттDdуЦZb­ZЕDфРЮЋДvэZ‰ŠŠ:rфˆJЩЫЫ‹ŽŽ‘Х‹;66>>ўтХ‹*х7о‘„„WГщoENNNXX˜ˆЬš5Ыl6kщлЗoџєгOэктъЧс„Ю]щiь–-[DЄFййй*хшбЃQQQN.бNŽ…Z]щd.a|хК hуЦ€^ž Ѓ‚zx1ЊkЕZ{іь)"Ÿ}і™–r№рAЙуŽ;Д”ДД4>|Ин{WЌX!"}ћіеRд|еSЇN9ЏRП~§DdњєщЖ‰ѓчЯ‘Ю;л&ЊšлЦR?."……….eгпŠgŸ}VDRSSЗТЖh/Fu‹ф˜ЭycSRRDdђфЩЖoœ6mš‡Qн?§ мЖмэ0Fr нДё+0*І!C†|ўљч™™™}њєQ)K–,‘СƒkyжЏ_o—ЂДmлVDvюмЉЅXѕ§ВxзЎ]тАPCRR’ˆ|џ§їŽљUAJнКuEфж­[—/_ЎV­šўlњ[БaУБYcС`:spои;vˆHrrВэ[КvэъaнJќ єw2€Ј.`ё ^дЋWЏАААЕkз^Нz544TDдтЊC† бђфццJёЋхjs}њєqЉБ#FŒ˜?~HHHRRR@@РІM›:vьИnн:љу%ZчqЂГPqЅ“шЧјЪ%tаЦDuН<F3єА z:вЮ й47>rфHpp№йГgЋV­ъј–МММwп}ї‹/ОШЩЩ)((ˆŠŠjбЂERRв AƒъеЋgЗѓЅK—ЮŸ?Яž=—/_ЎV­ZЋV­ 0rфH-ХbЩШШј№У8`ЕZуттќёgŸ}V-h`зXoEu]jEnnюЬ™37lи››k6›ccc{єш‘––ж Aлl‹eіьй‹/>x№реЋW‹ы^=œ|dЖбdЕX,яНї^FFЦбЃG### єЗП§-&&ІJ•*љљљz ‡УIO‹+ м†мэ0Fr нˆъ.#Њ хгіэллДiГkзЎВЎ pћ"ЊkК hужеŒРJsр-?ўјуѕызЕ? &Mš$"§ћї/ЛJ`Д`(цъz19Ъƒ”””ЌЌЌ„„„шшш‚‚‚oОљцЬ™3элЗпКuЋуКНЪ9ЦW.ЁЛ€6(тq4МŽ!8x‹zклО}ћvюмїьГЯŽ=š.PЖэ‰ЙК€^ЌЋ Pже5н˜Ћ ŠС7Јиэ‰ЇЅ€/!Њ СЯЯOЭЈэ‰Ј.јжеŒРJs bcД`$цъ€/!Њ •ц@ХЦhРHDuР—АЎ.`VšЃ#1W| Q]РЌ4*6F;F"Њ ”kЖџ БЭ6лЗЯ6NАЎ.`їVš#Ом†д‰_zЫSкюŸmЖйfЛИm7АЎnyV*ЖйfлА 2€лQ] МгОЫmПдйf›эŠК­ёЅЄTw b ”Pёpё|”ѓ ryˆ8ГЭ6люm{ Q]РюНќCм† 8ёЕ"ЪO,›mЖй.?лnG —s\ќйfлчЖ\Й[ј./™ќx:yrтёЈимэ0Fr н@сjј.ЯЯ_mЬеŒ@,€Nœј|.0 —\Рwyёќ5ykG œѓѓѓуїzœуBQё№™>Š“€sЬеŒРККtтФрЃјЉ†K.рЛМxўерvСа@‰ИPT<|І€тфрQ]РЌЋ @'N|>Š †K.рЛXWИŒей”ˆ EХУg ј(N^Ю1W0ыъа‰€тЇ`.Й€яb]]р2†ўJФ…Ђтс3|'/чˆъF`]]:qт№Q\ИР0\rпХККРeЌЮ D\(*>SРGqђpŽЙК€XW€Nœј|?5УpЩ|—Я_цъpЛАZ­ŒўЫЋе:gЮœћюЛ/<<мd2DFFОџўћe]/@„ EEФg ј(N^ЮеŒрої1ПИnCœјХё+žлћLOO/“оž2eЪ3Я}Кк;vЌˆL›6ЭdђєцєЮ;=­–[222D$33ГGeRЯ•Uз‰HЗnнТТТдЖ:р]>}Ё@‘ЪчgъфЮлUMOO;vЌё-2eЪ+ЏМRЕjе!C†4lиаппПААачюемuъhйВх?ќ %ŠЛЧ€“VмКuЋuыж?ўјуŠ+yфл—vэкеО}ћš5kюпППFn”[zЪчЩ[nY­ж>ј`бЂEИ|љВЩdŠˆˆ˜0aТ§з•uе€втЧаЩ“яTО”уZЄZqыж­€OoNзЏ_џфЩ“Ѕк!fГйппп6ХjЕњћћ[­ж7n•^бЅЪ€ЎгУ‹4n_(м{cХИ.І"urzzКкpМW7fЬїіљшЃЎ\Йвј–6lи№јёуыж­ѓн{uЦwжпМyѓƒ>ЈЖ=Œъ:oХЎ]ЛюПџўкЕk8p J•**бl6'$$ќ№УЫ–-ыпПП…–*''ЏЗЮыŠteђфЩŽїWZЗnн­[7ƒkтЖВъ:™8qтoМa›туЋ‡~x§њѕяПџўпўі7ЧWГВВњєщгЌYГŸ~њIъAAAЇOŸŽˆˆPЌVkЃFŽ?.ЦЖзѓѓї?{АаG<ЦПї6dБXўћПџЛ]ЛvUЋVѕѓѓѓїїЏYГцьйГЫК^:oнКu›”‹ Щљс$"&“щњѕыЏОњjttt@@@ttє›oОiБXwтШq‡Ы–-ывЅKЕjе*UЊд Aƒ'Ÿ|ђиБcŽйfܘ!"SЇNЕZ­Э›7Wџ—кюгљрЬvo/^|ўљчcbbCCCлЗoП|љђ"лћйgŸ%''WЏ^=00А~§њУ† ћљчŸнn…њЛЮl6Я™3'!!!444$$фюЛяž:uъ7м+зIel†ЛюЬ™3gЯžЕлл7ЊWЏ."џћПџЋsoАхоh‡1’K*dwyqPЏ^НвюŸТТBЛ‹ХЂўЛіюѕЭ`tQ”?§щOZт­[З<9ШKlХшбЃEdдЈQZЪ;яМ#"}њєqЏФ2ф­ЋСєпЉN›6MKq{Ÿj6ДчusUttДˆЌ[ЗЮјЂНЅЌКЮjЕ~ѓЭ7vƒOќяіЩ'ŸˆHbbb‘Џ4HD&OžlЕС~№СZ†­[ЗjщFЖзѓѓWлCEЅЧјaДK%ъŒИD]ан~Ллоzы-ЉZЕъгO?=uъдщгЇO™2eУ† ЦзФmeеu%–[Vпа>42(sђ?vяr~8ЉW{ьБцЭ›Oœ81---44TDо}ї]лlгЇOŸ6mšЪ<н†нодПѕызс…оzы­?џљЯ"ЁE§4[Жl‘‡~јџј‡ˆ$''џ§яŸ4iв_џњWлB‹+зЖhѕ+Qѕю[oН•––ІІ}њщЇv…ОєвK"вЈQЃ1cЦLž<9%%ХппПJ•*ЛvэrЏzшь:Ћењ—ПќEDš4iђЪ+ЏМўњы-ZД‘юнЛ›Эf7Ъ-’нС Гыzїю-"3gЮДллВeЫDЄ]Лv.э тЂч’ й]%^еЙWчv+єапuоНW'"•+WюдЉ“ŸŸ_vvЖJ,2ЊЋЇБ:[qѕъе;юИУппїюнVЋѕјёуaaaеЊU;uъ”{­ЈHœŸ‰.сўŠлŒППR$/ ЅэъеЋaaa~~~yyyv/]ЛvMН”››k§НQqqqїпП–gиАaMš4ёЁіjДK\й.€Џ(n|SNJф.kЙRV]WbЙeѕх‹п”eЅT/5Ц_ЧJƒѓУIНzџ§їkcњџљŸџ‘-Zих,qBаІM›DЄM›6—/_жgЯž-"mлЖЕЫЌ~КUЋV­jеЊ-\ИаI§K,wѕъе"в­[7-eХŠŽMјъЋЏDЄeЫ–WЎ\б?њш#iеЊ•{­аIЯ\*еŠ-Z\НzUЅ$$$ˆШтХ‹н+з‘нС ГыжЌY#"їмsнодOЇчЯŸяво*ƒ/уКdїКЋœwВžЋ:їъмk…euЏN•Иjе*yъЉЇTЂуї‹ЮЦъoХцЭ›Eфо{я-,,T7љ>ќ№C7ъo #OоЯDюЏИн =єwП…ВЃ.M3fЬАKWУЖN:й6J­љЃ>ЭызЏW­ZU{Hƒo§ЏЊхїл(o<љN-?пЧ.с.ЋлЪъ.k‰х–е7–‡х:'>Їœ4СШkQщq~8ЉWmgї_МxQD*UЊd—ГФаЄњgoыж­Ж‰‹хЮ;я‘ќб6§Цjoƒ r^џЫ=sцЬІM›ўяџўOKљэЗпD$ Р6›К‹c76›Э/ПќВэроЅVшЄ'ЊлЇOљф“Ol—.]*"нЛwwЃа"й :Люж­[ЕkзЖkўЉSЇTєD‹’ым[Хуі…ТН7VŒы’a*d'ыЙЊsЏЮНVшT&їъT‰wоygHHШ… kтRcѕЏо0|јpщеЋ—ˆ$''ЛQyУ8i‘зЯk=g"їWмk…ќЪэпBmиАЁШk‚Z){оМyЖњілoEdТ„ VЋ533SDОўњkчi№ќќеіP~ПнђЦ“ЯШСt‰пЧмeuЛzшя:ЏџŠMOЙ*ёњѕыЏПўzƒ 5j”žžюИC/і‰еfрўЮ;я4mк400АfЭš?ўИнянє'V]зГgOQП­sєыЏПЪџ•ЪЬЬLLL їїїЏ]ЛvJJЪO?§ф^Ÿшl%ФjЕ6hа@D<ЈeXДhQxxИњaŽЂПOєъХ)еKёзБв ч*ч•ЈnppАˆ,[ЖьГЂhvбY1§хЮ™3GDЊTЉ2~ќј%K–Јтw^dидѓVшЁчj$"ЖЗmЌПGuн(ДHvнЂГыѕ/НњuЧŽvWBWїV‘|ЁЈз%УИз]хМ“ ЛЊsЏЮ“&x§^mŒ?^D.\hW—Ћ?ЊћСˆHTT”ˆŒ?оЪFg‹МXїWnЗћ+E*ю`(ЗП…кГgќq зЗo_YНzЕcЃд­§nнК‰ШоН{ДЗ<г•ђћэ”7ž|Ї–ЗяcюВVШЛЌњЃКЮ€вшUЎнјFХg;wюЌЅш9Nєtнwп}'"ƒVОїо{]Лv}ѕеWеŸcЦŒ‘Я>ћL§ЉўKq>tгп'њѕ2aфЕЈєшЙЪyхџџ˜˜ЧqГлг_n\\œˆЌ]ЛVKЙ~§КуЮ6lЈЇzЎЖB=WuПФю—­ъПŽzѕъЙQЈХb9|јp~~О–RXX("ўўўк"B:ЛNQЗ{ь1ЋењдSO‰Ш?ўёл .э­"qћBсо+ЦuЩ0В“ ЛЊsЏЮэ&XKс^mфххЖlйвЎ&.5VgP///ЏjеЊЙЙЙ7PaђЩI‹М~^v&rХ“&№[ЈтФЧЧ‹ˆК,фччWЏ^§цЭ›E6ЊmлЖ"_\{K[‰Дў=89TTъ*ІDDDˆШЭ›7ЭfГѓ/';Лvэ‘ШШШcЧŽйІЗjеъ№сУпџ}ѓцЭЕD5ѕtOдЊUЋV­Z"rѕъе‹/jырЊЏaйЙsЇˆмwп}Жя5™LoНѕ–л­№ЂнЛw‹H‡lяПџ~љс‡JЃD[Ю€вы53NsяНїŠШД=Ч‰žЎS_ъ‡RОџўћЇOŸоГgЯ„ T‰wнu—zЕ}ћілЖmKNN?~ќC=ЄŽ.;њћФ‹‡ziаFm(iБXL&“c†:фффlиАaфШ‘ЖщЧЏSЇŽЖbВзЉ ]КtбRдьмwп}ЙЙЙлЗoWс]ХbБєэлїцЭ›+VЌPыЋ”F+Jь:iгІЭ‰'Ољц›Fi‰jJЌн•YЇО}ћfee-ZДшёЧW)'Ož‘њѕыkѕбйuJџў§GЕfЭšызЏ/_ОМrхЪC† БЭрво*.ŸЉRЇNœœœЖmлк^6 0sцLљєгOеКџ"ЂнЖЋ^nnюЙsчœWЏЌZuтФ‰sчЮй^еЯ;'ПOzѕDНzѕ №Щ'ŸЈ•Ќ4ЅбиЇŸ~:??оМyбббsцЬINN~ђЩ'wэкЅ§QЎTШ“700аl6/[ЖЌШAˆЦ;ЊZЕЊ‡х~№СO?§t•*UЦзВeKuЯ@ЭшДЅ6%іМ{­№œѓYНт†džгйu"їРlпО§Ы/Пьж­лЮ;ГГГ[ЕjЅ~Xщъо\ђиcНђЪ+K—.}§ѕззЌYsуЦдддтК=іиЎ]Ль~ОЪу3pЛ0ў”qЏDѕ.юВо†wYЎњк IDATѕЯеu~”FŸЈїкЎ†aЕZЏ]Л&ѓФKmЛ—њЄФ&8Wт‡ˆ"cчЏї–Ъ•+Kёжћц›oќќќъеЋg;•ћчŸŽŠŠŠŠŠВ;žKЌ˜ІФSU-IІMњх—_кЗo""ЖGццЭ›EЄYГfкТ&VЋ5##CD:vьшv+trоuVЋѕѓЯ?‘ЛяО[;[Џ_ПЎЮЕўѓŸn”8oо<iнКЕ6эbвЄI"bЛhЕЮЎгЈЛ/oОљІˆ :дюUWїїpбsI…ь.o]ееќ})ю=і˜8ћьГEN#еп єtйl~џ§ї[ЗnRЙrх{яНwЮœ9кМ7\Кtiєшб 6 Pх#GŽиfpЉыkжVѓpoƒл їошгз%уUЄNц^моїъЛW=qСЎ3]jЌѓVЈiЙЏМђŠнЛдoAxрOОЁJ‰“CЫычЕѓоЅ3‘ћ+>tЅ"§J}LъuЏНіšнЋN$Ч˜y~ўj{(wпю@ЙхЩ‰gф`к[пЧмeѕ­ЛЌ:Ыеs”FŸЈ"V­Ze›ИrхJINN.Б†ЖtvњRЯШШ0™LsцЬбђЬ;WDІNЊхќѕз_ЯŸ?oЛЗЫ—/ЫзspЉOŒ@yроhЧШ1RP‘КKŠч˜{unЗB'уяе9vЏйlVЯЁЕыL§uвŠuыж‰HуЦзgГX,jŠпьйГнkK™№же€ћ+r{п_ЉHП…КxёbPPњххСƒэ^ur џя›ччЏЖ‡ 2& `ќ0к“џŽИЫzЛнeеYЎž 4њDбО}ћ‚‚•RXXЈžxІBЎЮkhKgз}§ѕз"вЅK??ПММ<ЋеzщвЅ€€5jзцzgee‰ШЃ>j[„zдžэм=—њФУaё—(C\є\Bw№.)žc6юЏИн ј-”‡П…RO]kгІуKN$џ}+кбюguzа8yмdy(1==]mŒ;VDІM›І=sܘ1vћМuы–эc^‹L‘GydеЊU5jдHJJђїї?uъдў§ћЯž=Ћex§ѕзп|ѓЭъеЋ2ЄN:ййй+VЌИqуЦМyѓ† VdsKБSXXЈ-ЇUd†чŸўнwпmмИёу?ўыЏП~њщЇ'N\ДhбЮ;“““;wюќђЫ/ЋœЃGž9sfƒ XНzѕнЛwійg‘‘‘_}ѕU“&Mмk…N%vˆ :tётХёёё§ћїЗX,ЋV­кПџO<ёбGЙWЈžru^яUDjjъїппЇOŸ   Я?џ|зЎ]wп}їїпЏAvRC;zКю—_~ЉYГf@@@Ы–-wяо­;wюМ}ћvГйœ““Ѓžр|ыж­іэляйГЇK—.:u ЩЩЩYВdЩхЫ—WЎ\ЉкwЕOtъЮћЊ”.5Ц_Чјƒ/\—\т^wбЩ€тфPЄџ\Ъ$Ј ј"uђџ^—Š(’c6юВКн Ъф.Ћžrѕоэ1™LџН;‹Њњџ~іЭYмX4Х §юЙЏ…Š™Š%–Yn™љ)-sKM-SqOKхЃЂІ†i–("* "Л"Вппчб§Эw–;У0 3ѓzўХмхмї9gо8їЬšššЕkзzyy GGЧ’’Щ#хОOl:'''BШ7п|УnйДi!D(Š\^^ўХ_tэкЕUЋVЦЦЦNNN“&M§Њ4–‚mЂр[]+40€ЎSz PюDŒKM‚F0(Щ‹Ма]ЭЯ_ЖЌеPTsю”т.+ш7,#е4P tWѓѓ—-A™‡@Sa.„Ф… @c0фш.цЏ‘Њ €ŽЧубYcY0Pшє)€ŽBђ7Ќеахпс,€Bт€ŽТG 4C.€юRaўbVРPрO …ўAŸш($/pУЌ.€&рЙК  $>ш( \ƒ!@wсЙКаdx:Ш…Bџ Ot’Иa­.€&рЙК  $>ш(|д@c0фш.аQH^1+VЌрёxЋWЏnf9ѕѕѕX­]+WЎфёx+VЌаv :ГКš мяcќІ0@H|аQ˜}аrЏ^НКiгІЌZЕJr/§КОО^ѓЩ•žžўо{яЙИИ{{ћI“&§ѓЯ?кJЖlй"їп™5kжєщгgгІMWЎ\бLT-Š ѓ—gh€в4џ!|ЌРЉ5ё1Њ€\(0.5‰rЭ…FаQH^VMMЗЗwnnnrrrзЎ]% mUWWgbЂаƒF !mкДQmœ’ўју‰'666zyy=~ќјиБcuuu‡ž9sІКЏЎSЇN§пџў'ї}›””дЗo_77ЗддT@ ™иє;8`V@QЭљŠпЧа`,Й”(0сЈhdƒТ‘М†–зпџ§ВeЫBCCУУУЅадY]ЭЈЈЈшвЅЫѓчЯ/_ОŸ_TT$ЖЋІІЦооžЧуЅЄЄАOž<9|јp[[[@ръъ’-zжсУ‡‹ŠŠfЭšХNщBњѕыЗdЩ''Ї‡ВwяоэыыkaaannюууѓнwпеддHж‚ЧуWWWѕеWnnn|>пЭЭmэкЕboSЄд™3gFeooojjъттќјёcЩиx<^^^ћ3їУх>ћь3BШіэл[цЃ3tжъ( O` @т€AС з$h.0@бббЃG0`ЧуhYЋлааАmл6BHccучŸNЄ ЇoНѕVTTдЖmл-Z$К§фЩ“§ћї‹‹Ѓ[–.]КuыжіэлOŸ>нЮЮ...юмЙsЖЖЖ§ѕWїюнщ1уЧПpсBTTдЄI“DKЋЊЊ23332њџы,ƒ‚‚Ž9тщщ9uъTccугЇOЇЄЄŒ=њТ… Ђ‡Б55kVRRвДiгЪЫЫУУУ_НzѕУ?|ђЩ'M=L‘ZBVЎ\ЙaУwwїЉSЇкййнН{їфЩ“цццWЎ\ёѕѕeлВe лЖ›7ofЗs,Х0`@\\мяПџ>jд(YЧ€ЄџџїŠЁЩЃпW­SkтcTЙ4tт?џљhЩFFFыж­ћќѓЯйYcхtюм™"љˆ^PP њr@=Ім/c<: Р!ё@GaраƒrKKK !ŽŽŽšЙммЙsПћюЛЃGnмИ‘>г–ЎЅ eЁ_ЇіЦoH-Ё  €ў`nnўђхЫъъjю‰]Zšи’^њВЄЄDъ)ЂЋkY’я юУЌEaa!!ФССAfšЁuыжDv5ѕ• ѓГК†SЦ  §ƒ>аQH^ŠЎxmцšPХyxx 80&&ц?ў5jT\\\ZZZЯž=щƒn)>ŸпааpтФ >Ÿ/Y‚ЗЗ7§Ё}ћіЉЉЉVVVWфшhБЏJS-kAcPгћv+} ВсЦяo„Ф…й1Ј!W TWWзддШ}”ЊЧФФ9rdдЈQ’ u !mлЖЭЪЪъзЏ§>4Yzѕъ•šššœœьсс!КНББqчЮяОћЎНН=!ФЩЩ)77ЗЈЈШнн=Fъ^еRАmлЖЭЮЮ.**т>L9ьC* jJW…љ‹чъ •<-X ( EAŸш($/E?ћЏЩщO›6ЭввђьйГЏ_П>yђЄЙЙљЬ™3E ЯР§§їпХNЬЩЩЉЋЋc_О§іл„'NˆvќјёO>љdС‚єЅЏЏ/!фЦЂЧФЦЦ‰ЇйЊ–‚Е 1ФФФˆгии8yђфБcЧОzѕJt;ћЇHccЃ"1ЈѕёХh>ešEэ -†BUљ.–Ж*/V…ДлрРMл#D“щhик‚ц4hа BШхЫ—9ŽЁУ#§ П\ь”%Ч1!!!„oП§–2gЮБН7nмрёxЮЮЮЙЙЙьЦŒŒ '''''ЇЪЪJКЅООО[Зn<яЬ™3ьaЉЉЉŽŽŽfffЉЉЉtЫљѓч !=zєЈЊЊЂ[^П~Mј№лoП)RSЩŠІ`-Ў\ЙBщкЕkyy9{иž={!ƒ–l:sssBШэлЗ%wIŠŽŽ&„ 4H‘ƒХОёCСSн‡}TRЈJъћTЏ@Ÿш($/еЏ_ПызЏпКukФˆмGNž}кЩЩ)<<\Ви1cЦœ:ujєшб#FŒ066~іьйƒшš\IЗnн"џЎV%№0@(Ј9ПSЕѕћЈ.ц—JbжХŠUхІвх(w"†”&A#Žф5ЈМўу?FŽщчч'іŒQЗ6йVтО§)й˜нКu{№рЗЗїƒЄžrіьй;v$$$М|љвоо~рРK—.0`€иaEEEЋWЏОpсB^^žЅЅх AƒОњъ+БyЬЦЦЦААА§ћїЇІІђxpр€д6єѓѓ‹Н|љВм){}вќќeKРЌ.€Ђ0Ћ Ђ 6П Жт-œжsŽ€цЪ Fƒњњњ:фххЅЅЅ‰}эшДДДДЎ]Л:;;gee‰N4ы=Юътлв4Aєб'ŠSезž€Aт€ŽRюЏP‚A Й&&&K–,aцћяПзv, J›7offётХ5ЅKTšПXЋ  (ЭпUс •ХџRS~Љ5mё=Іѕ'0шФхtD$/ЋІІЦлл;777%%…}-шДффф>}њИККІІІ m‡ЃcАV@Ѓ”[|gP7`€Bт€ŽТG 4Ца†\@Аwя†іЛЮ@wеззгЎ 7Р)]ц/fu ІŒ@. њ}  ЃМЂо|ѓЭхЫ—пИqcЭš5кŽškеЊUЗoпўьГЯ ъKвдO`PžРЂtё *бђ#0L:š›:ЖЖ ЙO`08†іa=P §ƒ>аQH^рfX_3 -Ъ-ЌРB „Ф…eЄƒ!@wЉ01Ћ `(№Ї?Ш…Bџ Ot’ИaV@”ћ}ŒА‰: €Ц`Ша]*Ь_аQH^р†ЕКš€чъ€‚ј Ѓ№QС  Л№\]h2ќщra а?шS…фn˜еаfF3ї`gЯžнЇOU•–˜˜hbbђтХ ž C‡UЂи’’’E‹uьибддT(vяо}гІMJ”Г`С‚7nШ=lћіэююю –™аЛwяІюшччЇрхšjіьйlулккН|љRщвTјnс–••5ў|www{{ћЗп~;%%E,YЭћо{я%''+}щ&НTKc‰ Z˜}а ЙКK…љ‹'0‰WnІUЊФФDooя!C†фччг-ГgЯЎЉЉ9qт}йЊUЋІ–YRRтыылЁC‡ˆˆВВВызЏ7444ЉКК:>Ÿomm­ШСqqqџљЯ,911qТ„ ВvM:Un Зoп–UBѓХЧЧПїо{6lЈЏЏПrхJppАƒƒУж­[•+-11100PЕJuюмЙ3fŒ;ірСƒ;wЮЫЫ[Нzѕ€bccЛwяЮ#Ћн,--›sѕ&Нtц‹•–ŸŸпЎ]Л›7oіызOлБЈ §УнЇ˜h ЄцЉв2ђ …PћŸU (Fѓ)гќ+*RBYYЧ‹ˆˆ /_МxБhб"777“6mк|ѕеWt{~~~hhhлЖmљ|~Яž=Џ^НЪ–№јёуI“&™››ЗkзюРoНѕжœ9sD/бЖmлхЫ—‹nс(mћіэН{ї677ўўўЩЩЩ УЌ]ЛжЬЬЌВВRV-Є†§њѕk“={іL›6ЭТТтнwпЅ[.]КФ0LMM ŸЯпЙsчŒ3ЌЌЌЌ­­—-[Ц0LccЃи„`qqБЌРh9ІІІ?§єгєщг-,,7oоLwбЫ;wŽЛжЅЅЅ„C‡qДУ0;vќт‹/и*зееyyy­XБ‚ћ,кП{іьaOєѕѕ6lїYмMzсТкPп}їНН§џўї?юЂвггщ;Фйй9""bмИqѓчЯчn“ЄЄ$33ГџўїПЂНќњѕыЖmлЪmљКК:@Щ}Ље{HУ1 ЃЖ1ЁхџvnљRГfЭънЛЗЊJ;ў<=d§A5dШ%Š6mк€TЄ˜YГfБсйииЉщZЪйЖm››››шБ˜gЯž]QQЁЅшtЎфІ [[дб\Šўпъ„МаKЊMmБgO`0t УјњњBJKK§ќќ’““<˜™™yьиБЮ;B ўѓŸџ466^КtщСƒC† ™4iRII !фйГgДББЙyѓц… ~ќёЧ?џќSєCёyyyљљљ}ћіeЗp”FЉЉЉйКukZZZLLLЋV­цЬ™C),,lhhxєш‘д*Ш ;99ЙООўЛяО›6mкƒ6lи@За№RRRъъъЖnн:aТ„ЛwяЎZЕjЫ–-gЮœ!„$%%ёxМуЧччч888Ш ŒrяоНккк;wОѓЮ;їюн[А`СgŸ}vѕъUBШнЛwйЫqд:!!Т6‘Ќ љјјмЛw­ѕюнЛ_МxБrхJюГhџВ=Т0LaaЁГГ3їYВš”жЈOŸ>%%%уЧ?vьX\\\@@GQЙЙЙўўўёёёчЯŸпБcGLLŒм6YИpЁЗЗїš5kD;кЬЬЬЯЯ/11QnЫ?x№ ІІFюUdUSє ѕ-ЇЛ ъУzёёёtdS бO!P#FŒ4hћ2**J‰boпО-:<ЊV|||hhh~~ўгЇOїэлwіьйЯ?џ\MзRŽфЂxњй‚ќќќмммэлЗ;vlѕъе’'жееi*FCdP…PЄOеєo'ШеЬфE^ДLJg.ђ@-š“2кJ7EЎЛqуЦV­Zезз3 3cЦŒ>}њTWW‹3uъдйГgГ/ј|>]‚:uъд‘#GВЛ~љхBHLL Л…Ю“fee)Rš˜“'OZXX0 ѓрСBˆЇЇghhшйГgиУd…Нkз.+КХйй™ўNЙqуЛЗSЇNtЙnLL !ЄЄЄDF›§џР†йЛwЏ‘‘Qbb"}йиииО}{КЈ6,,ЌM›6rkНaУЁP(Z#ЉZНzu‡шЯeee{їю•оЦMLLhуTTT|ійgЦЦЦзЏ_ч>KV“†……ЕoпўяПџvvv~§њЕмDп!‡"„мО}›ЃMRSS !ћїя—,yТ„ нКuЃ?sДќСƒmmmщvŽ–—UMЙoJЊ$fЈИN| AlОЌУЮЅњмыєOž<Щžхуу3qтDEЂЭЬЬ|ћэЗ…BЁƒƒУ† &NœBwбЛPOž’ягЇOѓљќššŽ69|ј0!фСƒbWЏЏЏwrrbgж8ZўгO?>|8wЫsTSђ •СўЙЌПrх !„Nq–””x{{6ьЯ?џЬЩЩЙzѕ*HЭЯЯwss NNN~єшбЇŸ~jaaAŸИ’——зЖmл   ”””;wюєъеЫккњ‡~`Ыњє)!фФ‰ьŽв†љюЛяЎ]Л–““?bФˆž={2 MЙџ>[ˆдУ†yћэЗE'dwьибКukњhYЇа(,,dІВВrлЖmр?ў-­ћ{яНwяоН;wюєьйгТТbзЎ]єФ№№p;;;6:‰љлoПq—ЙuыVWWзЈЈЈ'OžЫХХeжЌY=ЪЬЬ,//WЄRмM:sцL{{ћoОљFёЂш<ѕЭ7паY'Ž6йЗo!фбЃGbWџљчŸ !џ§Зм–4h]v-їн+ЕšboYд4&ДќПТ[~„ŒŽ| c>ЃдR}Бuњ„іNFЏ^НюнЛЇ`нEmšwь‡цЭ›їц›oВ{oоМIyіьw™cЦŒЁЋkEI.Šчјlфg/FŽ9yђdі%]DL? DKPъFюKKЦЉI:‘›’t4lmСЌ.€ўA^ш%ЕІ!fušL/gu !?џќ3У0.\ „фццŠCЗг…TbЮŸ?OЩЬЬЄ/_МxбІMБџэээщЬІмвŽ=jllL':†yј№ЁЉЉщіэл%|џ§ї­ЌЌш|ЌАkkkMMMщ,­ш–3gЮ0 S__пЊUЋyѓцБ{зЏ_пЎ];њHŸ5kж(-gсТ…ьСыж­swwЏ­­Ѕ—;uъw­щ^ipЗ@ccЃ……ХО}ћІM›іж[o)э_БuЕrЯтnвЈЈЈ7nДjеърСƒr‹њэЗп!йййtWEE…‹‹ЫмЙsЙл$))‰"6i•‘‘сшшШ.дхhљЦЦF++ЋcЧŽq_EV5‰7€,К8ЋЋ’Тuтџј‚ш:}ŽУйKѕЙзщOž<љбЃG)))K—.%„А^iRнЯ;gll\UUE_іэл—о2ЁТТТZЗn-ЗшѓR|}}7nмј№сCzЎфЂxŽЯˆ}і"77WДFЬПїНnпО­DЫŠPъFŽKKЦЉaЊЪM чИN )-‡rЭХ}К@Л8rPщєD^hfuZ–цфЄЖ~­ЪНюЙsч!єA/^МАЖЖžЭ0LyyЙнШ‘#oпО§єщгјјјuыж%%%1 SXX(ІNš‘‘ёЯ?џ >мФФdЫ–-lљ™™™„ЈЈ(v Gi4˜}ћіeggŸ:uъ7о џ9Я™3g§њѕёёёOŸ>НsчЮђхЫŒŒ~њщ'Z ЌАщwj‰>ќ‘nЁ3Œ)))„—шшшЌЌЌ­[З њ!b†a<==ƒ‚‚rssщїХЫ Œa˜ЛwяBмннщч|ЗnнjffFчDрЈ5]1JŸЩШq!jР€ўўў@t+ЧYt—фЃ ИЯтnвœœ†aNœ8!._ОЬ]TQQ‘@ ˜1cFFFFllь!CLLLvьиСн& Укии[РH|і‚о1=цдЉSІІІЏ^НRЂЧeE(u#ЧЅ%уд0­ЯъЊcТФ`V@џ(7Ћ‹МhсдqУFВф9€ЂєrVwеЊUжжжєellЌППП™™™@ шеЋзŸўIЗ'&&Ољц›BЁаФФФнн}іьйєщ У?~мХХ…~K§_Wє+wŽ?NЩЫЫНЈЌв.\( ­ЌЌУУУŒŒ^О|ЙeЫ???###;;ЛБcЧ^КtIД@ЉaGDDилл‹&КхаЁCNNNббб]Кt155элЗЏшкД_§ейй™ЧубЕ~ВcцрСƒvvvўљЇЇЇЇЉЉiџў§йF @V­з­[ЧvЧ…ЈљѓчB–.]*Z/ŽГV­ZeeeХіЏ‚g)иЄ›7oЖВВК{ї.wQ'Ožtuu ˆŒŒ§~3ŽїUmmэкЕk=<<ј|ОЭ№сУ9"ZŽ–?qт„……ћЉvŽЋШzУ‹Нd1и?—[~ХuтSЂыє9Ѓ/Ѕ.е—ЛN_tНъВeЫьээi^Ш­;ЛОўХ‹ЮЮЮєЩЖЬПЗLиЛ/єA(eŠ>|8_[ЯёйЩЯ^аGГП\ DћH‰—Ёд—–ŒSУДž›˜ееu4К@ЛpЗ@/aV eбќЏFІ:ˆљєгOEšЉEўўўZљЊt­XЗnЇЇЇКЏВlйВAƒЉћ*Œn>A%Z~„:ё)бuњ‡Б—\Њ/w>]YO]О|™rуЦ Eъ>kжЌЬЬЬызЏ2ФиијћяПЇ…ђxМнЛw3 “——7aТђяWЦq”ЙyѓцЄЅЅeffюлЗO(вІ“њЉЉŸ-ќьХЫ—/fЯž‘‘‘рююNgZ•шqЉЪ ›ув’qjXЫЯMЉt4lmСЌ.€ўA^ш%ЕІ!fuš ГКњ„§6-mЉЋЋЫЩЩйАaƒ‰‰ ћ…яњ'66іфЩ“є) _§5ћа5yѕъU||МГГѓЦеw–.ЮъЊЄ№–?АшФЇDзщsЦ–/ЙTŸ{О­­­hxеееBЁ§‚AŽКџњыЏэлЗЄ3­l‹1 Гiг&њф‡ЃG‘/6”Uцз_эххejj*|}}###й ‰.Šчјlфg/†‰‹‹ѓѕѕхѓљNNN!!!………ьЎІіИдe…ЭqiЉqj’ЊrSУ9ођ‡”EЙцт> ] ]9Јtz"ЏДN3џжёиРЧуz3DГч6‡ЖЎлТ1 cccГkзЎ™3gj+†‹/Nž<ЙGkжЌ7nœЖТPЗSЇN}ійg999fff§ћї_ЕjерСƒеwЙeЫ–элЗ/ `чЮfffъЛЅ‹љЅ’˜uБт-аРлЕkwтФ mТхђхЫЃFzёт…ЖcљT•›J—Ѓм‰RšDŒ.а.ŽTn—мН Jчo“ ЧЌ.€Ђ0Ћ Ђ 6П Жт*Q__ŸŸŸєшбЏОњ*66ЖoпОкŽˆЫцЭ›wяо§јёcm бznbVWдб\шэТнНЄ™Y]#Ѕ‹Х‰.’WЧЃЙ †‰Џп._ОмЉSЇШШШЈЈЈ>ЅKINNюеЋ—ЖЃЁм_;  ЙКK…љ‹ЕКŠвќ OоРQYL№/5х—ZгO`аcZƒN\NзaM€ўQЧ‚>ф5€жiцп:Ќеахпс,€Bт€ŽТG @ьиБУееЕ9%Ќ_ПО[ЗnЊŠЇЉšПTк­H…!@wЉ01Ћ `(0e ra а?шS1ГgЯц§Ыжж6((шхЫ—tWBBBяоН›Sј‚ nмИЁјё/_ОtvvцёxљљљЭЙ.Ѕ`ќлЗowwwg_8pіьйbЧ<{іЬЪЪjѕъеЄщ•U1РфХЭУm†Y]MРsu@AH|аQ8ћ:*>>ўНїоЫЯЯЯЭЭнО}ћБcЧшм%!$11Б™ГКжжж666ŠџеW_б9 ФФФц\—R0ўИИИџќч?ьKŸЛwяŠГtщвж­[ёХЄщ• ащ!wVФюЌBJJJ-ZдБcGSSSЁPиН{їM›65?EˆЖ˜d`м222>њшЃ.]ʘ››[ZZ<јРJгддWˆZЉ01Ћ `(0e ra а?шSQххх>0`@›6mкЗo?gЮœоН{пЙs‡R]]ššJgdy<^vv6{ЂЯКuышЯ>œ|инн]tVЗЖЖжддtзЎ]яОћ.Q§ьГЯфюŸRPP№СДkзЮддДWЏ^ўљ'!„a++ЋуЧ?~œО1JJJzіь™––VWWЧpэкЕ_§uчЮfffЂ•’U,!dфШ‘K–,Ё?ялЗЧуEDDа—ѓчЯ?~<їщє*сссJtЋОвзфХБ;+%%%ОООwяоˆˆШЬЬМyѓцG}dnnоќxИбЌm1БРИ;wЎGЙЙЙaaaщщщ7nм3fЬŠ+D“ІjRj-Dg0 ˜цЄŒЖв i >ʘ_*‰Y+`T•›J—Ѓм‰RšDlh]pхЪBH||<}йиишъъ:kж,†anоМIЩЫЫc&<<мЮЮŽ=ыѕыз&&&П§іУ0999sчЮНџ~RR’••Uxx8У0qqq„ЂЂ"†aшкЗ^Нz={іЩ“'tF8---ГБББџўп~ћ-У0“'OfwнО}›вЉSЇЃG>yђфћяП'„œ>}š{—hќљљљnnnСССЩЩЩ=њєгO-,,Š‹‹322x<оёуЧѓѓѓ ияоНKЏ^WWз­[ЗРР@њRДRВŠefкДiСССД^žžžmлЖнДiУ0ЅЅЅ­ZЕКzѕ*їщє*;v}:gЮGGG@0lи0vє“е/RрЈ~tt4!$&&†ОŸO'›bbb!ьЬ У0UUUЦЦЦ?џќ3}ЙeЫKKK:;,V)ŽbчЭ›7mк4†aNŸ>эссёЩ'ŸЌXБ‚a˜ѕызїщгGющЛvэтёxБББтfд1xЖфМЦЩ;+ .фѓљIII’ЭХq/ЄЄЄФлл{иАaўљgNNЮеЋW:ФнtЂЗOrrrВГГй“Xpp№РйЂж­[зЁC‡зЏ_3 3bФooяКК:ЉНќјёуЖmл%''ЇЇЇ;ЖC‡ЕЕЕ§"5Žъ3 3zєш!C†а7UЋV­~ўљgЉ…h fuZЭџjTaЊ€ЪЉ)ПZ~кЖќ “ŽцІŽ†­-˜еmО€€' …BЁ‘‘‘ЯХ‹щЎqуЦбŸћіэ+КB-,,Ќuыж УEGGГЛNŸ>ЭчѓщфlHHШФ‰щіЙsч:”=ьŸўa'›†),,ДГГЃГЩ УќілoЂ{чЯŸяяя/vяоНщr6Ž]lќ………FFFfffB„+WЎ0 ѓу?КЙЙ‰5‹ЗЗїђхЫ†ЩЫЫГДДмО};Л‹­wБ+VЌ3f У0~~~сссЋWЏž7o^mm­ГГѓ/Пќ"їєбЩ#ƒbhy;+’wVтшЩ8ЊЯ0ЬнЛwŒŒжЏ_oiiЩ#YˆЖЈ5 йТMњh6іяI(єњTT||ќЬ™3WЏ^mllloooeeХюJLL7n!ЄЎЎ.%%eётХЂgѕъе‹’””диииЗo_vзнЛwЛuыfjjJK˜0a[кшбЃйУ\\\щЫeЫ–=ў|шаЁЂББЇ$&&њћћГл_О|yџў}њX^ю]4ў;wю0 sчЮcccбђщУCњєщ#ж,ьІ-]КДsчЮќБhTДRмХкййUTTФФФdffэкЕ+55ѕфЩ“|>кДirOOLL3f џK/“їж­[ ііі„зЏ_wяо§ќљѓ$џїЋЦD$11БuыжmлЖ-..>sцЬЅK—и]VVV|>П{їюфџ>ж6))iа A^^^єeff&!ЄsчЮєeQQбЪ•+ЃЂЂhђіюн;77ЗИȘ&)M4???і*жжжlšЫкХЦ_TTtъд)SSгSЇNБ‡ееебGх&&&КЙЙб МННгввтууЏ]ЛvётХI“&ќяџу(ЇЈЈшјёуgЯžb-,ЋщирEŸ9+кb’љћћП~§њюнЛН{ї^ВdЩаЁC'MšDЁ –EЧ"QOŸ>Н|љђѕызE›ˆ§™Ѓ_ФрnFBHїюнпyч•+WЎYГfС‚ВjЁп0Ћ   Ъ§>жГпп $>ш(Нœ}=SXX˜››ћц›oВ3;ЌККК{їю}љх—„ьььšššЎ]Лв]/_О<{іlhh(!ЄООžnБЕЕЅ?DDDŒ9’-aеЊU„ккZvВ•К}ћ6;—zэкЕШШؘ˜б™ŽЁC‡вY톆†””:‰L§єгOіііуЦуи%?]хgccгКukЩFИsчЮ”)SФ6іьйѓЧМvэк‰'bccй‰WбJqkkk[QQБiгІ…  kkычЯŸoпО}бЂEД4ŽгщU$ПM8шю‹;+RяЌ№xМ~§њѕызoљђхСССћїя///ч(чкЕk +‡ЃщˆДл'Ђ-&˜‡‡‡ƒƒC\\\IIЩљѓчянЛGЗП~§š"ыћмш-Ђ=zˆn155ѕіі&œ§"w3B’““/\ИРчѓйn•Z‹H…љkдќ"@'ˆ~`@* њ}ЪŠ'„єяп_rзН{їjkkщš5+++Ч~lљнwп-))Ёг"ООО`ХŠ?Ž‹‹›8qb~~>нEK`ЎЋЋY`'ъъъ>њшЃ… њћћП!ТЫЫ‹~H955ѕѕыз.\И|љђ“'OЖmліЭ7пьнЛзЬЬŒc—hќўўўvvvГgЯNHHШЫЫЛ}ћіњѕыямЙC#ЉЎЎЮШШxњєiqq1žЯГgЯBBB>јрƒ~§њ‰5 ­wБvvv™™™§ѕзG}DБЖЖŽ‹‹ЫШШІpœNЏвђ'b4Oџ’WєЮJ‡DЇtщф>}KНГBп‡ьvWDD=KДzgEtђWъ•;"ьээ !єіIUU{ЎиЉЛDЏЮоУшќбЉч;wюєьй“Ѓ•†БВВВААр(ЇЁЁ" Хбt4BбDYV`~~~зЏ__ИpсВeЫићatЦіЏПў;˜ЦУчѓ !•••tcccуЖmлІNjnnЮн/bp7уЃGFН`С‚/ОјтыЏПf/'Зyѕšё 4Ÿ2ЭП"в@}д”_-?m[~„†IGsSGУжu4—AuСЊUЋЌЌЌ%wEDDиллГ/7mкdccгО}ћёуЧ=z”ђшб#КыфЩ“ЎЎЎ`Р€‘‘‘FFF‰‰‰b%DDDˆ~[бЋWЏŒ/\ИР0Ьњѕыmllž?.@ppp‡†9tш““Sttt—.]LMMћіэЫ>Ц—c—Xќ‰‰‰oОљІP(411qwwŸ={vYYнѕыЏП:;;ѓx}Пnн:іЫа<==ƒ‚‚rssщЃДчЬ™Г~§њјјјЇOŸоЙsgљђхFFFє)БхМxёТккzђфЩwяоЭЮЮŽŠŠЂпиЦбtЂŠЖ9m1ЩРЈяОћŽЧуЙККОzѕJДЙІM›fii–‘‘‘••=oоМЅK—2 ѓђхK‡йГggdd$$$ИЛЛг/‘ушЩ8ЊџєщS77Зљѓч3 SQQсррАjе*ŽZh…Zг-М%ц9@Ы„Y]Ѕ‹ГК*) @ЫЄЊмдpŽcHiхš‹ћ,tAsЌ[ЗЮггSЕe~њщЇЂпЅр.а]9ЈtzЖиМЦFтЮЪ–-[ќќќlllŒŒŒьььЦŽ{щв%EЪ‰ѕїї733НzѕњѓЯ?Й›Nђі‰иЉЗ|шšШШHБцЊ­­нИqcЗnнЉЉiЧŽƒ‚‚RRRшоИИ8___>ŸяффRXX(З_Є Ењ%%%]Лv>}:ћrлЖm …љљљВjЁšљЗŽЧОnЭyє‰Ж{ЄЛ[hљt1ПTГ.VРЈ*7•.GЙ1Є4‰:]а$qqqOŸ>ѕѕѕ­ЎЎўѕз_7lиpўќљ#FЈ№ƒюпПџцЭ››Д tG*ЗKю^}В~§њУ‡ЇЅЅЉАЬE‹=x№ ::КIЛєUPPPAAAUYU”Юп&ŽoK0†№Ч=4 §ƒ>UЁgЯž}ўљч999fff§ћїŽŽІМа:Эќ[‡ЕКš \>уз0€Bт€ŽТ$€Ц`Ша]*Ь_Ьъ ќщra а?шS…фn˜еаh †\нЅТќХЌ.€ЁkhhˆŒŒьйГ'Лху?.++ЫЪЪzњєiqqёš5k!ЕЕЕ111щщщ?NNNоИq#н˜‘‘‘™™yрРЉ'–––~ќёЧ‘‘‘UUUiii#FŒр(ПДДД  `юмЙŸў9!$::š]Mьъъ*Е(Q]КtILL,++ѓєє\МxБdMЅVAъYЁЁЁееейййЅЅЅ .-dЫ–-{їюНzѕjыж­ЅžтррP\\|уЦ_~љ…ЛUХТkYсежжцччVTTфчч№СьYŠїE3лDnЅBBBј|~~~~jjjllь† dеT*ЩHІOŸ~цЬ™ккZBHiiщѕызфіОм7OhhЈЕЕuqqqLLЬ‘#GЌ.Т”1Ш…Bџ Ot’ф`@1šO™ц_‘Ѓ„GBЌ­­љ|Он“'OшіЊЊ*>Ÿџьй3њђж­[;wІчххб—.]ђђђЂŸ?ЮqbEE…™™йЁC‡^О|)ЗќŠŠ †aюоНkkkK#lР’EЩ’аКukЉѕЋ‚дГ*++й#йгС7п|гЗo_ЖЪRЯ522bk- eеZ2<Бz zdyy9У0їяпчёxЏ^НЂ?лййбƒь‹fЖ‰мJ‰uётEOOOЙ5ыwБH†щеЋзйГg†йГgЯИqу8ŽdI­;{Щ8…BЁмк1jZўoч–!€aвбмдбАЕEЭ….а.ф5€^RkВ…c­.€сeeeЅЅЅОООtБ-!ЄЈЈЈЎЎЮлллЦЦЦЦЦfФˆххх„“vэкбcммм h ЖЖЖ'ZZZž:uъШ‘#ЮЮЮМyѓІЌђЅЅ%!ЄUЋVt%ІЩЂФиПП‡‡‡••еаЁC_Нz%Y‚д*HžU\\Ьуёи#Yѕѕѕ?ќ№УвЅKй*K=зШШЈmлЖєюVыЩZ)@`eeE155577777Ї?ГPА/šй&r+%v–ЛЛ{aaЁЌšJ%ЕњяМѓЮёуЧ !Ччw8ŽdqПy$уTАЫt>Ќra а?шS…ф9д4m  š“2кJ7ŽыŠЎULMMЕВВ*++cІВВ’ЯчWVVŠLDuўўћяtбЅшšJЉ'ВjkkПџў{OOOYхГE=zєˆЎoЭШШ\Г)Z”шЦ/^˜˜˜ќ§їп ДЙUzЧZн›7o:99]ЛvMжщZнќќ|zЛV—ЛqdЕ€дKH=RьgћЂ™m"ЗRД5Dз‹НmDc–l Y}š••eee•••% щšeЙН/ЕюВжъ^КtI(Ъ­Ѓ›‹ TГ.VРЈ*7•.GЙ1Є4‰:] ]9Јм.Й{@”Юп&ŽЕККM%їoНММњєщГџ~BˆP(œ>}њ’%KшЪФgЯž]Нz•^hхЪ•Џ_П.--]ГfЭЛяО+Vˆдѓѓѓ/\ИP]]mbbbiiйии(Ћ|IЖЖЖєВєЅdQЂзжж644иййежжnпО]j’Uz–P(œ:uъвЅK_О|Y__/КЎГ_П~'Nœ˜>}z||МЌs'L˜АbХ zњYŽVхІHЅЄRА/šй&r+% 'MšD[ЃЄЄфыЏПž1c†тЕU}wwїЎ]Л5ŠЎY–лPмoЁP8qтD6Юuыж)R;%њG€T(єњ@G!y€fu4AЙпЧŠЯи6nwоМy?§єэкН{З‰‰I—.],--‡ ірСBˆЉЉЉŸŸŸ‡‡G‡КuыЖbХ ЩB$OlhhXЗn“““……ExxјЁC‡d•/ЩЮЮnС‚666999R‹b999­\ЙВџў^^^>>>R ”Ќ‚ЌГіьйcllьтттшшИkз.бB† r№рСЩ“'I=wяоН………ŽŽŽўўўSЇN511‘е8r;E‘JЩЂ`_4ГMфV*""ЂЊЊЊM›6žžžООО+WЎT$xњfцЈўєщгЏ^Н:}њtŠћЭC /--utt8p {ЧBВv™™™ŠTЁ9№Q;аQ˜}а ЙКK…љЫУ@  :ЯЂЩ”QфŠ’Г?ЂЧЋ*цŒŒŒ7оxЃККК™хh‘VЊpщвЅХ‹ЇІІjђЂŠk™нzяоНЁC‡–””h;љд4&ЈuЈQIсš @ЊЪM ч8†”&QЎЙИЯBhG*žШk­гЬПu&ъ(@i~ ]SЏˆ_скuяо=##ЃЎ]Лцхх}§ѕзSІLбvD:цвЅKнЛwзvк„ф…П@4C.€юRaўbV@?смкђќљѓЙsч‚iгІ}љх—кŽH—Ь;їкЕkЧŽгv z њ€\(єњ@G!y€žР (]yEЯТ-\ѕбХ'0ЈDЫР0щhnъhикЂŽцBhђ@/с   ќђY№'>Ш…Bџ Ot’ИaV@”ћ}Ќюу B"€ŽТь€Ц`Ша]*Ь_ЃцZЧ0ŒОўFЯШШ033гvъ5aТ„Пџў[UЅB‹вєxЌUС@ЁаЇ: Щ м0Ћ   Ъ§>цёxrПєЌ9Пщ, ­ЌЌ|||Юž=Ћ\9JаиЬcFFЧГАА …§ћїOIIQїхšZЏјјј’’’СƒЋ)$wяо=___mGб4Š$>@ „йС  ЛT˜П˜е0PѕѕѕуЧŸ1cFYYй‹/іюнkkkЋБKkцB”@ ЈЌЌЌЈЈ1bФ| жH”(pяоН3fЬЕ—a˜тттцЅЯ ЙИxёт˜1c4ŒNР”1Ш…Bџ Ot’ИaV@”ћ}ЌжАЯž=+** хѓљЦЦЦ§њѕ4hшRгŒŒ іg33Г№№pWWW++Ћ?ќАЎЎNъFzќѓчЯ­­­-ZT__OоЙsЇ‹‹KPPаЈQЃjjj,,,,,,rrrvяоэъъjnnоІM›mлЖIFЛcЧGGGWWзииXК%,,ЬЭЭM(њљљeffвхOŸ>=--M,ŽhЅV­ЊЊjоМyЖЖЖЁЁЁ555Ђz{{‹жk§њѕsцЬac=zєў§ћХЊvщвЅЁC‡JV933sѕъе:t`OЋЌЮЂЄ/к› 6)[;'''wwїиииэлЗ;99ЙИИФХХЩjYбJJъu+**‚‚‚lmm­­­gЭš%ы*;wžŸŸŸŸŸššЛaУzpFFFffцЂЃЃщкЪЪJЁPјёЧGFFVUUЅЅЅ1BђвЅЅЅsчЮ§ќѓЯщЦ.]К$&&–••yzz.^̘RZZЪQN}}§БcЧМММФ"сˆVjе>ўјуВВВЌЌЌЇOŸЏYГFДР{їюБѕruu9sfTTTuu5!ЄАА№ЦSІLЊЌЌ,77зУУƒнRUUuј№сaУ†ѕызЏИИјјёуДЪмЕSЄГ”hRірТТТќќќрррРРРŠŠŠќќќ>ј€=QВMЄF++*Љз ­ЎЎЮЮЮ.--]ИpЁЌ–ЯЭЭ7nмІM›кЗoПdЩБ'lTVVоППџўmeh0e ra а?шS…ф9PŒцSІљWф.сЩ“'ѓчЯядЉЧ}Ў\ЙB7FEEM›6Q5 -џЗsЫР0щhnъhикЂŽцBhђ@/Љ5 йТБVРpЙЙЙ………eddИККОїо{›˜˜ДkзŽ=Б  @жЦттbЧnwwwЇkдGїZZZž:uъШ‘#ЮЮЮМyѓІиРвв’вЊUЋккZКqџў§VVVC‡}ѕъG9 ЌЌЌЌЌ,&&ц7о‹DVДRЋVTTTWWчээmccccc3bФˆђђrŽЊBfЭšuьи1BШБcЧfЮœ)ЖзккКЁЁсѕызєejjЊ‰‰‰ЗЗЗ———ЉЉi“ZI”др-ўЅx“В heeE155577777Ї?гg HmЉбJJъuХ:…ЃхYэлЗїііювЅKVVVII нЈ‹_P7|XфТ@ЁаЇ: Щ м0Ћ   -№ЙКЂœœœ–/_~џў}SSгњњњЦЦFBˆи—tезз?{іŒўœ““гКukYйэйййtЛ(Бж;vьхЫ—KJJDD+KYYйМyѓіэлW^^~эк5Ж•šZGДRЋцррРчѓѓђђш4qyyyQQGН!гІMЛzѕjbbтУ‡Ч'ЖзЦЦІ}ћіщщщєх7Ў_Пndd4zєшО}ћюиБƒ ”Ќ]S;Ћђ_RлAV“Ъ%ЋM$ћBjTRЏышшШ0 {0ЧU†љћяПƒƒƒ9њьйГРР@zжЅK—tёЋв4–јЊ…йС  Л№\]hЎ’’’ѕыз?yђ„RVVЖkзЎО}ћ:;;[XXœ9sІЖЖіЇŸ~=žЧу­\ЙђѕызЅЅЅkжЌyїнwem …“&MZБbХызЏKJJОўњы3fˆ]нжж–>­•’ŸŸсТ…ъъjKKK:MЩ­ЖЖЖЁЁСЮЮЎЖЖvћіэtЃхpD+ЋjгЇO_Вd ](њьйГЋWЏЪЊЛхЭ7пœ={і”)SdcЧŽ§ыЏПи—6lШЮЮўілoЏ_ПоЁC‡}ћіI­]S;K‰&UА%лDj_HJъu…BсдЉS—.]њђхЫњњњ›7oЪjљN:…††vюм9%%хтХ‹l#ЇЇЇ[YYЕmлVёКL€\(єњ@G!y€fu4AЙпЧjН+юнЛ7pр@ssѓŽ;–––8pРиијЧ щвЅ‹иwL™ššњљљyxxtшаЁ[Зn+VЌЕ‘QUUеІMOOO__п•+WŠ]нЮЮnС‚666YYYыж­srrВАА?tшмрœœVЎ\йП///КБЁЁЁЉхpD+ЋjЛwя611щвЅ‹ЅЅхАaУh †\нЅТќхa PgбdЪ4џŠЊŠ9##у7оЈЎЎ–ЛQ?ЈЖj “'OЮЩЩ12’~#mТ„ Ы—/ ] ]9Јtzъ_^gffіызOєёtЌŒŒŒž={Ъzаœ!рh5Ј=ž.Pfў­УZ]MPгsuБІO'ьмЙ3((Hж”.!фќљѓњ=ЅЋУ‡їїїзvЪРЪ аQјГ@ctbШЭШШрёxBЁАџў)))JеБcG5M>ЊUFF†™™™КЏ"Зqd…Ёє‰Э?X–QЃFmиАAtЫš5kЦOпKОООьіšš{{{њeр:Яе€џO'~ЃІввRssѓфффЅK—j;ƒГ|љr>ŸЏэ(ZL€\(єоїiFF†fўБзЬVbPКX5~ЫЄюЗ„$Џ@ ЈЌЌЌЈЈ1bФ| ЖЗОО^+QiСV\ЎYГf;vLtЫбЃGgЭšE155-))Йџ>нхшшЈ…[Ьъh‚žЋЋжЙнЮ;K~tBъF§ ЊЊйллWUU%$$илл7П4ІЧя•У}аQz0ћ*СЎЮc%%%Щ:R+“Є]ЛvэбЃ‡:J­‘ W)ъ=кVЁЁЁьKю™bБwNEE…ГГѓХ‹щЫЧлккІІІЊ/р–@З†\ccущгЇЇЅЅ‘ЛoчЮ...AAAЯŸ? ДЖЖvppXДhю\ЛvэћяПЯžN­&кщЅЅЅ'NДАА№єєќу?шЦЊЊЊyѓц988икꆆ†жддBvяоэъъjnnоІM›mлЖ‰ццц& §ќќ233й№vьисшшшъъ+YЩ Щ:kдЈQ555t$МzѕЊhХзЏ_?gЮЖЬбЃGяпП_є*ДЬ№№pWWW++Ћ?ќАЎЎŽ"йbb#d$ЂaАпўB$†,EN”к_’•eЏ"й&RЛ‰™™yїю]њђіэлљљљoНѕ!„Чу}њtAAчZYYэиБуЃ>zѕъ!dўќљŸ|ђ‰ЗЗЗЊcдНыыы;цххE_жжжfdddff8p $$„ЯччччЇІІЦЦЦвOпOŸ>§Ь™3ЕЕЕ„вввызЏˆjmm]\\sфШКёу?.++ЫЪЪzњєiqqёš5kJKK?ўјуШШШЊЊЊДДД#FˆжЅK—ФФФВВ2OOЯХ‹Гс•––Ь;їѓЯ?—ЌŽф…dЭއЎЎЎЂŸ9sfTT]јRXXxуЦ)SІˆ]ЈЖЖ6&&&==§ёуЧЩЩЩ7n$„Hm1БГФ" CV7)r"Че%–к&R[eaaёж[o=z”ОќљчŸZЕjE_Ю™3чшбЃ yyy “&M’UТ€bДЌMЦЦЌэ–аOʘ_*‰Y+`T•›J—Ѓм‰RšDЌђ.xєш‘@ л˜žžngg—žžЮ0LRR’НН§“'O:tш@ …BЁ0;;›a˜WЏ^}№Сііі666!!!еееДДќбСССХХхŸўЁ–””L˜0A(zxx„…… …BК=,,ЬХХЅUЋV­[ЗоКuЋdx‹-њ№Упџ§Я>ћL4р={іИИИXZZЮŸ?ПЖЖ–c#[”dДЂ5Кrх {prrВ §yзЎ]tхр€?~Ь YGЩђe5Џ(YmјгOџН;lЂЮџЧџN›4GкR)”ЂДхЈфpЋЫЁPZ`Й КТ.•U о ТюъrЖ@…EPqЅXРEРЂм ЅЅHквƒЁэќў˜пЮgОЩd’ІЩ$3ячу “9^ЏїЬћЩ;яОgmXXXЇNўћпџЎ\Й2,,ЌC‡'Nœ)k18Vј–‰›]3iii‹-bџЩэгf9ГWУ0cЧŽMKKлКukзЎ]й8-a™ §ЇCЄlEN‡=Dъ coй|W2зЎ]#„8№ќљѓмТ;wю0 SSSуээ]TTФЎŸЧОюнЛїў§ћ†ЩШШ9r$ПЈ-Звh4ЕЕЕ>>>ХХХьТSЇNuщвЅЊЊЪпплЖmееетЁцццЖkзŽ ЏЊЊŠa˜sчЮ›­)x k[ёУц'ЮzќёЧwяоЭ0ЬъеЋЧ/Xz\š999]Лv,1ЫЃ˜EbэBmщ†"чЫreС –žYTййй;vlnnnlllзЎнwп}Чпљ!CОўњыїо{oюмЙfm…ЇqИўЖhчЋ а2­ЌrЮ%Єsї„yФœ.##cётХNм!х3‹чsEу ƒ†By<сœЦЦЦОёЦгЇOЏЋЋ›:uъпўіЗN:YьВœрH=›уђššš>љф“ёуЧ'%%эмЙГЙЙ™].8 Np!ŸeД‚тЬF)к?6P|D›5жЪ№іэл%%%ГfЭJNNЎЊЊ*))™={6Ђ`О‚{sЌ№чKKKлМysuuЕcхМvэк>њ(---##УЯЯЯrџ‚ ЖhЈІcgЄ5<ЁђЖ’ŸŸŸбh4ЧяоН;З088˜R^^ЎRЉкЗoЯ.ŽŽО}ћ6ћzтФ‰Лvэ"„ькЕkтФ‰ќ}ZnE)++Лџ~Зnн‚‚‚‚‚‚+++u:ноН{Зoп9hа “'Oš…—••Ћзы‡ЪŽѕfУгщt„6mкАу…љds+ГФYмВ;wюќуџhЙОZ­цвьдЉSiiЉH‰ёb3kс‰ohЯбХwh­єјž|ђI“ЩtьиБяПџ^­V6ŒџюŒ3ЖnнКuыVљNПрdNяfP*щЋŒЭ#кЌбNŒй)?D{šњњњŽ; gэА5П ўЖЉбhњїяюм9'Хho`“‹кЯџtіќш$гК)гАнХХхє}ђGчБ†innЫd2555…„„˜LІUЋVйГхЌ­ЬŽ”ЗіюяџћЉSЇŽ?^p€ЙJЅJOOЏЋЋ3 K–,™0дв!CИцŠ$(ђ,TСАђ•••9’]!##ƒЂС2ZkO&mбc­=)U№ˆf{у№Т /ˆ?’\Ч)5к‰џuœЭˆЛ{їnzzњєщг_yхіўФь‚ ѕёё)**b{B+++ЫЪЪwЦ0Lqq1ћЯТТBю­#F|ћэЗуЦупЬBjjjіэлЗ{їюˆˆˆˆˆˆ}ћіэнЛЗЎЎŽвииШээцЭ›экЕГЖPНЖЖЖЂЂbрРяМѓŽЕ…ќд,Ѓхg$XЗoпVЉT.\ЈЏЏŸ:uЊј_|[юпreЫCи_†fЏ-ѓЕƒ…/˜8‡сўѓŸ   ў тхЬњУўАpсBіѕ‚ ЦŽkV,‚ Жшtи,[‡ЙЂёDг*?§єSdddSS“х[˜OюDЊaыk(Здs{IџбшФЊ.hжЌY!!!ЃGоГgOCCџ-ГЙŠ+*ќYБ,чвŸ]ЫцгEЭ&ЗŸ ЬцУ4§ѕзз_НSЇN}њєaяGY—/_жjЕжŠШц[жfу—Є——иСƒ­=ЁUp^н–>1жк”a"“Ќqa5 @ќ‘ЌРP0ЏЎ•Ÿƒ‰чD|2­›2 л]фвЋKб№dggўљч;wfя oоМйЖmлSЇN1 3wю\Н^XXXШ0LMMЭŸўєЇАА0­VЛfЭk]lьпBi4šИИИ 6АЫћэЗ„„NаЗoпџўїПќРž|ђIЖ7™ѓњыЏ9’=DFFF‡t:ньйГDr›[FЫЯшћяПь‘yэЕз4MttєћяП/о(ИўЪ‡8p йўэ/CГз–љZ‹СТLœЭ№ЫъБЧуЏ ^Ю………Ÿ~њiчЮkkkЙѕ;uъєХ_XТ2AћO‡ЭВu˜,ъ5ИШsЯ=ЗxёbСЗаЋ+w.­†шеh1хѕъ&$$„‡‡ПњъЋ.\0{Ћ  @­Vѓ—№?TЖlйТўХ„NЇуw‰8p 11QЏз8іkЙ„ЛПЗvУdЙs{юDoмИAxЯхаыѕь_‡qjkkwьи‘˜˜Вkз.nЙрX]ћc0+ЈЫ—/›нЄ Ў ­ЕБКжЮ‚хžƒ‚‚Ў]ЛfЙаZљˆ1##у™gža&>>~яоН Xрз/ёPEroс€%gеM‰ы8š”qЌИФЗТ)АyгхБ–,YђйgŸЙ; y№ф*RЎžЈзžЏЂЂЂM›6Пћня***W№ф‹ьсвjШэѓъHСЅѓъ:ь‡~8vь˜——згO?нЗoп5kжTTTАo™M˜Х'2џ”х\Z–KjўG0ЄMnХgmЂ+†aŽ=:kжЌШШШэлЗЇІІ'''s^ЙrЅGЧ 2ГЗBss3їx v’/Ч&bм3џа"sРй3˜Y&L8tша™3g~§ѕз‘#GЖ(6 b&y‹7оx#))ЩнQ€{ Щ•ЛЖmлжжжцццЖmлVp….]КдззKHУ‰ѕНКT‹]О|yaaсвЅK;жЙsч-[ЖB4MRRв‚ ЊЋЋљБЕіЈPЫŒŠ?rTcЯ!%жІљаCЅІІvщвхќљѓйййЩЩЩfO=zєш№сУŽA№Ќf+Œ5Š]С`0,_ОмZД-}2ЉЕ'Z>)UЄ|јЬАљHVрsбoАюe-Mщ‹Є„šЎ<8Ї2…Ъ таЋ Ч>%ћжлл{ФˆЛwя.,,0`Л0##УллЛcЧŽaaaызЏчVЖіЈPЫŒŠ?rTУЯ!%VІЙ}ћіЋWЏ.^М822вr“†††œœГGŽЖ4САђmкДщіэлaaaLJJRЋе‚б:№dRС' >)еZљ№Y ўHVpЯy/` )Сq%Ї0Ъ;ЁhrфЫ‰ѕW…†РNl?‹”UІѕG”>fyЩШШ(((XБb…dGЬЩЩIKKЛ|љВ‹іŸ——зН{wgнГцццŽ;іцЭ›^^ј P€‹ъ—KЋm‹vnme4,žЩYuSт:Ž&ЅE+.ё­p мKЄ:\=QЏмNšЏujWьЬ8VŸё1ьjsцЬ‘р(.\№ђђzјс‡‹ŠŠо~ћэёуЧKpPЇXЗnнДiгаЅ+1ЯЉјž Ш:$ƒ&@ОœXё]РЕюмЙ3fЬ­VћшЃіъеыѕз_wwDЖ †€€€ГgЯ.XАРнБ€3сѕР&4Ъƒs SЈМ 30и 30Ÿg`p Я€N2­›2 л]\Q\8ю…z  HвЬР€БКД№ЬGБ€GACЁ<8Ї2…Ъ т0Џ.€0Џ.и d CУ$ƒ&@О0Џ.8ЧЈQЃŽ=ъЌНхххљћћ;koдR^1fdd,^МинQ!˜ ь€†BypNd •ФЁW@ Ž}Лњ/nNŸ>]QQ1x№`з‚f.\шзЏŸЛЃ№3fЬиБcЧ;wмˆ<рOэ@Іаћ 4ЙђхФњ‹^]zmкДiвЄI"+0 S^^.Y<Вsћіm‘wГГГ‡.ј–ђ VМ(ќќќž~њщ;vHXƒ.cА …ђрœШ*/ˆCЏ.€ћ;;;99йЯЯrѕъUН^џРˆЌЕУ‰‹e‚жR–ЌЬEŠ‚sєшQЎ›м]Ц` хС9)T^‡^])8іyьъ`SSS?љфЫхооо#FŒиН{waaс€ššš–-[Ўеj333Зmлцээ§с‡>џќѓ111мСXООО БББ;w~ф‘G-ZdO$сссщщщёёё]ЛvэйГЇ§)lмИQ­VЧФФшtКaУ†]КtЩ2ZkY;hFF†ЗЗwЧŽУТТжЏ_oэ@„элЗ_НzuётХ‘‘‘ќЈВГГ{0Э Vфp"Хb™ Е”Х9БЬEŠ‚еаа““ѓЧ?ў‘’ŸŸjџс(„‘ Sш} š\љrb§UЁ!АлЯ"e•i§mюaдЈQЏОњърСƒ>„,фххuяоНОО^šУ >|бЂEC‡•цpž/##Ѓ  `ХŠюФЩ\д&ИДЉqЪЮЅo РЮЊ›зq4)-тXq‰o…Sр^"uасъ‰z рvв|­SЛbя`ЦБњ,СЧ№Пџ§oW‚BO<ёФРн…™3gŽЛCм€LЁ@2hrфЫ‰ѕcuьеšŠчЎ]|иГ$Ћ ” Ж~Q›8€‡s{нtХ0R0уŠтТ)p/ŒСP$W УЗмzuьЅШРarœС)Шўд@2hrф ѓъ@‹сжlBCЁ<8Ї2…Ъ таЋ ЬЋ vBХ™BУ 4Йђ…yu Х0;脆BypNd •ФaЌ.€0Џ.и d j 4Йђ…yu Хpы6ЁЁP{Ю)Цx V6ШЈзŠ‡^])`^]А*>Ш.Щ Щ/'ж_єъа]Ц` х?Ї8зр TЕ$*•ЪE™:\Œ””М4\w~= =™* ž– ЧцЙg­*mPё@І№Tp=W=™ВhШз]9ЂЩ•=…LOІžР‰ѕНКД@—1脆By<ќœвг•€LЬE){rхЅъ,г“,=™*f`це;Ёт€LЁс‚ж ч/щЩ”Ѕь|ницоRЅЄя’4 M™z'ж_Œе ўXlBCЁ<ž|N=60ЇCІŠчŠФ=ЙђЪЮ5=Щв“Љ2 W@ ˜Wь„Š2хсНрљшЙ~шЩ”Ѕд|н›—›\ЅžP3”ЄIhЪдs`^]h1t€Mh(”ЧcЯ)=] Ш”NOпc+/‡Њ3NOВєdЊ˜W@ ˜Wь„Š2…† ZOйsАђб“)KyљКНлЫ]хщіФЅAIš„ІL= це€УпG€Mh(”Ч3ЯЉ†ф"єdJў7Ж”ыА`xм˜dœ{К=ГђšёќˆždщЩTю0V@ Ž ОЃчю8Јј SјSp х ъДFй™*85–лtK“KOOWАŠџhуЇІјd=‡‹НКДР]脆By<ѓœЂгР&Й\* ў‰BЉyYC[О €^])`^]А*>Ш.p mW%љвs?уЎLнRЖєќC'œPЩ`^]h1YЬЮю…†BypN=:M E<Жђв3WВЧžЁ*YeРX])`^]А*>Ш†nchЛrќЗъ|4фШrWІДUКt%ƒyu Хpы6ЁЁPœSЯNh­Мєє)г#mљ*zuЄ€yuРNЈј ShИР1Д]9”фKЯ§ Uѓъ‚ВсЂ’ це€Ѓmj0p хС9ѕш4ёиЪ‹yu•ŠЊd•cuЄ€yuРNЈј Sє ЭчЂэЪСМК ƒyuA1аЅ+'ж_Œе =+Рah(”‡=Ёмзuўа3OxЭч ёИє5џПž^{јk› ВcS§яbіВrбko?]‘Џлc фЕГ`Ќ.€0Џ.и d №Љш•ьє>;БНon94( жC8БЈЉhgœBњЎ–жнCЎуЂњхвjы”Ѓa№LЮЊ›зq4)-‚тЙ чZЅ'S:бv~)љ1FИ+cuЄри‡кS Ёт€Lбіеœ…Ж+‡’Nrdб“)(FЫzuh/` зAЇ (=?Ца#mљ*zuЄ€yuРNЈј ShИР1Д]9”фKЯ§ =™‚тс2–#/wqХsW@aаPИ:M@†ЁфbІэ3‘Њd•cuЄ€yuРNЈј SАŽЁэЪСМК COІ xшв•#єъа_<Р&4ЎƒNPz~ŒЁ!G>кђUєъHѓъ€Pё@ІаpchЛr(Щ—žћz2ХУe,G˜W€ДM @Cр:ш4eРМКJEUВЪ€БКRРМК`'T|) XЧаvх`^]…Ё'SPШЌchЛr0ЏЎТа“)(КtхНКДРА €ы г”žchШ‘Ж|НКRРМК`'T|)4\ркЎJђЅч~†žLAёpЫце mSƒ€аPИ:M@0ЏЎRQ•Ќ2`Ќ.€0Џ.и d жР1Д]9˜WWaшЩ]Кr„^]Zр‹脆РuаiЪ@Я14фШG[О €^])`^]А*>Ш.p mW%љвs?COІ xИŒхѓъа‚ЖЉСРh(\&  ˜WWЉЈJV0V@ ˜Wь„Š2…kркЎЬЋЋ0єd Ї.]9BЏ.-№ХlBCр:ш4e чЧrфЃ-_@Џ.€0Џ.и d 8†Ж+‡’|щЙŸЁ'SP<\Цr„yuhAлд`р4ЎƒNPЬЋЋTT%Ћ ше‚cє|X_yђђђќ§§-_S"???44дuћчŠ”;…ьєѓ"žЕЕУхххiЕZ'†!1кОњ‚ГаvхP’,=ї3єd ŠGIыЄ0ше …ŒОxфххЉT*­VЋбhтууЯŸ?яюˆ”ІE§˜Z­–=ьIaБo9rd№рСzН>88јйgŸ§ѕз_ЭЖ}№С+**œК’ШwЙВ&L˜рЦ`ZOF €ь г”žchћLЄ*Ye@Џ.€ћ0 чУ8Јј??ПšššЊЊЊФФФйГg›Нлииш–Ј\Э3ѓЊЉЉЉЉЉ9{іЌFЃЉљBШсУ‡Чїч?џљЮ;ХХХC† yќёЧћэ7wЧыьхЪњьГЯмŽ{аіеœ…Ж+‡’dщЙŸЁ'SP>>%%%—/_>qтФђхЫйuRSSыыы УМyѓ!sчЮ5Зnн*//_Вd‰С`˜;wюž={jkkЏ\Й’˜˜hЙФЮ Эމ‰9sцŒбhŒ‹‹KKKГ3M~^–e“ ,//?~ќјіэлХїfOиф†—FEEйЬЫRUUеO?§”œœЬ_˜’’ђ§їп[лФВpRRRіэлg2™!ƒсиБcуЦ\гяПџўІM›:дЎ];СRх3™LƒЁДДtцЬ™ .‰ЙЅe%~шYGлW_pкЎJ’Ѕч~†žLAё(i”†ћДІЪИЋКЁšИЕѕKšФЏ]ЛF 8pрљѓчЙ…wюмaІІІЦллЛЈЈˆ]?;;;..Юr9У0ЕЕЕ>>>ХХХь?O:еЅK—ЊЊ*џmлЖUWWГЫ-—иЙЁ5ЙЙЙэкЕcУіѓѓуђт^›%Ыц%xPЫd5хžй…v†m‰=yq‡`ЈеjГu._ОdЖ•eЪ\с0 гЛwя§ћї3 “‘‘1rфH‘5­EХюпьХ;яМгЗo_‘R5л !ЄЊЊŠa˜sчЮ[ˆ‹DА0ЙЫ500№ѓЯ?ч‚<4їЎЕ3ыЗ7JŽріАхE‘ХЅШЄЌЁ*YP0\ЩŠ„eGў IDATs*#\ФX]…ЃэЇoХЏxіУщ *>ЧЯЯЯh4ЦуЧwяо[L)//WЉTэлЗg—GGGпО}лr9!ЄЌЌьў§ћнКu JLLЌЌЌдщt{їюнО}{ddф AƒNžЪ?Ђ`"Ю1Эк_0sbёЖ†cЂтQ)€4PёAIж­[—ššКtщRwR чrСЙhЛr(I–žћz2ХЃЄuR/BˆЏЏoEEХХ‹йE_~љeXX˜Фqx{{ёХЅЅЅ–oљљљеддTUU%&&Юž=›ПАІІfдЈQsцЬ‘6XлrssяоН[TTtюм9nЁ`"Ў€Я„eшвЅ‹\І_xщЅ—***(™3A1аPИ:M@шљ1†ЖЯDЊ’U/BˆJЅš6mкж­[йE}єбŒ3И5юмЙ“œœ:ўќЦЦFBHЯž=ЕZ-;ZVЅRйsКaУ†N:i4š„„„ќќ|ЫдjѕДiгVЏ^mmооо)))WЎ\љЂїђ?~ќѕызЩџ;юеlДЏППџš5kТТТЂЂЂNœ8AyъЉЇиnоМЩmЫОXЗn]xxxttє‰'V­ZоБcЧќ‘нammэœ9sBCCƒƒƒSSS,Ѓ§јуŸ}ійБcЧ~ќёЧі$т ДЕ>ЮБгAЯ‡%pPё@Іpѓ ŽЁэЪЁ$YzюgшЩ’жIaМиџMŸ>}ЧŽMMMEEEЙЙЙcЦŒсжxўљч}||JJJ._О|тФ‰хЫ—BЮž=Ы•}юЙчьsцЬЃб—––&ИNZZкцЭ›ЋЋЋпmllмЙsgзЎ]љ ›ššіьйгЋW/ёЃ›L&ƒСPZZ:sцЬ… B<Ші5›ыЭd2нО}ЛЄЄdжЌYЩЩЩUUU%%%ГgЯf7$„Ь;зh4мКuЋММ|Щ’%f‡kjjњф“OЦŸ””ДsчЮццf›‰Иm7I _<Р&4ЎƒЏf  єє3аі™HUВЪ№џїъ>јрƒБББп|ѓЭПўѕЏ””___vљН{їіяпџќ# ,,ьwойБcЗёЮ;ПџўћЌЌ,›‡ILLlлЖ­ЯМyѓNž<)ИNЧŽGŽ™‘‘aЖМЁЁ!(((44єјёу›6mт/lгІЭкЕkmР0Ь‚ МННЧсТ›+џѕЏeW.**т^Гжее}ќёЧЋV­вщtцЕз^лН{ЗйО§ілЦЦЦ!C†$&&оЛwя№сУ"‰%0Џ.и пEђѓѓCCC­НkэЏŽј§у:ŽХFœžй_,Еrofћtl[ Ъ\ЖЏОр,Д]9”$KЯ§ =™‚тQв:)ŒїjЦŒ[ЗnнКu+њ…ђђr•JеО}{іŸбббЗoпf__Мx1--эѓЯ?зщt6“••Ћзы‡zяо=kЋНђЪ+ЋWЏ6™Lќ…~~~FЃбh4?~М{їюќ…ƒЁ_П~}є‘јб§ќќи лДicЖsС•ѕz=!Фзз7 €}ЭЮДPVVvџў§nнК%&&VVVšэaћіэЯ<ѓŒZ­іѕѕ=zєіэлEŒьОxdgg0@Їг:єРжж4ыFфRЪš0a‚+žŒj'OŽMcвuњ3`эчЦC+’ь AЇ (=?Цаі™HUВЪ ц^%%%§љЯŽŽŽюгЇO^^Л0,,ЌЙЙЙИȘэи-,,lзЎ!ЄККzќјё+WЎ|ф‘GlУh4Ю™3чаЁCƒ њљчŸlmЭюнЛїьй“?XœNЇ[ЕjU|||ZZšЏЏocccssГ——WyyЙј†7@ЁЁЁ>>>EEEFp…ššš}ћіy{{џћпџ&„джжB6lирис@1kй  +UPё9џўїПSSS?њшЃ'Ÿ|’a˜У‡џ§ї#GŽДssvЊ%—Fш0OŽХ=J—НгcЅ{ыж-wЧ 8†Ж+‡’|щЙŸЁ'SP<\ЦrєcuЕZэwп}їщЇŸђпжh4cЦŒYДhQ]]]EEХлoП=iв$BШsЯ=—˜˜8yђd{Ža2™šššBBBL&гЊUЋФW~ѕеWзЏ_o]ЛvэгЇOVVVddЄVЋнЗoŸЩdZЛv­јVСССьќЙіˆЅбhRRR^~љevˆnqqёЁC‡ј+ьнЛ7((шъеЋПќђЫ/ПќrѕъU6Њ–Рщф5Атѕз__Йrх№сУНННеjѕ“O>ЙbХ і-Ы'—š=еroќсœт>5 ЃGжjЕqqqп}їx7nŒŠŠ ˆˆˆXЙrЅЋckQxUUUгІM  œ2e ЛацlYтв в2MГgеВУлЂ2ЗYТ‚‰ƒ§феPШ :M@шСJлg"UЩ*ƒџ§ћїјс‡ЭжиМysmmmDDD\\\П~§вгг !ŸўyVVїЧƒтЧOOOякЕkЯž=ХW№Р<№РЌYГ>ўју”ѓъ€PёY•••gЯžЕ62зђЩЅ"ЯAЕgsўЛЉЉЉхххЧчІQd0цЮЛgЯžккк+WЎ$&&К:Ж…—ššZ___XXh0цЭ›Ч.ДчЖ,‘Gщ i–ІхГjY‚сЕ?)СЃ›Z0qm_}СYhЛr(I–žћz2ХЃЄuR@ЮЄМŒ[s,T7P iД‚‚ЕZЭ§322RЏзЗmл–a˜ккZŸттbі­SЇNuщвхкЕk~~~мњзЎ]#„ўЯчŸЮ­ ОyMMЗЗwQQћnvvЖFЃБdUU•ППџЖmлЊЋЋй%.­Eс™­i)77З]Лvl<ьў-_ 2фыЏП~яНїцЮ{эк5іX‚AђЗтrЌЊЊbцмЙsСССжт‹‹kQ™ЗДˆЈті› Чp{иђЂШтRdRжP•,(ЎdEТ9•ЎўпМКђхљ“9›ччN‡ŠЯ nllЌЊЊbazыж­МММ^Нzо“Kй5†ёѓѓГмћRюŸм3Ф7З|NЌH:nяоНџќч?чЭ›зЃG>ј ""ТuБЕ(<Г59YYY+VЌ(--%v\fьЃtЯž=ЛsчNnЁ§хoљЌZСЧ№ЖЈЬ[ZD %4\ркЎJђЅч~†žLAёpЫ‘—эUd‚ЖПоh)Е“={і}КKckQxfkВииnйВЅВВђШ‘#6ян“’’rrrќќќњєщc3H{вфУЫХпЎ]Л•ЙЭLZDF €ь г”?ZPйhћLЄ*Ye@ЏЎЈ(f­4Є? т‹ŠžKр тsо}їнДДДoОљІЉЉЉЙЙљчŸf— >Йдўч Š?јTЃбŒ=š{NьВeЫИЗјЯ4c•””8p ОО^­VыtКццf—Ц&žel&))iС‚еее'Ož$-|€-Бў(]С эIS№1Мі'eэшќC &в№Ь{0№|Д]9”$KЯ§ =™‚тQв:) zuA™hЛ;А‡МОxŒ5*++ыэЗп jлЖэкЕkwьиСОeљфв=UќСЇ™™™ƒ!,,lа A“'Oц–пКuЋoпОќ5›šš–-[Ўеj333ЗmлцъиЌ…g!$##УллЛcЧŽaaaызЏ'-|€-K№QК‚Aк™ІрcxэOJ№шf‡ЖLШ.p mW%љвs?COІ xИŒхШЫн€Dшy`18 €ы г”aJ.fк>ЉJV0V@ юWdd жР1Д]9˜WWaшЩ]Кr„^]Zр‹脆РuаiЪ@Я14фШG[О €^])`^]А*>Ш.p mW%љвs?COІ xИŒхѓъа‚ЖЉСРh(\&  ˜WWЉЈJV0V@ ˜Wь„Š2…kркЎЬЋЋ0єd Ї.]9BЏ.-№ХlBCр:ш4e чЧrфЃ-_@Џ.€0Џ.и d 8†Ж+‡’|щЙŸЁ'SP<\Цr„yuhAлд`р4ЎƒNPЬЋЋTT%Ћ Ћ ЬЋ vBХ™Т€5p mWцеUz2ХC—ЎЁW€јт6ЁЁptš€2аѓc 9ђб–Џ W@ ˜Wь„Š2…† Cл•CIОємЯа“)(.c9ТМК o%%%*•ъдЉSюDи{яНїШ#8wŸ6lhпОНр[kжЌ‰ŠŠrюсœN$~"“ф‹ЖЉСРh(\&  ˜WWЉЈJVаЋ Ч> ”њa9uъд>}њ8kogЮœQЋеwяоUY1tшPv[QQ1ўќ|аззWЃбєшбуяџЛћyщЅ—~јс›Ћ­ZЕ*::кЮ}цццўюwПkщ[|ЩЩЩ vЮ/М№BttДZ­nлЖэГЯ>{ўќy;ƒœ1cЦйГg>t‹Jв3)Ет€тбіеœ…Ж+‡’dщЙŸЁ'SP+**њѕыwюмЙЭ›7чччŸz‹J’Bјт6ЁЁptš€2аѓc mŸ‰T%Ћ ше‚cŠќАЌЌЌќѕз_Й^]Ѓб˜––эууѓРМљц›ьђвввйГgЗoпоззЗwяо‡ціŸŸ?vьXFЙuыVЖ‹апп?т.^М8`РюŸ"{[НzuŸ>}4ППџ AƒЮ;GЩШШ(--§ъЋЏžxт‰:tяо§Х_œ;w.З•`иѕѕѕ>>>™™™ЩЩЩ:nЦŒь’oОљ†b2™|}}зЏ_?yђdЖЋї•W^!„0 ЃзыwэкЕkз.іŒWTTX ŒнЯХ‹лЕk7qтDNўўћяГoезз_О|™ы0Е–ѕ;w И^]kzшЁ‡вггЙ”ЛuыЖxёbё­~љх—фффљѓчійgC‡эаЁC||ќО}ћєz§ЛяО+?{џЯ?џмцe`y ЬJвОыб)Вт hћъ ЮBл•CIВємЯа“)(%­“Т W$•››Ы0 лЋk0Юž=Лuыжќќќ;wvщв…RZZњиc577чфф\КtiШ!cЦŒaћ:‹‹‹ tђфЩ|јс‡‡цќ,***))сDй!ЄЁЁсŸџќч•+WŽ?оІM›щгЇBnпОнддtэк5СЌ…}іьйЦЦЦП§эo&LИtщвђхЫй%lxчЯŸПџў?џљЯQЃF;wюЭ7п|џ§їїэлGљљчŸU*еЎ]ЛJJJJKKCCC­FЙpс‚ЩdZЗnнФ‰/\И№вK/НђЪ+‡"„œ;wŽ;œHжЙЙЙ„ЎˆЌЈgЯž.\рВоИqунЛwЙ~^k[Э›7Џ[ЗnK–,с—˜ППBBТ™3gФу'„\КtЉЁЁСf жNП$эЙ)„/` зAЇ (=?Цаі™HUВ С€}ZSeмUн<АšЏXБЂM›6 УLš4ЉOŸ>ѕѕѕfы$%%M:•ћgSS“ЯW_}ХОѕф“Oro}ђЩ'„уЧsKи~в‚‚{іfцГЯ>гjЕ У\Кt)66–—ššКџўІІ&n5kaЏ_П^ЅR8q‚П$22’}™™Iљс‡ИwzшЁПўѕЏ У?~œRQQaЅЬў/0†a6mкфххuцЬіŸЭЭЭ:tXМx1У06lˆˆˆА™ѕђхЫ5 ?#СНѕж[;wf_ЦаааM›6‰‡wљђeBHVV–х:ЃFzф‘GФуgfыж­ССС6SАv l–Єsy`§ВЩ)1Ы1q8Ћn:МЧ6D“в"Š,.E&%‚ЊdфŽЊŠЊdхŽ;Yъжѕ ДЬЉSЇzїюэээ]VVЖkзЎ§ћїћљљёW(++лЛwЏЏЏяоН{Й…їяп(//пЛwoNNЗ\Џз{yyѕъе‹[rњєщааPюyY"{#„”””ЌXБтрСƒЅЅЅїяпoll|шЁ‡!нКuЛrхЪщгЇ9’=fܘqуЦБгX ›rцЬ™ђ'uхO ЫОЫFY`` ЏЏ/ћVЇNкЖmЫНe-0BHnnюO<бЛwoіŸ*•*$$„нї2ёЌњщЇоН{{yy‰ЈgЯž7nмИwяžFЃyїнw###gЮœ)ощгЇ !–гк655:ujФˆтёB~ўљgі-‘ФOYI‚†ŽQаh(\ур@и+™†Я rфЃ-_@Џ.€kљayњєщqуЦB~љх—ццц˜­№Ы/П0 ѓЫ/Пx{{ѓ—GEE9rЄЙЙ™џЄЕќ166VЃбpKЬž&В7ЃбиПџž={~№С:uђѓѓ›={v‡иT*Uџў§ћїяџъЋЏЮš5+++ЋВВ200аZи„3gЮ >мlЩЈQЃИзфоЊЎЎОxётkЏНFЩЭЭэгЇї–x`gЮœљ§яЯ­\UUuхЪ6х3gЮŒ9R{і,{њDRАv ,K,с‹脆РuPГ@шЙ’iћLTЉTє$Ћ xZ€›d?aŠ2АЁЯіъ0 00pюмЙчЯŸПyѓцў§ћй)q2uъдмммЂЂЂŸ~њщНїоћх—_и §ќќ^}ѕеызЏŸ8qbќјёќGЅ ў`^‘НщѕњІІІ?ўјцЭ›_|ёХИqуL&SŸ>}fܘБ|љђŸ~њЉЈЈшьйГ .мЖmл{яНЧЕ6ћ0ў@Qv л“{љђхККК|ћэЗ7nмXЙrх;яМГiг&BH}}}^^о­[ЗЪЫЫE#„\КtЉЎЎюЋЏО:rфШoП§ЖrхЪЅK—nйВХЧЧ‡=["Yѓ•&r BˆJЅъбЃGVVжў§ћџёpy‰lеЋWЏфффW^yeлЖm………WЏ^§№У{ьБ„„„ŒŒ ёј !зЏ_ЏЊЊbKL$kЇРВ$eJy(Aл#eРYhЛr(I–žћz2ХЃЄuRчЯй  P­Љ2юЊnžVЭп|ѓЭРРРццfіŸ'Nœ8p ПППŸŸ_яоН>Ь.gџH_ЃбЈеъшшшЉSЇFі­]ЛvuьибЯЯoрР_§5!фаЁCмўwэкE)**тдкоšššцЭ›Їбhєz}rrrffІ——WuuѕћяПŸфхх2bФˆœœўУоМysлЖmљЋё—lлЖ-<<ќрСƒ111ООО}ћі=x№ ЗцЇŸ~ЉRЉDcfыж­!!!‡Ž‹‹ѓѕѕч Э,kY/[ЖŒ;"bН№Т „ №ѓпЪd2НћюЛБББ>>>AAAO<ёФіэлЙ3.?У0ЛwяжjЕмcмD.kWŽYIКšЇе/ЩP›8€‡s{нt,З‡-/Š,.E&e UЩ‚‚сJV$œSсъ WиKњ?Оh§iћƒ5ўќK—.ШЌchЛr(љgrdб“)(КtхНКДРА €ы г”žchШ‘Ж|НКRРМК`'T|)4\ркЎJђЅч~†žLAёpЫце mSƒ€аPИ:M@0ЏЎRQ•Ќ2`Ќ.€0Џ.и d жР1Д]9˜WWaшЩ]Кr„^]Zр‹脆РuаiЪ@Я14фШG[О €^])`^]А*>Ш.p mW%љвs?COІ xИŒхѓъа‚ЖЉСРh(\&  ˜WWЉЈJV0V@ ˜Wь„Š2…kркЎЬЋЋ0єd Ї.]9BЏ.-№ХlBCр:ш4e чЧrфЃ-_@Џ.€0Џ.и d 8†Ж+‡’|щЙŸЁ'SP<\Цr„yuhAлд`р4ЎƒNPЬЋЋTT%Ћ Ћ ЬЋ vBХ™Т€5p mWцеUz2ХC—ЎЁW€јт6ЁЁptš€2аѓc 9ђб–Џ W@ ˜Wь„Š2…† Cл•CIОємЯа“)(.c9ТМКД mj0p зAЇ (цеU*Њ’UŒеце;Ёт€LaР8†Ж+ѓъ* =™‚тЁKWŽаЋ @ |ё›аPИ:M@шљ1††љhЫWаЋ ЬЋ vBХ™BУŽЁэЪЁ$_zюgшЩ—Бa^]Zа658 €ы г”ѓъ*UЩ*zuЄри‡=–.???44дБmѓђђќ§§GiMиђb-гММ<­V+}<­„Š2EлW_pкЎJ’Ѕч~†žLAё(iНКдЩЫЫSЉTZ­6  oпО?џќГЛ#2чъžP{іЯ_чСЌЈЈp]>ўљчŸїёё)))Й|љђ‰'–/_ЮЎ xšФЯЌeЈжВ&„зђм‰АL?%%eпО}&“‰-ŠcЧŽ7ЮjVўхххЧпО}ЛHњ‹žЛdPкОњ‚ГаvхP’,=ї3єd ŠGIыЄ4 иЇ5UЦ]еM№ИзЎ]#„њјј„„„мИqƒ]^[[ыууS\\ЬўѓдЉS]КtaW.**bцффtэк•]xчЮ‘ ЋЊЊќ§§ЗmлV]]msџUUU Уœ;w.88˜аЯЯ иrWжфццЖkзЮlЁхцfћмœПїКІІЦлл›+ K–+‹;elж’§ђЫ/'L˜`ЖџьььИИ8цчдђ4Б‡,yС\Ќ•ŒрqЯ={у—sяоНїяпЯ0LFFЦШ‘#EжфˆœPЫ85`њ–Q9€кQj№pnЏ›ŽріАхХНХхЊoЄ.†L‘/…™КšЧ­s*#\ФX])№+ž§\:ЏЎбh4 §њѕcлBЪЪЪюпПп­[З      ФФФЪЪJBˆZ­nпО=ЛNЇNJKKй=‹lЈгщіюнЛ}ћіШШШAƒ>>555f+о аoОљ†ЄЩƒ)И!Чd2}№СqqqжіЯЋбh†ЩЫЫуЩэŠП№юнЛjЕњшбЃЭЭЭЙЙЙьФ#сяпкцќuœ2VW}ВВВ!&%%хх—_fG2:tˆЂRЉвггыъъ У’%K&OžlЖС KJJ8P__ЏVЋu:]ssГЕ§[ 6™Lм(TЫ]ёW6™LMMM!!!&“iеЊU–{ГмœПk››ХРeš””Д`С‚ъъъЦЦFЫaП"+Ш26СdЏ^НЊзыxрF3fܘE‹еееUTTМ§іл“&Mbw%ršK^0TСЌй=X;ЎЌ•sttєУ?€+`€gr[ЯSЫ!Sф -‚^]кЭ™3gэкЕlзиЦеjuLLŒNЇ6lиЅK—!ООО БББ;w~ф‘G-ZdЙЫ ›šš–-[Ўеj333Зmлfmџ–BBB^zщЅиии   ›7o юŠžžžпЕkзž={ZюЭrsўўыыы77‹[ž‘‘сээнБcЧАААѕыз[Юк ‚qZЦ&˜lvvі№сУйM6oо\[[зЏ_ПєєtvЙјi,yЫP­e-r\qмз{‘г”’’rшаЁ””›kZ+4ўЛ™™™ƒ!,,lа A\зЖ`њљљљЁЁЁіdЁ$ИЉ›аPШ‚ 7mvbћЇЄЌ2­?bыї——зН{їњњz‡ї­7|ј№E‹ :ДE[]Лv­WЏ^т3Лд… †ZQQсЎ\ЭEm‚єMMKy~„t’iн”iиютот’нЩr8`z2uЪцвУ™•rУЩ•fsщЩ.`Ч•'ЦъxК'žxbрР-нъТ… QQQЎˆЧN999=zєpc`  6ЁЁЕЛ ‚c?Lс‡,`НњъЋ-нdнКuoНѕжЦ]=fЮœyфШ‘;wК+љBХ™Т0)a{ЕцЛŠЛОчрћ€ыP[ПЈMРУЙНn:€лУ–ЬРа"јSni6—ЮЌ”{NЎ4›KOv{8Ў<1V@ ђъ 7BХ™BУ %ЬЋ @ L— 6ЁЁєъHСБ/H Уа<ь%//ЯпппнQИжЈQЃŽ=ъєLѓѓѓCCC­НkэpyyyZ­–}‘‘Бxёb'†іЃМт€|Ё;@Jше б™3gЌбhєz}Яž=їяп/йЁ%ыЋЭЫЫSЉTZ­VЃбФЧЧŸ?ое‡ki^ЇOŸЎЈЈXQQбš}ޘ1cЧŽwюмielФЂd$>/–P]Ц` Y@Џ.€ћ‚фЂ1/јУ&Mšd4яоНЛiгІрр`ЇХкЁЅ9ЫЯЯЏІІІЊЊ*11qіьй.ФnкДiвЄIN9:›)ыГЯ>sЪŸ~њщ;vД~W‚;Зv^ШџЧоЧ5uЌџŸaK‹€(‚дЪтОЂUpik­KећТ­ЎXыRЋЖЕЖъѕvёz+Х~o+жК/екккZ­жЊзЊе UŒ   Ђ‚Ќ@фќў˜_Я+%ЩIHТ 'љМџJЮ2ч™™Ь!y˜L,н5<Пф,“н@ рВКvЇЈЈЈЌЌlўќљbБиббqР€C† бœЯЈљM|К}ЧŽССС2™lбЂEѕѕѕ:7ву>|8eЪOOO__пЗоzЋЁЁМyѓц   йГg9ВЎЎŽЮ*ЭЯЯпЖm[ppАЛЛ{@@Р† ДЃнДi“ŸŸ_pp№ЅK—ш–­[ЗvьиQ"‘ <8//nф(ЧббqъдЉйййM"сˆVgеjjj.\шыыыээ=ўќКК:ЭЛtщЂYЏИИИииX6†_|qЯž=MЊvъдЉсУ‡sдд„ЪjіšОА5ЌЈЈ7nœT* ?sцŒцЎaУ†ЭN,•H$K–,9tшPMMMvvіˆ#Д/]QQQRR2wюм•+WвЁЁЁЉЉЉJЅ2<<|йВe„ŠŠ Žr8б$ŽhuVmЩ’%JЅђюнЛNJJ kЪ0ЬњѕыKKKU*етХ‹Ÿ{ю9ўм0ДzЯђЦќ€эЇЪіSS‹œЮ?СмЪБэ‰ЙК|аxЦkЙ9/;vмКuknnnIIIpp№œ9s8vrrjпО={bII‰О …B$БлCBBш\`Kїzxx>|xџў§бббЩЩЩMpqqё№№ „ИЙЙЉT*КqЯž=aaa2™lј№с?ц(ЧХХEЉT*•ЪФФФюнЛ7‰D_Д:ЋVVVV__пЅK/////Џ#FTVVrT2sцЬB80cЦŒ&{===Ÿcц&ћћћгo_бw;;wЖjШ&2r6!DЁPФЧЧЏ_ПоjБšЭјЪк#SиGŽYП~§сУ‡ЋЋЋ=ПоШњВЩњuыж;жjс‚.Шъ^s?DЙИИмИq#::кннНSЇN_~љЅЃЃучŸ>oоМаааjяььљ$..ЎММ\$•––jY^^ўвK/-YВ„Я€yЎщйГg аииhђ[YѓЖH•ЉleeхѕызщBjІ§шŸ™[Њs Аwя^†aЦwсТ… &ќўћя УtщвхЧdFЉT:88lмИ1$$Фззї•W^1эB­dиЌ/Ћ  @*•>~ќиКХЖ'цъи|љБUйМyѓьйГєоi?>tшP>C2вТ… ууущуїпвЄIкЧмИqƒNŒ-,,\ГfЭФ‰y б ћХ†ссF<№ѕѕ џќѓЯщ*...O?§єW_}Ѕ95ЌЖЖ–ў„lmmmmm­еb515§ч?џљјёуM›6Y/L‹1~v›6m>ќ№УяПџоZЁšЩ`MU*е’%KЖnнjя9щV™LжН{w‘HдЎ]ЛИИ8ыlƒЋІќљчŸjЕ:///33ѓж­[Ц/4з:ПJЬЁC‡Fэююn­PA'Сп_јС~МёШШ+ъŒVчvрMEE…ЛЛ{zzњђхЫ­KKyј№сјёуЅRiЯž={їю§о{яY;"Уб/šџ}М§€f2dHYYйрСƒщгЈЈЈВВ2Э$‚››[Зnн?~ьцццццfЅ0-Р`MзЏ_ўќyOOOЉT`Ѕ0-#::њіэлGŽ‰ŠŠ"„єыз/55ѕтХ‹:W_eFИ7 ƒ5ЭЯЯЇПЭ0hа њ­vjVЗ СЖT*‰Dqqqnnn>>>kжЌБvШf1ў?1‡Тђ ­Œ!м7фЏп"ЫЂЗ;_v[q€VЮъcгДЌЖАXЗЙзY&l?5ЕШщMtщвхсУ‡лЗoџЧ?ўA‰ŽŽЮЩЩљПџћПйГgBшВ]O=ѕ”BЁˆ кО};oѓYгЦЦF…BAМwяо№сУM˜rn~Р–Њ2we !/^ (..ž9sцйГgyиR5-//їїїџЯўѓчŸўїПџ­ЋЋ ™9sІRЉмЙs'=ІC‡999єПMrЙ<22в„ Е’akL} !EEEсссЅЅЅ&ЯеmVР„Ы—/{yyйРFуЯ5лž˜Ћ `Ц СyEƒ1€€`ВїлАмs“i~S"‘tыж­cЧŽŸ}і™ѕ"5wMўтыыkН0-Ур”ѓ?ўјЃOŸ>RЉДwяо4]%PЦЌš2wюмїпПЎЎЎВВrэкЕж жŒЉ/!фЧ5joЫ/мКuыж­[ ЖБбјsM€ЙКЦтџŸіF^Q;Фž"И‰вBуЋE‡­E Ч uВдифyŒу–в,˜Ћл,VŸєЧ›V2щ7шY>KрYkшм ьмЙГДД”.AАrхЪO>љфЮ;:uЂдзз/[ЖьЛяОkhh˜0aТО}ћLИJыЖыK:tш’%KІL™bђUš0=XЁPhўGDИ?зxl{"Ћ `,sю›<ЄiЈ&—рИюK/НДbХ ЫўTW^^о€ЪЫЫuюЭЭЭэоНЛі7rss{їю§шб#BШіэлянЛїёЧ[0*ЁАl№ањ с‡9WзЌІ9ї.™ Ћ `гЌžеХ <@VЗYZCzˆ­'=Фє,Ÿ%№ ЫЯщќ\Р­V`А5ЭњкЃ\.///on177зееUѓЉH$’ўeђфЩ:uв—F4вœ9sОљц›‡šSH“Pй8%ЩРЏ_ПnfсЭКК‘šл#ъ hРšKPеееЕiгF*•rŸем†…&№§h07 A@V€І}@2ryM пЙsчДiгš6—Gљс‡,Rр‹/ОјЭ7п˜_T“b=zTUU5bФˆ 4йkўZ6цh~Ѕ/XЮЮЮххх7oоЄO=ъччзBзL„ IDATЌЋ …t0ŸеАGЇN>|8ћДЌЌlܘ1RЉ4<<|ћіэtОdMMЭТ… }}}НННчЯŸ_WW7rфШКК::4??_ЛXЭЉ”кЇkYQQ1nм8zХ3gЮhю6lиЩ“'9‚пЖm[ppАЛЛ{@@Р† ŒеббqъдЉйййlЈ›7o ЂПмњ№сУ)SІxzzњњњОѕж[ є˜;vЫdВE‹еззыЋšf]КtбМz\\\ll,џ‹/ОИgЯŽ1Й‚ќї!dгІM~~~ССС—.]Ђ[ЖnнкБcG‰D2x№рММ<}•‰DГgЯоЛw/=рЫ/Пœ3gŽfЩЦдZћъDWWrWгЎ“2FZРЮс& Шъ№СДH-4чEЉT„……Б[цЭ›чыыЋP(’’’О§і[КqЩ’%JЅђюнЛ}Z"‘дддˆХbvу•+W:wюœ““уттТž˜““CёќЫ?ўШР}њЃG що“'OJ$ЖиЌЌ,ЉTЊЏFUUUЎЎЎћіэЋЎЎІ[ †ЊgTTдѕызй>dЁIHсссєvуЉSЇ"""t^ЎIMŠa˜!C†|џ§ї УlмИqтФ‰=bB­еєЂUUU Уdddx{{79 %%ЅmлЖ:+Х0lиА_~љ%..nЩ’%999ьеьVэЋыьJюjšЬVџŒ|Ћ`Ћ:ЋMгАzиТbнц\g™А§дд"Їѓ=Ыg б,ГККкЫЫK_№‡ўьГЯ–.]кЃGO?§4 Р`ЈMтd7z{{ы ЉДД”тффФnьиБcII Gе4 lbцЬ™˜ѕѓѓSЋе4G)(( „јњњŠХтТТBЅRЉT*+++ЫЪЪŒЯ^щ<ныччЧ0LQQ}zџў}ЭsГГГ{єшСQјшбЃ§ѕзђђђ˜˜˜ииX3CeCRЋеš!Еmл–вааРnЬЯЯoлЖ-wе(эЋOž<љмЙsЉЉЉЗoп3fL“НMzФВlбОаІT*.\И{їюЪЪЪѓчЯГŸ№›TŠ=~вЄIЇNrqqщзЏŸСАЉЕЮЎфЎ& п­Аь‚€Ќ.ZеКК„бЃG_Иp>–H$/НєвЊUЋž!Ћ `цЯŸЯў*!dчЮЅЅЅ~~~QQQ“&Mrrr"„lлЖЭЩЩ)44дУУуйgŸЭЬЬєёёYМxqXX˜——W~~>ї%ДOзмЛcЧŽŠŠ ??ПшшшщгЇГлыъъN:5cЦ BШƒњїяпЄиЦЦЦuыжљћћKЅв;vьлЗЯќPЉ]Лvед䄇‡GFFЎ^НšтььaЎ.€БЬљчRЫ§cŠћЛвј‡@ЫБлёeЗhхЌ>6M Ръa цъ6 &§ёs:џаГ|–Р3t.?ЇѓOpЗrl{:Y;ЛРO.7J€ …иЬ=ЗUшYАШъ4џoš{EЄ„@мР м(€2bЖ = 6/cА7XWР6qЌm———чыыk‘ЋфццКККZЄ(cЎ%•JљЙ€aY[(ЌЋ 6ƒ&k7›XЛ‹Ldэf€ж sušЧД?ЋќЌЋЋ‰^KчоN:•——[<л››лН{їккZЋа№С ТєСkУ"DЂVїл6­-j…=ЫВ‡ЙЕкЦoQіаГР suј`кYM›ѓ‚џшЖ„††k‡і“н@ №Lf?јьЇІ”§дз~jjŸаПаj!Ћ `;Œќ4Х.›@lкДЩЯЯ/88јвЅKє€>њш•W^a5jдЎ]Л!>œ2eŠЇЇЇЏЏя[oНе$бЙeЫ–ž={–––ждд,\Иазззлл{ўќљuuuMиКukЧŽ%ЩрСƒѓђђ8"ЉЈЈ7nœT* ?sцŒЮъTUUЭž=ллллггsцЬ™:удWўЖmл‚ƒƒннн6lи@9rd]]T*•JЅчЮsuuнМysPPаьйГ5—›а\B;ЭBђѓѓ іo2ƒpЃžйсыЭNЊl'едд Ћмr+BДDЩM.бJДТn%-жў-Z8гЪzж6 Ћ Р‡–žukђ-RЅRUTT”””Ь;wхЪ•tудЉSњщ'•JEЉЈЈИxёbLL !dоМybБИИИ8++ывЅKќ1[Юџћп;wž;wЎmлЖK–,Q*•wяо}№рBЁXЛvm“‹†††ІІІ*•Ъ№№№eЫ–qD2ў|OOO…B‘˜˜Иџ~U˜?~mmэ§ћї+**–.]Њ/Nэђ+**–,YrшаЁšššььь#FBNŸ>эттђшбЃGЋTЊмммМММ/ПќR_jаЄцw и5МуB:Ьa/{ЈЃ6{ЈЕ=дQ›НекъkuДA-—ƒА1ц k 7зЭЩЩqqqЁ!UUU Уdddx{{ГЧєщгчиБc УlпО}ܘ1 У‰лOMєЌMГЋњкUe…Žэ&ЬерƒцР3s^\\\<<<!nnntr.ѕђЫ/к˜ “н@ L{ЗРВэ?Ж];nЖ]wлЎ7{ЋЛmззЖkgУеІL™ђѓЯ?пЛw/99yТ„ „???ЕZ]TTDИџ~лЖm !NNN'Ož|ѓЭ7/\И@ёѕѕ‹Х………JЅRЉTVVV–••i–ЌT*.\И{їюЪЪЪѓчЯs|ќѓѓѓcFѓŠсˆSЇбЃGџњыЏххх111БББ„ѓ™ГГsCCƒZ­&„( }p`]H€AИQoьќ•fУеЗсЊУ†ЋoУUгЩоъЋЩžы.,Шъ№ЁЅзеЕИЎ]ЛОњъЋ#GŽ”Щd„‰D2~ќјUЋV=yђЄММ|Эš5гІMЃ0рћяПŸ:uЊ\.—H$SЇN}ћэЗщнЂЂЂsчЮi–ЌRЉ}||T*UBBG ‰dмИqьз­[Їѓ˜I“&-_ОМКККЁЁ!99™#Ю&Š‹‹Oœ8Q[[ыфффссAгЕооо*•ŠNяm"00P*•в‡Пјт }p`&Л€@! цГе—­жЫxЖкЖZ/уй[ иU}эЊВТ…Ќ.ш6uъдsчЮM:•нВkзЎššš€€€№№№ШШШеЋWГЛ† Жwяо &мИqcлЖmNNNЁЁЁЯ>ћlffІfБўўўЋWЏ8p`DDDЏ^НИcиБcGEE…ŸŸ_ttєєщгuГ}ћvGGЧ   ??П-[ЖpЧЉЉББqнКuўўўRЉtЧŽћіэ#„јјј,^М8,,ЬЫЫ+??_ѓxGGЧЯ?џ|оМyЁЁЁф@ГѓчЯћњњrW€7H€AИQ?/ 6к6YЉцВЩFАЩJqАЋњкUemŒoкŒDяt|ѓЏШЬіЃ…ЦWыЖ­?Bћ$аБ)аА­Х–š‹#‰`дЩ–zPєЌ­ВЗžЕЋњкUem{ЯqВv$Р{јШfТјСОЦ№’Г1š]‰ЮЕ%і6fэЊОvUYƒЌ.LЛ9тf `‡0№@ №Q€OШъи d[Р м(Y]>˜і s^ь>n\|rАvР‘H„ŸИnИQцъ№ыъ€‘0№@ №U>!Ћ `/mƒpЃduј€uuРHј PИq№ ыъи ,— сF ˜Ћ РЌЋ FТРТW ј„Ќ.€Н@Ж Т@ерже#aр€@сЦР'ЌЋ `/А\&„€ `Ў.АЎ.  _5рВКій07 A@V€XWŒ„…WызšзжhЭБYœ]U–иS}эЇІФЮ*KьЌОvUйжІЙяІАЎ.€НРr™`n‚€ЙК|РКК`$ |(|е@(аG­iџSGVР^р“<„€ Ћ РЌЋ FТРТ €OXWР^`ЙL07 AР\]>`]]0>ОjР'duьВ-`n‚€Ќ.АЎ.  7.>a]]{х2Р м(suј€uuРHј PјЊŸеАШЖ€AИQV`рУ0&|FТW ь>”iяvZШІM›‚ƒƒЭ)!..Ў[Зn–ŠРтеАH€AИQ€€Ьš5KєooяйГgWWWг])))}ћі5Ї№Х‹'%%ЦшбЃ57~џ§ї40…BaNќШЭЭ}§ѕзCCCннн=<<†њх—_ЊеjkЧ\ерƒi0чРaр€@! ќ“ЫхsцЬ)...((HHH8pрР‡~HwЅІІš™еѕєєєђђ22ŒŒŒ vKuuѕВeЫ‚ƒƒCBBќќќЬ ƒ?џќsЯž= Жnнzыж­ЄЄЄQЃF­ZЕЊООокЁduьRЦ`n •••Зoп4hP@@@‡bccћіэ›––FЉ­­ЭЪЪЂYнддT‘Htџў}іФ^Нz­[ЗŽ>О}ћі„ $I‡vяо=vьиE‹бФbёџўї?BШуЧПњъЋииXooo™LіЏ§ЋIѓцЭ+***//Ї?јрƒЮ;‡††FFFв-%%% ,hпОНГГsŸ>}~ћэ7Кa˜ 6tэкеййY*•0ріэлл7nмиЏ_?‰Dтъъ­™JжWюnмИ1uъдз^{эчŸ1bDPPPЯž=WЏ^™™щттB),,œ3gŽПППЋЋыsЯ=wыж-z"GГш žЛ#hƒямЙsЪ”)элЗџюЛяЊЊЊ/^ьчч'“Щ>њш#ƒuЁ…ьиБcЪ”)Эz-ВК|РКК`$ |(Єƒ€g))) УАr†)-- $„ddd444а])))>>>;vЄ‡ежжfffіщг‡RPPхыы+—Ы?ОiгІФФDzVzz:[BzzКZ­NHH˜4iRZZкЊUЋтттиф& ух—_ієєLOOЇWпО}ћцЭ›SRRhVЗЄЄф™gžQЋеЇNЪЬЬ6lијёуi 8!!!!!!>>>''G.—ПђЪ+tnЏОэuuuŸ}іYvvvbbЂ››[ll, ƒЃ.м,[Ж,$$ф“O>iвМmкД!„фххEFF2 sцЬ™ŒŒ WWзбЃGг9МЭЂ3xŽŽ`|ыж­sчЮMOOŠŠZДhб”)S $—Ы_§ѕ>ј ЈЈˆЛ.ДѕызOž<йbЏ3€жŒу№?dЬП"†9@ЫiЁёеЂУж"…уЦа:Yjlђ<ЦqKi3› ­ 6&>>оЩЩЉЖЖ–a˜ЊЊЊwп}зббётХ‹ УlнК5 €ЖpсТчŸž=+99™RTTФ0LLLЬ /МРюкЗo!фъеЋ УlйВ%00nпДi“ЃЃcVV}ZRRBљу?и0кДiУ0ЬАaУ>§єSЕZ=x№рwп}—N­§эЗ4iвЌYГи 566ŠХтŸў™a˜QЃFMŸ>]ЛvњЖkњс‡ЄR)}ЬQŽюнЛGљт‹/є]т…^˜0aћ4%%…-–ЃYtЯб УlйВХЩЩщж­[єщбЃG !ЧЇOГГГ !щщщuЁ…ˆDЂK—.qЗ@+дЌПбьСNцх„Р(tцгЬ ,Э=l>”iяvLvхЪ•ЦЦF:ЅєЩ“'=zє8~ќxtt4љћOЅЅЄЄ >œ=+55ЕmлЖэкЕS(?§єгЉSЇи]2™L,їшбƒќ}YоkзЎ 2$""‚>ЭЫЫ#„tюм™ Ѓџў„~§њЅЇЇяоНЛ  рУ?ььь|ј№aіZѕѕѕююю„‰'.\И0''gтФ‰111ЁЁЁєл‹‹‹уууOŸ>]RRR__паа№єгOBИыТРеЋW !QQQ:[јСƒПўњыХ‹й-žžžьcŽfбМОŽ`Ÿ:4,,Œ>Нwя^ћіэЧŽKŸцчч‹DЂюЦLMMŠŠzц™gtVРі`{ЁљЏ]pЃЁЫх3fЬHKKЛ~§њŸў™––6jд(К‹ЭЩжзз_П~§š?=‹>НvэšZ­І Y*##Ѓ[ЗnЮЮЮДіЌдддВ‡ЅЄЄБП&—Ыi!}ћіMJJZЕjUBB‚D"‘Ыхiii УЄ§]NNM@Я›7яЮ;ЏМђЪщгЇУУУїюнK‹еоЎT* pчЮO?§4111--m№рС§њѕ3XŽžљф//Џ:Œ;і›oО!„фффа]?ќ№CppА‹‹Ы Aƒ:фррššкЄ„]ЛvљјјАЅ=~ќиббёФ‰lэкЕгŽ!==’œœLŸІІІ>џќѓ‰ФЩЩ)$$dжЌYJЅ’a˜5kжDDD8;;ЛИИDFF:tˆЏs{ccувЅK%‰L&›2eЪŽ;ЊЋЋЙыТУ0*•*>>О[Зn...ЮЮЮ:uš={іѕызщоЫ—/GFFŠХbџyѓц•––l}•тшˆ&Ѕ%%%BЪЪЪшSЅR)‰Ю;Ч]—&§ ,ЭњЭ,b№=)у˜ѓ жњ§ќn @ЫБлёeЗhхЌ>6M Ръa ‹™Э…жрїеW_egg[; АЅКи‰f§fvjй €"Д\0X>n\ ,—/_~№рAdddmmэwп}їёЧ?~мкA™Ш–ъЦCVР^ e сFvЂЈЈhхЪ•љљљЎЎЎ<}њєаЁC­”‰lЉ.`<ЌР`,ЌРš„8О,Г+`,56M.+0№+0и$ЌР\№I Т@ерƒАfј€aр€@сЦР'k<‰D4k  n‚€ЙК|0mђцМи! |(|е€OШъи d[Р м(Y]>`]]0>n\|ТККіЫe€AИQ€Н‰їіііѕѕЕv цЪЫЫгY‹мм\ЉTкЂ—6x юrss]]][ .sЕкРšАxœДП„R}{†Ќ.Lћ€Ф0 ІНи |(ЄƒЬєЧŒ9вЫЫK*•FFFюпПпкй…GНџўћ)))ххх-t оzЖSЇN-W Ё03Щ[ SАduьRЦ`nVqсТ… &Ь›7ЏЌЌЌЊЊjУ† gЮœБvPvЁЌЌЬббБSЇNMЖ744XЄ|юž58ƒЕЅчи€ !Ћ Рг> aЮ €ТРB:Р+VЌXП~§”)SœЂЃЃїэлGyј№с”)S<==}}}пzы­††:ХoгІM~~~ССС—.]b йЖm[ppАЛЛ{@@Р† 4'ВљAКqѓ­р. IDATцЭўўў!!!—.]JHH№її К|љ2[TMMЭТ… }}}НННчЯŸ_WWЇ]ОfќЦkd™к[ЖnнкБcG‰D2x№рММўјcBˆJЅЊЈЈ())™;wюЪ•+щ‘K–,9tшPMMMvvіˆ#є]NЅR•––ПњъЋSІLЉЊЊ*..^А`[!dЩ’%JЅђюнЛ „TVV2 sѓцM‘HєјёcњиЧЧ‡\SS#‹‹ŠŠшг+WЎtюмYЛ|M‹5ВLюЋЄЄЄДmл–ЖŒƒƒ[кщгЇiэL‹\Г•!>дзјF6 K_Яj^FnТ^ŽзžЃ}є•ЯЖЖЮ—œОKАšЙЮНњК[_Дl‡ъЋ/ЧKBѓt}uзWlГ^šвїbг‰­i“вtоtže|‡lLЭ!fjжпhі`ЬеАšotТ€>>>•••MЖ+ ‘HдО}{њ4$$ЄДД”ттттссAqssSЉTtЏ‡‡ЧсУ‡їяпœœЌяr...2™ŒтьььюююююNГ_N/++ЋЏЏявЅ‹—————зˆ#*++ –Я]Ќ‘eъМЪž={ТТТd2й№сУ?~L[ЦССЁ]ЛvєвьЗПM‹МI-МНН9п˜4иГ„aпО}?~ьѕ#їRѕвžЃ}šЋнкDзKNп%ЬŒAч^}н­/ZювИ›N›vн9Њ`ќkƒЛ­и›‘5е'ЧY&tЈОZГCЌY]>˜і _АCј PH˜ЬУУ#22ђ№сУMЖћљљЉеъЂЂ"њєў§ћmлЖх(gєшбПўњkyyyLLLllЌГГsCCƒZ­&„( ууёѕѕ‹Х………JЅRЉTVVV–••i—пЌ:_f“-JЅrсТ…ЛwяЎЌЌ<ў<НЯа–)))Ё…X<ђц6ОNњz–B#LMM•H$ЪПЙ—ЅЏ^~~~ УhOшkЭыjЗЖNњ.af :їъыnбjО‘цИ–ОІ3ц}ИСf4†ц… ОиŒя“Я2иЁЉ5XВКі)c07 Ћјф“OVЎ\yша!•JХ0ЬхЫ—чЬ™#‘HЦПjеЊ'Ož”——ЏYГfкДiњJ(..>qтDmm­“““‡‡‡Z­ ”JЅ?§є“JЅњт‹/ŒF"‘L:ѕэЗпІsёŠŠŠЮ;Ї]~Г*hd™к[T*UccЃJЅJHH`K{щЅ—hЫTTTА‹Z0ђf5>=kB9к8ъ%‘HЦЧПnн:vЛvћh–ЉГЕuвw 3cаЙW_wыŒжлл›.nЫq-ŽІг<ЃюмЭhŒ&qrПиŒя“Я2ІCЭЏ5XВК|0эцМи! |(ЄƒЬ1lиА#GŽlпОнЯЯO&“НёЦ#GŽ$„ькЕЋІІ& <<<22rѕъењJhll\ЗnПППT*нБcЧО}ћ?џќѓyѓц…††8АYёlлЖЭЩЩ)44дУУуйgŸЭЬЬд.ПЙu4ІLэ-ўўўЋWЏ8p`DDDЏ^НивvюмYZZъчч5iв$'''‹Gn|уsазГцуЎзŽ;***ќќќЂЃЃЇOŸЮnзnЭГєЕЖNњ.af :їъьnбњјј,^М8,,ЬЫЫ+??_giMзфt}uчЎ‚1š\ˆћХжЌ~1љ,ƒj~­СтDјш`$њAХД!cЮЙцАжuьнŽ/Л­8@+gѕБiZV[XЬl.Д6иЊSЇN-[Ж,++Ыкан`“šѕ7š=suј€uuРHј PјЊ№щЦtЊ`aaсš5k&Nœhэˆ ЁЛtBVР^ e сF‚№№сУёуЧKЅвž={іюнћНїоГvDа‚ан:acaа$Фёe‘˜…Xq{`ЉБir9XXР&™ЖƒSЫ­>Щ€AИQВК|ж _А" |(мИј„uuь–ЫƒpЃЬерƒi“я0чРaр€@сЋ|BVР^ лсF Шъ№ыъ€‘0№@ pурВКЖЋу…”1„…ЭУ;Cл€Ќ.АЎ.I(Ihщ`>!Ћ `Ы№Щ 4сžсFaУаЙЖY]>`]]0Rыј­96А"мјф`э€'"‘+'7м(suј€uuРHј P­џЋЖY]{l „€ Ћ РЌЋ FТРТ €OXWР^`ЙL07 AР\]>`]]0>ОjР'duь…EВ-˜Фањ™3и‘–duј€uuРHј PИq№ Y]{aС”1в7­“љГщёП%A@V€жZW_”рЅ2 ШЄ€@! Р'duьВ-`n6 џяhЕLx†Ќ.ЌЛЎ.>žД(Ы~HЦd7(мИј„Ќ.€Н@Ъ ТТцЁsZ“ч !Ћ Рk­Ћ ‚ƒ…t0ŸеАШЖ€AИQВК|АюКК ј PИq№ЩСкOD"~ИсF ˜Ћ РЌЋ FТРТW ј„Ќ.€Н@Ж Т@ерже#aр€@сЦР'ЌЋ `/А\&„€ `Ў.АЎ.  _5рцъи †apЈттb‘HtхЪkb”M›6›YH\\\Зnн,4 n‚€Ќ.Lћ€„Џ@и! |›1kжЌ~§њYЊДддT''Ї?џќSЄЧ№сУM R$-]К”нЂRЉ\]]ЗnнЊyхээ={іьъъjƒЛRRRњіэkV… YМxqRR’™…ŸрВКі)c>ЩхђШШHK•–ššкЅK—aУ†џeФˆC† aŸ=zдД :ЄVЋщ–ŒŒŒКККАЬ™3ЇИИИ   !!сР~јЁС]ЉЉЉцgu===НММЬ,L€€ Ћ Рг> aЮ €ТРЗ •••ЗoпfГКJЅrйВe!!!bБИ]Лv|№н^RRВ`С‚іэл;;;їщгчЗп~cKШЫЫ›0a‚D" мЛw/Э“КККќхцЭ›ƒ bŸzzzr”ЖqуЦ~§њI$WWзшшшŒŒ 6Шїо{ЏЂЂтТ… єHЙ\юттвГgOіz•:ФЦЦіэл7--{WmmmVVЭъІІІŠDЂћїяГ‘єъеkнКuєёэлЗi;tшА{їюБcЧ.ZДˆюЊ­­‹Хџћпџ!?vttќъЋЏbccНННe2йПўѕЏш40вС|BVР^ eЬ›””†ahVЗЂЂb№рСщщщ{їюЭЫЫ;pр@чЮ !%%%Я<ѓŒZ­>uъTffцАaУЦ_^^N)**ŠŽŽіђђJNN>qтФчŸўлoПiЮ~-,,,..юпП?Л…Ѓ4BH]]нgŸ}–˜˜шццЫљТ /Œ9ђрСƒєHЙ\оЋW/БXЬР^—a˜вввРР@ю] tWJJŠOЧŽщaЕЕЕ™™™}њє!„DEEљњњЪхђуЧoкД)11‘-0==-$==]­V'$$Lš4)--mеЊUqqq–я3ј n‚€Ќ.АЎ. п6Шхr777њc_K—.uww?yђф№сУƒ‚‚ž}іййГgгэC‡нЕkWЯž=;wюќйgŸеее]О|™ђц›ovяо}пО}нЛwяеЋзŠ+*++5WщНzѕ*!Ds…Žв!+VЌ6lXPPPџў§.\˜››KƒєёёyњщЇЇNњу?644П/!—ЫœœzєшAЉЎЎ^ЙreaaсТ… ЙwЅІІДoпž’’’BsИMјв-oНѕVŸ>}vяонЕkзоН{П§ілUUUlV755500аЯЯ>vtt}ЫЪЪььь|ј№avc}}НЛЛЛBЁ8|ј№ЉSЇиэ2™ЬССЁwяоьЙ\юыыbА4BHqqq||ќщгЇKJJъыыž~њi$э;aТ„љѓчŸ={6:::++ыwоakбиииІMBШ“'Ozєшqќјёшшhю]š?•–’’Ђљ3nЉЉЉmлЖmзЎBЁјщЇŸšдQ,г41љћЪМзЎ]2dHDD}š——зЌО€цТ@ерƒi№ РaрлЙ\CIKKSЋеƒ jr@ZZУ0iiiŽŽŽšлƒƒƒЯŸ?ЏVЋ5чс^О|9,,L"‘А[Ў^НЊЙќGiJЅrР€НzѕњєгO;vьшттВ`С‚:а щЌa™L6jдЈƒКЙЙ566jўTкŒ3>ќ№CGGЧ6mкШd2Э ъл•šš:fЬBH}}§ѕыз—-[ІyЈ{эк5ЕZ­Y…ŒŒŒnнК9;;Г…МєвKьу_|‘=2%%%((H_Ыƒ! Р'duьВ-ќ(---(( iйЦЦFBHMMц1 УxyyЕmлЖЩщѕѕѕ„?џќгЫЫ‹ЂT*wюмљмsЯisѕъUі‡ХИK;tшPqqё;whТ4'''))щ“O>б ’2uъдз_=44дУУ#<<œ­ХѓЯ?OWжЎ Ю]ѕѕѕ7nмxяНї!їяпЏЋЋыкЕ+нU]]}ьиБљѓчBшjеееоооєСЎ]Л^xсЭBшoЪЉTЊ›7ojў<кеЋW5Ѓ‹У@АЎ.АЎЎiŠ‹‹E"б•+WxЛтІM›‚ƒƒЭ,$..Ž.І ` | —ЫЩ_‹о4ШггsЩ’%зЏ_ЯЯЯ?vьиO?§D‰ŠŠђёё™5kVJJJaaсеЋWуттвввш‰...+VЌИsчЮЅK—&NœX^^ЎљSiwяо­ЈЈаœЬЫQšL&kllќњыЏѓѓѓ9ЃRЉњѕыЇ$!dмИquuu7nьзЏŸƒƒ[‹ъЋ Ю]7nмPЉT4Z™L&‰’““ !EEEгЇO///ЇsuiW­ZuчЮЫ—/7ЎИȘ]—BŸоИqЃОО^3›’’‚Ќnы„uuј„Ќ.XвЌYГ,јa;55еЩЩщЯ?џщЁЙ\cГ‚dK№ііž={vuu5нЅЙЄЩ/^œ””дм0ІNЊP(ЬМДe%$$АЋvRM‚€”1?фrЙЇЇghh(!ФЫЫыдЉSххх  [Гf +“ЩЮœ9ЃVЋ‡ 2yђфьььЇžzŠтяяџеW_%''wыжэнwп]О|yCCƒц­‰&U5—/р(mܘ1K—.}у7zєшёнwпНёЦt‰^Й\оЎ];њ›f„ЉT:vьиввRЭŸJ“ЩdьjЖM*ЈoWjjj›6m:vьH+В~§њUЋV-XА`кДi„šЋѕѓѓћњыЏ“’’Кuыіілo/]КT­VGEEiBџЧvэк5ZBHMMMVVВК- 7 А7цOьРЌŽfбœЛc‘Y5vK„џЈЩœетЌЕвџзˆˆ>|јЖmл,RкўѓŸ~јсЪ•+JЅ’n™5kV]]нїпOŸКЙЙyzzšф Aƒ>ўју†††ГgЯОњъЋoМёЦgŸ}FщйГчЄI“шз~[ZDDФаЁCзЎ]лии˜œœіђђ7nмцЭ›=<<!sцЬQ*•єЫ4ІЉЌЌЄK!<ВММќЃ>:vьиƒФbqЇNfЭšЕbХ BHBBBBBТН{їLУ|ГfЭЪЬЬLIIaЗ444ШdВїпџŸџќЇЅЎђЫ/ПќуџЈЎЎvuu5Пёl@sџ@ГЧcЎ.XLeeхэлЗйy^JЅrйВe!!!bБИ]ЛvlЊДЄЄdС‚элЗwvvюгЇЯoП§Ц–——7aТ‰DИwя^њшЎЎЎЙyѓц AƒиЇžžžЅбЏK$WWзшшшŒŒ 6HZH‡bccћіэKПЇ\[[›••E'ФЅІІŠDЂћїяГЅѕъеkнКuьглЗoгP;tшА{їюБcЧв5.kkkХbёџўї?BШуЧПњъЋииXooo™LЦ. IУ9rd@@@```LLLxxxyy9[>GНюоН#•J§ќќтууЧOзЉ4ГО2†йАaCзЎ]ЅRщ€nнК%“ЩћьГьььФФD77ЗииX6HЖX†aJKK !ьзœSRR|||ш—ˆ !ЕЕЕ™™™ьšQQQОООrЙќјёу›6mJLLЄ'ІЇЇГ…ЄЇЇЋеъ„„„I“&ЅЅЅ­ZЕ*..ŽfiC‡%„<~ќ8!!!;;ћЭ7п4XЏЂЂЂЈЈ(OOЯффф3gЮЅ_уЂMdТkCg„:7r_Z;N‹Аь@kбak‘Тёў 5м›мRšХЬцBkƒн:{і,!D.—гЇjЕ:88xцЬ™Ь_я™ †йБc‡{ж“'Oœœœ~љх†aђѓѓ}}}чЮ{ѓцЭkзЎѕъеK&“эиБƒa˜Ы—/BЪЪЪ†ЁПЎбЇOŸcЧŽнЛwf„ГГГiK—.‹ХзЎ]kžZ­ЮЭЭеœQСлЉSЇяПџ>??џў§ћХХХ;v|ѕеWгггsrrо|ѓMЉTЊP(h!ызЏ?ў|~~О\.1bDяоНйBњєщsђфЩ;wюLš4ЩЫЫыХ_мПџнЛwWЎ\)‰hнйVвќTТ0ЬмЙsУТТиЇ:ЏТ]ёТТТvэкЭž=ћњѕыiii}њєёєємИqc“ЦчЈ]“І0яЕа5ї4{<ўЈЫœїСжzЭѓucbbЬ0LiiЉƒƒУёуЧ›@ЗЛККJ4BЮž=[VVцррpњєiір_~љХССсбЃGь–§ы_ОООЦ”Ц0LQQбoМсхх%‘H\\\КvэJƒ‰Dє`‡^Нz|8{иќСОс‹‰‰™0aBNNЮѕыз—/_NЁщбцЖвЯ?џьшшXSSУ3w[эмЙгСС!222>>žЎlР0ЬчŸоБcЧ&§Ыбtбббь‘š5b&77—ІVMxmш‹PчFŽKkЧi)њŒЌ.€ЭГbVзДqKiduLcўФѓgu0 “™™F Ÿ?ўБcЧщ.экгL˜бВeЫ''Ї[ЗnбэG%„АoХщŠіщщщl+]fܘЁГUйЋpWœcюŽfуsдЎ…ffД&gutZШхђ˜˜BHZZкџkяоУ›Њђ…яДiЄЗ”ІEД9BЋъсіm‘qGр•бGЙСA}Ž0ХQ^FМ”‚(GЧшt8ЮŒ№ ryŠШEQRhкІІЅі’ІЭћЧ~й“ЩоIv’6ЭnОŸП’Нзmg­&Ћ+ызоо~їнwЛœ№еW_9ŽЏОњ*22вљxZZкО}ћкллЅ=yA8tша AƒФЉ=ббЃGЗ_№šеj9rфwмёъЋЏіызЯ`0Ь›7яІ›n љаC=џќѓ‘‘‘Н{їŽ‹‹“.<~ќј}їн'Bkkы7п|ѓф“O:WMкЪрЫ/Пloow.Щз_=x№ршшh1‘ћяП_J№g?ћ™tкБcЧRSSХ]Ž9В`Сqч—_~yЧŽ7nЬЬЬєЕ•ОњъЋєєєž={z.Г‡4A˜3gЮ„ vюмYXXј›пќfѓцЭ<ђШБcЧ\ЂЬ{nКŸџќчЮ "ТаЁCDGGпzы­№ѕНсЎ„Š=d-/gr№уhо0Pш~Ојт‹ЖЖЖоН{ ‚адд4dШП§эoтgяcЧŽI;;vьž{ю‘Ў:~ќxJJЪ 7мP]]НcЧŽ]ЛvI/ХХХEEE 2DјзaПќђЫЌЌЌŒŒ ёiiiЉ тg~AnНѕжгЇO9rdпО};wюœиДiгOњS)1і—Эfћілoї“:zєЈ8O*CšyдщtSЇN}чwклл#""МЖR}}НдJљљљуЦѓZfiŠњїяП`С‚ Œ?~яоН<ђШW_}5}њtщЏMч\гЈЈ(AФ™піііз^{-''ЇWЏ^~М7м•Pё ‡Ќхх Mкъј aрВ\иб!Ћ:D:nфШ‘#GŽ|ц™g{ьБЭ›7зееХЧЧЫWTИ,G№oE‹М<ЃFr~zЫ-ЗH­qфШ‘щгЇ‹ѓ­"qБ­ИгЎ‡\ЗФ3fLbbт/љЫcЧŽ]О|љшбЃЋV­УŒ1Т`0<ѓЬ3чЮ;x№рєщгkjjœCЅ?оbБ8 №Z\\\[[лћяП_^^ў—ПќeкДi6›mиАab!?ЪHNžїмsёёёэээтгƒŽ3ІGƒA `*?~ќјјёуFЃ^ЏяпПџ/љKЋе*ОДuыжддTƒС0fܘϟ§я‚ ьйГGJыж­Тѕ­є%юRkkk[Дh‘бhŒ‹‹›1cFAAADDФЕkзž{юЙИИ8ЉЮ6mкдЛwoщщK/Н”pгM7§тПјуџ(ТйГgЅWЗoпž––f0юОћюТТТˆˆˆуЧЛ$Вiг&ч` bXи?ўXl+“Щфœ{ssГбhќЭo~уЕ•>ќ№У›nКЩ`0dffўѕЏAj[Яev—цђхЫ322ЂЃЃ Уˆ# ЅŒnМёFN'ю•ЌОщD‡1bDTTTrrђœ9sЎ^Н*Нфы{CБ„юŠэ!kХrv §=эЂjЈО@ М‡њ‚2Єј$РцЂЕžФЯЬп}їќЅуЧ ‚pсТ‡УqѕъUN—ŸŸяp8._О,.ПнЖm›УсЈЊЊ2 >ј`IIЩСƒЧŽЋзызЏ_/ЅPVVцИЄЗДДTJџілoс…ФЧГgЯ^Еjе‘#G.]КєеW_=ѓЬ3ЏПўКјjzzњЌYГ.^М(сp.˜ЈЎЎ.11ёЇ?§щбЃG/]КtфШ‘•+WЁзФ О§ілeeeEEEЗп~Л ХХХb"RЌiёћˆУсp 0рх—_vn%i^бC=$ХCs—‹чŠ_Нzе`0ффф”””ќуџјЩO~Ђзы_yх—:zЈМ)€юЧз?ављќQдbVŠVЎ\™žžо%YяоН[„~јЁKr‡$м:ZИеа–.ьЁЬъГК€:daG€Ћ:Ч+ЏМ2zєш„„„ˆˆˆФФФ‰'юкЕK:йeE…тr_WДИ”чѓЯ?Ў‡nv8VЋUЇгIЫh\жшˆ 4wю\ёБЛ\МVмнк—:КЋ]ч­ЬB‡пГК:`ъГЫРsdƒЮЮpшаЁK—.1ЂЙЙљУ?|ёХџіЗПM˜0!ј%yљх—ѓѓѓЯ;ќЌсЌc;Zшwла/!Ю4зC5WрЎ`sбк@‡XЕjеџўяџž>}КЋ  ›№ѕДt>бвР7K–,)//ябЃЧЈQЃvяон%%9qт„Дs. пчxХ@.WutuЁ@`­. V _rКъ _Ь€ аPGыЂjЈО@ъТњјw!CŠOXЋ t‰ЂЂЂџўяџ–Vu<їмs]ЕЊ@ЗфїZ]fuŘе (м:ZИеа–.ьЁЬъГКt?ьР„4mЭшBt|ХРL]]$:Nœ5w(4ЕК@0јЗјŽ5/@Ђуа(~jLЌе \8&\xЦ@!WZZš””деЅјЬъСрп$~ „!:> цtpII‰NЇ‹ЙюішбУнЋЂ}ћіeggЧХХ™LІЉSЇ~џ§їюR6ЃFњц›oA0`@MMMpЊ ГК„ ІŒxЅ•Т`04\З}ћv5ЏюнЛwкДiO<ёDmmmEEХиБcГВВ.^МЈxm}}§„ цЭ›ŒЪјŽY] ќћ‚ФO 0DЧ QЁ?МdЩ’UЋVхффшѕњž={.^М8''gхЪ•Š'GFFцццž>}ZјзUР=zє(((HKK‹‹‹[А`AkkЋ ѓчЯOJJ2™LsчЮmii fН@xbV€pС”1ЏКы@Q__єшб3f8ЬЭЭ§ьГЯЯЗлэ|№AFF†Ыq›ЭvрР3gЮœ;wюФ‰ЋWЏaсТ…VЋѕќљѓ—.]ЊЎЎ^БbE'е@ТЌ. ьЋ @%:> ђtpKKKТuEEE^_­­­ŒŒLLLt>-99YОaЎxmRRв6nмшђЊУсXНzuЯž=ЭfѓѓЯ?џС455НџўћkзЎ5Ы–-лЖm[GWР•ОЋ ‚Dœ/ю–Ћ№t­ ƒСjЕЊ511Б­­­ЖЖжybЗЊЊ*))ЩЇ”ѕz}пО}ХЧ§њѕЛrхJUUUkkы­Зо*t8ƒСзъјŠЕК@0АЏ.•шј4*Фj7|јp—UД[Зn?~МOщиэіŠŠ ёqyyyJJJRRRTTдхЫ—­VЋеj­ЋЋЋЊЊъАrИСЌ.с‚)c^uуbЭš5yyy………vЛНЉЉiнКu………Ы–-ѓ)N———зддdБXVЌX1sцLЃб˜››ћдSOеее ‚PQQБgЯžЮЉР?1Ћ ћъP‰ŽпUJKKх?ФіOIII=:$Љ “Jю\…Ћ„ж$‹’’’˜˜˜3ђ№цбю›СЁ?ьЋ @%:ОЂ§ћїO™2eЮœ9UUUѕѕѕЏНікЇŸ~ке…ъƒЁсКэлЗЋyuяоНгІM{т‰'jkk+**ЦŽ›••uётХ —сNгСнГК€Ÿјъ@sД;eќЬ3ЯЌYГfЦŒббб™™™[ЖlЁЖЖvЦŒёёёIII‹/ЖлэтЮѕыз›ЭцДДДƒŠ)м{яН---т*зђђђЗоzЋ_П~FЃqєшбЅЅЅ‚вžђDђѓѓгввzѕъеЇOŸз^{ЭЙ„.щ ‚ П\„ЦЦЦљѓч'%%™LІЙsчЖДДо8K–,YЕjUNNŽ^ЏяйГчтХ‹srrVЎ\щrZ}}§ЌYГL&S||ќУ?,‚М<(((HKK‹‹‹[А`AkkЋЛЫхЙ8{ѓЭ7‡zѕъUщˆидoМёFrrrџў§<ИvэкфффдддC‡‰ч(6šЪ—ПCAАX,“&MЉ‰IOO—џ{`уЦ3gЮЁ­­-66іЙчžЁММмd2ЕЗЗ+fфќцQlХВ…,эa…Y]Рgюцsuюy=Ё“Зat:ЏмЕkзŽ92mк4љKsцЬ‰ŠŠЊЌЌКdЩёЬнЛwK ]гввxќјqЋеšžžўф“OЪS–'bБX.\XXXиииxњєщ &8Ÿя’ОbAXИpЁеj=ўќЅK—ЊЋЋWЌX`удзз=ztЦŒЮsss?ћь3—3чЮлмм\VVfБX-Z$‚зFpnœ9sцмЙs'NœXНzЕЛЫхЙH^yх•7юйГ'%%Х%ёЋWЏVVV>іиc3fЬЈЏЏЏЌЌœ7ožдnŠІВСп!sчЮЏЎЎ>pр€|+ЌЌЌттbAОќђKГй,>...ЮЬЬŒˆˆp—‘‡vіzIЗгСіv6uККГњЏЋ[шц:ЖЃujЗэФƒ?А\ИpAЏзЫ744DFF^О|Y|КsчЮєєєГgЯ ‚P__яp8Оўњk“Щ$ОzіьYƒС OфиБc))).'(&R__пЃG-[Ж\ЛvMžŽзЫGcccTTTEE…јє‹/ОИх–[\!ўК?џљЯђd_u8чЯŸ—7ЮЉSЇ<Д•зFч+]ЛkзЎŒŒ ХЫs“њня~7|ј№ккZyЛ ‚PWWчp8О§і[Nїу?Š=4ššW|‡ШF—R™ЭцвввW_}ѕ…^HMMmii™?ўš5kМОЛф-рю’Юx rчГŠOl.Z€фыhщ|}GNaРсpИ[Fчp?ѓ+^тс„NТŠ?@s‚?P„ОФФФЖЖЖКККјјxчуеее:ЎoпОтгў§ћ‹?э7 БББ‚ єьйгfГ)ІЙyѓцеЋW_ЙrEpгцђDbcc‹ŠŠ~џћп/ZДhШ!ЏОњъЈQЃм•YБ UUU­­­ЗоzЋјдсp љ…VЋUzZRRтсUЉqjkkЅƒUUUIIIЮЇЙД•ЪFшѕzщк~§њ‰—Ш/WЬEЛнОnнК7оxУd2Щ7 qqq‚ DGGїъеЋWЏ^тcqЇ5&ИipХwˆќ <ЕЬЬЬттттттЇžzъиБcG-..ž={ЖЛŒ$Š- ц й=tеЇ€№Ф €Яœџ7Ђбс+66vФˆEEE.ЧЭfs{{{EE…јДЌЌЬхЇ§ЮœџЫeЕZчЯŸџілoзееэлЗO}›Lœ8ё“O>ЉЉЉ™6mš8ЧЇ˜О;IIIQQQ—/_ЖZ­VЋЕЎЎЎЊЊJeжюФХХ >|лЖmЮЗnн:~ќxч#fГйсpHm%јиvЛ]КЖММ<%%Eёry."Н^ПsчЮ_џњзћїяїЕ‚юMMƒ+ОC\ YVV&П0++kџў§G9rdVVжŽ;.\И0lи059*Ж€Жht 7Ьъ~ђщ;_и^Ct|E/Нєв’%K m6›Ус8tша#аН1Ћ ƒ_BdЭKdddnnющгЇ…ыЋ>пxудддYГfежжޘ1#>>>))iётХвŒ[}}§ЌYГL&S||ќУ?,Bccуќљѓ“’’L&гмЙs[ZZAШЯЯOKKыеЋWŸ>}^{э5Х#*/tіж[oѕызЯh4Ž=КДДTM]ъЅ˜ЉХb™4iRLLLzzz~~ОИTжeoi§Ќšbп{яН---тЊ[1дчz)ZВdЩЊUЋrrrєz}Яž=/^œ““ув]žбњѕыЭfsZZкСƒЅгЫьЂ   ---..nС‚­­­jо7nƒЕЕЕХЦЦ>їмs‚ ”——›LІііv5wм%•wгхр›oО9tшаЋWЏЊЉfGбtЧа И…tЉ9Ї9;­ѓк\*п `V”Лбн†нnџрƒ222ФЇ6›­ЄЄЄДДєwо™3gNTTTeeхЉSЇ<јт‹/ŠчЬ;ЗЙЙЙЌЌЬbБ,ZДH„… Z­жѓчЯ_КtЉККzХŠ‹eсТ…………ЇOŸž0a‚ќˆЪ ] ЁЗТяК'uф]ІГ{SрЩ’ТйГgAˆ3fЬ7п|#Ќ­­u8 ‘‘‘—/_ЯпЙsgzzКќИУсhllŒŠŠЊЈЈŸ~ёХЗмrK}}}=Жlйrэк5ёИќˆЪ н9vьXJJŠXlƒС еKzьRYБ^Š™Ъ+k4х)‹UлЅ$jъ%e!:ўМ^Џw9чдЉS .W9R„њњz‡Уёѕз_›L&ёИb™хM$ЕРЎ]Л222дМ‡йl.--}ѕеW_xс…ддд–––љѓчЏYГFхwЮХЉš.~їЛп >мУЭѕœЌЮ­sџf‡’РлMНsчЮѕюнлзМ^еUBЖ`7#ЄЃ#ЪЪЕіЬ]›( …j:їаPшП^…`‘B™зц Еxхыhщ|жъўшь%ЕЊ.Рb ЋеjЕZ8pћэЗKM&“ еее:ЎoпОтёў§ћ_НzU~\„ЊЊЊжжж[oН5!!!!!aТ„ uuuБББEEEяНїо7о˜™™yј№aљ•К{ѓцЭƒ Š‹‹Лчž{~ќёGѕ•ыЅ˜ЉМВ’ђЏи^OKLLlkkЋ­­uЩ=))ЩsMcccAшйГЇЭfѓPf— ѕzНд§њѕЛrхŠ т§ BfffqqqqqёиБc‡ vєшбтттЌЌ,•wм9_йэіuыж=§єгnЎЩ* ‘•PћqСC"Сф5žt‚ѓў^Џ Z A—ŒДаЯЇЦє*єkн!я‡PЋІ}6DF3tЌЎР@чaV№‡Џ:LПvьllp˜ЭціііŠŠ ёiYYYJJŠxмсpHЧAHJJŠŠŠК|љВ8G\WWWUU%ТФ‰?љф“šššiгІЭž=[~D§…Ће:ўќЗп~ЛЎЎnпО}~|QЬдЅReeeтƒшшhЛнооо.BuuЕOѕ•пhѕR7|ј№mлЖ9мКuыјёуЈyGЙ+Г3Лн.Е@yyЙxЛ%юо‚ deeэпПџшбЃ#GŽЬЪЪкБcЧ… † &ЏВšbјDЏзямЙѓзПўѕў§ћUVгožП08‘ЪSЎ)ZŒ(шA7ЋNW кр ЁЯ0сƒПtcЬъЁHѓ;FЃqђфЩK—.mjjЊЉЉYО|љƒ>(ЯЩЩyњщЇЏ]ЛfЗл>l4sssŸzъ)q]dEEХž={*++?ўјуццfН^лоо.?ЂђBчRйlЖЖЖЖФФD›ЭЖvэZџъ%Ядh4Nš4IЊЌŽьЦoŒ‰‰йБc‡Эf{§ѕз=Є /ЖЩdВйlв‚VЯѕrgЭš5yyy………vЛНЉЉiнКu………Ы–-s>Ч%#ѕЕv9GЇгххх555Y,–+Vˆ1аœSP|?‚••Е}ћі †ьььќќќ‘#GFGGЋМуђвњДЄnфШ‘лЖmЫЭЭ=rфˆЪєт_žCМxюHw\| ї'рpЯž=ЮяyE—@‚ю"щycш.6ЃKФH—ŒœпРђƒюъшЁђˆ‚j6К і(QlLwХЁЊЊъОћюCJnиАС%AЏ7бзъШ#XzЈ‘,ЙФŠt—ЌšjznЈЮЃОћkt € ю#нГК€o<|>юЈЉX)‹а_ѓВiгІЦЦЦ>}њЄЇЇ1"//O<ОaУ†ШШШддTГйќц›o ‚ŸŸЏзы;nмИяОћЎ­­mхЪ•ЩЩЩ111[Жl‘QyЁs‘’““ѓђђF•‘‘qЧwјW/yІ‚ X,Гйœ™™)MhFFFўс˜3gЮРGх!yБќёAƒ%$$”——{Ў—;уЦ+**ZЗnЩdълЗяоН{‹‹‹SSSЯqЩШЇZ;‹ŽŽ=zє AƒnОљцСƒ/]Кдхwя‡ЛюКЫсpdggKГВВAPyЧхEНtщв№сУеДhьиБяОћю”)SNž<Љ&§Рђ]:є;~зrюOфаљ%yE—“#щycш.6ЃKФHЅRŒ1(ЏЃзhŠ.§ˆ3)чЎиюnСœ9s’’’ЊЋЋ?џќѓ?§щORі|еTGшќ–.х‘ЧŠtWАlЈЮаЉ3}L#†‚рќk„„œ‡К7—.„оxВtѓNтЕ AЖbХŠэлЗwu)ўЩsGѓЕvjЗэФƒ?А8GР”Т§Щcх9мЙRŒЃш.’žЪ№ŒRšЅˆ‘.%‘ž*ЦTЌЃчbИDє#`Ѓ4ІЙk@ЏЗ ЁЁ!""BЪtїюн.ƒЄз|ЊŽbKХљз ђђИФŠt—lр 8Э}xрГŠOl.Z€фїwFжъ~rюK^љЗјЮЇ,€№ёлпў6''ЇЋKЁ–Џ™Žя™bИ?5<ЧQtIЯsCХ4х#нqcP^GЏб# њАQ=Х[P]]qУ 7ˆO]~1 &ŸЊ„–ЮcEzОxCi?5†Є=:0 kаКЊ$•ЇДДдCXцP+6˜еТќ щіC–Л%Х8ŠЮ'{ˆЄч.ŒЁЛиŒђˆ‘юJх!Ц œњhŠ*6*{tцгєœXqКS„‹/ЊПж3ѕ,н†ЉчLIDATеШя–ХX‘ўE_ьМ†ъ@н~ Ж\ІЗ•я2ZRRЂгщbЎ{р„нз^ўЊhпО}йййqqq&“iъдЉпџНЛ, PSS`9t fuрѕћ_XѓВФпџvu)а=бёс.6 bEч“нEвѓЦа]lFyФHwЅђcа…OбUlT іЈІ1нezџ§ї‹uБX,тСB}Kw5ђ/‚Ѕ3ХX‘ўE_ьМ† L@з’6ˆohhиО}ЛšWїюн;mкД'žxЂЖЖЖЂЂbьиБYYYЁљOGrЬъ.К§”БЛи€Šq]NVŒЄч!ŒЁ‡иŒ.#=D,tcа…ЏбеltьбkcКГqуЦЋWЏšЭц1cЦфффшѕzЏ—ЈЄ2‚Ѕ‡љСвљrwБ"§‹Оиy еQК§@Šоzы­~§њЦбЃG—–– зКЎ_Поl6ЇЅЅ АЙhm„9yќRч?тЖ<6›э‘G™њшЅ—^ъйГЇйlўэoы’ESSгћяППvэкииXЃбИlйВmлЖEGGGEE>}КЁЁ!!!aШ!žЫ)ЯW1YЕ+**ђњjmmmdddbbЂѓiЩЩЩj6Я•—PДbХŠ­[ЗюйГЧC\5…Y] ќћ‚ЄЁŸ@:Oл‰;ё1BzЕЅЅЅwяо!‹РWнИj!.lч‚5дёgЕЕЕ“'Oމ‰:tшwољьГЯvu‰BT7n(Іƒ„>ƒС`НюјёуЮ/mоМyа AqqqїмsЯ?ў(+BЯž=m6› еее:ЎoпОт §ћїwЩЂЊЊЊЕЕѕж[oчO'L˜PWWTєо{янxу™™™вЌБ‡rКфЋ˜Ќ‡кM›6ЭыЋ‰‰‰mmmЕЕЕ.хW3!+/Ё vЛ}нКuO?§ДЩdђš€Р…мN^КшшшšššoП§v№рС‚ ќпџ§ŸйlОtщR№KbЗл;vЫТn\5„qΘit†ььь’’’.ЩZ[,ЛАЁTb †ЌVыќљѓїьй“™™љх—_fggЛ;гl6;ŽŠŠ qbЗЌЌЬх„ЄЄЄЈЈЈЫ—/Fчу'Nœ8qbkkыњѕыgЯž}њєiщ%5џбw—l ттт†ОmлЖџњЏџ’nнКuќјёў%Јзыwюм9iвЄnИaьиБTLnБVџпuљš—ЊЊЊћюЛOŒАaУqEЊт&§.ќыtКYГfНћюЛb:яМѓЮ#<"%+OA\•љЦo$''їяпџрСƒkзЎMNNNMM=tшs‘ вввттт,Xаккъ9ЕдддYГfЙЋbМyjVMИОцдkэ:АjŠзўЯџќЯЏ~ѕ+щ„Ÿџќч›6m”тBЈQ__?kж,“Щџ№УћŽ‡ЫЃFШ3э–КМу€јЉэВйlmmm‰‰‰6›mэкЕЮ4“&MZКtiSSSMM<А˜бhЬЭЭ}ъЉЇФЕД{іьЉЌЌќју›››ѕz}lll{{Лѓ%&“ЩfГyŽ-І˜ЌŸЕuВfЭšМММТТBЛноддДnнКТТТeЫ–љрШ‘#Зmл–››{фШ‘Р‹Р3fuИ5gЮœЄЄЄъъъЯ?џќOњ“xpсТ…VЋѕќљѓ—.]ЊЎЎ^Бb… Лwя6 iii‚ Ьž=ћќc[[лхЫ—;6yђd)YХФЯ1•••=і˜ ВВrоМyK–,‘.Дйl8sцЬЙsчNœ8БzѕjЉ•”””––ОѓЮ;ŠUГX, .,,,lll<}њє„ м•-№ЊЉЉ]VЭ]Irsswьи!ў<ЪbБ‹?М8pрёуЧ­Vkzzњ“O>ЉђН1wюмцццВВ2‹ХВhб"ПгёP`yЫЫ3…Џ˜2р€0”œœœ——7jдЈŒŒŒ;юИУѓЩ‹Хl6gffЮœ9S~B~~О^Џ8p`llьИqуОћюЛЖЖЖ•+W&''ЧФФlйВХљќФФФЧ|а A тjEђd§ЋЌГqуЦ­[ЗЮd2ѕэлwяоНХХХЉЉЉЄ9vьиwп}wЪ”)Юћэш~„fТS№ЛLр9’BCCCDDDEE…јtїюнFЃБББ1**J:јХ_ˆRcЊJЧŽћїПџ}еЊU .”"Ь*ІpіьYAъъъЧЗп~Ћгщ~ќёGёqbbЂ”Ќ —/_ŸюкЕ+##УCjЕЕЕjW__пЃG-[Ж\ЛvM:ш.Е@Њ&•мCэ:ЖjJrз]w}єбG‡cУ† їнwŸЫUЧŽKIIqИ‰ыЌЁЁ!22R*АзtМ&шЕхНfкЕ:vp§ПЮЁ_ТЙDФл2Ш;wЎwяо]] xЁЙЊЙw­›‹ж љњZ:Ÿ=(ЋЎЎŽˆˆИс†ФЇт?lЅMњХƒ‡У`0ИKс‘GyїнwOœ8ёСHнЅ`0тттAˆŽŽюеЋWЏ^НФЧт&"Н^/Х%шзЏп•+W<Єцy‡~1^СяџћE‹ 2феW_5j”њкљT55ЕыРЊy(ЩўчnнКuвЄI[Зn•6ŽиМyѓъеЋЏ\Й"ЈоEб%F„пщx-АзLсЋ№м.ГЄЄфілoonnZ ч(їНq8в&z*7-))8p 85|ћэЗoкДiШ!lР€žƒbK™ЖЗЗпvлm7nМыЎЛќЫЫ.ЕSl FгТs аv`‚A‹ћъšЭцііvq’N„‹/ N›є‹БSыъъЊЊЊ7ќчффькЕЫ`0 6L:ш.5ьv{EE…јИММ<%%%д&NœјЩ'ŸдддL›6mіьйюЪІХЊЙЛvЦŒ§ы_/\Иpј№с)SІзуBМ§ілuuuћіэSљ~“bDHGќKЧs]Z^žiwеЕ!EмфФ‰FЃБс:ѕ—‹{˜дззO˜0aоМyWNyІ їпџќљѓƒ“ЉчТИkЛно%Ѕ Е2t іе&fu(3їпПРbБМјт‹‚ћMњ7ј‰‰љєгO?ќ№C—d§оц_Їгххх‰хYБbХЬ™3UІ&s>ЂЏ@15ЭUЭCIњїялmЗ=іиcїо{ЏИvиk\wщчфф<§єгзЎ]Глэ‡V_B1M5-/Ядs.PЄб)cё=#(X[[;cЦŒјјјЄЄЄХ‹Kd.Б]"я)F5ДX,“&MƒC~њщЇ.Чюs—Еœb”??ЪрсBСcИТШШШмм\ч@лђЖ•‹Ћƒ7б2Ѕ“ХызЏ7›ЭiiitI6""bњєщчЮSYпќќ|—,\ЪЃ˜‚ч­и.1'яЃњ[&К)?"ЯB}мЫЎЂб м0Ћ ƒ_К|ЭЫЦЏ^Нj6›ЧŒ“““Ѓзы7›єЛлрфШ‘Знv›KВ~oѓ=zєшAƒн|ѓЭƒ^КtЉЪд.]К4|јpч#ютШSг\е<—$77wЯž=ЙЙЙтSЏq!мЅПaУ†ШШШддTГйќц›oњ_B1M5-я’iiiiRR’чМДЈЫ;~hRŒ(8gЮœЈЈЈЪЪЪSЇNpрР{яНч’Лј ##УЇWŒ–щЬfГY,–+WЎ<њшЃЮa-Emmm………wоyg€ѕѕPqЏ7к] 8ЧœTМ*o™МŠq8ГPїRs˜*піяТX№ЛLр9v`™wюм™‘‘б!IпŠ+ЖoпоеЅш]ЕЮHПћнŽŽ:uЈщФƒ?*Ft  ЗsчЮєєt‡R,DчШ{ŠЁљфIЙD*ѓЛOЪZ~Оb”?_Ыр5$Ѓ3чp…‚ ФЧЧЧЧЧ3ц›oО‘WФ!‹u)fЄ-гёЏ!AЈЏЏw8_§ЕЩdrОSёёёQQQ‰‰‰.\№ЕОŠхQLСѓіаТѕ˜“ŠїQ§-“@~D1 •q/§RB0;­ АЙhmBЏ Ѕѓ‰–ƒG|=ПУћlW—@@œџЕЋ-ђˆ‚bDGщ`YYYJJŠји%ЂѓŽŠЁљ\bё•••Йф.нч.kŠQўќ+ƒЛ …РТFGGлэvqoёъъjч КDЫєIllькЕk_{эЕКК:ŸъЋXwїpЃеPМъo™Мђ#ъп*!EЛ@XaVџО uљіšййй%%% ‹%??_5 @‡ыђŽš# Nžkuќ>*aКПw`№'і_љїšЯм@Ђуа(f ‚‰Y]ТГ-Мb аfu`№я k^€0DЧ Q \СDД4ТЁиxХ@  Ќе‚}uЈDЧ Qќд ˜˜е \0лР+ M`Vіе €F1pћъ.и.€W šРZ] иW€Jt|ХO ‚‰Y]ТГ-Мb аfu``_]*бёh@0БЏ.с‚э2xХ@  Ќе‚}uЈDЧ Qќд ˜˜е \0лР+ M`Vіе €F1pћъ.и.€W šРZ] иW€Jt|ХO ‚‰Y]ТГ-Мb аfu``_]*бёh@0БЏ.с‚э2xХ@  Ќе‚}uЈDЧ Qќд ˜˜е \0лР+ M`Vіе €F1pћъ.и.€W šРZ] иW€Jt|ХO ‚‰Y]ТГ-Мb аfu``_]*бёh@0БЏ.с‚э2xХ@  Ќе‚}uЈDЧ Qќд ˜˜е \0лР+ M`Vіе €F1pћъ.и.€W šРZ] иW€Jt|ХO Д‚Y{КfuЬЖ№Š@˜е‚}uЈDЧ Q \Ё{@wТЌ.сЂЇŒљ/а]ёП%M`V†ЎнW—Щ@C˜I QLГК„‹™maЪшошуšРЌ. ]ЕЏ._ЬЭaБbрІˆЎ.NЧ–,тЇСФЌ.с‚й^1PhГК@0tеОК4‡Ž@ЃИ‚‰}ul— Р+ M`­. ьЋ @%:>тЇСФЌ.с‚й^1PhГК@0АЏ.•шј4Ё ˜иW€pСv™Мb ажъСРОКTЂуа(~jLЬъ.˜mр€&0Ћ C ћъJ—;/с1yм]‹:oV%tjЪcѓ8”ћЁѓ.ШБЏ.Кјv„!‡УAпxІуЋ# R X\ќтќћДУg$Ÿа\@њ<РZ]аіе‚% {уг@0БVД„Y] t:st{€n†O;СФЌ.h ћъСРNs {уг@0БVД„Y] иito|к&fu@KиWvšнŸv‚‰ЕК %ЬъСРNs {уг@01Ћ ZТОК@0АгшојДLЌе-aVvšнŸv‚‰Y]аqч+fu`ћ›Д€Хy1 yЬcѓ˜Ч<цq7x,АЕ.@ч“>q1Ћ ZЂу?ъ€J,B@вщјњў?жъ€0Ѕ $Ьъ€–№ажъ€–ќ?Hќ‘"H-# IENDЎB`‚icedtea-web-1.8/plugin/docs/PaxHeaders.7406/java-js-wf.png0000644000000000000000000000013213441742745020124 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.236253483 30 ctime=1552410887.042183609 icedtea-web-1.8/plugin/docs/java-js-wf.png0000644000175000002070000007760213441742745020750 0ustar00jvanekmock00000000000000‰PNG  IHDRЦPsBITлсOр IDATxœьн{\Wў?ў ШЕ ЈнjекЊа­АT[ЕА^ŠЖ‚Ќ[ОЛъnНW­Еjлн­ЖЕ+рzi жжо/Pлz][яTЫESЈ (0&$Ьяљu6K&a€мy=џр‘œLЮ9sцЩМчLEQŒЧуЙК \qЯнt•шz"њ„єnђ9B`x7‰яцYЧEмw•<тјЦГbТ’}йгGУ+ЙУчс)-ƒоР^!„hщ ь-p‰F/Зюp„fѓљтвU>їE†^чVНђJŽdl57сnŸ#7щАrЗh…ю-рЙz[єrY_ОsКв=žВС<Ђ“–pйK`wŽŽ„ЂГћw ЂХ‹й7Z*рLНъј™Ђ(ŽылЧY]ъІгИЄС 0Шо Ÿ#рбі‚ю-рЙzIєr<мŽm™c§JъЙХ‹ggg744иБN-ˆюшU ЗŽНт„ЎЪМZю5Лі,*гКH$ŠŽŽ.))щI‹нгсдк€!„ЧуХЧЧ—––вOщЁ{чw‚ƒƒЅRщ|@Йzѕъ˜1cD"бєщгыыы !ƒ *//g*ЉЌЌT*•„ЌЌЌ!C†…ТAƒэкЕ‹~ЕЙЙ9--MЉTЪdВgžyцюнЛжтШVJIQT^^оЦ=кооЮДєч?џY,GEEЉеjk…жАЎРиБcxрН^OЧњG}Ф}мжƒ>ЈгщЬwжaзЌYc4oпО]\\ќнwпэлЗЯE]v8>ŸПpсB;2kS7WЎ\>|xPPа_џњWІ№їПџ}‡/<њэЏНіšRЉ0`РЗп~K—Л0’'Ož|чЮ•JEЉЌЌЌЊЊŠ‰‰aэљЄЙЙљвЅK‘‘‘єЋњгŸnоМy§њѕ[ЗnЕДДlоМйZCйJ)/\И`2™fЯžэыыћУ?а…zН>44TЃб„‡‡П№Т 6 YБЎР…  ЭwЪмWРƒX;„ЭЩЩyс… ХЪ•+srrшr:З‰ŽŽ6Яm асp™ѕxQЋе&''ЩdВ?§щOє’.Oн УСƒЛqbuщвЅO?§ДZ­ОsчSxьи1Ы/<ƒСаоо^SS“žžОnн:Ка…‘ьччsтФ BШ‰'&Ožh­ѓ–uВюЌЕNzА#p-—Ц€”JхџјЧ‹/š_`mwd9ЖЌ[AЁPфччыtКииXf.Ѕ­­mлЖmяНї^VV–эЯылYЃ:555%%ЅУКГђˆh™8qтщгЇ?ўју'žx‚.aнГБžje-ДLЮ‰•sЌ бЬЯ[;ЏСкК yyyбббЬгБcЧŽ5Šй-г—2r}zшаЁж iзЏ_Ьгццf>Ÿ_RRB?§с‡юЛя>ж%Йќь•уТеiOЬзЫ`0єызoЩ’%.\hooЇ kjjx<^[[§євЅKЄ‡єЕз^3‹-њуџh­NŠЂ’““gܘqчЮ–––ФФФеЋWS•˜˜8ўќІІ&Н^џЩ'ŸX{oзŽуђєъHЅRЉTS\\l­?цOЏ_П. )ŠвjЕ„FCQдщгЇщBko'„шt:ŠЂЎ^Н*•JщrзFђЎ]ЛцЯŸOQд3Я<ѓъЋЏvЉЮ;vЌ]ЛіЮ;RЉДЎЎю…^xёХ­ЕNїПЊЊЪrАrкчШmуьйГгЇOїѓѓ ЃKжЗSlck#hWЏ^•Ыхє{§ќќJKKKKKщжЭз],›wођэ–зh4цБjcнн'Zl„@ 8~ќјђхЫyфfu,їl |>ŸоR555gЮœЁ(ŠЕЂЈїпџз_5™Lыж­›8q"]јаCНќђЫFЃё™gžaЭВ!f FуцЭ›}єQЪJZkн:џommЕ%>>>ЉЉЉЭЭЭMMMзЎ]Ѓ(jТ„ Ь—BZZѕлFќт‹/x<^nnЎљ.ЫšmYŽ’С`ЫхeeeEнМyS&“щѕzkуI;{іlpppЇMS]‰"D …hс-ЖcŸСztФz5nмИПџ§яFЃ199ЙC%Њe}Лх 0уЉзыWЌX1iв$ѓ ;§ЪЃЌФ$ылy<оŽ;L&гK/Н4nм8ѓeккк6lи№иcйш|dd$НюO?§4нЕ.qќшй^ЭТ1ЄЙoЭ.э Xbэ’ FЏэ]EQƒaЭš5?ў8SюччgОdYY™ЏЏ/§ИЄЄ„>68~ќјєщг?ћьГбЃGєбG=іX^^EQ_}ѕU||МRЉ3fЬwп}GQдЏПўЪ„HЅR‰DЂT*YтОІЖRЪ &МёЦEН§ілџїџGЗdЙЌ…††fm,—фОЎеЅ”’b;„-++3пxЅЅЅ‰ФFnгЁNжуENчууS]]нizИv—Зб(—нh‡эн(ы.ЯЕ‘\RR2hа ŠЂ†zљђх.еЩКwpФŽРЁм60hЫ–-?~МŽYŽ­Е­Аџў№№p‰D"‹E"SнюѕызЭ -Лdээн^wї‰лa`4GŽ9uъTzYїlZ­V ффф4773og-4Ч$чЌч Xb~___ЅRIŸьАv^УvыќњыЏ>>>Ќ#аЁЄCТпс$sЬђl…mж>tЬ(QЕhбЂќуEНѕж[ ,АБ$­ИȘŽеNй+ЅDДt(щЭбвЅ”’ѕшˆuГк8mзЁк.^tсYTІuŸ|№Ю;ж:O7DЏћЉSЇlЄ”м?z6њi9 CšћжфО7`mˆЕKЖѕ<ЅЄ(ъЇŸ~ълЗЏe9>хдЁЋMMM§њѕ[БbХ—_~љмsЯ 8АЁЁy‹ЩdкЙs'НdssГŸŸ$ж:ае5ЕzсЋZ­>ўќпўі7џхЫ—_Кtщіэл„ЖЖЖЦЦFBH}}Н\.Їf-$„јјј˜L&цЉRЉєѓѓЋЊЊвh4FЋежжжв/yё?x1_ЕёуЧѓЭ7uuuгІMЃЏj lkk3є---єхОООbБ˜вЗo_ПeWЋеFЃ122R&“ЩdВщгЇkЕZЕZЭуёюЙчЧЎ˜=tˆ>Ÿo2™шmnnІ ћіэлжжFяуКq_"—GrDDŸЯџўћя[[[Gm­ŸЌuŽ7юђхЫ'NœиЖmлБcЧ.]К4aТ„о№9rB`0ФbёВeЫш/ ы0v(dн &55uЯž=цфЩ“Ьожk!ЫлiAAAmmmMMMФbн=tЏыууѓФO$''гOYїl‰фу?~їнw‡ ђрƒ~џ§ї„жBBШ"""ЄRщФ‰лкк!ѕѕѕОООRЉ”вЗo_ BFЃinn^ВdЩЊUЋЌuлZыжШd2“Щd~ЕЄ5~~~dž644А~)№xМ>}њаЭЗЛ цлнr”!sчЮ§ф“O!Ÿ|ђ sс7ы’ДЦЦF'пн б #жЃ#жЭкa mзЩЌƒ@‡ŠFЃ9qтФАaУКдyж˜ДF …Bњs„IЗ^UUевв’——g­ѓtCєКлО‘,їž~В—цО5Йя Ќ}v,ЛфhEхцц†„„X[@&“7.##Уd2effN›6"‰њїя_PP№иcб7й’ЫхjЕњѓЯ?oiiсёxE BH```RRвЪ•+щpН~§њ—_~iЗЎw№Ю;я˜Ÿh6lиО}ћЎџvAІЩdzійgSRRЈпrї…ДЛwяќјуLЩгO?НtщRњ,ЫЕkзОјт КМЁЁЧу]П~НЋ9Бkuк“ЋWЏЪd2ЫђŸ~њ‰.ooo—ЩdWЏ^ЅЫ:єћпџžR­VKQдщгЇяНї^ѓїv˜ЅД<Э`c–RЅRЙе,e‡быѕgЯžЅ(j§њѕ.і0™LK–,щъd”;DrjjъфЩ““““m kЃFЂЏZ™4iRxxИ%{rnЩЁм30єz§?џљЯЦЦFƒС№ќѓЯ?ќ№УЬђ–‘ЕЋ–[ОާчŸжыѕЬ…If)mœёЕёіKRf&uИ(‹cЌ:?Z8†3яФz•f~Њ•Е№Ю;|>џиБcэээ/^Д<ЧЯœzgmˆѕђШ#ЕЕЕtaJJ }Д™ššКpсBŠЂnпО=yђdБX8~ќј~ј^RЇг-[ЖЌ_П~BЁ0,,ьЭ7пьсšZЅќњыЏќqцщЌYГш_] ‚7nHЅв’’’­[ЗвЏВвхџћп}єQ‘Htюм9BШПўѕ/Ÿ№№p‘HєиcбeBфrљпўіЗШШШрррЯ?џмZЏ<ХлoП]TTDQдчŸ~џ§їг…ƒсѕз_ojjjkk{їнwщr—˜˜јвK/ЕЖЖжззПўњыјУшх333щsqqqжb=Э  Ÿ|ђЩчŸ^ЇгЕЕЕ™gPPС` o@ъ:DˆŸŸпЋЏО:sцܘ˜ѓ“Ѓ™™™яМѓŽRЉT(tљЙsчD"‘љOН™ЩЋм!’cccO:5}њtњЉЕЮГж9bФBШ§їпOп›ЧFы^У сууsђфЩ!C†HЅвSЇNeff2/qмYn…~§њН№Т ‘‘‘aaa]=Mщвл322іюнЋT*;œЎцЋюŒuЯЦzЊ•Еа`0˜LІў§ћЗЕЕНљц›t‰фЁ‡кН{w{{ћў§ћm4Фtƒ2;Oќ№Czжжm‹‹‹+((шъ€АžцЮкW’х(BСŒ3–.]њшЃиX’–ŸŸoуKЪ - ZЌa=:bнЌRЉ422’9 ГQ'ылm‚Ѕњњњž={–yj?Ќ1й=ГgЯЎ­­=~ќИЕu7n\fff{{{VV–.qџшбК}ЪвмЗ&їНA?;=GOаwћmBШ… žxт‰ЪЪJ—Д>cЦŒ^xaтФ‰.iнОіьйsуЦэлЗsY˜{ ZˆЛ,цeœ“*•jܘ1N8рє2†ЅзФ­љŠ№]ншВќќќюќЃOVUU5kж,­V;nм8цџv 0 K˜sћїя‰‰qU7шkяНУџјGWwСQ-vчХбтn“ЌК–RВ^bk‡ыn›mлЖmлЖM$б—GїГfЭš5k–+D${Лx7œƒю-рn“рЮКvсЋ›pŸљbїщ‰#ИЯ…Џр^pс+8—]ј .сЁО‚KрТW№\НѓТWЋw|А )%tRJш&мёРyш"zџ?ЅєВЕB,+€WТ,ЅрX€ ь-;D p„PЯтД{Нђx<ЇЕХwhKЮ\p9lk`еKЛ;ш0Kй#ЮљŸ~8NO‡§Сўœ3ŒAДpƒ!В/Dtюј н„”К )%tRJш&Є”^Х™7[rlJ‰лF@/нєNИYАЛУ Рm!]€nТo) ›R@7!Ѕ€nBJ н„”РЋ№x<ЇЕхи”в™kрBин@я„YJgРyрбЮ‡ЈƒnCJщю№ёЗ…”К )%tRJш&Є”œрG­–RxŠЂœж–cSJgЎ € awНf)œч€;D 8ЂК )ЅЛУЧмRJш&Є”аMH) ›xјЉtf)џ‡JЅђїїяілђѓѓщЧkзЎЕSПИтёxNkЫБ)Ѕ}зФ<пSЉT<oќјёЬЋzНОoпО"‘ШŽ-vЩЙsчъъъЂЃЃщЇ‹/ЮЮЮnhhpUР™œЙуppр]Яў§ћ/^ЬTkY=ЩЙ{їю~§њ 2фЬ™3;wюьзЏ_HHШ?ќ`оЅЬЬЬааP‰DВlйВЖЖ6лЕ…„„$''BђђђІL™b^OLLLnn.ЧqРЧ<ŽыSЪ””…BЁVЋOŸ>}ша!К0==]Ѓб”——пМyS­VoйВ…rєшQ@ гщt:]hh(!dбЂEййй&“ЉЊЊъТ… 3gЮdЊe­С`0дддмКukЩ’%‰‰‰ЗnнZКtщъеЋ™7 †SЇN•––ўђЫ/………;vьАQ›JЅ*++лППFЃЉЌЌ 7_Еˆˆˆ+WЎti4(К7ЮvgŸ;Оvu†iДЙЙY"‘мМyѓž{ю!„|ћэЗO>љЄZ­–JЅ7nм  Я;7ўќызЏЋTЊ‘#GоН{—Т<ž2eЪЊUЋ ЋЋЋџђ—ПŒ3FЇгЕЖЖZж››Іеj%IQQбШ‘#u:]```QQQTTT}}=]mXXXUUеР !п|ѓЭђхЫ/^Мh­Ж††Й\NЙqуЦя~ї;њ XFIIЩјёу›ššИ!—ЭС}Ip7а†N H€;D 8ЂЮЫ8sƒђгŒ5jЕКOŸ>tЊF !„джжЖЕЕ >œ.Є(J XЋaётХ(,,ЬЩЩa ­е $ !ФЯЯ/00000~L_XKуѓљt>IЧктууOžtшаћяПЭš5kKMMen/Dбыѕyyy ,штx€GТяO wВчэyz~k™МММ+VїМK.‘АjеЊшшhBHFFFyy9}УX.p{7бэ{MєBЎO)Џ^НкЇOŸ#FTUUЭ™3gкДi[Зnэy—<RJ7”€;з_јкаа0sцL‘H4zєш1cЦlиАСе=Р?рФѕГ”оЪ|ВЫО#г{Ца%А!ИsёџЅь%˜єщxз_јкЋ№~уъŽИ’JЅђїїяілђѓѓщЧkзЎЕSП Ы\“RђzŽ#рœчЮ<пSЉT<oќјёЬЋzНОьPВ IDAToпО"‘ШEН#чЮЋЋЋЃяЉKYМxqvvvCCƒЋњр†œ™h`–вХм6ЗЄљљљеее§ќѓЯєгЯ>ћLЉTКЄ'FЃ‘’••5oо<ІP ФЦЦfggЛЄKцміS рPЎI)ЙмNггuu(:рЕЕЕ3fЬ‰Dє4cKKKZZšBЁЫхЉЉЉzНž2}њtН^/‰D"QEEЧKNN>pр]Яў§ћ/^ЬTkY=ЩЙ{їю~§њ 2фЬ™3;wюьзЏ_HHШ?ќ`оЅЬЬЬааP‰DВlйВЖЖ6лЕ…„„$''BђђђІL™b^OLLLnnЎ#Р>pоИCД€ѓ!ъ л0KщЮЩ$))) …B­VŸ>}њаЁCtazzКFЃ)//ПyѓІZ­оВe !фшбЃ@ЇгщtКааPBШЂE‹ВГГM&SUUе… fЮœЩTЫZƒС`ЈЉЉЙuыж’%KoнКЕtщвеЋW3o4 ЇN*--§х—_ wьиaЃ6•JUVVЖџ~FSYYnОjWЎ\qјќGa=гccХ7†ЭЭЭ‰фцЭ›їмs!флoП}ђЩ'еjЕT*Нqу]xюмЙљѓч_П~]ЅR9ђюнЛ„цё”)SV­ZUXXX]]§—Пќeܘ1:ЎЕЕеВ†мммАА0­V+‘HŠŠŠFŽЉгщ‹ŠŠЂЂЂъыыщjУТТЊЊЊHљц›o–/_~ётEkЕ544ШхrBШ7~їЛпбWР2JJJЦпддФq4ь8МН'˜ Я>ЛS№bрбЮ‡Јѓ2Юм ј'"ЮркЯЇZ­югЇЊBBBB!ЕЕЕmmmУ‡Ї )ŠжjXМxё srr˜Bk5‰DBёѓѓ Єгжвј|>OB|ћіmЕбљ$!D*•šLІжжж€€ІЊІІ&™Lж§б€Р…ЏŽвпU:ˆRЉlooП}ћ6§ДВВ’ЂP(|}}ЋЊЊ4FЃбjЕЕЕЕФЪфъмЙsѓђђСиБc™Bk5pa4ЋЋЋщЧ§ћїчR›L& .--5/,))5jЧvРОRz?ЁP˜АfЭšжжжњњњэлЗг…III+WЎдjЕ„ъъъcЧŽBфr9§cHѓD"бwп}їўћяwЈ–Е.x<оКuышўlйВeўќљk‹?yђЄyI~~~\\їб;BJй+deeедд(•Ъ‡~xюмЙ|>ŸВgЯ>Ÿ&‹ЇNZTTD zюЙчТУУe2YEESУ„ FŒбЁZжИ№ѓѓ›4iRxxјаЁCяПџў5kжpЌ-55•ЙН!DЏзчхх-XА ‹урЭœyЅ$nЯу.œ6†yyy+VЌ(..юол].!!aеЊUббб„ŒŒŒђђrњ†Бі‚`С­/€;D 8ЂК )ЅЛpш^НzЕOŸ>#FŒЈЊЊš3gЮДiгЖnнкэЎz73wИ№ЕWhhh˜9sІH$=zє˜1c6lиръ€7Р,ЅЛР:ˆљ=lэ;МијП”а‹0щ%ђ@ЛР…Џаё~уъŽxžВВ2…BбЅЗ$$$фччг322жЎ]ы€~€kрТWwбе1ћbFСЬJЅ9rфнЛwm,sюмЙџїџўп?ќ@?еыѕaaa—/_ rJРБ0K @ц-93]Z>++kоМyЬS@›mя~9Џ‹\н_шœy‚”вSQРMWЧгЁ[ЭmeeeЭŸ?Ÿb2™ФbёЦ !rЙМНН]ЅRљћћяоН;$$dвЄIўўўєЛІOŸЎзыE"‘H$ЊЈЈhiiIKKS(rЙ<55UЏзBђђђІL™bоVLLLnnЎГз)%єjН<“dDEEB.]КЄT*щЧ“'OюгЇ!Ф`0ЈTЊВВВ§ћї3я:zєЈ@ ащt:.444==]Ѓб”——пМyS­VoйВEЃбTVV†‡‡›ЗqхЪчЎŸ§йёtє˜Ею-р|ˆ:ш6Є”ас ПƒaУ†щѕњђђђќќќgŸ}і—_~1 QQQєEmмИбззW Ажаккњо{яэмЙS, …Тѕыз№СZ­жЧЧ' Р|IБXЌбhОJрј'"а‹ ‡ДaђфЩ+WЎМpсТљѓч -ZDП*фrЙЗзжжЖЕЕ >œ~JQ”@ JЅ&“ЉЕЕе<Ћljj’ЩdŽ[p&Є”рхFruђфЩѓчЯO˜0!**ъгO?§ѕз_ЧŽkу-цWШ( __пЊЊ*ЁPhОLpppiiщ˜1c˜’’’’QЃFйНџрИ№!$**ъУ?Мїо{Attєž={&L˜рччgу-rЙм`0дддB„BaRRвЪ•+ЕZ-!ЄККњиБc„јјј“'OšП+???..Ю‘ЋЮƒ”!фСЄ(*::šyЬќвš   чž{.<<\&“UTTьйГ‡Яч‡……‰ХтЉSЇBRSS:ФМEЏзчхх-XАРЁырZ6ўЃ ўг xž]. Ф‡я9ŒЁ›Р†АЛ„„„UЋVбЩjFFFyyљŽ;\нЉџa~LпщE„@ЇКš%"HРgŸ#4юuаmH)нЦаM`CєBЌ €Е-‹N!H чppЮ‡ЈƒnУэyX0y&О_РљАччCдAЗ!ЅшќЪы!ЗА)%'8}` w|ш <_—ЖЕCУЩћЈT*'њЭSO=EњћћлX€rтФ‰шшh‰D"—ЫŸ|ђЩkзЎЙlР&ЬRитнi$EQuuuJЅвŽuF>џП_.@ЇгйXоrуЧЯ™3'33ѓ‰'žhkkЫШШˆŠŠ:ў|HH!ЄІІІџўvь0єf)Xtuгу”••mкДiшаЁћіэЃKЅRЉBЁXО|ЙбhмКuы3Я<УМ%..nяоН„–––ДД4…B!—ЫSSSѕz==ёИ{їюфффіmѕъелЖm›;w.ŸЯXО|љмЙs_~љeњећюЛoжЌYŸ~њi[[[€žCJ №_^ŸIЖДДМѓЮ;SЇN0a‚Z­>|ј№ъеЋщ—RRR|}}oнКU\\|цЬ™элЗ'%%}њщЇƒR___PP0{іlBHzzКFЃ)//ПyѓІZ­оВe !Ф`0ЈTЊВВВ§ћїїЄ‡чЯŸOLL4/LJJњўћящЧ•••3fЬxѕеWƒƒƒWЎ\yхЪ•ž4р•œyЄ”алuуw•*%%%$$фШ‘#щщщеееoП§vdd$§RssѓчŸўкkЏ*•Ъ_|1;;;,,lшаЁп|ѓ !фЃ>š2eJPPPkkы{яНЗsчNБX, зЏ_џСB(ŠкИqЃЏЏЏ@ 0oTЏзЫ~ѓёЧ[іЊУ >>>AAAцЫєызЏЎЎŽ~,“ЩвввўѓŸџœ:uJ(>ўјууЦ;vь˜#F :…пRєХХХ|>ј№сУ† ѓѓѓ3I­VѓxМвO‡ RSSCљУўpј№сЧќ№сУ‹/&„джжЖЕЕ >œ^’Ђ(:‡rЙмВQ@ бhlєЊУ&“ЉЁЁС<ЋЌ­­U(о<|ј№ААА‹/2 '€wР?чCдAЗйs–’Ч›€.9}њtAAAŸ>}bccЧїц›o2™˜RЉlooЏЎЎІŸоИqƒОNbbт_|ёыЏПўјуГfЭ"„( __пЊЊ*FЃбhДZmmm­;)‘HЦGЯ|2>ќШ#а)ŠЪЯЯ_ВdЩ Aƒо}їндддъъъЪ€грТW€^$<<|ћіэ7nмxщЅ— †њяџ›" gЮœЙfЭšжжжКККЭ›7Я›72dШ#F,YВdњєщ‰„^2))iхЪ•Z­–R]]mї‹N_yх•uыж9rФh4ЖЖЖюкЕыШ‘#ызЏЇ_§ня~—ššzп}ї]Йr%77711БУЅЖрLіI)mќЗЗžќ8pŸјјј>јрЦ'NЄ їюнлвв2`Р€ˆˆˆёуЧЏ[ЗŽ.OJJ:vьXRRѓі={і№љќАА0БXќќќъъъ~ўљgњщgŸ}ІT*]л%кёуЧgЯž§ч?џЙЁЁЁКК:&&&**ЊВВвЦ[NЇгщtuuu<№РтХ‹ЛдbVVжМyѓЬk‹ЭЮЮю^џ<ХЋћГ”nMЅRљћћПљц›JЅ244єЬ™3tyKKKZZšBЁЫхЉЉЉzНž’••5ў|BˆЩd‹Х7n$„TTTШхђііv—œœ|рРК†§ћї›gbЌюйГ'44400pР€ЏПў:kЩПўѕЏСƒ …ТI“&•••1жжжޘ1C$EDDdddагЁЌ­Ќ^НzлЖmsчЮхѓљЫ—/Ÿ;wюЫ/ПlmнЭ ‚E‹бГ”єђЬИ1А–}ЮЫЫ›2eŠy=111ЙЙЙ=кTіƒЃy№ H)нОTР`0дззпО}ћйgŸ]Нz5]˜žžЎбhЪЫЫoоМЉVЋЗlйB‰ŠŠ*(( „\КtIЉTв &OžмЇOBШЂE‹ВГГM&SUUе… fЮœЩДbYa}}}zzњ‘#GZZZJJJІM›fYB ЛxёЂFЃ‰ˆˆXБbSaJJŠBЁPЋеЇOŸ>tшЕVЯŸ?Ÿ˜˜hОЪIIIпџНЕu7wїюнƒ>єаCжFЯВЯІВВ2<<м|Бˆˆˆ+WЎteГ!„лЌ7@яС§sOPя„Nй=HЎ_ПNillЄ(ъЇŸ~’ЫхEЕДДјњњVWWгЫœ={іОћюЃ+•ЪВВВќу/НєRHHˆ^ЏOKK{х•WЎ_П.(ŠŠ‰‰љъЋЏЖmл–žž~§њuЁPh­ТЦЦFџƒ655бх–%ц.\ИаПњБNЇыгЇSсбЃG…B!k+ххх|>ПCUХХХ2™Œuн™1‘JЅRЉдЧЧЇџўПќђ ]NЏ#§˜^5Ы>џњыЏ>>>–-ŠDЂN7€ЇУиf)м@ ‹Х„€€ƒС@Љ­­mkk>|ИL&“ЩdгІMгjЕєТ“'O.(((((ˆ‰‰;vьљѓч ЂЂЂ˜к/^|рР˜_ѕЪZЁX,ўјуп}їнAƒMž<љЧД,!„ьлЗ/<<\"‘L™2ЅЙЙ™ЎP­Vїщгчž{юЁŸ†„„Xk%((Шd2uИ5Nmm­BЁ`]wfL4FЃбщt .4ŸэРВЯRЉдd2ЕЖЖš/ждд$“ЩККi)% kїзЦ=ЕРM( __пЊЊ*:­вjЕЕЕЕєKQQQ'Ož<ўќ„ ЂЂЂ>§єг_§uьиБЬ{чЮ›——'Ь ­UџэЗпжееЭž={бЂE–%&--эпџўЗVЋ=qтѕлЬ†RЉlooП}ћ6§”Озk+‰dмИq|№љ >|ј‘Gс2ўўўO?§єўѓBˆŸŸŸбhloo'„Јеjf™}–ЩdСССЅЅЅцѕ”””Œ5Šл№Р9*ЅФ7x1œt— …III+WЎЄ''ЋЋЋ;FПѕс‡о{яН ::zЯž=&L№ѓѓcо+‰ОћюЛїпПг oнКѕѕз_пН{—Яч‹ХтііvЫƒС`2™‚‚‚ УЮ;Э+LHHXГfMkkk}}§іэлmtћ•W^YЗnн‘#GŒFckkыЎ]ЛŽ9В~§z.Ca0ВГГУТТ!ƒ ‰DŸ~њЉС`xы­Зш,ћL‰?yђЄy=љљљqqq]м€YJ€џееkЧ]н_шНіьйУчѓУТТФbёдЉS‹ŠŠшђ|Ђ(њ?.вЭЏzЅM˜0aФˆVh2™^~љх~§њ‰DЂЬЬЬƒZ–єызoнКu‘‘‘У† {рЬ+ЬЪЪЊЉЉQ*•?ќ0}7Wkнž:uъЧМkз.Й\>pрРуЧазЪZЃзыщџKЉP(._О|№рABˆЯoМ‘’’I/iйgBHjj*sЧ КЖМММ ty3И%gžнц9ш˜˜ЧуQEџuD§nЛ;`апт\тћ’^ //oХŠХХХЎюШ%$$ЌZЕŠЮН322ЪЫЫwьисъN8іQН„3LRК;Œ!€GРG8\c\НzЕOŸ>#FŒЈЊЊš3gЮДiгЖnнъъNyьR€;ѓЩ(ћюyМ~хнœЙС…Џр 3gЮ‰DЃG3fЬ† \н#/‡пѓƒK`–внa <>ЊРР єv)Рэв2Аъ%œЙс;Ї`…љ`…РЛ` ™!8RJ/‡“р8ŽJ)q"М ЎAСО,сKИу˜+2…мьГ”о ч&z-gnzЧІ”bш%АЛїo%p&ЬRИфа=ˆp Є”юЛАЧŠрr}\н№TH) ›R8UBBB~~>!$##cэкЕЎюN8*ЅФМ/ƒ*АRЉT</55•y*‰Ь_‰DBЁ022ђЪ•+Ж—g•››;qтDБX,•JЇL™ђѕз_люŒПППжЪМuЮ;WWWMYМxqvvvCCƒЃћц8˜Ѕ€ёёёљф“OnпОmљ’@ ащtгІM[КtiЇЫw№х—_>ћьГ›6mвh4ѕѕѕызЏЇ'ї8bma4ЙWе)юЕeeeЭ›7щalllvvЖ{Bœ;У‡”Рpiєf|>?99yзЎ]ж№ёёIJJ*))сИ]Џз‹D"‘HTQQaй:=‘И{їюффdBHCCCbbЂT*U(Ы—/7є2™™™ЁЁЁ‰dйВemmmЌ-vЈ­CылЖm[ДhГ.БББћіэ#„фххM™2…)‰‰ЩЭЭэв€3xVX{Љ{­и†”внс8 ЗСЗ?xЂ+VьнЛЗЉЉ‰ѕUЃб˜““3lи0ŽЫгДZmaaсŒ3X_MOOзh4ххх7oоTЋе[Жl!„=z”ž™дщtЁЁЁЌ­ •JUVVЖџ~BHJJŠЏЏя­[ЗŠ‹‹Яœ9Г}ћvz™SЇN•––ўђЫ/………tЫкЂymZ_А`СgŸ}vїю]BHMMЭщгЇчЬ™Ѓбh*++УУУ™‰ˆˆpТEЙŽƒ”z*$$dЦŒЪѕzНL&S(ЇNЪЪЪъtyswюмсѓљ‰„~LЯ%BZ[[п{яН;wŠХbЁPИ~§њ>јРВжж)ŠкИqЃЏЏЏ@ hnnўќѓЯ_{эЕРР@ЅRљт‹/вз RЕcЧŽ€€ЅRЙiгІœœk-šзжЁѕСƒ=њ‹/О „>|8..N*•jЕZŸ€€f1БXЌбh8В=Љп6ОуЊ€оуљчŸя0Љ(ЌхKЌЫ›“ЫхFЃБББ‘Ю*oоМЉRЉЦŒCЉ­­mkk>|8Н$EQ–Еж\.ЇЋеj7pр@њщ!Cjjj!|>Ÿ)>ўфЩ“Ь2љљљqqq;ь†•RтŸјє6бббцїрщљђ ћіэлМyГL&ылЗя[oНХЬjюйГ‡Яч‡……‰ХтЉSЇB‚‚‚ž{юЙ№№p™LЦмёеЖН{їЖДД 0 ""bќјёыж­#„јљљMš4)<<|шаЁїпџš5kЌЕhŽЕѕ… -XА€Y,55ѕаЁCєcН^Ÿ——gўЊЧс!їss<Ж‘[Р†л!Р Џzтм—„оЛpьЃИPЉT#GŽЄядкs.\˜5kVEEEŸ>џЯKHHXЕjUtttFFFyy9ѓŸQКЪ6(vXю_*n8r‡ow№tјвЧС>Š ћІ”Я>ћь€Жmлf—к:p‡ ŠпRКЛољ1шЭ№эНSuuЕш 0Реъ‘њњњРРРТТТПўѕЏ\–ч™qtпьчР8С cрШNXƒ}”;cЭ$mowи јП”nŠЩ3н6НGJ `žuЭ€5и›ЙЗЭ-‘Rx wЫ-•Rт‡gрeЯРvрMАOs&ŽsТюЖQ0K `8хЖGH)м”лf’ ќ_Jw‡ŸDxьЯ;D PПquG:‡YJзѓˆвf) ›Rp‚k,!Ѕ€nrTJщЁзw˜ЅАœG€о )%tRJw‡Љя€§9p‡h№n љљљ„ŒŒŒЕkзКК;=…”КIЅRёxМддTцЉH$2I$ …ТШШШ+WЎи^žUnnюФ‰ХbБT*2eЪз_mЛ3ўўў6Zw(ѓжm8wю\]]]tt4!dётХййй Žю›C!Ѕ€юѓёёљф“OnпОmљ’@ ащtгІM[КtiЇЫw№х—_>ћьГ›6mвh4ѕѕѕызЏЇ'ї8bma4ЙWе)юЕeeeЭ›7щalllvvЖ{т|H)8С5HЌј|~rrђЎ]ЛЌ-руу“””TRRТqyЦ† ^§ѕИИ8>ŸџшЃюиБƒ~ЉЅЅ%--MЁPШхђддTН^O™>}К^Џ‰D"‘ЈЂЂТВuz"qїюн!!!ЩЩЩ„†††ФФDЉTЊP(–/_n4щe233CCC%ЩВeЫкккX[ьP[‡жЗmлЖhб"f]bccїэлGЩЫЫ›2e S“››лЅw7H) GVЌXБwяоІІ&жWFcNNЮАaУ8.OгjЕ………3fЬ`}5==]Ѓб”——пМyS­VoйВ…rєшQCi IDATzfRЇг…††ВЖn0T*UYYйў§ћ !)))ОООЗnн*..>sцЬіэлщeN:UZZњЫ/Пвy,k‹цЕuh}С‚Ÿ}ійнЛw !555ЇOŸž3gŽFЃЉЌЌ gV$""Т х:”ЃRJч šР­„„„Ь˜1###ЃCЙ^Џ—Щd …тдЉSYYY.oюЮ;|>_"‘аOƒƒƒщЙDBHkkы{яНЗsчNБX, зЏ_џСXжРк:EQ7nєѕѕЭЭЭŸўљkЏНЈT*_|ёEњTŠЂvьи T*7mк”““c­Eѓк:Д>x№рбЃGёХ„У‡ЧХХIЅR­VыууР,&‹5 ЇQvW|WwР№x<\ НйѓЯ?пaRQ XЫ—X—7'—ЫFccc#UоМySЅR3†R[[лжж6|јpzIŠЂ,3:k­ Й\N?VЋе<oрРєг!C†дддBј|>S8x№рлЗo[kбМ6K .ЬЩЩyъЉЇrrrVЏ^M‘JЅ&“ЉЕЕ•Щ*›ššd2™Е<.|€ž9rф<Р§N3./•Jxрж[М* __пЊЊ*FЃбhДZmmm-щњ•’JЅВНННККš~zуЦў§ћBŒF#SXQQбПk-šГl§ЉЇž:vьиХ‹Џ]ЛF'Я2™,88ИДД”YІЄЄdдЈQ]ъЖЛAJщюp 1€wРўИCД€‡ZЕjелoПmЧхЗnнКbХŠoОљЦd2ЕЗЗ_Кt‰. …III+WЎдjЕ„ъъъcЧŽBфrЙС` gЙ …3gЮ\ГfMkkk]]нцЭ›щ{БђxМuыжЕЖЖжззoйВeўќљжZ4gйК\.ф‘Gž~њщ9sц0ѓЈёёё'Ožd–ЩЯЯ‹‹уиaї„”ь ::кќ<=_>!!aпО}›7o–Щd}ћі}ы­З˜YЭ={і№љќАА0БX}ў;™—АjеЊшшшŒŒŒђђrц?Ѓtƒ;lPЄ”ю#щ&А!Р6Dt Aм!ZРq‘0—j{Gмк7Ѕ|ійg Аmл6ЛдfЩRJ\ј ]Цћ]jЋЎЎ§ЏиЅfWЉЏЏ ,,,ќы_џъъО8ЮЙ;œЇtи`":… ю-р8=ŸдВ‘C"nЯf)ё)ь_Ђрнp#bА)%АыR&й LkoСђн[о%RК;З ш6ьЯ;D И&{2Kщ)љ˜Ї/я*H) \rЫЎІ:XоОЫЛ RJрЪ.ѓ–рMRpт)g‰œЙ%аR@їсЬЛЫЙ6Ћяу zqЎРыa–Р№ЩРљlм-жiG&ŽšЅp­„„„ќќ|њqFFЦкЕk]лЏ„”внсbя€§9p‡hщ•JхяяЯ<=wю\]]]tt4§tётХййй .ъ€зBJ ^(++kоМyЬS@›эТ.x%Є”ршiЦЬЬЬааP‰DВlйВЖЖ6BHCCCbbЂT*U(Ы—/7єђ{іь 0`РыЏП>}њtН^/‰D"QEEE^^о”)SЬы‰‰ЩЭЭuўzx7Є”œр$'0 ЇN*--§х—_ wьиAIIIёѕѕНuыVqqё™3gЖoпNЉЏЏOOO?rфHKKKIIЩДiгŽ=*t:NЇ“H$•••сссц•GDD\ЙrХ5+рНR€Л (jЧŽJЅrгІM999ЭЭЭŸўљkЏНЈT*_|ёEњтU???__п’’N'“ЩFe^VЋѕёё 0/‹ХЦЉыа 8*ЅФЭє Ћј|ўРщЧƒО}ћЖZ­цёxLс!Cjjj!bБју?~їнw 4yђфќбМЉTj2™Z[[Э ›ššd2™Sж С,%€р<€]ЦъъjњqEEEџў§•Je{{;SxуЦў§ћгуууП§ілКККйГg/ZДШќW*2™,88ИДДдМђ’’’“™оЪ™G&H)\ƒg…Е—\н_gрёxыж­kmm­ЏЏпВeЫќљѓ…BсЬ™3зЌYгккZWWЗyѓfњ>ЎЗnнњњыЏяоНЫчѓХbq{{Л\.7 є&!$>>ўфЩ“ц•чччЧХХЙ`­МRJw‡Љя€§9~~~“&M :tш§їпПfЭBШоН{[ZZ 1~ќјuыжBL&гЫ/ПмЏ_?‘H”™™y№рС   чž{.<<\&“UTTЄІІ:tˆЉYЏзчхх-XАРeырЅxј†р‚ЧУ‡ьŒžxфђ§Т}IІRЉFŽyїю]{U˜АjеЊшшhBHFFFyy9} йо Qv‡ЃdNR€н9трžЙ>жПЖьžR‚%Є”`w|WwР3` юЌ—ќвм&^\ЃчѓE62Iу+ЬR‚н9j–W 8—9IЬ[€sрŽЏv€C7p‚^ѕпD 'œЙЃРo)<s —ƒE\/ЌpJьГ”ю{я€§9иѕWwГ”ЋKѓ–Ž€”Ру!ЗWAJ Р nb пVрdј-%t“ЃRJœ!№z˜ЅАœGїсЬ#Є”аMИ=ЛУд€wРўмю v„YJш&ЬRєИbьГ”œ`џ ` )%t“Ѓ.|хёx˜еягећ`Oо Г”р§T*Ч§цЉЇžЂ §§§m,@9qтDttДD"‘ЫхO>љфЕkз\Жœ9ѓІОИ=@—q™{Ф§йК„ЂЈКК:ЅRiЧ:F#ŸџпC@ гщl,oЙРёуЧчЬ™“™™љФOДЕЕeddDEE?>$$„RSSгП;vРa–внсЈР;`nMYYйІM›†Кoп>КЄЁЁ!11Q*•*ŠхЫ—Ц­[З>ѓЬ3Ь[тттіюнKiiiIKKS(rЙ<55UЏзгЛwя INNюaпVЏ^НmлЖЙsчђљќ€€€хЫ—Я;їх—_І_НяОћfЭšѕщЇŸЖЕЕѕА!—У> К )%И@KKЫ;яМ3uъд &ЈеъУ‡Џ^Нš~)%%Хззїж­[ХХХgЮœйО}{RRвЇŸ~j0!ѕѕѕГgЯ&„ЄЇЇk4šђђђ›7oЊеъ-[ЖB ƒJЅ*++лПOzиииxўќљФФDѓТЄЄЄяПџž~\YY9cЦŒW_}588xхЪ•WЎ\щIs )%8[JJJHHШ‘#GвггЋџПію<.ЊzќјgиF`@ pЧ%\ВД\в6д2Ђ›kЈЁeф5Л7ЋыF‹ЙЅfЗk™mZ†fqэ‘оo’v1-3(nšh‚В‹ ›ѓћуќš;w6g>Ь #ОžСY>ч=Ÿsц3ч}>ч|NAС[oН5tшPeжХ‹wэкЕnн:??ПАААeЫ–%%%ѕъеЋG_}ѕ•тŸџќчˆ#BBBjkk?ўјуѕызјћћ?їмsŸ~њЉBЇгНјт‹оооjЕкpЃuuuAиЙsЇiTF ”••yzz†„„.гЎ]Л’’хя   9sц>|јЛяОѓїїПџўћ ”ššъŒЗХГ”€MФ(;;лЫЫЋOŸ>Н{їіёё1œU\\ЌRЉ:uъЄќлН{їТТB!ФC=ДcЧŽћяПЧŽГfЭB544єщгGYRЇг)9ЄZ­6нЈZ­жjЕVЂ2Z ВВВЉЉЉЌЌЬ0Ћ,** 5ZБK—.}њєщеЋWFF†>с€kН”Ре:єэЗпzxxŒ7nа A6lаgbaaa—/_.((PўЭЭЭU†Р™2eЪюнЛџ§їЃG>№РBˆааPooяќќ|­VЋеj+**ŠŠŠd``р Aƒ”žOН;vŒ=Zљ[Їгyђфѕз_пR9GЄбžУM мmЄбKщюјnу*RTTфщщйŠѓI 9hЯИ3к(H#Ѕ№џхффДiгfУ† aaa]Лv=rфˆ2НЌЌlЪ”)mлЖ ?~ccЃbьиБuuuFЃбЄІІЖiгцЬ™3§ћїW&ЦЦЦОќђЫ3gЮд>nмИ>ј e>œ†”Резз—––^ИpсбG]Дh‘2ёБЧѓіі>ў|vvі‘#GVЏ^-„иЛwЏZ­ЎЎЎЎЎЎюкЕЋтњыЏЯЬЬT&nпО}њєщ_|ё…rglaaсЁC‡&Nœи‚ Ю@J рПt:нГЯ>ыщщ9qтФуЧ !.^МИkзЎuыжљљљ………-[Ж,))Щ–ЂКuыvгM7эоН[БcЧŽ{юЙЇmлЖЮ.GJ рПдju@@€ТззЗОО^Q\\ЌRЉ:uъЄ,аН{їТТBK›1cЦЖmл„лЖm›>}КsB@KrVJiхх~Ў"aaa—/_.((PўЭЭЭmпОНАэ;>yђфдддŒŒŒ_§uќјёЮ -^JжјћћЧФФ,^МИЖЖЖЄЄфЅ—^ŠBззз[яБ =zєУ?лвБРYИёенQ“.fя=HИ6q—$аžУ7ОТ}аFЕ2ЎмЁєR2Ш'сМg)ЙШa/+) CМИ!Nge—БwZ1Ў&bx Y ГG}ВЁџƒмЎчЪГPRJїТ#|W5§ю#ЗР5‚”p<+ЙЅ НlИВ |їИ3к(H#ЅœШ4ЗЄН@kBJ И™dЋСЎ0ФKD’H)’œ•R2vДzєR€p ИWž™R$‘Rр tepgДQFJ DJ DJ DJ фЌ”RЇг9Љd€› —- ''ЇM›6вЋGGG\yfBJ c†љ^NNŽJЅmк4KЛїо{8`8хрСƒїмsэЕ8зб€ћpх™ )хЕтнwп-,, Л§іл'Mšфхх%„xћэЗНММzѕъ0rфШЌЌ,!DHHШМyѓ"""‚‚‚ђђђє% 2ЄoпОFХš-С>>>У‡ˆˆшбЃGП~§/^lciёёёњс…„uuu)))гЇOЗГ>8€Г†чQЉјЧ>Ў|@?%%хщЇŸЮЮЮ–.ЁeEGG/\И№ЎЛюB$&&ўілoЪ€БСH CЃ‡+т ){Л8„р<ДQ­Œ+w()ЅЛpv&sќјqО}ћцччOœ81**jхЪ•rЁЖnЄ”CЃ‡+т )RJИкЈVЦ•;”_[9еЪЪЪbbb4ЭM7н4`Р€чŸОЅCрZЇГРвЌ–ŽЬ —в]8ЖsЬєЊ'ЛУFєRBЎˆƒЖуhыqдЕ2ЎмЁМ—ВUaЬIЎфЌ”’‹ЎD&  E№,х•хффДiгFzѕшшшƒ*'&&.YВФ!QЉ иЛМ{WiнЫ[š XЧu4р>\yfвм”ввYЛНgѓв ѓНœœ•J5x№`§мКККыЎЛNЃб8|Л6:vьXII‰ђК !ФЌYГ’’’ЪЪЪš_ВЃжЗДКЅu­-РŠжжKщууSRRђЫ/П(џ~ёХaaa-IccЃтнwпеOTЋеуЦKJJrьЖlЩ-­Œ)ЧђТЖ:€ц …э8Zрzuц˜”ввщЛ-Їђf?^ЃбDFF&&&*нŒ555sцЬ ŽЏЋЋBŒ;ЖЎЎNЃбh4šММ<•JЗeЫЅœЭ›7Яš5K_Ќi J'чЦлЕkзН{ї#GŽЌ_ПО]Лvсссiii†!НѓЮ;]Лv œ;wnCCƒѕвТУУутт„)))#FŒ0,чюЛяоГgнUlђ"ЎфІН”=іXhhhqqёЁC‡ЖoпЎL|ђЩ'ЕZэoП§vюмЙтттхЫ— !іюнЋVЋЋЋЋЋЋЋЛvэ*„˜9sfRRRSSS~~~zzzLLŒОXГ%дззž?~іьйSІLЉЌЌ<ўќу?Оhб"§Šѕѕѕп}їнЩ“'OŸ>™™ЙfЭ+Ѕхффœ9sfѓцЭZ­іьйГ†-22ђчŸvv’[pцОЎDх„—ј]Мx100№мЙs;vBьлЗяС,..nлЖmnnЎ2ёиБcгІM;uъTNNЮ7оxщв%!„ўя#F,\И033Г  рЉЇž0`@uuumm­i {іьщеЋWEEE```VVж7оX]]эчч—••uчw–––*Хіъе+??ПSЇNBˆЏОњjўќљ–J+++ BфцціьйSЙVяФ‰ƒЎЊЊrAMB;А;О—ВИИиУУCIе„сссBˆЂЂЂ†††>}њ(u:Z­ЖTТЌYГЖlй’™™Йmл6§DK%ЈеъРР@!„ŸŸŸŸŸŸђЗrc­ТЫЫKЩ'…нКuЛpс‚•в”|RбЖmлІІІккZ___}QUUUAAAђЕnУo| Л|љђ… ”Яž=+„ ѕііЮЯЯзjЕZ­ЖЂЂЂЈЈHXЈsвЄI)))jЕњж[oеOДT‚- ”ПѓђђкЗooKiAAA]Кt9yђЄсФ'NєяппЦэ€;sЧ”впп?::zётХЕЕЕЅЅЅЋWЏV&N:ѕ™gžЉЈЈBЄІІ !‚ƒƒ•‡! Kаh4_§ѕ'Ÿ|bTЌйlЁRЉ”x–/_>mк4KЛїо{8`8хрСƒїмsэЕрЊР{h€ћpх™‰;І”Bˆwп}ЗАА0,,ьілoŸ4i’———тэЗпіђђъеЋW@@РШ‘#ГВВ„!!!ѓцЭ‹ˆˆ ЪЫЫг—0dШО}ћkЖ[јјј ><""ЂG§њѕ[МxБЅХЧЧы‡BдееЅЄЄLŸ>нЮњwфŽУѓIIIyњщЇГГГ%Тsббб .МыЎЛ„‰‰‰П§і›2`ЌF…qьШQЉšлœЂеу э8Zрzu­Œ+wЈ›І”Чї№№шлЗo~~ўФ‰ЃЂЂVЎ\йœ8н™Œ›`G@ПФИ"иŽЃЎЧQзЪRўїопЩ“'Џ_ПОM›6Эѓ*@&у&иУ/1ЎˆƒЖуhыqдЕ2ЎмЁюѕгЇH•7Cм[Є”Œ”WЃ–L)mЩ$--cЉїj_Ў"ЎN)ща*qИWž™И:Ѕ4ќlЖЄ—іжХеО<мз>[ДфЏњt‹гw@ЋЧEFиŽЃЎЧQin1<Й%쇕Чbi‰Y>IDATj#n‘Rъ‘[РUФНRJ=Кƒрn8&S-рjEJ DJ РрР}ИђЬ„” ‰”W +ЖуhыqдA)%@)%@’cоKIG9Z=•JХЋ)#єR$5З—’~Иf9цЦW8 ЗW)ЎЏїсЪ3n|HbФР& Я˜Ђ— ‰” ‰{љ’шЅHrVJЩЫ0 еЃ—€ыhР}ИђЬ„” ‰”внбѕ­э9lЧбзуЈƒ4RJ€$RJ€$RJР&м ˜rVJЉгщœT2РMаK DJ Р­Р}ИђЬ„”внqž РmЉШXrшЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅœHЋеОікkЃFjпОНЏЏoxxјШ‘#Ÿ}ій]Лv]МxБЅ„Б•+WЊT*•Je4]™ИrхЪ‰ъ*ѕЭ7пФФФtшаСлллl­^-ићrЌд›cлЦЦЦЦффф3fєюнлпппЫЫ+$$Є_П~3fЬиКukeeЅƒ>аЈўряя_]]miБ„„§’юsPЙ[<Ў.^-аj8p`ъдЉ………њ) чЮ;wюм7п|ѓкkЏmиАсЩ'ŸlСчљђЫ/яПџўЫ—/Зt p;Žm8ъд)У‰ххххххYYYIIIѓчЯ_О|ysb^Йrх /М „ащtW\ИІІfчЮqqqІГt:]RRRs"С5ЮЎCpz)Ї8uъдјёу УТТ^yх•ЬЬЬвввТТТќ1111::кллЛЅcœhеЊU—/_юж­лЁC‡ДZmUUUUUUK…–чиЖqлЖmЃG>uъTлЖmŸ}ійдддќќќŠŠŠГgЯюнЛї™gžЙюКыЊЊЊVЌXсМOd$00PёёЧ›{рРММpYHрlєRNБoп>!ФC=dxЮdЈcЧŽН{їviL€ едд!ќ§§[:\С–-[Ќ<јчplчЮлаааЕkзџћПџ3Ь' љћћЏ^Н:%%E6^ЛѕьйsиАaMMMлЖm3šuщвЅффd!ФŒ3\И)%р%%%BˆааP{WЬЮЮ~т‰'zїюэыыыыы{У 7Ь™3чз_5Лp}}§ЋЏОzгM7ЉеjџЁC‡&&&^О|йь3VF_А4&Н!nтЃ>6l˜ПППŸŸпРпxуІІ&KŸњз_?~џў§5ЗЗwЛvэFНvэкЂЂЂцд–ЊЮвђ–jямЙsызЏŽŽюкЕЋZ­жh4Н{їž7o^NNŽйrъъъжЎ]лПeЛЗнvлћяПЏгщЎ8,ахЫ—пyчсУ‡ЊTЊ—^zI.Уп|ѓЭЖiг& ро{я§ёЧ•eššš^§ueVлЖmЧŸ‘‘aCЅўЯ&”П_xс•eЂђ8й˜1cBBB<==CBBЦŽЛ}ћvГ]СWЌ+ь­{йX~yyy›6mT*•ЅОВЦЦЦіэлЋTЊПўѕЏЎŒ_ёШ#Дoпўс‡оЗoŸ ž}•n|ѓЭ7щщщBˆЕkз^ё>вЈЈ(ГгmlOT*•ђєš0ƒЧJ›љ№У sїОюоНЛЂЂ"<<|Фˆ–B•hoћ]О|љrbbт!Cќ§§еjѕЭ7пќќЃЁЁСБлѕ]ЖeE{мэзГККzЭš5У† ёђђђѓѓЛўњыcbbжЏ_oјШ€Н‡"р::N \2ПуŽ;ьZkэкЕ^^fnGїііў№УЎЌЌ6l˜щТ&LXЖl™щ\™ВbХ гэъ4jfHЪЌхЫ—›—bкДiv}j!ФвЅKЅƒБТоЊГR{]Кt1ЙЏЏя_|aДpyyљ AƒLž|xШ!ЪЌ§ы_F›xу7”YН{їў№УЯœ9S^^ž““ГcЧŽI“&Fko0Vи[uVj/**jљђхћїя?{іЌVЋЭЫЫKNNОх–[„gЯž5\xвЄIJ9ГgЯўёЧKKK322yфЅвЌlW9 Ÿ3gNzzzYYYvvvzzКDњЛtщтээНbХŠгЇOmоМйззW1x№рgžyЦЧЧgеЊUњYmкДB 2ФЦъ5‰ч…^Ј2 гщє—ІOŸўУ?(•ЋL|єбGэ­+ь­KšПїџљЯ*…х х€ŒˆˆpRќжUWWoнКuьиБžžžњгг[oНѕ7о(..nNЩfыMЂm4KiUЦŒ#ЗК]эIUU•ОkЈъ–iјyxрёGіЈ(..6Ь3M+GЎНuдwY)Mi~јaЅaLOOзпЃ;sцЬцдЁЎпeы+Jќ4ИлЏЇ‡‡Ч’%K~њщЇВВВтттŸ~њ)11qдЈQiiiњ%m<з#ЅœBP~жЎ]ЛшшшЅK—юнЛзДFЇг?^љБ_НzЕбЌњњњЛюКK1pр@§ФcЧŽ)%Я;зhљЧ{LП]Ущіў(к’Юръ†  Ї—””!&Ožl8§ьйГ>>>Тђ%№††щ`,‘Ј:ек3U[[Ћ< імsЯщ'>|X)dўќљFЫО/Сьv…/ОјЂ-›Ж€Q|№сє—_~Y™юссat]Лз‰'lСl}џ§їЪєјјxЃх}єQe–бљЅ\ XaЅr,iўоПtщRPPbЩ’%FЫWWW+Oœ.[ЖЬIёлЈ  реW_Нљц›ѕuюээ“œœ,зhЖоьm-ЙюКы„O>љЄD`э‰•Ю(=УЯћйgŸ !ТУУ/_ОЌЬ}ѓЭ7… 0]X.$Ч~—ѕЅ™6ŒёёёЪЌŒŒ §ФцlяwйЪŠaИсЏgHHˆ0—Д›eЫЁИG$р,Ч7{kM``р_џњз’’У…—.]*„ˆˆˆhjj2-ъРЪКњвцЭ›'„№ѓѓгjЕF ———+WЉ›љЃhoHњMєьйSЅЇtаuяонpт’%K„žžžП§і›щ&šŒ%UЇГ3Ља§ёбnЛэ6§”?џљЯBFcz9ЙВВR?Œйэ†††к{No€a‘‘‘FгГВВЎ8ыу?Ж=Г56wю\!„ЏЏoyyЙбђЅЅЅЪIиМyѓLЫ‘Ј+,UŽ%ЭпћК?ЮЫЛuыfєэаПЅ0''Ї9х;аўѓŸ tюмYпj…„„Ь;з№<[XЊ7ЛкFK”>ечŸоtVccc•‰њњz§э‰Н)хЅK—”ЬYп5tшP!ФЋЏОjЖrЄл[G}—•щжFУ^:`‰яВ•%ТpУ_Oхвъ‚ ,VС•ЖД8†чœЅ_П~‡>rфШ‚ †Њœ. !*++пxу[nЙХpŒЏПўZ1zєшšššj}њєQг_^§юЛя„ЃF2МоЏ 9rdѓуЗ7$НЈЈ(гЁzѕъ%„0|ЙЙ~wп}ЗЅБ›Œ)‡Wнттт"""4~Є„еЋW ! ‡aPz)Geјшš" РњvЃЂЂ”sŽц`Шts=zєPў5j”ЅYFЛOТЁC‡”M(]v†BBB”Ј”dФz X!Q9N*_Й077WЉ=%ЅМэЖлЬ>LхьјЭъпПџ+ЏМ’——ЗoпОИИ8FSVVЖiгІaУ†EFFюйГЇ™хле6ZgvT’§ћї˜XЛv­~Ж'–ЈеъЩ“'‹?щЩЩЩ9zєЈЇЇЇrwЅ)щћ]Жо0КЭљћ.›]Q" 7ќѕ0`€тнwп§єгO­Œ„И3RJРЙnЛэЖW^y%--­ЊЊ*==}еЊUЪyyy†ч'NœBlкДЩєL(  ]ЛvЪbХХХЪПџўЛТвPћњ_ЌцА7$=гWБ !ќќќ„ЕЕЕ†OŸ>-ўј5uR0І[uO=ѕдˆ#ЖnнzъдЉ‹/Э5|НžВнШШHГхXk‚ўDА9ъаЁƒб§iНщЫєГŒvŸ„мм\aЙ’ћіэ+„ШЫЫ3eЅЌЋ'•чwvыжMќя@ ХХХ{їюо*бќјMOgЋm~_ˆ‡‡GTTд‡~XXXИfЭх9Р_§ѕшбЃ6–`mЃ%J> еj%6эРіФ eŸ&''_Кtiыж­BˆQЃF™m›’cПЫжFЅkfРrпeK+J„с†Пž/ПќВVЋ:ujXXXLLЬКuыьghqЄ”€‹xyyнrЫ- йййЪХуcЧŽЅЅЅ)sm<ЛНtщ’ђ‡r^hкпЅА4н.і†Єg8Ш‡u•••Bˆ€€чcЪUЗuыVexЁЁC‡nлЖ-;;ЛЄЄDЙЫюљчŸBО7EI ,НЇбњv•„М™ВВЌЬвYoаЖTОсˆљz–jР щЪqRљ*•JЩ”>ћь3}GФŽ;НММІNъŒјЭžбкў+++?јрƒшшш„„%fooo§ј%ŽbНmДфњыЏBœ}vэкеќx0?p?чбh4џјЧ?”10вггoЛэ6!„Z­nllLHHXЕj•…TTTXъpАН#Bбииh:бо$”——›M!œŒЋ.11Qy№рAЃ;ВLOЄќ§§+++Mћš$Ж+€;АЅђэЪyЌpvхH”?cЦŒеЋW—••эйГGy‚’iŒ7Ює=-ИsіьйѓёЧяоН[П­AƒХХХХЦЦ6џ•’–˜m-:tш?ќ№§їпзззл{#Ѕ 7ёЧE„еЋW/^МјЬ™3~~~ЪЛdZ0Є+В§Лщ&K„сžПžќќѓЯkjjŽ=zфШ‘}ћіЛtщR—.]-Z”••uьиБПќх/ЮЫ'ІmЃ%JzІеj“““энŠ 7…в-yцЬ!Фƒ>hЅЬe!YgНa4|шнM–У=§ќќFŽ™АџўуЧ+CdщЧум)%аєOЄtъдIљCy!uJJŠ7ЬмqЧBˆддTхоQCZ­vџў§ІЋ(м˜Ž{Ёгщў§я›.ooHЦŒ#„8pр€ђˆ FЂъ,ЉЋЋB˜ОЬКЄЄ$55еhтэЗпЎlзДЃВККкty‡р”ЪпППщ~,//W*_ЉЈцsvхШ•ЏdЛwяЎЊЊкЖm›" @y‡ЁCЪ—ѓыЏПОјт‹={іМ§іл7mкTZZъяяџ№УялЗ/77wЭš5yРЬІmЃ%ЃFRУ^МxБНOTJД'ЪЃЄТЮћЅћєщЃМGTXИpаœœСzУhјнt“€%ТИZ~=ћєщЃ\’0Кр(w(ЮFJ 8ХьйГ- ZиддємsЯ !<==G­L|т‰'”‡(fЯžmiР7УЋЊГfЭBддд,^МиhБ… šН˜ЊМ<%%ЅММмpњ›oОiіbЊН!IјѓŸџьуугдд4sцLГ1ыя)r`0Ug‰rЕћЋЏО2ьљбщtO=ѕ”’RNЊЊЊ”ёх =џќѓ–nˆu`юр‘GBддд(ЏС0ЄЏќйГg;d[ЮЎЙђccc===kkkwюмЉєUN˜0AџоWЦЏ7dШШШШ+Vœ9sFЅR9rЫ–-.\јшЃЂЂЂ<<|ž`oлh‰JЅzы­ЗМММЮž={п}ї]ИpСі$к}їlAAэB|љх—ййййййJšсРœСzУЈyЌp›€%ТpУ_OKwЉ(WX”WАъIŠ€s9щх$Р5NЁœœНёЦG-((аjЕ999IIIњ„ž~њiУU^§ueњЭ7пМeЫ–œœœђђђ‚‚‚У‡ПікkЗп~{‡ —Ÿ>}КВ|\\м?ўXZZšžžЎLдŸaИќ—_~ЉL>|xZZZYYй/ПќђЗП§ЭУУCЋЁбЇА7$eaл_оЅгщжЏ_ЏLязЏпG}єћяП———Ÿ>}zЧŽ'N4,Ъо`ЌАЗъ,}Д„„ezllьёуЧЫЪЪввв”'хž^Ѓr&L˜ LŒЯЬЬ,++ћщЇŸ” ЊkзЎЖoW:ыЪЭВФв*3gЮдW~FF†aх !fЯžнќM+$*ЧЎЯ"]Ов9ЏП‡pяоНЮŽп–OЙjеЊММ<‡”iXВQН ћлF+>њш#%щ |њщЇПўњыsчЮUTTІЇЇoкДiј№сJ™ЋV­2\боіDЙYљђž;wЎОООЁЁЁЁЁсŠŸзіЪq`{+1K™Ў КЋџnfddш‡š9sІб* и:ы+Jќ4ИлЏЇJЅ3fЬІM›222ŠŠŠЪЪЪвггŸ|ђIГ_[EРѕH)Ї –ЉTЊЙsч666­ѕЮ;яшy7nИpeeЅйз…?јрƒЫ–-3ћ#gКќЌYГ–/_nvy{CR&к•R*Г,LИtщRщ`ЌЈ:Г­ВВВџўІх<њшЃf?oYY™ђ(‘I“&НєвKBOOO[Ж+€ѕхfYbi•‹/Ž7ЮьМяОћjjjšПi…DхXџ,+WЎtHљ~јЁ~сŽ;š}КcуЗю‰'žHKKsHQFЬж›\лhХПџ§oыяЅаh4 /^4ZбоіФl7Ѓщч•N)э ЩЪц$f)г—-[іЇ?§ЩtгwмqGuuЕiiŽ иК+ЎhяЎtЗ_OKЫ!FeZѓW<зуЦWР)ŠŠŠОќђЫ Œ1ЂsчЮjЕкллћКыЎ2dШгO?‘‘ёж[o™цQёёёgЮœyс…†тщщЉбhzїю§аC}№С?џќГсТп|ѓЭКuыњїяяэээыы;hа 7&''[КWmѓцЭ6l8p ЏЏЏЏЏяаЁC?њшЃЭ›7›}]ИDHržўљЬЬЬЙsчFFFЊеj//Џіэл=њеW_7ož3‚‘Ј:Kх|ћэЗћлпzєшсххpчwnнКѕ§їп7Л|pp№сУ‡_~љхО}ћ*лљdъдЉ7мpƒЏЏЏJЅђїїŒŒœ2eЪ{яНwюмЙUЋV™О‚ТоіфѓЯ?_Кtщ€4•6Г9\аоZчсс‘œœќц›oоzы­ООО>>>7нtгпџўїддTГ/@jё€хТpЗ_ЯДДДЅK—Ž3ІK—.>>>>>>:uŠŽŽоЖmлз_mZѓ.8{ЉtЭ~ЯwГrхЪ^xA8тE‚p‰'юмЙГџўњ›šр&ДZmppАтэЗпž3gNK‡sе оp5тзC/%ДАššeиРAƒЕt,0ІKFy1lDНРЕƒ”\ЄЊЊЪьш‹/VЦšшЁ‡\ЎрѓЯ?Bx{{“№л…z€k‡ё ЏN’žžўиcЭ™3'**Њ[Зn ?џќѓ† vэк%„1b„2(мAuuЕVЋнЙsчЋЏО*„˜0aBPPPKu орDJ Ўsњєщ… šNПх–[ЖoпЮ@ ю# @џwЗnнўўїПЗ`0Wъ ЎAмј .2pрРз^{-::К[ЗnmкДёђђjзЎн˜1cоyчДДД:Дt€јОООН{ї^А`С?ќаЙsч–чЊAНРЕ†_’шЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅH"ЅHњЯƒz^eз>IENDЎB`‚icedtea-web-1.8/PaxHeaders.7406/netx0000644000000000000000000000013213441742745014124 xustar0030 mtime=1552401893.059832781 30 atime=1552410887.113183443 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/0000755000175000002070000000000013441742745015011 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/PaxHeaders.7406/net0000644000000000000000000000013213441742745014712 xustar0030 mtime=1552401893.019832864 30 atime=1552410887.113183443 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/0000755000175000002070000000000013441742745015577 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/PaxHeaders.7406/sourceforge0000644000000000000000000000013013441742745017233 xustar0028 mtime=1552401893.0508328 30 atime=1552410887.113183443 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/0000755000175000002070000000000013441742745020122 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/PaxHeaders.7406/swing0000644000000000000000000000013213441742745020364 xustar0030 mtime=1552401893.057832785 30 atime=1552410887.113183443 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/swing/0000755000175000002070000000000013441742745021251 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/swing/PaxHeaders.7406/SwingUtils.java0000644000000000000000000000013013441742745023412 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.233253489 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/swing/SwingUtils.java0000644000175000002070000001461013441742745024226 0ustar00jvanekmock00000000000000/* SwingUtils.java Copyright (C) 2018 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.swing; import java.awt.Component; import java.awt.EventQueue; import java.awt.Window; import java.lang.reflect.InvocationTargetException; import javax.swing.JWindow; import javax.swing.RepaintManager; import javax.swing.SwingUtilities; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.OutputController; /** * Swing / AWT utility class */ public final class SwingUtils { private static final boolean DEBUG_EDT = System.getProperty("icedtea-web.edt.debug", "false").equalsIgnoreCase("true"); // debugging flags: private static final boolean INFO_DIALOG = false; private static final boolean TRACE_INVOKE_EDT = false; private static final boolean TRACE_TG = false; // internals: private static boolean DO_SETUP = true; /** main thread group (initialized at startup) */ private static final ThreadGroup MAIN_GROUP = Thread.currentThread().getThreadGroup(); /* shared Window owner */ private static Window window = null; private SwingUtils() { // forbidden } public static void setup() { if (DO_SETUP) { DO_SETUP = false; // avoid reentrance if (DEBUG_EDT) { trace("Using ThreadCheckingRepaintManager"); RepaintManager.setCurrentManager(new ThreadCheckingRepaintManager()); } } } static void trace(final String msg) { // Use System.err directly for debuging EDT without any conflict with console / logging system System.err.println(msg); } static void traceWithStack(final String msg) { trace(msg); new Throwable().printStackTrace(); } public static void info(final Window dialog) { if (INFO_DIALOG) { trace("Dialog[" + dialog.getName() + "]" + " in TG [" + Thread.currentThread().getThreadGroup() + "]"); checkEDT(); } } public static void checkEDT() { if (!isEventDispatchThread()) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, new Exception("EDT violation")); } } private static boolean isMainThreadGroup() { final Thread t = Thread.currentThread(); final ThreadGroup g = t.getThreadGroup(); if (g != MAIN_GROUP) { if (TRACE_TG) { traceWithStack("----------\ncheckThreadGroup: " + t); } return false; } return true; } // --- SwingUtilities wrapper --- public static Window getWindowAncestor(Component c) { return SwingUtilities.getWindowAncestor(c); } public static boolean isEventDispatchThread() { return EventQueue.isDispatchThread(); } public static void invokeLater(final Runnable doRun) { if (isMainThreadGroup()) { if (TRACE_INVOKE_EDT && isEventDispatchThread()) { traceWithStack("invokeLater() from EDT: MAY be fixed (useless) ?"); } } EventQueue.invokeLater(doRun); } public static void invokeRunnableOrEnqueueLater(final Runnable runnable) { if (isEventDispatchThread()) { runnable.run(); } else { invokeLater(runnable); } } public static void callOnAppContext(final Runnable doRun) throws InterruptedException, InvocationTargetException { EventQueue.invokeAndWait(doRun); } public static void invokeAndWait(final Runnable doRun) { if (isEventDispatchThread()) { if (TRACE_INVOKE_EDT) { traceWithStack("invokeAndWait() from EDT: to be fixed (illegal) ?"); } // Direct invocation: doRun.run(); } else { try { callOnAppContext(doRun); } catch (InterruptedException ie) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ie); } catch (InvocationTargetException ite) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ite); } } } public static synchronized Window getOrCreateWindowOwner() { if (window == null) { invokeAndWait(new Runnable() { @Override public void run() { try { window = new JWindow().getOwner(); window.setName("getOrCreateWindowOwner"); } catch (Exception ex) { OutputController.getLogger().log(ex); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("HEADLESS_MISSCONFIGURED")); } } }); } return window; } } icedtea-web-1.8/netx/net/sourceforge/swing/PaxHeaders.7406/ThreadCheckingRepaintManager.java0000644000000000000000000000013213441742745026765 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.233253489 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/swing/ThreadCheckingRepaintManager.java0000644000175000002070000001046313441742745027601 0ustar00jvanekmock00000000000000/** * License unknown. * based on Alexander Potochkin's "Debugging Swing, the final summary" * when oracle acquired sun, this blog post was removed, and lives only in copies. * most complex was found: http://web.archive.org/web/20150523152453/https://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html */ package net.sourceforge.swing; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import javax.swing.JComponent; import javax.swing.RepaintManager; import static net.sourceforge.swing.SwingUtils.trace; /** * For usage of this class, please refer to http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html *

To use it, call RepaintManager.setCurrentManager(new ThreadCheckingRepaintManager()) then watch the print out * from the console of all threading violations.

*/ public final class ThreadCheckingRepaintManager extends RepaintManager { // it is recommended to pass the complete check private boolean completeCheck = true; private boolean checkIsShowing = false; /** * Creates ThreadCheckingRepaintManager. You can create one and set it using RepaintManager.setCurrentManager(new * ThreadCheckingRepaintManager()). */ public ThreadCheckingRepaintManager() { super(); } /** * Creates ThreadCheckingRepaintManager. You can create one and set it using RepaintManager.setCurrentManager(new * ThreadCheckingRepaintManager()). * * @param checkIsShowing true to only check showing components. */ public ThreadCheckingRepaintManager(boolean checkIsShowing) { super(); this.checkIsShowing = checkIsShowing; } /** * Initially there was a rule that it is safe to create and use Swing components until they are realized but this * rule is not valid any more, and now it is recommended to interact with Swing from EDT only. * * That's why completeCheck flag is used - if you test the old program switch it to false, but new applications * should be tested with completeCheck set to true* * * @return true or false. By default, it is false. */ public boolean isCompleteCheck() { return completeCheck; } /** * @param completeCheck true or false. * * @see #isCompleteCheck() */ public void setCompleteCheck(boolean completeCheck) { this.completeCheck = completeCheck; } @Override public synchronized void addInvalidComponent(JComponent jComponent) { checkThreadViolations(jComponent); super.addInvalidComponent(jComponent); } @Override public synchronized void addDirtyRegion(JComponent jComponent, int i, int i1, int i2, int i3) { checkThreadViolations(jComponent); super.addDirtyRegion(jComponent, i, i1, i2, i3); } private void checkThreadViolations(JComponent c) { if (!SwingUtils.isEventDispatchThread() && (completeCheck || checkIsShowing(c))) { Exception exception = new Exception(); boolean repaint = false; boolean fromSwing = false; StackTraceElement[] stackTrace = exception.getStackTrace(); for (StackTraceElement st : stackTrace) { if (repaint && st.getClassName().startsWith("javax.swing.")) { fromSwing = true; } if ("repaint".equals(st.getMethodName())) { repaint = true; } } if (repaint && !fromSwing) { //no problems here, since repaint() is thread safe return; } trace("----------Wrong Thread START"); trace(getStrackTraceAsString(exception)); trace("----------Wrong Thread END"); } } @SuppressWarnings({"SimplifiableIfStatement"}) private boolean checkIsShowing(JComponent c) { if (this.checkIsShowing) { return c.isShowing(); } else { return true; } } private String getStrackTraceAsString(Exception e) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream(byteArrayOutputStream); e.printStackTrace(printStream); printStream.flush(); return byteArrayOutputStream.toString(); } } icedtea-web-1.8/netx/net/sourceforge/PaxHeaders.7406/jnlp0000644000000000000000000000013213441742745020200 xustar0030 mtime=1552401893.054832792 30 atime=1552410887.113183443 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/jnlp/0000755000175000002070000000000013441742745021065 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/package-info.java0000644000000000000000000000013213441742745023444 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.233253489 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/jnlp/package-info.java0000644000175000002070000000460413441742745024260 0ustar00jvanekmock00000000000000/* package-info.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.*/ /** * This package contains the classes that represent the parts of a Java Network * Launching Protocol (JNLP) file as objects, and a way to launch a JNLP file * as an application, applet, or installer. * *

Package Specification

* *

Related Documentation

* For overviews, tutorials, examples, guides, and tool documentation, please see: * @see JSR56: Java Network Launching Protocol and API * @see Netx JNLP Client * @see Java Web Start JNLP Client */ package net.sourceforge.jnlp; icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/SecurityDesc.java0000644000000000000000000000013213441742745023526 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.233253489 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/jnlp/SecurityDesc.java0000644000175000002070000005215413441742745024345 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.awt.AWTPermission; import java.io.FilePermission; import java.lang.reflect.Constructor; import java.net.SocketPermission; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.security.AllPermission; import java.security.CodeSource; import java.security.Permission; import java.security.PermissionCollection; import java.security.Permissions; import java.security.Policy; import java.security.URIParameter; import java.util.*; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; /** * The security element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.7 $ */ public class SecurityDesc { /** * Represents the security level requested by an applet/application, as specified in its JNLP or HTML. */ public enum RequestedPermissionLevel { NONE(null, null), DEFAULT(null, "default"), SANDBOX(null, "sandbox"), J2EE("j2ee-application-client-permissions", null), ALL("all-permissions", "all-permissions"); public static final String PERMISSIONS_NAME = "permissions"; private final String jnlpString, htmlString; private RequestedPermissionLevel(final String jnlpString, final String htmlString) { this.jnlpString = jnlpString; this.htmlString = htmlString; } /** * This permission level, as it would appear requested in a JNLP file. null if this level * is NONE (unspecified) or cannot be requested in a JNLP file. * @return the String level */ public String toJnlpString() { return this.jnlpString; } /** * This permission level, as it would appear requested in an HTML file. null if this level * is NONE (unspecified) or cannot be requested in an HTML file. * @return the String level */ public String toHtmlString() { return this.htmlString; } /** * The JNLP permission level corresponding to the given String. If null is given, null comes * back. If there is no permission level that can be granted in JNLP matching the given String, * null is also returned. * @param jnlpString the JNLP permission String * @return the matching RequestedPermissionLevel */ public RequestedPermissionLevel fromJnlpString(final String jnlpString) { for (final RequestedPermissionLevel level : RequestedPermissionLevel.values()) { if (level.jnlpString != null && level.jnlpString.equals(jnlpString)) { return level; } } return null; } /** * The HTML permission level corresponding to the given String. If null is given, null comes * back. If there is no permission level that can be granted in HTML matching the given String, * null is also returned. * @param htmlString the JNLP permission String * @return the matching RequestedPermissionLevel */ public RequestedPermissionLevel fromHtmlString(final String htmlString) { for (final RequestedPermissionLevel level : RequestedPermissionLevel.values()) { if (level.htmlString != null && level.htmlString.equals(htmlString)) { return level; } } return null; } } /* * We do not verify security here, the classloader deals with security */ /** All permissions. */ public static final Object ALL_PERMISSIONS = "All"; /** Applet permissions. */ public static final Object SANDBOX_PERMISSIONS = "Sandbox"; /** J2EE permissions. */ public static final Object J2EE_PERMISSIONS = "J2SE"; /** requested permissions type according to HTML or JNLP */ private final RequestedPermissionLevel requestedPermissionLevel; /** permissions type */ private Object type; /** the download host */ final private URL downloadHost; /** whether sandbox applications should get the show window without banner permission */ private final boolean grantAwtPermissions; /** the JNLP file */ private final JNLPFile file; private final Policy customTrustedPolicy; /** * URLPermission is new in Java 8, so we use reflection to check for it to keep compatibility * with Java 6/7. If we can't find the class or fail to construct it then we continue as usual * without. * * These are saved as fields so that the reflective lookup only needs to be performed once * when the SecurityDesc is constructed, rather than every time a call is made to * {@link SecurityDesc#getSandBoxPermissions()}, which is called frequently. */ private static Class urlPermissionClass = null; private static Constructor urlPermissionConstructor = null; static { try { urlPermissionClass = (Class) Class.forName("java.net.URLPermission"); urlPermissionConstructor = urlPermissionClass.getDeclaredConstructor(String.class); } catch (final ReflectiveOperationException | SecurityException e) { OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, "Exception while reflectively finding URLPermission - host is probably not running Java 8+"); OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, e); urlPermissionClass = null; urlPermissionConstructor = null; } } // We go by the rules here: // http://java.sun.com/docs/books/tutorial/deployment/doingMoreWithRIA/properties.html // Since this is security sensitive, take a conservative approach: // Allow only what is specifically allowed, and deny everything else /** basic permissions for restricted mode */ private static Permission j2eePermissions[] = { new AWTPermission("accessClipboard"), // disabled because we can't at this time prevent an // application from accessing other applications' event // queues, or even prevent access to security dialog queues. // // new AWTPermission("accessEventQueue"), new RuntimePermission("exitVM"), new RuntimePermission("loadLibrary"), new RuntimePermission("queuePrintJob"), new SocketPermission("*", "connect"), new SocketPermission("localhost:1024-", "accept, listen"), new FilePermission("*", "read, write"), new PropertyPermission("*", "read"), }; /** basic permissions for restricted mode */ private static Permission sandboxPermissions[] = { new SocketPermission("localhost:1024-", "listen"), // new SocketPermission("", "connect, accept"), // added by code new PropertyPermission("java.util.Arrays.useLegacyMergeSort", "read,write"), new PropertyPermission("java.version", "read"), new PropertyPermission("java.vendor", "read"), new PropertyPermission("java.vendor.url", "read"), new PropertyPermission("java.class.version", "read"), new PropertyPermission("os.name", "read"), new PropertyPermission("os.version", "read"), new PropertyPermission("os.arch", "read"), new PropertyPermission("file.separator", "read"), new PropertyPermission("path.separator", "read"), new PropertyPermission("line.separator", "read"), new PropertyPermission("java.specification.version", "read"), new PropertyPermission("java.specification.vendor", "read"), new PropertyPermission("java.specification.name", "read"), new PropertyPermission("java.vm.specification.vendor", "read"), new PropertyPermission("java.vm.specification.name", "read"), new PropertyPermission("java.vm.version", "read"), new PropertyPermission("java.vm.vendor", "read"), new PropertyPermission("java.vm.name", "read"), new PropertyPermission("javawebstart.version", "read"), new PropertyPermission("javaplugin.*", "read"), new PropertyPermission("jnlp.*", "read,write"), new PropertyPermission("javaws.*", "read,write"), new PropertyPermission("browser", "read"), new PropertyPermission("browser.*", "read"), new RuntimePermission("exitVM"), new RuntimePermission("stopThread"), // disabled because we can't at this time prevent an // application from accessing other applications' event // queues, or even prevent access to security dialog queues. // // new AWTPermission("accessEventQueue"), }; /** basic permissions for restricted mode */ private static Permission jnlpRIAPermissions[] = { new PropertyPermission("awt.useSystemAAFontSettings", "read,write"), new PropertyPermission("http.agent", "read,write"), new PropertyPermission("http.keepAlive", "read,write"), new PropertyPermission("java.awt.syncLWRequests", "read,write"), new PropertyPermission("java.awt.Window.locationByPlatform", "read,write"), new PropertyPermission("javaws.cfg.jauthenticator", "read,write"), new PropertyPermission("javax.swing.defaultlf", "read,write"), new PropertyPermission("sun.awt.noerasebackground", "read,write"), new PropertyPermission("sun.awt.erasebackgroundonresize", "read,write"), new PropertyPermission("sun.java2d.d3d", "read,write"), new PropertyPermission("sun.java2d.dpiaware", "read,write"), new PropertyPermission("sun.java2d.noddraw", "read,write"), new PropertyPermission("sun.java2d.opengl", "read,write"), new PropertyPermission("swing.boldMetal", "read,write"), new PropertyPermission("swing.metalTheme", "read,write"), new PropertyPermission("swing.noxp", "read,write"), new PropertyPermission("swing.useSystemFontSettings", "read,write"), }; /** * Create a security descriptor. * * @param file the JNLP file * @param requestedPermissionLevel the permission level specified in the JNLP * @param type the type of security * @param downloadHost the download host (can always connect to) */ public SecurityDesc(JNLPFile file, RequestedPermissionLevel requestedPermissionLevel, Object type, URL downloadHost) { if (file == null) { throw new NullJnlpFileException(); } this.file = file; this.requestedPermissionLevel = requestedPermissionLevel; this.type = type; this.downloadHost = downloadHost; String key = DeploymentConfiguration.KEY_SECURITY_ALLOW_HIDE_WINDOW_WARNING; grantAwtPermissions = Boolean.valueOf(JNLPRuntime.getConfiguration().getProperty(key)); customTrustedPolicy = getCustomTrustedPolicy(); } /** * Create a security descriptor. * * @param file the JNLP file * @param type the type of security * @param downloadHost the download host (can always connect to) */ public SecurityDesc(JNLPFile file, Object type, URL downloadHost) { this(file, RequestedPermissionLevel.NONE, type, downloadHost); } /** * Returns a Policy object that represents a custom policy to use instead * of granting {@link AllPermission} to a {@link CodeSource} * * @return a {@link Policy} object to delegate to. May be null, which * indicates that no policy exists and AllPermissions should be granted * instead. */ private Policy getCustomTrustedPolicy() { String key = DeploymentConfiguration.KEY_SECURITY_TRUSTED_POLICY; String policyLocation = JNLPRuntime.getConfiguration().getProperty(key); Policy policy = null; if (policyLocation != null) { try { URI policyUri = new URI("file://" + policyLocation); policy = Policy.getInstance("JavaPolicy", new URIParameter(policyUri)); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } // return the appropriate policy, or null return policy; } /** * @return the permissions type, one of: ALL_PERMISSIONS, * SANDBOX_PERMISSIONS, J2EE_PERMISSIONS. */ public Object getSecurityType() { return type; } /** * @return a PermissionCollection containing the basic * permissions granted depending on the security type. * * @param cs the CodeSource to get permissions for */ public PermissionCollection getPermissions(CodeSource cs) { PermissionCollection permissions = getSandBoxPermissions(); // discard sandbox, give all if (ALL_PERMISSIONS.equals(type)) { permissions = new Permissions(); if (customTrustedPolicy == null) { permissions.add(new AllPermission()); return permissions; } else { return customTrustedPolicy.getPermissions(cs); } } // add j2ee to sandbox if needed if (J2EE_PERMISSIONS.equals(type)) for (Permission j2eePermission : j2eePermissions) { permissions.add(j2eePermission); } return permissions; } /** * @return the permission level requested in the JNLP */ public RequestedPermissionLevel getRequestedPermissionLevel() { return requestedPermissionLevel; } /** * @return a PermissionCollection containing the sandbox permissions */ public PermissionCollection getSandBoxPermissions() { final Permissions permissions = new Permissions(); for (Permission sandboxPermission : sandboxPermissions) { permissions.add(sandboxPermission); } if (grantAwtPermissions) { permissions.add(new AWTPermission("showWindowWithoutWarningBanner")); } if (JNLPRuntime.isWebstartApplication()) { if (file == null) { throw new NullJnlpFileException("Can not return sandbox permissions, file is null"); } if (file.isApplication()) { for (Permission jnlpRIAPermission : jnlpRIAPermissions) { permissions.add(jnlpRIAPermission); } } } if (downloadHost != null && downloadHost.getHost().length() > 0) { permissions.add(new SocketPermission(UrlUtils.getHostAndPort(downloadHost), "connect, accept")); } final Collection urlPermissions = getUrlPermissions(); for (final Permission permission : urlPermissions) { permissions.add(permission); } return permissions; } private Set getUrlPermissions() { if (urlPermissionClass == null || urlPermissionConstructor == null) { return Collections.emptySet(); } final Set permissions = new HashSet<>(); for (final JARDesc jar : file.getResources().getJARs()) { try { // Allow applets all HTTP methods (ex POST, GET) with any request headers // on resources anywhere recursively in or below the applet codebase, only on // default ports and ports explicitly specified in resource locations final URI resourceLocation = jar.getLocation().toURI().normalize(); final URI host = getHost(resourceLocation); final String hostUriString = host.toString(); final String urlPermissionUrlString = appendRecursiveSubdirToCodebaseHostString(hostUriString); final Permission p = urlPermissionConstructor.newInstance(urlPermissionUrlString); permissions.add(p); } catch (final ReflectiveOperationException e) { OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, "Exception while attempting to reflectively generate a URLPermission, probably not running on Java 8+?"); OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, e); } catch (final URISyntaxException e) { OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, "Could not determine codebase host for resource at " + jar.getLocation() + " while generating URLPermissions"); OutputController.getLogger().log(e); } } try { final URI codebase = file.getNotNullProbalbeCodeBase().toURI().normalize(); final URI host = getHost(codebase); final String codebaseHostUriString = host.toString(); final String urlPermissionUrlString = appendRecursiveSubdirToCodebaseHostString(codebaseHostUriString); final Permission p = urlPermissionConstructor.newInstance(urlPermissionUrlString); permissions.add(p); } catch (final ReflectiveOperationException e) { OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, "Exception while attempting to reflectively generate a URLPermission, probably not running on Java 8+?"); OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, e); } catch (final URISyntaxException e) { OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, "Could not determine codebase host for codebase " + file.getCodeBase() + " while generating URLPermissions"); OutputController.getLogger().log(e); } return permissions; } /** * Gets the host domain part of an applet's codebase. Removes path, query, and fragment, but preserves scheme, * user info, and host. The port used is overridden with the specified port. * @param codebase the applet codebase URL * @param port * @return the host domain of the codebase * @throws URISyntaxException */ static URI getHostWithSpecifiedPort(final URI codebase, final int port) throws URISyntaxException { Objects.requireNonNull(codebase); return new URI(codebase.getScheme(), codebase.getUserInfo(), codebase.getHost(), port, null, null, null); } /** * Gets the host domain part of an applet's codebase. Removes path, query, and fragment, but preserves scheme, * user info, host, and port. * @param codebase the applet codebase URL * @return the host domain of the codebase * @throws URISyntaxException */ static URI getHost(final URI codebase) throws URISyntaxException { Objects.requireNonNull(codebase); return getHostWithSpecifiedPort(codebase, codebase.getPort()); } /** * Appends a recursive access marker to a codebase host, for granting Java 8 URLPermissions which are no * more restrictive than the existing SocketPermissions * See http://docs.oracle.com/javase/8/docs/api/java/net/URLPermission.html * @param codebaseHost the applet's codebase's host domain URL as a String. Expected to be formatted as eg * "http://example.com:8080" or "http://example.com/" * @return the resulting String eg "http://example.com:8080/- */ static String appendRecursiveSubdirToCodebaseHostString(final String codebaseHost) { Objects.requireNonNull(codebaseHost); String result = codebaseHost; while (result.endsWith("/")) { result = result.substring(0, result.length() - 1); } // See http://docs.oracle.com/javase/8/docs/api/java/net/URLPermission.html result = result + "/-"; // allow access to any resources recursively on the host domain return result; } /** * @return all the names of the basic JNLP system properties accessible by RIAs */ public static String[] getJnlpRIAPermissions() { String[] jnlpPermissions = new String[jnlpRIAPermissions.length]; for (int i = 0; i < jnlpRIAPermissions.length; i++) jnlpPermissions[i] = jnlpRIAPermissions[i].getName(); return jnlpPermissions; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/ParserSettings.java0000644000000000000000000000013213441742745024075 xustar0030 mtime=1552401893.047832806 30 atime=1552402157.233253489 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/jnlp/ParserSettings.java0000644000175000002070000001022713441742745024707 0ustar00jvanekmock00000000000000/* ParserSettings.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import net.sourceforge.jnlp.util.optionparser.OptionParser; /** * Contains settings to be used by the Parser while parsing JNLP files. * * Immutable and therefore thread-safe. */ public class ParserSettings { private static ParserSettings globalParserSettings = new ParserSettings(); private final boolean isStrict; private final boolean extensionAllowed; private final boolean malformedXmlAllowed; /** Create a new ParserSettings with the defautl parser settings */ public ParserSettings() { this(false, true, true); } /** Create a new ParserSettings object * @param strict true if parser should be stric * @param extensionAllowed true if extensions are allowed * @param malformedXmlAllowed true if xml sanitizer should be used */ public ParserSettings(boolean strict, boolean extensionAllowed, boolean malformedXmlAllowed) { this.isStrict = strict; this.extensionAllowed = extensionAllowed; this.malformedXmlAllowed = malformedXmlAllowed; } /** @return true if extensions to the spec are allowed */ public boolean isExtensionAllowed() { return extensionAllowed; } /** @return true if parsing malformed xml is allowed */ public boolean isMalformedXmlAllowed() { return malformedXmlAllowed; } /** @return true if strict parsing mode is to be used */ public boolean isStrict() { return isStrict; } /** * @return the global parser settings in use. */ public static ParserSettings getGlobalParserSettings() { return globalParserSettings; } /** * Set the global ParserSettings to match the given settings. * @param parserSettings to be used */ public static void setGlobalParserSettings(ParserSettings parserSettings) { globalParserSettings = parserSettings; } /** * @param optionParser to be read as source for globaPArserSettings * @return the ParserSettings to be used according to arguments specified * at boot on the command line. These settings are also stored so they * can be retrieved at a later time. */ public static ParserSettings setGlobalParserSettingsFromOptionParser(OptionParser optionParser) { ParserSettings settings = new ParserSettings(optionParser.hasOption(OptionsDefinitions.OPTIONS.STRICT), true, !optionParser.hasOption(OptionsDefinitions.OPTIONS.XML)); setGlobalParserSettings(settings); return globalParserSettings; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/MissingVendorException.java0000644000000000000000000000013213441742745025566 xustar0030 mtime=1552401893.047832806 30 atime=1552402157.233253489 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/jnlp/MissingVendorException.java0000644000175000002070000000304313441742745026376 0ustar00jvanekmock00000000000000// Copyright (C) 2012 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import static net.sourceforge.jnlp.runtime.Translator.R; /** * Thrown when a vendor that is required from the information tag is not found * under the current JVM's locale or as a generalized element. */ public class MissingVendorException extends RequiredElementException { private static final long serialVersionUID = 1L; private static final String message = R("PMissingElement", R("PMissingVendor")); /* (non-Javadoc) * @see net.sourceforge.jnlp.ParseException(String) */ public MissingVendorException() { super(message); } /* (non-Javadoc) * @see net.sourceforge.jnlp.ParseException(String, Throwable) */ public MissingVendorException(Throwable cause) { super(message, cause); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/LaunchDesc.java0000644000000000000000000000013213441742745023131 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.233253489 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/jnlp/LaunchDesc.java0000644000175000002070000000342113441742745023741 0ustar00jvanekmock00000000000000/* LaunchDesc -- Represents a launch description Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; public interface LaunchDesc { public String getMainClass(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/InstallerDesc.java0000644000000000000000000000013213441742745023654 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.233253489 30 ctime=1552410887.039183616 icedtea-web-1.8/netx/net/sourceforge/jnlp/InstallerDesc.java0000644000175000002070000000267613441742745024477 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; /** * The installer-desc element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.6 $ */ public class InstallerDesc implements LaunchDesc { /** the main class name and package. */ private String mainClass; /** * Creates a installer descriptor. * * @param mainClass main class name and package */ public InstallerDesc(String mainClass) { this.mainClass = mainClass; } /** * Returns the main class name and package. */ @Override public String getMainClass() { return mainClass; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/AssociationDesc.java0000644000000000000000000000013113441742745024172 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/AssociationDesc.java0000644000175000002070000000336513441742745025012 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; public final class AssociationDesc { /** the extensions this application wants to register with */ private final String[] extensions; /** the mime type for the association */ private final String mimeType; public AssociationDesc(String mimeType, String[] extensions) throws ParseException { checkMimeType(mimeType); this.mimeType = mimeType; this.extensions = extensions; } /** * @return the extensions for this association */ public String[] getExtensions() { return extensions; } /** * @return the mimetype for this association */ public String getMimeType() { return mimeType; } /** * Check for valid mimeType * @param mimeType a mime type * @throws ParseException if mimeType is an invalid MIME type */ private void checkMimeType(String mimeType) throws ParseException { // TODO check that mime type is valid } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/jdk89acesses0000644000000000000000000000013213441742745022500 xustar0030 mtime=1552401893.037832827 30 atime=1552410887.113183443 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/jdk89acesses/0000755000175000002070000000000013441742745023365 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/jdk89acesses/PaxHeaders.7406/JarIndexAccess.java0000644000000000000000000000013213441742745026246 xustar0030 mtime=1552401893.030832841 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/jdk89acesses/JarIndexAccess.java0000644000175000002070000000473313441742745027065 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.jdk89acesses; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.LinkedList; import java.util.jar.JarFile; import net.sourceforge.jnlp.util.logging.OutputController; /** * Class to access sun.misc.JarINdex for both jdk9 and 8. * * @author jvanek */ public class JarIndexAccess { private static Class jarIndexClass; /*JarIndex*/ private final Object parent; static { try { jarIndexClass = Class.forName("sun.misc.JarIndex"); } catch (ClassNotFoundException ex) { try { OutputController.getLogger().log(ex); OutputController.getLogger().log("Running jdk9+ ?"); jarIndexClass = Class.forName("jdk.internal.util.jar.JarIndex"); } catch (ClassNotFoundException exx) { OutputController.getLogger().log(exx); throw new RuntimeException("JarIndex not found!"); } } } private JarIndexAccess(Object parent) { if (parent == null) { throw new RuntimeException("JarFile can notbe null!"); } this.parent = parent; } public static JarIndexAccess getJarIndex(JarFile jarFile) throws IOException { try { return getJarIndexImpl(jarFile); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } } public static JarIndexAccess getJarIndexImpl(JarFile jarFile) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { Method method = jarIndexClass.getMethod("getJarIndex", JarFile.class); Object o = method.invoke(null, jarFile); if (o == null) { return null; } return new JarIndexAccess(o); } public LinkedList get(String replace) { try { return getImpl(replace); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } } public LinkedList getImpl(String replace) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Method method = jarIndexClass.getMethod("get", String.class); Object o = method.invoke(parent, replace); return (LinkedList) o; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/jdk89acesses/PaxHeaders.7406/SunMiscLauncher.java0000644000000000000000000000013213441742745026463 xustar0030 mtime=1552401893.037832827 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/jdk89acesses/SunMiscLauncher.java0000644000175000002070000000520013441742745027270 0ustar00jvanekmock00000000000000/* Copyright (C) 2016 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.*/ package net.sourceforge.jnlp.jdk89acesses; import java.lang.reflect.Method; import javax.swing.ImageIcon; import net.sourceforge.jnlp.util.logging.OutputController; /** * This class is summ of access to sun.misc.Launcher which was removed in jdk9. * * @author jvanek */ public class SunMiscLauncher { public static ImageIcon getSecureImageIcon(String resource) { try { Class clazz = Class.forName("sun.misc.Launcher"); Object obj = clazz.newInstance(); Method m = clazz.getMethod("getClassLoader"); ClassLoader cl = (ClassLoader) m.invoke(obj); return new ImageIcon(cl.getResource(resource)); } catch (Exception ex) { OutputController.getLogger().log(ex); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "sun.misc.Launcher not found. Running jdk9 or higher? Using unsecure BootClassLoader"); return new ImageIcon(ClassLoader.getSystemClassLoader().getParent().getResource(resource)); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/about0000644000000000000000000000013213441742745021312 xustar0030 mtime=1552401893.031832839 30 atime=1552410887.113183443 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/about/0000755000175000002070000000000013441742745022177 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/about/PaxHeaders.7406/HTMLPanel.java0000644000000000000000000000013213441742745023756 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/about/HTMLPanel.java0000644000175000002070000000617513441742745024577 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.about; import java.awt.BorderLayout; import java.awt.Desktop; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import javax.swing.JEditorPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import net.sourceforge.jnlp.util.logging.OutputController; public class HTMLPanel extends JPanel { protected JEditorPane pane = new JEditorPane(); public HTMLPanel(URL url) { super(new BorderLayout()); try { pane = new JEditorPane(url); } catch (IOException ex) { //no need to have invalid url fatal OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, ex); } pane.setContentType("text/html"); pane.setEditable(false); pane.addHyperlinkListener(new UrlHyperlinkListener()); JScrollPane scroller = new JScrollPane(pane); this.add(scroller, BorderLayout.CENTER); } private class UrlHyperlinkListener implements HyperlinkListener { @Override public void hyperlinkUpdate(HyperlinkEvent event) { if (Desktop.isDesktopSupported() && event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { try { Desktop.getDesktop().browse(event.getURL().toURI()); } catch (URISyntaxException ex) { } catch (IOException ex) { } } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/about/PaxHeaders.7406/AboutDialog.java0000644000000000000000000000013213441742745024424 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/about/AboutDialog.java0000644000175000002070000002341113441742745025235 0ustar00jvanekmock00000000000000/* Main.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.about; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Locale; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import net.sourceforge.jnlp.util.ScreenFinder; import net.sourceforge.jnlp.util.docprovider.TextsProvider; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.HtmlFormatter; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.swing.SwingUtils; public final class AboutDialog extends JPanel implements Runnable, ActionListener { private static final String about_url_stub = "/net/sourceforge/jnlp/resources/about"; private static final String authors_url = "/net/sourceforge/jnlp/resources/AUTHORS.html"; private static final String changelog_url = "/net/sourceforge/jnlp/resources/ChangeLog.html"; private static final String copying_url = "/net/sourceforge/jnlp/resources/COPYING.html"; private static final String news_url = "/net/sourceforge/jnlp/resources/NEWS.html"; private final String app; private final JDialog frame; private JPanel contentPane; //singletons to not laod/generate them all around private static HTMLPanel aboutPanel, authorsPanel, newsPanel, changelogPanel, copyingPanel, helpPanel; private final JButton aboutButton, authorsButton, newsButton, changelogButton, copyingButton, helpButton; private final URL res_authors = getClass().getResource(authors_url); private final URL res_news = getClass().getResource(news_url); private final URL res_changelog = getClass().getResource(changelog_url); private final URL res_copying = getClass().getResource(copying_url); public static enum ShowPage{ ABOUT /*default*/, AUTHORS, NEWS, CHANGELOG, LICENSE, HELP } private AboutDialog(boolean modal, String app, ShowPage showPage) { super(new GridBagLayout()); this.app = app; frame = new JDialog((Frame) null, R("AboutDialogueTabAbout") + " IcedTea-Web", modal); frame.setName("AboutDialog"); SwingUtils.info(frame); frame.setContentPane(this); frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); aboutButton = new JButton( R("AboutDialogueTabAbout")); aboutButton.addActionListener(this); authorsButton = new JButton(R("AboutDialogueTabAuthors")); authorsButton.addActionListener(this); newsButton = new JButton( R("AboutDialogueTabNews")); newsButton.addActionListener(this); changelogButton = new JButton(R("AboutDialogueTabChangelog")); changelogButton.addActionListener(this); copyingButton = new JButton(R("AboutDialogueTabGPLv2")); copyingButton.addActionListener(this); helpButton = new JButton(R("APPEXTSECguiPanelHelpButton")); helpButton.addActionListener(this); switch (showPage) { case ABOUT: actionPerformed(new ActionEvent(aboutButton, 0, "")); break; case AUTHORS: actionPerformed(new ActionEvent(authorsButton, 0, "")); break; case CHANGELOG: actionPerformed(new ActionEvent(changelogButton, 0, "")); break; case HELP: actionPerformed(new ActionEvent(helpButton, 0, "")); break; case LICENSE: actionPerformed(new ActionEvent(copyingButton, 0, "")); break; case NEWS: actionPerformed(new ActionEvent(newsButton, 0, "")); break; default: actionPerformed(new ActionEvent(aboutButton, 0, "")); } } @Override public void actionPerformed(ActionEvent e) { Object action = e.getSource(); if (action.equals(aboutButton)) { if (aboutPanel == null) { String lang = Locale.getDefault().getLanguage(); URL about_lang; try { about_lang = getClass().getResource(about_url_stub + "_" + lang + ".html"); about_lang.openStream().close(); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, ex); //probably unknown locale, switch to english about_lang = getClass().getResource(about_url_stub + "_en.html"); } aboutPanel = new HTMLPanel(about_lang); } contentPane = aboutPanel; } else if (action.equals(authorsButton)) { if (authorsPanel == null) { authorsPanel = new HTMLPanel(res_authors); } contentPane = authorsPanel; } else if (action.equals(newsButton)) { if (newsPanel == null) { newsPanel = new HTMLPanel(res_news); } contentPane = newsPanel; } else if (action.equals(changelogButton)) { if (changelogPanel == null) { changelogPanel = new HTMLPanel(res_changelog); } contentPane = changelogPanel; } else if (action.equals(copyingButton)) { if (copyingPanel == null) { copyingPanel = new HTMLPanel(res_copying); } contentPane = copyingPanel; } else if (action.equals(helpButton)) { if (helpPanel == null) { //copy logo and generate resources to tmp dir try { File f = File.createTempFile("icedtea-web", "help"); f.delete(); f.mkdir(); f.deleteOnExit(); TextsProvider.generateRuntimeHtmlTexts(f); //detect running application File target = new File(f, TextsProvider.ITW + "." + HtmlFormatter.SUFFIX); if (app != null) { target = new File(f, app + "." + HtmlFormatter.SUFFIX); } helpPanel = new InternalHTMLPanel(target.toURI().toURL()); } catch (IOException ex) { OutputController.getLogger().log(ex); } } contentPane = helpPanel; } layoutWindow(); } private void layoutWindow() { this.removeAll(); GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; gbc.gridy = 0; gbc.gridx = 0; gbc.gridwidth = 6; gbc.weightx = 1.0; gbc.weighty = 1.0; this.add(contentPane, gbc); gbc.gridy = 1; gbc.gridx = 0; gbc.gridwidth = 1; gbc.ipady = 16; this.add(aboutButton, gbc); gbc.gridx = 1; this.add(authorsButton, gbc); gbc.gridx = 2; this.add(newsButton, gbc); gbc.gridx = 3; this.add(changelogButton, gbc); gbc.gridx = 4; this.add(copyingButton, gbc); gbc.gridx = 5; this.add(helpButton, gbc); Dimension contentSize = new Dimension(640, 480); contentPane.setMinimumSize(contentSize); contentPane.setPreferredSize(contentSize); contentPane.setBorder(new EmptyBorder(0, 0, 8, 0)); this.setBorder(new EmptyBorder(8, 8, 8, 8)); frame.pack(); } @Override public void run() { layoutWindow(); ScreenFinder.centerWindowsToCurrentScreen(frame); frame.setVisible(true); } public static void display(String app) { display(false, app); } public static void display(boolean modal, String app) { display(modal, app, ShowPage.ABOUT); } public static void display(boolean modal, String app, ShowPage showPage) { SwingUtils.invokeLater(new AboutDialog(modal, app, showPage)); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/about/PaxHeaders.7406/InternalHTMLPanel.java0000644000000000000000000000013213441742745025453 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/about/InternalHTMLPanel.java0000644000175000002070000000506713441742745026273 0ustar00jvanekmock00000000000000/* HTMLPanel.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.about; import java.io.IOException; import java.net.URL; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; public class InternalHTMLPanel extends HTMLPanel { public InternalHTMLPanel(URL url) { super(url); HyperlinkListener[] hl = pane.getHyperlinkListeners(); for (HyperlinkListener hyperlinkListener : hl) { pane.removeHyperlinkListener(hyperlinkListener); } pane.addHyperlinkListener(new LocalUrlHyperlinkListener()); } private class LocalUrlHyperlinkListener implements HyperlinkListener { @Override public void hyperlinkUpdate(HyperlinkEvent event) { if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { try { pane.setPage(event.getURL()); } catch (IOException ex) { } } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/RequiredElementException.java0000644000000000000000000000013213441742745026071 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/RequiredElementException.java0000644000175000002070000000265513441742745026711 0ustar00jvanekmock00000000000000// Copyright (C) 2012 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; /** * Thrown when a field that is required from the information tag is not found * under the current JVM's locale or as a generalized element. */ public class RequiredElementException extends ParseException { private static final long serialVersionUID = 1L; /* (non-Javadoc) * @see net.sourceforge.jnlp.ParseException(String) */ public RequiredElementException(String message) { super(message); } /* (non-Javadoc) * @see net.sourceforge.jnlp.ParseException(String, Throwable) */ public RequiredElementException(String message, Throwable cause) { super(message, cause); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/ParseException.java0000644000000000000000000000013213441742745024051 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/ParseException.java0000644000175000002070000000560313441742745024665 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; /** * Thrown to indicate that an error has occurred while parsing a * JNLP file. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.7 $ */ public class ParseException extends Exception { // todo: add meaningful information, such as the invalid // element, parse position, etc. /** * Create a parse exception with the specified message. * @param message to be shown in exception */ public ParseException(String message) { super(getParserSettingsMessage() + message); } /** * Create a parse exception with the specified message and * cause. * @param message to be used by exception * @param cause cause of exception */ public ParseException(String message, Throwable cause) { super(getParserSettingsMessage() + message, cause); } public ParseException(Throwable cause) { super(getParserSettingsMessage(), cause); } static enum UsedParsers { MALFORMED, NORMAL } private static UsedParsers expected; private static UsedParsers used; static void setExpected(UsedParsers ex) { expected = ex; } static void setUsed(UsedParsers us) { used = us; } private static String getParserSettingsMessage() { final String tail = "" + " " + Translator.R("TAGSOUPtail") + " "; if (expected == UsedParsers.NORMAL && used == UsedParsers.NORMAL) { //warn about xml mode return Translator.R("TAGSOUPnotUsed", OptionsDefinitions.OPTIONS.XML.option)+tail; } if (expected == UsedParsers.MALFORMED && used != UsedParsers.MALFORMED) { //warn about TagSoup return Translator.R("TAGSOUPbroken") + tail; } if (JNLPRuntime.isDebug()) { return expected + " " + used + "; "; } else { return ""; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/MissingInformationException.java0000644000000000000000000000013213441742745026616 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/MissingInformationException.java0000644000175000002070000000300613441742745027425 0ustar00jvanekmock00000000000000// Copyright (C) 2012 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import static net.sourceforge.jnlp.runtime.Translator.R; /** * Thrown when the required information tag is not found * under the current JVM's locale or as a generalized element. */ public class MissingInformationException extends RequiredElementException { private static final long serialVersionUID = 1L; private static final String message = R("PNoInfoElement"); /* (non-Javadoc) * @see net.sourceforge.jnlp.ParseException(String) */ public MissingInformationException() { super(message); } /* (non-Javadoc) * @see net.sourceforge.jnlp.ParseException(String, Throwable) */ public MissingInformationException(Throwable cause) { super(message, cause); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/JNLPSplashScreen.java0000644000000000000000000000013213441742745024176 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/JNLPSplashScreen.java0000644000175000002070000001532713441742745025016 0ustar00jvanekmock00000000000000/* JNLPSplashScreen.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Insets; import java.io.IOException; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.JDialog; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.cache.ResourceTracker; import net.sourceforge.jnlp.splashscreen.SplashPanel; import net.sourceforge.jnlp.splashscreen.SplashUtils; import net.sourceforge.jnlp.splashscreen.parts.InformationElement; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.ScreenFinder; public class JNLPSplashScreen extends JDialog { ResourceTracker resourceTracker; URL splashImageUrl; Image splashImage; private JNLPFile file; public static final int DEF_WIDTH=635; public static final int DEF_HEIGHT=480; private SplashPanel componetSplash; private boolean splashImageLoaded=false; private SplashPanel splash; public JNLPSplashScreen(ResourceTracker resourceTracker, final JNLPFile file) { super(); this.setName("JNLPSplashScreen"); SwingUtils.info(this); setIconImages(ImageResources.INSTANCE.getApplicationImages()); // If the JNLP file does not contain any icon images, the splash image // will consist of the application's title and vendor, as taken from the // JNLP file. this.resourceTracker = resourceTracker; this.file=file; } public void setSplashImageURL(URL url) { splashImageLoaded = false; try { if (url != null) { splashImageUrl = url; splashImage = null; try { splashImage = ImageIO.read(resourceTracker.getCacheFile(splashImageUrl)); if (splashImage == null) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Error loading splash image: " + url); } } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Error loading splash image: " + url); splashImage = null; } catch (IllegalArgumentException argumentException) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Error loading splash image: " + url); splashImage = null; } } if (splashImage == null) { this.setLayout(new BorderLayout()); splash = SplashUtils.getSplashScreen(DEF_WIDTH, DEF_HEIGHT); if (splash != null) { splash.startAnimation(); splash.setInformationElement(InformationElement.createFromJNLP(file)); this.add(splash.getSplashComponent()); this.componetSplash = splash; } } correctSize(); } finally { splashImageLoaded = true; } } public void setFile(JNLPFile file) { this.file = file; if (splash != null) { splash.setInformationElement(InformationElement.createFromJNLP(file)); } } public boolean isSplashImageLoaded() { return splashImageLoaded; } public boolean isSplashScreenValid() { return (splashImage != null) || (componetSplash != null); } private void correctSize() { int minimumWidth = DEF_WIDTH; int minimumHeight = DEF_HEIGHT; if (splashImage != null) { Insets insets = getInsets(); minimumWidth = splashImage.getWidth(null) + insets.left + insets.right; minimumHeight = splashImage.getHeight(null) + insets.top + insets.bottom; } setMinimumSize(new Dimension(0, 0)); setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE)); setSize(new Dimension(minimumWidth, minimumHeight)); setPreferredSize(new Dimension(minimumWidth, minimumHeight)); ScreenFinder.centerWindowsToCurrentScreen(this); } @Override public void paint(Graphics g) { if (splashImage == null) { super.paint(g); return; } correctSize(); Graphics2D g2 = (Graphics2D) g; g2.drawImage(splashImage, getInsets().left, getInsets().top, null); } public boolean isCustomSplashscreen() { return (componetSplash!=null); } public void stopAnimation() { if (isCustomSplashscreen()) componetSplash.stopAnimation(); } public void setErrorSplash(Throwable ex) { if (splash != null){ this.remove(splash.getSplashComponent()); splash = SplashUtils.getErrorSplashScreen(splash.getSplashWidth(), splash.getSplashHeight(), ex); this.add(splash.getSplashComponent()); this.componetSplash = splash; this.validate(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/IconDesc.java0000644000000000000000000000013213441742745022607 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/IconDesc.java0000644000175000002070000000643313441742745023425 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.net.*; /** * The icon element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.8 $ */ public class IconDesc { /** default icon */ public static final Object DEFAULT = "default"; /** selected icon */ public static final Object SELECTED = "selected"; /** disabled icon */ public static final Object DISABLED = "disabled"; /** rollover icon */ public static final Object ROLLOVER = "rollover"; /** splash icon */ public static final Object SPLASH = "splash"; /** destop shortcut icon */ public static final Object SHORTCUT = "shortcut"; /** the location of the icon */ private final URL location; /** the type of icon*/ private final Object kind; /** the width, or -1 if unknown*/ private final int width; /** the height, or -1 if unknown*/ private final int height; /** the depth, or -1 if unknown*/ private final int depth; /** the size, or -1 if unknown*/ private final int size; /** * Creates an icon descriptor with the specified information. * * @param location the location of the icon * @param kind the type of icon * @param width the width, or -1 if unknown * @param height the height, or -1 if unknown * @param depth the depth, or -1 if unknown * @param size the size, or -1 if unknown */ IconDesc(URL location, Object kind, int width, int height, int depth, int size) { this.location = location; this.kind = kind; this.width = width; this.height = height; this.depth = depth; this.size = size; } /** * @return the location of the icon. */ public URL getLocation() { return location; } /** * @return the icon type. */ public Object getKind() { return kind; } /** * @return the icon width or -1 if not specified in the * JNLPFile. */ public int getWidth() { return width; } /** * @return the icon height or -1 if not specified in the * JNLPFile. */ public int getHeight() { return height; } /** * @return the icon size or -1 if not specified in the JNLPFile. */ public int getSize() { return size; } /** * @return the icon depth or -1 if not specified in the * JNLPFile. */ public int getDepth() { return depth; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/AppletDesc.java0000644000000000000000000000013113441742745023143 xustar0029 mtime=1552401893.02183286 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/AppletDesc.java0000644000175000002070000001300413441742745023752 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.net.*; import java.util.*; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; /** * The applet-desc element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.8 $ */ public class AppletDesc implements LaunchDesc { /** the applet name */ private final String name; /** the main class name and package */ private final String mainClass; /** the document base */ private final URL documentBase; /** the width */ private final int width; /** the height */ private final int height; /** the parameters */ private final Map parameters; /** * Create an Applet descriptor. * * @param name the applet name * @param mainClass the main class name and package * @param documentBase the document base * @param width the width * @param height the height * @param parameters the parameters */ public AppletDesc(String name, String mainClass, URL documentBase, int width, int height, Map parameters) { this.name = name; this.mainClass = mainClass; this.documentBase = documentBase; this.width = width; this.height = height; this.parameters = new HashMap<>(parameters); } /** * @return the applet name */ public String getName() { return name; } /** * @return the main class name in the dot-separated form (eg: foo.bar.Baz) */ @Override public String getMainClass() { return mainClass; } /** * @return the document base */ public URL getDocumentBase() { return documentBase; } /** * @return the width */ public int getWidth() { if (width < Integer.valueOf(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_SMALL_SIZE_OVERRIDE_TRESHOLD))) { Integer nww = fixWidth(); if (nww != null) { return nww; } } return width; } /** * @return the height */ public int getHeight() { if (height < Integer.valueOf(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_SMALL_SIZE_OVERRIDE_TRESHOLD))) { Integer nwh = fixHeight(); if (nwh != null) { return nwh; } } return height; } /** * @return the applet parameters */ public Map getParameters() { return new HashMap<>(parameters); } /** * Adds a parameter to the applet. If the parameter already * exists then it is overwritten with the new value. Adding a * parameter will have no effect on already-running applets * launched from this JNLP file. * @param name key of value * @param value value to be added */ public void addParameter(String name, String value) { parameters.put(name, value); } private Integer fixHeight() { return fixSize(DeploymentConfiguration.KEY_SMALL_SIZE_OVERRIDE_HEIGHT, "Height", "height", "HEIGHT"); } private Integer fixWidth() { return fixSize(DeploymentConfiguration.KEY_SMALL_SIZE_OVERRIDE_WIDTH, "Width", "width", "WIDTH"); } private Integer fixSize(String depKey, String... keys) { OutputController.getLogger().log("Found to small applet!"); try { Integer depVal = Integer.valueOf(JNLPRuntime.getConfiguration().getProperty(depKey)); if (depVal == 0) { OutputController.getLogger().log("using its size"); return null; } if (depVal < 0) { OutputController.getLogger().log("enforcing " + depVal); return Math.abs(depVal); } for (String key : keys) { String sizeFromParam = parameters.get(key); if (sizeFromParam != null) { try { OutputController.getLogger().log("using its "+key+"=" + sizeFromParam); return Integer.valueOf(sizeFromParam); } catch (NumberFormatException ex) { OutputController.getLogger().log(ex); } } } OutputController.getLogger().log("defaulting to " + depVal); return depVal; } catch (NumberFormatException | NullPointerException ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); return null; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/util0000644000000000000000000000013113441742745021154 xustar0029 mtime=1552401893.07483275 30 atime=1552410887.113183443 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/0000755000175000002070000000000013441742745022042 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/XDesktopEntry.java0000644000000000000000000000013113441742745024657 xustar0029 mtime=1552401893.07483275 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/XDesktopEntry.java0000644000175000002070000006505013441742745025476 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.util; import net.sourceforge.jnlp.util.logging.OutputController; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.StringReader; import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import net.sourceforge.jnlp.IconDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.Launcher; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.dialogresults.AccessWarningPaneComplexReturn; /** * This class builds a (freedesktop.org) desktop entry out of a {@link JNLPFile} * . This entry can be used to install desktop shortcuts. See xdg-desktop-icon * (1) and http://standards.freedesktop.org/desktop-entry-spec/latest/ for more * information * * @author Omair Majid * * * This class builds also (freedesktop.org) menu entry out of a {@link JNLPFile} * Few notes valid November 2014: * Mate/gnome 2/xfce - no meter of exec or icon put icon to defined/"others" Category * - name is as expected Name's value * - if removed, xfce kept icon until login/logout * kde 4 - unknown Cathegory is sorted to Lost & Found -thats bad * - if icon is not found, nothing shows * - name is GENERIC NAME and then little name * Gnome 3 shell - exec must be valid program! * - also had issues with icon * * conclusion: * - backup icon to .config * - use "Network" category * - force valid launcher * @author (not so proudly) Jiri Vanek */ public class XDesktopEntry implements GenericDesktopEntry { public static final String JAVA_ICON_NAME = "javaws"; private JNLPFile file = null; private int iconSize = -1; private String iconLocation = null; //in pixels private static final int[] VALID_ICON_SIZES = new int[] { 16, 22, 32, 48, 64, 128 }; //browsers we try to find on path for html shortcut public static final String[] BROWSERS = new String[]{"firefox", "midori", "epiphany", "opera", "chromium", "chrome", "konqueror"}; public static final String FAVICON = "favicon.ico"; /** * Create a XDesktopEntry for the given JNLP file * * @param file a {@link JNLPFile} that indicates the application to launch */ public XDesktopEntry(JNLPFile file) { this.file = file; /* looks like a good initial value */ iconSize = VALID_ICON_SIZES[2]; } /** * Returns the contents of the {@link XDesktopEntry} through the * {@link Reader} interface. * @param menu whether to create this icon to menu * @param info result of user's interference * @param isSigned whether the app is signed * @return reader with desktop shortcut specification */ Reader getContentsAsReader(boolean menu, AccessWarningPaneComplexReturn.ShortcutResult info, boolean isSigned) { File generatedJnlp = null; if (file instanceof PluginBridge && (info.getShortcutType() == AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.GENERATED_JNLP || info.getShortcutType() == AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.JNLP_HREF)) { try { String content = ((PluginBridge) file).toJnlp(isSigned, info.getShortcutType() == AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.JNLP_HREF, info.isFixHref()); generatedJnlp = getGeneratedJnlpFileName(); FileUtils.saveFile(content, generatedJnlp); } catch (Exception ex) { OutputController.getLogger().log(ex); } } String fileContents = "[Desktop Entry]\n"; fileContents += "Version=1.0\n"; fileContents += "Name=" + getDesktopIconName() + "\n"; fileContents += "GenericName=Java Web Start Application\n"; fileContents += "Comment=" + sanitize(file.getInformation().getDescription()) + "\n"; if (menu) { //keeping the default category because of KDE String menuString = "Categories=Network;"; if (file.getInformation().getShortcut() != null && file.getInformation().getShortcut().getMenu() != null && file.getInformation().getShortcut().getMenu().getSubMenu() != null && !file.getInformation().getShortcut().getMenu().getSubMenu().trim().isEmpty()) { menuString += file.getInformation().getShortcut().getMenu().getSubMenu().trim() + ";"; } menuString += "Java;Javaws;"; fileContents += menuString + "\n"; } fileContents += "Type=Application\n"; if (iconLocation != null) { fileContents += "Icon=" + iconLocation + "\n"; } else { fileContents += "Icon=" + JAVA_ICON_NAME + "\n"; } if (file.getInformation().getVendor() != null) { fileContents += "X-Vendor=" + sanitize(file.getInformation().getVendor()) + "\n"; } String exec; String title = "xdesktop writing"; if (JNLPRuntime.isWebstartApplication()) { String htmlSwitch = ""; if (JNLPRuntime.isHtml()){ htmlSwitch = " "+OptionsDefinitions.OPTIONS.HTML.option; } exec = "Exec=" + getJavaWsBin() + htmlSwitch + " \"" + file.getSourceLocation() + "\"\n"; fileContents += exec; } else { if (info.getShortcutType() == AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.BROWSER) { String browser = info.getBrowser(); if (browser == null) { browser = getBrowserBin(); } exec = "Exec=" + browser + " \"" + file.getSourceLocation() + "\"\n"; fileContents += exec; } else if ((info.getShortcutType() == AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.GENERATED_JNLP || info.getShortcutType() == AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.JNLP_HREF) && generatedJnlp != null) { exec = "Exec=" + getJavaWsBin() + " \"" + generatedJnlp.getAbsolutePath() + "\"\n"; fileContents += exec; title = title + " (generated jnlp)"; } else if (info.getShortcutType() == AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.JAVAWS_HTML) { exec = "Exec=" + getJavaWsBin() + " -html \"" + file.getSourceLocation() + "\"\n"; fileContents += exec; } else { exec = "Exec=" + getBrowserBin() + " \"" + file.getSourceLocation() + "\"\n"; fileContents += exec; } } OutputController.getLogger().log(title + " " + exec); return new StringReader(fileContents); } public static String getBrowserBin() { String pathResult = findOnPath(BROWSERS); if (pathResult != null) { return pathResult; } else { return "browser_not_found"; } } public static String getJavaWsBin() { //Shortcut executes the jnlp as it was with system preferred java. It should work fine offline //absolute - works in case of self built String exec = System.getProperty(Launcher.KEY_JAVAWS_LOCATION); String pathResult = findOnPath(new String[]{"javaws", System.getProperty("icedtea-web.bin.name")}); if (pathResult != null) { return pathResult; } if (exec != null) { return exec; } return "javaws"; } private static String findOnPath(String[] bins) { String exec = null; //find if one of binaries is on path String path = System.getenv().get("PATH"); if (path == null || path.trim().isEmpty()) { path = System.getenv().get("path"); } if (path == null || path.trim().isEmpty()) { path = System.getenv().get("Path"); } if (path != null && !path.trim().isEmpty()) { //relative - works with alternatives String[] paths = path.split(File.pathSeparator); outerloop: for (String bin : bins) { //when property is not set if (bin == null) { continue; } for (String p : paths) { if (new File(p, bin).exists()) { exec = bin; break outerloop; } } } } return exec; } /** * Sanitizes a string so that it can be used safely in a key=value pair in a * desktop entry file. * * @param input a String to sanitize * @return a string safe to use as either the key or the value in the * key=value pair in a desktop entry file */ private static String sanitize(String input) { if (input == null) { return ""; } /* key=value pairs must be a single line */ input = FileUtils.sanitizeFileName(input, '-'); //return first line or replace new lines by space? return input.split("\n")[0]; } /** * @return the size of the icon (in pixels) for the desktop shortcut */ private int getIconSize() { return iconSize; } File getShortcutTmpFile() { String userTmp = PathsAndFiles.TMP_DIR.getFullPath(); File shortcutFile = new File(userTmp + File.separator + getDesktopIconFileName()); return shortcutFile; } /** * Set the icon size to use for the desktop shortcut * * @param size the size (in pixels) of the icon to use. Commonly used sizes * are of 16, 22, 32, 48, 64 and 128 */ private void setIconSize(int size) { iconSize = size; } /** * Create a desktop shortcut for this desktop entry * @param menu how to create in menu * @param desktop how to create on desktop * @param isSigned if it is signed */ @Override public void createDesktopShortcuts(AccessWarningPaneComplexReturn.ShortcutResult menu, AccessWarningPaneComplexReturn.ShortcutResult desktop, boolean isSigned) { boolean isDesktop = false; if (desktop != null && desktop.isCreate()) { isDesktop = true; } boolean isMenu = false; if (menu != null && menu.isCreate()) { isMenu = true; } try { if (isMenu || isDesktop) { try { cacheIcon(); } catch (NonFileProtocolException ex) { OutputController.getLogger().log(ex); //default icon will be used later } } if (isDesktop) { installDesktopLauncher(desktop, isSigned); } if (isMenu) { installMenuLauncher(menu, isSigned); } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } /** * Install this XDesktopEntry into the user's menu. */ private void installMenuLauncher(AccessWarningPaneComplexReturn.ShortcutResult info, boolean isSigned) { //TODO add itweb-settings tab which alows to remove inidividual items/icons try { File f = getLinuxMenuIconFile(); try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(f), Charset.forName("UTF-8")); Reader reader = getContentsAsReader(true, info, isSigned)) { char[] buffer = new char[1024]; int ret = 0; while (-1 != (ret = reader.read(buffer))) { writer.write(buffer, 0, ret); } } OutputController.getLogger().log("Menu item created: " + f.getAbsolutePath()); } catch (FileNotFoundException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } /** * Install this XDesktopEntry into the user's desktop as a launcher. */ private void installDesktopLauncher(AccessWarningPaneComplexReturn.ShortcutResult info, boolean isSigned) { File shortcutFile = getShortcutTmpFile(); try { if (!shortcutFile.getParentFile().isDirectory() && !shortcutFile.getParentFile().mkdirs()) { throw new IOException(shortcutFile.getParentFile().toString()); } FileUtils.createRestrictedFile(shortcutFile, true); try ( /* * Write out a Java String (UTF-16) as a UTF-8 file */ OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(shortcutFile), Charset.forName("UTF-8")); Reader reader = getContentsAsReader(false, info, isSigned)) { char[] buffer = new char[1024]; int ret = 0; while (-1 != (ret = reader.read(buffer))) { writer.write(buffer, 0, ret); } } /* * Install the desktop entry */ String[] execString = new String[] { "xdg-desktop-icon", "install", "--novendor", shortcutFile.getCanonicalPath() }; OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Execing: " + Arrays.toString(execString)); ProcessBuilder pb = new ProcessBuilder(execString); pb.inheritIO(); Process installer = pb.start(); StreamUtils.waitForSafely(installer); if (!shortcutFile.delete()) { throw new IOException("Unable to delete temporary file:" + shortcutFile); } } catch (FileNotFoundException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } @Override public void refreshExistingShortcuts(boolean desktop, boolean menu) { //TODO TODO TODO TODO TODO TODO TODO TODO //check existing jnlp files //check luncher //get where it poiints //try all supported shortcuts methods //choose the one which have most similar result to exisitng ones } @Override public File getGeneratedJnlpFileName() { String name = FileUtils.sanitizeFileName(file.createNameForDesktopFile()); while (name.endsWith(".jnlp")) { name = name.substring(0, name.length() - 5); } name += ".jnlp"; return new File(findAndVerifyGeneratedJnlpDir(), name); } private class NonFileProtocolException extends Exception { private NonFileProtocolException(String unable_to_cache_icon) { super(unable_to_cache_icon); } } /** * Cache the icon for the desktop entry */ private void cacheIcon() throws IOException, NonFileProtocolException { URL uiconLocation = file.getInformation().getIconLocation(IconDesc.SHORTCUT, iconSize, iconSize); if (uiconLocation == null) { uiconLocation = file.getInformation().getIconLocation(IconDesc.DEFAULT, iconSize, iconSize); } String location = null; if (uiconLocation != null) { //this throws npe, if url (specified in jnlp) points to 404 URL urlLocation = CacheUtil.getCachedResourceURL(uiconLocation, null, UpdatePolicy.SESSION); if (urlLocation == null) { cantCache(); } location = urlLocation.toString(); if (!location.startsWith("file:")) { cantCache(); } } else { URL urlLocation = getFavIconUrl(file); if (urlLocation == null) { cantCache(); } location = urlLocation.toString(); if (!location.startsWith("file:")) { cantCache(); } } if (location != null) { String origLocation = location.substring("file:".length()); this.iconLocation = origLocation; // icons are never unisntalled by itw. however, system clears them on its own.. soemtimes. // once the -Xcelarcache is run, system MAY clean it later, and so image wil be lost. // copy icon somewhere where -Xclearcache can not PathsAndFiles.ICONS_DIR.getFile().mkdirs(); File source = new File(origLocation); String targetName = source.getName(); if (targetName.equals(FAVICON)) { targetName = file.getNotNullProbalbeCodeBase().getHost() + ".ico"; } File target = new File(PathsAndFiles.ICONS_DIR.getFile(), targetName); Files.copy(source.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING); this.iconLocation = target.getAbsolutePath(); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Cached desktop shortcut icon: " + target + " , With source from: " + origLocation); } } static String getFavIcon(JNLPFile file) { URL u = getFavIconUrl(file); if (u == null){ return null; } else { return u.toString(); } } static List possibleFavIconLocations(String path) { while (path.endsWith("/") || path.endsWith("\\")) { path = path.substring(0, path.length() - 1); } if (!path.startsWith("/")) { path = "/" + path; } List r = new ArrayList<>(); do { r.add(path); int last = Math.max(path.lastIndexOf("\\"), path.lastIndexOf("/")); if (last >= 0) { path = path.substring(0, last); } } while (path.contains("/") || path.contains("\\")); if (!r.contains("")) { r.add(""); } return r; } private static URL favUrl(String delimiter, String path, JNLPFile file) throws MalformedURLException { return new URL( file.getNotNullProbalbeCodeBase().getProtocol(), file.getNotNullProbalbeCodeBase().getHost(), file.getNotNullProbalbeCodeBase().getPort(), path + delimiter + FAVICON); } private static URL getFavIconUrl(JNLPFile file) { try { for (String path : possibleFavIconLocations(file.getNotNullProbalbeCodeBase().getPath())) { URL favico = favUrl("/", path, file); //JNLPFile.openURL(favico, null, UpdatePolicy.ALWAYS); //this MAY throw npe, if url (specified in jnlp) points to 404 //the below works just fine URL urlLocation = CacheUtil.getCachedResourceURL(favico, null, UpdatePolicy.SESSION); if (urlLocation != null) { return urlLocation; } } //the icon is much more likely to be found behind / then behinf \/ //So rather duplicating the code here, then wait double time if the icon will be at the start of the path for (String path : possibleFavIconLocations(file.getNotNullProbalbeCodeBase().getPath())) { URL favico = favUrl("\\", path, file); URL urlLocation = CacheUtil.getCachedResourceURL(favico, null, UpdatePolicy.SESSION); if (urlLocation != null) { return urlLocation; } } } catch (Exception ex) { //favicon 404 or similar OutputController.getLogger().log(ex); } return null; } private void cantCache() throws NonFileProtocolException { throw new NonFileProtocolException("Unable to cache icon"); } private String getDesktopIconName() { return getDesktopIconName(file); } static String getDesktopIconName(JNLPFile file) { return sanitize(file.createNameForDesktopFile()); } @Override public File getDesktopIconFile() { return new File(getDesktop(), getDesktopIconFileName()); } static File getDesktop() { return new File(findFreedesktopOrgDesktopPathCatch()); } @Override public File getLinuxMenuIconFile() { return new File(findAndVerifyJavawsMenuDir() + "/" + getDesktopIconFileName()); } @Override public String getDesktopIconFileName() { return getDesktopIconName() + ".desktop"; } private static String findAndVerifyGeneratedJnlpDir() { return findAndVerifyBasicDir(PathsAndFiles.GEN_JNLPS_DIR.getFile(), " directroy for stroing generated jnlps cannot be created. You may expect failure"); } private static String findAndVerifyJavawsMenuDir() { return findAndVerifyBasicDir(PathsAndFiles.MENUS_DIR.getFile(), " directroy for stroing menu entry cannot be created. You may expect failure"); } private static String findAndVerifyBasicDir(File f, String message) { String fPath = f.getAbsolutePath(); if (!f.exists()) { if (!f.mkdirs()) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, fPath + message); } } return fPath; } public static String findFreedesktopOrgDesktopPathCatch() { try { return findFreedesktopOrgDesktopPath(); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); return System.getProperty("user.home") + "/Desktop"; } } /** * Instead of having all this parsing of user-dirs.dirs and replacing * variables we can execute `echo $(xdg-user-dir DESKTOP)` and it will do * all the job in case approaches below become failing * * @return variables (if declared) and quotation marks (unless escaped) free * path * @throws IOException if no file do not exists or key with desktop do not * exists */ private static String findFreedesktopOrgDesktopPath() throws IOException { File userDirs = new File(System.getProperty("user.home") + "/.config/user-dirs.dirs"); if (!userDirs.exists()) { return System.getProperty("user.home") + "/Desktop/"; } return getFreedesktopOrgDesktopPathFrom(userDirs); } private static String getFreedesktopOrgDesktopPathFrom(File userDirs) throws IOException { try (BufferedReader r = new BufferedReader(new FileReader(userDirs))) { return getFreedesktopOrgDesktopPathFrom(r); } } static final String XDG_DESKTOP_DIR = "XDG_DESKTOP_DIR"; static String getFreedesktopOrgDesktopPathFrom(BufferedReader r) throws IOException { while (true) { String s = r.readLine(); if (s == null) { throw new IOException("End of user-dirs found, but no " + XDG_DESKTOP_DIR + " key found"); } s = s.trim(); if (s.startsWith(XDG_DESKTOP_DIR)) { if (!s.contains("=")) { throw new IOException(XDG_DESKTOP_DIR + " has no value"); } String[] keyAndValue = s.split("="); keyAndValue[1] = keyAndValue[1].trim(); String filteredQuotes = filterQuotes(keyAndValue[1]); return evaluateLinuxVariables(filteredQuotes); } } } private static final String MIC = "MAGIC_QUOTIN_ITW_CONSTANT_FOR_DUMMIES"; private static String filterQuotes(String string) { //get rid of " but not of String s = string.replaceAll("\\\\\"", MIC); s = s.replaceAll("\"", ""); s = s.replaceAll(MIC, "\\\""); return s; } private static String evaluateLinuxVariables(String orig) { return evaluateLinuxVariables(orig, System.getenv()); } private static String evaluateLinuxVariables(String orig, Map variables) { List> envVariables = new ArrayList<>(variables.entrySet()); Collections.sort(envVariables, new Comparator>() { @Override public int compare(Entry o1, Entry o2) { return o2.getKey().length() - o1.getKey().length(); } }); while (true) { String before = orig; for (Entry entry : envVariables) { orig = orig.replaceAll("\\$" + entry.getKey(), entry.getValue()); } if (before.equals(orig)) { return orig; } } } @Override public void createShortcutOnWindowsDesktop() throws IOException { throw new UnsupportedOperationException("not suported on linux like systems"); } @Override public void createWindowsMenu() throws IOException { throw new UnsupportedOperationException("not suported on linux like systems"); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/MD5SumWatcher.java0000644000000000000000000000013213441742745024465 xustar0030 mtime=1552401893.073832752 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/MD5SumWatcher.java0000644000175000002070000000720613441742745025302 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import net.sourceforge.jnlp.util.logging.OutputController; public class MD5SumWatcher { private final File watchedFile; private byte[] md5sum; /** * Create a new MD5SumWatcher instance * @param watchedFile the file to watch */ public MD5SumWatcher(final File watchedFile) { this.watchedFile = watchedFile; try { this.md5sum = getSum(); } catch (final IOException ioe) { OutputController.getLogger().log(ioe); this.md5sum = null; } } /** * Get the current MD5 sum of the watched file * @return a byte array of the MD5 sum * @throws FileNotFoundException if the watched file does not exist * @throws IOException if the file cannot be read */ public byte[] getSum() throws FileNotFoundException, IOException { update(); return md5sum; } /** * Detect if the file's MD5 has changed and track its new sum if so * @return if the file's MD5 has changed since the last update * @throws FileNotFoundException if the watched file does not exist * @throws IOException if the file cannot be read */ public boolean update() throws FileNotFoundException, IOException { byte[] newSum; try { newSum = FileUtils.getFileMD5Sum(watchedFile, "MD5"); } catch (final NoSuchAlgorithmException e) { // There definitely should be an MD5 algorithm, but if not, all we can do is fail. // This really, really is not expected to happen, so rethrow as RuntimeException // to avoid having to check for NoSuchAlgorithmExceptions all the time OutputController.getLogger().log(e); throw new RuntimeException(e); } final boolean changed = !Arrays.equals(newSum, md5sum); md5sum = newSum; return changed; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/BasicExceptionDialog.java0000644000000000000000000000013213441742745026115 xustar0030 mtime=1552401893.072832754 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/BasicExceptionDialog.java0000644000175000002070000002061313441742745026727 0ustar00jvanekmock00000000000000/* BasicExceptionDialog.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import net.sourceforge.jnlp.util.logging.OutputController; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent.atomic.AtomicInteger; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.controlpanel.CachePane; import net.sourceforge.jnlp.util.logging.JavaConsole; /** * A dialog that displays some basic information about an exception */ public class BasicExceptionDialog { private static final AtomicInteger dialogInstancess = new AtomicInteger(); /** * Must be invoked from the Swing EDT. * * @param exception the exception to indicate */ public static void show(Exception exception) { String detailsText = OutputController.exceptionToString(exception); final JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); JOptionPane optionPane = new JOptionPane(mainPanel, JOptionPane.ERROR_MESSAGE); final JDialog errorDialog = optionPane.createDialog(R("Error")); errorDialog.setName("BasicExceptionDialog"); SwingUtils.info(errorDialog); errorDialog.setIconImages(ImageResources.INSTANCE.getApplicationImages()); final JPanel quickInfoPanelAll = new JPanel(); final JPanel quickInfoPanelMessage = new JPanel(); final JPanel quickInfoPanelButtons = new JPanel(); BoxLayout layoutAll = new BoxLayout(quickInfoPanelAll, BoxLayout.Y_AXIS); BoxLayout layoutMessage = new BoxLayout(quickInfoPanelMessage, BoxLayout.X_AXIS); BoxLayout layoutButtons = new BoxLayout(quickInfoPanelButtons, BoxLayout.X_AXIS); quickInfoPanelAll.setLayout(layoutAll); quickInfoPanelMessage.setLayout(layoutMessage); quickInfoPanelButtons.setLayout(layoutButtons); mainPanel.add(quickInfoPanelAll, BorderLayout.PAGE_START); quickInfoPanelAll.add(quickInfoPanelMessage); quickInfoPanelAll.add(quickInfoPanelButtons); JLabel errorLabel = new JLabel(exception.getMessage()); errorLabel.setAlignmentY(JComponent.LEFT_ALIGNMENT); quickInfoPanelMessage.add(errorLabel); final JButton viewDetails = new JButton(R("ButShowDetails")); viewDetails.setAlignmentY(JComponent.LEFT_ALIGNMENT); viewDetails.setActionCommand("show"); quickInfoPanelButtons.add(viewDetails); final JButton cacheButton = getClearCacheButton(errorDialog); cacheButton.setAlignmentY(JComponent.LEFT_ALIGNMENT); quickInfoPanelButtons.add(cacheButton); final JButton consoleButton = getShowButton(errorDialog); consoleButton.setAlignmentY(JComponent.LEFT_ALIGNMENT); quickInfoPanelButtons.add(consoleButton); final JPanel fillRest = new JPanel(); fillRest.setAlignmentY(JComponent.LEFT_ALIGNMENT); quickInfoPanelButtons.add(fillRest); JTextArea textArea = new JTextArea(); textArea.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); textArea.setEditable(false); textArea.setText(detailsText); final JScrollPane scrollPane = new JScrollPane(textArea); scrollPane.setPreferredSize(new Dimension(100, 200)); viewDetails.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (viewDetails.getActionCommand().equals("show")) { mainPanel.add(scrollPane, BorderLayout.CENTER); viewDetails.setActionCommand("hide"); viewDetails.setText(R("ButHideDetails")); errorDialog.pack(); } else { mainPanel.remove(scrollPane); viewDetails.setActionCommand("show"); viewDetails.setText(R("ButShowDetails")); errorDialog.pack(); } } }); errorDialog.pack(); errorDialog.setResizable(true); ScreenFinder.centerWindowsToCurrentScreen(errorDialog); errorDialog.setVisible(true); errorDialog.dispose(); BasicExceptionDialog.willBeHidden(); } public static JButton getShowButton(final Component parent) { JButton consoleButton = new JButton(); consoleButton.setText(R("DPJavaConsole")); consoleButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { try { JavaConsole.getConsole().showConsoleLater(true); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); JOptionPane.showConfirmDialog(parent, ex); } } }); if (!JavaConsole.isEnabled()) { consoleButton.setEnabled(false); consoleButton.setToolTipText(R("DPJavaConsoleDisabledHint")); } return consoleButton; } public static JButton getClearCacheButton(final Component parent) { JButton clearAllButton = new JButton(); clearAllButton.setText(R("CVCPCleanCache")); clearAllButton.setToolTipText(R("CVCPCleanCacheTip")); clearAllButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { try { CachePane.visualCleanCache(parent); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, ex); } } }); } }); return clearAllButton; } private synchronized static int willBeHidden() { return dialogInstancess.decrementAndGet(); } //must be called out of EDT, otherise -- will happen before ++ public synchronized static int willBeShown() { return dialogInstancess.incrementAndGet(); } public synchronized static boolean areShown() { return dialogInstancess.intValue() > 0; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/replacements0000644000000000000000000000013213441742745023637 xustar0030 mtime=1552401893.077832744 30 atime=1552410887.113183443 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/replacements/0000755000175000002070000000000013441742745024524 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/replacements/PaxHeaders.7406/CharacterDecoder.java0000644000000000000000000000013213441742745027741 xustar0030 mtime=1552401893.077832744 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/replacements/CharacterDecoder.java0000644000175000002070000002055113441742745030554 0ustar00jvanekmock00000000000000/* * Copyright (c) 1995, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package net.sourceforge.jnlp.util.replacements; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PushbackInputStream; import java.nio.ByteBuffer; /** * This class defines the decoding half of character encoders. * A character decoder is an algorithim for transforming 8 bit * binary data that has been encoded into text by a character * encoder, back into original binary form. * The character encoders, in general, have been structured * around a central theme that binary data can be encoded into * text that has the form: *

 *      [Buffer Prefix]
 *      [Line Prefix][encoded data atoms][Line Suffix]
 *      [Buffer Suffix]
 * 
*

* Of course in the simplest encoding schemes, the buffer has no * distinct prefix of suffix, however all have some fixed relationship * between the text in an 'atom' and the binary data itself. *

*

* In the {@link CharacterEncoder} and {@code CharacterDecoder} * classes, one complete chunk of data is referred to as a * buffer. Encoded buffers are all text, and decoded buffers * (sometimes just referred to as buffers) are binary octets. *

*

* To create a custom decoder, you must, at a minimum, overide three * abstract methods in this class. *

*
*
bytesPerAtom which tells the decoder how many bytes to * expect from decodeAtom
*
decodeAtom which decodes the bytes sent to it as text.
*
bytesPerLine which tells the encoder the maximum number of * bytes per line.
*
*

* In general, the character decoders return error in the form of a * CEFormatException. The syntax of the detail string is *


 *      DecoderClassName: Error message.
 * 
*

* Several useful decoders have already been written and are * referenced in the See Also list below. *

* @author Chuck McManis * @see CharacterEncoder * @see BASE64Decoder */ public abstract class CharacterDecoder { /** This exception is thrown when EOF is reached */ protected static class CEStreamExhausted extends IOException { }; /** Return the number of bytes per atom of decoding */ abstract protected int bytesPerAtom(); /** Return the maximum number of bytes that can be encoded per line */ abstract protected int bytesPerLine(); /** decode the beginning of the buffer, by default this is a NOP. */ protected void decodeBufferPrefix(PushbackInputStream aStream, OutputStream bStream) throws IOException { } /** decode the buffer suffix, again by default it is a NOP. */ protected void decodeBufferSuffix(PushbackInputStream aStream, OutputStream bStream) throws IOException { } /** * This method should return, if it knows, the number of bytes * that will be decoded. Many formats such as uuencoding provide * this information. By default we return the maximum bytes that * could have been encoded on the line. */ protected int decodeLinePrefix(PushbackInputStream aStream, OutputStream bStream) throws IOException { return (bytesPerLine()); } /** * This method post processes the line, if there are error detection * or correction codes in a line, they are generally processed by * this method. The simplest version of this method looks for the * (newline) character. */ protected void decodeLineSuffix(PushbackInputStream aStream, OutputStream bStream) throws IOException { } /** * This method does an actual decode. It takes the decoded bytes and * writes them to the OutputStream. The integer l tells the * method how many bytes are required. This is always less or equal to bytesPerAtom(). */ protected void decodeAtom(PushbackInputStream aStream, OutputStream bStream, int l) throws IOException { throw new CEStreamExhausted(); } /** * This method works around the bizarre semantics of BufferedInputStream's * read method. */ protected int readFully(InputStream in, byte buffer[], int offset, int len) throws java.io.IOException { for (int i = 0; i < len; i++) { int q = in.read(); if (q == -1) { return ((i == 0) ? -1 : i); } buffer[i+offset] = (byte)q; } return len; } /** * Decode the text from the InputStream and write the decoded * octets to the OutputStream. This method runs until the stream * is exhausted. * @exception IOException The input stream is unexpectedly out of data, An error has occured while decoding */ public void decodeBuffer(InputStream aStream, OutputStream bStream) throws IOException { int i; int totalBytes = 0; PushbackInputStream ps = new PushbackInputStream (aStream); decodeBufferPrefix(ps, bStream); while (true) { int length; try { length = decodeLinePrefix(ps, bStream); for (i = 0; (i+bytesPerAtom()) < length; i += bytesPerAtom()) { decodeAtom(ps, bStream, bytesPerAtom()); totalBytes += bytesPerAtom(); } if ((i + bytesPerAtom()) == length) { decodeAtom(ps, bStream, bytesPerAtom()); totalBytes += bytesPerAtom(); } else { decodeAtom(ps, bStream, length - i); totalBytes += (length - i); } decodeLineSuffix(ps, bStream); } catch (CEStreamExhausted e) { break; } } decodeBufferSuffix(ps, bStream); } /** * Alternate decode interface that takes a String containing the encoded * buffer and returns a byte array containing the data. * @exception IOException An error has occured while decoding */ public byte decodeBuffer(String inputString)[] throws IOException { byte inputBuffer[] = new byte[inputString.length()]; ByteArrayInputStream inStream; ByteArrayOutputStream outStream; inputString.getBytes(0, inputString.length(), inputBuffer, 0); inStream = new ByteArrayInputStream(inputBuffer); outStream = new ByteArrayOutputStream(); decodeBuffer(inStream, outStream); return (outStream.toByteArray()); } /** * Decode the contents of the inputstream into a buffer. */ public byte decodeBuffer(InputStream in)[] throws IOException { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); decodeBuffer(in, outStream); return (outStream.toByteArray()); } /** * Decode the contents of the String into a ByteBuffer. */ public ByteBuffer decodeBufferToByteBuffer(String inputString) throws IOException { return ByteBuffer.wrap(decodeBuffer(inputString)); } /** * Decode the contents of the inputStream into a ByteBuffer. */ public ByteBuffer decodeBufferToByteBuffer(InputStream in) throws IOException { return ByteBuffer.wrap(decodeBuffer(in)); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/replacements/PaxHeaders.7406/BASE64Decoder.java0000644000000000000000000000013213441742745026731 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/replacements/BASE64Decoder.java0000644000175000002070000001323713441742745027547 0ustar00jvanekmock00000000000000/* * Copyright (c) 1995, 2000, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package net.sourceforge.jnlp.util.replacements; import java.io.IOException; import java.io.OutputStream; import java.io.PushbackInputStream; /** * This class implements a BASE64 Character decoder as specified in RFC1521. * * This RFC is part of the MIME specification which is published by the * Internet Engineering Task Force (IETF). Unlike some other encoding * schemes there is nothing in this encoding that tells the decoder * where a buffer starts or stops, so to use it you will need to isolate * your encoded data into a single chunk and then feed them this decoder. * The simplest way to do that is to read all of the encoded data into a * string and then use: *
 *      byte    mydata[];
 *      BASE64Decoder base64 = new BASE64Decoder();
 *
 *      mydata = base64.decodeBuffer(bufferString);
 * 
* This will decode the String in bufferString and give you an array * of bytes in the array myData. * * On errors, this class throws a CEFormatException with the following detail * strings: *
 *    "BASE64Decoder: Not enough bytes for an atom."
 * 
* * @author Chuck McManis * @see CharacterEncoder * @see BASE64Decoder */ public class BASE64Decoder extends CharacterDecoder { private static class CEFormatException extends IOException { public CEFormatException(String s) { super(s); } } /** This class has 4 bytes per atom */ @Override protected int bytesPerAtom() { return (4); } /** Any multiple of 4 will do, 72 might be common */ @Override protected int bytesPerLine() { return (72); } /** * This character array provides the character to value map * based on RFC1521. */ private final static char pem_array[] = { // 0 1 2 3 4 5 6 7 'A','B','C','D','E','F','G','H', // 0 'I','J','K','L','M','N','O','P', // 1 'Q','R','S','T','U','V','W','X', // 2 'Y','Z','a','b','c','d','e','f', // 3 'g','h','i','j','k','l','m','n', // 4 'o','p','q','r','s','t','u','v', // 5 'w','x','y','z','0','1','2','3', // 6 '4','5','6','7','8','9','+','/' // 7 }; private final static byte pem_convert_array[] = new byte[256]; static { for (int i = 0; i < 255; i++) { pem_convert_array[i] = -1; } for (int i = 0; i < pem_array.length; i++) { pem_convert_array[pem_array[i]] = (byte) i; } } byte decode_buffer[] = new byte[4]; /** * Decode one BASE64 atom into 1, 2, or 3 bytes of data. */ @Override protected void decodeAtom(PushbackInputStream inStream, OutputStream outStream, int rem) throws java.io.IOException { int i; byte a = -1, b = -1, c = -1, d = -1; if (rem < 2) { throw new CEFormatException("BASE64Decoder: Not enough bytes for an atom."); } do { i = inStream.read(); if (i == -1) { throw new CEStreamExhausted(); } } while (i == '\n' || i == '\r'); decode_buffer[0] = (byte) i; i = readFully(inStream, decode_buffer, 1, rem-1); if (i == -1) { throw new CEStreamExhausted(); } if (rem > 3 && decode_buffer[3] == '=') { rem = 3; } if (rem > 2 && decode_buffer[2] == '=') { rem = 2; } switch (rem) { case 4: d = pem_convert_array[decode_buffer[3] & 0xff]; // NOBREAK case 3: c = pem_convert_array[decode_buffer[2] & 0xff]; // NOBREAK case 2: b = pem_convert_array[decode_buffer[1] & 0xff]; a = pem_convert_array[decode_buffer[0] & 0xff]; break; } switch (rem) { case 2: outStream.write( (byte)(((a << 2) & 0xfc) | ((b >>> 4) & 3)) ); break; case 3: outStream.write( (byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3)) ); outStream.write( (byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf)) ); break; case 4: outStream.write( (byte) (((a << 2) & 0xfc) | ((b >>> 4) & 3)) ); outStream.write( (byte) (((b << 4) & 0xf0) | ((c >>> 2) & 0xf)) ); outStream.write( (byte) (((c << 6) & 0xc0) | (d & 0x3f)) ); break; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/replacements/PaxHeaders.7406/CharacterEncoder.java0000644000000000000000000000013213441742745027753 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/replacements/CharacterEncoder.java0000644000175000002070000002771113441742745030573 0ustar00jvanekmock00000000000000/* * Copyright (c) 1995, 2005, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package net.sourceforge.jnlp.util.replacements; import java.io.InputStream; import java.io.ByteArrayInputStream; import java.io.OutputStream; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.IOException; import java.nio.ByteBuffer; /** * This class defines the encoding half of character encoders. * A character encoder is an algorithim for transforming 8 bit binary * data into text (generally 7 bit ASCII or 8 bit ISO-Latin-1 text) * for transmition over text channels such as e-mail and network news. * The character encoders have been structured around a central theme * that, in general, the encoded text has the form: *

 *      [Buffer Prefix]
 *      [Line Prefix][encoded data atoms][Line Suffix]
 *      [Buffer Suffix]
 * 
*

* In the {@code CharacterEncoder} and {@link CharacterDecoder} * classes, one complete chunk of data is referred to as a * buffer. Encoded buffers are all text, and decoded buffers * (sometimes just referred to as buffers) are binary octets. *

* To create a custom encoder, you must, at a minimum, overide three * abstract methods in this class. *
*
bytesPerAtom which tells the encoder how many bytes to * send to encodeAtom
*
encodeAtom which encodes the bytes sent to it as text.
*
bytesPerLine which tells the encoder the maximum number of * bytes per line.
*
*

* Several useful encoders have already been written and are * referenced in the See Also list below. *

* @author Chuck McManis * @see CharacterDecoder * @see BASE64Encoder */ public abstract class CharacterEncoder { /** Stream that understands "printing" */ protected PrintStream pStream; /** Return the number of bytes per atom of encoding */ abstract protected int bytesPerAtom(); /** Return the number of bytes that can be encoded per line */ abstract protected int bytesPerLine(); /** * Encode the prefix for the entire buffer. By default is simply * opens the PrintStream for use by the other functions. */ protected void encodeBufferPrefix(OutputStream aStream) throws IOException { pStream = new PrintStream(aStream); } /** * Encode the suffix for the entire buffer. */ protected void encodeBufferSuffix(OutputStream aStream) throws IOException { } /** * Encode the prefix that starts every output line. */ protected void encodeLinePrefix(OutputStream aStream, int aLength) throws IOException { } /** * Encode the suffix that ends every output line. By default * this method just prints a newline into the output stream. */ protected void encodeLineSuffix(OutputStream aStream) throws IOException { pStream.println(); } /** Encode one "atom" of information into characters. */ abstract protected void encodeAtom(OutputStream aStream, byte someBytes[], int anOffset, int aLength) throws IOException; /** * This method works around the bizarre semantics of BufferedInputStream's * read method. */ protected int readFully(InputStream in, byte buffer[]) throws java.io.IOException { for (int i = 0; i < buffer.length; i++) { int q = in.read(); if (q == -1) return i; buffer[i] = (byte)q; } return buffer.length; } /** * Encode bytes from the input stream, and write them as text characters * to the output stream. This method will run until it exhausts the * input stream, but does not print the line suffix for a final * line that is shorter than bytesPerLine(). */ public void encode(InputStream inStream, OutputStream outStream) throws IOException { int j; int numBytes; byte tmpbuffer[] = new byte[bytesPerLine()]; encodeBufferPrefix(outStream); while (true) { numBytes = readFully(inStream, tmpbuffer); if (numBytes == 0) { break; } encodeLinePrefix(outStream, numBytes); for (j = 0; j < numBytes; j += bytesPerAtom()) { if ((j + bytesPerAtom()) <= numBytes) { encodeAtom(outStream, tmpbuffer, j, bytesPerAtom()); } else { encodeAtom(outStream, tmpbuffer, j, (numBytes)- j); } } if (numBytes < bytesPerLine()) { break; } else { encodeLineSuffix(outStream); } } encodeBufferSuffix(outStream); } /** * Encode the buffer in aBuffer and write the encoded * result to the OutputStream aStream. */ public void encode(byte aBuffer[], OutputStream aStream) throws IOException { ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); encode(inStream, aStream); } /** * A 'streamless' version of encode that simply takes a buffer of * bytes and returns a string containing the encoded buffer. */ public String encode(byte aBuffer[]) { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); String retVal = null; try { encode(inStream, outStream); // explicit ascii->unicode conversion retVal = outStream.toString("8859_1"); } catch (Exception IOException) { // This should never happen. throw new Error("CharacterEncoder.encode internal error"); } return (retVal); } /** * Return a byte array from the remaining bytes in this ByteBuffer. *

* The ByteBuffer's position will be advanced to ByteBuffer's limit. *

*

* To avoid an extra copy, the implementation will attempt to return the * byte array backing the ByteBuffer. If this is not possible, a * new byte array will be created. *

*/ private byte [] getBytes(ByteBuffer bb) { /* * This should never return a BufferOverflowException, as we're * careful to allocate just the right amount. */ byte [] buf = null; /* * If it has a usable backing byte buffer, use it. Use only * if the array exactly represents the current ByteBuffer. */ if (bb.hasArray()) { byte [] tmp = bb.array(); if ((tmp.length == bb.capacity()) && (tmp.length == bb.remaining())) { buf = tmp; bb.position(bb.limit()); } } if (buf == null) { /* * This class doesn't have a concept of encode(buf, len, off), * so if we have a partial buffer, we must reallocate * space. */ buf = new byte[bb.remaining()]; /* * position() automatically updated */ bb.get(buf); } return buf; } /** * Encode the aBuffer ByteBuffer and write the encoded * result to the OutputStream aStream. *

* The ByteBuffer's position will be advanced to ByteBuffer's limit. *

*/ public void encode(ByteBuffer aBuffer, OutputStream aStream) throws IOException { byte [] buf = getBytes(aBuffer); encode(buf, aStream); } /** * A 'streamless' version of encode that simply takes a ByteBuffer * and returns a string containing the encoded buffer. *

* The ByteBuffer's position will be advanced to ByteBuffer's limit. *

*/ public String encode(ByteBuffer aBuffer) { byte [] buf = getBytes(aBuffer); return encode(buf); } /** * Encode bytes from the input stream, and write them as text characters * to the output stream. This method will run until it exhausts the * input stream. It differs from encode in that it will add the * line at the end of a final line that is shorter than bytesPerLine(). */ public void encodeBuffer(InputStream inStream, OutputStream outStream) throws IOException { int j; int numBytes; byte tmpbuffer[] = new byte[bytesPerLine()]; encodeBufferPrefix(outStream); while (true) { numBytes = readFully(inStream, tmpbuffer); if (numBytes == 0) { break; } encodeLinePrefix(outStream, numBytes); for (j = 0; j < numBytes; j += bytesPerAtom()) { if ((j + bytesPerAtom()) <= numBytes) { encodeAtom(outStream, tmpbuffer, j, bytesPerAtom()); } else { encodeAtom(outStream, tmpbuffer, j, (numBytes)- j); } } encodeLineSuffix(outStream); if (numBytes < bytesPerLine()) { break; } } encodeBufferSuffix(outStream); } /** * Encode the buffer in aBuffer and write the encoded * result to the OutputStream aStream. */ public void encodeBuffer(byte aBuffer[], OutputStream aStream) throws IOException { ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); encodeBuffer(inStream, aStream); } /** * A 'streamless' version of encode that simply takes a buffer of * bytes and returns a string containing the encoded buffer. */ public String encodeBuffer(byte aBuffer[]) { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); try { encodeBuffer(inStream, outStream); } catch (Exception IOException) { // This should never happen. throw new Error("CharacterEncoder.encodeBuffer internal error"); } return (outStream.toString()); } /** * Encode the aBuffer ByteBuffer and write the encoded * result to the OutputStream aStream. *

* The ByteBuffer's position will be advanced to ByteBuffer's limit. *

*/ public void encodeBuffer(ByteBuffer aBuffer, OutputStream aStream) throws IOException { byte [] buf = getBytes(aBuffer); encodeBuffer(buf, aStream); } /** * A 'streamless' version of encode that simply takes a ByteBuffer * and returns a string containing the encoded buffer. *

* The ByteBuffer's position will be advanced to ByteBuffer's limit. *

*/ public String encodeBuffer(ByteBuffer aBuffer) { byte [] buf = getBytes(aBuffer); return encodeBuffer(buf); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/replacements/PaxHeaders.7406/BASE64Encoder.java0000644000000000000000000000013213441742745026743 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/replacements/BASE64Encoder.java0000644000175000002070000001034613441742745027557 0ustar00jvanekmock00000000000000/* * Copyright (c) 1995, 1997, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package net.sourceforge.jnlp.util.replacements; import java.io.OutputStream; import java.io.IOException; /** * This class implements a BASE64 Character encoder as specified in RFC1521. * This RFC is part of the MIME specification as published by the Internet * Engineering Task Force (IETF). Unlike some other encoding schemes there * is nothing in this encoding that indicates * where a buffer starts or ends. * * This means that the encoded text will simply start with the first line * of encoded text and end with the last line of encoded text. * * @author Chuck McManis * @see CharacterEncoder * @see BASE64Decoder */ public class BASE64Encoder extends CharacterEncoder { /** this class encodes three bytes per atom. */ protected int bytesPerAtom() { return (3); } /** * this class encodes 57 bytes per line. This results in a maximum * of 57/3 * 4 or 76 characters per output line. Not counting the * line termination. */ protected int bytesPerLine() { return (57); } /** This array maps the characters to their 6 bit values */ private final static char pem_array[] = { // 0 1 2 3 4 5 6 7 'A','B','C','D','E','F','G','H', // 0 'I','J','K','L','M','N','O','P', // 1 'Q','R','S','T','U','V','W','X', // 2 'Y','Z','a','b','c','d','e','f', // 3 'g','h','i','j','k','l','m','n', // 4 'o','p','q','r','s','t','u','v', // 5 'w','x','y','z','0','1','2','3', // 6 '4','5','6','7','8','9','+','/' // 7 }; /** * encodeAtom - Take three bytes of input and encode it as 4 * printable characters. Note that if the length in len is less * than three is encodes either one or two '=' signs to indicate * padding characters. */ protected void encodeAtom(OutputStream outStream, byte data[], int offset, int len) throws IOException { byte a, b, c; if (len == 1) { a = data[offset]; b = 0; c = 0; outStream.write(pem_array[(a >>> 2) & 0x3F]); outStream.write(pem_array[((a << 4) & 0x30) + ((b >>> 4) & 0xf)]); outStream.write('='); outStream.write('='); } else if (len == 2) { a = data[offset]; b = data[offset+1]; c = 0; outStream.write(pem_array[(a >>> 2) & 0x3F]); outStream.write(pem_array[((a << 4) & 0x30) + ((b >>> 4) & 0xf)]); outStream.write(pem_array[((b << 2) & 0x3c) + ((c >>> 6) & 0x3)]); outStream.write('='); } else { a = data[offset]; b = data[offset+1]; c = data[offset+2]; outStream.write(pem_array[(a >>> 2) & 0x3F]); outStream.write(pem_array[((a << 4) & 0x30) + ((b >>> 4) & 0xf)]); outStream.write(pem_array[((b << 2) & 0x3c) + ((c >>> 6) & 0x3)]); outStream.write(pem_array[c & 0x3F]); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/WeakList.java0000644000000000000000000000013213441742745023620 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/WeakList.java0000644000175000002070000001002313441742745024424 0ustar00jvanekmock00000000000000// Copyright (C) 2002-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.util; import java.lang.ref.*; import java.util.*; /** * This list stores objects automatically using weak references. * Objects are added and removed from the list as normal, but may * turn to null at any point (ie, indexOf(x) followed by get(x) * may return null). The weak references are only removed when * the trimToSize method is called so that the indices remain * constant otherwise. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.3 $ * @param generic typeto be used in this list */ public class WeakList extends AbstractList { /* list of weak references */ private final ArrayList> refs = new ArrayList<>(); /** * Create a weak random-access list. */ public WeakList() { } /** * Extract the hard reference out of a weak reference. */ private E deref(WeakReference o) { if (o != null) return o.get(); else return null; } /** * @param index of field to get * @return the object at the specified index, or null if the * object has been collected. */ @Override public E get(int index) { return deref(refs.get(index)); } /** * @return the size of the list, including already collected * objects. */ @Override public int size() { return refs.size(); } /** * Sets the object at the specified position and returns the * previous object at that position or null if it was already * collected. * @param index position where to place element * @param element data which to put on position * @return previous object on that position */ @Override public E set(int index, E element) { return deref(refs.set(index, new WeakReference<>(element))); } /** * Inserts the object at the specified position in the list. * Automatically creates a weak reference to the object. * @param index position where to insert element * @param element data which to put on position */ @Override public void add(int index, E element) { refs.add(index, new WeakReference<>(element)); } /** * Removes the object at the specified position and returns it * or returns null if it was already collected. * @param index of element to be removed * @return previous object on that position */ @Override public E remove(int index) { return deref(refs.remove(index)); } /** * @return a list of hard references to the objects. The * returned list does not include the collected elements, so its * indices do not necessarily correlate with those of this list. */ public List hardList() { List result = new ArrayList<>(); for (int i = 0; i < size(); i++) { E tmp = get(i); if (tmp != null) result.add(tmp); } return result; } /** * Compacts the list by removing references to collected * objects. */ public void trimToSize() { for (int i = size(); i-- > 0;) if (get(i) == null) remove(i); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/InvalidJarHeaderException.java0000644000000000000000000000013213441742745027110 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.233253489 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/InvalidJarHeaderException.java0000644000175000002070000000364313441742745027726 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; /** * Thrown from net.sourceforge.jnlp.utilJArFile when verification of headers fails * */ public class InvalidJarHeaderException extends RuntimeException{ public InvalidJarHeaderException(String string) { super(string); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/ui0000644000000000000000000000013213441742745021572 xustar0030 mtime=1552401893.054832792 30 atime=1552410887.113183443 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/ui/0000755000175000002070000000000013441742745022457 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/ui/PaxHeaders.7406/NonEditableTableModel.java0000644000000000000000000000013213441742745026627 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/ui/NonEditableTableModel.java0000644000175000002070000001203613441742745027441 0ustar00jvanekmock00000000000000/* NonEditableTableModel.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.ui; import java.util.Vector; import javax.swing.table.DefaultTableModel; /** * A table model that in effect is a {@link DefaultTableModel} except for no * cell being editable. * @see DefaultTableModel * @since IcedTea-Web 1.5 */ public class NonEditableTableModel extends DefaultTableModel { /** * Constructs a {@link javax.swing.table.TableModel} that serves only one * purpose: make cells of certificate tables not editable. * @see DefaultTableModel#DefaultTableModel() */ public NonEditableTableModel() { super(); } /** * Constructs a {@link javax.swing.table.TableModel} that serves only one * purpose: make cells of certificate tables not editable. * @param rowCount the number of rows the table holds * @param columnCount the number of columns the table holds * @see DefaultTableModel#DefaultTableModel(int,int) */ public NonEditableTableModel(final int rowCount, final int columnCount) { super(rowCount, columnCount); } /** * Constructs a {@link javax.swing.table.TableModel} that serves only one * purpose: make cells of certificate tables not editable. * @param data the data of the table * @param columnNames the names of the columns * @see DefaultTableModel#DefaultTableModel(Object[][],Object[]) */ public NonEditableTableModel(final Object[][] data, final Object[] columnNames) { super(data, columnNames); } /** * Constructs a {@link javax.swing.table.TableModel} that serves only one * purpose: make cells of certificate tables not editable. * @param columnNames {@code array} containing the names of the new columns; * if this is {@code null} then the model has no columns * @param rowCount the number of rows the table holds * @see DefaultTableModel#DefaultTableModel(Object[],int) */ public NonEditableTableModel(final Object[] columnNames, final int rowCount) { super(columnNames, rowCount); } /** * Constructs a {@link javax.swing.table.TableModel} that serves only one * purpose: make cells of certificate tables not editable. * @param columnNames {@code vector} containing the names of the new columns; * if this is {@code null} then the model has no columns * @param rowCount the number of rows the table holds * @see DefaultTableModel#DefaultTableModel(Vector,int) */ public NonEditableTableModel(final Vector columnNames, final int rowCount) { super(columnNames, rowCount); } /** * Constructs a {@link javax.swing.table.TableModel} that serves only one * purpose: make cells of certificate tables not editable. * @param data the data of the table, a {@code Vector} of {@code Vector}s * of {@code Object} values * @param columnNames {@code vector} containing the names of the new columns * @see DefaultTableModel#DefaultTableModel(Vector,Vector) */ public NonEditableTableModel(final Vector data, final Vector columnNames) { super(data, columnNames); } /** * This method always returns {@code false} to make the table's cells not * editable. * @param row the row whose value to be queried * @param column the column whose value to be queried * @return always {@code false} */ @Override public boolean isCellEditable(final int row, final int column) { return false; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/ui/PaxHeaders.7406/package-info.java0000644000000000000000000000013213441742745025036 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/ui/package-info.java0000644000175000002070000000362213441742745025651 0ustar00jvanekmock00000000000000/* package-info.java Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.*/ /** * Contains classes that deal with common and recurring UI tasks. *

* NOTE: Before adding new self-sufficient {@code public static} methods * to this package please evaluate thier suitability for @link UI first.

* @since IcedTea-Web 1.5 */ package net.sourceforge.jnlp.util.ui; icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/optionparser0000644000000000000000000000013213441742745023702 xustar0030 mtime=1552401893.053832793 30 atime=1552410887.113183443 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/optionparser/0000755000175000002070000000000013441742745024567 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/optionparser/PaxHeaders.7406/InvalidArgumentException0000644000000000000000000000013213441742745030652 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/optionparser/InvalidArgumentException.java0000644000175000002070000000343213441742745032404 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.optionparser; public class InvalidArgumentException extends Exception { public InvalidArgumentException(String argument) { super(argument); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/optionparser/PaxHeaders.7406/UnevenParameterException0000644000000000000000000000013013441742745030660 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/optionparser/UnevenParameterException.java0000644000175000002070000000343713441742745032421 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.optionparser; public class UnevenParameterException extends RuntimeException { public UnevenParameterException(String argument) { super(argument); } }icedtea-web-1.8/netx/net/sourceforge/jnlp/util/optionparser/PaxHeaders.7406/OptionParser.java0000644000000000000000000000013213441742745027247 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/optionparser/OptionParser.java0000644000175000002070000001627313441742745030070 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.optionparser; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.sourceforge.jnlp.OptionsDefinitions; import static net.sourceforge.jnlp.runtime.Translator.R; /** Parses for options (passed in as arguments) * To use add entries to OPTIONS enum in OptionsDefinitions * and make a static method return a list containing * what OPTIONS are to be parsed for. */ public class OptionParser { private final String[] args; private final List parsedOptions; private final List possibleOptions; //List of all possible main arguments private final List mainArgumentList = new ArrayList<>(); private boolean evenNumberFound; public OptionParser(String[] args, List options) throws UnevenParameterException { this.args = Arrays.copyOf(args, args.length); this.possibleOptions = options; evenNumberFound = false; parsedOptions = new ArrayList<>(); parseContents(); if (evenNumberFound) { checkOptionHasEvenNumber(); } } private void parseContents() { ParsedOption lastOption = null; for (String arg : args) { if (isOption(arg)) { lastOption = addOptionToList(arg); } else if (shouldAddParam(lastOption)) { lastOption.addParam(arg); } else if (isEvenNumberSupportingEqualsChars(lastOption)) { evenNumberFound = true; handleEvenNumberSupportingEqualsChar(lastOption, arg); } else { mainArgumentList.add(arg); } } } private void handleEvenNumberSupportingEqualsChar(final ParsedOption lastOption, String arg) { if (arg.contains("=")) { lastOption.addParam(arg.split("=")[0]); lastOption.addParam(arg.split("=", 2)[1]); } else { lastOption.addParam(arg); } } private boolean shouldAddParam(final ParsedOption lastOption) { return lastOption != null && (oneOrMoreArguments(lastOption) || isOneArgumentNotFull(lastOption)); } private boolean isOneArgumentNotFull(final ParsedOption lastOption) { return lastOption.getOption().hasOneArgument() && lastOption.getParams().isEmpty(); } private boolean oneOrMoreArguments(final ParsedOption lastOption) { return lastOption.getOption().hasOneOrMoreArguments(); } private boolean isEvenNumberSupportingEqualsChars(final ParsedOption lastOption) { return lastOption != null && lastOption.getOption().hasEvenNumberSupportingEqualsChar(); } private ParsedOption addOptionToList(final String arg) { ParsedOption option = new ParsedOption(argumentToOption(arg)); if (arg.contains("=")) { option.addParam(arg.split("=", 2)[1]); } parsedOptions.add(option); return option; } private void checkOptionHasEvenNumber() throws UnevenParameterException { for (ParsedOption option : parsedOptions) { if (isEvenNumberSupportingEqualsChars(option)) { if (option.getParams().size() % 2 != 0){ throw new UnevenParameterException(R("OPUnevenParams", option.getOption().option)); } } } } private OptionsDefinitions.OPTIONS argumentToOption(final String arg) { for (OptionsDefinitions.OPTIONS opt : possibleOptions) { if (stringEqualsOption(arg, opt)) { return opt; } } return null; } private boolean isOption(String input) { return argumentToOption(input) != null; } protected static boolean stringEqualsOption(String input, OptionsDefinitions.OPTIONS opt) { String option = removeLeadingHyphens(opt.option); input = removeLeadingHyphens(input).split("=")[0]; return input.equals(option); } private static String removeLeadingHyphens(final String input) { return input.replaceAll("^-*", ""); } public boolean hasOption(OptionsDefinitions.OPTIONS option) { for (ParsedOption parsed : parsedOptions) { if (option == parsed.getOption()) { return true; } } return false; } public boolean mainArgExists() { return mainArgumentList.size() > 0; } public String getMainArg() { if (mainArgExists()) { return mainArgumentList.get(0); } return ""; } public List getMainArgs() { return new ArrayList<>(mainArgumentList); } public String getParam(OptionsDefinitions.OPTIONS option) { List params = getParams(option); if (params.size() > 0) { return getParams(option).get(0); } return ""; } public List getParams(OptionsDefinitions.OPTIONS option) { List result = new ArrayList<>(); for (ParsedOption parsed : parsedOptions) { if (parsed.getOption() == option) { for (String param : parsed.getParams()) { result.add(param); } } } return result; } public int getNumberOfOptions() { return parsedOptions.size(); } public void addOption(OptionsDefinitions.OPTIONS options, String... params) { ParsedOption x = new ParsedOption(options); for (String string : params) { x.addParam(string); } parsedOptions.add(x); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/optionparser/PaxHeaders.7406/ParsedOption.java0000644000000000000000000000013213441742745027231 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/optionparser/ParsedOption.java0000644000175000002070000000436513441742745030051 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.optionparser; import java.util.ArrayList; import java.util.List; import static net.sourceforge.jnlp.OptionsDefinitions.*; public class ParsedOption { private OPTIONS option; private List params = new ArrayList<>(); ParsedOption(OPTIONS option) { this.option = option; } public List getParams() { return new ArrayList<>(params); } public void addParam(String param) { params.add(param); } public void setParams(List params) { this.params = new ArrayList<>(params); } public OPTIONS getOption() { return option; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/logging0000644000000000000000000000013213441742745022603 xustar0030 mtime=1552401893.076832746 30 atime=1552410887.113183443 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/0000755000175000002070000000000013441742745023470 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/UnixSystemLog.java0000644000000000000000000000013213441742745026315 xustar0030 mtime=1552401893.076832746 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/UnixSystemLog.java0000644000175000002070000000536313441742745027134 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import net.sourceforge.jnlp.util.StreamUtils; import net.sourceforge.jnlp.util.docprovider.TextsProvider; public class UnixSystemLog implements SingleStreamLogger{ public UnixSystemLog(){ } @Override public void log(String message) { final String s = "IcedTea-Web java error - for more info see itweb-settings debug options or console. See " + TextsProvider.ITW_BUGS + " for help.\nIcedTea-Web java error manual log: \n" + message; try { String[] ss = s.split("\\n"); //exceptions have many lines for (String m : ss) { m = m.replaceAll("\t", " "); ProcessBuilder pb = new ProcessBuilder("logger", "-p","user.err", "--", m); Process p = pb.start(); StreamUtils.waitForSafely(p); OutputController.getLogger().log("System logger called with result of " + p.exitValue()); } } catch (Exception ex) { OutputController.getLogger().log(ex); } } @Override public void close() { //nope } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/ConsoleOutputPaneModel.java0000644000000000000000000000013213441742745030133 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java0000644000175000002070000004362213441742745030752 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.util.logging; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Observable; import java.util.Random; import java.util.regex.Pattern; import net.sourceforge.jnlp.util.logging.OutputController.Level; import net.sourceforge.jnlp.util.logging.headers.Header; import net.sourceforge.jnlp.util.logging.headers.JavaMessage; import net.sourceforge.jnlp.util.logging.headers.MessageWithHeader; import net.sourceforge.jnlp.util.logging.headers.ObservableMessagesProvider; import net.sourceforge.jnlp.util.logging.headers.PluginHeader; import net.sourceforge.jnlp.util.logging.headers.PluginMessage; public class ConsoleOutputPaneModel { ConsoleOutputPaneModel(ObservableMessagesProvider dataProvider) { this.dataProvider = dataProvider; } boolean shouldUpdate() { for (int i = lastUpdateIndex; i < dataProvider.getData().size(); i++) { if (!filtered(dataProvider.getData().get(i))) { return true; } } return false; } private abstract class CatchedMessageWithHeaderComparator implements Comparator { @Override public int compare(MessageWithHeader o1, MessageWithHeader o2) { try { final int order = revertSort ? 1 : -1; return order * body(o1, o2); } catch (NullPointerException npe) { //caused by corrupted c messages return 0; } } abstract int body(MessageWithHeader o1, MessageWithHeader o2); } //testign data provider static class TestMessagesProvider extends Observable implements ObservableMessagesProvider { List data = new ArrayList(); List origData = new ArrayList(); public List getData() { return data; } @Override public Observable getObservable() { return this; } public TestMessagesProvider() { createData(); new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(new Random().nextInt(2000)); data.add(origData.get(new Random().nextInt(origData.size()))); TestMessagesProvider.this.setChanged(); TestMessagesProvider.this.notifyObservers(); } catch (Exception ex) { ex.printStackTrace(); } } } }).start(); } void createData() { String[] plugin = { "plugindebug 1384850630162925 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1204] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: PIPE: plugin read: plugin PluginProxyInfo reference 1 http://www.walter-fendt.de:80", "preinit_plugindebug 1384850630162920 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1204] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: PIPE: plugin read: plugin PluginProxyInfo reference 1 http://www.walter-fendt.de:80", "plugindebugX 1384850630162954 [jvanek][ITW-Cplugindebug 1384850630163008 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1124] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: parts[0]=plugin, parts[1]=PluginProxyInfo, reference, parts[3]=1, parts[4]=http://www.walter-fendt.de:80 -- decoded_url=http://www.walter-fendt.de:80", "preinit_pluginerror 1384850630163294 [jvanek][ITW-C-PLUGIN][MESSAGE_ERROR][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1134] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: Proxy info: plugin PluginProxyInfo reference 1 DIRECT", "pluginerror 1384850630163291 [jvanek][ITW-C-PLUGIN][MESSAGE_ERROR][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1134] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: Proxy info: plugin PluginProxyInfo reference 1 DIRECT" }; for (String string : plugin) { origData.add(new PluginMessage(string)); } origData.add(new JavaMessage(new Header(Level.ERROR_ALL, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 1")); origData.add(new JavaMessage(new Header(Level.ERROR_DEBUG, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 3")); origData.add(new JavaMessage(new Header(Level.WARNING_ALL, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 2")); origData.add(new JavaMessage(new Header(Level.WARNING_DEBUG, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 4")); origData.add(new JavaMessage(new Header(Level.MESSAGE_DEBUG, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 9")); JavaMessage m1 = new JavaMessage(new Header(Level.MESSAGE_ALL, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "app1"); JavaMessage m2 = new JavaMessage(new Header(Level.ERROR_ALL, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "app2"); m1.getHeader().isClientApp = true; m2.getHeader().isClientApp = true; origData.add(m1); origData.add(m2); origData.add(new JavaMessage(new Header(Level.MESSAGE_ALL, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 0 - multilined \n" + "since beggining\n" + " later\n" + "again from beggingin\n" + " even later")); data.addAll(origData); } } static final Pattern defaultPattern = Pattern.compile("(m?)(.*\n*)*"); ObservableMessagesProvider dataProvider; Pattern lastValidPattern = defaultPattern; Pattern usedPattern = lastValidPattern; int lastUpdateIndex; //to add just what was added newly int statisticsShown; private static final String HTMLCOLOR_DIMRED = "FF6666"; private static final String HTMLCOLOR_MIDGRAY = "666666"; private static final String HTMLCOLOR_SPARKRED = "FF0000"; private static final String HTMLCOLOR_LIGHTGRAY = "AAAAAA"; private static final String HTMLCOLOR_GREENYELLOW = "AAAA00"; private static final String HTMLCOLOR_PINKYREAD = "FF0055"; private static final String HTMLCOLOR_BLACK = "000000"; private static final String HTMLCOLOR_GREEN = "669966"; private static final String HTMLCOLOR_PURPLE = "990066"; String importList() { return importList(lastUpdateIndex); } String importList(int start) { return importList(highLight, start); } String importList(boolean mark, int start) { return importList(mark, start, sortBy); } String importList(boolean mark, int start, int sortByLocal) { int added = start; StringBuilder sb = new StringBuilder(); if (mark) { sb.append("
"); } List sortedList; synchronized (dataProvider.getData()) { if (start == 0) { sortedList = preSort(dataProvider.getData(), sortByLocal); } else { sortedList = preSort(Collections.synchronizedList(dataProvider.getData().subList(start, dataProvider.getData().size())), sortByLocal); } } lastUpdateIndex = dataProvider.getData().size(); for (MessageWithHeader messageWithHeader : sortedList) { if (filtered(messageWithHeader)) { continue; } if (mark) { sb.append("
"); //sb.append(""); sb.append("
"); } //always wrap, looks better, works smoother sb.append("\n"); added++; } if (mark) { sb.append("
"); } statisticsShown = added; return sb.toString(); } public static String escapeHtmlForJTextPane(String line) { line = line.replaceAll("<", "<") .replaceAll(">", ">") .replaceAll("\n", "
\n") .replaceAll(" ", "  ")//small trick, html is reducting row of spaces to single space. This handles it and stimm allow line wrap .replaceAll("\t", "    "); return line; } String createLine(MessageWithHeader m) { StringBuilder sb = new StringBuilder(); if (showHeaders) { sb.append(m.getHeader().toString(showUser, showOrigin, showLevel, showDate, showCode, showThread1, showThread2)); } if (showMessage && showHeaders) { sb.append(": "); } if (showMessage) { sb.append(m.getMessage().toString()); } return sb.toString(); } List preSort(List data, int sortByLocal) { List sortedData; if (sortByLocal == 0) { if (revertSort) { sortedData = Collections.synchronizedList(new ArrayList(data)); Collections.reverse(sortedData); } else { sortedData = data; } } else { sortedData = Collections.synchronizedList(new ArrayList(data)); switch (sortByLocal) { case 1: Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { @Override public int body(MessageWithHeader o1, MessageWithHeader o2) { return o1.getHeader().user.compareTo(o2.getHeader().user); } }); break; case 2: Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { @Override public int body(MessageWithHeader o1, MessageWithHeader o2) { return o1.getHeader().getOrigin().compareTo(o2.getHeader().getOrigin()); } }); break; case 3: Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { @Override public int body(MessageWithHeader o1, MessageWithHeader o2) { return o1.getHeader().level.toString().compareTo(o2.getHeader().level.toString()); } }); break; case 4: Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { @Override public int body(MessageWithHeader o1, MessageWithHeader o2) { return o1.getHeader().timestamp.compareTo(o2.getHeader().timestamp); } }); break; case 5: Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { @Override public int body(MessageWithHeader o1, MessageWithHeader o2) { return o1.getHeader().caller.compareTo(o2.getHeader().caller); } }); break; case 6: Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { @Override public int body(MessageWithHeader o1, MessageWithHeader o2) { return o1.getHeader().thread1.compareTo(o2.getHeader().thread1); } }); break; case 7: Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { @Override public int body(MessageWithHeader o1, MessageWithHeader o2) { return o1.getMessage().compareTo(o2.getMessage()); } }); break; case 8: Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { @Override public int body(MessageWithHeader o1, MessageWithHeader o2) { return o1.getHeader().thread2.compareTo(o2.getHeader().thread2); } }); break; } } return sortedData; } boolean filtered(MessageWithHeader m) { if (!showOut && m.getHeader().level.isOutput() && !m.getHeader().level.isWarning()) { return true; } if (!showErr && m.getHeader().level.isError() && !m.getHeader().level.isWarning()) { return true; } if (!showDebug && m.getHeader().level.isDebug()) { return true; } if (!showInfo && m.getHeader().level.isInfo()) { return true; } if (!showItw && !m.getHeader().isClientApp) { return true; } if (!showApp && m.getHeader().isClientApp) { return true; } if (!showJava && !m.getHeader().isC) { return true; } if (!showPlugin && m.getHeader().isC) { return true; } if (m.getHeader() instanceof PluginHeader) { PluginHeader mm = (PluginHeader) m.getHeader(); if (!showPreInit && mm.preinit) { return true; } if (!showPostInit && !mm.preinit) { return true; } if (!showIncomplete && m instanceof PluginMessage && ((PluginMessage) (m)).wasError) { return true; } if (!showComplete && m instanceof PluginMessage && !((PluginMessage) (m)).wasError) { return true; } } if (regExLabel) { String s = createLine(m); if (matchPattern && !usedPattern.matcher(s).matches()) { return true; } if (!matchPattern && usedPattern.matcher(s).matches()) { return true; } } return false; } String createStatisticHint() { return statisticsShown + "/" + dataProvider.getData().size(); } boolean highLight; boolean matchPattern; boolean regExLabel; boolean revertSort; boolean showCode; boolean showComplete; boolean showDate; boolean showDebug; boolean showErr; boolean showHeaders; boolean showIncomplete; boolean showInfo; boolean showItw; boolean showApp; boolean showJava; boolean showLevel; boolean showMessage; boolean showOrigin; boolean showOut; boolean showPlugin; boolean showPostInit; boolean showPreInit; boolean showThread1; boolean showThread2; boolean showUser; int sortBy; boolean wordWrap; } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/SingleStreamLogger.java0000644000000000000000000000013213441742745027260 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/SingleStreamLogger.java0000644000175000002070000000346613441742745030101 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; public interface SingleStreamLogger extends AutoCloseable { public void log(String s); @Override public void close() throws Exception; } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/filelogs0000644000000000000000000000013213441742745024407 xustar0030 mtime=1552401893.052832796 30 atime=1552410887.113183443 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/filelogs/0000755000175000002070000000000013441742745025274 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/filelogs/PaxHeaders.7406/LogBasedFileLog.java0000644000000000000000000000013213441742745030251 xustar0030 mtime=1552401893.047832806 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/filelogs/LogBasedFileLog.java0000644000175000002070000000701113441742745031060 0ustar00jvanekmock00000000000000/* Copyright (C) 2011, 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging.filelogs; import java.io.File; import java.io.IOException; import java.util.logging.FileHandler; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.FileLog; import net.sourceforge.jnlp.util.logging.SingleStreamLogger; /** * This class writes log information to file. */ public final class LogBasedFileLog implements SingleStreamLogger { //really instance bounded private final Logger impl; private final FileHandler fh; // testing constructor public LogBasedFileLog(String fileName, boolean append) { this(fileName, fileName, append); } public LogBasedFileLog(String loggerName, String fileName, boolean append) { try { File futureFile = new File(fileName); if (!futureFile.exists()) { FileUtils.createRestrictedFile(futureFile, true); } fh = new FileHandler(fileName, append); fh.setFormatter(new Formatter() { @Override public String format(LogRecord record) { return record.getMessage() + "\n"; } }); impl = Logger.getLogger(loggerName); impl.setLevel(Level.ALL); impl.addHandler(fh); log(FileLog.getHeadlineHeader().toString() + " log-based impl."); } catch (IOException e) { throw new RuntimeException(e); } } /** * Log the String to file. * * @param s {@link Exception} that was thrown. */ @Override public synchronized void log(String s) { impl.log(Level.FINE, s); } @Override public void close() { fh.close(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/filelogs/PaxHeaders.7406/WriterBasedFileLog.j0000644000000000000000000000013213441742745030314 xustar0030 mtime=1552401893.052832796 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/filelogs/WriterBasedFileLog.java0000644000175000002070000000660713441742745031625 0ustar00jvanekmock00000000000000/* Copyright (C) 2011, 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging.filelogs; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.FileLog; import net.sourceforge.jnlp.util.logging.SingleStreamLogger; /** * This class writes log information to file. */ public final class WriterBasedFileLog implements SingleStreamLogger { private final BufferedWriter bw; public WriterBasedFileLog(String fileName, boolean append) { this(fileName, fileName, append); } public WriterBasedFileLog(String loggerName, String fileName, boolean append) { try { File futureFile = new File(fileName); if (!futureFile.exists()) { FileUtils.createRestrictedFile(futureFile, true); } bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(fileName), append), "UTF-8")); log(FileLog.getHeadlineHeader().toString() + " writer-based impl."); } catch (IOException e) { throw new RuntimeException(e); } } /** * Log the String to file. * * @param s {@link Exception} that was thrown. */ @Override public synchronized void log(String s) { try { bw.write(s); if (!s.endsWith("\n")) { bw.newLine(); } bw.flush(); } catch (IOException e) { throw new RuntimeException(e); } } @Override public void close() throws IOException { try { bw.flush(); } finally { bw.close(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/JavaConsole.java0000644000000000000000000000013213441742745025727 xustar0030 mtime=1552401893.047832806 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/JavaConsole.java0000644000175000002070000005215213441742745026544 0ustar00jvanekmock00000000000000/* JavaConsole -- A java console for the plugin Copyright (C) 2009, 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Observable; import java.util.Properties; import java.util.Set; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFormattedTextField; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JSplitPane; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.text.DefaultFormatter; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.logging.headers.MessageWithHeader; import net.sourceforge.jnlp.util.logging.headers.ObservableMessagesProvider; import net.sourceforge.jnlp.util.logging.headers.PluginMessage; /** * A simple Java console for IcedTeaPlugin and JavaWS * */ public class JavaConsole implements ObservableMessagesProvider { final private List rawData = Collections.synchronizedList(new ArrayList()); final private List outputs = new ArrayList(); public JavaConsole() { //add middleware, which catches client's application stdout/err //and will submit it into console System.setErr(new TeeOutputStream(System.err, true)); System.setOut(new TeeOutputStream(System.out, false)); //internal stdOut/Err are going throughs outLog/errLog //when console is off, those tees are not installed } private void refreshOutputs() { refreshOutputs(outputsPanel, (Integer) numberOfOutputs.getValue()); } private void refreshOutputs(JPanel pane, int count) { pane.removeAll(); while (outputs.size() > count) { getObservable().deleteObserver(outputs.get(outputs.size() - 1)); outputs.remove(outputs.size() - 1); } while (outputs.size() < count) { ConsoleOutputPane c1 = new ConsoleOutputPane(this); observable.addObserver(c1); outputs.add(c1); } if (count == 0) { pane.add(new JPanel()); } else if (outputs.size() == 1) { pane.add(outputs.get(0)); } else { JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, outputs.get(outputs.size() - 2), outputs.get(outputs.size() - 1)); splitPane.setDividerLocation(0.5); splitPane.setResizeWeight(0.5); for (int i = outputs.size() - 3; i >= 0; i--) { JSplitPane outerPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, outputs.get(i), splitPane); outerPane.setDividerLocation(0.5); outerPane.setResizeWeight(0.5); splitPane = outerPane; } pane.add(splitPane); } pane.validate(); } private static class PublicObservable extends Observable { @Override public synchronized void setChanged() { super.setChanged(); } } public static interface ClassLoaderInfoProvider { public Map getLoaderInfo(); } private static JavaConsole console; private Dimension lastSize; private JDialog consoleWindow; private JPanel contentPanel; private JPanel outputsPanel; private ClassLoaderInfoProvider classLoaderInfoProvider; private JSpinner numberOfOutputs; private PublicObservable observable = new PublicObservable(); private boolean initialized = false; private static class JavaConsoleHolder { //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom private static final JavaConsole INSTANCE = new JavaConsole(); } public static JavaConsole getConsole() { return JavaConsoleHolder.INSTANCE; } public static boolean isEnabled() { return isEnabled(JNLPRuntime.getConfiguration()); } public static boolean isEnabled(DeploymentConfiguration config) { return !DeploymentConfiguration.CONSOLE_DISABLE.equals(config.getProperty(DeploymentConfiguration.KEY_CONSOLE_STARTUP_MODE)) && !JNLPRuntime.isHeadless(); } public static boolean canShowOnStartup(boolean isApplication) { return canShowOnStartup(isApplication, JNLPRuntime.getConfiguration()); } public static boolean canShowOnStartup(boolean isApplication, DeploymentConfiguration config) { if (!isEnabled(config)) { return false; } return DeploymentConfiguration.CONSOLE_SHOW.equals(config.getProperty(DeploymentConfiguration.KEY_CONSOLE_STARTUP_MODE)) || (DeploymentConfiguration.CONSOLE_SHOW_PLUGIN.equals(config.getProperty(DeploymentConfiguration.KEY_CONSOLE_STARTUP_MODE)) && !isApplication) || (DeploymentConfiguration.CONSOLE_SHOW_JAVAWS.equals(config.getProperty(DeploymentConfiguration.KEY_CONSOLE_STARTUP_MODE)) && isApplication); } private void initializeWindow() { if (!initialized) { initialize(); } if (!JNLPRuntime.isHeadless()) { initializeWindow(lastSize, contentPanel); } } private void initializeWindow(Dimension size, JPanel content) { consoleWindow = new JDialog((JFrame) null, R("DPJavaConsole")); consoleWindow.setName("JavaConsole"); SwingUtils.info(consoleWindow); consoleWindow.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { lastSize = consoleWindow.getSize(); } }); consoleWindow.setIconImages(ImageResources.INSTANCE.getApplicationImages()); //view is added after console is made visible so no performance impact when hidden/ refreshOutputs(); consoleWindow.add(content); consoleWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //HIDE_ON_CLOSE can cause shut down deadlock consoleWindow.pack(); if (size != null) { consoleWindow.setSize(size); } else { consoleWindow.setSize(new Dimension(900, 600)); } consoleWindow.setMinimumSize(new Dimension(300, 300)); } /** * Initialize the console */ private void initialize() { contentPanel = new JPanel(); outputsPanel = new JPanel(); outputsPanel.setLayout(new BorderLayout()); contentPanel.setLayout(new GridBagLayout()); GridBagConstraints c; c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.gridheight = 10; c.weighty = 1; contentPanel.add(outputsPanel, c); /* buttons */ c = new GridBagConstraints(); c.gridy = 10; c.gridheight = 1; c.weightx = 0.5; c.weighty = 0; JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(2, 0, 0, 0)); contentPanel.add(buttonPanel, c); JButton gcButton = new JButton(R("CONSOLErungc")); buttonPanel.add(gcButton); gcButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { printMemoryInfo(); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Performing Garbage Collection...."); System.gc(); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("ButDone")); printMemoryInfo(); updateModel(); } }); JButton finalizersButton = new JButton(R("CONSOLErunFinalizers")); buttonPanel.add(finalizersButton); finalizersButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { printMemoryInfo(); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CONSOLErunningFinalizers")); Runtime.getRuntime().runFinalization(); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("ButDone")); printMemoryInfo(); updateModel(); } }); JButton memoryButton = new JButton(R("CONSOLEmemoryInfo")); buttonPanel.add(memoryButton); memoryButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { printMemoryInfo(); updateModel(); } }); JButton systemPropertiesButton = new JButton(R("CONSOLEsystemProperties")); buttonPanel.add(systemPropertiesButton); systemPropertiesButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { printSystemProperties(); updateModel(); } }); JButton classloadersButton = new JButton(R("CONSOLEclassLoaders")); buttonPanel.add(classloadersButton); classloadersButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { printClassLoaders(); updateModel(); } }); JButton threadListButton = new JButton(R("CONSOLEthreadList")); buttonPanel.add(threadListButton); threadListButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { printThreadInfo(); updateModel(); } }); JLabel numberOfOutputsL = new JLabel(" Number of outputs: "); buttonPanel.add(numberOfOutputsL); numberOfOutputs = new JSpinner(new SpinnerNumberModel(1, 0, 10, 1)); JComponent comp = numberOfOutputs.getEditor(); JFormattedTextField field = (JFormattedTextField) comp.getComponent(0); DefaultFormatter formatter = (DefaultFormatter) field.getFormatter(); formatter.setCommitsOnValidEdit(true); numberOfOutputs.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { refreshOutputs(); } }); buttonPanel.add(numberOfOutputs); JButton closeButton = new JButton(R("ButClose")); buttonPanel.add(closeButton); closeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { hideConsole(); } }); } }); JButton cleanButton = new JButton(R("CONSOLEClean")); buttonPanel.add(cleanButton); cleanButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { synchronized (rawData) { rawData.clear(); updateModel(true); } } }); initialized = true; } public void showConsole() { showConsole(false); } public void showConsole(boolean modal) { if (!JNLPRuntime.isHeadless()) { if (consoleWindow == null || !consoleWindow.isVisible()) { initializeWindow(); consoleWindow.setModal(modal); consoleWindow.setVisible(true); } } } public void hideConsole() { //no need to update when hidden outputsPanel.removeAll();//?? getObservable().deleteObservers(); consoleWindow.setModal(false); consoleWindow.setVisible(false); consoleWindow.dispose(); } public void showConsoleLater() { showConsoleLater(false); } public void showConsoleLater(final boolean modal) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { JavaConsole.getConsole().showConsole(modal); } }); } public void hideConsoleLater() { SwingUtils.invokeLater(new Runnable() { @Override public void run() { JavaConsole.getConsole().hideConsole(); } }); } protected void printSystemProperties() { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " ----"); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CONSOLEsystemProperties") + ":"); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, ""); Properties p = System.getProperties(); Set keys = p.keySet(); for (Object key : keys) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, key.toString() + ": " + p.get(key)); } OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " ----"); } public void setClassLoaderInfoProvider(ClassLoaderInfoProvider clip) { classLoaderInfoProvider = clip; } private void printClassLoaders() { if (classLoaderInfoProvider == null) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CONSOLEnoClassLoaders")); } else { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " ----"); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CONSOLEclassLoaders") + ": "); Set loaders = classLoaderInfoProvider.getLoaderInfo().keySet(); for (String loader : loaders) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, loader + "\n" + " codebase = " + classLoaderInfoProvider.getLoaderInfo().get(loader)); } OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " ----"); } } private void printMemoryInfo() { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " ----- "); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " " + R("CONSOLEmemoryInfo") + ":"); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " " + R("CONSOLEmemoryMax") + ": " + String.format("%1$10d", Runtime.getRuntime().maxMemory())); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " " + R("CONSOLEmemoryTotal") + ": " + String.format("%1$10d", Runtime.getRuntime().totalMemory())); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " " + R("CONSOLEmemoryFree") + ": " + String.format("%1$10d", Runtime.getRuntime().freeMemory())); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " ----"); } private void printThreadInfo() { Map map = Thread.getAllStackTraces(); Set keys = map.keySet(); for (Thread key : keys) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CONSOLEthread") + " " + key.getId() + ": " + key.getName()); for (StackTraceElement element : map.get(key)) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " " + element); } } } public static void main(String[] args) { final JavaConsole cconsole = new JavaConsole(); boolean toShowConsole = true; for (String arg : args) { if ("--show-console".equals(arg)) { toShowConsole = true; } } if (toShowConsole) { cconsole.showConsoleLater(); } } synchronized void addMessage(MessageWithHeader m) { rawData.add(m); updateModel(); } private synchronized void updateModel() { updateModel(null); } private synchronized void updateModel(final Boolean force) { observable.setChanged(); SwingUtils.invokeLater(new Runnable() { @Override public void run() { // avoid too much processing if already processed: synchronized(observable) { if (observable.hasChanged() || (Boolean.TRUE.equals(force))) { observable.notifyObservers(force); } } } }); } /** * parse plugin message and add it as header+message to data * * @param s string to be parsed */ private void processPluginMessage(String s) { PluginMessage pm = new PluginMessage(s); OutputController.getLogger().log(pm); } @Override public List getData() { return rawData; } @Override public Observable getObservable() { return observable; } public void createPluginReader(final File file) { OutputController.getLogger().log("Starting processing of plugin-debug-to-console " + file.getAbsolutePath()); Thread t = new Thread(new Runnable() { @Override public void run() { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"))); //never ending loop while (true) { try { String s = br.readLine(); if (s == null) { break; } processPluginMessage(s); } catch (Exception ex) { OutputController.getLogger().log(ex); } } } catch (Exception ex) { OutputController.getLogger().log(ex); if (br != null) { try { br.close(); } catch (Exception exx) { OutputController.getLogger().log(exx); } } } OutputController.getLogger().log("Ended processing of plugin-debug-to-console " + file.getAbsolutePath()); } }, "plugin-debug-to-console reader thread"); t.setDaemon(true); t.start(); OutputController.getLogger().log("Started processing of plugin-debug-to-console " + file.getAbsolutePath()); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/PrintStreamLogger.java0000644000000000000000000000013213441742745027133 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PrintStreamLogger.java0000644000175000002070000000425013441742745027744 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.io.PrintStream; public class PrintStreamLogger implements SingleStreamLogger{ private PrintStream stream; public PrintStreamLogger(PrintStream stream){ this.stream = stream; } @Override public void log(String s) { stream.println(s); } public PrintStream getStream() { return stream; } public void setStream(PrintStream stream) { this.stream = stream; } @Override public void close() { stream.flush(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/LogConfig.java0000644000000000000000000000013213441742745025372 xustar0030 mtime=1552401893.052832796 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/LogConfig.java0000644000175000002070000001347713441742745026216 0ustar00jvanekmock00000000000000/* LogConfig.java Copyright (C) 2011, 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.io.File; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.JNLPRuntime; /** * This file provides the information required to do logging. * */ public class LogConfig { // Directory where the logs are stored. private String icedteaLogDir; private boolean enableLogging; private boolean enableHeaders; private boolean logToFile; private boolean logClientAppToFile; private boolean logToStreams; private boolean logToSysLog; private boolean legacyLogaAsedFileLog; private LogConfig() { DeploymentConfiguration config = JNLPRuntime.getConfiguration(); // Check whether logging and tracing is enabled. enableLogging = Boolean.parseBoolean(config.getProperty(DeploymentConfiguration.KEY_ENABLE_LOGGING)); //enagle disable headers enableHeaders = Boolean.parseBoolean(config.getProperty(DeploymentConfiguration.KEY_ENABLE_LOGGING_HEADERS)); //enable/disable individual channels logToFile = Boolean.parseBoolean(config.getProperty(DeploymentConfiguration.KEY_ENABLE_LOGGING_TOFILE)); logToStreams = Boolean.parseBoolean(config.getProperty(DeploymentConfiguration.KEY_ENABLE_LOGGING_TOSTREAMS)); logToSysLog = Boolean.parseBoolean(config.getProperty(DeploymentConfiguration.KEY_ENABLE_LOGGING_TOSYSTEMLOG)); legacyLogaAsedFileLog = Boolean.parseBoolean(config.getProperty(DeploymentConfiguration.KEY_ENABLE_LEGACY_LOGBASEDFILELOG)); logClientAppToFile = Boolean.parseBoolean(config.getProperty(DeploymentConfiguration.KEY_ENABLE_APPLICATION_LOGGING_TOFILE)); // Get log directory, create it if it doesn't exist. If unable to create and doesn't exist, don't log. icedteaLogDir = PathsAndFiles.LOG_DIR.getFullPath(); if (icedteaLogDir != null) { File f = new File(icedteaLogDir); if (f.isDirectory() || f.mkdirs()) { icedteaLogDir += File.separator; } else { enableLogging = false; } } else { enableLogging = false; } } private static class LogConfigHolder { //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom private static volatile LogConfig INSTANCE = new LogConfig(); } public static LogConfig getLogConfig() { return LogConfigHolder.INSTANCE; } /** * For testing only: throw away the previous config */ static synchronized void resetLogConfig() { LogConfigHolder.INSTANCE = new LogConfig(); } public String getIcedteaLogDir() { return icedteaLogDir; } public boolean isEnableLogging() { return enableLogging; } public boolean isLogToFile() { return logToFile; } public boolean isLogToStreams() { return logToStreams; } public boolean isLogToSysLog() { return logToSysLog; } public boolean isEnableHeaders() { return enableHeaders; } //package private setters for testing void setEnableHeaders(boolean enableHeaders) { this.enableHeaders = enableHeaders; } void setEnableLogging(boolean enableLogging) { this.enableLogging = enableLogging; } void setIcedteaLogDir(String icedteaLogDir) { this.icedteaLogDir = icedteaLogDir; } void setLogToFile(boolean logToFile) { this.logToFile = logToFile; } void setLogToStreams(boolean logToStreams) { this.logToStreams = logToStreams; } void setLogToSysLog(boolean logToSysLog) { this.logToSysLog = logToSysLog; } boolean isLogToConsole() { return JavaConsole.isEnabled(); } boolean isLegacyLogBasedFileLog() { return legacyLogaAsedFileLog; } boolean setLegacyLogBasedFileLog(boolean b) { return legacyLogaAsedFileLog = b; } void serLogToFileForClientApp(boolean b) { logClientAppToFile = b; } boolean isLogToFileForClientApp() { return logClientAppToFile; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/WinSystemLog.java0000644000000000000000000000013213441742745026127 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/WinSystemLog.java0000644000175000002070000000364413441742745026746 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; public class WinSystemLog implements SingleStreamLogger{ public WinSystemLog(){ } @Override public void log(String s) { //not yet implemented } @Override public void close() { //nope } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/FileLog.java0000644000000000000000000000013213441742745025044 xustar0030 mtime=1552401893.057832785 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/FileLog.java0000644000175000002070000001122613441742745025656 0ustar00jvanekmock00000000000000/* FileLog.java Copyright (C) 2011, 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.text.SimpleDateFormat; import java.util.Date; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.docprovider.TextsProvider; import net.sourceforge.jnlp.util.logging.filelogs.LogBasedFileLog; import net.sourceforge.jnlp.util.logging.filelogs.WriterBasedFileLog; import net.sourceforge.jnlp.util.logging.headers.Header; /** * This class is utility and factory around file logs. */ public final class FileLog { public static Header getHeadlineHeader() { return new Header(OutputController.Level.WARNING_ALL, Thread.currentThread().getStackTrace(), Thread.currentThread(), false); } private static String getColon() { if (JNLPRuntime.isWindows()) { return "_"; } else { return ":"; } } private static final class SingleStreamLoggerImpl implements SingleStreamLogger { public SingleStreamLoggerImpl() { } @Override public void log(String s) { //dummy } @Override public void close() { //dummy } } public static final SimpleDateFormat fileLogNameFormatter = new SimpleDateFormat("yyyy-MM-dd_HH" + getColon() + "mm" + getColon() + "ss.S"); /**"Tue Nov 19 09:43:50 CET 2013"*/ public static final SimpleDateFormat pluginSharedFormatter = new SimpleDateFormat("EEE MMM dd HH" + getColon() + "mm" + getColon() + "ss ZZZ yyyy"); public static final String defaultloggerName = TextsProvider.ITW + " file-logger"; public static SingleStreamLogger createFileLog() { return createFileLog("javantx"); } public static SingleStreamLogger createAppFileLog() { return createFileLog("clienta"); } private static SingleStreamLogger createFileLog(String id) { SingleStreamLogger s; try { if (LogConfig.getLogConfig().isLegacyLogBasedFileLog()) { s = new LogBasedFileLog(defaultloggerName, getFileName(id), false); } else { s = new WriterBasedFileLog(defaultloggerName, getFileName(id), false); } } catch (Exception ex) { //we do not wont to block whole logging just because initialization error in "new FileLog()" OutputController.getLogger().log(ex); s = new SingleStreamLoggerImpl(); } return s; } private static String getFileName(String id) { String s = LogConfig.getLogConfig().getIcedteaLogDir() + "itw-" + id + "-" + getStamp() + ".log"; OutputController.getLogger().log("Attempting to log into: " + s); return s; } public static String getStamp() { return fileLogNameFormatter.format(new Date()); } public static SimpleDateFormat getFileLogNameFormatter() { return fileLogNameFormatter; } public static SimpleDateFormat getPluginSharedFormatter() { return pluginSharedFormatter; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/TeeOutputStream.java0000644000000000000000000000013213441742745026635 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/TeeOutputStream.java0000644000175000002070000001101213441742745027440 0ustar00jvanekmock00000000000000/* TeeOutputStream.java Copyright (C) 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.PlainTextFormatter; import net.sourceforge.jnlp.util.logging.OutputController.Level; import net.sourceforge.jnlp.util.logging.headers.Header; import net.sourceforge.jnlp.util.logging.headers.JavaMessage; /** * Behaves like the 'tee' command, sends output to both actual std stream and a * log */ public final class TeeOutputStream extends PrintStream implements SingleStreamLogger{ // Everthing written to TeeOutputStream is written to our log too private final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); private final boolean isError; public TeeOutputStream(PrintStream stdStream, boolean isError) { super(stdStream); this.isError = isError; } @Override public void close() { flushLog(); super.close(); } @Override public void flush() { flushLog(); super.flush(); } /* * The big ones: these do the actual writing */ @Override public synchronized void write(byte[] b, int off, int len) { if (len == 0) { return; } appendByteArray(b, off, len); super.write(b, off, len); } @Override public synchronized void write(int b) { appendByte(b); super.write(b); } private void flushLog() { String s = byteArrayOutputStream.toString(); if (s.length() > 0) { log(s); byteArrayOutputStream.reset(); } } @Override public void log(String s) { JavaMessage jm = new JavaMessage(new Header(getlevel(), false), s); jm.getHeader().isClientApp = true; OutputController.getLogger().log(jm); } public boolean isError() { return isError; } private void appendByte(int b) { byteArrayOutputStream.write(b); String s = byteArrayOutputStream.toString(); if (s.endsWith(PlainTextFormatter.getLineSeparator())) { flushLog(); } } private void appendByteArray(byte[] b, int off, int len) { byteArrayOutputStream.write(b, off, len); String s = new String(b, off, len); if (s.endsWith(PlainTextFormatter.getLineSeparator())) { flushLog(); } } private Level getlevel() { if (isError()) { return OutputController.Level.ERROR_ALL; } else { return OutputController.Level.MESSAGE_ALL; } } //For unit testing protected ByteArrayOutputStream getByteArrayOutputStream() throws IOException { ByteArrayOutputStream copy = new ByteArrayOutputStream(); copy.write(this.byteArrayOutputStream.toByteArray()); return copy; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/ConsoleOutputPane.java0000644000000000000000000000013213441742745027152 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java0000644000175000002070000012425013441742745027766 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.util.logging; import java.awt.Color; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.Observable; import java.util.Observer; import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import javax.swing.ButtonGroup; import javax.swing.DefaultComboBoxModel; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.LayoutStyle; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultHighlighter; import javax.swing.text.Document; import javax.swing.text.PlainDocument; import javax.swing.text.html.HTMLDocument; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.headers.ObservableMessagesProvider; import net.sourceforge.swing.SwingUtils; public class ConsoleOutputPane extends JPanel implements Observer { private boolean canChange = true; @Override public synchronized void update(final Observable o, final Object arg) { boolean force = false; if (arg instanceof Boolean && ((Boolean)arg).booleanValue()) { force = true; } if (force) { refreshPane(); return; } if (!autorefresh.isSelected()) { statistics.setText(model.createStatisticHint()); return; } final boolean passed = model.shouldUpdate(); if (!passed) { statistics.setText(model.createStatisticHint()); return; } if (sortBy.getSelectedIndex() == 0) { //no sort, we can just update updatePane(false); } else { refreshPane(); } } private final ConsoleOutputPaneModel model; private int lastPostion; //index of search private final DefaultHighlighter.DefaultHighlightPainter searchHighligh = new DefaultHighlighter.DefaultHighlightPainter(Color.blue); private Object lastSearchTag; public ConsoleOutputPane(final ObservableMessagesProvider dataProvider) { model = new ConsoleOutputPaneModel(dataProvider); // Create final JComponents members jPanel2 = new JPanel(); jpanel2scrollpane = new JScrollPane(jPanel2); showHeaders = new JCheckBox(); showUser = new JCheckBox(); sortCopyAll = new JCheckBox(); showOrigin = new JCheckBox(); showLevel = new JCheckBox(); showDate = new JCheckBox(); showThread1 = new JCheckBox(); showThread2 = new JCheckBox(); showMessage = new JCheckBox(); showOut = new JCheckBox(); showErr = new JCheckBox(); showJava = new JCheckBox(); showPlugin = new JCheckBox(); showPreInit = new JCheckBox(); sortByLabel = new JLabel(); regExLabel = new JCheckBox(); sortBy = new JComboBox<>(); searchLabel = new JLabel(); autorefresh = new JCheckBox(); refresh = new JButton(); apply = new JButton(); regExFilter = new JTextField(); copyPlain = new JButton(); copyRich = new JButton(); next = new JButton(); previous = new JButton(); search = new JTextField(); caseSensitive = new JCheckBox(); showIncomplete = new JCheckBox(); highLight = new JCheckBox(); wordWrap = new JCheckBox(); showDebug = new JCheckBox(); showInfo = new JCheckBox(); showItw = new JCheckBox(); showApp = new JCheckBox(); showCode = new JCheckBox(); statistics = new JLabel(); showPostInit = new JCheckBox(); showComplete = new JCheckBox(); match = new JRadioButton(); notMatch = new JRadioButton(); revertSort = new JCheckBox(); mark = new JCheckBox(); jScrollPane1 = new JScrollPane(); jEditorPane1 = new JTextPane(); showHide = new JButton(); insertChars = new JPopupMenu(); initComponents(); regExFilter.setText(ConsoleOutputPaneModel.defaultPattern.pattern()); showHeaders.setSelected(LogConfig.getLogConfig().isEnableHeaders()); setHeadersCheckBoxesEnabled(showHeaders.isSelected()); setMessagesCheckBoxesEnabled(showMessage.isSelected()); refresh.setEnabled(!autorefresh.isSelected()); if (JNLPRuntime.isWebstartApplication()) { showPlugin.setSelected(false); showPreInit.setSelected(false); showPostInit.setSelected(false); showIncomplete.setSelected(false); showComplete.setSelected(false); showPlugin.setEnabled(false); showPreInit.setEnabled(false); showPostInit.setEnabled(false); showIncomplete.setEnabled(false); showComplete.setEnabled(false); } regExFilter.getDocument().addDocumentListener(new DocumentListener() { @Override public final void insertUpdate(final DocumentEvent e) { colorize(); } @Override public final void removeUpdate(final DocumentEvent e) { colorize(); } @Override public final void changedUpdate(final DocumentEvent e) { colorize(); } private final void colorize() { try { final String s = regExFilter.getText(); final Pattern p = Pattern.compile(s); model.lastValidPattern = p; regExLabel.setForeground(Color.green); } catch (Exception ex) { regExLabel.setForeground(Color.red); } } }); regExFilter.addMouseListener(new MouseAdapter() { @Override public final void mouseClicked(final MouseEvent e) { SwingUtils.invokeLater(new Runnable() { @Override public final void run() { try { if (e.getButton() != MouseEvent.BUTTON3) { insertChars.setVisible(false); return; } insertChars.setLocation(e.getXOnScreen(), e.getYOnScreen()); insertChars.setVisible(!insertChars.isVisible()); } catch (Exception ex) { OutputController.getLogger().log(ex); } } }); } }); regExFilter.addKeyListener(new KeyAdapter() { @Override public final void keyPressed(final KeyEvent e) { if (e.getKeyCode() != KeyEvent.VK_CONTEXT_MENU) { return; } SwingUtils.invokeLater(new Runnable() { @Override public final void run() { try { insertChars.setLocation(regExFilter.getLocationOnScreen()); insertChars.setVisible(!insertChars.isVisible()); } catch (Exception ex) { OutputController.getLogger().log(ex); } } }); } }); final ButtonGroup matches = new ButtonGroup(); matches.add(match); matches.add(notMatch); showHideActionPerformed(null); updateModel(); refreshPane(); } private final ActionListener createDefaultAction() { return new ActionListener() { @Override public final void actionPerformed(final ActionEvent evt) { if (evt == null) return; final Object source; if ((source = evt.getSource()) == showHeaders) { setHeadersCheckBoxesEnabled(showHeaders.isSelected()); } else if (source == showMessage) { setMessagesCheckBoxesEnabled(showMessage.isSelected()); } else if (source == autorefresh) { refresh.setEnabled(!autorefresh.isSelected()); } refreshAction(); } }; } final ActionListener defaultActionSingleton = createDefaultAction(); private final ActionListener getDefaultActionSingleton() { return defaultActionSingleton; } private synchronized final void refreshPane() { if (highLight.isSelected()) { jEditorPane1.setContentType("text/html"); } else { jEditorPane1.setContentType("text/plain"); } model.lastUpdateIndex = 0; updatePane(true); } /** * when various threads update (and it can be)underlying jeditorpane * simultaneously, then it can lead to unpredictable issues synchronization * is done in invoke later */ private final AtomicBoolean done = new AtomicBoolean(true); private synchronized final void updatePane(final boolean reset) { if (!done.get()) { return; } done.set(false); SwingUtils.invokeLater(new Runnable() { @Override public final void run() { try { refreshPaneBody(reset); } catch (Exception ex) { OutputController.getLogger().log(ex); } finally { done.set(true); } } }); } private final void refreshPaneBody(final boolean reset) throws BadLocationException, IOException { if (reset) { jEditorPane1.setText(model.importList(0)); } else { final String s = model.importList(); if (highLight.isSelected()) { HTMLDocument orig = (HTMLDocument) jEditorPane1.getDocument(); if (revertSort.isSelected()) { orig.insertAfterEnd(orig.getRootElements()[0].getElement(0)/*body*/, s); } else { orig.insertBeforeEnd(orig.getRootElements()[0], s); } } else { if (revertSort.isSelected()) { jEditorPane1.setText(s + jEditorPane1.getText()); } else { jEditorPane1.setText(jEditorPane1.getText() + s); } } } jEditorPane1.setCaretPosition(0); //jEditorPane1.repaint(); if (mark.isSelected()) { markActionPerformed(null); } statistics.setText(model.createStatisticHint()); } private final void initComponents() { //this is crucial, otherwie PlainDocument implementatin is repalcing all \n by space ((PlainDocument)regExFilter.getDocument()).getDocumentProperties().remove("filterNewlines"); sortCopyAll.setSelected(true); sortCopyAll.setText(Translator.R("COPsortCopyAllDate")); sortCopyAll.setToolTipText("The sort by date is a bit more time consuming, but most natural for posting purposes"); showHeaders.setSelected(true); showHeaders.setText(Translator.R("COPshowHeaders")); showHeaders.addActionListener(getDefaultActionSingleton()); showUser.setSelected(true); showUser.setText(Translator.R("COPuser")); showUser.addActionListener(getDefaultActionSingleton()); showOrigin.setSelected(true); showOrigin.setText(Translator.R("COPorigin")); showOrigin.addActionListener(getDefaultActionSingleton()); showLevel.setSelected(true); showLevel.setText(Translator.R("COPlevel")); showLevel.addActionListener(getDefaultActionSingleton()); showDate.setSelected(true); showDate.setText(Translator.R("COPdate")); showDate.addActionListener(getDefaultActionSingleton()); showThread1.setSelected(true); showThread1.setText(Translator.R("COPthread1")); showThread1.addActionListener(getDefaultActionSingleton()); showThread2.setSelected(true); showThread2.setText(Translator.R("COPthread2")); showThread2.addActionListener(getDefaultActionSingleton()); showMessage.setSelected(true); showMessage.setText(Translator.R("COPShowMessages")); showMessage.addActionListener(getDefaultActionSingleton()); showOut.setSelected(true); showOut.setText(Translator.R("COPstdOut")); showOut.addActionListener(getDefaultActionSingleton()); showErr.setSelected(true); showErr.setText(Translator.R("COPstdErr")); showErr.addActionListener(getDefaultActionSingleton()); showJava.setSelected(true); showJava.setText(Translator.R("COPjava")); showJava.addActionListener(getDefaultActionSingleton()); showPlugin.setSelected(true); showPlugin.setText(Translator.R("COPplugin")); showPlugin.addActionListener(getDefaultActionSingleton()); showPreInit.setSelected(true); showPreInit.setText(Translator.R("COPpreInit")); showPreInit.setToolTipText(Translator.R("COPpluginOnly")); showPreInit.addActionListener(getDefaultActionSingleton()); sortByLabel.setText(Translator.R("COPSortBy") + ":"); regExLabel.setText(Translator.R("COPregex") + ":"); regExLabel.addActionListener(getDefaultActionSingleton()); sortBy.setModel(new DefaultComboBoxModel<>(new String[] { Translator.R("COPAsArrived"), Translator.R("COPuser"), Translator.R("COPorigin"), Translator.R("COPlevel"), Translator.R("COPdate"), Translator.R("COPcode"), Translator.R("COPthread1"), Translator.R("COPthread2"), Translator.R("COPmessage")})); sortBy.addActionListener(getDefaultActionSingleton()); searchLabel.setText(Translator.R("COPSearch") + ":"); autorefresh.setSelected(true); autorefresh.setText(Translator.R("COPautoRefresh")); autorefresh.addActionListener(getDefaultActionSingleton()); refresh.setText(Translator.R("COPrefresh")); refresh.addActionListener(getDefaultActionSingleton()); apply.setText(Translator.R("COPApply")); apply.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent evt) { model.usedPattern = model.lastValidPattern; refreshAction(); } }); regExFilter.setText(".*"); copyPlain.setText(Translator.R("COPCopyAllPlain")); copyPlain.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent evt) { copyPlainActionPerformed(evt); } }); copyRich.setText(Translator.R("COPCopyAllRich")); copyRich.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent evt) { copyRichActionPerformed(evt); } }); next.setText(Translator.R("COPnext")); next.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent evt) { nextActionPerformed(evt); } }); previous.setText(Translator.R("COPprevious")); previous.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent evt) { previousActionPerformed(evt); } }); caseSensitive.setText(Translator.R("COPcaseSensitive")); showIncomplete.setSelected(true); showIncomplete.setText(Translator.R("COPincomplete")); showIncomplete.setToolTipText(Translator.R("COPpluginOnly")); showIncomplete.addActionListener(getDefaultActionSingleton()); highLight.setSelected(true); highLight.setText(Translator.R("COPhighlight")); highLight.addActionListener(getDefaultActionSingleton()); wordWrap.setText(Translator.R("COPwordWrap")); wordWrap.addActionListener(getDefaultActionSingleton()); showDebug.setSelected(true); showDebug.setText(Translator.R("COPdebug")); showDebug.addActionListener(getDefaultActionSingleton()); showInfo.setSelected(true); showInfo.setText(Translator.R("COPinfo")); showInfo.addActionListener(getDefaultActionSingleton()); showItw.setSelected(true); showItw.setText(Translator.R("COPitw")); showItw.addActionListener(getDefaultActionSingleton()); showApp.setSelected(true); showApp.setText(Translator.R("COPclientApp")); showApp.addActionListener(getDefaultActionSingleton()); showCode.setSelected(true); showCode.setText(Translator.R("COPcode")); showCode.addActionListener(getDefaultActionSingleton()); statistics.setText("x/y"); showPostInit.setSelected(true); showPostInit.setText(Translator.R("COPpostInit")); showPostInit.setToolTipText(Translator.R("COPpluginOnly")); showPostInit.addActionListener(getDefaultActionSingleton()); showComplete.setSelected(true); showComplete.setText(Translator.R("COPcomplete")); showComplete.setToolTipText(Translator.R("COPpluginOnly")); showComplete.addActionListener(getDefaultActionSingleton()); match.setSelected(true); match.setText(Translator.R("COPmatch")); match.addActionListener(getDefaultActionSingleton()); notMatch.setText(Translator.R("COPnot")); notMatch.addActionListener(getDefaultActionSingleton()); revertSort.setSelected(true); revertSort.setText(Translator.R("COPrevert")); revertSort.addActionListener(getDefaultActionSingleton()); mark.setText(Translator.R("COPmark")); mark.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent evt) { markActionPerformed(evt); } }); final GroupLayout jPanel2Layout = new GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup( GroupLayout.Alignment.LEADING). addGroup( jPanel2Layout.createSequentialGroup().addContainerGap().addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING). addGroup( jPanel2Layout.createSequentialGroup(). addComponent(showHeaders).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showUser).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED). addComponent(showOrigin).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showLevel).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED). addComponent(showDate).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showCode).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showThread1).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(showThread2)). addGroup(jPanel2Layout.createSequentialGroup().addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.TRAILING).addGroup( GroupLayout.Alignment.LEADING, jPanel2Layout.createSequentialGroup() .addComponent(previous).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(mark).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(next).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 15, Short.MAX_VALUE). addComponent(wordWrap).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(highLight).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(sortCopyAll).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(copyRich).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(copyPlain)).addGroup(GroupLayout.Alignment.LEADING, jPanel2Layout.createSequentialGroup(). addComponent(searchLabel).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(search, GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(caseSensitive)).addGroup( GroupLayout.Alignment.LEADING, jPanel2Layout.createSequentialGroup(). addComponent(showMessage).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showOut).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(showErr).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showJava).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showPlugin).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(showDebug).addGap(6, 6, 6). addComponent(showInfo).addGap(6, 6, 6). addComponent(showItw).addGap(6, 6, 6). addComponent(showApp) )).addGap(2, 2, 2). addComponent(statistics)).addGroup( GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup(). addComponent(showPreInit).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showPostInit).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showIncomplete).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showComplete)). addGroup(jPanel2Layout.createSequentialGroup(). addComponent(autorefresh).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(refresh).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(sortByLabel).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(revertSort).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED). addComponent(sortBy, 0, 327, Short.MAX_VALUE)). addGroup(jPanel2Layout.createSequentialGroup(). addComponent(regExLabel).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(match).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(notMatch).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(regExFilter, GroupLayout.DEFAULT_SIZE, 237, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(apply, GroupLayout.PREFERRED_SIZE, 106, GroupLayout.PREFERRED_SIZE))).addContainerGap())); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup( GroupLayout.Alignment.LEADING). addGroup( jPanel2Layout.createSequentialGroup().addContainerGap().addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE). addComponent(showHeaders). addComponent(showUser). addComponent(showLevel). addComponent(showDate). addComponent(showOrigin). addComponent(showCode). addComponent(showThread1). addComponent(showThread2)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE). addComponent(showMessage). addComponent(showOut). addComponent(showErr). addComponent(showJava). addComponent(showPlugin). addComponent(showDebug). addComponent(showInfo). addComponent(showItw). addComponent(showApp). addComponent(statistics)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE). addComponent(showPreInit). addComponent(showIncomplete). addComponent(showPostInit). addComponent(showComplete)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING). addGroup( jPanel2Layout.createSequentialGroup().addGap(32, 32, 32).addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE). addComponent(regExLabel).addComponent(regExFilter, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE). addComponent(apply). addComponent(match). addComponent(notMatch))). addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE). addComponent(autorefresh). addComponent(refresh). addComponent(sortByLabel).addComponent(sortBy, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE). addComponent(revertSort))).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING). addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE). addComponent(searchLabel).addComponent(search, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)). addComponent(caseSensitive)).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING). addComponent(previous). addGroup(jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE). addComponent(sortCopyAll). addComponent(copyPlain). addComponent(copyRich). addComponent(highLight). addComponent(wordWrap)). addGroup(jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE). addComponent(mark). addComponent(next))).addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); jEditorPane1.setEditable(false); jScrollPane1.setViewportView(jEditorPane1); showHide.setText(Translator.R("ButHideDetails")); showHide.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent evt) { showHideActionPerformed(evt); } }); final GroupLayout jPanel1Layout = new GroupLayout(this); super.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING). addGroup(jPanel1Layout.createSequentialGroup().addContainerGap(). addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING). addComponent(jScrollPane1, GroupLayout.DEFAULT_SIZE, 684, Short.MAX_VALUE). addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.TRAILING). addComponent(showHide, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 672, Short.MAX_VALUE). addComponent(jpanel2scrollpane, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addContainerGap())))); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING). addGroup(GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup().addContainerGap(). addComponent(jScrollPane1, GroupLayout.DEFAULT_SIZE, 329, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(jpanel2scrollpane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED). addComponent(showHide).addContainerGap())); final JMenuItem tab = new JMenuItem("insert \\t"); tab.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent e) { SwingUtils.invokeLater(new Runnable() { @Override public final void run() { try { final int i = regExFilter.getCaretPosition(); final StringBuilder s = new StringBuilder(regExFilter.getText()); s.insert(i, "\t"); regExFilter.setText(s.toString()); regExFilter.setCaretPosition(i + 1); insertChars.setVisible(false); } catch (Exception ex) { OutputController.getLogger().log(ex); } } }); } }); final JMenuItem newLine = new JMenuItem("insert \\n"); newLine.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent e) { SwingUtils.invokeLater(new Runnable() { @Override public final void run() { try { final int i = regExFilter.getCaretPosition(); final StringBuilder s = new StringBuilder(regExFilter.getText()); s.insert(i, "\n"); regExFilter.setText(s.toString()); regExFilter.setCaretPosition(i + 1); insertChars.setVisible(false); } catch (Exception ex) { OutputController.getLogger().log(ex); } } }); } }); final JMenuItem resetRegex = new JMenuItem("reset default"); resetRegex.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent e) { SwingUtils.invokeLater(new Runnable() { @Override public final void run() { try { regExFilter.setText(ConsoleOutputPaneModel.defaultPattern.pattern()); model.lastValidPattern = ConsoleOutputPaneModel.defaultPattern; model.usedPattern = model.lastValidPattern; insertChars.setVisible(false); } catch (Exception ex) { OutputController.getLogger().log(ex); } } }); } }); insertChars.add(newLine); insertChars.add(tab); insertChars.add(resetRegex); validate(); } private final void setHeadersCheckBoxesEnabled(final boolean enable) { showUser.setEnabled(enable); showOrigin.setEnabled(enable); showLevel.setEnabled(enable); showDate.setEnabled(enable); showCode.setEnabled(enable); showThread1.setEnabled(enable); showThread2.setEnabled(enable); } private final void setMessagesCheckBoxesEnabled(final boolean enable) { showOut.setEnabled(enable); showErr.setEnabled(enable); showJava.setEnabled(enable); showPlugin.setEnabled(enable); showDebug.setEnabled(enable); showInfo.setEnabled(enable); showItw.setEnabled(enable); showApp.setEnabled(enable); } private final void refreshAction() { updateModel(); refreshPane(); } private final void markActionPerformed(final ActionEvent evt) { int matches = 0; if (!mark.isSelected()) { jEditorPane1.getHighlighter().removeAllHighlights(); return; } try { final Document document = jEditorPane1.getDocument(); final String find = search.getText(); if (find.length() == 0) { jEditorPane1.getHighlighter().removeAllHighlights(); return; } for (int index = 0; index + find.length() < document.getLength(); index++) { final String subMatch = document.getText(index, find.length()); if ((caseSensitive.isSelected() && find.equals(subMatch)) || (!caseSensitive.isSelected() && find.equalsIgnoreCase(subMatch))) { matches++; DefaultHighlighter.DefaultHighlightPainter highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.orange); jEditorPane1.getHighlighter().addHighlight(index, index + find.length(), highlightPainter); } } mark.setText(Translator.R("COPmark") + "(" + matches + ")"); } catch (BadLocationException ex) { OutputController.getLogger().log(ex); } } private final void previousActionPerformed(final ActionEvent evt) { try { final Document document = jEditorPane1.getDocument(); final String find = search.getText(); if (find.length() == 0) { lastPostion = document.getLength() - find.length() - 1; return; } for (int index = lastPostion; index >= 0; index--) { final String subMatch = document.getText(index, find.length()); if ((caseSensitive.isSelected() && find.equals(subMatch)) || (!caseSensitive.isSelected() && find.equalsIgnoreCase(subMatch))) { if (lastSearchTag != null) { jEditorPane1.getHighlighter().removeHighlight(lastSearchTag); } lastSearchTag = jEditorPane1.getHighlighter().addHighlight(index, index + find.length(), searchHighligh); jEditorPane1.setCaretPosition(index); lastPostion = index - find.length() - 1; return; } } lastPostion = document.getLength() - find.length() - 1; } catch (BadLocationException ex) { OutputController.getLogger().log(ex); } } private final void nextActionPerformed(final ActionEvent evt) { try { final Document document = jEditorPane1.getDocument(); final String find = search.getText(); if (find.length() == 0) { lastPostion = 0; return; } for (int index = lastPostion; index + find.length() < document.getLength(); index++) { final String subMatch = document.getText(index, find.length()); if ((caseSensitive.isSelected() && find.equals(subMatch)) || (!caseSensitive.isSelected() && find.equalsIgnoreCase(subMatch))) { if (lastSearchTag != null) { jEditorPane1.getHighlighter().removeHighlight(lastSearchTag); } lastSearchTag = jEditorPane1.getHighlighter().addHighlight(index, index + find.length(), searchHighligh); jEditorPane1.setCaretPosition(index); lastPostion = index + 1; return; } } lastPostion = 0; } catch (BadLocationException ex) { OutputController.getLogger().log(ex); } } private final void showHideActionPerformed(final ActionEvent evt) { if (jpanel2scrollpane.isVisible()) { jpanel2scrollpane.setVisible(false); showHide.setText(Translator.R("ButShowDetails")); } else { jpanel2scrollpane.setVisible(true); showHide.setText(Translator.R("ButHideDetails")); } } private final void copyPlainActionPerformed(final ActionEvent evt) { if (canChange) { showApp.setSelected(false); refreshAction(); canChange = false; } fillClipBoard(false, sortCopyAll.isSelected()); } private final void copyRichActionPerformed(final ActionEvent evt) { if (canChange) { showApp.setSelected(false); refreshAction(); canChange = false; } fillClipBoard(true, sortCopyAll.isSelected()); } private final void fillClipBoard(final boolean mark, final boolean forceSort){ final StringSelection stringSelection; if (forceSort){ stringSelection = new StringSelection(model.importList(mark, 0, 4/*date*/)); } else { stringSelection = new StringSelection(model.importList(mark, 0)); } final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(stringSelection, null); } public static final void main(final String args[]) { SwingUtils.invokeLater(new Runnable() { @Override public final void run() { final JFrame dialog = new JFrame(); dialog.setSize(800, 600); dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final ObservableMessagesProvider producer = new ConsoleOutputPaneModel.TestMessagesProvider(); final ConsoleOutputPane jPanel1 = new ConsoleOutputPane(producer); producer.getObservable().addObserver(jPanel1); dialog.getContentPane().add(jPanel1, BorderLayout.CENTER); dialog.pack(); dialog.setVisible(true); } }); } private final void updateModel() { model.highLight = highLight.isSelected(); model.matchPattern = match.isSelected(); model.regExLabel = regExLabel.isSelected(); model.revertSort = revertSort.isSelected(); model.showCode = showCode.isSelected(); model.showComplete = showComplete.isSelected(); model.showDate = showDate.isSelected(); model.showDebug = showDebug.isSelected(); model.showErr = showErr.isSelected(); model.showHeaders = showHeaders.isSelected(); model.showIncomplete = showIncomplete.isSelected(); model.showInfo = showInfo.isSelected(); model.showItw = showItw.isSelected(); model.showApp = showApp.isSelected(); model.showJava = showJava.isSelected(); model.showLevel = showLevel.isSelected(); model.showMessage = showMessage.isSelected(); model.showOrigin = showOrigin.isSelected(); model.showOut = showOut.isSelected(); model.showPlugin = showPlugin.isSelected(); model.showPostInit = showPostInit.isSelected(); model.showPreInit = showPreInit.isSelected(); model.showThread1 = showThread1.isSelected(); model.showThread2 = showThread2.isSelected(); model.showUser = showUser.isSelected(); model.sortBy = sortBy.getSelectedIndex(); model.wordWrap = wordWrap.isSelected(); } private final JButton apply; private final JCheckBox autorefresh; private final JCheckBox caseSensitive; private final JButton copyPlain; private final JButton copyRich; private final JCheckBox highLight; private final JEditorPane jEditorPane1; private final JScrollPane jpanel2scrollpane; private final JPanel jPanel2; private final JScrollPane jScrollPane1; private final JCheckBox mark; private final JRadioButton match; private final JButton next; private final JRadioButton notMatch; private final JButton previous; private final JButton refresh; private final JTextField regExFilter; private final JCheckBox regExLabel; private final JCheckBox revertSort; private final JTextField search; private final JLabel searchLabel; private final JCheckBox showCode; private final JCheckBox showComplete; private final JCheckBox showDate; private final JCheckBox showDebug; private final JCheckBox showErr; private final JCheckBox showHeaders; private final JButton showHide; private final JCheckBox showIncomplete; private final JCheckBox showInfo; private final JCheckBox showItw; private final JCheckBox showApp; private final JCheckBox showJava; private final JCheckBox showLevel; private final JCheckBox showMessage; private final JCheckBox showOrigin; private final JCheckBox showOut; private final JCheckBox showPlugin; private final JCheckBox showPostInit; private final JCheckBox showPreInit; private final JCheckBox showThread1; private final JCheckBox showThread2; private final JCheckBox showUser; private final JCheckBox sortCopyAll; private final JComboBox sortBy; private final JLabel sortByLabel; private final JLabel statistics; private final JCheckBox wordWrap; private final JPopupMenu insertChars; } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/headers0000644000000000000000000000013213441742745024216 xustar0030 mtime=1552401893.076832746 30 atime=1552410887.113183443 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/0000755000175000002070000000000013441742745025103 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/PaxHeaders.7406/PluginHeader.java0000644000000000000000000000013213441742745027505 xustar0030 mtime=1552401893.076832746 30 atime=1552402157.232253492 30 ctime=1552410887.038183618 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/PluginHeader.java0000644000175000002070000000576313441742745030330 0ustar00jvanekmock00000000000000/* Copyright (C) 2009, 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. * */ package net.sourceforge.jnlp.util.logging.headers; import java.util.regex.Pattern; public class PluginHeader extends Header { public boolean preinit; static final String PLUGIN_DEBUG = "plugindebug "; static final String PLUGIN_DEBUG_PREINIT = "preinit_plugindebug "; static final String PLUGIN_ERROR = "pluginerror "; static final String PLUGIN_ERROR_PREINIT = "preinit_pluginerror "; static final Pattern bracketsPattern = Pattern.compile("(\\]\\s*\\[)|(\\s*\\[)|(\\]\\s*)"); static final Pattern whiteSpaces = Pattern.compile("\\s+"); static final Pattern threadsPattern = Pattern.compile("\\s+|,\\s*|:"); @Override public String toString() { return toString(true, true, true, true, true, true, true); } @Override public String toString(boolean userb, boolean originb, boolean levelb, boolean dateb, boolean callerb, boolean thread1b, boolean thread2b) { if (preinit) { return "!" + super.toString(userb, originb, levelb, dateb, callerb, thread1b, thread2b); } else { return super.toString(userb, originb, levelb, dateb, callerb, thread1b, thread2b); } } @Override public String thread1ToString() { return " ITNPP Thread# " + thread1; } @Override public String thread2ToString() { return "gthread " + thread2; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/PaxHeaders.7406/MessageWithHeader.jav0000644000000000000000000000013113441742745030325 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/MessageWithHeader.java0000644000175000002070000000342513441742745031303 0ustar00jvanekmock00000000000000/* Copyright (C) 2009, 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging.headers; public interface MessageWithHeader { String getMessage(); Header getHeader(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/PaxHeaders.7406/JavaMessage.java0000644000000000000000000000013113441742745027323 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/JavaMessage.java0000644000175000002070000000411113441742745030131 0ustar00jvanekmock00000000000000/* Copyright (C) 2009, 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging.headers; public class JavaMessage implements MessageWithHeader{ public Header header; public String message; public JavaMessage(Header header, String message) { this.header = header; this.message = message; } @Override public String getMessage() { return message; } @Override public Header getHeader() { return header; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/PaxHeaders.7406/PluginMessage.java0000644000000000000000000000013113441742745027700 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/PluginMessage.java0000644000175000002070000000704613441742745030520 0ustar00jvanekmock00000000000000/* Copyright (C) 2009, 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging.headers; import java.util.Date; import net.sourceforge.jnlp.util.logging.OutputController; public class PluginMessage implements MessageWithHeader{ public PluginHeader header; public String restOfMessage; public boolean wasError = false; public PluginMessage(String orig) { restOfMessage = orig; header = new PluginHeader(); String s = orig.trim(); PluginHeader p = this.header; try { p.isC = true; p.application = false; if (s.startsWith("preinit_plugin")) { p.preinit = true; } if (s.startsWith(PluginHeader.PLUGIN_DEBUG) || s.startsWith(PluginHeader.PLUGIN_DEBUG_PREINIT)) { p.level = OutputController.Level.MESSAGE_DEBUG; } else if (s.startsWith(PluginHeader.PLUGIN_ERROR) || s.startsWith(PluginHeader.PLUGIN_ERROR_PREINIT)) { p.level = OutputController.Level.ERROR_ALL; } else { p.level = OutputController.Level.WARNING_ALL; } String[] init = PluginHeader.whiteSpaces.split(s); p.timestamp = new Date(Long.parseLong(init[1]) / 1000); String[] main = PluginHeader.bracketsPattern.split(s); p.user = main[1]; p.caller = main[5]; p.date = main[4]; String[] threads = PluginHeader.threadsPattern.split(main[6]); p.thread1 = threads[2]; p.thread2 = threads[4]; int i = orig.indexOf(p.thread2); restOfMessage = orig.substring(i + p.thread2.length() + 2); //+": " } catch (Exception ex) { OutputController.getLogger().log(ex); this.wasError = true; } } @Override public String getMessage() { return restOfMessage; } @Override public Header getHeader() { return header; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/PaxHeaders.7406/ObservableMessagesPro0000644000000000000000000000013113441742745030452 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/ObservableMessagesProvider.java0000644000175000002070000000357113441742745033243 0ustar00jvanekmock00000000000000/* Copyright (C) 2009, 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging.headers; import java.util.List; import java.util.Observable; public interface ObservableMessagesProvider { public List getData(); public Observable getObservable(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/PaxHeaders.7406/Header.java0000644000000000000000000000013113441742745026325 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/headers/Header.java0000644000175000002070000001441013441742745027136 0ustar00jvanekmock00000000000000/* Copyright (C) 2009, 2013 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging.headers; import java.util.Date; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.logging.OutputController.Level; import net.sourceforge.jnlp.util.logging.TeeOutputStream; public class Header { public static String default_user = System.getProperty("user.name"); public String user = default_user; public boolean application = true; public Level level = Level.WARNING_ALL; public Date timestamp = new Date(); public String date = timestamp.toString(); public boolean isC = false;//false=> java public boolean isClientApp = false;//false=> ITW public String caller = "unknown"; public String thread1 = "unknown"; public String thread2 = "unknown"; //to alow simple inheritance public Header() { } public Header(Level level, boolean isC) { this(level, Thread.currentThread().getStackTrace(), Thread.currentThread(), isC); } public Header(Level level, StackTraceElement[] stack, Thread thread, boolean isC) { this(level, stack, thread, new Date(), isC); } public Header(Level level, StackTraceElement[] stack, Thread thread, Date d, boolean isC) { this.application = JNLPRuntime.isWebstartApplication(); this.level = level; this.timestamp = d; this.date = timestamp.toString(); this.isC = isC; if (stack != null) { this.caller = getCallerClass(stack); } this.thread1 = Integer.toHexString(((Object) thread).hashCode()); this.thread2 = thread.getName(); } @Override public String toString() { return toString(true, true, true, true, true, true, true); } public String toString(boolean userb, boolean originb, boolean levelb, boolean dateb, boolean callerb, boolean thread1b, boolean thread2b) { StringBuilder sb = new StringBuilder(); try { if (userb){ sb.append("[").append(user).append("]"); } if(originb){ sb.append("[").append(getOrigin()).append("]"); } if (levelb && level != null) { sb.append('[').append(level.toString()).append(']'); } if (dateb){ sb.append('[').append(date.toString()).append(']'); } if (callerb && caller != null) { sb.append('[').append(caller).append(']'); } if (thread1b && thread2b){ sb.append(threadsToString()); }else if (thread1b) { sb.append(thread1ToString()); }else if (thread2b) { sb.append(thread2ToString()); } } catch (Exception ex) { OutputController.getLogger().log(ex); } return sb.toString(); } public String thread1ToString() { return " NETX Thread# " + thread1; } public String thread2ToString() { return "name " + thread2; } public String threadsToString() { return thread1ToString() + ", " + thread2ToString(); } private static final String CLIENT = "CLIENT"; public String getOrigin() { String s; if (application) { s = "ITW-JAVAWS"; } else { if (isC) { s = "ITW-C-PLUGIN"; } else { s = "ITW-APPLET"; } } if (isClientApp) { s = s + "-" + CLIENT; } return s; } static String getCallerClass(StackTraceElement[] stack) { try { //0 is always thread //1..? is OutputController itself //pick up first after. StackTraceElement result = stack[0]; int i = 1; for (; i < stack.length; i++) { result = stack[i];//at least moving up if (stack[i].getClassName().contains(OutputController.class.getName()) || //PluginDebug.class.getName() not avaiable during netx make stack[i].getClassName().contains("sun.applet.PluginDebug") || stack[i].getClassName().contains(Header.class.getName()) || stack[i].getClassName().contains(TeeOutputStream.class.getName())) { continue; } else { break; } } return result.toString(); } catch (Exception ex) { OutputController.getLogger().log(ex); return "Unknown caller"; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/PaxHeaders.7406/OutputController.java0000644000000000000000000000013113441742745027066 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/logging/OutputController.java0000644000175000002070000003307313441742745027705 0ustar00jvanekmock00000000000000/*Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.logging; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; import java.util.LinkedList; import java.util.List; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.headers.Header; import net.sourceforge.jnlp.util.logging.headers.JavaMessage; import net.sourceforge.jnlp.util.logging.headers.MessageWithHeader; /** * * OutputController class (thread) must NOT call JNLPRuntime.getConfiguraion() * */ public class OutputController { public static enum Level { MESSAGE_ALL, // - stdout/log in all cases MESSAGE_DEBUG, // - stdout/log in verbose/debug mode WARNING_ALL, // - stdout+stderr/log in all cases (default for WARNING_DEBUG, // - stdou+stde/logrr in verbose/debug mode ERROR_ALL, // - stderr/log in all cases (default for ERROR_DEBUG; // - stderr/log in verbose/debug mode //ERROR_DEBUG is default for Throwable //MESSAGE_DEBUG is default for String public boolean isOutput() { return this == Level.MESSAGE_ALL || this == Level.MESSAGE_DEBUG || this == Level.WARNING_ALL || this == Level.WARNING_DEBUG; } public boolean isError() { return this == Level.ERROR_ALL || this == Level.ERROR_DEBUG || this == Level.WARNING_ALL || this == Level.WARNING_DEBUG; } public boolean isWarning() { return this == Level.WARNING_ALL || this == Level.WARNING_DEBUG; } public boolean isDebug() { return this == Level.ERROR_DEBUG || this == Level.MESSAGE_DEBUG || this == Level.WARNING_DEBUG; } public boolean isInfo() { return this == Level.ERROR_ALL || this == Level.WARNING_ALL || this == Level.MESSAGE_ALL; } } /* * singleton instance */ private static final String NULL_OBJECT = "Trying to log null object"; private PrintStreamLogger outLog; private PrintStreamLogger errLog; private final List messageQue = new LinkedList<>(); private final MessageQueConsumer messageQueConsumer = new MessageQueConsumer(); Thread consumerThread; /*stdin reader for headless dialogues*/ private BufferedReader br; //bounded to instance private class MessageQueConsumer implements Runnable { @Override public void run() { while (true) { try { synchronized (OutputController.this) { OutputController.this.wait(1000); if (!(OutputController.this == null || messageQue.isEmpty())) { flush(); } } } catch (Throwable t) { OutputController.getLogger().log(t); } } } }; public synchronized void flush() { while (!messageQue.isEmpty()) { consume(); } } public void close() throws Exception { flush(); if (LogConfig.getLogConfig().isLogToFile()){ getFileLog().close(); } } private void consume() { MessageWithHeader s = messageQue.get(0); messageQue.remove(0); //filtering is done in console during runtime if (LogConfig.getLogConfig().isLogToConsole()) { JavaConsole.getConsole().addMessage(s); } //clients app's messages are reprinted only to console if (s.getHeader().isClientApp){ if (LogConfig.getLogConfig().isLogToFile() && LogConfig.getLogConfig().isLogToFileForClientApp()) { getAppFileLog().log(proceedHeader(s)); } return; } if (!JNLPRuntime.isDebug() && (s.getHeader().level == Level.MESSAGE_DEBUG || s.getHeader().level == Level.WARNING_DEBUG || s.getHeader().level == Level.ERROR_DEBUG)) { //filter out debug messages //must be here to prevent deadlock, casued by exception form jnlpruntime, loggers or configs themselves return; } String message = proceedHeader(s); if (LogConfig.getLogConfig().isLogToStreams()) { if (s.getHeader().level.isOutput()) { outLog.log(message); } if (s.getHeader().level.isError()) { errLog.log(message); } } if (LogConfig.getLogConfig().isLogToFile()) { getFileLog().log(message); } //only crucial stuff is going to system log //only java messages handled here, plugin is onhis own if (LogConfig.getLogConfig().isLogToSysLog() && (s.getHeader().level.equals(Level.ERROR_ALL) || s.getHeader().level.equals(Level.WARNING_ALL)) && s.getHeader().isC == false) { //no headers here getSystemLog().log(s.getMessage()); } } private String proceedHeader(MessageWithHeader s) { String message = s.getMessage(); if (LogConfig.getLogConfig().isEnableHeaders()) { if (message.contains("\n")) { message = s.getHeader().toString() + "\n" + message; } else { message = s.getHeader().toString() + " " + message; } } return message; } private OutputController() { this(System.out, System.err); } private static class OutputControllerHolder { //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java private static final OutputController INSTANCE = new OutputController(); } /** * This should be the only legal way to get logger for ITW * * @return logging singleton */ public static OutputController getLogger() { return OutputControllerHolder.INSTANCE; } /** * for testing purposes the logger with custom streams can be created * otherwise only getLogger()'s singleton can be called. */ public OutputController(PrintStream out, PrintStream err) { if (out == null || err == null) { throw new IllegalArgumentException("No stream can be null"); } outLog = new PrintStreamLogger(out); errLog = new PrintStreamLogger(err); //itw logger have to be fully initialised before start consumerThread = new Thread(messageQueConsumer, "Output controller consumer daemon"); consumerThread.setDaemon(true); //is started in JNLPRuntime.getConfig() after config is laoded Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { flush(); } })); } public void startConsumer() { consumerThread.start(); //some messages were probably posted before start of consumer synchronized (this) { this.notifyAll(); } } /** * * @return current stream for std.out reprint */ public PrintStream getOut() { flush(); return outLog.getStream(); } /** * * @return current stream for std.err reprint */ public PrintStream getErr() { flush(); return errLog.getStream(); } /** * Some tests may require set the output stream and check the output. This * is the gate for it. */ public void setOut(PrintStream out) { flush(); this.outLog.setStream(out); } /** * Some tests may require set the output stream and check the output. This * is the gate for it. */ public void setErr(PrintStream err) { flush(); this.errLog.setStream(err); } public static String exceptionToString(Throwable t) { if (t == null) { return null; } String s = "Error during processing of exception"; try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); t.printStackTrace(pw); s = sw.toString(); pw.close(); sw.close(); } catch (Exception ex) { throw new RuntimeException(ex); } return s; } public void log(Level level, String s) { log(level, (Object) s); } public void log(Level level, Throwable s) { log(level, (Object) s); } public void log(String s) { log(Level.MESSAGE_DEBUG, (Object) s); } public void log(Throwable s) { log(Level.ERROR_DEBUG, (Object) s); } private void log(Level level, Object o) { String s =""; if (o == null) { s = NULL_OBJECT; } else if (o instanceof Throwable) { s = exceptionToString((Throwable) o); } else { s=o.toString(); } log(new JavaMessage(new Header(level, false), s)); } synchronized void log(MessageWithHeader l){ messageQue.add(l); this.notifyAll(); } private static class FileLogHolder { //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom private static volatile SingleStreamLogger INSTANCE = FileLog.createFileLog(); } private SingleStreamLogger getFileLog() { return FileLogHolder.INSTANCE; } private static class AppFileLogHolder { //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom private static volatile SingleStreamLogger INSTANCE = FileLog.createAppFileLog(); } private SingleStreamLogger getAppFileLog() { return AppFileLogHolder.INSTANCE; } private static class SystemLogHolder { //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom private static volatile SingleStreamLogger INSTANCE = initSystemLogger(); private static SingleStreamLogger initSystemLogger() { if (JNLPRuntime.isWindows()) { return new WinSystemLog(); } else { return new UnixSystemLog(); } } } private SingleStreamLogger getSystemLog() { return SystemLogHolder.INSTANCE; } public void printErrorLn(String e) { getErr().println(e); } public void printOutLn(String e) { getOut().println(e); } public void printWarningLn(String e) { printOutLn(e); printErrorLn(e); } public void printError(String e) { getErr().print(e); } public void printOut(String e) { getOut().print(e); } public void printWarning(String e) { printOut(e); printError(e); } //package private setters for testing void setErrLog(PrintStreamLogger errLog) { this.errLog = errLog; } void setFileLog(SingleStreamLogger fileLog) { FileLogHolder.INSTANCE = fileLog; } void setAppFileLog(SingleStreamLogger fileLog) { AppFileLogHolder.INSTANCE = fileLog; } void setOutLog(PrintStreamLogger outLog) { this.outLog = outLog; } void setSysLog(SingleStreamLogger sysLog) { SystemLogHolder.INSTANCE = sysLog; } public synchronized String readLine() throws IOException { if (br == null) { br = new BufferedReader(new InputStreamReader(System.in)); } return br.readLine(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/docprovider0000644000000000000000000000013113441742745023474 xustar0030 mtime=1552401893.055832789 30 atime=1552410887.113183443 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/0000755000175000002070000000000013441742745024362 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/PaxHeaders.7406/TextsProvider.java0000644000000000000000000000013113441742745027236 xustar0030 mtime=1552401893.047832806 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java0000644000175000002070000007004113441742745030051 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Set; import net.sourceforge.jnlp.config.Defaults; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.config.InfrastructureFileDescriptor; import net.sourceforge.jnlp.config.Setting; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.Formatter; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.HtmlFormatter; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.ManFormatter; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.PlainTextFormatter; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.ReplacingTextFormatter; public abstract class TextsProvider { private static File authorFileFromUserInput = null; private final String encoding; private final Formatter formatter; private final boolean forceTitles; protected final boolean expandVariables; private boolean prepared = false; private File authorFilePath = null; private boolean introduction = true; private boolean synopsis = true; private boolean description = true; private boolean commands = true; private boolean options = true; private boolean examples = true; private boolean files = true; private boolean bugs = true; private boolean authors = true; private boolean seeAlso = true; public TextsProvider(String encoding, Formatter formatter, boolean forceTitles, boolean expandFiles) { this.encoding = encoding; this.formatter = formatter; this.forceTitles = forceTitles; this.expandVariables = expandFiles; } public abstract String getId(); public String getHeader() { return getFormatter().getHeaders(getId(), getEncoding()); } public String getTail() { return getFormatter().getTail(); } public String getIntroduction() { if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.NAME); } else { return ""; } } public String getSynopsis() { if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.SYNOPSIS); } else { return ""; } } public String getDescription() { if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.DESCRIPTION); } else { return ""; } } public String getOptions() { if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.OPTIONS); } else { return ""; } } public String getCommands() { if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.COMMANDS); } else { return ""; } } public String getExamples() { if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.EXAMPLES); } else { return ""; } } public String getFiles() { if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.FILES); } else { return ""; } } protected String getFilesAppendix() { if (!expandVariables) { return getFormatter().wrapParagraph(Translator.R("ITWTBdirs")); } else { return ""; } } protected String getFiles(List files) { StringBuilder sb = new StringBuilder(); Set>> defs = Defaults.getDefaults().entrySet(); Collections.sort(files, new Comparator() { @Override public int compare(InfrastructureFileDescriptor o1, InfrastructureFileDescriptor o2) { return o1.toString().compareTo(o2.toString()); } }); for (InfrastructureFileDescriptor f : files) { String path = expandVariables ? f.getFullPath() : f.toString(); String modified = ""; String fGetFullPath=removeFileProtocol(f.getFullPath()); String fGetDefaultFullPath=removeFileProtocol(f.getDefaultFullPath()); if (!fGetFullPath.equals(fGetDefaultFullPath) && expandVariables){ modified=getFormatter().getBold("["+Translator.R("BUTmodified")+"] "); } String controlledBy = ""; for (Map.Entry> entry : defs) { if (matchSttingsValueWithInfrastrucutreFile(entry.getValue(), f)) { controlledBy = " " + Translator.R("BUTControlledBy", getFormatter().getBold(entry.getKey())); break; } } sb.append(getFormatter().getOption(path, modified+f.getDescription() + controlledBy)); } return formatter.wrapParagraph(sb.toString()); } protected boolean matchSttingsValueWithInfrastrucutreFile(Setting entry, InfrastructureFileDescriptor f) { if (entry == null || entry.getDefaultValue() == null) { return false; } return entry.getDefaultValue().equals(f.getDefaultFullPath()) || entry.getDefaultValue().equals("file://" + f.getDefaultFullPath()); } public Formatter getFormatter() { return formatter; } protected String getEncoding() { return encoding; } protected String optionsToString(List opts) { Collections.sort(opts, new Comparator() { @Override public int compare(OptionsDefinitions.OPTIONS o1, OptionsDefinitions.OPTIONS o2) { return o1.option.compareToIgnoreCase(o2.option); } }); StringBuilder sb = new StringBuilder(); for (OptionsDefinitions.OPTIONS o : opts) { sb.append(getFormatter().getOption(o.option + " " + o.helperString, o.getLocalizedDescription()+"("+o.getArgumentExplanation()+")")); } return sb.toString(); } public static final String IT_BASE = "http://icedtea.classpath.org/wiki"; public static final String ITW_HOME = IT_BASE + "/IcedTea-Web"; public static final String ITW_EAS = IT_BASE + "/Extended_Applets_Security"; public static final String ITW_STYLE = ITW_HOME + "#Code_style"; public static final String ITW_ECLIPSE = ITW_HOME + "/DevelopingWithEclipse"; public static final String ITW_REPO = "http://icedtea.classpath.org/hg/icedtea-web"; public static final String JAVAWS = "javaws"; public static final String ITWEB_SETTINGS = "itweb-settings"; public static final String ITW = "icedtea-web"; public static final String ITW_PLUGIN = "icedtea-web-plugin"; public static final String POLICY_EDITOR = "policyeditor"; public static final String DISTRO_PKG = "http://mail.openjdk.java.net/mailman/listinfo/distro-pkg-dev"; public static final String IT_MAIN = IT_BASE + "/Main_Page"; public static final String IT_QUICK = IT_BASE + "/DeveloperQuickStart"; public static final String ITW_ISSUES = ITW_HOME + "#Common_Issues"; public static final String ITW_REPRODUCERS = IT_BASE + "/Reproducers"; public static final String ITW_BUGS = ITW_HOME + "#Filing_bugs"; public static final String ITW_PLUGIN_URL = ITW_HOME + "#Plugin"; public static final String ITW_BUGZILLAHOME = "http://icedtea.classpath.org/bugzilla"; public String getBugs() { StringBuilder sb = new StringBuilder(); sb.append(getFormatter().process(Translator.R("ITWTBbugs")+":")); sb.append(getFormatter().getNewLine()); sb.append(getFormatter().getUrl(ITW_BUGS)); sb.append(getFormatter().getNewLine()); sb.append(getFormatter().getUrl(ITW_BUGZILLAHOME)); sb.append(getFormatter().getNewLine()); sb.append(getFormatter().getNewLine()); sb.append(getFormatter().process(Translator.R("ITWTBdebug"))); sb.append(getFormatter().getNewLine()); if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.BUGS) + getFormatter().wrapParagraph(sb.toString()); } else { return getFormatter().wrapParagraph(sb.toString()); } } public String getAuthors() { if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.AUTHOR) + generateAuthorsSection(authorFilePath); } else { return generateAuthorsSection(authorFilePath); } } public String getSeeAlso() { StringBuilder sb = new StringBuilder(); sb.append(getFormatter().getSeeAlso(ITW)); sb.append(getFormatter().getSeeAlso(JAVAWS)); sb.append(getFormatter().getSeeAlso(ITW_PLUGIN)); sb.append(getFormatter().getSeeAlso(ITWEB_SETTINGS)); sb.append(getFormatter().getSeeAlso(POLICY_EDITOR)); sb.append(getFormatter().getSeeAlso("policytool")); sb.append(getFormatter().getSeeAlso("java")); sb.append(getFormatter().getNewLine()); sb.append(getFormatter().getUrl(ITW_HOME)); sb.append(getFormatter().getNewLine()); sb.append(getFormatter().getUrl(ITW_REPO)); sb.append(getFormatter().getNewLine()); if (forceTitles) { return getFormatter().getTitle(ManFormatter.KnownSections.SEE_ALSO) + getFormatter().wrapParagraph(sb.toString()); } else { return getFormatter().wrapParagraph(sb.toString()); } } public TextsProvider prepare() { if (!prepared) { writeToStringReal(); prepared = true; } return this; } public String writeToString() { //first walktrhough builds index (html), set longest options(textt) return prepare().writeToStringReal(); } private String writeToStringReal() { StringBuilder sb = new StringBuilder(); sb.append(getHeader()); sb.append(PlainTextFormatter.getLineSeparator()); if (getFormatter() instanceof HtmlFormatter) { sb.append(((HtmlFormatter) getFormatter()).generateLogo()); sb.append(PlainTextFormatter.getLineSeparator()); sb.append(((HtmlFormatter) getFormatter()).generateIndex()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isIntroduction()) { sb.append(getIntroduction()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isSynopsis()) { sb.append(getSynopsis()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isDescription()) { sb.append(getDescription()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isCommands()) { sb.append(getCommands()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isOptions()) { sb.append(getOptions()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isExamples()) { sb.append(getExamples()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isFiles()) { sb.append(getFiles()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isBugs()) { sb.append(getBugs()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isAuthors()) { sb.append(getAuthors()); sb.append(PlainTextFormatter.getLineSeparator()); } if (isSeeAlso()) { sb.append(getSeeAlso()); sb.append(PlainTextFormatter.getLineSeparator()); } sb.append(getTail()); return sb.toString(); } public void writeToWriter(Writer w) throws IOException { try (BufferedWriter bw = new BufferedWriter(w)) { bw.write(writeToString()); } } public void writeToStream(OutputStream os) throws IOException { try (OutputStreamWriter osw = new OutputStreamWriter(os, encoding)) { writeToWriter(osw); } } public void writeToFile(File f) throws IOException { try (FileOutputStream fos = new FileOutputStream(f)) { writeToStream(fos); } } public void writeToDir(File dir) throws IOException { writeToFile(new File(dir, getId() + getFormatter().getFileSuffix())); } public static void main(String[] args) throws IOException { // Shutdown hook from OutputController was causing hanging build on Windows. It's not used on headless. JNLPRuntime.setHeadless(true); if (args.length == 0) { System.out.println(" * IcedTea-Web self documentation tool list of arguments *"); System.out.println(" * argument version - last parameter of each command, is used when there is no internal versionknown *"); System.out.println(" * - is mandatory, but not used if real version do exists *"); System.out.println(" * argument expand - one before last argument, false/true - is used to not/expand variables *"); System.out.println(" * -------------------- *"); System.out.println("all expand version - will generate all reports in theirs defaults into current directory"); System.out.println("html targetDir expand version - will generate html documentation to target dir"); System.out.println("htmlIntro targetFile expand version - will generate html intro page to specified file"); System.out.println("man encoding targetDir expand version - will generate man documentation to target dir in desired encoding"); System.out.println("plain targetDir maxLineWidth expand version - will generate plain text documentation to target dir in desired encoding"); System.out.println(" - maxLineWidth is in <5," + Integer.MAX_VALUE + ">"); System.out.println("to generate informations about authors from a file, use argument '-authorFile' with path to AUTHORS file located in icedtea-web." + "\n eg. -authorFile=/home/user/icedtea-web/AUTHORS"); } else { List argsList = new ArrayList<>(); argsList.addAll(Arrays.asList(args)); for (String s : argsList) { if (s.startsWith("-authorFile=")) { authorFileFromUserInput = new File(s.split("=")[1]); if (!authorFileFromUserInput.exists()) { throw new RuntimeException(authorFileFromUserInput.getAbsolutePath() + " does not exists"); } argsList.remove(s); break; } } ReplacingTextFormatter.backupVersion = argsList.get(argsList.size() - 1); boolean expand = Boolean.valueOf(argsList.get(argsList.size() - 2)); switch (argsList.get(0)) { case "all": generateAll(new File(System.getProperty("user.dir")), expand); break; case "html": generateOnlineHtmlHelp(new File(argsList.get(1)), expand); break; case "htmlIntro": generateItwIntro(new File(argsList.get(1)), expand); break; case "man": generateManText(argsList.get(1), new File(argsList.get(2)), expand); break; case "plain": generatePlainTextDocs(new File(argsList.get(1)), Integer.valueOf(argsList.get(2)), expand); break; default: System.out.println("unknown param"); main(new String[0]); } } } public static void generateItwIntro(File f, boolean expand) throws IOException { IcedTeaWebTextsProvider itw = new IcedTeaWebTextsProvider("utf-8", new HtmlFormatter(false, true, false), false, expand); //!!AUTHORS FILE IS NOT NEEDED IN THIS METHOD, AUTHORS ARE GENERATED SEPARATELY INTO ANOTHER TAB itw.setSeeAlso(false); itw.writeToFile(f); } public static void generateAll(File f, boolean expand) throws IOException { generateOnlineHtmlHelp(f, expand); generateManText("UTF-8", f, expand); generatePlainTextDocs(f, 160, expand); } private static final String logo_name = "itw_logo.png"; private static final String logo_url = "/net/sourceforge/jnlp/resources/" + logo_name; public static void generateRuntimeHtmlTexts(File f) throws IOException { generateHtmlTexts(f, false, true); } public static void generateOnlineHtmlHelp(File f, boolean expand) throws IOException { generateHtmlTexts(f, true, expand); } public static void generateHtmlTexts(File dir, boolean includeXmlHeader, boolean expand) throws IOException { generateHtmlTextsUtf8(dir, true, true, includeXmlHeader, true, expand); } public static void generateHtmlTextsUtf8(File dir, boolean allowContext, boolean allowLogo, boolean includeXmlHeader, boolean titles, boolean expand) throws IOException { generateHtmlTexts("UTF-8", dir, allowContext, allowLogo, includeXmlHeader, titles, expand); } public static void generateHtmlTexts(String encoding, File dir, boolean allowContext, boolean allowLogo, boolean includeXmlHeader, boolean titles, boolean expand) throws IOException { if (allowLogo) { File flogo = new File(dir, logo_name); try (InputStream is = TextsProvider.class.getResourceAsStream(logo_url); OutputStream os = new FileOutputStream(flogo);) { copy(is, os); os.flush(); } } JavaWsTextsProvider javaws = new JavaWsTextsProvider(encoding, new HtmlFormatter(allowContext, allowLogo, includeXmlHeader), titles, expand); ItwebSettingsTextsProvider itws = new ItwebSettingsTextsProvider(encoding, new HtmlFormatter(allowContext, allowLogo, includeXmlHeader), titles, expand); PolicyEditorTextsProvider pe = new PolicyEditorTextsProvider(encoding, new HtmlFormatter(allowContext, allowLogo, includeXmlHeader), titles, expand); IcedTeaWebTextsProvider itw = new IcedTeaWebTextsProvider(encoding, new HtmlFormatter(allowContext, allowLogo, includeXmlHeader), titles, expand); ItwebPluginTextProvider pl = new ItwebPluginTextProvider(encoding, new HtmlFormatter(allowContext, allowLogo, includeXmlHeader), titles, expand); TextsProvider[] providers = new TextsProvider[]{javaws, itws, pe, itw, pl}; for (TextsProvider provider : providers) { provider.setAuthorFilePath(authorFileFromUserInput); provider.writeToDir(dir); } } public static void generateManText(String encoding, File dir, boolean expand) throws IOException { generateManText(encoding, dir, true, expand); } public static void generateManText(String encoding, File dir, boolean titles, boolean expand) throws IOException { JavaWsTextsProvider javaws = new JavaWsTextsProvider(encoding, new ManFormatter(), titles, expand); ItwebSettingsTextsProvider itws = new ItwebSettingsTextsProvider(encoding, new ManFormatter(), titles, expand); PolicyEditorTextsProvider pe = new PolicyEditorTextsProvider(encoding, new ManFormatter(), titles, expand); IcedTeaWebTextsProvider itw = new IcedTeaWebTextsProvider(encoding, new ManFormatter(), titles, expand); ItwebPluginTextProvider pl = new ItwebPluginTextProvider(encoding, new ManFormatter(), titles, expand); TextsProvider[] providers = new TextsProvider[]{javaws, itws, pe, itw, pl}; for (TextsProvider provider : providers) { provider.setAuthorFilePath(authorFileFromUserInput); provider.writeToDir(dir); } } public static void generatePlainTextDocs(File dir, int lineWidth, boolean expand) throws IOException { generatePlainTextDocs("UTF-8", dir, PlainTextFormatter.DEFAULT_INDENT, lineWidth, true, expand); } public static void generatePlainTextDocs(String encoding, File dir, String indent, int lineWidth, boolean titles, boolean expand) throws IOException { JavaWsTextsProvider javaws = new JavaWsTextsProvider(encoding, new PlainTextFormatter(indent, lineWidth), titles, expand); ItwebSettingsTextsProvider itws = new ItwebSettingsTextsProvider(encoding, new PlainTextFormatter(indent, lineWidth), titles, expand); PolicyEditorTextsProvider pe = new PolicyEditorTextsProvider(encoding, new PlainTextFormatter(indent, lineWidth), titles, expand); IcedTeaWebTextsProvider itw = new IcedTeaWebTextsProvider(encoding, new PlainTextFormatter(indent, lineWidth), titles, expand); ItwebPluginTextProvider pl = new ItwebPluginTextProvider(encoding, new PlainTextFormatter(indent, lineWidth), titles, expand); TextsProvider[] providers = new TextsProvider[]{javaws, itws, pe, itw, pl}; for(TextsProvider provider : providers){ provider.setAuthorFilePath(authorFileFromUserInput); provider.writeToDir(dir); } } private static final int BUF_SIZE = 0x1000; // 4K private static long copy(InputStream from, OutputStream to) throws IOException { byte[] buf = new byte[BUF_SIZE]; long total = 0; while (true) { int r = from.read(buf); if (r == -1) { break; } to.write(buf, 0, r); total += r; } return total; } /** * @return the introduction */ public boolean isIntroduction() { return introduction; } /** * @param introduction the introduction to set */ public void setIntroduction(boolean introduction) { this.introduction = introduction; } /** * @return the synopsis */ public boolean isSynopsis() { return synopsis; } /** * @param synopsis the synopsis to set */ public void setSynopsis(boolean synopsis) { this.synopsis = synopsis; } /** * @return the description */ public boolean isDescription() { return description; } /** * @param description the description to set */ public void setDescription(boolean description) { this.description = description; } /** * @return the commands */ public boolean isCommands() { return commands; } /** * @param commands the commands to set */ public void setCommands(boolean commands) { this.commands = commands; } /** * @return the options */ public boolean isOptions() { return options; } /** * @param options the options to set */ public void setOptions(boolean options) { this.options = options; } /** * @return the examples */ public boolean isExamples() { return examples; } /** * @param examples the examples to set */ public void setExamples(boolean examples) { this.examples = examples; } /** * @return the files */ public boolean isFiles() { return files; } /** * @param files the files to set */ public void setFiles(boolean files) { this.files = files; } /** * @return the bugs */ public boolean isBugs() { return bugs; } /** * @param bugs the bugs to set */ public void setBugs(boolean bugs) { this.bugs = bugs; } /** * @return the authors */ public boolean isAuthors() { return authors; } /** * @param authors the authors to set */ public void setAuthors(boolean authors) { this.authors = authors; } public void setAuthorFilePath(File authorFilePath) { this.authorFilePath = authorFilePath; } /** * @return the seeAlso */ public boolean isSeeAlso() { return seeAlso; } /** * @param seeAlso the seeAlso to set */ public void setSeeAlso(boolean seeAlso) { this.seeAlso = seeAlso; } private String removeFileProtocol(String s) { if (s == null){ return s; } if (s.startsWith("file://")){ s = s.substring(7); } return s; } private String readAuthors(File authors) { try { return readAuthorsImpl(authors); } catch (IOException e) { throw new RuntimeException(e); } } private String readAuthorsImpl(File authors) throws IOException { return readAuthorsImpl(new InputStreamReader(new FileInputStream(authors), "UTF-8")); } String readAuthorsImpl(Reader authors) throws IOException { StringBuilder sb = new StringBuilder(); boolean areAuthors = false; BufferedReader reader = new BufferedReader(authors); while (true) { String line = reader.readLine(); if (line == null) { break; } if (line.trim().isEmpty()) { areAuthors = !areAuthors; } sb.append(getFormatter().process(getFormatter().getAdressLink(line))); if (getFormatter() instanceof HtmlFormatter || areAuthors == false) { sb.append(getFormatter().getNewLine()); } } return sb.toString(); } private String generateAuthorsSection(File filePath) { if (filePath == null) { return getFormatter().wrapParagraph( getFormatter().process(Translator.R("ITWdocsMissingAuthors")) + getFormatter().getNewLine()); } else { return getFormatter().wrapParagraph( getFormatter().process(readAuthors(filePath)) + getFormatter().getNewLine()); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/PaxHeaders.7406/formatters0000644000000000000000000000013113441742745025662 xustar0030 mtime=1552401893.046832808 30 atime=1552410887.113183443 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/0000755000175000002070000000000013441742745026550 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/PaxHeaders.7406/formatters0000644000000000000000000000013113441742745030050 xustar0030 mtime=1552401893.075832748 30 atime=1552410887.113183443 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/0000755000175000002070000000000013441742745030736 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PaxHeaders.7406/Htm0000644000000000000000000000013113441742745030600 xustar0030 mtime=1552401893.075832748 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/HtmlFormatter.java0000644000175000002070000001551213441742745034375 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider.formatters.formatters; import java.util.Date; import java.util.Map; import java.util.Set; import java.util.TreeMap; import net.sourceforge.jnlp.runtime.JNLPRuntime; public class HtmlFormatter extends ReplacingTextFormatter { private final Map content = new TreeMap<>(); private final boolean allowContext; private final boolean allowLogo; private final boolean includeXmlHeader; private final String lT = "<"; private final String gT = ">"; public static final String SUFFIX = "html"; @Override public String process(String s) { //the texts in properties are already using html markup return s; } public HtmlFormatter(boolean allowContext, boolean allowLogo, boolean includeXmlHeader) { this.allowContext = allowContext; this.allowLogo = allowLogo; this.includeXmlHeader = includeXmlHeader; } public HtmlFormatter() { this(true, true, false); } @Override public String getNewLine() { return "
" + PlainTextFormatter.getLineSeparator(); } @Override public String getBoldOpening() { return ""; } @Override public String getBoldClosing() { return ""; } @Override public String getTitle(String s) { return "

" + knownIdToString(s) + "

\n"; } @Override public String getHeaders(String id, String encoding) { //jeditorpane dont like \n"; } return xml + "\n" + "\n" + " \n" + " " + id + ": " + getVersion() + "" + " \n" + " \n" + " \n" + "
" + id + ": " + getVersion() + ", " + JNLPRuntime.getLocalisedTimeStamp(new Date()) + "
"; } @Override public String getTail() { return " \n"; } @Override public String getUrl(String url, String visible) { return "
" + visible + ""; } private String knownIdToString(String s) { String value = localizeTitle(s); String key = s; content.put(key, value); return value; } @Override public String getSeeAlso(String s) { return "
  • " + getUrl(s + getFileSuffix(), s) + "
  • \n"; } public StringBuilder generateIndex() { if (!allowContext) { return new StringBuilder(); } Set> set = content.entrySet(); if (set.isEmpty()) { return new StringBuilder(); } StringBuilder sb = new StringBuilder("

    " + "Context" + "

    "); for (Map.Entry entry : set) { sb.append("
  • ").append(entry.getValue()).append("
  • "); } return sb; } @Override public String getFileSuffix() { return "." + SUFFIX; } @Override public String wrapParagraph(String s) { return "

    " + s + "

    "; } @Override public String getBreakAndBold() { return getNewLine() + getBoldOpening(); } @Override public String getCloseBoldAndBreak() { return getBoldClosing() + getNewLine(); } @Override public String getBoldCloseNwlineBoldOpen() { return getBoldClosing() + getNewLine() + getBoldOpening(); } public String generateLogo() { if (allowLogo) { return "
    \"IcedTea-Web
    " + getNewLine(); } else { return ""; } } @Override public String getOption(String key, String value) { return "
  • " + key + " - " + process(value) + "
  • "; } @Override public String getAdressLink(String s) { String emailDelBracket = s.replaceAll(".*<", ""); String adress = emailDelBracket.replaceAll(">.*", ""); if (s.contains("@")) { String name = s.replaceAll("<.*", "").trim(); return "" + name + ""; } else { return s.replaceAll("<.*>", "" + adress + ""); } } @Override public String replaceLtGtCharacters(String s) { String replaceLt = s.replaceAll("<", lT); String replaceLtGt = replaceLt.replaceAll(">", gT); return replaceLtGt; } private static String antiSpam(String adress) { StringBuilder sb = new StringBuilder(); for (int x = 0; x < adress.length(); x++) { sb.append(adress.charAt(x)).append(" "); } return sb.toString().trim(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PaxHeaders.7406/Pla0000644000000000000000000000031313441742745030566 xustar00114 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PlainTextFormatter.java 30 mtime=1552401893.046832808 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PlainTextFormatter.0000644000175000002070000001364213441742745034541 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider.formatters.formatters; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.TreeMap; import net.sourceforge.jnlp.util.docprovider.TextsProvider; public class PlainTextFormatter extends ReplacingTextFormatter { private final Map LongestKeys = new TreeMap<>(); private String currentSection = "none"; public static final String SUFFIX = "txt"; public static String getLineSeparator() { return java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction("line.separator")); } private final String pargraohIndentation; private final int maxLineLength; public static final String DEFAULT_INDENT = " "; public PlainTextFormatter(String pargraohIndentation, int maxLineLength) { this.pargraohIndentation = pargraohIndentation; this.maxLineLength = maxLineLength; } public PlainTextFormatter(String pargraohIndentation) { this(pargraohIndentation, Integer.MAX_VALUE); } public PlainTextFormatter(int maxLineLength) { this(DEFAULT_INDENT, maxLineLength); } public PlainTextFormatter() { this.pargraohIndentation = DEFAULT_INDENT; this.maxLineLength = Integer.MAX_VALUE; } @Override public String getBoldOpening() { return ""; } @Override public String getBoldClosing() { return ""; } @Override public String getTitle(String s) { currentSection = s; return localizeTitle(s) + getNewLine(); } @Override public String getNewLine() { return getLineSeparator(); } @Override public String getHeaders(String id, String encoding) { return " *** " + TextsProvider.ITW + " " + getVersion() + " *** "; } @Override public String getTail() { return ""; } @Override public String getSeeAlso(String s) { return " * " + s + getNewLine(); } @Override public String getFileSuffix() { return "."+SUFFIX; } @Override public String wrapParagraph(String s) { return wrapParagraph(s, maxLineLength, pargraohIndentation); } static String wrapParagraph(String input, int maxWidth, String indent) { List l = new ArrayList(Arrays.asList(input.split(getLineSeparator()))); for (int i = 0; i < l.size(); i++) { String s = indent + l.get(i).trim(); if (s.length() > maxWidth) { //no splitting in middle of words String split1 = s.substring(0, maxWidth); int split2 = split1.lastIndexOf(" "); int splitTest = split1.trim().lastIndexOf(" "); if (split2 < 1 || splitTest < 1) { //avoid words longer then maxWidth split2 = maxWidth; } l.set(i, s.substring(0, split2)); l.add(i + 1, s.substring(split2)); } else { l.set(i, s); } } return listToString(l); } static String listToString(List l) { StringBuilder sb = new StringBuilder(); for (String string : l) { sb.append(string).append(getLineSeparator()); } return sb.toString(); } @Override public String getBreakAndBold() { return getNewLine(); } @Override public String getCloseBoldAndBreak() { return getNewLine(); } @Override public String getBoldCloseNwlineBoldOpen() { return getNewLine(); } @Override public String getOption(String key, String value) { Integer longestKey = LongestKeys.get(currentSection); if (longestKey == null){ longestKey = 0; } if (key.length() > longestKey) { longestKey = key.length(); LongestKeys.put(currentSection, longestKey); } return key + getSpaces(longestKey + 3, key.length()) + process(value) + getNewLine(); } private String getSpaces(int l, int k) { if (l - k <= 3) { return " - "; } String s = ""; while (s.length() < l - k - 2) { s += " "; } return s + "- "; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PaxHeaders.7406/Rep0000644000000000000000000000031713441742745030604 xustar00118 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatter.java 30 mtime=1552401893.051832798 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormat0000644000175000002070000000707513441742745034614 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider.formatters.formatters; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sourceforge.jnlp.runtime.Boot; import net.sourceforge.jnlp.runtime.Translator; public abstract class ReplacingTextFormatter implements Formatter { public static String backupVersion; public static final Pattern BOLD_OPEN_PATTERN = Pattern.compile("<\\s*[Bb]\\s*>"); public static final Pattern BOLD_CLOSE_PATTERN = Pattern.compile("<\\s*/\\s*[Bb]\\s*>"); @Override public String process(String s1) { Matcher m1 = BOLD_OPEN_PATTERN.matcher(s1); String s2 = m1.replaceAll(getBoldOpening()); Matcher m2 = BOLD_CLOSE_PATTERN.matcher(s2); return (m2.replaceAll(getBoldClosing())); } protected String localizeTitle(String s) { return Translator.R("man"+s); } @Override public String getBold(String s) { return getBoldOpening() + s + getBoldClosing(); } @Override public String getUrl(String url) { return getUrl(url, url); } @Override public String getUrl(String url, String look) { if (look == null || look.trim().length() == 0 || url.equals(look)) { return url; } else { return look + " (" + url + ")"; } } public String getVersion() { if (Boot.version == null) { if (backupVersion == null) { return "unknown version"; } return backupVersion; } else { return Boot.version; } } @Override public String getNewLine(int count) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < count; i++) { sb.append(getNewLine()); } return sb.toString(); } @Override public String getAdressLink(String s) { return s; } @Override public String replaceLtGtCharacters(String s) { return s; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PaxHeaders.7406/Man0000644000000000000000000000013113441742745030563 xustar0030 mtime=1552401893.056832787 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ManFormatter.java0000644000175000002070000001451613441742745034207 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider.formatters.formatters; import java.text.Format; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import net.sourceforge.jnlp.util.docprovider.TextsProvider; public class ManFormatter extends ReplacingTextFormatter { public static class KnownSections { public static final String NAME = "NAME"; public static final String SYNOPSIS = "SYNOPSIS"; public static final String DESCRIPTION = "DESCRIPTION"; public static final String OPTIONS = "OPTIONS"; public static final String COMMANDS = "COMMANDS"; public static final String EXAMPLES = "EXAMPLES"; public static final String FILES = "FILES"; public static final String BUGS = "BUGS"; public static final String AUTHOR = "AUTHOR"; public static final String SEE_ALSO = "SEE_ALSO"; } public static final String SUFFIX = "1"; @Override public String getNewLine() { return PlainTextFormatter.getLineSeparator() + ".br" + PlainTextFormatter.getLineSeparator(); } @Override public String getBoldOpening() { return PlainTextFormatter.getLineSeparator() + ".B "; } @Override public String getBoldClosing() { return PlainTextFormatter.getLineSeparator(); } /** * There is one line break less */ @Override public String getBreakAndBold() { return PlainTextFormatter.getLineSeparator() + ".br" + PlainTextFormatter.getLineSeparator() + ".B "; } /** * There is one line break less */ @Override public String getCloseBoldAndBreak() { return PlainTextFormatter.getLineSeparator() + ".B " + PlainTextFormatter.getLineSeparator() + ".br" + PlainTextFormatter.getLineSeparator(); } /** * There are two lines breaks less */ @Override public String getBoldCloseNwlineBoldOpen() { return PlainTextFormatter.getLineSeparator() + ".br" + PlainTextFormatter.getLineSeparator() + ".B "; } @Override public String getTitle(String name) { return ".SH " + localizeTitle(name) + PlainTextFormatter.getLineSeparator() + PlainTextFormatter.getLineSeparator(); } @Override public String getHeaders(String id, String encoding) { return ".TH " + id + " 1 \"" + getManPageDate(true) + "\"" + " \"" + TextsProvider.ITW + " " + getVersion() + "\"" + PlainTextFormatter.getLineSeparator(); } @Override public String getTail() { return ""; } private String getManPageDate(boolean localize) { Date now = new Date(); Calendar c = Calendar.getInstance(); c.setTime(now); int day = c.get(Calendar.DAY_OF_MONTH); int year = c.get(Calendar.YEAR); String month; if (localize) { Format formatter = new SimpleDateFormat("MMM"); month = formatter.format(now); } else { month = getUnlocallizedMonth(c.get(Calendar.MONTH));; } return day + " " + month + " " + year; } private String getUnlocallizedMonth(int get) { switch (get) { case Calendar.JANUARY: return "Jan"; case Calendar.FEBRUARY: return "Feb"; case Calendar.MARCH: return "Mar"; case Calendar.APRIL: return "Apr"; case Calendar.MAY: return "May"; case Calendar.JUNE: return "Jun"; case Calendar.JULY: return "Jul"; case Calendar.AUGUST: return "Aug"; case Calendar.SEPTEMBER: return "Sep"; case Calendar.OCTOBER: return "Oct"; case Calendar.NOVEMBER: return "Nov"; case Calendar.DECEMBER: return "Dec"; default: return "Unkw"; } } @Override public String getSeeAlso(String s) { return ".BR " + s + " (1)" + PlainTextFormatter.getLineSeparator(); } @Override public String getFileSuffix() { return "."+SUFFIX; } @Override public String wrapParagraph(String s) { return PlainTextFormatter.getLineSeparator() + ".PP" + PlainTextFormatter.getLineSeparator() + s; } @Override public String getOption(String key, String value) { if (key.startsWith("-")) { key = "\\" + key; } if (value.startsWith("-")) { value = "\\" + value; } return ".TP 12" + PlainTextFormatter.getLineSeparator() + key + PlainTextFormatter.getLineSeparator() + process(value) + PlainTextFormatter.getLineSeparator(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PaxHeaders.7406/For0000644000000000000000000000013113441742745030576 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/Formatter.java0000644000175000002070000000507313441742745033551 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider.formatters.formatters; public interface Formatter { public String process(String s); public String wrapParagraph(String s); public String getHeaders(String id, String encoding); public String getNewLine(); public String getNewLine(int count); public String getBold(String s); public String getBoldOpening(); public String getBoldClosing(); public String getBreakAndBold(); public String getCloseBoldAndBreak(); public String getBoldCloseNwlineBoldOpen(); public String getTitle(String name); public String getUrl(String url); public String getUrl(String url, String appearence); public String getOption(String key, String value); public String getSeeAlso(String s); public String getTail(); public String getFileSuffix(); public String getAdressLink(String s); public String replaceLtGtCharacters(String s); } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/PaxHeaders.7406/ItwebPluginTextProvider.j0000644000000000000000000000013013441742745030534 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/ItwebPluginTextProvider.java0000644000175000002070000001415513441742745032044 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider; import java.io.IOException; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.Formatter; /** * * @author jvanek */ public class ItwebPluginTextProvider extends TextsProvider { public ItwebPluginTextProvider(String encoding, Formatter formatter, boolean forceTitles, boolean expandFiles) { super(encoding, formatter, forceTitles, expandFiles); } @Override public String getId() { return ITW_PLUGIN; } @Override public String getIntroduction() { return super.getIntroduction() + getFormatter().wrapParagraph( getFormatter().process(getId() + " " + Translator.R("ITWPintro"))); } @Override public String getSynopsis() { //yes, thsi really returns arch of jdk. So just nice nicly looking, mostly ok workaround. //fix needs native code String jdkArch = System.getProperty("os.arch") + "x"; String mozillas; if (expandVariables) { mozillas = getFormatter().getOption(PathsAndFiles.MOZILA_USER.getFile().getParent(), PathsAndFiles.MOZILA_USER.getDescription()); } else { mozillas = getFormatter().getOption(PathsAndFiles.MOZILA_USER.getDirViaAcronym(), PathsAndFiles.MOZILA_USER.getDescription()); } if (!expandVariables || jdkArch.endsWith("64")) { if (expandVariables) { mozillas += getFormatter().getOption(PathsAndFiles.MOZILA_GLOBAL_64.getDirViaAcronym(), PathsAndFiles.MOZILA_GLOBAL_64.getDescription()); } else { mozillas += getFormatter().getOption(PathsAndFiles.MOZILA_GLOBAL_64.getFile().getParent(), PathsAndFiles.MOZILA_GLOBAL_64.getDescription()); } } if (!expandVariables || !jdkArch.endsWith("64")) { if (expandVariables) { mozillas += getFormatter().getOption(PathsAndFiles.MOZILA_GLOBAL_32.getDirViaAcronym(), PathsAndFiles.MOZILA_GLOBAL_32.getDescription()); } else { mozillas += getFormatter().getOption(PathsAndFiles.MOZILA_GLOBAL_32.getFile().getParent(), PathsAndFiles.MOZILA_GLOBAL_32.getDescription()); } } String operas = ""; if (!expandVariables || jdkArch.endsWith("64")) { if (expandVariables) { operas += getFormatter().getOption(PathsAndFiles.OPERA_64.getDirViaAcronym(), PathsAndFiles.OPERA_64.getDescription()); } else { operas += getFormatter().getOption(PathsAndFiles.OPERA_64.getFile().getParent(), PathsAndFiles.OPERA_64.getDescription()); } } if (!expandVariables || !jdkArch.endsWith("64")) { if (expandVariables) { operas += getFormatter().getOption(PathsAndFiles.OPERA_32.getDirViaAcronym(), PathsAndFiles.OPERA_32.getDescription()); } else { operas += getFormatter().getOption(PathsAndFiles.OPERA_32.getFile().getParent(), PathsAndFiles.OPERA_32.getDescription()); } } return super.getSynopsis() + getFormatter().getBold(getId() + " ") + getFormatter().process(Translator.R("ITWPsynopsL1")) + getFormatter().getNewLine() + getFormatter().wrapParagraph( getFormatter().process(Translator.R("ITWPsynopsL2", PathsAndFiles.ICEDTEA_SO, getFormatter().getUrl(ITW_PLUGIN_URL))) + getFormatter().getNewLine() + getFormatter().process(Translator.R("ITWPsynopsL3")) + getFormatter().getNewLine() + mozillas) + getFormatter().wrapParagraph(getFormatter().process(Translator.R("ITWPsynopsL4")) + getFormatter().getNewLine() + operas) + getFormatter().wrapParagraph(Translator.R("ITWPtrademarks")); } @Override public String getDescription() { return ""; } @Override public String getOptions() { return ""; } @Override public String getExamples() { return ""; } @Override public String getFiles() { String s = super.getFiles() + getFiles(PathsAndFiles.getAllPluginFiles()); s = s + getFilesAppendix(); return s; } public static void main(String[] args) throws IOException { TextsProvider.main(new String[]{"all", "false", "3.51.a"}); } @Override public String getCommands() { return ""; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/PaxHeaders.7406/PolicyEditorTextsProvider0000644000000000000000000000013113441742745030645 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/PolicyEditorTextsProvider.java0000644000175000002070000001056213441742745032402 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider; import java.io.IOException; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.Formatter; /** * * @author jvanek */ public class PolicyEditorTextsProvider extends TextsProvider { public PolicyEditorTextsProvider(String encoding, Formatter formatter, boolean forceTitles, boolean expandFiles) { super(encoding, formatter, forceTitles, expandFiles); } @Override public String getId() { return POLICY_EDITOR; } @Override public String getIntroduction() { return super.getIntroduction() + getFormatter().wrapParagraph( getFormatter().process(getId() + " "+Translator.R("PEintro"))); } @Override public String getSynopsis() { return super.getSynopsis() + getFormatter().wrapParagraph(getFormatter().process(getFormatter().getBoldOpening() + " " + getId() + " " + getFormatter().getBoldCloseNwlineBoldOpen() + getId() + " [-file] " + getFormatter().getBoldClosing() + Translator.R("PEsynopseP1"))); } @Override public String getDescription() { return super.getDescription() + getFormatter().wrapParagraph(getFormatter().process(getFormatter().getBold(getId() + " ") + Translator.R("PEdescL1") + getFormatter().getNewLine() + getFormatter().getNewLine() + Translator.R("PEdescL2"))); } @Override public String getOptions() { return super.getOptions() + getFormatter().wrapParagraph(optionsToString(OptionsDefinitions.getPolicyEditorOptions())); } @Override public String getExamples() { String title = super.getExamples(); String s = ""; if (expandVariables) { s = s + getFormatter().getOption(getId() + " -file " + PathsAndFiles.JAVA_POLICY.getFullPath(), Translator.R("PEexampleL1")); } else { s = s + getFormatter().getOption(getId() + " -file " + PathsAndFiles.JAVA_POLICY.toString(), Translator.R("PEexampleL1")); } return title + getFormatter().wrapParagraph( getFormatter().getOption(getId(), Translator.R("PEexampleL2")) + s); } @Override public String getFiles() { return super.getFiles() + getFiles(PathsAndFiles.getAllPEFiles()) + getFilesAppendix(); } public static void main(String[] args) throws IOException { TextsProvider.main(new String[]{"all", "true", "3.51.a"}); } @Override public String getCommands() { return ""; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/PaxHeaders.7406/ItwebSettingsTextsProvide0000644000000000000000000000013113441742745030650 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/ItwebSettingsTextsProvider.java0000644000175000002070000001701713441742745032571 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.config.Defaults; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.InfrastructureFileDescriptor; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.config.Setting; import net.sourceforge.jnlp.config.ValueValidator; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.Formatter; public class ItwebSettingsTextsProvider extends TextsProvider { public ItwebSettingsTextsProvider(String encoding, Formatter formatter, boolean forceTitles, boolean expandFiles) { super(encoding, formatter, forceTitles, expandFiles); } @Override public String getId() { return ITWEB_SETTINGS; } @Override public String getIntroduction() { return super.getIntroduction() + getFormatter().wrapParagraph( getFormatter().process(getId() + " " + Translator.R("ITWSintro"))); } @Override public String getSynopsis() { return super.getSynopsis() + getFormatter().wrapParagraph( getFormatter().getBoldOpening() + getId() + " " + getFormatter().getBoldCloseNwlineBoldOpen() + getId() + " " + getFormatter().getBoldClosing() + Translator.R("ITWSsynops")); } @Override public String getDescription() { return super.getDescription() + getFormatter().wrapParagraph(getFormatter().getBold(getId() + " ") + getFormatter().process( Translator.R("IWSdescL1") + getFormatter().getNewLine() + getFormatter().getNewLine() + Translator.R("IWSdescL2") + getFormatter().getNewLine() + getFormatter().getNewLine() + Translator.R("IWSdescL3"))); } @Override public String getOptions() { return ""; } @Override public String getCommands() { return super.getDescription() + getFormatter().wrapParagraph(optionsToString(OptionsDefinitions.getItwsettingsCommands())); } @Override public String getExamples() { return super.getExamples() + getFormatter().wrapParagraph( getFormatter().getOption(getId(), Translator.R("IWSexampleL1")) + getFormatter().getOption(getId() + " " + OptionsDefinitions.OPTIONS.RESET.option + " " + DeploymentConfiguration.KEY_PROXY_TYPE, " " + Translator.R("IWSexampleL2", DeploymentConfiguration.KEY_PROXY_TYPE))) + getFormatter().getNewLine() + getFormatter().wrapParagraph(getKpMinorTitle() + getFormatter().getNewLine() + getFormatter().wrapParagraph(getProperties())); } @Override public String getFiles() { return super.getFiles() + getFiles(PathsAndFiles.getAllItWebSettingsFiles()) + getFilesAppendix(); } public static void main(String[] args) throws IOException { TextsProvider.main(new String[]{"all", "true", "3.51.a"}); } private String getProperties() { StringBuilder sb = new StringBuilder(); List>> defaults = new ArrayList<>(Defaults.getDefaults().entrySet()); Collections.sort(defaults, new Comparator>>() { @Override public int compare(Map.Entry> o1, Map.Entry> o2) { return o1.getKey().compareTo(o2.getKey()); } }); List files = PathsAndFiles.getAllFiles(); for (Map.Entry> entry : defaults) { String defaultValue = entry.getValue().getDefaultValue(); String fileAcronom = null; for (InfrastructureFileDescriptor f : files) { if (matchSttingsValueWithInfrastrucutreFile(entry.getValue(), f)) { fileAcronom = f.toString(); break; } } String setValue = JNLPRuntime.getConfiguration().getProperty(entry.getKey()); if (defaultValue == null) { defaultValue = "null"; } if (setValue == null) { setValue = "null"; } String value; if (expandVariables) { if (defaultValue.equals(setValue)) { value = defaultValue; } else { value = setValue + " (" + Translator.R("ITWSdefault") + ": " + defaultValue + ")"; } } else { if (fileAcronom == null) { value = defaultValue; } else { value = fileAcronom; } } ValueValidator v = entry.getValue().getValidator(); if (v != null && v.getPossibleValues() != null && !v.getPossibleValues().trim().isEmpty()) { value = value + " (" + Translator.R("IWSpossible") + " " + v.getPossibleValues() + ")"; } sb.append(getFormatter().getOption(entry.getKey(), value)); } return sb.toString(); } public String getKpMinorTitle() { if (expandVariables) { return getFormatter().getBold(Translator.R("IWSexampleL3") + " " + Translator.R("IWSexampleL31")); } else { return getFormatter().getBold(Translator.R("IWSexampleL3") + " " + Translator.R("IWSexampleL32")); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/PaxHeaders.7406/IcedTeaWebTextsProvider.j0000644000000000000000000000013113441742745030423 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/IcedTeaWebTextsProvider.java0000644000175000002070000001275313441742745031734 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider; import java.io.IOException; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.Formatter; public class IcedTeaWebTextsProvider extends TextsProvider { public IcedTeaWebTextsProvider(String encoding, Formatter formatter, boolean forceTitles, boolean expandFiles) { super(encoding, formatter, forceTitles, expandFiles); } @Override public String getIntroduction() { return super.getIntroduction() + getFormatter().wrapParagraph( Translator.R("ITWintroL1",getFormatter().getBold(getId() + " ")) + getFormatter().getNewLine(2) + Translator.R("ITWintroL2") + getFormatter().getNewLine() + Translator.R("ITWintroL3", getId(), getFormatter().getUrl("http://www.java.com/en/download/testjava.jsp", Translator.R("ITWintroUrlCaption"))) + getFormatter().getNewLine() + getFormatter().getOption("",Translator.R("BFileInfoAuthors")) + getFormatter().getOption("",Translator.R("BFileInfoCopying")) + getFormatter().getOption("",Translator.R("BFileInfoNews")) + getFormatter().getNewLine(2)); } @Override public String getSynopsis() { return ""; } @Override public String getDescription() { StringBuilder p1 = new StringBuilder(); //there is 7 pairs of keys ITWdescO X title/text. I was to lazy to enumerate them manually for (int x = 1; x <= 7; x++) { p1.append(getFormatter().getOption(Translator.R("ITWdescO" + x + "title"), Translator.R("ITWdescO" + x + "text"))); } p1.append(getFormatter().getNewLine()); StringBuilder p2 = new StringBuilder(); p2.append(Translator.R("ITWdescL1", getFormatter().getUrl(IT_MAIN, Translator.R("ITWdescWikiUrlTitle")), getFormatter().getUrl(ITW_HOME, Translator.R("ITWdescItwWikiUrlTitle")))); p2.append(getFormatter().getNewLine()); p2.append(Translator.R("ITWdescL2", getFormatter().getUrl(ITW_ISSUES, Translator.R("ITWdescIssuesUrlTitle")))); p2.append(getFormatter().getNewLine()); String header = getFormatter().getBold(Translator.R("ITWdescL3") + " ") + getFormatter().getNewLine(); return super.getDescription() + getFormatter().wrapParagraph(header) + getFormatter().wrapParagraph(p1.toString()) + getFormatter().getNewLine() + getFormatter().wrapParagraph(p2.toString()); } @Override public String getOptions() { String l1 = Translator.R("ITWoptionsL1",getFormatter().getUrl(IT_QUICK,Translator.R("ITWoptionsQuickStartUrlCaption"))); String l2 = Translator.R("ITWoptionsL2", getFormatter().getUrl(ITW_STYLE, Translator.R("ITWoptionsCodeUrlUrlCaption")), getFormatter().getUrl(ITW_ECLIPSE, Translator.R("ITWoptionsEclipseUrlCaption")), getFormatter().getUrl(ITW_REPRODUCERS,Translator.R( "ITWoptionsReproducersUrlCaption")), getFormatter().getUrl(DISTRO_PKG, Translator.R("ITWoptionsDistroUrlCaption"))); String header = getFormatter().getBold(Translator.R("ITWoptionsL3")) + getFormatter().getNewLine(); return getFormatter().wrapParagraph(header) + getFormatter().wrapParagraph(l1) + getFormatter().wrapParagraph(l2); } @Override public String getFiles() { return ""; } @Override public String getExamples() { return ""; } @Override public String getId() { return ITW; } public static void main(String[] args) throws IOException { TextsProvider.main(new String[]{"all", "true", "3.51.a"}); } @Override public String getCommands() { return ""; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/PaxHeaders.7406/JavaWsTextsProvider.java0000644000000000000000000000013113441742745030352 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/docprovider/JavaWsTextsProvider.java0000644000175000002070000001303013441742745031160 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.docprovider; import java.io.IOException; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.Translator; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.Formatter; public class JavaWsTextsProvider extends TextsProvider { public JavaWsTextsProvider(String encoding, Formatter formatter, boolean forceTitles, boolean expandFiles) { super(encoding, formatter, forceTitles, expandFiles); } @Override public String getId() { return JAVAWS; } @Override public String getIntroduction() { return super.getIntroduction() + getFormatter().wrapParagraph(getFormatter().process(getId() + " " + Translator.R("JWSintro"))); } @Override public String getSynopsis() { return super.getSynopsis() + getFormatter().wrapParagraph(getFormatter().process(getFormatter().getBold(" " + getId() + " ") + R("BOUsage") + getFormatter().getBreakAndBold() + getId() + " " + getFormatter().getBoldClosing() + R("BOUsage2"))); } @Override public String getDescription() { return super.getDescription() + getFormatter().wrapParagraph(getFormatter().process( getFormatter().getBold(getId() + " ") + Translator.R("JWSdescL1", getFormatter().getBold(getId()+" ")) + getFormatter().getNewLine()+ getFormatter().getNewLine() + Translator.R("JWSdescL2"))); } @Override public String getOptions() { String title = super.getOptions(); String add1 = Translator.R("JWSoptionsL1"); String add2 = Translator.R("JWSoptionsL2"); String add3 = Translator.R("JWSoptionsL3"); String adds = getFormatter().wrapParagraph(add1 + getFormatter().getNewLine() + add2 + getFormatter().getNewLine() + add3); String runtime = getFormatter().getBold(Translator.R("JWSoptionsTitle1")) + getFormatter().getNewLine() + optionsToString(OptionsDefinitions.getJavaWsRuntimeOptions()); String control = getFormatter().getBold(Translator.R("JWSoptionsTitle2")) + getFormatter().getNewLine() + optionsToString(OptionsDefinitions.getJavaWsControlOptions()); return title + adds + getFormatter().wrapParagraph(control) + getFormatter().wrapParagraph(runtime); } @Override public String getExamples() { return super.getExamples() + getFormatter().wrapParagraph( getFormatter().getOption(getId() + " " + OptionsDefinitions.OPTIONS.ABOUT.option, Translator.R("JWSexampleL1")) + getFormatter().getOption(getId() + " " + OptionsDefinitions.OPTIONS.ABOUT.option + " " + OptionsDefinitions.OPTIONS.HEADLESS.option, Translator.R("JWSexampleL2")) + getFormatter().getOption(getId() + " " + OptionsDefinitions.OPTIONS.NOFORK.option + " " + OptionsDefinitions.OPTIONS.NOHEADERS.option + " " + OptionsDefinitions.OPTIONS.REDIRECT.option + " " + OptionsDefinitions.OPTIONS.OFFLINE.option + " http://mypage.web/dangerous.jnlp", Translator.R("JWSexampleL3", "dangerous.jnlp", "mypage.web"))); } @Override public String getFiles() { String s = super.getFiles() + getFiles(PathsAndFiles.getAllJavaWsFiles()); s = s + getFilesAppendix(); return s; } public static void main(String[] args) throws IOException { TextsProvider.main(new String[]{"all", "true", "3.51.a"}); } @Override public String getCommands() { return ""; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/ScreenFinder.java0000644000000000000000000000013013441742745024442 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/ScreenFinder.java0000644000175000002070000001073713441742745025264 0ustar00jvanekmock00000000000000/* ScreenFinder.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.HeadlessException; import java.awt.Insets; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import net.sourceforge.jnlp.util.logging.OutputController; public class ScreenFinder { public static GraphicsDevice getCurrentScreen() { Point p = MouseInfo.getPointerInfo().getLocation(); return getScreenOnCoords(p); } public static Rectangle getCurrentScreenSizeWithoutBounds() { try { Point p = MouseInfo.getPointerInfo().getLocation(); return getScreenOnCoordsWithoutBounds(p); } catch (HeadlessException ex) { OutputController.getLogger().log(ex); return new Rectangle(800, 600); } } public static void centerWindowsToCurrentScreen(Window w) { Rectangle bounds = getCurrentScreenSizeWithoutBounds(); w.setLocation(bounds.x + (bounds.width - w.getWidth())/2, bounds.y + (bounds.height - w.getHeight())/2); } public static GraphicsDevice getScreenOnCoords(Point point) { GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] devices = e.getScreenDevices(); GraphicsDevice result = null; //now get the configuration(s) for each device for (GraphicsDevice device : devices) { //GraphicsConfiguration[] configurations = device.getConfigurations(); //or? GraphicsConfiguration[] configurations = new GraphicsConfiguration[]{device.getDefaultConfiguration()}; for (GraphicsConfiguration config : configurations) { Rectangle gcBounds = config.getBounds(); if (gcBounds.contains(point)) { result = device; } } } if (result == null) { //not found, get the default display result = e.getDefaultScreenDevice(); } return result; } public static Rectangle getScreenOnCoordsWithoutBounds(Point p) { try { GraphicsDevice device = getScreenOnCoords(p); Rectangle screenSize = device.getDefaultConfiguration().getBounds(); Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(device.getDefaultConfiguration()); return new Rectangle((int) screenSize.getX() + insets.left, (int) screenSize.getY() + insets.top, (int) screenSize.getWidth() - insets.left, (int) screenSize.getHeight() - insets.bottom); } catch (HeadlessException | IllegalArgumentException ex) { OutputController.getLogger().log(ex); return new Rectangle(800, 600); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/FileUtils.java0000644000000000000000000000013113441742745023774 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/FileUtils.java0000644000175000002070000006266213441742745024621 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.util; import java.awt.Component; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.RandomAccessFile; import java.io.Reader; import java.io.Writer; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.file.Files; import java.nio.file.attribute.AclEntry; import java.nio.file.attribute.AclEntryFlag; import java.nio.file.attribute.AclEntryPermission; import java.nio.file.attribute.AclEntryType; import java.nio.file.attribute.AclFileAttributeView; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; import javax.swing.JFrame; import javax.swing.JOptionPane; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.config.DirectoryValidator; import net.sourceforge.jnlp.config.DirectoryValidator.DirectoryCheckResults; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; import static net.sourceforge.jnlp.runtime.Translator.R; /** * This class contains a few file-related utility functions. * * @author Omair Majid */ public final class FileUtils { private static final String WIN_DRIVE_LETTER_COLON_WILDCHAR = "WINDOWS_VERY_SPECIFIC_DOUBLEDOT"; private static final List WIN_ROOT_PRINCIPALS = Arrays.asList("NT AUTHORITY\\SYSTEM", "BUILTIN\\Administrators"); /** * Indicates whether a file was successfully opened. If not, provides specific reasons * along with a general failure case */ public enum OpenFileResult { /** The file was successfully opened */ SUCCESS, /** The file could not be opened, for non-specified reasons */ FAILURE, /** The file could not be opened because it did not exist and could not be created */ CANT_CREATE, /** The file can be opened but in read-only */ CANT_WRITE, /** The specified path pointed to a non-file filesystem object, ie a directory */ NOT_FILE; } /** * list of characters not allowed in filenames */ public static final List INVALID_PATH = Arrays.asList(new Character[]{':', '*', '?', '"', '<', '>', '|', '[', ']', '\'', ';', '=', ','}); public static final List INVALID_NAME = new ArrayList<>(INVALID_PATH); static { INVALID_NAME.add(0, '\\'); INVALID_NAME.add(0, '/'); } private static final char SANITIZED_CHAR = '_'; /** * Clean up a string by removing characters that can't appear in a local * file name. * * @param path the path to sanitize * @return a sanitized version of the input which is suitable for using as a * file path */ public static String sanitizePath(String path) { return sanitizePath(path, SANITIZED_CHAR); } public static String sanitizePath(String path, char substitute) { //on windows, we can recieve both c:/path/ and c:\path\ path = path.replace("\\", "/"); if (JNLPRuntime.isWindows() && path.matches("^[a-zA-Z]\\:.*")) { path = path.replaceFirst(":", WIN_DRIVE_LETTER_COLON_WILDCHAR); } for (int i = 0; i < INVALID_PATH.size(); i++) { if (-1 != path.indexOf(INVALID_PATH.get(i))) { path = path.replace(INVALID_PATH.get(i), substitute); } } if (JNLPRuntime.isWindows()) { path = path.replaceFirst(WIN_DRIVE_LETTER_COLON_WILDCHAR, ":"); } return path; } /** * Given an input, return a sanitized form of the input suitable for use as * a file/directory name * * @param filename the filename to sanitize. * @return a sanitized version of the input */ public static String sanitizeFileName(String filename) { return sanitizeFileName(filename, SANITIZED_CHAR); } public static String sanitizeFileName(String filename, char substitute) { for (int i = 0; i < INVALID_NAME.size(); i++) { if (-1 != filename.indexOf(INVALID_NAME.get(i))) { filename = filename.replace(INVALID_NAME.get(i), substitute); } } return filename; } /** * Creates a new directory with minimum permissions. The directory is not * readable or writable by anyone other than the owner. The parent * directories are not created; they must exist before this is called. * * @param directory directory to be created * @throws IOException if IO fails */ public static void createRestrictedDirectory(File directory) throws IOException { createRestrictedFile(directory, true, true); } /** * Creates a new file with minimum permissions. The file is not readable or * writable by anyone other than the owner. If writeableByOnwer is false, * even the owner can not write to it. * * @param file path to file * @param writableByOwner true if can be writable by owner * @throws IOException if IO fails */ public static void createRestrictedFile(File file, boolean writableByOwner) throws IOException { createRestrictedFile(file, false, writableByOwner); } /** * Tries to create the ancestor directories of file f. Throws * an IOException if it can't be created (but not if it was * already there). * @param f file to provide parent directory * @param eMsg - the message to use for the exception. null * if the file name is to be used. * @throws IOException if the directory can't be created and doesn't exist. */ public static void createParentDir(File f, String eMsg) throws IOException { File parent = f.getParentFile(); if (!parent.isDirectory() && !parent.mkdirs()) { throw new IOException(R("RCantCreateDir", eMsg == null ? parent : eMsg)); } } /** * Tries to create the ancestor directories of file f. Throws * an IOException if it can't be created (but not if it was * already there). * @param f file which parent will be created * @throws IOException if the directory can't be created and doesn't exist. */ public static void createParentDir(File f) throws IOException { createParentDir(f, null); } /** * Tries to delete file f. If the file exists but couldn't be deleted, * print an error message to stderr with the file name, or eMsg if eMsg * is not null. * @param f the file to be deleted * @param eMsg the message to print on failure (or null to print the * the file name). */ public static void deleteWithErrMesg(File f, String eMsg) { if (f.exists()) { if (!f.delete()) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, R("RCantDeleteFile", eMsg == null ? f : eMsg)); } } } /** * Tries to delete file f. If the file exists but couldn't be deleted, * print an error message to stderr with the file name. * @param f the file to be deleted */ public static void deleteWithErrMesg(File f) { deleteWithErrMesg(f, null); } /** * Creates a new file or directory with minimum permissions. The file is not * readable or writable by anyone other than the owner. If writeableByOnwer * is false, even the owner can not write to it. If isDir is true, then the * directory can be executed by the owner * * @throws IOException */ private static void createRestrictedFile(File file, boolean isDir, boolean writableByOwner) throws IOException { File tempFile = new File(file.getCanonicalPath() + ".temp"); if (isDir) { if (!tempFile.mkdir()) { throw new IOException(R("RCantCreateDir", tempFile)); } } else { if (!tempFile.createNewFile()) { throw new IOException(R("RCantCreateFile", tempFile)); } } if (JNLPRuntime.isWindows()) { // prepare ACL flags Set flags = new LinkedHashSet<>(); if (tempFile.isDirectory()) { flags.add(AclEntryFlag.DIRECTORY_INHERIT); flags.add(AclEntryFlag.FILE_INHERIT); } // prepare ACL permissions Set permissions = new LinkedHashSet<>(); permissions.addAll(Arrays.asList( AclEntryPermission.READ_DATA, AclEntryPermission.READ_NAMED_ATTRS, AclEntryPermission.EXECUTE, AclEntryPermission.READ_ATTRIBUTES, AclEntryPermission.READ_ACL, AclEntryPermission.SYNCHRONIZE)); if (writableByOwner) { permissions.addAll(Arrays.asList( AclEntryPermission.WRITE_DATA, AclEntryPermission.APPEND_DATA, AclEntryPermission.WRITE_NAMED_ATTRS, AclEntryPermission.DELETE_CHILD, AclEntryPermission.WRITE_ATTRIBUTES, AclEntryPermission.DELETE, AclEntryPermission.WRITE_ACL, AclEntryPermission.WRITE_OWNER)); } // filter ACL's leaving only root and owner AclFileAttributeView view = Files.getFileAttributeView(tempFile.toPath(), AclFileAttributeView.class); List list = new ArrayList<>(); String owner = view.getOwner().getName(); for (AclEntry ae : view.getAcl()) { String principalName = ae.principal().getName(); if (WIN_ROOT_PRINCIPALS.contains(principalName) || owner.equals(principalName)) { list.add(AclEntry.newBuilder() .setType(AclEntryType.ALLOW) .setPrincipal(ae.principal()) .setPermissions(permissions) .setFlags(flags) .build()); } } // apply ACL view.setAcl(list); } else { // remove all permissions if (!tempFile.setExecutable(false, false)) { throw new IOException(R("RRemoveXPermFailed", tempFile)); } if (!tempFile.setReadable(false, false)) { throw new IOException(R("RRemoveRPermFailed", tempFile)); } if (!tempFile.setWritable(false, false)) { throw new IOException(R("RRemoveWPermFailed", tempFile)); } // allow owner to read if (!tempFile.setReadable(true, true)) { throw new IOException(R("RGetRPermFailed", tempFile)); } // allow owner to write if (writableByOwner && !tempFile.setWritable(true, true)) { throw new IOException(R("RGetWPermFailed", tempFile)); } // allow owner to enter directories if (isDir && !tempFile.setExecutable(true, true)) { throw new IOException(R("RGetXPermFailed", tempFile)); } } // rename this file. Unless the file is moved/renamed, any program that // opened the file right after it was created might still be able to // read the data. if (!tempFile.renameTo(file)) { throw new IOException(R("RCantRename", tempFile, file)); } } /** * Ensure that the parent directory of the file exists and that we are * able to create and access files within this directory * @param file the {@link File} representing a Java Policy file to test * @return a {@link DirectoryCheckResults} object representing the results of the test */ public static DirectoryCheckResults testDirectoryPermissions(File file) { try { file = file.getCanonicalFile(); } catch (final IOException e) { OutputController.getLogger().log(e); return null; } if (file == null || file.getParentFile() == null || !file.getParentFile().exists()) { return null; } final List policyDirectory = new ArrayList<>(); policyDirectory.add(file.getParentFile()); final DirectoryValidator validator = new DirectoryValidator(policyDirectory); final DirectoryCheckResults result = validator.ensureDirs(); return result; } /** * Verify that a given file object points to a real, accessible plain file. * @param file the {@link File} to verify * @return an {@link OpenFileResult} representing the accessibility level of the file */ public static OpenFileResult testFilePermissions(File file) { if (file == null || !file.exists()) { return OpenFileResult.FAILURE; } try { file = file.getCanonicalFile(); } catch (final IOException e) { return OpenFileResult.FAILURE; } final DirectoryCheckResults dcr = FileUtils.testDirectoryPermissions(file); if (dcr != null && dcr.getFailures() == 0) { if (file.isDirectory()) return OpenFileResult.NOT_FILE; try { if (!file.exists() && !file.createNewFile()) { return OpenFileResult.CANT_CREATE; } } catch (IOException e) { return OpenFileResult.CANT_CREATE; } final boolean read = file.canRead(), write = file.canWrite(); if (read && write) return OpenFileResult.SUCCESS; else if (read) return OpenFileResult.CANT_WRITE; else return OpenFileResult.FAILURE; } return OpenFileResult.FAILURE; } /** * Show a dialog informing the user that the file is currently read-only * @param frame a {@link JFrame} to act as parent to this dialog */ public static void showReadOnlyDialog(final Component frame) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(frame, R("RFileReadOnly"), R("Warning"), JOptionPane.WARNING_MESSAGE); } }); } /** * Show a generic error dialog indicating the file could not be opened * @param frame a {@link JFrame} to act as parent to this dialog * @param filePath a {@link String} representing the path to the file we failed to open */ public static void showCouldNotOpenFilepathDialog(final Component frame, final String filePath) { showCouldNotOpenDialog(frame, R("RCantOpenFile", filePath)); } /** * Show an error dialog indicating the file could not be opened, with a particular reason * @param frame a {@link JFrame} to act as parent to this dialog * @param filePath a {@link String} representing the path to the file we failed to open * @param reason a {@link OpenFileResult} specifying more precisely why we failed to open the file */ public static void showCouldNotOpenFileDialog(final Component frame, final String filePath, final OpenFileResult reason) { final String message; switch (reason) { case CANT_CREATE: message = R("RCantCreateFile", filePath); break; case CANT_WRITE: message = R("RCantWriteFile", filePath); break; case NOT_FILE: message = R("RExpectedFile", filePath); break; default: message = R("RCantOpenFile", filePath); break; } showCouldNotOpenDialog(frame, message); } /** * Show a dialog informing the user that the file could not be opened * @param frame a {@link JFrame} to act as parent to this dialog * @param message a {@link String} giving the specific reason the file could not be opened */ public static void showCouldNotOpenDialog(final Component frame, final String message) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(frame, message, R("Error"), JOptionPane.ERROR_MESSAGE); } }); } /** * Returns a String that is suitable for using in GUI elements for * displaying (long) paths to users. * * @param path a path that should be shortened * @return a shortened path suitable for displaying to the user */ public static String displayablePath(String path) { final int DEFAULT_LENGTH = 40; return displayablePath(path, DEFAULT_LENGTH); } /** * Return a String that is suitable for using in GUI elements for displaying * paths to users. If the path is longer than visibleChars, it is truncated * in a display-friendly way * * @param path a path that should be shorted * @param visibleChars the maximum number of characters that path should fit * into. Also the length of the returned string * @return a shortened path that contains limited number of chars */ public static String displayablePath(String path, int visibleChars) { /* * use a very simple method: prefix + "..." + suffix * * where prefix is the beginning part of path (as much as we can squeeze in) * and suffix is the end path of path */ if (path == null || path.length() <= visibleChars) { return path; } final String OMITTED = "..."; final int OMITTED_LENGTH = OMITTED.length(); final int MIN_PREFIX_LENGTH = 4; final int MIN_SUFFIX_LENGTH = 4; /* * we want to show things other than OMITTED. if we have too few for * suffix and prefix, then just return as much as we can of the filename */ if (visibleChars < (OMITTED_LENGTH + MIN_PREFIX_LENGTH + MIN_SUFFIX_LENGTH)) { return path.substring(path.length() - visibleChars); } int affixLength = (visibleChars - OMITTED_LENGTH) / 2; String prefix = path.substring(0, affixLength); String suffix = path.substring(path.length() - affixLength); return prefix + OMITTED + suffix; } /** * Recursively delete everything under a directory. Works on either files or * directories * * @param file the file object representing what to delete. Can be either a * file or a directory. * @param base the directory under which the file and its subdirectories must be located * @throws IOException on an io exception or if trying to delete something * outside the base */ public static void recursiveDelete(File file, File base) throws IOException { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Deleting: " + file); if (!(file.getCanonicalPath().startsWith(base.getCanonicalPath()))) { throw new IOException("Trying to delete a file outside Netx's basedir: " + file.getCanonicalPath()); } if (file.isDirectory()) { File[] children = file.listFiles(); for (File children1 : children) { recursiveDelete(children1, base); } } if (!file.delete()) { throw new IOException("Unable to delete file: " + file); } } /** * This will return a lock to the file specified. * * @param path File path to file we want to lock. * @param shared Specify if the lock will be a shared lock. * @param allowBlock Specify if we should block when we can not get the * lock. Getting a shared lock will always block. * @return FileLock if we were successful in getting a lock, otherwise null. * @throws FileNotFoundException If the file does not exist. */ public static FileLock getFileLock(String path, boolean shared, boolean allowBlock) throws FileNotFoundException { RandomAccessFile rafFile = new RandomAccessFile(path, "rw"); FileChannel fc = rafFile.getChannel(); FileLock lock = null; try { if (!shared) { if (allowBlock) { lock = fc.lock(0, Long.MAX_VALUE, false); } else { lock = fc.tryLock(0, Long.MAX_VALUE, false); } } else { // We want shared lock. This will block regardless if allowBlock is true or not. // Test to see if we can get a shared lock. lock = fc.lock(0, 1, true); // Block if a non exclusive lock is being held. if (!lock.isShared()) { // This lock is an exclusive lock. Use alternate solution. FileLock tempLock = null; for (long pos = 1; tempLock == null && pos < Long.MAX_VALUE - 1; pos++) { tempLock = fc.tryLock(pos, 1, false); } lock.release(); lock = tempLock; // Get the unique exclusive lock. } } } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } return lock; } /** * Method to save String as file in UTF-8 encoding. * * @param content which will be saved as it is saved in this String * @param f file to be saved. No warnings provided * @throws IOException if save fails */ public static void saveFile(String content, File f) throws IOException { saveFile(content, f, "utf-8"); } /** * Method to save String as file in specified encoding/. * * @param content which will be saved as it is saved in this String * @param f file to be saved. No warnings provided * @param encoding of output byte representation * @throws IOException if save fails */ public static void saveFile(String content, File f, String encoding) throws IOException { try (Writer output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), encoding))) { output.write(content); output.flush(); } } /** * utility method which can read from any stream as one long String * * @param is stream * @param encoding the encoding to use to convert the bytes from the stream * @return stream as string * @throws IOException if connection can't be established or resource does not exist */ public static String getContentOfStream(InputStream is, String encoding) throws IOException { try { return getContentOfReader(new InputStreamReader(is, encoding)); } finally { is.close(); } } public static String getContentOfReader(Reader r) throws IOException { try { BufferedReader br = new BufferedReader(r); StringBuilder sb = new StringBuilder(); while (true) { String s = br.readLine(); if (s == null) { break; } sb.append(s).append("\n"); } return sb.toString(); } finally { r.close(); } } /** * utility method which can read from any stream as one long String * * @param is stream * @return stream as string * @throws IOException if connection can't be established or resource does not exist */ public static String getContentOfStream(InputStream is) throws IOException { return getContentOfStream(is, "UTF-8"); } public static String loadFileAsString(File f) throws IOException { return getContentOfStream(new FileInputStream(f)); } public static String loadFileAsString(File f, String encoding) throws IOException { return getContentOfStream(new FileInputStream(f), encoding); } public static byte[] getFileMD5Sum(final File file, final String algorithm) throws NoSuchAlgorithmException, FileNotFoundException, IOException { final MessageDigest md5; InputStream is = null; DigestInputStream dis = null; try { md5 = MessageDigest.getInstance(algorithm); is = new FileInputStream(file); dis = new DigestInputStream(is, md5); md5.update(getContentOfStream(dis).getBytes()); } finally { if (is != null) { is.close(); } if (dis != null) { dis.close(); } } return md5.digest(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/UrlUtils.java0000644000000000000000000000013113441742745023657 xustar0030 mtime=1552401893.047832806 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/UrlUtils.java0000644000175000002070000005051013441742745024471 0ustar00jvanekmock00000000000000/* UrlUtils.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import net.sourceforge.jnlp.util.logging.OutputController; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.Socket; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.net.URLDecoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import javax.net.ssl.SSLSocketFactory; import net.sourceforge.jnlp.JNLPFile; public class UrlUtils { private static final String UTF8 = "utf-8"; public static URL normalizeUrlAndStripParams(URL url, boolean encodeFileUrls) { if (url == null) { return null; } try { String[] urlParts = url.toString().split("\\?"); URL strippedUrl = new URL(urlParts[0]); return normalizeUrl(strippedUrl, encodeFileUrls); } catch (IOException | URISyntaxException e) { OutputController.getLogger().log(e); } return url; } public static URL normalizeUrlAndStripParams(URL url) { return normalizeUrlAndStripParams(url, false); } public static boolean isLocalFile(URL url) { if (url.getProtocol().equals("file") && (url.getAuthority() == null || url.getAuthority().equals("")) && (url.getHost() == null || url.getHost().equals(("")))) { return true; } return false; } /* Decode a percent-encoded URL. Catch checked exceptions and log. */ public static URL decodeUrlQuietly(URL url) { try { return new URL(URLDecoder.decode(url.toString(), UTF8)); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); return url; } } /* Use the URI syntax check of 'toURI' to see if it matches RFC2396. * See http://www.ietf.org/rfc/rfc2396.txt */ public static boolean isValidRFC2396Url(URL url) { try { url.toURI(); return true; } catch (URISyntaxException e) { return false; } } /* Ensure a URL is properly percent-encoded. * Certain usages require local-file URLs to be encoded, eg for code-base & document-base. */ public static URL normalizeUrl(URL url, boolean encodeFileUrls) throws MalformedURLException, UnsupportedEncodingException, URISyntaxException { if (url == null) { return null; } String protocol = url.getProtocol(); boolean shouldEncode = (encodeFileUrls || !"file".equals(protocol)); // PR1465: We should not call 'URLDecoder.decode' on RFC2396-compliant URLs if (protocol == null || !shouldEncode || url.getPath() == null || isValidRFC2396Url(url)) { return url; } //Decode the URL before encoding URL decodedURL = new URL(URLDecoder.decode(url.toString(), UTF8)); //Create URI with the decoded URL URI uri = new URI(decodedURL.getProtocol(), null, decodedURL.getHost(), decodedURL.getPort(), decodedURL.getPath(), decodedURL.getQuery(), null); //Returns the encoded URL URL encodedURL = new URL(uri.toASCIIString()); return encodedURL; } /* Ensure a URL is properly percent-encoded. Does not encode local-file URLs. */ public static URL normalizeUrl(URL url) throws MalformedURLException, UnsupportedEncodingException, URISyntaxException { return normalizeUrl(url, false); } /* Ensure a URL is properly percent-encoded. Catch checked exceptions and log. */ public static URL normalizeUrlQuietly(URL url, boolean encodeFileUrls) { try { return normalizeUrl(url, encodeFileUrls); } catch (MalformedURLException | UnsupportedEncodingException | URISyntaxException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } return url; } /* Ensure a URL is properly percent-encoded. Catch checked exceptions and log. */ public static URL normalizeUrlQuietly(URL url) { return normalizeUrlQuietly(url, false); } /* Decode a URL as a file, being tolerant of URLs with mixed encoded & decoded portions. */ public static File decodeUrlAsFile(URL url) { return new File(decodeUrlQuietly(url).getFile()); } /** * This function i striping part behind last path delimiter. * * Expected is input like protcol://som.url/some/path/file.suff Then output * will bee protcol://som.url/some/path * * Be aware of input like protcol://som.url/some/path/ then input will be * just protcol://som.url/some/path * * You can use sanitizeLastSlash and see also unittests Both unix and * windows salshes are supported * * @param src src to be stripped * @return src without file */ public static URL removeFileName(final URL src) { if (src == null) { return src; } URL nsrc = normalizeUrlAndStripParams(src); String s = nsrc.getPath(); int i1 = s.lastIndexOf("/"); int i2 = s.lastIndexOf("\\"); int i = Math.max(i1, i2); if (i < 0) { return src; } s = s.substring(0, i); try { return sanitizeLastSlash(new URL(src.getProtocol(), src.getHost(), src.getPort(), s)); } catch (MalformedURLException ex) { OutputController.getLogger().log(ex); return nsrc; } } /** * Small utility function creating li list from collection of urls * * @param remoteUrls list of urls * @return String containing html item list of those urls */ public static String setOfUrlsToHtmlList(Iterable remoteUrls) { if (remoteUrls == null) { return ""; } StringBuilder sb = new StringBuilder(); sb.append("
      "); for (URL url : remoteUrls) { sb.append("
    • ").append(url.toExternalForm()).append("
    • "); } sb.append("
    "); return sb.toString(); } /** * This function is removing all tailing slashes of url and both unix and * windows salshes are supported. See tests for valid and invalid * inputs/outputs Shortly protcol://som.url/some/path/ or * protcol://som.url/some/path//// (and same for windows * protcol://som.url/some\path\\) will become protcol://som.url/some/path * Even protcol://som.url/ is reduced to protcol://som.url * * * When input is like * * @param in url t be sanitized * @return url without trailing slash (if any) * @throws MalformedURLException if original url was wrong */ public static URL sanitizeLastSlash(URL in) throws MalformedURLException { if (in == null) { return null; } String s = sanitizeLastSlash(in.toExternalForm()); return new URL(s); } public static String sanitizeLastSlash(final String in) { if (in == null) { return null; } String s = in; while (s.endsWith("/") || s.endsWith("\\")) { s = s.substring(0, s.length() - 1); } return s; } /** * both urls are processed by sanitizeLastSlash before actual equals. So * protcol://som.url/some/path/ is same as protcol://som.url/some/path. Even * protcol://som.url/some/path\ is same as protcol://som.url/some/path/ * * @param u1 first url to comapre * @param u2 second * @return true if urls are equals no matter of trailing slash */ public static boolean equalsIgnoreLastSlash(URL u1, URL u2) { try { if (u1 == null && u2 == null) { return true; } if (u1 == null && u2 != null) { return false; } if (u1 != null && u2 == null) { return false; } return sanitizeLastSlash(u1).equals(sanitizeLastSlash(u2)); } catch (MalformedURLException ex) { throw new RuntimeException(ex); } } public static URL guessCodeBase(JNLPFile file) { if (file.getCodeBase() != null) { return file.getCodeBase(); } else { //Fixme: codebase should be the codebase of the Main Jar not //the location. Although, it still works in the current state. return file.getResources().getMainJAR().getLocation(); } } /** * Compares a URL using string compareNullableStrings of its protocol, host, * port, path, query, and anchor. This method avoids the host name lookup * that URL.equals does for http: protocol URLs. It may not return the same * value as the URL.equals method (different hostnames that resolve to the * same IP address, ie sourceforge.net and www.sourceforge.net). * * @param u1 first url to compareNullableStrings * @param u2 second url to compareNullableStrings * @return whether the u1 and u2 points to same resource or not */ public static boolean urlEquals(URL u1, URL u2) { if (u1 == u2) { return true; } if (u1 == null || u2 == null) { return false; } if (notNullUrlEquals(u1, u2)) { return true; } try { URL nu1 = UrlUtils.normalizeUrl(u1); URL nu2 = UrlUtils.normalizeUrl(u2); if (notNullUrlEquals(nu1, nu2)) { return true; } } catch (Exception ex) { OutputController.getLogger().log(ex); } return false; } static boolean notNullUrlEquals(URL u1, URL u2) { return compareNullableStrings(u1.getProtocol(), u2.getProtocol(), true) && compareNullableStrings(u1.getHost(), u2.getHost(), true) && compareNullableStrings(u1.getPath(), u2.getPath(), false) && compareNullableStrings(u1.getQuery(), u2.getQuery(), false) && compareNullableStrings(u1.getRef(), u2.getRef(), false); // && u1.getPort() == u2.getPort(); errornous? } /** * Compare strings that can be {@code null}. * * @param s1 first string to compareNullableStrings with s2 * @param s2 second string to compareNullableStrings with s1 * @param ignore switch to ignore case */ static boolean compareNullableStrings(String s1, String s2, boolean ignore) { //this check is need to evaluate two nulls correctly if (s1 == s2) { return true; } if (s1 == null || s2 == null) { return false; } if (ignore) { return s1.equalsIgnoreCase(s2); } else { return s1.equals(s2); } } public static int getSanitizedPort(final URL u) { if (u.getPort() < 0) { return u.getDefaultPort(); } return u.getPort(); } public static int getPort(final URL url) { return getSanitizedPort(url); } public static String getHostAndPort(final URL url) { return url.getHost() + ":" + getSanitizedPort(url); } public static URL ensureSlashTail(URL u) { if (u == null) { return null; } String s = ensureSlashTail(u.toExternalForm()); try { return new URL(s); } catch (MalformedURLException ex) { OutputController.getLogger().log(ex); return u; } } public static String ensureSlashTail(String s) { if (s.endsWith("/")) { return s; } if (s.endsWith("\\")) { return s; } if (s.contains("/")) { return s + "/"; } if (s.contains("\\")) { return s + "\\"; } return s + "/"; } public static String stripFile(URL documentbase) { //whenused in generation of regec, the trailing slash is very important //see the result between http:/some.url/path.* and http:/some.url/path/.* return UrlUtils.ensureSlashTail(stripFileImp(documentbase)); } private static String stripFileImp(URL documentbase) { try { String normalized = UrlUtils.normalizeUrlAndStripParams(documentbase).toExternalForm().trim(); if (normalized.endsWith("/") || normalized.endsWith("\\")) { return normalized; } URL middleway = new URL(normalized); String file = middleway.getFile(); int i = Math.max(file.lastIndexOf('/'), file.lastIndexOf('\\')); if (i < 0) { return normalized; } String parent = file.substring(0, i + 1); String stripped = normalized.replace(file, parent); return stripped; } catch (Exception ex) { OutputController.getLogger().log(ex); return documentbase.toExternalForm(); } } public static String loadUrl(URL url) throws IOException { return loadUrl(url, StandardCharsets.UTF_8); } public static String loadUrl(URL url, Charset ch) throws IOException { StringBuilder all = new StringBuilder(); int tries = 0; InputStream is = null; while (true) { URLConnection connection = url.openConnection(); //from time to time we get //java.io.IOException: Invalid Http response, which kleads to null is //maybe this is happening onloy with test server, but trying few more times should not harm tries++; try { is = connection.getInputStream(); } catch (IOException ioe) { OutputController.getLogger().log(ioe); if (connection instanceof HttpURLConnection) { HttpURLConnection httpConn = (HttpURLConnection) connection; int statusCode = httpConn.getResponseCode(); if (statusCode != 200) { is = httpConn.getErrorStream(); } } } if (tries > 6) { throw new IOException("Failed " + url + " on " + tries + " attempts"); } if (is != null) { break; } else { try { Thread.sleep(100); } catch (InterruptedException e) { } } } try (BufferedReader br = new BufferedReader(new InputStreamReader(is, ch))) { while (true) { String line = br.readLine(); if (line == null) { break; } all.append(line).append("\n"); } } return all.toString(); } private static byte[] getRemainingBytes(InputStream is) throws IOException { byte[] buf = new byte[2048]; ByteArrayOutputStream bos = new ByteArrayOutputStream(); int len; while ((len = is.read(buf)) != -1) { bos.write(buf, 0, len); } bos.close(); return bos.toByteArray(); } public static Object[] loadUrlWithInvalidHeaderBytes(URL url) throws IOException { try (Socket s = UrlUtils.createSocketFromUrl(url)) { writeRequest(s.getOutputStream(), url); //StringBuilder do not have endsWith method. Check on that are more expensive then recreations String head = new String(); byte[] body = new byte[0]; //we cant use bufferedreader, otherwise buffer consume also part of body try (InputStream is = s.getInputStream()) { while (true) { int readChar = is.read(); if (readChar < 0) { break; } head = head + ((char) readChar); if (head.endsWith("\n\n") || head.endsWith("\r\n\r\n") || head.endsWith("\n\r\n\r") || head.endsWith("\r\r")) { body = getRemainingBytes(is); } } } return new Object[]{head, body}; } } public static String[] loadUrlWithInvalidHeader(URL url) throws IOException { return loadUrlWithInvalidHeader(url, StandardCharsets.US_ASCII); } public static String[] loadUrlWithInvalidHeader(URL url, Charset ch) throws IOException { try (Socket s = UrlUtils.createSocketFromUrl(url)) { writeRequest(s.getOutputStream(), url); StringBuilder all = new StringBuilder(); StringBuilder head = new StringBuilder(); StringBuilder body = new StringBuilder(); try (BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), ch))) { StringBuilder second = head; while (true) { String line = br.readLine(); if (line == null) { break; } all.append(line).append("\n"); if (line.isEmpty()) { second = body; } else { second.append(line).append("\n"); } } } return new String[]{all.toString(), head.toString(), body.toString()}; } } private static void writeRequest(final OutputStream s, URL url) throws IOException { Writer w = new OutputStreamWriter(s, StandardCharsets.US_ASCII); String file = url.getFile(); if (file.isEmpty()) { file = "/"; } w.write("GET " + file + " HTTP/1.0\r\n"); w.write("Host: " + url.getHost() + "\r\n"); w.write("User-Agent: javaws (icedtea-web)\r\n"); w.write("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"); w.write("Referer: " + url.toExternalForm() + "\r\n"); w.write("\r\n"); w.flush(); } private static Socket createSocketFromUrl(URL url) throws IOException { int p = url.getPort(); if (p < 0) { p = url.getDefaultPort(); } Socket s; if (url.getProtocol().equals("https")) { s = SSLSocketFactory.getDefault().createSocket(url.getHost(), p); } else { s = new Socket(url.getHost(), p); } return s; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/ImageResources.java0000644000000000000000000000013113441742745025011 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/ImageResources.java0000644000175000002070000000670713441742745025634 0ustar00jvanekmock00000000000000/* ImageResources.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import net.sourceforge.jnlp.util.logging.OutputController; import java.awt.Image; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.imageio.ImageIO; public enum ImageResources { INSTANCE; private static final String APPLICATION_ICON_PATH = "net/sourceforge/jnlp/resources/netx-icon.png"; private final Map cache = new HashMap<>(); private ImageResources() {} /* this is for testing ONLY */ void clearCache() { cache.clear(); } /** * Returns an appropriate image, or null if there are errors loading the image. */ private Image getApplicationImage() { if (cache.containsKey(APPLICATION_ICON_PATH)) { return cache.get(APPLICATION_ICON_PATH); } ClassLoader cl = this.getClass().getClassLoader(); if (cl == null) { cl = ClassLoader.getSystemClassLoader(); } InputStream in = cl.getResourceAsStream(APPLICATION_ICON_PATH); if (in != null) { try { Image image = ImageIO.read(in); cache.put(APPLICATION_ICON_PATH, image); return image; } catch (IOException ioe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ioe); } } return null; } /** * @return an appropriate image, or null if there are errors loading the image. */ public List getApplicationImages() { List images = new ArrayList<>(); Image appImage = getApplicationImage(); if (appImage != null) { images.add(appImage); } return images; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/StreamUtils.java0000644000000000000000000000012713441742745024355 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/StreamUtils.java0000644000175000002070000001145013441742745025162 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import net.sourceforge.jnlp.util.logging.OutputController; import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; public class StreamUtils { /** * Closes a stream, without throwing IOException. * In IOException is properly logged and consumed * * @param stream the stream that will be closed */ public static void closeSilently(Closeable stream) { if (stream != null) { try { stream.close(); } catch (IOException e) { OutputController.getLogger().log(e); } } } /** * Copy an input stream's contents into an output stream. * @param input input stream * @param output stream where to copy input * @throws java.io.IOException if IO fails */ public static void copyStream(InputStream input, OutputStream output) throws IOException { byte[] buffer = new byte[1024]; while (true) { int bytesRead = input.read(buffer); if (bytesRead == -1) { break; } output.write(buffer, 0, bytesRead); } } public static String readStreamAsString(InputStream stream) throws IOException { return readStreamAsString(stream, false); } public static String readStreamAsString(InputStream stream, String encoding) throws IOException { return readStreamAsString(stream, false, encoding); } public static String readStreamAsString(InputStream stream, boolean includeEndOfLines) throws IOException { return readStreamAsString(stream, includeEndOfLines, "UTF-8"); } public static String readStreamAsString(InputStream stream, boolean includeEndOfLines, String encoding) throws IOException { InputStreamReader is = new InputStreamReader(stream, encoding); StringBuilder sb = new StringBuilder(); BufferedReader br = new BufferedReader(is); while (true) { String read = br.readLine(); if (read == null) { break; } sb.append(read); if (includeEndOfLines){ sb.append('\n'); } } return sb.toString(); } /** * This should be workaround for https://en.wikipedia.org/wiki/Spurious_wakeup which real can happen in case of processes. * See http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2015-June/032350.html thread * @param p process to be waited for */ public static void waitForSafely(Process p) { boolean pTerminated = false; while (!pTerminated) { try { p.waitFor(); } catch (InterruptedException e) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, e); } try { p.exitValue(); pTerminated = true; } catch (IllegalThreadStateException e) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, e); } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/GenericDesktopEntry.java0000644000000000000000000000013113441742745026024 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/GenericDesktopEntry.java0000644000175000002070000000335613441742745026644 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.util; import java.io.File; import java.io.IOException; import net.sourceforge.jnlp.security.dialogresults.AccessWarningPaneComplexReturn; /** * * Thsi is very wierd interface, as two implementing classes have empty * intersection. The interface exists only because windows implementation depnds * on mslink.jar, and thus is optional. todo. unify the X and win * implementations so this interface have sense */ public interface GenericDesktopEntry { //linux public void createDesktopShortcuts(AccessWarningPaneComplexReturn.ShortcutResult menu, AccessWarningPaneComplexReturn.ShortcutResult desktop, boolean isSigned); public void refreshExistingShortcuts(boolean desktop, boolean menu); public File getGeneratedJnlpFileName(); public File getLinuxMenuIconFile(); //windows public void createShortcutOnWindowsDesktop() throws IOException; public void createWindowsMenu() throws IOException; //shared! public String getDesktopIconFileName(); public File getDesktopIconFile(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/PropertiesFile.java0000644000000000000000000000013113441742745025030 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PropertiesFile.java0000644000175000002070000001457013441742745025650 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import net.sourceforge.jnlp.util.lockingfile.LockedFile; import net.sourceforge.jnlp.util.logging.OutputController; /** * A properties object backed by a specified file without throwing * exceptions. The properties are automatically loaded from the * file when the first property is requested, but the save method * must be called before changes are saved to the file. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.4 $ */ public class PropertiesFile extends Properties { /** the file to save to */ LockedFile lockedFile; /** the header string */ String header = "netx file"; /** time of last modification, lazy loaded on getProperty */ long lastStore; /** * Create a properties object backed by the specified file. * * @param file the file to save and load to */ public PropertiesFile(File file) { this.lockedFile = LockedFile.getInstance(file); } /** * Create a properties object backed by the specified file. * * @param file the file to save and load to * @param header the file header */ public PropertiesFile(File file, String header) { this.lockedFile = LockedFile.getInstance(file); this.header = header; } /** * @return the value of the specified key, or null if the key * does not exist. */ @Override public String getProperty(String key) { if (lastStore == 0) load(); return super.getProperty(key); } /** * @return the value of the specified key, or the default value * if the key does not exist. */ @Override public String getProperty(String key, String defaultValue) { if (lastStore == 0) load(); return super.getProperty(key, defaultValue); } /** * Sets the value for the specified key. * * @return the previous value */ @Override public Object setProperty(String key, String value) { if (lastStore == 0) load(); return super.setProperty(key, value); } /** * @return the file backing this properties object. */ public File getStoreFile() { return lockedFile.getFile(); } /** * Ensures that the file backing these properties has been * loaded; call this method before calling any method defined by * a superclass. * * @return true, if file was (re-)loaded * false, if file was still current */ public boolean load() { File file = lockedFile.getFile(); if (!file.exists()) { return false; } long currentStore = file.lastModified(); long currentTime = System.currentTimeMillis(); /* (re)load file, if * - it wasn't loaded/stored, yet (lastStore == 0) * - current file modification timestamp has changed since last store (currentStore != lastStore) OR * - current file modification timestamp has not changed since last store AND current system time equals current file modification timestamp * This is necessary because some filesystems seems only to provide accuracy of the timestamp on the level of seconds! */ if(lastStore == 0 || currentStore != lastStore || (currentStore == lastStore && currentStore / 1000 == currentTime / 1000)) { InputStream s = null; try { try { s = new FileInputStream(file); load(s); } finally { if (s != null) { s.close(); lastStore=currentStore; return true; } } } catch (IOException ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } } return false; } /** * Saves the properties to the file. */ public void store() { File file = lockedFile.getFile(); FileOutputStream s = null; try { try { file.getParentFile().mkdirs(); s = new FileOutputStream(file); store(s, header); // fsync() s.getChannel().force(true); lastStore = file.lastModified(); } finally { if (s != null) s.close(); } } catch (IOException ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } } public void lock() { try { lockedFile.lock(); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } public boolean tryLock() { try { return lockedFile.tryLock(); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } return false; } /** * Unlocks the file. Does not do anything if not holding the lock. */ public void unlock() { try { lockedFile.unlock(); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } public boolean isHeldByCurrentThread() { return lockedFile.isHeldByCurrentThread(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/ClasspathMatcher.java0000644000000000000000000000013113441742745025322 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/ClasspathMatcher.java0000644000175000002070000002764113441742745026145 0ustar00jvanekmock00000000000000// Copyright (C) 2013 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.util; import java.net.URL; import java.util.ArrayList; import java.util.regex.Pattern; public class ClasspathMatcher { public static class ClasspathMatchers { private final ArrayList matchers; private final boolean includePath; ArrayList getMatchers() { return matchers; } /** * space separated list of ClasspathMatcher source strings * * @param s string to be read * @return returns compiled matcher */ public static ClasspathMatchers compile(String s) { return compile(s, false); } public static ClasspathMatchers compile(String s, boolean includePath) { if (s == null) { return new ClasspathMatchers(new ArrayList(0), includePath); } String[] splitted = s.trim().split("\\s+"); ArrayList matchers = new ArrayList<>(splitted.length); for (String string : splitted) { matchers.add(ClasspathMatcher.compile(string.trim())); } return new ClasspathMatchers(matchers, includePath); } public ClasspathMatchers(ArrayList matchers, boolean includePath) { this.matchers = matchers; this.includePath = includePath; } public boolean matches(URL s) { return or(s); } private boolean or(URL s) { for (ClasspathMatcher classpathMatcher : matchers) { if (classpathMatcher.match(s, includePath)) { return true; } } return false; } private boolean and(URL s) { for (ClasspathMatcher classpathMatcher : matchers) { if (!classpathMatcher.match(s, includePath)) { return false; } } return true; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (ClasspathMatcher classpathMatcher : matchers) { sb.append(classpathMatcher.toString()).append(" "); } return sb.toString(); } } public static final String PROTOCOL_DELIMITER = "://"; public static final String PATH_DELIMITER = "/"; public static final String PORT_DELIMITER = ":"; private final String source; private Parts parts; static class Parts { String protocol; String domain; String port; String path; Pattern protocolRegEx; Pattern domainRegEx; Pattern portRegEx; Pattern pathRegEx; @Override public String toString() { return protocol + PROTOCOL_DELIMITER + domain + PORT_DELIMITER + port + PATH_DELIMITER + path; } public void compilePartsToPatterns() { protocolRegEx = ClasspathMatcher.sourceToRegEx(protocol); //the http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#codebase //clearly says: *.example.com matches both //https://example.com, http://example.com //it sounds like bug, but well, who am I... domainRegEx = domainToRegEx(domain); portRegEx = ClasspathMatcher.sourceToRegEx(port); pathRegEx = ClasspathMatcher.sourceToRegEx(path); } private boolean matchDomain(String source) { return generalMatch(source, domainRegEx); } private boolean matchProtocol(String source) { return generalMatch(source, protocolRegEx); } private boolean matchPath(String source) { if (source.startsWith(PATH_DELIMITER)) { source = source.substring(1); } return generalMatch(source, pathRegEx); } private boolean matchPort(int port) { return generalMatch(Integer.toString(port), portRegEx); } private static boolean generalMatch(String input, Pattern pattern) { return pattern.matcher(input).matches(); } private static Pattern domainToRegEx(String domain) { String pre = ""; String post = ""; if (domain.startsWith("*.")) { //this is handling case, when *.abc.xy //should match also abc.xy except whatever.abc.xz //but NOT whatewerabc.xy pre = "(" + convertWildcardToRegEx(domain.substring(2)) + ")|("; post = ")"; } return Pattern.compile(pre + ClasspathMatcher.sourceToRegExString(domain) + post); } } /** * http://www.w3.org/Addressing/URL/url-spec.txt */ private ClasspathMatcher(String source) { this.source = source; } Parts getParts() { return parts; } @Override public String toString() { return source; } public static ClasspathMatcher compile(String source) { ClasspathMatcher r = new ClasspathMatcher(source); r.parts = splitToParts(source); r.parts.compilePartsToPatterns(); return r; } private boolean match(URL url, boolean includePath) { String protocol = url.getProtocol(); int port = url.getPort(); //negative if not set String domain = url.getHost(); String path = url.getPath(); boolean always = parts.matchPort(port) && parts.matchProtocol(protocol) && parts.matchDomain(domain); if (includePath) { return always && (parts.matchPath(UrlUtils.sanitizeLastSlash(path)) || parts.matchPath(path)); } else { return always; } } /* * For testing purposes */ public boolean match(URL url) { return match(url, false); } public boolean matchWithPath(URL url) { return match(url, true); } public boolean matchWithoutPath(URL url) { return match(url, false); } static boolean hasProtocol(final String source) { int indexOfProtocolMark = source.indexOf(PROTOCOL_DELIMITER); if (indexOfProtocolMark < 0) { return false; } /* * Here is small trap * We do not know, if protocol is specifed * if so, the protocol://blah.blah/blah is already recognized * but we must ensure that we have not found eg: * blah.blah/blah://in/path - which is perfectly valid url... */ //the most easy part - dot in url int indexofFirstDot = source.indexOf("."); if (indexofFirstDot >= 0) { return indexOfProtocolMark < indexofFirstDot; } //more nasty part - path specified String degradedProtocol = source.replace(PROTOCOL_DELIMITER, "%%%"); int indexofFirstPath = degradedProtocol.indexOf(PATH_DELIMITER); if (indexofFirstPath >= 0) { return indexOfProtocolMark < indexofFirstPath; } //no path? no dot? it must be it! return true; } private static String[] extractProtocolImpl(String source) { //we must know it have protocoll; return splitOnFirst(source, PROTOCOL_DELIMITER); } static String extractProtocol(String source) { //we must know it have protocoll; return extractProtocolImpl(source)[0]; } static String removeProtocol(String source) { //we must know it have protocoll; return extractProtocolImpl(source)[1]; } static boolean hasPath(String source) { //protocol free source return source.contains(PATH_DELIMITER); } private static String[] extractPathImpl(String source) { //protocol free source return splitOnFirst(source, PATH_DELIMITER); } static String extractPath(String source) { //protocol free source return extractPathImpl(source)[1]; } static String removePath(String source) { //protocol free source return extractPathImpl(source)[0]; } static boolean hasPort(String source) { //protocol and path free source return source.contains(PORT_DELIMITER); } private static String[] extractPortImpl(String source) { //protocol and path free source return splitOnFirst(source, PORT_DELIMITER); } static String extractPort(String source) { //protocol and path free source return extractPortImpl(source)[1]; } static String removePort(String source) { //protocol and path free source return extractPortImpl(source)[0]; } public static String[] splitOnFirst(final String source, final String delimiter) { String s1 = source.substring(0, source.indexOf(delimiter)); String s2 = source.substring(source.indexOf(delimiter) + delimiter.length()); return new String[]{s1, s2}; } public static String sourceToRegExString(String s) { //http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#codebase if (s.equals("*")) { return ".*"; } return convertWildcardToRegEx(s); } private static String convertWildcardToRegEx(String s) { if (s.startsWith("*") && s.endsWith("*")) { return "^.*" + Pattern.quote(s.substring(1, s.length() - 1)) + ".*$"; } else if (s.endsWith("*")) { return "^" + Pattern.quote(s.substring(0, s.length() - 1)) + ".*$"; } else if (s.startsWith("*")) { return "^.*" + Pattern.quote(s.substring(1)) + "$"; } else { return "^" + Pattern.quote(s) + "$"; } } public static Pattern sourceToRegEx(String s) { return Pattern.compile(sourceToRegExString(s)); } static Parts splitToParts(String source) { Parts parts = new Parts(); String urlWithoutprotocol = source; boolean haveProtocol = hasProtocol(source); if (haveProtocol) { parts.protocol = extractProtocol(source); urlWithoutprotocol = removeProtocol(source); } else { parts.protocol = "*"; } boolean havePath = hasPath(urlWithoutprotocol); String remianedUrl = urlWithoutprotocol; if (havePath) { parts.path = extractPath(urlWithoutprotocol); remianedUrl = removePath(urlWithoutprotocol); } else { parts.path = "*"; } //case for url like "some.url/" if (parts.path.length() == 0) { //behaving like it do not exists parts.path = "*"; } boolean havePort = hasPort(remianedUrl); String domain = remianedUrl; if (havePort) { parts.port = extractPort(remianedUrl); domain = removePort(remianedUrl); } else { parts.port = "*"; } //case for port like "some.url:" if (parts.port.length() == 0) { //behaving like it do not exists parts.port = "*"; } parts.domain = domain; return parts; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/WindowsDesktopEntry.java0000644000000000000000000000013113441742745026102 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/WindowsDesktopEntry.java0000644000175000002070000001452013441742745026715 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.util; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.util.Iterator; import java.util.List; import mslinks.ShellLink; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.cache.CacheLRUWrapper; import net.sourceforge.jnlp.security.dialogresults.AccessWarningPaneComplexReturn; import net.sourceforge.jnlp.util.logging.OutputController; /** * Based on https://github.com/DmitriiShamrikov/mslinkshttps://github.com/DmitriiShamrikov/mslinks */ public class WindowsDesktopEntry implements GenericDesktopEntry { private final JNLPFile file; public WindowsDesktopEntry(JNLPFile file) { this.file = file; } @Override public String getDesktopIconFileName() { return XDesktopEntry.getDesktopIconName(file) + ".lnk"; } private String getDesktopLnkPath() { return System.getenv("userprofile") + "/Desktop/" + getDesktopIconFileName(); } @Override public File getDesktopIconFile() { return new File(getDesktopLnkPath()); } @Override public void createShortcutOnWindowsDesktop() throws IOException { String path = getDesktopLnkPath(); String JavaWsBin = XDesktopEntry.getJavaWsBin(); String favIcon = getFavIcon(); ShellLink sl = ShellLink.createLink(JavaWsBin).setCMDArgs(file.getSourceLocation().toString()); if (favIcon != null) { favIcon = favIcon.substring(6); sl.setIconLocation(favIcon); } sl.saveTo(path); // write shortcut path to list manageShortcutList(ManageMode.A, path); } @Override public void createWindowsMenu() throws IOException { // create menu item // see if menu is defined in jnlp, else don't do it String path = file.getInformation().getShortcut().getMenu().getSubMenu(); if (path != null) { path = System.getenv("userprofile") + "/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/" + path; // check to see if menu dir exists and create if not File menuDir = new File(path); if (!menuDir.exists()) { menuDir.mkdir(); } String JavaWsBin = XDesktopEntry.getJavaWsBin(); String favIcon = getFavIcon(); ShellLink sl = ShellLink.createLink(JavaWsBin).setCMDArgs(file.getSourceLocation().toString()); // setup uninstall shortcut ShellLink ul = ShellLink.createLink(JavaWsBin).setCMDArgs("-Xclearcache " + file.getFileLocation().toString()); if (favIcon != null) { favIcon = favIcon.substring(6); sl.setIconLocation(favIcon); ul.setIconLocation(favIcon); } sl.saveTo(path + "/" + file.getInformation().getTitle()+ ".lnk"); ul.saveTo(path + "/Uninstall " + file.getInformation().getTitle() + ".lnk"); // write shortcuts to list manageShortcutList(ManageMode.A, path + "/" + file.getInformation().getTitle() + ".lnk"); manageShortcutList(ManageMode.A, path + "/Uninstall " + file.getInformation().getTitle() + ".lnk"); } } private void manageShortcutList(ManageMode mode, String path) throws IOException { if (!CacheLRUWrapper.getInstance().getWindowsShortcutList().exists()) { CacheLRUWrapper.getInstance().getWindowsShortcutList().createNewFile(); } if (ManageMode.A == mode) { List lines = Files.readAllLines(CacheLRUWrapper.getInstance().getWindowsShortcutList().toPath(), Charset.forName("UTF-8")); Iterator it = lines.iterator(); String sItem = ""; String sPath; Boolean fAdd = true; // check to see if line exists, if not add it while (it.hasNext()) { sItem = it.next().toString(); String[] sArray = sItem.split(","); String application = sArray[0]; //?? sPath = sArray[1]; if (sPath.equalsIgnoreCase(path)) { // it exists don't add fAdd = false; break; } } if (fAdd) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Adding sCut to list = " + sItem); String scInfo = file.getFileLocation().toString() + ","; scInfo += path + "\r\n"; Files.write(CacheLRUWrapper.getInstance().getWindowsShortcutList().toPath(), scInfo.getBytes(), StandardOpenOption.APPEND); } } } private String getFavIcon() { return XDesktopEntry.getFavIcon(file); } @Override public void createDesktopShortcuts(AccessWarningPaneComplexReturn.ShortcutResult menu, AccessWarningPaneComplexReturn.ShortcutResult desktop, boolean isSigned) { throw new UnsupportedOperationException("not suported on windows like systems"); } @Override public void refreshExistingShortcuts(boolean desktop, boolean menu) { throw new UnsupportedOperationException("not suported on windows like systems"); } @Override public File getGeneratedJnlpFileName() { throw new UnsupportedOperationException("not suported on windows like systems"); } @Override public File getLinuxMenuIconFile() { throw new UnsupportedOperationException("not suported on windows like systems"); } private static enum ManageMode { //appned? A } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/JarFile.java0000644000000000000000000000013113441742745023410 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/JarFile.java0000644000175000002070000001274313441742745024230 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import net.sourceforge.jnlp.runtime.JNLPRuntime; /** * A wrapper over {@link java.util.jar.JarFile} that verifies zip headers to * protect against GIFAR attacks. * * @see Gifar */ public class JarFile extends java.util.jar.JarFile implements Closeable { public JarFile(String name) throws IOException { super(name); verifyZipHeader(new File(name)); } public JarFile(String name, boolean verify) throws IOException { super(name, verify); verifyZipHeader(new File(name)); } public JarFile(File file) throws IOException { super(file); verifyZipHeader(file); } public JarFile(File file, boolean verify) throws IOException { super(file, verify); verifyZipHeader(file); } public JarFile(File file, boolean verify, int mode) throws IOException { super(file, verify, mode); verifyZipHeader(file); } /** * The ZIP specification requires that the zip header for all entries in a * zip-compressed archive must start with a well known "PK" which is * defined as hex x50 x4b x03 x04. *

    * Note - this is not file-header, it is item-header. *

    * Actually most of compressing formats have some n-bytes headers. Eg: * http://www.gzip.org/zlib/rfc-gzip.html#header-trailer for ID1 and ID2 so * in case that some differently compressed jars will come to play, this is * the place where to fix it. * * @see ZIP Specification */ private static final byte[] ZIP_ENTRY_HEADER_SIGNATURE = new byte[] {0x50, 0x4b, 0x03, 0x04}; /** * Verify the header for the zip entry. *

    * Although zip specification allows to skip all corrupted entries, it is * not safe for jars since it allows a different format to fake itself as * a Jar. */ private void verifyZipHeader(File file) throws IOException { if (!JNLPRuntime.isIgnoreHeaders()) { InputStream s = new FileInputStream(file); /* * Theoretically, a valid ZIP file can begin with anything. We * ensure it begins with a valid entry header to confirm it only * contains zip entries. */ try { byte[] buffer = new byte[ZIP_ENTRY_HEADER_SIGNATURE.length]; /* * for case that new byte[] will accidently initialize same * sequence as zip header and during the read the buffer will not be filled */ for (int i = 0; i < buffer.length; i++) { buffer[i] = 0; } int toRead = ZIP_ENTRY_HEADER_SIGNATURE.length; int readSoFar = 0; int n = 0; /* * this is used instead of s.read(buffer) for case of block and * so returned not-fully-filled dbuffer */ while ((n = s.read(buffer, readSoFar, buffer.length - readSoFar)) != -1) { readSoFar += n; if (readSoFar == toRead) { break; } } for (int i = 0; i < buffer.length; i++) { if (buffer[i] != ZIP_ENTRY_HEADER_SIGNATURE[i]) { throw new InvalidJarHeaderException("Jar " + file.getName() + " do not heave valid header. You can skip this check by -Xignoreheaders"); } } } finally { s.close(); } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/lockingfile0000644000000000000000000000013113441742745023442 xustar0030 mtime=1552401893.048832804 30 atime=1552410887.113183443 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/lockingfile/0000755000175000002070000000000013441742745024330 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/util/lockingfile/PaxHeaders.7406/StorageIoException.java0000644000000000000000000000013113441742745030135 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/lockingfile/StorageIoException.java0000644000175000002070000000410013441742745030741 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.lockingfile; /** * Thrown when an exception occurs using the storage (namely IOException) */ public class StorageIoException extends RuntimeException { LockingReaderWriter outer; public StorageIoException(Exception e) { super(e); } public StorageIoException(String e) { super(e); } public StorageIoException(Exception e, LockingReaderWriter outer) { super(e); this.outer = outer; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/lockingfile/PaxHeaders.7406/LockingReaderWriter.java0000644000000000000000000000013113441742745030270 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/lockingfile/LockingReaderWriter.java0000644000175000002070000001317713441742745031112 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.lockingfile; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; /** * Process-locked string storage backed by a file. * Each string is stored on its own line. * Any new-lines must be encoded somehow if they are to be stored. */ public abstract class LockingReaderWriter { private LockedFile lockedFile; /** * Create locking file-backed storage. * @param file the storage file */ public LockingReaderWriter(File file) { this.lockedFile = LockedFile.getInstance(file); } /** * Get the underlying file. * Any access to this file should use lock() and unlock(). * * @return the file */ public File getBackingFile() { return this.lockedFile.getFile(); } public boolean isReadOnly() { return this.lockedFile.isReadOnly(); } /** * Lock the underlying storage. Lock is reentrant. */ public void lock() { try { lockedFile.lock(); } catch (IOException e) { throw new StorageIoException(e); } } /** * Unlock the underlying storage. Lock is reentrant. */ public void unlock() { try { lockedFile.unlock(); } catch (IOException e) { throw new StorageIoException(e); } } /** * Writes stored contents to file. Assumes lock is held. * @throws IOException */ protected void writeContents() throws IOException { if (!getBackingFile().isFile()){ return; } if (isReadOnly()){ return; } BufferedWriter writer = null; try { writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(getBackingFile()), "UTF-8")); writeContent(writer); writer.flush(); } finally { if (writer != null) { writer.close(); } } } protected abstract void writeContent(BufferedWriter writer) throws IOException; /** * Reads contents from file. Assumes lock is held. * @throws IOException */ protected void readContents() throws IOException { if (!getBackingFile().isFile()){ return; } BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader( new FileInputStream(getBackingFile()), "UTF-8")); while (true) { String line = reader.readLine(); if (line == null) { break; } readLine(line); } } finally { if (reader != null) { reader.close(); } } } /** * Reads contents from the file, first acquring a lock. * @throws IOException */ protected synchronized void readContentsLocked() throws IOException { doLocked(new Runnable() { @Override public void run() { try { readContents(); } catch (IOException ex) { throw new StorageIoException(ex); } } }); } /** * Write contents to the file, first acquring a lock. * @throws IOException */ protected synchronized void writeContentsLocked() throws IOException { doLocked(new Runnable() { public void run() { try { writeContents(); } catch (IOException ex) { throw new StorageIoException(ex); } } }); } protected void doLocked(Runnable r) { lock(); try { r.run(); } finally { unlock(); } } protected abstract void readLine(String line); } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/lockingfile/PaxHeaders.7406/LockedFile.java0000644000000000000000000000013113441742745026363 xustar0030 mtime=1552401893.047832806 30 atime=1552402157.232253492 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/lockingfile/LockedFile.java0000644000175000002070000001545313441742745027204 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util.lockingfile; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.util.Map; import java.util.WeakHashMap; import java.util.concurrent.locks.ReentrantLock; import net.sourceforge.jnlp.runtime.JNLPRuntime; /* * Process & thread locked access to a file. Creates file if it does not already exist. */ public class LockedFile { // The file for access private RandomAccessFile randomAccessFile; private FileChannel fileChannel; private File file; // A file lock will protect against locks for multiple // processes, while a thread lock is still needed within a single JVM. private FileLock processLock = null; private ReentrantLock threadLock = new ReentrantLock(); private boolean readOnly; private LockedFile(File file) { this.file = file; try { //just try to create this.file.createNewFile(); } catch (Exception ex) { //intentionaly silent } if (!this.file.isFile() && file.getParentFile() != null && !file.getParentFile().canWrite()) { readOnly = true; } else { this.readOnly = !file.canWrite(); if (!readOnly && file.getParentFile() != null && !file.getParentFile().canWrite()) { readOnly = true; } } } public boolean isReadOnly() { return readOnly; } // Provide shared access to LockedFile's via weak map static private final Map instanceCache = new WeakHashMap(); /** * Get a LockedFile for a given File. Ensures that we share the same * instance for all threads * * @param file the file to lock * @return a LockedFile instance */ synchronized public static LockedFile getInstance(File file) { if (!instanceCache.containsKey(file)) { LockedFile l; if (JNLPRuntime.isWindows()) { l = new WindowsLockedFile(file); } else { l = new LockedFile(file); } instanceCache.put(file, l); } return instanceCache.get(file); } /** * Get the file being locked. * * @return the file */ public File getFile() { return file; } /** * Lock access to the file.Lock is reentrant. * @throws java.io.IOException */ public void lock() throws IOException { // Create if does not already exist, cannot lock non-existing file if (!isReadOnly()) { this.file.createNewFile(); } this.threadLock.lock(); lockProcess(); } public boolean tryLock() throws IOException { if (this.threadLock.tryLock()) { lockProcess(); return true; } else { return false; } } private void lockProcess() throws IOException { if (this.processLock != null) { return; } if (this.file.exists()) { this.randomAccessFile = new RandomAccessFile(this.file, isReadOnly() ? "r" : "rws"); this.fileChannel = randomAccessFile.getChannel(); if (!isReadOnly()){ this.processLock = this.fileChannel.lock(); } } } /** * Unlock access to the file.Lock is reentrant. Does not do anything if not holding the lock. * @throws java.io.IOException */ public void unlock() throws IOException { if (!this.threadLock.isHeldByCurrentThread()) { return; } boolean releaseProcessLock = (this.threadLock.getHoldCount() == 1); unlockImpl(releaseProcessLock); } protected void unlockImpl(boolean releaseProcessLock) throws IOException { try { if (releaseProcessLock) { if (this.processLock != null){ this.processLock.release(); } this.processLock = null; //necessary for read only file if (this.randomAccessFile != null){ this.randomAccessFile.close(); } //necessary for not existing parent direcotry if (this.fileChannel != null){ this.fileChannel.close(); } } } finally { this.threadLock.unlock(); } } public boolean isHeldByCurrentThread() { return this.threadLock.isHeldByCurrentThread(); } private static class WindowsLockedFile extends LockedFile { public WindowsLockedFile(File file) { super(file); } /*Comment why itis different*/ @Override public void lock() throws IOException { if (!isReadOnly()) { super.file.createNewFile(); } super.threadLock.lock(); } /*Comment why itis different*/ @Override public void unlock() throws IOException { if (!super.threadLock.isHeldByCurrentThread()) { return; } unlockImpl(false); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/TimedHashMap.java0000644000000000000000000000013113441742745024400 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.231253494 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/TimedHashMap.java0000644000175000002070000001566513441742745025226 0ustar00jvanekmock00000000000000/* TimedHashMap.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; import static java.util.Objects.requireNonNull; import net.sourceforge.jnlp.util.logging.OutputController; /** * Simple utility class that extends HashMap by adding an expiry to the entries. * * This map stores entries, and returns them only if the entries were last accessed within a specified timeout period. * Otherwise, null is returned. * * This map does not allow null keys but does allow null values. * * @param K The key type * @param V The Object type */ public class TimedHashMap implements Map { private static class TimedEntry { private final T value; private long timestamp; public TimedEntry(final T value) { this.value = value; updateTimestamp(); } public void updateTimestamp() { timestamp = System.nanoTime(); } } private static final long DEFAULT_TIMEOUT = TimeUnit.SECONDS.toNanos(10); private final HashMap> actualMap = new HashMap<>(); private long timeout = DEFAULT_TIMEOUT; public TimedHashMap() { this(DEFAULT_TIMEOUT, TimeUnit.NANOSECONDS); } /** * Create a new map with a non-default entry timeout period * @param unit the units of the timeout * @param timeout the length of the timeout */ public TimedHashMap(final long timeout, final TimeUnit unit) { setTimeout(timeout, unit); } /** * Specify how long (in nanoseconds) entries are valid for * @param unit the units of the timeout * @param timeout the length of the timeout */ public void setTimeout(final long timeout, final TimeUnit unit) { this.timeout = unit.toNanos(timeout); } /** * Store the item in the map and associate a timestamp with it. null is not accepted as a key. * * @param key The key * @param value The value to store */ @Override public V put(final K key, final V value) { requireNonNull(key); final TimedEntry oldEntry = actualMap.get(key); final V oldValue; if (oldEntry != null) { oldValue = oldEntry.value; } else { oldValue = null; } actualMap.put(key, new TimedEntry<>(value)); return oldValue; } /** * Return cached item if it has not already expired. * * Before returning, this method also resets the "last accessed" * time for this entry, so it is good for another 10 seconds * * @param key The key */ @Override public V get(final Object key) { final long now = System.nanoTime(); if (actualMap.containsKey(key)) { final TimedEntry timedEntry = actualMap.get(key); final long age = now - timedEntry.timestamp; // Item exists. If it has not expired, renew its access time and return it if (age <= timeout) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Returning entry " + actualMap.get(key) + " from cache for " + key); timedEntry.updateTimestamp(); return timedEntry.value; } else { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Cached entry for " + key + " has expired (age=" + (age * 1e-9) + " seconds)"); } } return null; } @Override public boolean containsKey(final Object key) { return actualMap.containsKey(key); } @Override public int size() { return actualMap.size(); } @Override public boolean isEmpty() { return actualMap.isEmpty(); } @Override public boolean containsValue(final Object value) { for (final TimedEntry entry : actualMap.values()) { if (Objects.equals(entry.value, value)) { return true; } } return false; } @Override public V remove(final Object key) { if (actualMap.containsKey(key)) { return actualMap.remove(key).value; } return null; } @Override public void putAll(Map m) { for (final Map.Entry entry : m.entrySet()) { actualMap.put(entry.getKey(), new TimedEntry(entry.getValue())); } } @Override public void clear() { actualMap.clear(); } @Override public Set keySet() { return new HashSet<>(actualMap.keySet()); } @Override public Collection values() { final Collection values = new ArrayList<>(actualMap.size()); for (final TimedEntry value : actualMap.values()) { values.add(value.value); } return values; } @Override public Set> entrySet() { final Map strippedMap = new HashMap<>(actualMap.size()); for (final Map.Entry> entry : actualMap.entrySet()) { strippedMap.put(entry.getKey(), entry.getValue().value); } return strippedMap.entrySet(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/util/PaxHeaders.7406/HttpUtils.java0000644000000000000000000000013013441742745024033 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.231253494 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/util/HttpUtils.java0000644000175000002070000000562113441742745024651 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.util; import net.sourceforge.jnlp.util.logging.OutputController; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; public class HttpUtils { /** * Ensure a HttpURLConnection is fully read, required for correct behavior. * Captured IOException is consumed and printed * @param c the connection to be closed silently */ public static void consumeAndCloseConnectionSilently(HttpURLConnection c) { try { consumeAndCloseConnection(c); } catch (IOException ex) { OutputController.getLogger().log("Following exception: '" + ex.getMessage() + "' should be harmless, but may help in finding root cause."); OutputController.getLogger().log(ex); } } /** * Ensure a HttpURLConnection is fully read, required for correct behavior * * @param c connection to be closed * @throws IOException if connection fade */ public static void consumeAndCloseConnection(HttpURLConnection c) throws IOException { try (InputStream in = c.getInputStream()) { byte[] throwAwayBuffer = new byte[256]; while (in.read(throwAwayBuffer) > 0) { /* ignore contents */ } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/tools0000644000000000000000000000013113441742745021337 xustar0030 mtime=1552401893.072832754 30 atime=1552410887.113183443 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/0000755000175000002070000000000013441742745022225 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/PaxHeaders.7406/JarCertVerifier.java0000644000000000000000000000013113441742745025305 xustar0030 mtime=1552401893.072832754 30 atime=1552402157.231253494 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java0000644000175000002070000005534613441742745026133 0ustar00jvanekmock00000000000000/* * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package net.sourceforge.jnlp.tools; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.security.CodeSigner; import java.security.KeyStore; import java.security.cert.CertPath; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Vector; import java.util.jar.JarEntry; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.cache.ResourceTracker; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.security.AppVerifier; import net.sourceforge.jnlp.security.CertVerifier; import net.sourceforge.jnlp.security.CertificateUtils; import net.sourceforge.jnlp.security.KeyStores; import net.sourceforge.jnlp.util.JarFile; import net.sourceforge.jnlp.util.logging.OutputController; import sun.security.util.DerInputStream; import sun.security.util.DerValue; import sun.security.x509.NetscapeCertTypeExtension; /** * The jar certificate verifier utility. * * @author Roland Schemers * @author Jan Luehe */ public class JarCertVerifier implements CertVerifier { private static final String META_INF = "META-INF/"; // prefix for new signature-related files in META-INF directory private static final String SIG_PREFIX = META_INF + "SIG-"; private static final long SIX_MONTHS = 180 * 24 * 60 * 60 * 1000L; // milliseconds static enum VerifyResult { UNSIGNED, SIGNED_OK, SIGNED_NOT_OK } /** All of the jar files that were verified for signing */ private final List verifiedJars = new ArrayList<>(); /** All of the jar files that were not verified */ private final List unverifiedJars = new ArrayList<>(); /** The certificates used for jar verification linked to their respective information */ private final Map certs = new HashMap<>(); /** Temporary cert path hack to be used to keep track of which one a UI dialog is using */ private CertPath currentlyUsed; /** Absolute location to jars and the number of entries which are possibly signable */ private final Map jarSignableEntries = new HashMap<>(); /** The application verifier to use by this instance */ private final AppVerifier appVerifier; /** * Create a new jar certificate verifier utility that uses the provided verifier for its strategy pattern. * * @param verifier * The application verifier to be used by the new instance. */ public JarCertVerifier(AppVerifier verifier) { appVerifier = verifier; } /** * @return true if there are no signable entries in the jar. * This will return false if any of verified jars have content more than just META-INF/. */ public boolean isTriviallySigned() { return getTotalJarEntries(jarSignableEntries) <= 0 && certs.size() <= 0; } @Override public boolean getAlreadyTrustPublisher() { boolean allPublishersTrusted = appVerifier.hasAlreadyTrustedPublisher( certs, jarSignableEntries); OutputController.getLogger().log("App already has trusted publisher: " + allPublishersTrusted); return allPublishersTrusted; } @Override public boolean getRootInCacerts() { boolean allRootCAsTrusted = appVerifier.hasRootInCacerts(certs, jarSignableEntries); OutputController.getLogger().log("App has trusted root CA: " + allRootCAsTrusted); return allRootCAsTrusted; } @Override public CertPath getCertPath(CertPath cPath) { // Parameter ignored. return currentlyUsed; } @Override public boolean hasSigningIssues(CertPath certPath) { return certs.get(certPath).hasSigningIssues(); } @Override public List getDetails(CertPath certPath) { if (certPath != null) { currentlyUsed = certPath; } return certs.get(currentlyUsed).getDetailsAsStrings(); } /** * Get a list of the cert paths of all signers across the app. * * @return List of CertPath vars representing each of the signers present on any jar. */ public List getCertsList() { return new ArrayList<>(certs.keySet()); } /** * Find the information the specified cert path has with respect to this application. * * @param cPath certificate to provide info * @return All the information the path has with this app. */ public CertInformation getCertInformation(CertPath cPath) { return certs.get(cPath); } /** * Returns whether or not the app is considered completely signed. * * An app using a JNLP is considered signed if all of the entries of its jars are signed by at least one common signer. * * An applet on the other hand only needs to have each individual jar be fully signed by a signer. The signers can differ between jars. * * @return Whether or not the app is considered signed. */ // FIXME: Change javadoc once applets do not need entire jars signed. public boolean isFullySigned() { if (isTriviallySigned()) return true; boolean fullySigned = appVerifier.isFullySigned(certs, jarSignableEntries); OutputController.getLogger().log("App already has trusted publisher: " + fullySigned); return fullySigned; } public static boolean isJarSigned(JARDesc jar, AppVerifier verifier, ResourceTracker tracker) throws Exception { JarCertVerifier certVerifier = new JarCertVerifier(verifier); List singleJarList = new ArrayList<>(); singleJarList.add(jar); certVerifier.add(singleJarList, tracker); return certVerifier.allJarsSigned(); } /** * Update the verifier to consider new jars when verifying. * * @param jars * List of new jars to be verified. * @param tracker * Resource tracker used to obtain the the jars from cache * @throws Exception * Caused by issues with obtaining the jars' entries or interacting with the tracker. */ public void add(List jars, ResourceTracker tracker) throws Exception { verifyJars(jars, tracker); } /** * Verify the jars provided and update the state of this instance to match the new information. * * @param jars * List of new jars to be verified. * @param tracker * Resource tracker used to obtain the the jars from cache * @throws Exception * Caused by issues with obtaining the jars' entries or interacting with the tracker. */ private void verifyJars(List jars, ResourceTracker tracker) throws Exception { for (JARDesc jar : jars) { try { File jarFile = tracker.getCacheFile(jar.getLocation()); // some sort of resource download/cache error. Nothing to add // in that case ... but don't fail here if (jarFile == null) { continue; } String localFile = jarFile.getAbsolutePath(); if (verifiedJars.contains(localFile) || unverifiedJars.contains(localFile)) { continue; } VerifyResult result = verifyJar(localFile); if (result == VerifyResult.UNSIGNED) { unverifiedJars.add(localFile); } else if (result == VerifyResult.SIGNED_NOT_OK) { verifiedJars.add(localFile); } else if (result == VerifyResult.SIGNED_OK) { verifiedJars.add(localFile); } } catch (Exception e) { // We may catch exceptions from using verifyJar() // or from checkTrustedCerts throw e; } } for (CertPath certPath : certs.keySet()) checkTrustedCerts(certPath); } /** * Checks through all the jar entries of jarName for signers, storing all the common ones in the certs hash map. * * @param jarName * The absolute path to the jar file. * @return The return of {@link JarCertVerifier#verifyJarEntryCerts} using the entries found in the jar located at jarName. * @throws Exception * Will be thrown if there are any problems with the jar. */ private VerifyResult verifyJar(String jarName) throws Exception { try (JarFile jarFile = new JarFile(jarName, true)) { Vector entriesVec = new Vector(); byte[] buffer = new byte[8192]; Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry je = entries.nextElement(); entriesVec.addElement(je); InputStream is = jarFile.getInputStream(je); try { while (is.read(buffer, 0, buffer.length) != -1) { // we just read. this will throw a SecurityException // if a signature/digest check fails. } } finally { if (is != null) { is.close(); } } } return verifyJarEntryCerts(jarName, jarFile.getManifest() != null, entriesVec); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); throw e; } } /** * Checks through all the jar entries for signers, storing all the common ones in the certs hash map. * * @param jarName * The absolute path to the jar file. * @param jarHasManifest * Whether or not the associated jar has a manifest. * @param entries * The list of entries in the associated jar. * @return If there is at least one signable entry that is not signed by a common signer, return UNSIGNED. Otherwise every signable entry is signed by at least one common signer. If the signer has no issues, return SIGNED_OK. If there are any signing issues, return SIGNED_NOT_OK. * @throws Exception * Will be thrown if there are issues with entries. */ VerifyResult verifyJarEntryCerts(String jarName, boolean jarHasManifest, Vector entries) throws Exception { // Contains number of entries the cert with this CertPath has signed. Map jarSignCount = new HashMap<>(); int numSignableEntriesInJar = 0; // Record current time just before checking the jar begins. long now = System.currentTimeMillis(); if (jarHasManifest) { for (JarEntry je : entries) { String name = je.getName(); CodeSigner[] signers = je.getCodeSigners(); boolean isSigned = (signers != null); boolean shouldHaveSignature = !je.isDirectory() && !isMetaInfFile(name); if (shouldHaveSignature) { numSignableEntriesInJar++; } if (shouldHaveSignature && isSigned) { for (CodeSigner signer : signers) { CertPath certPath = signer.getSignerCertPath(); if (!jarSignCount.containsKey(certPath)) jarSignCount.put(certPath, 1); else jarSignCount.put(certPath, jarSignCount.get(certPath) + 1); } } } // while e has more elements } else { // if manifest is null // Else increment total entries by 1 so that unsigned jars with // no manifests can't sneak in numSignableEntriesInJar++; } jarSignableEntries.put(jarName, numSignableEntriesInJar); // Find all signers that have signed every signable entry in this jar. boolean allEntriesSignedBySingleCert = false; for (CertPath certPath : jarSignCount.keySet()) { if (jarSignCount.get(certPath) == numSignableEntriesInJar) { allEntriesSignedBySingleCert = true; boolean wasPreviouslyVerified = certs.containsKey(certPath); if (!wasPreviouslyVerified) certs.put(certPath, new CertInformation()); CertInformation certInfo = certs.get(certPath); if (wasPreviouslyVerified) certInfo.resetForReverification(); certInfo.setNumJarEntriesSigned(jarName, numSignableEntriesInJar); Certificate cert = certPath.getCertificates().get(0); if (cert instanceof X509Certificate) { checkCertUsage(certPath, (X509Certificate) cert, null); long notBefore = ((X509Certificate) cert).getNotBefore().getTime(); long notAfter = ((X509Certificate) cert).getNotAfter().getTime(); if (now < notBefore) { certInfo.setNotYetValidCert(); } if (notAfter < now) { certInfo.setHasExpiredCert(); } else if (notAfter < now + SIX_MONTHS) { certInfo.setHasExpiringCert(); } } } } // Every signable entry of this jar needs to be signed by at least // one signer for the jar to be considered successfully signed. VerifyResult result = null; if (numSignableEntriesInJar == 0) { // Allow jars with no signable entries to simply be considered signed. // There should be no security risk in doing so. result = VerifyResult.SIGNED_OK; } else if (allEntriesSignedBySingleCert) { // We need to find at least one signer without any issues. for (CertPath entryCertPath : jarSignCount.keySet()) { if (certs.containsKey(entryCertPath) && !hasSigningIssues(entryCertPath)) { result = VerifyResult.SIGNED_OK; break; } } if (result == null) { // All signers had issues result = VerifyResult.SIGNED_NOT_OK; } } else { result = VerifyResult.UNSIGNED; } OutputController.getLogger().log("Jar found at " + jarName + "has been verified as " + result); return result; } /** * Checks the user's trusted.certs file and the cacerts file to see if a * publisher's and/or CA's certificate exists there. * * @param certPath * The cert path of the signer being checked for trust. */ private void checkTrustedCerts(CertPath certPath) throws Exception { CertInformation info = certs.get(certPath); try { X509Certificate publisher = (X509Certificate) getPublisher(certPath); KeyStore[] certKeyStores = KeyStores.getCertKeyStores(); if (CertificateUtils.inKeyStores(publisher, certKeyStores)) info.setAlreadyTrustPublisher(); KeyStore[] caKeyStores = KeyStores.getCAKeyStores(); // Check entire cert path for a trusted CA for (Certificate c : certPath.getCertificates()) { if (CertificateUtils.inKeyStores((X509Certificate) c, caKeyStores)) { info.setRootInCacerts(); return; } } } catch (Exception e) { // TODO: Warn user about not being able to // look through their cacerts/trusted.certs // file depending on exception. OutputController.getLogger().log("WARNING: Unable to read through cert store files."); throw e; } // Otherwise a parent cert was not found to be trusted. info.setUntrusted(); } public void setCurrentlyUsedCertPath(CertPath cPath) { currentlyUsed = cPath; } @Override public Certificate getPublisher(CertPath cPath) { if (cPath != null) { currentlyUsed = cPath; } if (currentlyUsed != null) { List certList = currentlyUsed .getCertificates(); if (certList.size() > 0) { return certList.get(0); } else { return null; } } else { return null; } } @Override public Certificate getRoot(CertPath cPath) { if (cPath != null) { currentlyUsed = cPath; } if (currentlyUsed != null) { List certList = currentlyUsed .getCertificates(); if (certList.size() > 0) { return certList.get(certList.size() - 1); } else { return null; } } else { return null; } } /** * Returns whether a file is in META-INF, and thus does not require signing. * * Signature-related files under META-INF include: . META-INF/MANIFEST.MF . META-INF/SIG-* . META-INF/*.SF . META-INF/*.DSA . META-INF/*.RSA */ static boolean isMetaInfFile(String name) { String ucName = name.toUpperCase(); return ucName.startsWith(META_INF); } /** * Check if userCert is designed to be a code signer * * @param userCert * the certificate to be examined * @param bad * 3 booleans to show if the KeyUsage, ExtendedKeyUsage, * NetscapeCertType has codeSigning flag turned on. If null, * the class field badKeyUsage, badExtendedKeyUsage, * badNetscapeCertType will be set. * * Required for verifyJar() */ void checkCertUsage(CertPath certPath, X509Certificate userCert, boolean[] bad) { // Can act as a signer? // 1. if KeyUsage, then [0] should be true // 2. if ExtendedKeyUsage, then should contains ANY or CODE_SIGNING // 3. if NetscapeCertType, then should contains OBJECT_SIGNING // 1,2,3 must be true if (bad != null) { bad[0] = bad[1] = bad[2] = false; } boolean[] keyUsage = userCert.getKeyUsage(); if (keyUsage != null) { if (keyUsage.length < 1 || !keyUsage[0]) { if (bad != null) { bad[0] = true; } else { certs.get(certPath).setBadKeyUsage(); } } } try { List xKeyUsage = userCert.getExtendedKeyUsage(); if (xKeyUsage != null) { if (!xKeyUsage.contains("2.5.29.37.0") // anyExtendedKeyUsage && !xKeyUsage.contains("1.3.6.1.5.5.7.3.3")) { // codeSigning if (bad != null) { bad[1] = true; } else { certs.get(certPath).setBadExtendedKeyUsage(); } } } } catch (java.security.cert.CertificateParsingException e) { // shouldn't happen } try { // OID_NETSCAPE_CERT_TYPE byte[] netscapeEx = userCert .getExtensionValue("2.16.840.1.113730.1.1"); if (netscapeEx != null) { DerInputStream in = new DerInputStream(netscapeEx); byte[] encoded = in.getOctetString(); encoded = new DerValue(encoded).getUnalignedBitString() .toByteArray(); NetscapeCertTypeExtension extn = new NetscapeCertTypeExtension( encoded); Boolean val = (Boolean) extn .get(NetscapeCertTypeExtension.OBJECT_SIGNING); if (!val) { if (bad != null) { bad[2] = true; } else { certs.get(certPath).setBadNetscapeCertType(); } } } } catch (IOException e) { // } } /** * Returns if all jars are signed. * * @return True if all jars are signed, false if there are one or more unsigned jars */ public boolean allJarsSigned() { return this.unverifiedJars.isEmpty(); } public void checkTrustWithUser(SecurityDelegate securityDelegate, JNLPFile file) throws LaunchException { appVerifier.checkTrustWithUser(securityDelegate, this, file); } public Map getJarSignableEntries() { return Collections.unmodifiableMap(jarSignableEntries); } /** * Get the total number of entries in the provided map. * * @param map map of all jars * @return The number of entries. */ public static int getTotalJarEntries(Map map) { int sum = 0; for (int value : map.values()) { sum += value; } return sum; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/PaxHeaders.7406/ico0000644000000000000000000000013113441742745022111 xustar0030 mtime=1552401893.049832802 30 atime=1552410887.113183443 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/0000755000175000002070000000000013441742745022777 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/PaxHeaders.7406/IcoReader.java0000644000000000000000000000013113441742745024666 xustar0030 mtime=1552401893.043832814 30 atime=1552402157.231253494 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/IcoReader.java0000644000175000002070000001105613441742745025502 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools.ico; import net.sourceforge.jnlp.tools.ico.impl.ImageInputStreamIco; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.imageio.IIOException; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.ImageTypeSpecifier; import javax.imageio.metadata.IIOMetadata; import javax.imageio.spi.ImageReaderSpi; import javax.imageio.stream.ImageInputStream; public class IcoReader extends ImageReader { ImageInputStreamIco cheat; private void loadIcon() { if (cheat == null) { try { if (input instanceof ImageInputStream) { ImageInputStream iis = (ImageInputStream) input; cheat = new ImageInputStreamIco(iis); } } catch (Exception ex) { ex.printStackTrace(); } } } public IcoReader(ImageReaderSpi originatingProvider) { super(originatingProvider); } @Override public void setInput(Object input, boolean isStreamable) { super.setInput(input, isStreamable); } @Override public int getNumImages(boolean allowSearch) throws IIOException { loadIcon(); return cheat.getHeader().getCountOfIcons(); } private void checkIndex(int imageIndex) { loadIcon(); if (imageIndex < 0 || imageIndex >= cheat.getHeader().getCountOfIcons()) { throw new IndexOutOfBoundsException("bad index " + imageIndex + ". Should be >=0 and < " + cheat.getHeader().getCountOfIcons()); } } @Override public int getWidth(int imageIndex) throws IIOException { checkIndex(imageIndex); return cheat.getHeader().getEntries().get(imageIndex).getWidth(); } @Override public int getHeight(int imageIndex) throws IIOException { checkIndex(imageIndex); return cheat.getHeader().getEntries().get(imageIndex).getHeight(); } @Override public Iterator getImageTypes(int imageIndex) throws IOException { checkIndex(imageIndex); List l = new ArrayList(); Vector q = cheat.getImage(imageIndex).getSources(); for (RenderedImage q1 : q) { l.add(new ImageTypeSpecifier(q1)); } return l.iterator(); } @Override public IIOMetadata getStreamMetadata() throws IOException { return null; } @Override public IIOMetadata getImageMetadata(int imageIndex) throws IOException { checkIndex(imageIndex); return null; } @Override public BufferedImage read(int imageIndex, ImageReadParam param) throws IOException { checkIndex(imageIndex); return cheat.getImage(imageIndex); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/PaxHeaders.7406/IcoSpi.java0000644000000000000000000000013113441742745024217 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.231253494 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/IcoSpi.java0000644000175000002070000000745613441742745025044 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools.ico; import net.sourceforge.jnlp.tools.ico.impl.ImageInputStreamIco; import net.sourceforge.jnlp.tools.ico.impl.IcoHeader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Locale; import javax.imageio.ImageReader; import javax.imageio.spi.ImageReaderSpi; import javax.imageio.stream.ImageInputStream; public class IcoSpi extends ImageReaderSpi { static final String readerClassName = ImageInputStreamIco.class.getName(); static final String[] localNames = {"ico"}; static final String[] localSuffixes = {"ico", "Ico", "ICO"}; static final String[] localMIMETypes = { "image/vnd.microsoft.icon", "image/x-icon"}; public IcoSpi() { super("icedtea-web", "1.0", localNames, localSuffixes, localMIMETypes, readerClassName, new Class[]{ImageInputStream.class, InputStream.class, File.class, URL.class, String.class}, new String[0], false, null, null, new String[0], new String[0], false, null, null, new String[0], new String[0]); } @Override public String getDescription(Locale locale) { return "icedtea-web ico decoder provider"; } @Override public boolean canDecodeInput(Object input) throws IOException { try { IcoHeader header = null; if (input instanceof ImageInputStream) { ImageInputStream in = (ImageInputStream) input; in.mark(); try { header = new IcoHeader(in); } finally { in.reset(); } } return header != null; } catch (Exception ex) { //ex.printStackTrace(); return false; } } @Override public ImageReader createReaderInstance(Object extension) { return new IcoReader(this); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/PaxHeaders.7406/impl0000644000000000000000000000013113441742745023052 xustar0030 mtime=1552401893.052832796 30 atime=1552410887.113183443 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/impl/0000755000175000002070000000000013441742745023740 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/impl/PaxHeaders.7406/IcoHeaderEntry.java0000644000000000000000000000013013441742745026636 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.231253494 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/impl/IcoHeaderEntry.java0000644000175000002070000001064713441742745027460 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.tools.ico.impl; /* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ import java.io.IOException; import javax.imageio.stream.ImageInputStream; public class IcoHeaderEntry { private int width; private int height; private int colorCount; private final int reserved; private final int planes; //should be 1 but I met quite a lot of 0 private final int bitCount; private final int sizeInBytes; // InfoHeader + ANDbitmap + XORbitmap private final int fileOffset; //FilePos, where InfoHeader starts public IcoHeaderEntry(ImageInputStream src) throws IOException, IcoException { width = src.read(); height = src.read(); colorCount = src.read(); // sentence "Number of Colors (2,16, 0=256) " is form doubnet //unluckily, both 0==0 and 0==256 does exists //going with doubnet by default if (colorCount == 0) { colorCount = 256; } reserved = src.read(); planes = src.readUnsignedShort(); isIcoHeader(); bitCount = src.readUnsignedShort(); sizeInBytes = src.readInt(); fileOffset = src.readInt(); } private IcoHeaderEntry(int width, int height, int colorCount, int planes, int bitCount, int sizeInBytes, int fileOffset) { this.width = width; this.height = height; this.colorCount = colorCount; this.reserved = 0; this.planes = planes; this.bitCount = bitCount; this.sizeInBytes = sizeInBytes; this.fileOffset = fileOffset; } private IcoHeaderEntry provideMonochromeHeader() { //each bit in byte stores 8 pixels values return new IcoHeaderEntry(width, height, 1, planes, 1, width * height / 8, fileOffset + sizeInBytes); } private void isIcoHeader() throws IcoException { if (reserved != 0 || (planes != 1 && planes != 0)) { throw new IcoException("Invalid header. Expected 0 and 1(0?), got " + reserved + " and " + planes); } } /** * @return the colorCount */ int getColorCount() { return colorCount; } /** * @param colorCount the colorCount to set */ void setColorCount(int colorCount) { this.colorCount = colorCount; } /** * @return the width */ public int getWidth() { return width; } /** * @param width the width to set */ void setWidth(int width) { this.width = width; } /** * @return the height */ public int getHeight() { return height; } /** * @param height the height to set */ void setHeight(int height) { this.height = height; } int getSizeInBytes() { return sizeInBytes; } int getFileOffset() { return fileOffset; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/impl/PaxHeaders.7406/IcoHeader.java0000644000000000000000000000013113441742745025615 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.231253494 29 ctime=1552410887.03718362 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/impl/IcoHeader.java0000644000175000002070000000616713441742745026440 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools.ico.impl; import java.io.IOException; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; import javax.imageio.stream.ImageInputStream; /** * http://www.daubnet.com/en/file-format-ico */ public class IcoHeader { private final int reserved; //0 private final int type; //should be 1 (0 is for cusrsor?) final int countOfIcons; final List entries; //size 16*countOfIcons bytes private final ByteOrder originalOrder; public IcoHeader(ImageInputStream src) throws IOException, IcoException { originalOrder = src.getByteOrder(); try { src.setByteOrder(ByteOrder.LITTLE_ENDIAN); reserved = src.readUnsignedShort(); type = src.readUnsignedShort(); isIco(); countOfIcons = src.readUnsignedShort(); entries = new ArrayList<>(countOfIcons); for (int x = 0; x < countOfIcons; x++) { entries.add(new IcoHeaderEntry(src)); } } finally { src.setByteOrder(originalOrder); } } private void isIco() throws IcoException { if (reserved != 0 || (type != 1)) { throw new IcoException("Invalid header. Expected 0 and 1, got " + reserved + " and " + type); } } public List getEntries() { return entries; } public int getCountOfIcons() { return countOfIcons; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/impl/PaxHeaders.7406/ImageInputStreamIco.java0000644000000000000000000000013213441742745027644 xustar0030 mtime=1552401893.052832796 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/impl/ImageInputStreamIco.java0000644000175000002070000001505113441742745030456 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools.ico.impl; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.EOFException; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.imageio.ImageIO; import javax.imageio.stream.ImageInputStream; public class ImageInputStreamIco { private final IcoHeader header; private final List images; //size 16*countOfIcons bytes public IcoHeader getHeader() { return header; } public BufferedImage getImage(int i) { return images.get(i); } public ImageInputStreamIco(ImageInputStream src) throws IOException, IcoException { this.header = new IcoHeader(src); images = new ArrayList<>(header.countOfIcons); for (IcoHeaderEntry e : header.entries) { BufferedImage image = readImage(e, src); images.add(image); } } public List getImages() { return Collections.unmodifiableList(images); } private static void readMask(IcoHeaderEntry e, ImageInputStream src1) throws IOException { //acording to spec, behind img bytes, should be another bytes, with AND bitmap.Hoewer, I had not found them. //however, that means, that transaprency is lost... But bit offsets mathces.. so... //IcoHeader.IcoHeaderEntry q = e.provideMonochromeHeader(); //src1.getStreamPosition(); //byte[] mask = new byte[q.sizeInBytes]; //src1.readFully(mask); } private static BufferedImage readImage(IcoHeaderEntry e, ImageInputStream src1) throws IOException { BufferedImage image; byte[] img = new byte[e.getSizeInBytes()]; if (src1.getStreamPosition() != e.getFileOffset()) { //I had never seen this thrown, Still, is it worthy to tempt it, or rather read and die later? //throw new IOException("Stream position do nto match expected position. Bmp(or png) will read wrongly"); } src1.readFully(img); try { image = parse(img, e); //readMask(e, src1); } catch (EOFException ex) { //some icons do not honour that 0 is 256. Retrying if (e.getColorCount() != 0) { e.setColorCount(0); image = parse(img, e); //readMask(e, src1); } else { throw ex; } } return image; } private static BufferedImage parse(byte[] img, IcoHeaderEntry e) throws IOException { ByteArrayInputStream bis = new ByteArrayInputStream(img); BufferedImage image = null; try { image = ImageIO.read(bis); } catch (Exception ex) { //not png } if (image != null) { fixSizesInHeader(e, image); return image; } //bmp img = prefixByFakeHeader(img, e); bis = new ByteArrayInputStream(img); //dont try catch this one. you will break it image = ImageIO.read(bis); return image; } private static void fixSizesInHeader(IcoHeaderEntry e, BufferedImage image) { //may happen for png if (e.getWidth() == 0) { e.setWidth(image.getWidth()); } if (e.getHeight() == 0) { e.setHeight(image.getHeight()); } } private static byte[] prefixByFakeHeader(final byte[] origArray, IcoHeaderEntry e) { int fakingArray = 14; byte[] img = new byte[fakingArray + e.getSizeInBytes()]; for (int i = 0; i < origArray.length; i++) { byte p = origArray[i]; img[i + 14] = p; } //fake header //http://www.daubnet.com/en/file-format-bmp int size = e.getSizeInBytes() + fakingArray; img[0] = 'B'; img[1] = 'M'; img[2] = (byte) (size & 0xFF); img[3] = (byte) ((size >> 8) & 0xFF); img[4] = (byte) ((size >> 16) & 0xFF); img[5] = (byte) ((size >> 24) & 0xFF); img[6] = 0; img[7] = 0; img[8] = 0; img[9] = 0; int ofset = fakingArray + 40 + 4 * e.getColorCount(); img[10] = (byte) (ofset & 0xFF); img[11] = (byte) ((ofset >> 8) & 0xFF); img[12] = (byte) ((ofset >> 16) & 0xFF); img[13] = (byte) ((ofset >> 24) & 0xFF); //ico is storing height as height of XOR + height of AND bitmaps //that is 2 x hight. Bitmap expects only height of single image int tmpHeight = e.getHeight(); img[fakingArray + 4/*size*/ + 4/*width*/] = (byte) (tmpHeight & 0xFF); img[fakingArray + 4/*size*/ + 4/*width*/ + 1] = (byte) ((tmpHeight >> 8) & 0xFF); img[fakingArray + 4/*size*/ + 4/*width*/ + 2] = (byte) ((tmpHeight >> 16) & 0xFF); img[fakingArray + 4/*size*/ + 4/*width*/ + 3] = (byte) ((tmpHeight >> 24) & 0xFF); return img; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/impl/PaxHeaders.7406/IcoException.java0000644000000000000000000000013113441742745026363 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/ico/impl/IcoException.java0000644000175000002070000000350113441742745027173 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools.ico.impl; class IcoException extends Exception { public IcoException(String string) { super(string); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/PaxHeaders.7406/KeyStoreUtil.java0000644000000000000000000000013213441742745024663 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/KeyStoreUtil.java0000644000175000002070000000511413441742745025474 0ustar00jvanekmock00000000000000/* * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package net.sourceforge.jnlp.tools; /** * This class provides several utilities to {@link java.security.KeyStore}. * * @since 1.6.0 */ public class KeyStoreUtil { // Class and methods marked as public so that they can be // accessed by JarCertVerifier, which although lies in a package // with the same name, but bundled in tools.jar and loaded // by another class loader, hence in a different *runtime* // package. // // See JVM Spec, 5.3 and 5.4.4 private KeyStoreUtil() { // this class is not meant to be instantiated } /** * Returns true if KeyStore has a password. This is true except for * MSCAPI KeyStores * @param storetype type of store * @return true if it was windows one */ public static boolean isWindowsKeyStore(String storetype) { return storetype.equalsIgnoreCase("Windows-MY") || storetype.equalsIgnoreCase("Windows-ROOT"); } /** * Returns standard-looking names for storetype * @param storetype type of store * @return better name fro keystore */ public static String niceStoreTypeName(String storetype) { if (storetype.equalsIgnoreCase("Windows-MY")) { return "Windows-MY"; } else if (storetype.equalsIgnoreCase("Windows-ROOT")) { return "Windows-ROOT"; } else { return storetype.toUpperCase(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/PaxHeaders.7406/CertInformation.java0000644000000000000000000000013213441742745025363 xustar0030 mtime=1552401893.052832796 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/tools/CertInformation.java0000644000175000002070000002255313441742745026202 0ustar00jvanekmock00000000000000/* CertInformation.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.tools; import static net.sourceforge.jnlp.runtime.Translator.R; import java.util.ArrayList; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; /** * Maintains information about a CertPath that has signed at least one of the * entries provided by a jar of the app. */ public class CertInformation { private boolean hasExpiredCert = false; private boolean hasExpiringCert = false; private boolean isNotYetValidCert = false; /* Code signer properties of the certificate. */ private boolean hasBadKeyUsage = false; private boolean hasBadExtendedKeyUsage = false; private boolean hasBadNetscapeCertType = false; private boolean alreadyTrustPublisher = false; private boolean rootInCacerts = false; static enum Detail { TRUSTED (R("STrustedCertificate")), UNTRUSTED (R("SUntrustedCertificate")), RUN_WITHOUT_RESTRICTIONS(R("SRunWithoutRestrictions")), EXPIRED (R("SHasExpiredCert")), EXPIRING (R("SHasExpiringCert")), NOT_YET_VALID (R("SNotYetValidCert")), BAD_KEY_USAGE (R("SBadKeyUsage")), BAT_EXTENDED_KEY_USAGE (R("SBadExtendedKeyUsage")), BAD_NETSCAPE_CERT_TYPE (R("SBadNetscapeCertType")); private final String message; Detail(String issue) { message = issue; } public String message() { return message; } } private EnumSet details = EnumSet.noneOf(Detail.class); /** The jars and their number of entries this cert has signed. */ private HashMap signedJars = new HashMap(); /** * Return if there are signing issues with this certificate. * @return {@code true} if there are any issues with expiry, validity or bad key usage. */ public boolean hasSigningIssues() { return hasExpiredCert || isNotYetValidCert || hasBadKeyUsage || hasBadExtendedKeyUsage || hasBadNetscapeCertType; } /** * Return whether or not the publisher is already trusted. * * @return {@code true} if the publisher is trusted already. */ public boolean isPublisherAlreadyTrusted() { return alreadyTrustPublisher; } /** * Set whether or not the publisher is already trusted. */ public void setAlreadyTrustPublisher() { alreadyTrustPublisher = true; } /** * Return whether or not the root is in the list of trusted CA certificates. * * @return {@code true} if the root is in the list of CA certificates. */ public boolean isRootInCacerts() { return rootInCacerts; } /** * Set that this cert's root CA is to be trusted. */ public void setRootInCacerts() { rootInCacerts = true; details.add(Detail.TRUSTED); } /** * Resets any trust of the root and publisher. Also removes unnecessary * details from the list of issues. */ public void resetForReverification() { alreadyTrustPublisher = false; rootInCacerts = false; removeFromDetails(Detail.UNTRUSTED); removeFromDetails(Detail.TRUSTED); } /** * Check if this cert is the signer of a jar. * @param jarName The absolute path of the jar this certificate has signed. * @return {@code true} if this cert has signed the jar found at {@code jarName}. */ public boolean isSignerOfJar(String jarName) { return signedJars.containsKey(jarName); } /** * Add a jar to the list of jars this certificate has signed along with the * number of entries it has signed in the jar. * * @param jarName The absolute path of the jar this certificate has signed. * @param signedEntriesCount The number of entries this cert has signed in {@code jarName}. */ public void setNumJarEntriesSigned(String jarName, int signedEntriesCount) { if (signedJars.containsKey(jarName)) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "WARNING: A jar that has already been " + "verified is being yet again verified: " + jarName); } else { signedJars.put(jarName, signedEntriesCount); } } /** * Find the number of entries this cert has signed in the specified jar. * @param jarName The absolute path of the jar this certificate has signed. * @return The number of entries this cert has signed in {@code jarName}. */ public int getNumJarEntriesSigned(String jarName) { return signedJars.get(jarName); } /** * Get all the jars this cert has signed along with the number of entries * in each jar. * @return a {link Map} of jars and their number of entries this cert has signed */ public Map getSignedJars() { return signedJars; } /** * Get the details regarding issue(s) with this certificate. * * @return A list of all the details/issues with this app. */ public List getDetailsAsStrings() { List detailsToStr = new ArrayList(); for (Detail issue : details) { detailsToStr.add(issue.message()); } return detailsToStr; } /** * Remove an issue from the list of details of issues with this certificate. * List is unchanged if detail was not present. * * @param detail The issue to be removed regarding this certificate. */ private void removeFromDetails(Detail detail) { details.remove(detail); } /** * Set that this cert is expired and add this issue to the list of details. */ public void setHasExpiredCert() { hasExpiredCert = true; details.add(Detail.RUN_WITHOUT_RESTRICTIONS); details.add(Detail.EXPIRED); } /** * Set that this cert is expiring within 6 months and add this issue to * the list of details. */ public void setHasExpiringCert() { hasExpiringCert = true; details.add(Detail.RUN_WITHOUT_RESTRICTIONS); details.add(Detail.EXPIRING); } /** * Get whether or not this cert will expire within 6 months. * @return {@code true} if the cert will be expired after 6 months. */ public boolean hasExpiringCert() { return hasExpiringCert; } /** * Set that this cert is not yet valid * and add this issue to the list of details. */ public void setNotYetValidCert() { isNotYetValidCert = true; details.add(Detail.RUN_WITHOUT_RESTRICTIONS); details.add(Detail.NOT_YET_VALID); } /** * Set that this cert has bad key usage * and add this issue to the list of details. */ public void setBadKeyUsage() { hasBadKeyUsage = true; details.add(Detail.RUN_WITHOUT_RESTRICTIONS); details.add(Detail.BAD_KEY_USAGE); } /** * Set that this cert has bad extended key usage * and add this issue to the list of details. */ public void setBadExtendedKeyUsage() { hasBadExtendedKeyUsage = true; details.add(Detail.RUN_WITHOUT_RESTRICTIONS); details.add(Detail.BAT_EXTENDED_KEY_USAGE); } /** * Set that this cert has a bad netscape cert type * and add this issue to the list of details. */ public void setBadNetscapeCertType() { hasBadNetscapeCertType = true; details.add(Detail.RUN_WITHOUT_RESTRICTIONS); details.add(Detail.BAD_NETSCAPE_CERT_TYPE); } /** * Set that this cert and all of its CAs are untrusted so far. */ public void setUntrusted() { details.add(Detail.UNTRUSTED); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/splashscreen0000644000000000000000000000013213441742745022672 xustar0030 mtime=1552401893.049832802 30 atime=1552410887.113183443 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/0000755000175000002070000000000013441742745023557 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/SplashPanel.java0000644000000000000000000000013213441742745026024 xustar0030 mtime=1552401893.043832814 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/SplashPanel.java0000644000175000002070000000742513441742745026644 0ustar00jvanekmock00000000000000/* SplashPanel.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen; import java.awt.Graphics; import java.awt.event.ComponentListener; import javax.swing.JComponent; import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; import net.sourceforge.jnlp.splashscreen.parts.InformationElement; public interface SplashPanel { /** * The plugin splashscreens must be placed into another containers, * So must return themselves as JComponent. * Mostly your SplashScreen will extend some JComponent, so this method will * just return "this" */ public JComponent getSplashComponent(); public void setInformationElement(InformationElement content); public InformationElement getInformationElement(); /** Width of the plugin window */ public void setSplashWidth(int pluginWidth); /** Height of the plugin window */ public void setSplashHeight(int pluginHeight); /** Width of the plugin window */ public int getSplashWidth(); /** Height of the plugin window */ public int getSplashHeight(); public void adjustForSize(); // Add a new listener for resizes public void addComponentListener(ComponentListener cl); public boolean isAnimationRunning(); /** * Methods to start the animation in the splash panel. * * This method exits after starting a new thread to do the animation. It * is synchronized to prevent multiple startAnimation threads from being created. */ public void startAnimation(); public void stopAnimation(); void paintTo(Graphics g); public void setSplashReason(SplashReason splashReason); public SplashReason getSplashReason(); /** * Version can be printed in splash window * @param version */ public void setVersion(String version); String getVersion(); /** * how mny percentage loaded is shown in progress bar (if any) * @param done - should be in 0-100 inclusinve */ public void setPercentage(int done); /** * returns state of loading progress bar * @return percentage showed in possible progress bar - should be in 0-100 */ int getPercentage(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/parts0000644000000000000000000000013213441742745024023 xustar0030 mtime=1552401893.071832756 30 atime=1552410887.113183443 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/0000755000175000002070000000000013441742745024710 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/InfoItem.java0000644000000000000000000000013213441742745026455 xustar0030 mtime=1552401893.071832756 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/InfoItem.java0000644000175000002070000001106213441742745027265 0ustar00jvanekmock00000000000000/* InfoItem.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; import net.sourceforge.jnlp.InformationDesc; import net.sourceforge.jnlp.runtime.Translator; /** * The optional kind="splash" attribute may be used in an icon element to * indicate that the image is to be used as a "splash" screen during the launch * of an application. If the JNLP file does not contain an icon element with * kind="splash" attribute, Java Web Start will construct a splash screen using * other items from the information Element. * If the JNLP file does not contain any icon images, the splash image will * consist of the application's title and vendor, as taken from the JNLP file. * * items not used inside */ public class InfoItem { public static final String SPLASH = "SPLASH"; public static final String title = "title"; public static final String vendor = "vendor"; public static final String homepage = "homepage"; public static final String homepageHref = "href"; public static final String description = "description"; public static final String descriptionKind = "kind"; public static final String descriptionKindOneLine = (String) InformationDesc.ONE_LINE; //when no kind is specified, then it should behave as short public static final String descriptionKindShort = (String) InformationDesc.SHORT; public static final String descriptionKindToolTip = (String) InformationDesc.TOOLTIP; protected String type; protected String value; public InfoItem(String type, String value) { this.type = type; this.value = value; } /** * @return the type */ public String getType() { return type; } /** * @param type the type to set */ public void setType(String type) { this.type = type; } /** * @return the value */ public String getValue() { return value; } /** * @param value the value to set */ public void setValue(String value) { this.value = value; } public boolean isofSameType(InfoItem o) { return ((getType().equals(o.getType()))); } @Override public boolean equals(Object obj) { if (!(obj instanceof InfoItem)) { return false; } InfoItem o = (InfoItem) obj; return isofSameType(o) && (getValue().equals(o.getValue())); } @Override public String toString() { return type + ": " + value; } public String toNiceString() { String key = SPLASH + type; return localise(key, value); } public static String localise(String key, String s) { return Translator.R(key) + ": " + s; } @Override public int hashCode() { int hash = 7; hash = 59 * hash + (this.getType() != null ? this.getType().hashCode() : 0); hash = 59 * hash + (this.getValue() != null ? this.getValue().hashCode() : 0); return hash; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/BasicComponentSplashScr0000644000000000000000000000013213441742745030552 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/BasicComponentSplashScreen.java0000644000175000002070000001046013441742745032773 0ustar00jvanekmock00000000000000/* BasicComponentSplashScreen.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; import javax.swing.JComponent; import net.sourceforge.jnlp.splashscreen.SplashPanel; import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; public abstract class BasicComponentSplashScreen extends JComponent implements SplashPanel { //scaling 100% public static final double ORIGINAL_W = 635; public static final double ORIGINAL_H = 480; /** Width of the plugin window */ protected int pluginWidth; /** Height of the plugin window */ protected int pluginHeight; /** The project name to display */ private SplashReason splashReason; private boolean animationRunning = false; private InformationElement content; private String version; @Override public JComponent getSplashComponent() { return this; } @Override public boolean isAnimationRunning() { return animationRunning; } public void setAnimationRunning(boolean b){ animationRunning=b; } @Override public void setInformationElement(InformationElement content) { this.content = content; } @Override public InformationElement getInformationElement() { return content; } /** * @return the pluginWidth */ @Override public int getSplashWidth() { return pluginWidth; } /** * @param pluginWidth the pluginWidth to set */ @Override public void setSplashWidth(int pluginWidth) { this.pluginWidth = pluginWidth; } /** * @return the pluginHeight */ @Override public int getSplashHeight() { return pluginHeight; } /** * @param pluginHeight the pluginHeight to set */ @Override public void setSplashHeight(int pluginHeight) { this.pluginHeight = pluginHeight; } /** * @return the splashReason */ @Override public SplashReason getSplashReason() { return splashReason; } /** * @param splashReason the splashReason to set */ @Override public void setSplashReason(SplashReason splashReason) { this.splashReason = splashReason; } /** * @return the version */ @Override public String getVersion() { return version; } /** * @param version the version to set */ @Override public void setVersion(String version) { this.version = version; } protected String createAditionalInfo() { if (getVersion() != null) { return getSplashReason().toString() + " version: " + getVersion(); } else { return null; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/JEditorPaneBasedExcepti0000644000000000000000000000013213441742745030450 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java0000644000175000002070000004611413441742745033663 0ustar00jvanekmock00000000000000/* JeditorPaneBasedExceptionDialog.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.WindowEvent; import java.text.DateFormat; import java.util.Date; import java.util.List; import javax.swing.BorderFactory; import javax.swing.GroupLayout; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.LayoutStyle; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.about.AboutDialog; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.BasicExceptionDialog; import net.sourceforge.jnlp.util.docprovider.TextsProvider; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.swing.SwingUtils; public class JEditorPaneBasedExceptionDialog extends JDialog implements HyperlinkListener { // components private JButton closeButton; private JButton closeAndCopyButton; private JButton homeButton; private JButton aboutButton; private JButton consoleButton; private JButton cacheButton; private JEditorPane htmlErrorAndHelpPanel; private JLabel exceptionLabel; private JLabel iconLabel; private JPanel mainPanel; private JPanel topPanel; private JPanel bottomPanel; private JScrollPane htmlPaneScroller; // End of components declaration private final String message; private final Throwable exception; private final Date shown; private final String anotherInfo; /** Creates new form JEditorPaneBasedExceptionDialog */ public JEditorPaneBasedExceptionDialog(java.awt.Frame parent, boolean modal, Throwable ex, InformationElement information, String anotherInfo) { super(parent, modal); shown = new Date(); initComponents(); htmlErrorAndHelpPanel.setContentType("text/html"); htmlErrorAndHelpPanel.setEditable(false); this.anotherInfo=anotherInfo; List l = infoElementToList(information); this.message = getText(ex, l, anotherInfo, shown); this.exception = ex; if (exception == null) { closeAndCopyButton.setVisible(false); } htmlErrorAndHelpPanel.setText(message); //htmlPaneScroller.getVerticalScrollBar().setValue(1); htmlErrorAndHelpPanel.setCaretPosition(0); try { Icon icon = new ImageIcon(this.getClass().getResource("/net/sourceforge/jnlp/resources/warning.png")); iconLabel.setIcon(icon); } catch (Exception lex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, lex); } htmlErrorAndHelpPanel.addHyperlinkListener(this); homeButton.setVisible(false); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } static List infoElementToList(InformationElement information) { List l = null; if (information != null) { l = information.getHeader(); InfoItem ii = information.getLongestDescriptionForSplash(); if (ii != null) { l.add(ii.toNiceString()); } } return l; } private void initComponents() { topPanel = new JPanel(); closeButton = new JButton(); closeAndCopyButton = new JButton(); mainPanel = new JPanel(); exceptionLabel = new JLabel(); iconLabel = new JLabel(); bottomPanel = new JPanel(); htmlPaneScroller = new JScrollPane(); htmlErrorAndHelpPanel = new JEditorPane(); homeButton = new JButton(); aboutButton = new JButton(); consoleButton = BasicExceptionDialog.getShowButton(JEditorPaneBasedExceptionDialog.this); cacheButton = BasicExceptionDialog.getClearCacheButton(JEditorPaneBasedExceptionDialog.this); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); closeButton.setText(Translator.R(InfoItem.SPLASH + "Close")); closeButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { closeWindowButtonActionPerformed(evt); } }); closeAndCopyButton.setText(Translator.R(InfoItem.SPLASH + "closewAndCopyException")); closeAndCopyButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { copyAndCloseButtonActionPerformed(evt); } }); GroupLayout jPanel2Layout = new GroupLayout(topPanel); topPanel.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addComponent(closeButton) .addContainerGap() .addComponent(aboutButton) .addContainerGap() .addComponent(cacheButton) .addContainerGap() .addComponent(consoleButton) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 314, Short.MAX_VALUE) .addComponent(closeAndCopyButton) .addContainerGap())); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() .addContainerGap(24, Short.MAX_VALUE) .addGroup(jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(closeButton) .addComponent(aboutButton) .addComponent(cacheButton) .addComponent(consoleButton) .addComponent(closeAndCopyButton)) .addContainerGap())); exceptionLabel.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N exceptionLabel.setHorizontalAlignment(SwingConstants.CENTER); exceptionLabel.setText(Translator.R(InfoItem.SPLASH + "exOccured")); bottomPanel.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); bottomPanel.setLayout(new java.awt.BorderLayout()); htmlPaneScroller.setViewportView(htmlErrorAndHelpPanel); bottomPanel.add(htmlPaneScroller, java.awt.BorderLayout.CENTER); homeButton.setText(Translator.R(InfoItem.SPLASH + "Home")); homeButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { homeButtonActionPerformed(evt); } }); aboutButton.setText(Translator.R("AboutDialogueTabAbout")); aboutButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { try{ AboutDialog.display(true, TextsProvider.ITW_PLUGIN); }catch(Exception ex){ OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); JOptionPane.showConfirmDialog(JEditorPaneBasedExceptionDialog.this, ex); } } }); GroupLayout jPanel1Layout = new GroupLayout(mainPanel); mainPanel.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addComponent(iconLabel, GroupLayout.PREFERRED_SIZE, 71, GroupLayout.PREFERRED_SIZE).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addComponent(exceptionLabel, GroupLayout.DEFAULT_SIZE, 503, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(homeButton, GroupLayout.PREFERRED_SIZE, 101, GroupLayout.PREFERRED_SIZE).addContainerGap()).addComponent(bottomPanel, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 723, Short.MAX_VALUE)); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(iconLabel, GroupLayout.PREFERRED_SIZE, 70, GroupLayout.PREFERRED_SIZE).addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(exceptionLabel, GroupLayout.PREFERRED_SIZE, 70, GroupLayout.PREFERRED_SIZE).addComponent(homeButton, GroupLayout.PREFERRED_SIZE, 64, GroupLayout.PREFERRED_SIZE))).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addComponent(bottomPanel, GroupLayout.DEFAULT_SIZE, 158, Short.MAX_VALUE))); GroupLayout layout = new GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING).addComponent(mainPanel, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(topPanel, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addContainerGap())); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addContainerGap().addComponent(mainPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addComponent(topPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addContainerGap())); pack(); } private void copyAndCloseButtonActionPerformed(java.awt.event.ActionEvent evt) { if (exception != null) { try { StringSelection data = new StringSelection(anotherInfo+"\n"+shown.toString()+"\n"+getExceptionStackTraceAsString(exception)+addPlainChain()); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(data, data); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); JOptionPane.showMessageDialog(this, Translator.R(InfoItem.SPLASH + "cantCopyEx")); } } else { JOptionPane.showMessageDialog(this, Translator.R(InfoItem.SPLASH + "noExRecorded")); } close(); } private void homeButtonActionPerformed(java.awt.event.ActionEvent evt) { htmlErrorAndHelpPanel.setText(message); homeButton.setVisible(false); } private void closeWindowButtonActionPerformed(java.awt.event.ActionEvent evt) { close(); } /** * @param args the command line arguments */ public static void main(String args[]) { SwingUtils.invokeLater(new Runnable() { public void run() { Exception ex = new RuntimeException("dsgsfdg"); JEditorPaneBasedExceptionDialog dialog = new JEditorPaneBasedExceptionDialog(new JFrame(), true, ex, null, "uaaa: aaa\nwqdeweq:sdsds"); dialog.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.setVisible(true); } }); } static String getText(Throwable ex, List l, String anotherInfo,Date shown) { StringBuilder s = new StringBuilder(""); String info = "

    " + Translator.R(InfoItem.SPLASH + "mainL1", createLink()) + "

    \n" + "

    " + Translator.R(InfoItem.SPLASH + "mainL2", createLink()) + "

    \n"; String t = "

    " + Translator.R(InfoItem.SPLASH + "mainL3") + "

    \n" + info + formatListInfoList(l) + formatInfo(anotherInfo); Object[] options = new String[2]; options[0] = Translator.R(InfoItem.SPLASH + "Close"); options[1] = Translator.R(InfoItem.SPLASH + "closeAndCopyShorter"); if (ex != null) { t = "

    " + Translator.R(InfoItem.SPLASH + "mainL4") + "

    \n" + info + formatListInfoList(l) + formatInfo(anotherInfo) +"
    "+DateFormat.getInstance().format(shown)+"
    " + "

    " + Translator.R(InfoItem.SPLASH + "exWas") + "
    \n" + "

    " + getExceptionStackTraceAsString(ex) + "
    " + addChain(); } else { t += formatListInfoList(l); } s.append(t); s.append(""); return s.toString(); } public static String getExceptionStackTraceAsString(Throwable exception) { if (exception == null) { return ""; } return OutputController.exceptionToString(exception); } public static String[] getExceptionStackTraceAsStrings(Throwable exception) { if (exception == null) { return new String[0]; } return OutputController.exceptionToString(exception).split("\n"); } @Override public void hyperlinkUpdate(HyperlinkEvent event) { if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { try { htmlErrorAndHelpPanel.setPage(event.getURL()); homeButton.setVisible(true); } catch (Exception ioe) { JOptionPane.showMessageDialog(this, Translator.R(InfoItem.SPLASH + "cfl") + " " + event.getURL().toExternalForm() + ": " + ioe); } } } private void close() { processWindowEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); } static String formatListInfoList(List l) { if (l == null) { return ""; } StringBuilder sb = new StringBuilder(); sb.append("

    "); sb.append("

    "). append(Translator.R(InfoItem.SPLASH + "vendorsInfo")).append(":

    "); sb.append("
    ");
            for (int i = 0; i < l.size(); i++) {
                String string = l.get(i);
                sb.append(string).append("\n");
            }
            sb.append("
    "); sb.append("

    "); return sb.toString(); } static String formatInfo(String l) { if (l == null) { return ""; } StringBuilder sb = new StringBuilder(); sb.append("

    "); sb.append("

    "). append(Translator.R(InfoItem.SPLASH + "anotherInfo")).append(":

    "); sb.append("
    ");
            sb.append(l);
            sb.append("
    "); sb.append("

    "); return sb.toString(); } Throwable getException() { return exception; } String getMessage() { return message; } private static String createLink() { return "" + TextsProvider.ITW_HOME + ""; } private static String addChain() { if (LaunchException.getLaunchExceptionChain().isEmpty()) { return ""; } return Translator.R(InfoItem.SPLASH + "chainWas") + "
    \n" + "
    " + getChainAsString(true) + "
    "; } private static String addPlainChain() { if (LaunchException.getLaunchExceptionChain().isEmpty()) { return ""; } return "\n Chain: \n" + getChainAsString(false); } private static String getChainAsString(boolean formatTime) { return getChainAsString(LaunchException.getLaunchExceptionChain(), formatTime); } private static String getChainAsString(List launchExceptionChain, boolean formatTime) { String s = ""; if (launchExceptionChain != null) { for (int i = 0; i < launchExceptionChain.size(); i++) { LaunchException.LaunchExceptionWithStamp launchException = launchExceptionChain.get(i); s = s + (i+1) + ") at " + formatTime(launchException.getStamp(), formatTime) + "\n" + getExceptionStackTraceAsString(launchException.getEx()); } } return s; } private static String formatTime(Date dateTime, boolean formatTime) { if (dateTime == null) { return "unknown time"; } if (formatTime) { return DateFormat.getInstance().format(dateTime); } else { return dateTime.toString(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/BasicComponentErrorSpla0000644000000000000000000000013113441742745030560 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/BasicComponentErrorSplashScreen.java0000644000175000002070000000601113441742745034002 0ustar00jvanekmock00000000000000/* BasicComponentSplashScreen.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; import net.sourceforge.jnlp.splashscreen.SplashErrorPanel; import net.sourceforge.swing.SwingUtils; public abstract class BasicComponentErrorSplashScreen extends BasicComponentSplashScreen implements SplashErrorPanel { /** * When applet loading fails, then dying stacktrace can be stted, and is then shown to user on demand. */ private Throwable loadingException; /** * @return the loadingException */ @Override public Throwable getLoadingException() { return loadingException; } /** * @param loadingException the loadingException to set */ @Override public void setLoadingException(Throwable loadingException) { this.loadingException = loadingException; } protected void raiseExceptionDialogNOW() { JEditorPaneBasedExceptionDialog dialog = new JEditorPaneBasedExceptionDialog(null, true, getLoadingException(), getInformationElement(), createAditionalInfo()); dialog.setVisible(true); } protected void raiseExceptionDialogQUEUED() { SwingUtils.invokeLater(new Runnable() { @Override public void run() { raiseExceptionDialogNOW(); } }); } protected void raiseExceptionDialog() { raiseExceptionDialogQUEUED(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/InformationElement.java0000644000000000000000000000013213441742745030542 xustar0030 mtime=1552401893.052832796 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/InformationElement.java0000644000175000002070000002055213441742745031356 0ustar00jvanekmock00000000000000/* InformationElement.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /** http://docs.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html */ package net.sourceforge.jnlp.splashscreen.parts; import java.util.ArrayList; import java.util.Collections; import java.util.List; import net.sourceforge.jnlp.InformationDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.OutputController; /** * This class is wrapper arround the *information* tag element which should * javaws provide from source jnlp file */ public class InformationElement { private InfoItem title; private InfoItem vendor; private InfoItem homepage; private List descriptions = new ArrayList(5); public void setTitle(String title) { if (title == null) { return; } this.title = new InfoItem(InfoItem.title, title); } public void setvendor(String vendor) { if (vendor == null) { return; } this.vendor = new InfoItem(InfoItem.vendor, vendor); } public void setHomepage(String homepage) { if (homepage == null) { return; } this.homepage = new InfoItem(InfoItem.homepage, homepage); } public void addDescription(String description) { addDescription(description, null); } /** * Just one description of each kind (4 including null) are allowed in information element. * This method should throw exception when trying to add second description of same kind * But I do not consider it as good idea to force this behaviour for somesing like psalsh screen, * so I jsut replace the previous one with new one. without any warning */ public void addDescription(String description, String kind) { if (description == null) { return; } DescriptionInfoItem d = new DescriptionInfoItem(description, kind); for (DescriptionInfoItem descriptionInfoItem : descriptions) { if (descriptionInfoItem.isOfSameKind(d)) { descriptions.remove(descriptionInfoItem); descriptions.add(d); return; } } descriptions.add(d); } public InfoItem getBestMatchingDescriptionForSplash() { for (DescriptionInfoItem d : descriptions) { if (InfoItem.descriptionKindOneLine.equals(d.getKind())) { return d; } } for (DescriptionInfoItem d : descriptions) { if (d.getKind() == null) { return d; } } return null; } public InfoItem getLongestDescriptionForSplash() { for (DescriptionInfoItem d : descriptions) { if (InfoItem.descriptionKindShort.equals(d.getKind())) { return d; } } for (DescriptionInfoItem d : descriptions) { if (d.getKind() == null) { return d; } } for (DescriptionInfoItem d : descriptions) { if (InfoItem.descriptionKindOneLine.equals(d.getKind())) { return d; } } for (DescriptionInfoItem d : descriptions) { if (InfoItem.descriptionKindToolTip.equals(d.getKind())) { return d; } } return null; } public String getTitle() { if (title == null) { return null; } return title.toNiceString(); } public String getVendor() { if (vendor == null) { return null; } return vendor.toNiceString(); } public String getHomepage() { if (homepage == null) { return null; } return homepage.toNiceString(); } List getDescriptions() { return Collections.unmodifiableList(descriptions); } public String getDescription() { InfoItem i = getBestMatchingDescriptionForSplash(); if (i == null) { return null; } return i.toNiceString(); } public List getHeader() { List r = new ArrayList(4); String t = getTitle(); String v = getVendor(); String h = getHomepage(); if (t != null) { r.add(t); } if (v != null) { r.add(v); } if (h != null) { r.add(h); } return r; } public static InformationElement createFromJNLP(JNLPFile file) { try { if (file == null) { String message = Translator.R(InfoItem.SPLASH + "errorInInformation"); InformationElement ie = new InformationElement(); ie.setHomepage(""); ie.setTitle(message); ie.setvendor(""); ie.addDescription(message); return ie; } if (file.getInformation() == null) { String message = Translator.R(InfoItem.SPLASH + "missingInformation"); InformationElement ie = new InformationElement(); ie.setHomepage(""); ie.setTitle(message); ie.setvendor(""); ie.addDescription(message); return ie; } InformationElement ie = new InformationElement(); String homePage = Translator.R(InfoItem.SPLASH + "defaultHomepage"); if (file.getInformation().getHomepage() != null) { homePage = file.getInformation().getHomepage().toString(); } ie.setHomepage(homePage); ie.setTitle(file.getInformation().getTitle()); ie.setvendor(file.getInformation().getVendor()); ie.addDescription(file.getInformation().getDescriptionStrict((String) (InformationDesc.DEFAULT))); ie.addDescription(file.getInformation().getDescriptionStrict(InfoItem.descriptionKindOneLine), InfoItem.descriptionKindOneLine); ie.addDescription(file.getInformation().getDescriptionStrict(InfoItem.descriptionKindShort), InfoItem.descriptionKindShort); ie.addDescription(file.getInformation().getDescriptionStrict(InfoItem.descriptionKindToolTip), InfoItem.descriptionKindToolTip); return ie; } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); String message = Translator.R(InfoItem.SPLASH + "errorInInformation"); InformationElement ie = new InformationElement(); ie.setHomepage(""); ie.setTitle(message); ie.setvendor(""); ie.addDescription(ex.getMessage()); return ie; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/DescriptionInfoItem.jav0000644000000000000000000000013213441742745030520 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/DescriptionInfoItem.java0000644000175000002070000001053313441742745031473 0ustar00jvanekmock00000000000000/* DescriptionInfoItem.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts; /** *description element: A short statement about the application. Description * elements are optional. The kind attribute defines how the description should * be used. It can have one of the following values: * * * one-line: If a reference to the application is going to appear on one row * in a list or a table, this description will be used. * * short: If a reference to the application is going to be displayed in a * situation where there is room for a paragraph, this description is used. * * tooltip: If a reference to the application is going to appear in a * tooltip, this description is used. * * Only one description element of each kind can be specified. A description * element without a kind is used as a default value. Thus, if Java Web Start * needs a description of kind short, and it is not specified in the JNLP file, * then the text from the description without an attribute is used. * * All descriptions contain plain text. No formatting, such as with HTML tags, * is supported. */ public class DescriptionInfoItem extends InfoItem { protected String kind; public DescriptionInfoItem(String value, String kind) { super(InfoItem.description, value); this.kind = kind; } public String getKind() { return kind; } public void setKind(String kind) { this.kind = kind; } public boolean isOfSameKind(DescriptionInfoItem o) { if (o.getKind() == null && getKind() == null) { return true; } if (o.getKind() == null && getKind() != null) { return false; } if (o.getKind() != null && getKind() == null) { return false; } return (o.getKind().equals(getKind())); } public boolean isSame(DescriptionInfoItem o) { return isOfSameKind(o) && isofSameType(o); } @Override public boolean equals(Object obj) { if (!(obj instanceof DescriptionInfoItem)) { return false; } DescriptionInfoItem o = (DescriptionInfoItem) obj; return super.equals(o) && isOfSameKind(o); } @Override public int hashCode() { int hash = 7; hash = 59 * hash + (this.kind != null ? this.kind.hashCode() : 0); hash = 59 * hash + (this.getType() != null ? this.getType().hashCode() : 0); hash = 59 * hash + (this.getValue() != null ? this.getValue().hashCode() : 0); return hash; } @Override public String toString() { return super.toString() + " (" + getKind() + ")"; } @Override public String toNiceString() { return super.toNiceString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/PaxHeaders.7406/extensions0000644000000000000000000000013213441742745026222 xustar0030 mtime=1552401893.048832804 30 atime=1552410887.113183443 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/0000755000175000002070000000000013441742745027107 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/PaxHeaders.7406/SplashExtens0000644000000000000000000000013113441742745030642 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/SplashExtension.java0000644000175000002070000000417513441742745033110 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts.extensions; import java.awt.Color; import java.awt.Graphics; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.BasePainter; public interface SplashExtension { public Color getBackground() ; public Color getTextColor() ; public Color getPluginTextColor(); public void adjustForSize(int w, int h) ; public void paint(Graphics g, BasePainter origin) ; public void animate(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/PaxHeaders.7406/NoExtension.0000644000000000000000000000013113441742745030550 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/NoExtension.java0000644000175000002070000000460413441742745032227 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts.extensions; import java.awt.Color; import java.awt.Graphics; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.BasePainter; public class NoExtension implements SplashExtension{ public NoExtension() { } @Override public Color getBackground() { return Color.white; } @Override public Color getTextColor() { return Color.black; } @Override public Color getPluginTextColor() { return Color.black; } @Override public void adjustForSize(int w, int h) { } @Override public void animate() { } @Override public void paint(Graphics g, BasePainter origin) { } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/PaxHeaders.7406/ChristmasExt0000644000000000000000000000013213441742745030640 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ChristmasExtension.java0000644000175000002070000002176213441742745033614 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts.extensions; import java.awt.Color; import java.awt.Graphics; import java.awt.Polygon; import java.util.ArrayList; import java.util.List; import java.util.Random; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.BasePainter; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.ErrorPainter; public class ChristmasExtension implements SplashExtension { @Override public Color getBackground() { return Color.black; } @Override public Color getTextColor() { return Color.DARK_GRAY; } @Override public Color getPluginTextColor() { return new Color(30, 30, 30); } ChristmasExtension() { this(0, 0); } private static final Random seed = new Random(); private static final int avarege_star_width = 10; //stars will be 5-15 private final int avarege_fall_speed = 4; //2-6 private final int avarege_rotation_speed = 2; //1-3 private class Star { private int radiusX; private int radiusY; private int maxRadiusX; private int maxRadiusY; private int centerX; private int centerY; private final int fallSpeed; private final boolean orientation; private final int[] originalColor = new int[3]; private final int[] color = new int[originalColor.length]; private int direction; private final boolean haveEight; public Star() { createRadiuses(); haveEight = seed.nextBoolean(); this.centerX = seed.nextInt(w + 1); this.centerY = seed.nextInt(h + 1); this.fallSpeed = avarege_fall_speed / 2 + seed.nextInt(avarege_fall_speed / 2); this.orientation = seed.nextBoolean(); this.direction = -(avarege_rotation_speed / 2 + seed.nextInt(avarege_rotation_speed / 2)); if (seed.nextInt(4) == 0) { originalColor[0] = Color.yellow.getRed(); originalColor[1] = Color.yellow.getGreen(); originalColor[2] = Color.yellow.getBlue(); } else { originalColor[0] = BasePainter.WATER_LIVE_COLOR.getRed(); originalColor[1] = BasePainter.WATER_LIVE_COLOR.getGreen(); originalColor[2] = BasePainter.WATER_LIVE_COLOR.getBlue(); } } public void paint(Graphics g, Color forceColor1, Color forceColor2) { Color c = g.getColor(); if (forceColor1 == null || forceColor2 == null) { g.setColor(new Color(color[0], color[1], color[2])); } else { g.setColor(ErrorPainter.interpolateColor(h, centerY, forceColor1, forceColor2)); } Polygon p = createPolygon(); if (haveEight) { int min1 = Math.min(radiusX, radiusY); int min2 = min1 / 2; g.fillRect(centerX - min2, centerY - min2, min1, min1); } g.fillPolygon(p); g.setColor(c); } private void animate() { centerY += fallSpeed; if (orientation) { radiusX += direction; if (radiusX <= -direction) { direction = -direction; radiusX = direction; } if (radiusX >= maxRadiusX) { direction = -direction; radiusX = maxRadiusX; } interpolateColors(radiusX, maxRadiusX); } else { radiusY += direction; if (radiusY <= -direction) { direction = -direction; radiusY = direction; } if (radiusY >= maxRadiusY) { direction = -direction; radiusY = maxRadiusY; } interpolateColors(radiusY, maxRadiusY); } if (centerY > h + radiusX * 2 || centerY > h + radiusY * 2) { createRadiuses(); this.centerX = seed.nextInt(w + 1); this.centerY = -radiusY * 2; } } private int createRadius() { return avarege_star_width / 2 + seed.nextInt(avarege_star_width); } private Polygon createPolygon() { int min = Math.min(radiusX, radiusY) / 3; Polygon p = new Polygon(); p.addPoint(centerX - radiusX, centerY); p.addPoint(centerX - min, centerY - min); p.addPoint(centerX, centerY - radiusY); p.addPoint(centerX + min, centerY - min); p.addPoint(centerX + radiusX, centerY); p.addPoint(centerX + min, centerY + min); p.addPoint(centerX, centerY + radiusY); p.addPoint(centerX - min, centerY + min); return p; } private void interpolateColors(int is, int max) { for (int i = 0; i < originalColor.length; i++) { int fadeMin; if (centerY < 0) { fadeMin = 0; } else if (centerY > h) { fadeMin = 255; } else { fadeMin = (int) ErrorPainter.interpol(h, centerY, 255, 0); //from white to black } int fadeMax; if (centerY < 0) { fadeMax = 0; } else if (centerY > h) { fadeMax = originalColor[i]; } else { fadeMax = (int) ErrorPainter.interpol(h, centerY, originalColor[i], 0); //from color tho black } color[i] = (int) ErrorPainter.interpol(max, is, fadeMin, fadeMax); } } private void createRadiuses() { this.radiusX = createRadius(); this.radiusY = radiusX; switch (seed.nextInt(3)) { case (0): radiusX = radiusX + (2 * radiusX) / 3; break; case (1): radiusY = radiusY + (2 * radiusY) / 3; break; case (2): //noop break; } maxRadiusX = radiusX; maxRadiusY = radiusY; } } private int w; private int h; private List stars = new ArrayList(50); ChristmasExtension(int w, int h) { adjustForSize(w, h); } @Override public void paint(Graphics g, BasePainter b) { for (ChristmasExtension.Star star : stars) { Color forceColor1 = null; Color forceColor2 = null; if (b instanceof ErrorPainter){ forceColor1 = b.getBackgroundColor(); forceColor2 = b.getWaterColor(); } star.paint(g, forceColor1, forceColor2); } } @Override public void animate() { for (ChristmasExtension.Star star : stars) { star.animate(); } } @Override public final void adjustForSize(int w, int h) { this.w = w; this.h = h; int count = w / (2 * (avarege_star_width + 1)); while (stars.size() > count) { stars.remove(stars.size() - 1); } while (stars.size() < count) { stars.add(new Star()); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/PaxHeaders.7406/ExtensionMan0000644000000000000000000000013213441742745030632 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ExtensionManager.java0000644000175000002070000000460413441742745033225 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.parts.extensions; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class ExtensionManager { private static SplashExtension currentExtension; public static SplashExtension getExtension() { if (currentExtension == null) { if (areChristmas()) { currentExtension = new ChristmasExtension(); } else { currentExtension = new NoExtension(); } } return currentExtension; } private static boolean areChristmas() { Calendar c = new GregorianCalendar(); c.setTime(new Date()); return c.get(Calendar.DAY_OF_YEAR) > 350; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/impls0000644000000000000000000000013213441742745024016 xustar0030 mtime=1552401893.070832758 30 atime=1552410887.113183443 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/0000755000175000002070000000000013441742745024703 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/PaxHeaders.7406/DefaultErrorSplashScree0000644000000000000000000000013213441742745030551 xustar0030 mtime=1552401893.070832758 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/DefaultErrorSplashScreen2012.java0000644000175000002070000000770413441742745032774 0ustar00jvanekmock00000000000000/* DefaultErrorSplashScreen12.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.ErrorPainter; import net.sourceforge.jnlp.splashscreen.parts.BasicComponentErrorSplashScreen; public final class DefaultErrorSplashScreen2012 extends BasicComponentErrorSplashScreen { private final ErrorPainter painter; private final DefaultSplashScreens2012Commons commons; public DefaultErrorSplashScreen2012(int width, int height, SplashReason splashReason, Throwable ex) { //setting width and height now is causing unnecessary blinking //setSplashHeight(height); //setSplashWidth(width); //to have this in inner classes setLoadingException(ex); setSplashReason(splashReason); painter = new ErrorPainter(this, true); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if ((painter).getErrorCorner() != null && e.getX() > (painter).getErrorCorner().x && e.getY() > (painter).getErrorCorner().y) { raiseExceptionDialog(); } } }); commons = new DefaultSplashScreens2012Commons(painter, this); } @Override public void paintComponent(Graphics g) { paintTo(g); } @Override public void paintTo(Graphics g) { commons.paintTo(g); } @Override public void adjustForSize() { commons.adjustForSize(); } @Override public void stopAnimation() { commons.stopAnimation(); } /** * Methods to start the animation in the splash panel. * * This method exits after starting a new thread to do the animation. It * is synchronized to prevent multiple startAnimation threads from being created. */ @Override public void startAnimation() { commons.startAnimation(); } @Override public void setPercentage(int done) { commons.setPercentage(done); } @Override public int getPercentage() { return commons.getPercentage(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/PaxHeaders.7406/defaultsplashscreen20120000644000000000000000000000013213441742745030362 xustar0030 mtime=1552401893.070832758 30 atime=1552410887.113183443 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/0000755000175000002070000000000013441742745031247 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000013213441742745030362 xustar0030 mtime=1552401893.070832758 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubic.java0000644000175000002070000001140313441742745033601 0ustar00jvanekmock00000000000000/* NatCubic.java Copyright (C) 2012 Tim Lambert, Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.*; public class NatCubic extends ControlCurve { /* * This class is part of the NatCubic implementation (http://www.cse.unsw.edu.au/~lambert/) * which does not have a license. The author (Tim Lambert) has agreed to * license this under GPL+Classpath by email * */ /* NatCubic calcualtion calculates the natural cubic spline that interpolates y[0], y[1], ... y[n] The first segment is returned as C[0].a + C[0].b*u + C[0].c*u^2 + C[0].d*u^3 0<=u <1 the other segments are in C[1], C[2], ... C[n-1] */ Cubic[] calcNaturalCubic(int n, int[] x) { float[] gamma = new float[n + 1]; float[] delta = new float[n + 1]; float[] D = new float[n + 1]; int i; /* We solve the equation [2 1 ] [D[0]] [3(x[1] - x[0]) ] |1 4 1 | |D[1]| |3(x[2] - x[0]) | | 1 4 1 | | . | = | . | | ..... | | . | | . | | 1 4 1| | . | |3(x[n] - x[n-2])| [ 1 2] [D[n]] [3(x[n] - x[n-1])] by using row operations to convert the matrix to upper triangular and then back sustitution. The D[i] are the derivatives at the knots. */ gamma[0] = 1.0f / 2.0f; for (i = 1; i < n; i++) { gamma[i] = 1 / (4 - gamma[i - 1]); } gamma[n] = 1 / (2 - gamma[n - 1]); delta[0] = 3 * (x[1] - x[0]) * gamma[0]; for (i = 1; i < n; i++) { delta[i] = (3 * (x[i + 1] - x[i - 1]) - delta[i - 1]) * gamma[i]; } delta[n] = (3 * (x[n] - x[n - 1]) - delta[n - 1]) * gamma[n]; D[n] = delta[n]; for (i = n - 1; i >= 0; i--) { D[i] = delta[i] - gamma[i] * D[i + 1]; } /* now compute the coefficients of the cubics */ Cubic[] C = new Cubic[n]; for (i = 0; i < n; i++) { C[i] = new Cubic((float) x[i], D[i], 3 * (x[i + 1] - x[i]) - 2 * D[i] - D[i + 1], 2 * (x[i] - x[i + 1]) + D[i] + D[i + 1]); } return C; } final int STEPS = 12; /* draw a cubic spline */ @Override public void paint(Graphics g) { super.paint(g); if (pts.npoints >= 2) { if (getResult() == null) { calcualteAndSaveResult(); } g.drawPolyline(result.xpoints, result.ypoints, result.npoints); } } @Override public Polygon calcualteResult() { Cubic[] X = calcNaturalCubic(pts.npoints - 1, pts.xpoints); Cubic[] Y = calcNaturalCubic(pts.npoints - 1, pts.ypoints); /* very crude technique - just break each segment up into steps lines */ Polygon p = new Polygon(); p.addPoint(Math.round(X[0].eval(0)), Math.round(Y[0].eval(0))); for (int i = 0; i < X.length; i++) { for (int j = 1; j <= STEPS; j++) { float u = j / (float) STEPS; p.addPoint(Math.round(X[i].eval(u)), Math.round(Y[i].eval(u))); } } return p; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000031213441742745030362 xustar00112 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.java 30 mtime=1552401893.044832812 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.ja0000644000175000002070000002424613441742745034207 0ustar00jvanekmock00000000000000/* ErrorPainter.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.util.Observable; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.splashscreen.parts.BasicComponentSplashScreen; import net.sourceforge.jnlp.splashscreen.parts.InformationElement; import net.sourceforge.jnlp.splashscreen.parts.extensions.ExtensionManager; import net.sourceforge.jnlp.util.logging.OutputController; public final class ErrorPainter extends BasePainter { //colors private static final Color TEA_DEAD_COLOR = Color.darkGray; private static final Color BACKGROUND_DEAD_COLOR = Color.gray; private static final Color TEA_LEAFS_STALKS_DEAD_COLOR = new Color(100, 100, 100); private static final Color PLUGIN_DEAD_COLOR = Color.darkGray; private static final Color WATER_DEAD_COLOR = Color.darkGray; private static final Color PLAIN_TEXT_DEAD_COLOR = Color.white; private static final String ERROR_MESSAGE_KEY = "SPLASHerror"; private static final String ERROR_FLY_MESSAGE_KEY = "SPLASH_ERROR"; private static final Color ERROR_FLY_COLOR = Color.red; //for clicking ot error message private Point errorCorner = null; private boolean errorIsFlying = false; private int errorFlyPercentage = 100; /** * Interpolation is root ratior is r= (currentSize / origSize) * then value to-from is interpolaed from to to from accroding to ratio * * @param origSize * @param currentSize * @param from * @param to * @return interpolated value */ public static double interpol(double origSize, double currentSize, double from, double to) { return getRatio(origSize, currentSize) * (to - from) + from; } /** * is interpolating one color to another based on ration current/orig * Each (r,g,b,a) part of color is interpolated separately * resturned is new color composed form new r,g,b,a * @param origSize * @param currentSize * @param from * @param to * @return interpolated {@link Color} */ public static Color interpolateColor(double origSize, double currentSize, Color from, Color to) { double r = interpol(origSize, currentSize, to.getRed(), from.getRed()); double g = interpol(origSize, currentSize, to.getGreen(), from.getGreen()); double b = interpol(origSize, currentSize, to.getBlue(), from.getBlue()); double a = interpol(origSize, currentSize, to.getAlpha(), from.getAlpha()); return new Color((int) r, (int) g, (int) b, (int) a); } //scaling end public ErrorPainter(BasicComponentSplashScreen master) { this(master, false); } public ErrorPainter(BasicComponentSplashScreen master, boolean startScream) { super(master); if (startScream) { startErrorScream(); } } public void startErrorScream() { errorIsFlying = true; getFlyingRedErrorTextThread().start(); } @Override public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; ensurePrerenderedStuff(); if (errorIsFlying) { paintStillTo(g2d, master.getInformationElement(), master.getVersion()); } else { if (prerenderedStuff != null) { g2d.drawImage(prerenderedStuff, 0, 0, null); } } if (super.showNiceTexts) { ExtensionManager.getExtension().paint(g, this); paintNiceTexts(g2d); } else { paintPlainTexts(g2d); } if (errorIsFlying) { g2d.setClip(0, 0, master.getSplashWidth(), master.getSplashHeight()); drawBigError(g2d); } } private void drawBigError(Graphics2D g2d) { Font f = new Font("Serif", Font.PLAIN, (int) scale(100, errorFlyPercentage, master.getSplashHeight())); g2d.setColor(ERROR_FLY_COLOR); g2d.setFont(f); drawTextAroundCenter(g2d, 0, geFlyingErrorMessage()); } public Point getErrorCorner() { return errorCorner; } private void setColors() { teaColor = TEA_DEAD_COLOR; backgroundColor = BACKGROUND_DEAD_COLOR; teaLeafsStalksColor = TEA_LEAFS_STALKS_DEAD_COLOR; pluginColor = PLUGIN_DEAD_COLOR; waterColor = WATER_DEAD_COLOR; } private void interpolateColor(int origSize, int currentSize) { teaColor = interpolateColor(origSize, currentSize, TEA_LIVE_COLOR, TEA_DEAD_COLOR); backgroundColor = interpolateColor(origSize, currentSize, BACKGROUND_LIVE_COLOR, BACKGROUND_DEAD_COLOR); teaLeafsStalksColor = interpolateColor(origSize, currentSize, TEA_LEAFS_STALKS_LIVE_COLOR, TEA_LEAFS_STALKS_DEAD_COLOR); pluginColor = interpolateColor(origSize, currentSize, PLUGIN_LIVE_COLOR, PLUGIN_DEAD_COLOR); waterColor = interpolateColor(origSize, currentSize, WATER_LIVE_COLOR, WATER_DEAD_COLOR); plainTextColor = interpolateColor(origSize, currentSize, PLAIN_TEXT_LIVE_COLOR, PLAIN_TEXT_DEAD_COLOR); } @Override protected void paintStillTo(Graphics2D g2d, InformationElement ic, String version) { RenderingHints r = g2d.getRenderingHints(); FontMetrics fm = drawBase(g2d, ic, version); drawError(g2d, ic, version, fm); g2d.setRenderingHints(r); } private String getErrorMessage() { String localised = Translator.R(ERROR_MESSAGE_KEY); //if (localised==null)return errorMessage; return localised; } private String geFlyingErrorMessage() { String localised = Translator.R(ERROR_FLY_MESSAGE_KEY); return localised; } private Thread getFlyingRedErrorTextThread() { // Create a new thread to draw big flying error in case of failure Thread t = new Thread(new FlyingRedErrorTextRunner(this)); //t.setDaemon(true); return t; } private final class FlyingRedErrorTextRunner extends Observable implements Runnable { private static final int FLYING_ERROR_PERCENTAGE_INCREMENT = -3; private static final int FLYING_ERROR_PERCENTAGE_MINIMUM = 5; private static final int FLYING_ERROR_PERCENTAGE_LOWER_BOUND = 80; private static final int FLYING_ERROR_PERCENTAGE_UPPER_BOUND = 90; private static final int FLYING_ERROR_DELAY = 75; private FlyingRedErrorTextRunner(ErrorPainter o) { this.addObserver(o); } @Override public void run() { try { while (errorIsFlying) { errorFlyPercentage += FLYING_ERROR_PERCENTAGE_INCREMENT; interpolateColor(100, errorFlyPercentage); if (errorFlyPercentage <= FLYING_ERROR_PERCENTAGE_MINIMUM) { errorIsFlying = false; setColors(); prerenderedStuff = null; } this.setChanged(); this.notifyObservers(); Thread.sleep(FLYING_ERROR_DELAY); if (errorFlyPercentage < FLYING_ERROR_PERCENTAGE_UPPER_BOUND && errorFlyPercentage > FLYING_ERROR_PERCENTAGE_LOWER_BOUND) { clearCachedWaterTextImage(); canWave = false; } } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } finally { canWave = true; errorIsFlying = false; setColors(); prerenderedStuff = null; master.repaint(); } } }; private void drawError(Graphics2D g2d, InformationElement ic, String version, FontMetrics fm) { int minh = fm.getHeight(); int minw = fm.stringWidth(getErrorMessage()); int space = 5; g2d.setColor(backgroundColor); errorCorner = new Point(master.getSplashWidth() - space * 4 - minw, master.getSplashHeight() - space * 4 - minh); if (errorCorner.x < 0) { errorCorner.x = 0; } g2d.fillRect(errorCorner.x, errorCorner.y, space * 4 + minw, space * 4 + minh); g2d.setColor(plainTextColor); g2d.drawRect(errorCorner.x + space, errorCorner.y + space, space * 2 + minw, space * 2 + minh); g2d.drawString(getErrorMessage(), errorCorner.x + 2 * space, errorCorner.y + 5 * space); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000031113441742745030361 xustar00111 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/SplinesDefs.java 30 mtime=1552401893.042832816 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/SplinesDefs.jav0000644000175000002070000013412013441742745034171 0ustar00jvanekmock00000000000000/* SplinesDefs.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.imageio.ImageIO; public class SplinesDefs { private final static Point[] blackLeaf = { new Point(267, 204), new Point(267, 205), new Point(267, 206), new Point(268, 206), new Point(268, 207), new Point(268, 208), new Point(268, 209), new Point(269, 209), new Point(269, 210), new Point(270, 210), new Point(270, 211), new Point(271, 211), new Point(271, 212), new Point(272, 212), new Point(273, 212), new Point(274, 212), new Point(275, 212), new Point(276, 212), new Point(277, 212), new Point(278, 212), new Point(279, 212), new Point(280, 212), new Point(281, 212), new Point(282, 212), new Point(283, 212), new Point(284, 212), new Point(285, 212), new Point(286, 212), new Point(287, 212), new Point(288, 212), new Point(289, 212), new Point(290, 212), new Point(291, 212), new Point(292, 212), new Point(293, 212), new Point(294, 212), new Point(295, 212), new Point(296, 212), new Point(297, 212), new Point(298, 212), new Point(299, 212), new Point(300, 212), new Point(301, 212), new Point(302, 212), new Point(303, 212), new Point(304, 212), new Point(305, 212), new Point(306, 212), new Point(307, 212), new Point(308, 212), new Point(309, 212), new Point(310, 212), new Point(311, 212), new Point(311, 213), new Point(312, 213), new Point(313, 213), new Point(314, 213), new Point(314, 214), new Point(315, 214), new Point(316, 214), new Point(317, 214), new Point(317, 215), new Point(318, 215), new Point(319, 215), new Point(319, 216), new Point(320, 216), new Point(321, 216), new Point(321, 217), new Point(322, 217), new Point(322, 218), new Point(323, 218), new Point(324, 218), new Point(325, 218), new Point(326, 218), new Point(327, 218), new Point(328, 218), new Point(329, 217), new Point(330, 216), new Point(331, 215), new Point(332, 214), new Point(333, 213), new Point(334, 212), new Point(334, 211), new Point(335, 210), new Point(335, 209), new Point(336, 208), new Point(337, 207), new Point(338, 206), new Point(338, 205), new Point(339, 204), new Point(340, 203), new Point(341, 202), new Point(342, 201), new Point(343, 200), new Point(344, 199), new Point(345, 198), new Point(346, 197), new Point(347, 196), new Point(348, 195), new Point(349, 194), new Point(350, 193), new Point(351, 192), new Point(352, 191), new Point(353, 190), new Point(354, 189), new Point(355, 188), new Point(356, 187), new Point(357, 186), new Point(358, 185), new Point(359, 184), new Point(360, 183), new Point(361, 182), new Point(362, 181), new Point(363, 180), new Point(364, 179), new Point(365, 179), new Point(366, 178), new Point(367, 177), new Point(368, 177), new Point(369, 176), new Point(370, 175), new Point(371, 175), new Point(372, 175), new Point(373, 175), new Point(373, 176), new Point(372, 177), new Point(372, 178), new Point(371, 179), new Point(371, 180), new Point(370, 181), new Point(369, 182), new Point(369, 183), new Point(368, 184), new Point(367, 185), new Point(367, 186), new Point(366, 187), new Point(365, 188), new Point(365, 189), new Point(364, 190), new Point(363, 191), new Point(363, 192), new Point(362, 193), new Point(361, 194), new Point(360, 195), new Point(360, 196), new Point(359, 197), new Point(359, 198), new Point(359, 199), new Point(358, 200), new Point(357, 201), new Point(356, 202), new Point(355, 203), new Point(355, 204), new Point(355, 205), new Point(354, 206), new Point(353, 207), new Point(353, 208), new Point(352, 209), new Point(351, 210), new Point(350, 211), new Point(350, 212), new Point(349, 213), new Point(349, 214), new Point(349, 215), new Point(348, 216), new Point(347, 217), new Point(346, 218), new Point(346, 219), new Point(345, 220), new Point(345, 221), new Point(345, 222), new Point(344, 223), new Point(344, 224), new Point(343, 225), new Point(342, 226), new Point(341, 227), new Point(341, 228), new Point(341, 229), new Point(340, 230), new Point(340, 231), new Point(340, 232), new Point(340, 233), new Point(340, 234), new Point(340, 235), new Point(341, 235), new Point(341, 236), new Point(342, 236), new Point(342, 237), new Point(343, 237), new Point(343, 238), new Point(343, 239), new Point(344, 239), new Point(344, 240), new Point(345, 240), new Point(345, 241), new Point(345, 242), new Point(346, 242), new Point(346, 243), new Point(347, 243), new Point(347, 244), new Point(348, 244), new Point(348, 245), new Point(348, 246), new Point(349, 246), new Point(349, 247), new Point(349, 248), new Point(349, 249), new Point(350, 249), new Point(350, 250), new Point(350, 251), new Point(351, 251), new Point(351, 252), new Point(351, 253), new Point(352, 253), new Point(352, 254), new Point(352, 255), new Point(353, 255), new Point(353, 256), new Point(353, 257), new Point(353, 258), new Point(354, 258), new Point(354, 259), new Point(354, 260), new Point(354, 261), new Point(354, 262), new Point(354, 263), new Point(355, 263), new Point(355, 264), new Point(355, 265), new Point(355, 266), new Point(355, 267), new Point(356, 267), new Point(356, 268), new Point(356, 269), new Point(356, 270), new Point(356, 271), new Point(356, 272), new Point(356, 273), new Point(357, 273), new Point(357, 274), new Point(357, 275), new Point(357, 276), new Point(357, 277), new Point(358, 277), new Point(358, 278), new Point(358, 279), new Point(358, 280), new Point(358, 281), new Point(358, 282), new Point(358, 283), new Point(358, 284), new Point(358, 285), new Point(358, 286), new Point(358, 287), new Point(358, 288), new Point(358, 289), new Point(358, 290), new Point(358, 291), new Point(358, 292), new Point(358, 293), new Point(358, 294), new Point(357, 295), new Point(357, 296), new Point(357, 297), new Point(357, 298), new Point(356, 299), new Point(356, 300), new Point(356, 301), new Point(356, 302), new Point(356, 303), new Point(356, 304), new Point(356, 305), new Point(357, 305), new Point(357, 306), new Point(358, 306), new Point(358, 307), new Point(359, 307), new Point(359, 308), new Point(360, 308), new Point(361, 308), new Point(361, 309), new Point(362, 309), new Point(363, 309), new Point(364, 309), new Point(365, 308), new Point(366, 308), new Point(367, 308), new Point(368, 307), new Point(369, 306), new Point(370, 306), new Point(371, 305), new Point(372, 305), new Point(373, 305), new Point(374, 304), new Point(375, 304), new Point(376, 303), new Point(377, 302), new Point(378, 302), new Point(379, 301), new Point(380, 300), new Point(381, 300), new Point(382, 299), new Point(383, 299), new Point(384, 299), new Point(385, 298), new Point(386, 297), new Point(387, 296), new Point(388, 295), new Point(389, 294), new Point(390, 294), new Point(391, 293), new Point(392, 293), new Point(393, 292), new Point(394, 291), new Point(395, 290), new Point(396, 289), new Point(397, 288), new Point(398, 287), new Point(399, 286), new Point(400, 285), new Point(401, 284), new Point(402, 283), new Point(403, 282), new Point(404, 281), new Point(405, 280), new Point(406, 279), new Point(407, 278), new Point(408, 277), new Point(409, 276), new Point(409, 275), new Point(410, 274), new Point(411, 273), new Point(412, 272), new Point(413, 271), new Point(414, 270), new Point(415, 269), new Point(415, 268), new Point(416, 267), new Point(416, 266), new Point(417, 265), new Point(418, 264), new Point(418, 263), new Point(419, 262), new Point(420, 261), new Point(420, 260), new Point(420, 259), new Point(421, 258), new Point(421, 257), new Point(422, 256), new Point(422, 255), new Point(422, 254), new Point(423, 253), new Point(424, 252), new Point(424, 251), new Point(424, 250), new Point(425, 249), new Point(426, 248), new Point(426, 247), new Point(426, 246), new Point(426, 245), new Point(427, 244), new Point(427, 243), new Point(428, 242), new Point(428, 241), new Point(428, 240), new Point(429, 239), new Point(429, 238), new Point(429, 237), new Point(429, 236), new Point(430, 235), new Point(430, 234), new Point(431, 233), new Point(431, 232), new Point(431, 231), new Point(431, 230), new Point(431, 229), new Point(431, 228), new Point(432, 227), new Point(432, 226), new Point(432, 225), new Point(432, 224), new Point(432, 223), new Point(433, 222), new Point(433, 221), new Point(433, 220), new Point(433, 219), new Point(433, 218), new Point(433, 217), new Point(433, 216), new Point(434, 215), new Point(434, 214), new Point(434, 213), new Point(434, 212), new Point(434, 211), new Point(434, 210), new Point(435, 209), new Point(435, 208), new Point(435, 207), new Point(435, 206), new Point(435, 205), new Point(435, 204), new Point(435, 203), new Point(435, 202), new Point(435, 201), new Point(435, 200), new Point(435, 199), new Point(435, 198), new Point(435, 197), new Point(435, 196), new Point(435, 195), new Point(435, 194), new Point(435, 193), new Point(435, 192), new Point(435, 191), new Point(435, 190), new Point(435, 189), new Point(435, 188), new Point(435, 187), new Point(435, 186), new Point(435, 185), new Point(435, 184), new Point(435, 183), new Point(435, 182), new Point(435, 181), new Point(435, 180), new Point(435, 179), new Point(435, 178), new Point(434, 178), new Point(434, 177), new Point(434, 176), new Point(434, 175), new Point(434, 174), new Point(434, 173), new Point(434, 172), new Point(434, 171), new Point(433, 171), new Point(433, 170), new Point(433, 169), new Point(433, 168), new Point(433, 167), new Point(433, 166), new Point(433, 165), new Point(432, 165), new Point(432, 164), new Point(432, 163), new Point(432, 162), new Point(432, 161), new Point(432, 160), new Point(432, 159), new Point(431, 159), new Point(431, 158), new Point(431, 157), new Point(431, 156), new Point(431, 155), new Point(431, 154), new Point(430, 154), new Point(430, 153), new Point(430, 152), new Point(430, 151), new Point(430, 150), new Point(429, 150), new Point(429, 149), new Point(429, 148), new Point(428, 148), new Point(428, 147), new Point(428, 146), new Point(428, 145), new Point(428, 144), new Point(427, 144), new Point(427, 143), new Point(427, 142), new Point(427, 141), new Point(426, 141), new Point(426, 140), new Point(426, 139), new Point(426, 138), new Point(425, 138), new Point(425, 137), new Point(425, 136), new Point(425, 135), new Point(424, 135), new Point(424, 134), new Point(423, 134), new Point(423, 133), new Point(423, 132), new Point(422, 132), new Point(422, 131), new Point(422, 130), new Point(422, 129), new Point(421, 129), new Point(421, 128), new Point(421, 127), new Point(420, 127), new Point(420, 126), new Point(420, 125), new Point(419, 125), new Point(419, 124), new Point(418, 124), new Point(418, 123), new Point(418, 122), new Point(417, 122), new Point(417, 121), new Point(416, 121), new Point(416, 120), new Point(415, 120), new Point(414, 120), new Point(414, 119), new Point(413, 119), new Point(412, 119), new Point(411, 119), new Point(410, 119), new Point(409, 119), new Point(408, 119), new Point(407, 119), new Point(406, 119), new Point(405, 119), new Point(405, 118), new Point(404, 118), new Point(403, 118), new Point(402, 118), new Point(401, 118), new Point(400, 118), new Point(399, 118), new Point(398, 118), new Point(397, 118), new Point(396, 118), new Point(395, 118), new Point(394, 118), new Point(393, 118), new Point(392, 118), new Point(391, 118), new Point(390, 118), new Point(389, 118), new Point(388, 118), new Point(387, 118), new Point(386, 118), new Point(385, 118), new Point(384, 118), new Point(383, 118), new Point(382, 118), new Point(381, 118), new Point(380, 119), new Point(379, 119), new Point(378, 119), new Point(377, 119), new Point(376, 119), new Point(375, 119), new Point(374, 119), new Point(373, 119), new Point(372, 119), new Point(371, 119), new Point(370, 120), new Point(369, 120), new Point(368, 120), new Point(367, 120), new Point(366, 120), new Point(365, 120), new Point(364, 120), new Point(363, 120), new Point(362, 121), new Point(361, 121), new Point(360, 121), new Point(359, 121), new Point(358, 121), new Point(357, 122), new Point(356, 122), new Point(355, 122), new Point(354, 122), new Point(353, 123), new Point(352, 124), new Point(351, 124), new Point(350, 124), new Point(349, 125), new Point(348, 125), new Point(347, 125), new Point(346, 125), new Point(345, 125), new Point(344, 126), new Point(343, 126), new Point(342, 126), new Point(341, 127), new Point(340, 127), new Point(339, 127), new Point(338, 128), new Point(337, 129), new Point(336, 129), new Point(335, 130), new Point(334, 130), new Point(333, 130), new Point(332, 131), new Point(331, 131), new Point(330, 132), new Point(329, 133), new Point(328, 133), new Point(327, 133), new Point(326, 134), new Point(325, 134), new Point(324, 135), new Point(323, 136), new Point(322, 136), new Point(321, 137), new Point(320, 138), new Point(319, 138), new Point(318, 139), new Point(317, 140), new Point(316, 140), new Point(315, 141), new Point(314, 142), new Point(313, 142), new Point(312, 143), new Point(311, 144), new Point(310, 145), new Point(309, 145), new Point(308, 146), new Point(307, 147), new Point(306, 147), new Point(305, 148), new Point(304, 149), new Point(303, 150), new Point(302, 151), new Point(301, 152), new Point(300, 153), new Point(299, 154), new Point(298, 155), new Point(297, 156), new Point(296, 157), new Point(295, 158), new Point(294, 159), new Point(293, 160), new Point(292, 161), new Point(291, 162), new Point(290, 163), new Point(289, 164), new Point(288, 165), new Point(287, 166), new Point(286, 167), new Point(285, 168), new Point(284, 169), new Point(284, 170), new Point(283, 171), new Point(282, 172), new Point(281, 173), new Point(281, 174), new Point(281, 175), new Point(280, 176), new Point(279, 177), new Point(279, 178), new Point(278, 179), new Point(277, 180), new Point(276, 181), new Point(276, 182), new Point(276, 183), new Point(275, 184), new Point(274, 185), new Point(274, 186), new Point(274, 187), new Point(273, 188), new Point(273, 189), new Point(272, 190), new Point(272, 191), new Point(272, 192), new Point(271, 193), new Point(270, 194), new Point(270, 195), new Point(270, 196), new Point(269, 197), new Point(269, 198), new Point(269, 199), new Point(268, 200), new Point(268, 201) }; private final static Point[] redLeaf = { new Point(348, 331), new Point(348, 332), new Point(348, 333), new Point(348, 334), new Point(348, 335), new Point(348, 336), new Point(349, 336), new Point(349, 337), new Point(349, 338), new Point(350, 338), new Point(350, 339), new Point(351, 339), new Point(351, 340), new Point(352, 340), new Point(353, 340), new Point(353, 341), new Point(354, 341), new Point(355, 341), new Point(355, 342), new Point(356, 342), new Point(357, 342), new Point(357, 343), new Point(358, 343), new Point(359, 343), new Point(360, 343), new Point(360, 344), new Point(361, 344), new Point(361, 345), new Point(362, 345), new Point(363, 345), new Point(363, 346), new Point(364, 346), new Point(365, 346), new Point(365, 347), new Point(366, 347), new Point(367, 347), new Point(368, 347), new Point(368, 348), new Point(369, 348), new Point(370, 348), new Point(371, 348), new Point(371, 349), new Point(372, 349), new Point(373, 349), new Point(373, 350), new Point(374, 350), new Point(375, 350), new Point(375, 351), new Point(376, 351), new Point(377, 351), new Point(377, 352), new Point(378, 352), new Point(379, 352), new Point(380, 352), new Point(381, 352), new Point(382, 352), new Point(382, 353), new Point(383, 353), new Point(384, 353), new Point(385, 353), new Point(386, 353), new Point(386, 354), new Point(387, 354), new Point(388, 354), new Point(389, 354), new Point(390, 354), new Point(390, 355), new Point(391, 355), new Point(392, 355), new Point(393, 355), new Point(393, 356), new Point(394, 356), new Point(395, 356), new Point(396, 356), new Point(397, 356), new Point(398, 356), new Point(399, 356), new Point(399, 357), new Point(400, 357), new Point(401, 357), new Point(402, 357), new Point(403, 357), new Point(404, 357), new Point(405, 357), new Point(406, 357), new Point(407, 357), new Point(408, 357), new Point(409, 357), new Point(410, 357), new Point(411, 357), new Point(412, 357), new Point(413, 357), new Point(414, 357), new Point(415, 357), new Point(416, 357), new Point(417, 357), new Point(418, 357), new Point(419, 357), new Point(420, 357), new Point(421, 357), new Point(422, 357), new Point(423, 356), new Point(424, 356), new Point(425, 356), new Point(426, 356), new Point(427, 356), new Point(428, 356), new Point(429, 356), new Point(430, 355), new Point(431, 355), new Point(432, 355), new Point(433, 354), new Point(434, 354), new Point(435, 354), new Point(436, 354), new Point(437, 354), new Point(438, 353), new Point(439, 353), new Point(440, 352), new Point(441, 352), new Point(442, 352), new Point(443, 352), new Point(444, 352), new Point(445, 351), new Point(446, 351), new Point(447, 351), new Point(448, 350), new Point(449, 350), new Point(450, 349), new Point(451, 348), new Point(452, 348), new Point(453, 347), new Point(454, 347), new Point(455, 346), new Point(456, 346), new Point(457, 346), new Point(458, 346), new Point(459, 345), new Point(460, 344), new Point(461, 343), new Point(462, 343), new Point(463, 343), new Point(464, 342), new Point(465, 341), new Point(466, 340), new Point(467, 340), new Point(468, 340), new Point(469, 339), new Point(470, 338), new Point(471, 337), new Point(472, 336), new Point(473, 336), new Point(474, 335), new Point(475, 334), new Point(476, 334), new Point(477, 333), new Point(478, 332), new Point(479, 331), new Point(480, 330), new Point(481, 329), new Point(482, 328), new Point(483, 327), new Point(484, 326), new Point(485, 325), new Point(486, 324), new Point(487, 323), new Point(488, 322), new Point(489, 321), new Point(490, 320), new Point(491, 319), new Point(492, 318), new Point(493, 317), new Point(494, 316), new Point(495, 315), new Point(496, 314), new Point(497, 313), new Point(498, 312), new Point(499, 311), new Point(500, 310), new Point(501, 309), new Point(501, 308), new Point(502, 307), new Point(503, 306), new Point(504, 305), new Point(505, 304), new Point(506, 303), new Point(506, 302), new Point(507, 301), new Point(507, 300), new Point(508, 299), new Point(509, 298), new Point(510, 297), new Point(511, 296), new Point(511, 295), new Point(511, 294), new Point(512, 293), new Point(512, 292), new Point(513, 291), new Point(514, 290), new Point(515, 289), new Point(515, 288), new Point(515, 287), new Point(516, 286), new Point(517, 285), new Point(517, 284), new Point(517, 283), new Point(518, 282), new Point(518, 281), new Point(519, 280), new Point(520, 279), new Point(521, 278), new Point(521, 277), new Point(521, 276), new Point(521, 275), new Point(522, 274), new Point(523, 273), new Point(523, 272), new Point(523, 271), new Point(523, 270), new Point(524, 269), new Point(524, 268), new Point(525, 267), new Point(525, 266), new Point(525, 265), new Point(526, 264), new Point(526, 263), new Point(527, 262), new Point(527, 261), new Point(527, 260), new Point(527, 259), new Point(528, 258), new Point(528, 257), new Point(528, 256), new Point(528, 255), new Point(528, 254), new Point(529, 253), new Point(529, 252), new Point(529, 251), new Point(529, 250), new Point(529, 249), new Point(529, 248), new Point(529, 247), new Point(529, 246), new Point(528, 246), new Point(528, 245), new Point(527, 245), new Point(527, 244), new Point(526, 244), new Point(526, 243), new Point(525, 243), new Point(525, 242), new Point(524, 242), new Point(524, 241), new Point(523, 241), new Point(523, 240), new Point(523, 239), new Point(522, 239), new Point(522, 238), new Point(521, 238), new Point(520, 238), new Point(520, 237), new Point(519, 237), new Point(519, 236), new Point(518, 236), new Point(518, 235), new Point(517, 235), new Point(517, 234), new Point(516, 234), new Point(516, 233), new Point(515, 233), new Point(515, 232), new Point(514, 232), new Point(514, 231), new Point(513, 231), new Point(512, 231), new Point(512, 230), new Point(511, 230), new Point(511, 229), new Point(510, 229), new Point(510, 228), new Point(509, 228), new Point(509, 227), new Point(508, 227), new Point(507, 227), new Point(507, 226), new Point(506, 226), new Point(506, 225), new Point(505, 225), new Point(505, 224), new Point(504, 224), new Point(503, 224), new Point(503, 223), new Point(502, 223), new Point(502, 222), new Point(501, 222), new Point(500, 222), new Point(500, 221), new Point(499, 221), new Point(499, 220), new Point(498, 220), new Point(497, 220), new Point(497, 219), new Point(496, 219), new Point(496, 218), new Point(495, 218), new Point(494, 218), new Point(494, 217), new Point(493, 217), new Point(492, 217), new Point(492, 216), new Point(491, 216), new Point(490, 216), new Point(490, 215), new Point(489, 215), new Point(488, 215), new Point(488, 214), new Point(487, 214), new Point(487, 213), new Point(486, 213), new Point(485, 213), new Point(485, 212), new Point(484, 212), new Point(483, 212), new Point(483, 211), new Point(482, 211), new Point(481, 211), new Point(480, 211), new Point(480, 210), new Point(479, 210), new Point(478, 210), new Point(478, 209), new Point(477, 209), new Point(476, 209), new Point(476, 208), new Point(475, 208), new Point(474, 208), new Point(474, 207), new Point(473, 207), new Point(472, 207), new Point(471, 207), new Point(471, 206), new Point(470, 206), new Point(469, 206), new Point(468, 206), new Point(468, 205), new Point(467, 205), new Point(466, 205), new Point(465, 205), new Point(465, 204), new Point(464, 204), new Point(463, 204), new Point(462, 204), new Point(461, 204), new Point(461, 203), new Point(460, 203), new Point(459, 203), new Point(459, 202), new Point(458, 202), new Point(457, 202), new Point(456, 202), new Point(455, 202), new Point(454, 202), new Point(453, 202), new Point(452, 203), new Point(451, 204), new Point(450, 205), new Point(449, 206), new Point(449, 207), new Point(449, 208), new Point(449, 209), new Point(449, 210), new Point(449, 211), new Point(449, 212), new Point(449, 213), new Point(449, 214), new Point(449, 215), new Point(449, 216), new Point(449, 217), new Point(449, 218), new Point(449, 219), new Point(448, 220), new Point(448, 221), new Point(448, 222), new Point(448, 223), new Point(448, 224), new Point(447, 225), new Point(447, 226), new Point(447, 227), new Point(447, 228), new Point(446, 229), new Point(446, 230), new Point(446, 231), new Point(446, 232), new Point(445, 233), new Point(445, 234), new Point(445, 235), new Point(445, 236), new Point(444, 237), new Point(444, 238), new Point(443, 239), new Point(443, 240), new Point(442, 241), new Point(442, 242), new Point(441, 243), new Point(441, 244), new Point(441, 245), new Point(441, 246), new Point(440, 247), new Point(439, 248), new Point(439, 249), new Point(439, 250), new Point(438, 251), new Point(438, 252), new Point(438, 253), new Point(438, 254), new Point(438, 255), new Point(439, 255), new Point(439, 256), new Point(439, 257), new Point(440, 257), new Point(440, 258), new Point(441, 258), new Point(442, 258), new Point(442, 259), new Point(443, 259), new Point(444, 259), new Point(445, 259), new Point(446, 259), new Point(447, 259), new Point(448, 259), new Point(449, 259), new Point(450, 259), new Point(451, 259), new Point(452, 259), new Point(453, 259), new Point(454, 259), new Point(455, 259), new Point(456, 259), new Point(457, 259), new Point(458, 259), new Point(459, 259), new Point(460, 259), new Point(461, 259), new Point(462, 259), new Point(462, 260), new Point(463, 260), new Point(464, 260), new Point(465, 260), new Point(465, 261), new Point(464, 262), new Point(463, 263), new Point(462, 263), new Point(461, 263), new Point(460, 264), new Point(459, 264), new Point(458, 264), new Point(457, 264), new Point(456, 265), new Point(455, 265), new Point(454, 265), new Point(453, 266), new Point(452, 266), new Point(451, 266), new Point(450, 266), new Point(449, 267), new Point(448, 268), new Point(447, 268), new Point(446, 269), new Point(445, 269), new Point(444, 269), new Point(443, 269), new Point(442, 270), new Point(441, 270), new Point(440, 270), new Point(439, 270), new Point(438, 270), new Point(437, 271), new Point(436, 271), new Point(435, 271), new Point(434, 272), new Point(433, 272), new Point(432, 273), new Point(431, 274), new Point(430, 274), new Point(429, 275), new Point(428, 276), new Point(427, 277), new Point(426, 278), new Point(426, 279), new Point(425, 280), new Point(425, 281), new Point(424, 282), new Point(424, 283), new Point(423, 284), new Point(422, 285), new Point(422, 286), new Point(422, 287), new Point(421, 288), new Point(420, 289), new Point(419, 290), new Point(418, 291), new Point(417, 292), new Point(416, 293), new Point(415, 294), new Point(414, 295), new Point(413, 296), new Point(412, 297), new Point(411, 298), new Point(410, 299), new Point(409, 300), new Point(408, 301), new Point(407, 302), new Point(406, 303), new Point(405, 304), new Point(404, 304), new Point(403, 305), new Point(402, 306), new Point(401, 307), new Point(400, 307), new Point(399, 307), new Point(398, 308), new Point(397, 309), new Point(396, 310), new Point(395, 310), new Point(394, 311), new Point(393, 311), new Point(392, 312), new Point(391, 313), new Point(390, 313), new Point(389, 313), new Point(388, 314), new Point(387, 314), new Point(386, 315), new Point(385, 316), new Point(384, 316), new Point(383, 317), new Point(382, 317), new Point(381, 318), new Point(380, 318), new Point(379, 318), new Point(378, 319), new Point(377, 319), new Point(376, 319), new Point(375, 319), new Point(374, 320), new Point(373, 321), new Point(372, 321), new Point(371, 322), new Point(370, 322), new Point(369, 322), new Point(368, 323), new Point(367, 323), new Point(366, 323), new Point(365, 324), new Point(364, 324), new Point(363, 324), new Point(362, 324), new Point(361, 325), new Point(360, 325), new Point(359, 325), new Point(358, 325), new Point(357, 326), new Point(356, 327), new Point(355, 327), new Point(354, 327), new Point(353, 328), new Point(352, 328), new Point(351, 329), new Point(350, 329) }; public static Polygon getMainLeaf(Double scalex, double scaley) { return polygonizeControlPoints(blackLeaf, scalex, scaley); } static Polygon polygonizeControlPoints(Point[] pp, double scalex, double scaley) { Polygon r = new Polygon(); for (int i = 0; i < pp.length; i++) { Point p = pp[i]; //small movement to right r.addPoint((int) ((double) (p.x - 17) * scalex), (int) ((double) p.y * scaley)); } return r; } public static Polygon getSecondLeaf(double scalex, double scaley) { return polygonizeControlPoints(redLeaf, scalex, scaley); } // public static Polygon getMainLeafCurve(Double scalex, double scaley) { // return getNatCubicClosed(getMainLeaf(scalex, scaley)); // } // // // public static Polygon getSecondLeafCurve(Double scalex, double scaley) { // return getNatCubicClosed(getSecondLeaf(scalex, scaley)); // } static Polygon getNatCubicClosed(Polygon p) { NatCubicClosed c = new NatCubicClosed(); c.setSourcePolygon(p); return c.calcualteResult(); } /** * Small program to vectorize leaves * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //File f = new File("/home/jvanek/hg/icedtea-web/netx/redLeaf.png"); File f = new File("/home/jvanek/hg/icedtea-web/netx/blackLeaf.png"); File fOut = new File(f.getAbsolutePath().replace(".png", "_result.png")); BufferedImage maze = ImageIO.read(f); //for other sources then my current leaves, there must be empty space between start and end, otherwise shortest path will fail //start for blackLeaf is [267,264] end [268,202] //start for redLeaf is [348,331] end [349,329] Map allNodes = new HashMap(); Node start = null; //first init data for (int x = 0; x < maze.getWidth(); x++) { for (int y = 0; y < maze.getHeight(); y++) { Color c = new Color(maze.getRGB(x, y), true); if (c.getAlpha() > 0) { Node n = new Node(x, y); Node nn = allNodes.get(n); if (nn == null) { allNodes.put(n, n); } else { n = nn; } if (start == null) { start = n; } //check closest neigbourhood for (int xx = -1; xx <= 1; xx++) { for (int yy = -1; yy <= 1; yy++) { if (xx == yy) { continue; } int xxx = x + xx; int yyy = y + yy; //all non-trasnaprent nigbours are neigbours with distance of 1 Color ccc = new Color(maze.getRGB(xxx, yyy), true); if (ccc.getAlpha() > 0) { Node n2 = new Node(xxx, yyy); Node nn2 = allNodes.get(n2); if (nn2 == null) { allNodes.put(n2, n2); } else { n2 = nn2; } n.addDestination(n2, 1); } } } } } } //calculate path from start to mnsot far away point (thats why the empty space) Collection nodesCol = allNodes.values(); Graph g = new Graph(); for (Node node : nodesCol) { g.addNode(node); } Graph graph = calculateShortestPathFromSource(g, start); List result = new ArrayList<>(graph.nodes.size()); result.addAll(graph.nodes); Collections.sort(result, new Comparator() { @Override public int compare(Node o1, Node o2) { return o1.distance - o2.distance; } }); Node finalNode = result.get(result.size() - 1); List path = finalNode.getShortestPath(); //view result if needed BufferedImage finish = new BufferedImage(maze.getWidth(), maze.getHeight(), maze.getType()); System.out.println("private final static Point[] " + f.getName() + " = {"); Graphics2D g2d = finish.createGraphics(); for (int i = 1; i < path.size(); i++) { Node from = path.get(i - 1); Node to = path.get(i); g2d.drawLine(from.x, from.y, to.x, to.y); System.out.println(" new Point(" + from.x + ", " + from.y + "),"); } Node from = path.get(path.size() - 1); Node to = path.get(0); System.out.println(" new Point(" + from.x + ", " + from.y + ")"); g2d.drawLine(from.x, from.y, to.x, to.y); System.out.println(" };"); //ImageIO.write(finish, "png", fOut); } public static class Graph { private Set nodes = new HashSet<>(); public void addNode(Node nodeA) { nodes.add(nodeA); } // getters and setters } public static class Node { private final String name; private List shortestPath = new LinkedList<>(); private Integer distance = Integer.MAX_VALUE; Map adjacentNodes = new HashMap<>(); private final int x; private final int y; public void addDestination(Node destination, int distance) { adjacentNodes.put(destination, distance); } public Node(int xOrig, int yOrig) { this.name = xOrig + " x " + yOrig; this.x = xOrig; this.y = yOrig; } public Integer getDistance() { return distance; } public void setDistance(Integer distance) { this.distance = distance; } public Map getAdjacentNodes() { return adjacentNodes; } public void setShortestPath(List shortestPath) { this.shortestPath = shortestPath; } public List getShortestPath() { return shortestPath; } @Override public boolean equals(Object obj) { if (obj instanceof Node) { return (((Node) obj).name.equals(this.name)); } else { return false; } } @Override public int hashCode() { return name.hashCode(); } } public static Graph calculateShortestPathFromSource(Graph graph, Node source) { source.setDistance(0); Set settledNodes = new HashSet<>(); Set unsettledNodes = new HashSet<>(); unsettledNodes.add(source); while (!unsettledNodes.isEmpty()) { Node currentNode = getLowestDistanceNode(unsettledNodes); unsettledNodes.remove(currentNode); for (Entry< Node, Integer> adjacencyPair : currentNode.getAdjacentNodes().entrySet()) { Node adjacentNode = adjacencyPair.getKey(); Integer edgeWeight = adjacencyPair.getValue(); if (!settledNodes.contains(adjacentNode)) { calculateMinimumDistance(adjacentNode, edgeWeight, currentNode); unsettledNodes.add(adjacentNode); } } settledNodes.add(currentNode); } return graph; } private static Node getLowestDistanceNode(Set< Node> unsettledNodes) { Node lowestDistanceNode = null; int lowestDistance = Integer.MAX_VALUE; for (Node node : unsettledNodes) { int nodeDistance = node.getDistance(); if (nodeDistance < lowestDistance) { lowestDistance = nodeDistance; lowestDistanceNode = node; } } return lowestDistanceNode; } private static void calculateMinimumDistance(Node evaluationNode, Integer edgeWeigh, Node sourceNode) { Integer sourceDistance = sourceNode.getDistance(); if (sourceDistance + edgeWeigh < evaluationNode.getDistance()) { evaluationNode.setDistance(sourceDistance + edgeWeigh); LinkedList shortestPath = new LinkedList<>(sourceNode.getShortestPath()); shortestPath.add(sourceNode); evaluationNode.setShortestPath(shortestPath); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000013213441742745030362 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Cubic.java0000644000175000002070000000450713441742745033145 0ustar00jvanekmock00000000000000/* Cubic.java Copyright (C) 2012 Tim Lambert, Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; /** this class represents a cubic polynomial */ /* * This class is part of the NatCubic implementation (http://www.cse.unsw.edu.au/~lambert/) * which does not have a license. The author (Tim Lambert) has agreed to * license this under GPL+Classpath by email * */ public class Cubic { float a, b, c, d; /* a + b*u + c*u^2 +d*u^3 */ public Cubic(float a, float b, float c, float d) { this.a = a; this.b = b; this.c = c; this.d = d; } /** evaluate cubic */ public float eval(float u) { return (((d * u) + c) * u + b) * u + a; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000032113441742745030362 xustar00119 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextOutlineRenderer.java 30 mtime=1552401893.048832804 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextOutlineRend0000644000175000002070000001045313441742745034272 0ustar00jvanekmock00000000000000/* TextOutlineRenderer.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; public class TextOutlineRenderer { private Image img; private Font font; private Color outlineColor; private final String text; public TextOutlineRenderer(Font f, String s) { this.font = f; outlineColor = Color.black; this.text = s; } public TextOutlineRenderer(Font f, String s, Color textOutline) { this(f, s); this.outlineColor = textOutline; } public int getWidth() { if (img == null) { return -1; } return img.getWidth(null); } public int getHeight() { if (img == null) { return -1; } return img.getHeight(null); } public Rectangle cutTo(Graphics2D g2, int x, int y) { g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); FontRenderContext frc = g2.getFontRenderContext(); TextLayout tl = new TextLayout(getText(), getFont(), frc); float sw = (float) tl.getBounds().getWidth(); AffineTransform transform = new AffineTransform(); transform.setToTranslation(x, y); Shape shape = tl.getOutline(transform); Rectangle r = shape.getBounds(); g2.setColor(getTextOutline()); g2.draw(shape); g2.setClip(shape); g2.drawImage(getImg(), r.x, r.y, r.width, r.height, null); return r; } /** * @return the img */ public Image getImg() { return img; } /** * @param img the img to set */ public void setImg(Image img) { this.img = img; } /** * @return the font */ public Font getFont() { return font; } /** * @param font the font to set */ public void setFont(Font font) { this.font = font; } /** * @return the color of outline */ public Color getTextOutline() { return outlineColor; } /** * @param textOutline the color of outline */ public void setTextOutline(Color textOutline) { this.outlineColor = textOutline; } /** * @return the text */ public String getText() { return text; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000031113441742745030361 xustar00111 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java 30 mtime=1552401893.047832806 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.jav0000644000175000002070000005422413441742745034155 0ustar00jvanekmock00000000000000/* BasePainter.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.BasicStroke; import net.sourceforge.jnlp.splashscreen.impls.*; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.font.TextAttribute; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Observable; import java.util.Observer; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; import net.sourceforge.jnlp.splashscreen.parts.BasicComponentSplashScreen; import net.sourceforge.jnlp.splashscreen.parts.InfoItem; import net.sourceforge.jnlp.splashscreen.parts.InformationElement; import net.sourceforge.jnlp.splashscreen.parts.extensions.ExtensionManager; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.ScreenFinder; public class BasePainter implements Observer { protected final BasicComponentSplashScreen master; //animations //waterLevel of water (0-100%) private int waterLevel = 0; //waving of water and position of shhadowed WEB private int animationsPosition = 0; private int greyTextIncrment = 15; //how quickly is greyed web moving //colors protected static final Color TEA_LIVE_COLOR = new Color(205, 1, 3); protected static final Color BACKGROUND_LIVE_COLOR = ExtensionManager.getExtension().getBackground(); protected static final Color TEA_LEAFS_STALKS_LIVE_COLOR = Color.black; protected static final Color PLUGIN_LIVE_COLOR = ExtensionManager.getExtension().getPluginTextColor(); public static final Color WATER_LIVE_COLOR = new Color(80, 131, 160); protected static final Color PLAIN_TEXT_LIVE_COLOR = ExtensionManager.getExtension().getTextColor(); protected Color teaColor; protected Color backgroundColor; protected Color teaLeafsStalksColor; protected Color pluginColor; protected Color waterColor; protected Color plainTextColor; //BufferedImage tmpBackround; //testingBackground for fitting protected BufferedImage prerenderedStuff; private Font teaFont; private Font icedFont; private Font webFont; private Font pluginFont; private Font plainTextsFont; private Font alternativeTextFont; //those spaces are meaningful for centering the text.. thats why alternative;) private static final String alternativeICED = "Iced "; private static final String alternativeWeb = "Web "; private static final String alternativeTtea = " Tea"; private static final String alternativePlugin = "plugin "; private static final String ICED = "Iced"; private static final String web = "web"; private static final String tea = "Tea"; private static final String plugin = "plugin "; //inidivdual sizes, all converging to ZERO!! /** * Experimentaly meassured best top position for painted parts of vectros */ private final int WEB_TOP_ALIGMENT = 324; /** * Experimentaly meassured best left position for painted parts of vectors */ private final int WEB_LEFT_ALIGMENT = 84; //enabling protected boolean showNiceTexts = true; private boolean showLeaf = true; private boolean showInfo = true; protected TextWithWaterLevel twl; protected TextWithWaterLevel oldTwl; protected boolean canWave = true; private Point aboutOfset = new Point(); private final static float dash1[] = {10.0f}; private final static BasicStroke dashed = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f); protected void paintNiceTexts(Graphics2D g2d) { //the only animated stuff oldTwl = twl; twl = new TextWithWaterLevel(ICED, icedFont); if (oldTwl != null && !canWave) { twl.setCachedPolygon(oldTwl.getCachedPolygon()); } twl.setPercentageOfWater(waterLevel); twl.setBgColor(backgroundColor); twl.setWaterColor(waterColor); twl.cutTo(g2d, scaleX(42), scaleY(278)); MovingText mt = new MovingText(web, webFont); mt.setPercentageOfWater(animationsPosition); mt.cutTo(g2d, scaleX(WEB_LEFT_ALIGMENT), scaleY(WEB_TOP_ALIGMENT)); } protected void paintPlainTexts(Graphics2D g2d) { g2d.setFont(alternativeTextFont); g2d.setColor(waterColor); drawTextAroundCenter(g2d, -0.6d, alternativeICED); g2d.setColor(teaColor); drawTextAroundCenter(g2d, -0.6d, alternativeTtea); g2d.setColor(pluginColor); String s = getAlternativeProductName(); int sub = animationsPosition / greyTextIncrment; sub = sub % s.length(); if (!master.isAnimationRunning()) { sub = s.length(); } drawTextAroundCenter(g2d, 0.3d, s.substring(0, sub)); } //enabling end private int scaleAvarage(double origValue) { return (int) (avarageRatio() * origValue); } private int scaleMax(double origValue) { return (int) (maxRatio() * origValue); } private int scaleMin(double origValue) { return (int) (minRatio() * origValue); } private double avarageRatio() { return (getRatioX() + getRatioY()) / 2d; } private double minRatio() { return Math.min(getRatioX(), getRatioY()); } private double maxRatio() { return Math.max(getRatioX(), getRatioY()); } private int scaleY(double origValue) { return (int) scaleY(master.getSplashHeight(), origValue); } private int scaleX(double origValue) { return (int) scaleX(master.getSplashWidth(), origValue); } private double getRatioY() { return getRatio(DefaultSplashScreen2012.ORIGINAL_H, master.getSplashHeight()); } private double getRatioX() { return getRatio(DefaultSplashScreen2012.ORIGINAL_W, master.getSplashWidth()); } private static double scaleY(double currentSize, double origValue) { return scale(DefaultSplashScreen2012.ORIGINAL_H, currentSize, origValue); } private static double scaleX(double currentSize, double origValue) { return scale(DefaultSplashScreen2012.ORIGINAL_W, currentSize, origValue); } private static double getRatioY(double currentSize) { return getRatio(DefaultSplashScreen2012.ORIGINAL_H, currentSize); } private static double getRatioX(double currentSize) { return getRatio(DefaultSplashScreen2012.ORIGINAL_W, currentSize); } public static double scale(double origSize, double currentSize, double origValue) { return getRatio(origSize, currentSize) * origValue; } public static double getRatio(double origSize, double currentSize) { return (currentSize / origSize); } //size is considered from 0-origsize as 0-1. //scaling end public BasePainter(BasicComponentSplashScreen master) { this(master, false); } public BasePainter(BasicComponentSplashScreen master, boolean startAnimation) { //to have this in inner classes this.master = master; setColors(); adjustForSize(master.getSplashWidth(), master.getSplashHeight()); ExtensionManager.getExtension().adjustForSize(master.getSplashWidth(), master.getSplashHeight()); if (startAnimation) { startAnimationThreads(); } } public void increaseAnimationPosition() { ExtensionManager.getExtension().animate(); animationsPosition += greyTextIncrment; } protected void ensurePrerenderedStuff() { if (this.prerenderedStuff == null) { this.prerenderedStuff = prerenderStill(); } } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; ensurePrerenderedStuff(); if (prerenderedStuff != null) { g2d.drawImage(prerenderedStuff, 0, 0, null); } if (showNiceTexts) { ExtensionManager.getExtension().paint(g, this); paintNiceTexts(g2d); } else { paintPlainTexts(g2d); } } public final void adjustForSize(int width, int height) { prepareFonts(width, height); //enablings depends on fonts setEnablings(width, height, master.getVersion(), master.getInformationElement(), (Graphics2D) (master.getGraphics())); prerenderedStuff = prerenderStill(); ExtensionManager.getExtension().adjustForSize(width, height); } private void setEnablings(int w, int h, String version, InformationElement ic, Graphics2D g2d) { showLeaf = true; if (w > 0 && h > 0) { //leaf stretch much better to wide then to high if (h / w > 2 || w / h > 6) { showLeaf = false; } } showInfo = true; if (version != null && g2d != null && ic != null && ic.getHeader() != null && ic.getHeader().size() > 0) { String s = ic.getHeader().get(0); FontMetrics fm = g2d.getFontMetrics(plainTextsFont); int versionLength = fm.stringWidth(version); int firsDescLineLengthg = fm.stringWidth(s); if (firsDescLineLengthg > w - versionLength - 10) { showInfo = false; } } if (Math.min(h, w) < ScreenFinder.getCurrentScreenSizeWithoutBounds().getHeight() / 10) { showNiceTexts = false; } else { showNiceTexts = true; } } public final void startAnimationThreads() { Thread tt = getMovingTextThread(); tt.start(); Thread t = getWaterLevelThread(); t.start(); } private void prepareFonts(int w, int h) { master.setSplashHeight(h); master.setSplashWidth(w); Map teaFontAttributes = new HashMap(); teaFontAttributes.put(TextAttribute.SIZE, new Integer(scaleMin(84))); teaFontAttributes.put(TextAttribute.WIDTH, new Double((0.95))); teaFontAttributes.put(TextAttribute.FAMILY, "Serif"); teaFont = new Font(teaFontAttributes); Map icedFontAttributes = new HashMap(); icedFontAttributes.put(TextAttribute.SIZE, new Integer(scaleMin(82))); icedFontAttributes.put(TextAttribute.WIDTH, new Double((0.80))); icedFontAttributes.put(TextAttribute.FAMILY, "Serif"); icedFont = new Font(icedFontAttributes); Map webFontAttributes = new HashMap(); webFontAttributes.put(TextAttribute.SIZE, new Integer(scaleMin(41))); webFontAttributes.put(TextAttribute.WIDTH, new Double((2))); webFontAttributes.put(TextAttribute.FAMILY, "Serif"); webFont = new Font(webFontAttributes); Map pluginFontAttributes = new HashMap(); pluginFontAttributes.put(TextAttribute.SIZE, new Integer(scaleMin(32))); pluginFontAttributes.put(TextAttribute.WEIGHT, new Double((5d))); pluginFontAttributes.put(TextAttribute.WIDTH, new Double((0.9))); pluginFontAttributes.put(TextAttribute.FAMILY, "Serif"); pluginFont = new Font(pluginFontAttributes); Map plainFontAttributes = new HashMap(); plainFontAttributes.put(TextAttribute.SIZE, new Integer(12)); plainFontAttributes.put(TextAttribute.FAMILY, "Monospaced"); plainTextsFont = new Font(plainFontAttributes); Map alternativeTextFontAttributes = new HashMap(); alternativeTextFontAttributes.put(TextAttribute.SIZE, Math.min(w, h) / 5); alternativeTextFontAttributes.put(TextAttribute.WIDTH, new Double((0.7))); alternativeTextFontAttributes.put(TextAttribute.FAMILY, "Monospaced"); alternativeTextFont = new Font(alternativeTextFontAttributes); } private void setColors() { teaColor = TEA_LIVE_COLOR; backgroundColor = BACKGROUND_LIVE_COLOR; teaLeafsStalksColor = TEA_LEAFS_STALKS_LIVE_COLOR; pluginColor = PLUGIN_LIVE_COLOR; waterColor = WATER_LIVE_COLOR; plainTextColor = PLAIN_TEXT_LIVE_COLOR; } protected BufferedImage prerenderStill() { if (master.getSplashWidth() <= 0 || master.getSplashHeight() <= 0) { return null; } BufferedImage bi = new BufferedImage(master.getSplashWidth(), master.getSplashHeight(), BufferedImage.TYPE_INT_ARGB); paintStillTo(bi.createGraphics(), master.getInformationElement(), master.getVersion()); return bi; } protected void paintStillTo(Graphics2D g2d, InformationElement ic, String version) { RenderingHints r = g2d.getRenderingHints(); drawBase(g2d, ic, version); g2d.setRenderingHints(r); } protected void drawTextAroundCenter(Graphics2D g2d, double heightOffset, String msg) { int y = (master.getSplashHeight() / 2) + (g2d.getFontMetrics().getHeight() / 2 + (int) (heightOffset * g2d.getFontMetrics().getHeight())); int x = (master.getSplashWidth() / 2) - (g2d.getFontMetrics().stringWidth(msg) / 2); g2d.drawString(msg, x, y); } private Thread getMovingTextThread() { Thread tt = new Thread(new MovingTextRunner(this)); //tt.setDaemon(true); return tt; } static String stripCommitFromVersion(String version) { if (version.contains("pre+")) { return version; } int i = version.indexOf("+"); if (i < 0) { return version; } return version.substring(0, version.indexOf("+")); } private final class MovingTextRunner extends Observable implements Runnable { private static final int MAX_ANIMATION_VALUE = 10000; private static final int ANIMATION_RESTART_VALUE = 1; private static final long MOOVING_TEXT_DELAY = 150; public MovingTextRunner(Observer o) { this.addObserver(o); } @Override public void run() { while (master.isAnimationRunning()) { try { animationsPosition += greyTextIncrment; if (animationsPosition > MAX_ANIMATION_VALUE) { animationsPosition = ANIMATION_RESTART_VALUE; } this.setChanged(); this.notifyObservers(); Thread.sleep(MOOVING_TEXT_DELAY); } catch (Exception e) { OutputController.getLogger().log(e); } } } }; private Thread getWaterLevelThread() { Thread t = new Thread(new WaterLevelThread(this)); //t.setDaemon(true); return t; } private final class WaterLevelThread extends Observable implements Runnable { private static final int MAX_WATERLEVEL_VALUE = 120; private static final int WATER_LEVEL_INCREMENT = 2; private WaterLevelThread(BasePainter o) { this.addObserver(o); } @Override public void run() { while (master.isAnimationRunning()) { if (waterLevel > MAX_WATERLEVEL_VALUE) { break; } try { waterLevel += WATER_LEVEL_INCREMENT; this.setChanged(); this.notifyObservers(); //it is risinfg slower and slower Thread.sleep((waterLevel / 4) * 30); } catch (Exception e) { OutputController.getLogger().log(e); } } } }; private String getAlternativeProductName() { if (SplashReason.JAVAWS.equals(master.getSplashReason())) { return alternativeWeb; } else if (SplashReason.APPLET.equals(master.getSplashReason())) { return alternativeWeb + alternativePlugin; } else { return "...."; } } protected FontMetrics drawBase(Graphics2D g2d, InformationElement ic, String version) { g2d.setColor(backgroundColor); g2d.fillRect(0, 0, master.getSplashWidth() + 5, master.getSplashHeight() + 5); if (showNiceTexts) { //g2d.drawImage(tmpBackround, 0, 0, null); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2d.setFont(teaFont); g2d.setColor(teaColor); g2d.drawString(tea, scaleX(42) + g2d.getFontMetrics(icedFont).stringWidth(ICED), scaleY(278)); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); if (showLeaf) { g2d.fillPolygon(SplinesDefs.getMainLeaf(getRatioX(), getRatioY())); } g2d.setColor(teaLeafsStalksColor); if (showLeaf) { g2d.fillPolygon(SplinesDefs.getSecondLeaf(getRatioX(), getRatioY())); } g2d.setFont(pluginFont); g2d.setColor(pluginColor); if (SplashReason.APPLET.equals(master.getSplashReason())) { if (showLeaf) { g2d.drawString(plugin, scaleX(420), scaleY(145)); } else { FontMetrics wfm = g2d.getFontMetrics(webFont); g2d.drawString(plugin, wfm.stringWidth(web) + scaleX(WEB_LEFT_ALIGMENT) + 10, scaleY(WEB_TOP_ALIGMENT)); } } g2d.setFont(plainTextsFont); g2d.setColor(plainTextColor); FontMetrics fm = g2d.getFontMetrics(); if (ic != null) { InfoItem des = ic.getBestMatchingDescriptionForSplash(); List head = ic.getHeader(); if (head != null && showInfo) { for (int i = 0; i < head.size(); i++) { String string = head.get(i); g2d.drawString(string, 5, (i + 1) * fm.getHeight()); } } if (des != null && des.getValue() != null) { g2d.drawString(des.getValue(), 5, master.getSplashHeight() - fm.getHeight()); } } } g2d.setFont(plainTextsFont); g2d.setColor(plainTextColor); FontMetrics fm = g2d.getFontMetrics(); if (version != null) { String aboutPrefix = Translator.R("AboutDialogueTabAbout") + ": "; int aboutPrefixWidth = fm.stringWidth(aboutPrefix); String niceVersion = stripCommitFromVersion(version); int y = master.getSplashWidth() - fm.stringWidth(niceVersion + " "); if (y < 0) { y = 0; } if (y > aboutPrefixWidth) { niceVersion = aboutPrefix + niceVersion; y -= aboutPrefixWidth; } aboutOfset = new Point(y, fm.getHeight()); Stroke backup = g2d.getStroke(); g2d.setStroke(dashed); g2d.drawRect(aboutOfset.x - 1, 1, master.getSplashWidth() - aboutOfset.x - 1, aboutOfset.y + 1); g2d.setStroke(backup); g2d.drawString(niceVersion, y, fm.getHeight()); } return fm; } public int getWaterLevel() { return waterLevel; } public void setWaterLevel(int level) { this.waterLevel = level; } public int getAnimationsPosition() { return animationsPosition; } public void clearCachedWaterTextImage() { oldTwl = null; } @Override public void update(Observable o, Object arg) { SwingUtils.invokeAndWait(new Runnable() { @Override public void run() { if (master.isAnimationRunning()) { ExtensionManager.getExtension().animate(); master.repaint(); } } }); } public BasicComponentSplashScreen getMaster() { return master; } public Point getAboutOfset() { return aboutOfset; } public Color getWaterColor() { return waterColor; } public Color getBackgroundColor() { return backgroundColor; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000031413441742745030364 xustar00114 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubicClosed.java 30 mtime=1552401893.052832796 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubicClosed.0000644000175000002070000001040113441742745034066 0ustar00jvanekmock00000000000000/* NatCubicClosed.java Copyright (C) 2012 Tim Lambert, Red Hat, Inc., This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; public class NatCubicClosed extends NatCubic { /* * This class is part of the NatCubic implementation (http://www.cse.unsw.edu.au/~lambert/) * which does not have a license. The author (Tim Lambert) has agreed to * license this under GPL+Classpath by email * */ /* NatCubic calcualtion calculates the closed natural cubic spline that interpolates x[0], x[1], ... x[n] The first segment is returned as C[0].a + C[0].b*u + C[0].c*u^2 + C[0].d*u^3 0<=u <1 the other segments are in C[1], C[2], ... C[n] */ @Override Cubic[] calcNaturalCubic(int n, int[] x) { float[] w = new float[n + 1]; float[] v = new float[n + 1]; float[] y = new float[n + 1]; float[] D = new float[n + 1]; float z, F, G, H; int k; /* We solve the equation [4 1 1] [D[0]] [3(x[1] - x[n]) ] |1 4 1 | |D[1]| |3(x[2] - x[0]) | | 1 4 1 | | . | = | . | | ..... | | . | | . | | 1 4 1| | . | |3(x[n] - x[n-2])| [1 1 4] [D[n]] [3(x[0] - x[n-1])] by decomposing the matrix into upper triangular and lower matrices and then back sustitution. See Spath "Spline Algorithms for Curves and Surfaces" pp 19--21. The D[i] are the derivatives at the knots. */ w[1] = v[1] = z = 1.0f / 4.0f; y[0] = z * 3 * (x[1] - x[n]); H = 4; F = 3 * (x[0] - x[n - 1]); G = 1; for (k = 1; k < n; k++) { v[k + 1] = z = 1 / (4 - v[k]); w[k + 1] = -z * w[k]; y[k] = z * (3 * (x[k + 1] - x[k - 1]) - y[k - 1]); H = H - G * w[k]; F = F - G * y[k - 1]; G = -v[k] * G; } H = H - (G + 1) * (v[n] + w[n]); y[n] = F - (G + 1) * y[n - 1]; D[n] = y[n] / H; D[n - 1] = y[n - 1] - (v[n] + w[n]) * D[n]; /* This equation is WRONG! in my copy of Spath */ for (k = n - 2; k >= 0; k--) { D[k] = y[k] - v[k + 1] * D[k + 1] - w[k + 1] * D[n]; } /* now compute the coefficients of the cubics */ Cubic[] C = new Cubic[n + 1]; for (k = 0; k < n; k++) { C[k] = new Cubic((float) x[k], D[k], 3 * (x[k + 1] - x[k]) - 2 * D[k] - D[k + 1], 2 * (x[k] - x[k + 1]) + D[k] + D[k + 1]); } C[n] = new Cubic((float) x[n], D[n], 3 * (x[0] - x[n]) - 2 * D[n] - D[0], 2 * (x[n] - x[0]) + D[n] + D[0]); return C; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000032013441742745030361 xustar00118 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextWithWaterLevel.java 30 mtime=1552401893.044832812 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextWithWaterLe0000644000175000002070000001337513441742745034247 0ustar00jvanekmock00000000000000/* TextWithWaterLevel.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.Polygon; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.util.Random; public class TextWithWaterLevel extends TextOutlineRenderer { private Color waterColor; private Color bgColor; private int percentageOfWater; private Random sea = new Random(); //set to null befor getBackground if waving is needed //or create new TWL ;) private Polygon cachedPolygon; public TextWithWaterLevel(String s, Font f) { super(f, s); waterColor = Color.BLUE; bgColor = Color.white; } protected Point getFutureSize() { BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB); FontMetrics fm = bi.createGraphics().getFontMetrics(getFont()); int w = fm.stringWidth(getText()); int h = fm.getHeight(); return new Point(w, h); } public BufferedImage getBackground() { Point p = getFutureSize(); int w = p.x; int h = p.y; if (w <= 0 || h <= 0) { return null; } BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bi.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(bgColor); g2d.fillRect(0, 0, w, h); if (cachedPolygon == null) { int level = (h * percentageOfWater) / 100; int waveHeight = 10; int waveLength = 20; if (level > waveHeight / 2 + 1) { NatCubic line = new NatCubic(); int x = 0; while (x < w + 2 * waveLength) { line.addPoint(x, h - level - waveHeight / 2 - sea.nextInt(waveHeight)); x = x + waveLength; } cachedPolygon = line.calcualteResult(); cachedPolygon.addPoint(w, h); cachedPolygon.addPoint(0, h); } } g2d.setColor(waterColor); if (cachedPolygon != null) { g2d.fillPolygon(cachedPolygon); } //line.paint(g2d); //FlodFill.floodFill(bi, waterColor, new Point(1, h - 1)); return bi; } public Polygon getCachedPolygon() { return cachedPolygon; } public void setCachedPolygon(Polygon cachedPolygon) { this.cachedPolygon = cachedPolygon; } @Override public Rectangle cutTo(Graphics2D g2, int x, int y) { if (this.getImg() == null) { this.setImg(getBackground()); } if (this.getImg() == null) { return null; } g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setFont(getFont()); g2.setColor(getTextOutline()); g2.drawString(getText(), x, y - 2); g2.drawString(getText(), x, y + 2); g2.drawString(getText(), x - 2, y); g2.drawString(getText(), x + 2, y); //sorry, cuted text have disturbed borders return super.cutTo(g2, x, y); } /** * @return the waterColor */ public Color getWaterColor() { return waterColor; } /** * @param waterColor the waterColor to set */ public void setWaterColor(Color waterColor) { this.waterColor = waterColor; } /** * @return the bgColor */ public Color getBgColor() { return bgColor; } /** * @param bgColor the bgColor to set */ public void setBgColor(Color bgColor) { this.bgColor = bgColor; } /** * @return the percentageOfWater */ public int getPercentageOfWater() { return percentageOfWater; } /** * @param percentageOfWater the percentageOfWater to set */ public void setPercentageOfWater(int percentageOfWater) { this.percentageOfWater = percentageOfWater; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000031213441742745030362 xustar00112 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ControlCurve.java 30 mtime=1552401893.043832814 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ControlCurve.ja0000644000175000002070000001304313441742745034211 0ustar00jvanekmock00000000000000/* ControlCurve.java Copyright (C) 2012 Tim Lambert, Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; /** This class represents a curve defined by a sequence of control points */ /* * This class is part of the NatCubic implementation (http://www.cse.unsw.edu.au/~lambert/) * which does not have a license. The author (Tim Lambert) has agreed to * license this under GPL+Classpath by email * */ import java.awt.*; public class ControlCurve { protected Polygon pts; protected Polygon result; protected boolean withPoints = true; protected int selection = -1; public ControlCurve() { pts = new Polygon(); } public ControlCurve(Polygon p) { pts = p; } public Polygon getSourcePolygon() { return pts; } public void setSourcePolygon(Polygon pts) { this.pts = pts; } static Font f = new Font("Courier", Font.PLAIN, 12); /** * to be overwriten */ public Polygon calcualteResult() { return null; } public void calcualteAndSaveResult() { result = calcualteResult(); } /** paint this curve into g.*/ public void paint(Graphics g) { if (isWithPoints()) { FontMetrics fm = g.getFontMetrics(f); g.setFont(f); int h = fm.getAscent() / 2; for (int i = 0; i < pts.npoints; i++) { String s = Integer.toString(i); int w = fm.stringWidth(s) / 2; g.drawString(Integer.toString(i), pts.xpoints[i] - w, pts.ypoints[i] + h); } } } static final int EPSILON = 36; /* square of distance for picking */ /** return index of control point near to (x,y) or -1 if nothing near */ public int selectPoint(int x, int y) { int mind = Integer.MAX_VALUE; selection = -1; for (int i = 0; i < pts.npoints; i++) { int d = sqr(pts.xpoints[i] - x) + sqr(pts.ypoints[i] - y); if (d < mind && d < EPSILON) { mind = d; selection = i; } } return selection; } // square of an int static int sqr(int x) { return x * x; } public Polygon getResult() { return result; } public void resetResult() { this.result = null; } /** add a control point, return index of new control point */ public int addPoint(int x, int y) { pts.addPoint(x, y); resetResult(); return selection = pts.npoints - 1; } /** set selected control point */ public void setPoint(int x, int y) { setPoint(selection, x, y); } /** set selected control point */ public void setPoint(int index, int x, int y) { if (index >= 0 && index < pts.npoints) { pts.xpoints[index] = x; pts.ypoints[index] = y; resetResult(); } } /** remove selected control point */ public void removePoint(int index) { if (index >= 0 && index < pts.npoints) { pts.npoints--; for (int i = index; i < pts.npoints; i++) { pts.xpoints[i] = pts.xpoints[i + 1]; pts.ypoints[i] = pts.ypoints[i + 1]; } resetResult(); } } /** remove selected control point */ public void removePoint() { removePoint(selection); } public boolean isWithPoints() { return withPoints; } public void setWithPoints(boolean withPoints) { this.withPoints = withPoints; } @Override public String toString() { StringBuilder r = new StringBuilder(); for (int i = 0; i < pts.npoints; i++) { r.append(" ").append(pts.xpoints[i]).append(" ").append(pts.ypoints[i]); } return r.toString(); } /** * for testing purposes * @param selection */ void setSelection(int selection) { this.selection = selection; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/PaxHeaders.74060000644000000000000000000000013013441742745030360 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/MovingText.java0000644000175000002070000000525313441742745034223 0ustar00jvanekmock00000000000000/* MovingText.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Point; import java.awt.image.BufferedImage; public class MovingText extends TextWithWaterLevel { public MovingText(String s, Font f) { super(s, f); } @Override public BufferedImage getBackground() { Point p = getFutureSize(); int w = p.x; int h = p.y; if (w <= 0 || h <= 0) { return null; } BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bi.createGraphics(); Color e1 = Color.gray; Color s1 = Color.white; int level = getPercentageOfWater() % (2 * w); GradientPaint gradient = new GradientPaint(level - w, h / 2, s1, level, h / 2, e1, true); g2d.setPaint(gradient); g2d.fillRect(100, 100, 200, 120); g2d.fillRect(0, 0, w, h); return bi; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/PaxHeaders.7406/DefaultSplashScreens2010000644000000000000000000000013113441742745030322 xustar0029 mtime=1552401893.04083282 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/DefaultSplashScreens2012Commons.java0000644000175000002070000001064313441742745033475 0ustar00jvanekmock00000000000000/* DefaultSplashScreensCommons2012.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls; import java.awt.Graphics; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import net.sourceforge.jnlp.about.AboutDialog; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.BasePainter; import net.sourceforge.jnlp.splashscreen.parts.BasicComponentSplashScreen; import net.sourceforge.jnlp.util.docprovider.TextsProvider; public final class DefaultSplashScreens2012Commons { private final BasicComponentSplashScreen parent; private final BasePainter painter; public DefaultSplashScreens2012Commons(BasePainter painterr, BasicComponentSplashScreen parentt) { this.painter = painterr; this.parent = parentt; parent.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { painter.increaseAnimationPosition(); parent.repaint(); } }); parent.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getY() < painter.getAboutOfset().y && e.getX() > (painter.getAboutOfset().x)) { AboutDialog.display(TextsProvider.ITW_PLUGIN); } } }); // Add a new listener for resizes parent.addComponentListener(new ComponentAdapter() { // Re-adjust variables based on size @Override public void componentResized(ComponentEvent e) { parent.setSplashWidth(parent.getWidth()); parent.setSplashHeight(parent.getHeight()); parent.adjustForSize(); parent.repaint(); } }); } public void paintTo(Graphics g) { painter.paint(g); } public void adjustForSize() { painter.adjustForSize(parent.getSplashWidth(), parent.getSplashHeight()); } public void stopAnimation() { parent.setAnimationRunning(false); } /** * Methods to start the animation in the splash panel. * * This method exits after starting a new thread to do the animation. It * is synchronized to prevent multiple startAnimation threads from being created. */ public synchronized void startAnimation() { if (parent.isAnimationRunning()) { return; } parent.setAnimationRunning(true); painter.startAnimationThreads(); } public void setPercentage(int done) { painter.clearCachedWaterTextImage(); painter.setWaterLevel(done); } public int getPercentage() { return painter.getWaterLevel(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/PaxHeaders.7406/DefaultSplashScreen20120000644000000000000000000000013213441742745030222 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/impls/DefaultSplashScreen2012.java0000644000175000002070000000674313441742745031764 0ustar00jvanekmock00000000000000/* DefaultSplashScreen12.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen.impls; import java.awt.Graphics; import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.BasePainter; import net.sourceforge.jnlp.splashscreen.parts.BasicComponentSplashScreen; public final class DefaultSplashScreen2012 extends BasicComponentSplashScreen { private final DefaultSplashScreen2012 self; private final BasePainter painter; private final DefaultSplashScreens2012Commons commons; public DefaultSplashScreen2012(int width, int height, SplashReason splashReason) { //setting width and height now is causing unnecessary blinking //setSplashHeight(height); //setSplashWidth(width); //to have this in inner classes self = this; setSplashReason(splashReason); painter = new BasePainter(this); commons = new DefaultSplashScreens2012Commons(painter, self); } @Override public void paintComponent(Graphics g) { paintTo(g); } @Override public void paintTo(Graphics g) { commons.paintTo(g); } @Override public void adjustForSize() { commons.adjustForSize(); } @Override public void stopAnimation() { commons.stopAnimation(); } /** * Methods to start the animation in the splash panel. * * This method exits after starting a new thread to do the animation. It * is synchronized to prevent multiple startAnimation threads from being created. */ @Override public void startAnimation() { commons.startAnimation(); } @Override public void setPercentage(int done) { commons.setPercentage(done); } @Override public int getPercentage() { return commons.getPercentage(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/SplashErrorPanel.java0000644000000000000000000000013213441742745027036 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/SplashErrorPanel.java0000644000175000002070000000375013441742745027653 0ustar00jvanekmock00000000000000/* SplashErrorPanel.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen; public interface SplashErrorPanel extends SplashPanel { /** * When applet loading fails, then dying stacktrace can be set, and is then shown to user on demand. */ public Throwable getLoadingException(); public void setLoadingException(Throwable loadingException); } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/SplashController.java0000644000000000000000000000013213441742745027110 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/SplashController.java0000644000175000002070000000360113441742745027720 0ustar00jvanekmock00000000000000/* SplashController.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen; public interface SplashController { public void removeSplash(); public void replaceSplash(SplashPanel r); public int getSplashWidth(); public int getSplashHeigth(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/PaxHeaders.7406/SplashUtils.java0000644000000000000000000000013213441742745026065 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/splashscreen/SplashUtils.java0000644000175000002070000001771513441742745026710 0ustar00jvanekmock00000000000000/* SplashUtils.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.splashscreen; import net.sourceforge.jnlp.runtime.AppletEnvironment; import net.sourceforge.jnlp.runtime.AppletInstance; import net.sourceforge.jnlp.runtime.Boot; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.splashscreen.impls.DefaultSplashScreen2012; import net.sourceforge.jnlp.splashscreen.impls.DefaultErrorSplashScreen2012; import net.sourceforge.jnlp.util.logging.OutputController; public class SplashUtils { static final String ICEDTEA_WEB_PLUGIN_SPLASH = "ICEDTEA_WEB_PLUGIN_SPLASH"; static final String ICEDTEA_WEB_SPLASH = "ICEDTEA_WEB_SPLASH"; static final String NONE = "none"; static final String DEFAULT = "default"; /** * Indicator whether to show icedtea-web plugin or just icedtea-web * For "just icedtea-web" will be done an attempt to show content of * information element */ public static enum SplashReason { APPLET, JAVAWS; @Override public String toString() { switch (this) { case APPLET: return "IcedTea-Web Plugin"; case JAVAWS: return "IcedTea-Web"; } return "unknown"; } } public static void showErrorCaught(Throwable ex, AppletInstance appletInstance) { try { showError(ex, appletInstance); } catch (Throwable t) { // prinitng this exception is discutable. I have let it in for case that //some retyping will fail OutputController.getLogger().log(t); } } public static void showError(Throwable ex, AppletInstance appletInstance) { if (appletInstance == null) { return; } AppletEnvironment ae = appletInstance.getAppletEnvironment(); showError(ex, ae); } public static void showError(Throwable ex, AppletEnvironment ae) { if (ae == null) { return; } SplashController p = ae.getSplashController(); showError(ex, p); } public static void showError(Throwable ex, SplashController f) { if (f == null) { return; } f.replaceSplash(getErrorSplashScreen(f.getSplashWidth(), f.getSplashHeigth(), ex)); } private static SplashReason getReason() { if (JNLPRuntime.isWebstartApplication()) { return SplashReason.JAVAWS; } else { return SplashReason.APPLET; } } /** * Warning - splash should have recieve width and height without borders. * plugin's window have NO border, but javaws window HAVE border. This must * be calcualted prior calling this method * @param width * @param height */ public static SplashPanel getSplashScreen(int width, int height) { return getSplashScreen(width, height, getReason()); } /** * Warning - splash should have recieve width and height without borders. * plugin's window have NO border, but javaws window HAVE border. This must * be calcualted prior calling this method * @param width * @param height * @param ex exception to be shown if any */ public static SplashErrorPanel getErrorSplashScreen(int width, int height, Throwable ex) { return getErrorSplashScreen(width, height, getReason(), ex); } /** * Warning - splash should have recieve width and height without borders. * plugin's window have NO border, but javaws window HAVE border. This must * be calcualted prior calling this method * @param width * @param height * @param splashReason */ static SplashPanel getSplashScreen(int width, int height, SplashUtils.SplashReason splashReason) { return getSplashScreen(width, height, splashReason, null, false); } /** * Warning - splash should have recieve width and height without borders. * plugin's window have NO border, but javaws window HAVE border. This must * be calcualted prior calling this method * @param width * @param height * @param splashReason * @param ex exception to be shown if any */ static SplashErrorPanel getErrorSplashScreen(int width, int height, SplashUtils.SplashReason splashReason, Throwable ex) { return (SplashErrorPanel) getSplashScreen(width, height, splashReason, ex, true); } /** * @param width * @param height * @param splashReason * @param loadingException * @param isError */ public static SplashPanel getSplashScreen(int width, int height, SplashUtils.SplashReason splashReason, Throwable loadingException, boolean isError) { String splashEnvironmetVar = null; String pluginSplashEnvironmetVar = null; try { pluginSplashEnvironmetVar = System.getenv(ICEDTEA_WEB_PLUGIN_SPLASH); splashEnvironmetVar = System.getenv(ICEDTEA_WEB_SPLASH); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } SplashPanel sp = null; if (SplashReason.JAVAWS.equals(splashReason)) { if (NONE.equals(splashEnvironmetVar)) { return null; } if (DEFAULT.equals(splashEnvironmetVar)) { if (isError) { sp = new DefaultErrorSplashScreen2012(width, height, splashReason, loadingException); } else { sp = new DefaultSplashScreen2012(width, height, splashReason); } } } if (SplashReason.APPLET.equals(splashReason)) { if (NONE.equals(pluginSplashEnvironmetVar)) { return null; } if (DEFAULT.equals(pluginSplashEnvironmetVar)) { if (isError) { sp = new DefaultErrorSplashScreen2012(width, height, splashReason, loadingException); } else { sp = new DefaultSplashScreen2012(width, height, splashReason); } } } if (isError) { sp = new DefaultErrorSplashScreen2012(width, height, splashReason, loadingException); } else { sp = new DefaultSplashScreen2012(width, height, splashReason); } sp.setVersion(Boot.version); return sp; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/services0000644000000000000000000000013113441742745022022 xustar0029 mtime=1552401893.06983276 30 atime=1552410887.113183443 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/0000755000175000002070000000000013441742745022710 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XPrintService.java0000644000000000000000000000013113441742745025507 xustar0029 mtime=1552401893.06983276 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XPrintService.java0000644000175000002070000001035113441742745026320 0ustar00jvanekmock00000000000000/* XPrintService.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.services; import java.awt.print.PageFormat; import java.awt.print.Pageable; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import javax.jnlp.*; import javax.swing.JOptionPane; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; public class XPrintService implements PrintService { // If pj is null, then we do not have a printer to use. private PrinterJob pj; public XPrintService() { pj = PrinterJob.getPrinterJob(); } public PageFormat getDefaultPage() { if (pj != null) return pj.defaultPage(); else { showWarning(); return new PageFormat(); // might not have default settings. } } public PageFormat showPageFormatDialog(PageFormat page) { if (pj != null) return pj.pageDialog(page); else { showWarning(); return page; } } public boolean print(Pageable document) { if (pj != null) { pj.setPageable(document); if (pj.printDialog()) { try { pj.print(); return true; } catch (PrinterException pe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Could not print: " + pe); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, pe); return false; } } } else showWarning(); return false; } public boolean print(Printable painter) { if (pj != null) { pj.setPrintable(painter); if (pj.printDialog()) { try { pj.print(); return true; } catch (PrinterException pe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Could not print: " + pe); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, pe); return false; } } } else showWarning(); return false; } private void showWarning() { JOptionPane.showMessageDialog(null, "Unable to find a default printer.", "Warning", JOptionPane.WARNING_MESSAGE); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Unable to print: Unable to find default printer."); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XDownloadService2.java0000644000000000000000000000013213441742745026245 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XDownloadService2.java0000644000175000002070000000437713441742745027070 0ustar00jvanekmock00000000000000/* XDownloadService2.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.services; import javax.jnlp.DownloadService2; public class XDownloadService2 implements DownloadService2 { @Override public ResourceSpec[] getCachedResources(ResourceSpec resourceSpec) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public ResourceSpec[] getUpdateAvailableResources(ResourceSpec resourceSpec) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XJNLPRandomAccessFile.java0000644000000000000000000000013213441742745026721 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XJNLPRandomAccessFile.java0000644000175000002070000001246113441742745027535 0ustar00jvanekmock00000000000000/* XJNLPRandomAccessFile.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.services; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import javax.jnlp.JNLPRandomAccessFile; public class XJNLPRandomAccessFile implements JNLPRandomAccessFile { private RandomAccessFile raf; public XJNLPRandomAccessFile(File file, String mode) throws IOException { raf = new RandomAccessFile(file, mode); } public void close() throws IOException { raf.close(); } public long getFilePointer() throws IOException { return raf.getFilePointer(); } public long length() throws IOException { return raf.length(); } public int read() throws IOException { return raf.read(); } public int read(byte[] b, int off, int len) throws IOException { return raf.read(b, off, len); } public int read(byte[] b) throws IOException { return raf.read(b); } public boolean readBoolean() throws IOException { return raf.readBoolean(); } public byte readByte() throws IOException { return raf.readByte(); } public char readChar() throws IOException { return raf.readChar(); } public double readDouble() throws IOException { return raf.readDouble(); } public float readFloat() throws IOException { return raf.readFloat(); } public void readFully(byte[] b) throws IOException { raf.readFully(b); } public void readFully(byte[] b, int off, int len) throws IOException { raf.readFully(b, off, len); } public int readInt() throws IOException { return raf.readInt(); } public String readLine() throws IOException { return raf.readLine(); } public long readLong() throws IOException { return raf.readLong(); } public short readShort() throws IOException { return raf.readShort(); } public String readUTF() throws IOException { return raf.readUTF(); } public int readUnsignedByte() throws IOException { return raf.readUnsignedByte(); } public int readUnsignedShort() throws IOException { return raf.readUnsignedShort(); } public void seek(long pos) throws IOException { raf.seek(pos); } public void setLength(long newLength) throws IOException { raf.setLength(newLength); } public int skipBytes(int n) throws IOException { return raf.skipBytes(n); } public void write(int b) throws IOException { raf.write(b); } public void write(byte[] b) throws IOException { raf.write(b); } public void write(byte[] b, int off, int len) throws IOException { raf.write(b, off, len); } public void writeBoolean(boolean v) throws IOException { raf.writeBoolean(v); } public void writeByte(int v) throws IOException { raf.writeByte(v); } public void writeBytes(String s) throws IOException { raf.writeBytes(s); } public void writeChar(int v) throws IOException { raf.writeChar(v); } public void writeChars(String s) throws IOException { raf.writeChars(s); } public void writeDouble(double v) throws IOException { raf.writeDouble(v); } public void writeFloat(float v) throws IOException { raf.writeFloat(v); } public void writeInt(int v) throws IOException { raf.writeInt(v); } public void writeLong(long v) throws IOException { raf.writeLong(v); } public void writeShort(int v) throws IOException { raf.writeShort(v); } public void writeUTF(String str) throws IOException { raf.writeUTF(str); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XClipboardService.java0000644000000000000000000000013213441742745026313 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XClipboardService.java0000644000175000002070000000550713441742745027132 0ustar00jvanekmock00000000000000/* XClipboardService.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.services; import javax.jnlp.*; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import java.awt.datatransfer.Transferable; import java.awt.Toolkit; /** * The ClipboardService JNLP service. * * @author Joshua Sumali */ class XClipboardService implements ClipboardService { protected XClipboardService() { } /** * Returns the contents of the system clipboard. */ public java.awt.datatransfer.Transferable getContents() { if (ServiceUtil.checkAccess(AccessType.CLIPBOARD_READ)) { Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); return (Transferable) ServiceUtil.createPrivilegedProxy( Transferable.class, t); } else { return null; } } /** * Sets the contents of the system clipboard. */ public void setContents(java.awt.datatransfer.Transferable contents) { if (ServiceUtil.checkAccess(AccessType.CLIPBOARD_WRITE)) { Toolkit.getDefaultToolkit().getSystemClipboard().setContents( contents, null); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XSingleInstanceService.java0000644000000000000000000000013113441742745027321 xustar0029 mtime=1552401893.04083282 30 atime=1552402157.231253494 30 ctime=1552410887.036183623 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XSingleInstanceService.java0000644000175000002070000002160513441742745030136 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; import java.util.Set; import javax.jnlp.SingleInstanceListener; import javax.management.InstanceAlreadyExistsException; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; /** * This class implements SingleInstanceService * * @author Omair Majid */ public class XSingleInstanceService implements ExtendedSingleInstanceService { boolean initialized = false; List listeners = new LinkedList(); /** * Implements a server that listens for arguments from new instances of this * application * */ class SingleInstanceServer implements Runnable { SingleInstanceLock lockFile = null; public SingleInstanceServer(SingleInstanceLock lockFile) { this.lockFile = lockFile; } public void run() { ServerSocket listeningSocket = null; try { listeningSocket = new ServerSocket(0); lockFile.createWithPort(listeningSocket.getLocalPort()); OutputController.getLogger().log("Starting SingleInstanceServer on port" + listeningSocket); while (true) { try { Socket communicationSocket = listeningSocket.accept(); ObjectInputStream ois = new ObjectInputStream(communicationSocket .getInputStream()); String[] arguments = (String[]) ois.readObject(); notifySingleInstanceListeners(arguments); } catch (Exception exception) { // not much to do here... OutputController.getLogger().log(OutputController.Level.ERROR_ALL, exception); } } } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } finally { if (listeningSocket != null) { try { listeningSocket.close(); } catch (IOException e) { // Give up. OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } } } } /** * Create a new XSingleInstanceService */ protected XSingleInstanceService() { } /** * Initialize the new SingleInstanceService * * @throws InstanceExistsException if the instance already exists */ public void initializeSingleInstance() { // this is called after the application has started. so safe to use // JNLPRuntime.getApplication() JNLPFile jnlpFile = JNLPRuntime.getApplication().getJNLPFile(); if (!initialized || jnlpFile instanceof PluginBridge) { // Either a new process or a new applet being handled by the plugin. checkSingleInstanceRunning(jnlpFile); initialized = true; SingleInstanceLock lockFile; lockFile = new SingleInstanceLock(jnlpFile); if (!lockFile.isValid()) { startListeningServer(lockFile); } } } /** * Check if another instance of this application is already running * * @param jnlpFile The {@link JNLPFile} that specifies the application * * @throws InstanceExistsException if an instance of this application * already exists */ @Override public void checkSingleInstanceRunning(JNLPFile jnlpFile) { SingleInstanceLock lockFile = new SingleInstanceLock(jnlpFile); if (lockFile.isValid()) { int port = lockFile.getPort(); OutputController.getLogger().log("Lock file is valid (port=" + port + "). Exiting."); String[] args = null; if (jnlpFile.isApplet()) { // FIXME Proprietary plug-in is unclear about how to handle // applets and their parameters. //Right now better to forward at least something Set> currentParams = jnlpFile.getApplet().getParameters().entrySet(); args = new String[currentParams.size() * 2]; int i = 0; for (Entry entry : currentParams) { args[i] = entry.getKey(); args[i+1] = entry.getValue(); i += 2; } } else if (jnlpFile.isInstaller()) { // TODO Implement this once installer service is available. } else { args = jnlpFile.getApplication().getArguments(); } try { sendProgramArgumentsToExistingApplication(port, args); throw new InstanceExistsException(String.valueOf(port)); } catch (IOException e) { throw new RuntimeException(e); } } } /** * Start the listening server to accept arguments from new instances of * applications * * @param lockFile * the {@link SingleInstanceLock} that the server should use */ private void startListeningServer(SingleInstanceLock lockFile) { SingleInstanceServer server = new SingleInstanceServer(lockFile); Thread serverThread = new Thread(server); /* * mark as daemon so the JVM can shutdown if the server is the only * thread running */ serverThread.setDaemon(true); serverThread.start(); } /** * Send the arguments for this application to the main instance * * @param port the port at which the SingleInstanceServer is listening at * @param arguments the new arguments * @throws IOException on any io exception */ private void sendProgramArgumentsToExistingApplication(int port, String[] arguments) throws IOException { try { Socket serverCommunicationSocket = new Socket((String) null, port); ObjectOutputStream argumentStream = new ObjectOutputStream(serverCommunicationSocket .getOutputStream()); argumentStream.writeObject(arguments); argumentStream.close(); serverCommunicationSocket.close(); } catch (UnknownHostException unknownHost) { OutputController.getLogger().log("Unable to find localhost"); throw new RuntimeException(unknownHost); } } /** * Notify any SingleInstanceListener with new arguments * * @param arguments the new arguments to the application */ private void notifySingleInstanceListeners(String[] arguments) { for (SingleInstanceListener listener : listeners) { // TODO this proxy is privileged. should i worry about security in // methods being called? listener.newActivation(arguments); } } /** * Add the specified SingleInstanceListener * * @throws InstanceExistsException which is likely to terminate the * application but not guaranteed to */ public void addSingleInstanceListener(SingleInstanceListener sil) { initializeSingleInstance(); if (sil == null) { return; } listeners.add(sil); } /** * Remove the specified SingleInstanceListener * * @throws InstanceExistsException if an instance of this single instance * application already exists * */ public void removeSingleInstanceListener(SingleInstanceListener sil) { initializeSingleInstance(); if (sil == null) { return; } listeners.remove(sil); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XExtensionInstallerService.java0000644000000000000000000000013213441742745030246 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.231253494 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XExtensionInstallerService.java0000644000175000002070000000442613441742745031064 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import java.net.*; import javax.jnlp.*; /** * The ExtensionInstallerService JNLP service. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.6 $ */ class XExtensionInstallerService implements ExtensionInstallerService { protected XExtensionInstallerService() { } /** * */ public URL getExtensionLocation() { return null; } /** * */ public String getExtensionVersion() { return null; } /** * */ public String getInstalledJRE(java.net.URL url, java.lang.String version) { return null; } /** * */ public String getInstallPath() { return null; } /** * */ public void hideProgressBar() { } /** * */ public void hideStatusWindow() { } /** * */ public void installFailed() { } /** * */ public void installSucceeded(boolean needsReboot) { } /** * */ public void setHeading(java.lang.String heading) { } /** * */ public void setJREInfo(java.lang.String platformVersion, java.lang.String jrePath) { } /** * */ public void setNativeLibraryInfo(java.lang.String path) { } /** * */ public void setStatus(java.lang.String status) { } /** * */ public void updateProgress(int value) { } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/InstanceExistsException.java0000644000000000000000000000013213441742745027566 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.231253494 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/InstanceExistsException.java0000644000175000002070000000232313441742745030376 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; /** * * This class represents an exception indicating that an application instance * already exists for this jnlp file * * @author Omair Majid * */ public class InstanceExistsException extends RuntimeException { private static final long serialVersionUID = 7950552292795498272L; public InstanceExistsException(String message) { super(message); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XFileSaveService.java0000644000000000000000000000013213441742745026112 xustar0030 mtime=1552401893.043832814 30 atime=1552402157.231253494 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XFileSaveService.java0000644000175000002070000001157313441742745026731 0ustar00jvanekmock00000000000000/* XFileSaveService.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.services; import java.io.*; import javax.jnlp.*; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.util.FileUtils; import javax.swing.JFileChooser; import javax.swing.JOptionPane; /** * The FileSaveService JNLP service. * * @author Joshua Sumali */ class XFileSaveService implements FileSaveService { protected XFileSaveService() { } /** * Prompts the user to save a file. */ public FileContents saveFileDialog(java.lang.String pathHint, java.lang.String[] extensions, java.io.InputStream stream, java.lang.String name) throws java.io.IOException { if (ServiceUtil.checkAccess(AccessType.WRITE_FILE)) { JFileChooser chooser = new JFileChooser(); int chosen = chooser.showSaveDialog(null); if (chosen == JFileChooser.APPROVE_OPTION) { writeToFile(stream, chooser.getSelectedFile()); return (FileContents) ServiceUtil.createPrivilegedProxy( FileContents.class, new XFileContents(chooser.getSelectedFile())); } else { return null; } } else { return null; } } /** * Prompts the user to save a file, with an optional pre-set filename. */ public FileContents saveAsFileDialog(java.lang.String pathHint, java.lang.String[] extensions, FileContents contents) throws java.io.IOException { if (ServiceUtil.checkAccess(AccessType.WRITE_FILE)) { JFileChooser chooser = new JFileChooser(); chooser.setSelectedFile(new File(contents.getName())); int chosen = chooser.showSaveDialog(null); if (chosen == JFileChooser.APPROVE_OPTION) { writeToFile(contents.getInputStream(), chooser.getSelectedFile()); return (FileContents) ServiceUtil.createPrivilegedProxy( FileContents.class, new XFileContents(chooser.getSelectedFile())); } else { return null; } } else { return null; } } /** * Writes actual file to disk. */ private void writeToFile(InputStream stream, File file) throws IOException { if (!file.createNewFile()) { //file exists boolean replace = (JOptionPane.showConfirmDialog(null, file.getAbsolutePath() + " already exists.\n" + "Do you want to replace it?", "Warning - File Exists", JOptionPane.YES_NO_OPTION) == 0); if (!replace) return; } else { FileUtils.createRestrictedFile(file, true); } if (file.canWrite()) { FileOutputStream out = new FileOutputStream(file); byte[] b = new byte[256]; int read = 0; while ((read = stream.read(b)) > 0) out.write(b, 0, read); out.flush(); out.close(); } else { throw new IOException("Unable to open file for writing"); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XBasicService.java0000644000000000000000000000013213441742745025435 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.231253494 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XBasicService.java0000644000175000002070000003655413441742745026262 0ustar00jvanekmock00000000000000// Copyright (C) 2001 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Desktop; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.StringTokenizer; import javax.jnlp.BasicService; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import net.sourceforge.jnlp.InformationDesc; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.config.BasicValueValidators; import static net.sourceforge.jnlp.config.BasicValueValidators.verifyFileOrCommand; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ApplicationInstance; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.runtime.html.browser.LinkingBrowser; import net.sourceforge.jnlp.util.StreamUtils; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.swing.SwingUtils; /** * The BasicService JNLP service. * * @author Jon A. Maxwell * (JAM) - initial author * @version $Revision: 1.10 $ */ class XBasicService implements BasicService { protected XBasicService() { } /** * Returns the codebase of the application, applet, or installer. If the * codebase was not specified in the JNLP element then the main JAR's * location is returned. If no main JAR was specified then the location of * the JAR containing the main class is returned. */ @Override public URL getCodeBase() { ApplicationInstance app = JNLPRuntime.getApplication(); if (app != null) { JNLPFile file = app.getJNLPFile(); // return the codebase. if (file.getCodeBase() != null) { return file.getCodeBase(); } // else return the main JAR's URL. JARDesc mainJar = file.getResources().getMainJAR(); if (mainJar != null) { return mainJar.getLocation(); } // else find JAR where main class was defined. // // JNLPFile file = app.getJNLPFile(); // String mainClass = file.getLaunchInfo().getMainClass()+".class"; // URL jarUrl = app.getClassLoader().getResource(mainClass); // go through list of JARDesc to find one matching jarUrl } return null; } /** * Return true if the Environment is Offline */ @Override public boolean isOffline() { URL url = findFirstURLFromJNLPFile(); JNLPRuntime.detectOnline(url); return !JNLPRuntime.isOnline(); } /** * Return the first URL from the jnlp file Or a default URL if no url found * in JNLP file */ private URL findFirstURLFromJNLPFile() { ApplicationInstance app = JNLPRuntime.getApplication(); if (app != null) { JNLPFile jnlpFile = app.getJNLPFile(); URL sourceURL = jnlpFile.getSourceLocation(); if (sourceURL != null) { return sourceURL; } URL codeBaseURL = jnlpFile.getCodeBase(); if (codeBaseURL != null) { return codeBaseURL; } InformationDesc informationDesc = jnlpFile.getInformation(); URL homePage = informationDesc.getHomepage(); if (homePage != null) { return homePage; } JARDesc[] jarDescs = jnlpFile.getResources().getJARs(); for (JARDesc jarDesc : jarDescs) { return jarDesc.getLocation(); } } // this section is only reached if the jnlp file has no jars. // that doesnt seem very likely. URL arbitraryURL; try { arbitraryURL = new URL("http://icedtea.classpath.org"); } catch (MalformedURLException malformedURL) { throw new RuntimeException(malformedURL); } return arbitraryURL; } /** * Return true if a Web Browser is Supported */ @Override public boolean isWebBrowserSupported() { //there is hardly anything our impl can not handle return true; } /** * Show a document. * * @return whether the document was opened */ @Override public boolean showDocument(URL url) { try { // if (url.toString().endsWith(".jnlp")) { // try { // new Launcher(false).launchExternal(url); // return true; // } catch (Exception ex) { // return false; // } // } // Ignorance of this code is the only regression against original code (if you asume msot of the jnlps havejnlp suffix...) we had // anyway, also jnlp protocol should be handled via this, so while this can be set via // ALWAYS-ASK, or directly via BROWSER of deployment.browser.path , it still should be better then it was // in all cases, the mime recognition is much harder then .jnlp suffix String urls = url.toExternalForm(); OutputController.getLogger().log("showDocument for: " + urls); DeploymentConfiguration config = JNLPRuntime.getConfiguration(); String command = config.getProperty(DeploymentConfiguration.KEY_BROWSER_PATH); //for various debugging //command=DeploymentConfiguration.ALWAYS_ASK; if (command != null) { OutputController.getLogger().log(DeploymentConfiguration.KEY_BROWSER_PATH + " located. Using: " + command); return exec(command, urls); } if (System.getenv(DeploymentConfiguration.BROWSER_ENV_VAR) != null) { command = System.getenv(DeploymentConfiguration.BROWSER_ENV_VAR); OutputController.getLogger().log("variable " + DeploymentConfiguration.BROWSER_ENV_VAR + " located. Using: " + command); return exec(command, urls); } if (JNLPRuntime.isHeadless() || !Desktop.isDesktopSupported()) { command = promptForCommand(urls, false); return exec(command, urls); } else { if (Desktop.isDesktopSupported()) { OutputController.getLogger().log("using default browser"); Desktop.getDesktop().browse(url.toURI()); return true; } else { OutputController.getLogger().log("dont know what to do"); return false; } } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, e.toString()); OutputController.getLogger().log(e); return false; } } //cmd form user can contains spaces, wuotes and so... now we are relying on default dummy impl private boolean exec(String cmd, String url) { try { if (cmd == null || cmd.length() == 0) { return false; } if (url == null || url.length() == 0) { return false; } if (cmd.equals(DeploymentConfiguration.ALWAYS_ASK)) { cmd = promptForCommand(url, true); } if (cmd.equals(DeploymentConfiguration.INTERNAL_HTML)) { LinkingBrowser.createFrame(url, false, JFrame.DISPOSE_ON_CLOSE); return true; } //copypasted from exec StringTokenizer st = new StringTokenizer(cmd + " " + url); String[] cmdarray = new String[st.countTokens()]; for (int i = 0; st.hasMoreTokens(); i++) { cmdarray[i] = st.nextToken(); } final ProcessBuilder pb = new ProcessBuilder(cmdarray); pb.inheritIO(); final Process p = pb.start(); StreamUtils.waitForSafely(p); return (p.exitValue() == 0); } catch (Exception e) { OutputController.getLogger().log(e); try { //time for stderr to deal with it in verbose mode Thread.sleep(50); } catch (Exception ex) { //ss } OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, e.toString()); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.VVPossibleBrowserValues()); return false; } } private String promptForCommand(final String targetUrl, boolean aa) throws IOException { String message = Translator.VVPossibleBrowserValues(); String title = R("RBrowserLocationPromptTitle"); if (JNLPRuntime.isHeadless()) { OutputController.getLogger().printOutLn(message); OutputController.getLogger().printOutLn("*** " + targetUrl + " ***"); OutputController.getLogger().printOutLn(title); String entered = OutputController.getLogger().readLine(); String verification = verifyFileOrCommand(entered); if (verification == null) { OutputController.getLogger().printOutLn(R("VVBrowserVerificationFail")); } else { OutputController.getLogger().printOutLn(R("VVBrowserVerificationPass", verification)); } return entered; } else { final PromptUrl pu = new PromptUrl(); pu.arrange(targetUrl, aa); pu.setVisible(true); return pu.getValue(); } } private static class PromptUrl extends JDialog { JTextField value = new JTextField("firefox"); JLabel verification = new JLabel("?"); private WindowListener cl = new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { value.setText(""); } }; JCheckBox save = new JCheckBox(R("PESaveChanges")); private boolean ask; public PromptUrl() { super((JDialog) null, R("RBrowserLocationPromptTitle"), true); } public void arrange(String url, boolean ask) { this.ask = ask; JPanel top = new JPanel(new GridLayout(2, 1)); JPanel bottom = new JPanel(new GridLayout(5, 1)); this.setLayout(new BorderLayout()); this.add(top, BorderLayout.NORTH); this.add(bottom, BorderLayout.SOUTH); top.add(new JLabel("" + R("RBrowserLocationPromptTitle"))); JTextField urlField = new JTextField(url); urlField.setEditable(false); top.add(urlField); JTextArea ta = new JTextArea(Translator.VVPossibleBrowserValues()); ta.setEditable(false); ta.setLineWrap(true); ta.setWrapStyleWord(false); JScrollPane scrollableTa=new JScrollPane(ta); scrollableTa.setHorizontalScrollBar(null); this.add(scrollableTa); bottom.add(value); bottom.add(verification); JButton ok = new JButton(R("ButOk")); ok.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (save.isSelected()) { JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_BROWSER_PATH, value.getText()); try { JNLPRuntime.getConfiguration().save(); } catch (IOException ex) { OutputController.getLogger().log(ex); } } PromptUrl.this.dispose(); } }); JButton cancel = new JButton(R("ButCancel")); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { cl.windowClosing(null); PromptUrl.this.dispose(); } }); bottom.add(save); bottom.add(ok); bottom.add(cancel); if (this.ask) { save.setSelected(false); save.setEnabled(false); save.setToolTipText(R("VVBrowserSaveNotAllowed", DeploymentConfiguration.ALWAYS_ASK, DeploymentConfiguration.KEY_BROWSER_PATH)); } else { save.setEnabled(true); save.setToolTipText(R("VVBrowserSaveAllowed", DeploymentConfiguration.KEY_BROWSER_PATH)); } this.addWindowListener(cl); value.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { check(); } @Override public void removeUpdate(DocumentEvent e) { check(); } @Override public void changedUpdate(DocumentEvent e) { check(); } private void check() { String result = BasicValueValidators.verifyFileOrCommand(value.getText()); if (result == null) { verification.setForeground(Color.red); verification.setText(R("VVBrowserVerificationFail")); if (!PromptUrl.this.ask) { save.setSelected(false); } } else { verification.setForeground(Color.green); verification.setText(R("VVBrowserVerificationPass", result)); if (!PromptUrl.this.ask) { save.setSelected(true); } } } }); this.pack(); this.setSize(500, 400); } private String getValue() { if (value.getText().trim().isEmpty()) { return null; } return value.getText(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/package-info.java0000644000000000000000000000013213441742745025267 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/package-info.java0000644000175000002070000000340413441742745026100 0ustar00jvanekmock00000000000000/* package-info.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.*/ /** * This package contains the classes that implement the standard services * defined by the JNLP specification. */ package net.sourceforge.jnlp.services; icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XFileContents.java0000644000000000000000000000013213441742745025470 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XFileContents.java0000644000175000002070000000572113441742745026305 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import java.io.*; import javax.jnlp.*; /** * File contents. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.6 $ */ class XFileContents implements FileContents { /** the file */ private File file; /** * Create a file contents implementation for the file. */ protected XFileContents(File file) { // create a safe copy this.file = new File(file.getPath()); } /** * * @throws IOException if an I/O exception occurs. */ public boolean canRead() throws IOException { return file.canRead(); } /** * * @throws IOException if an I/O exception occurs. */ public boolean canWrite() throws IOException { return file.canWrite(); } /** * * @throws IOException if an I/O exception occurs. */ public InputStream getInputStream() throws IOException { return new FileInputStream(file); } /** * * @throws IOException if an I/O exception occurs. */ public long getLength() throws IOException { return file.length(); } /** * * @throws IOException if an I/O exception occurs. */ public long getMaxLength() throws IOException { return Long.MAX_VALUE; } /** * * @throws IOException if an I/O exception occurs. */ public String getName() throws IOException { return file.getName(); } /** * * @throws IOException if an I/O exception occurs. */ public OutputStream getOutputStream(boolean overwrite) throws IOException { // file.getPath compatible with pre-1.4 JREs return new FileOutputStream(file.getPath(), !overwrite); } /** * * @throws IOException if an I/O exception occurs. */ public JNLPRandomAccessFile getRandomAccessFile(String mode) throws IOException { return new XJNLPRandomAccessFile(file, mode); } /** * * @throws IOException if an I/O exception occurs. */ public long setMaxLength(long maxlength) throws IOException { return maxlength; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/ServiceUtil.java0000644000000000000000000000013113441742745025200 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/ServiceUtil.java0000644000175000002070000003067113441742745026020 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.AccessController; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import javax.jnlp.BasicService; import javax.jnlp.ClipboardService; import javax.jnlp.DownloadService; import javax.jnlp.DownloadService2; import javax.jnlp.ExtensionInstallerService; import javax.jnlp.FileOpenService; import javax.jnlp.FileSaveService; import javax.jnlp.PersistenceService; import javax.jnlp.PrintService; import javax.jnlp.ServiceManager; import javax.jnlp.SingleInstanceService; import javax.jnlp.UnavailableServiceException; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.ApplicationInstance; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.SecurityDialogs; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.security.dialogresults.AccessWarningPaneComplexReturn; import net.sourceforge.jnlp.util.logging.OutputController; /** * Provides static methods to interact useful for using the JNLP * services. * * @author Jon A. Maxwell (JAM) - initial author * @author Joshua Sumali * @version $Revision: 1.8 $ */ public class ServiceUtil { /** * @return the BasicService reference, or null if the service is * unavailable. */ public static BasicService getBasicService() { return (BasicService) getService("javax.jnlp.BasicService"); } /** * @return the ClipboardService reference, or null if the service is * unavailable. */ public static ClipboardService getClipboardService() { return (ClipboardService) getService("javax.jnlp.ClipboardService"); } /** * @return the DownloadService reference, or null if the service is * unavailable. */ public static DownloadService getDownloadService() { return (DownloadService) getService("javax.jnlp.DownloadService"); } /** * @return the DownloadService reference, or null if the service is * unavailable. */ public static DownloadService2 getDownloadService2() { return (DownloadService2) getService("javax.jnlp.DownloadService2"); } /** * @return the ExtensionInstallerService reference, or null if the service is * unavailable. */ public static ExtensionInstallerService getExtensionInstallerService() { return (ExtensionInstallerService) getService("javax.jnlp.ExtensionInstallerService"); } /** * @return the FileOpenService reference, or null if the service is * unavailable. */ public static FileOpenService getFileOpenService() { return (FileOpenService) getService("javax.jnlp.FileOpenService"); } /** * @return the FileSaveService reference, or null if the service is * unavailable. */ public static FileSaveService getFileSaveService() { return (FileSaveService) getService("javax.jnlp.FileSaveService"); } /** * @return the PersistenceService reference, or null if the service is * unavailable. */ public static PersistenceService getPersistenceService() { return (PersistenceService) getService("javax.jnlp.PersistenceService"); } /** * @return the PrintService reference, or null if the service is * unavailable. */ public static PrintService getPrintService() { return (PrintService) getService("javax.jnlp.PrintService"); } /** * @return the SingleInstanceService reference, or null if the service is * unavailable. */ public static SingleInstanceService getSingleInstanceService() { return (SingleInstanceService) getService("javax.jnlp.SingleInstanceService"); } /** * Checks that this application (represented by the jnlp) isnt already running * @param jnlpFile the {@link JNLPFile} that specifies the application * * @throws InstanceExistsException if an instance of this application already exists */ public static void checkExistingSingleInstance(JNLPFile jnlpFile) { ExtendedSingleInstanceService esis = (ExtendedSingleInstanceService) getSingleInstanceService(); esis.checkSingleInstanceRunning(jnlpFile); } /** * Returns the service, or null instead of an UnavailableServiceException */ private static Object getService(String name) { try { return ServiceManager.lookup(name); } catch (UnavailableServiceException ex) { return null; } } /** * Creates a Proxy object implementing the specified interface * when makes all calls in the security context of the system * classes (ie, AllPermissions). This means that the services * must be more than extremely careful in the operations they * perform. */ static Object createPrivilegedProxy(Class iface, final Object receiver) { return java.lang.reflect.Proxy.newProxyInstance(XServiceManagerStub.class.getClassLoader(), new Class[] { iface }, new PrivilegedHandler(receiver)); } /** * calls the object's method using privileged access */ private static class PrivilegedHandler implements InvocationHandler { private final Object receiver; PrivilegedHandler(Object receiver) { this.receiver = receiver; } @Override public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable { if (JNLPRuntime.isDebug()) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "call privileged method: " + method.getName()); if (args != null) { for (Object arg : args) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, " arg: " + arg); } } } PrivilegedExceptionAction invoker = new PrivilegedExceptionAction() { @Override public Object run() throws Exception { return method.invoke(receiver, args); } }; try { Object result = AccessController.doPrivileged(invoker); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, " result: " + result); return result; } catch (PrivilegedActionException e) { // Any exceptions thrown by the actual methods are wrapped by a // InvocationTargetException, which is further wrapped by the // PrivilegedActionException. Lets unwrap them to make the // proxy transparent to the callers if (e.getCause() instanceof InvocationTargetException) { throw e.getCause().getCause(); } else { throw e.getCause(); } } } }; /** * Returns whether the app requesting a JNLP service has the right permissions. * If it doesn't, user is prompted for permissions. This method should only be * used for JNLP API related permissions. * * @param type the type of access being requested * @param extras extra Strings (usually) that are passed to the dialog for * message formatting. * @return true if the access was granted, false otherwise. */ public static boolean checkAccess(AccessType type, Object... extras) { return checkAccess(null, type, extras); } /** * Returns whether the app requesting a JNLP service has the right permissions. * If it doesn't, user is prompted for permissions. This method should only be * used for JNLP API related permissions. * * @param app the application which is requesting the check. If null, the current * application is used. * @param type the type of access being requested * @param extras extra Strings (usually) that are passed to the dialog for * message formatting. * @return true if the access was granted, false otherwise. */ public static boolean checkAccess(ApplicationInstance app, AccessType type, Object... extras) { boolean trusted = isSigned(app); if (!trusted) { if (!shouldPromptUser()) { return false; } if (app == null) { app = JNLPRuntime.getApplication(); } final AccessType tmpType = type; final Object[] tmpExtras = extras; final ApplicationInstance tmpApp = app; //We need to do this to allow proper icon loading for unsigned //applets, otherwise permissions won't be granted to load icons //from resources.jar. Boolean b = AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { AccessWarningPaneComplexReturn r = SecurityDialogs.showAccessWarningDialog(tmpType, tmpApp.getJNLPFile(), tmpExtras); if (r == null) { return false; } return r.toBoolean(); } }); return b; } return true; //allow } /** * Returns whether the current runtime configuration allows prompting the * user for JNLP permissions. * * @return true if the user should be prompted for JNLP API related permissions. */ private static boolean shouldPromptUser() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { return Boolean.valueOf(JNLPRuntime.getConfiguration() .getProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER_FOR_JNLP)); } }); } /** * Returns whether the app requesting a JNLP service is a trusted * application * * @param app * the application which is requesting the check. If null, the * current application is used. * @return true, if the app is a trusted application; false otherwise */ public static boolean isSigned(ApplicationInstance app) { if (app == null) { app = JNLPRuntime.getApplication(); } StackTraceElement[] stack = Thread.currentThread().getStackTrace(); for (StackTraceElement stack1 : stack) { Class c = null; try { c = Class.forName(stack1.getClassName()); } catch (Exception e1) { OutputController.getLogger().log(e1); try { c = Class.forName(stack1.getClassName(), false, app.getClassLoader()); }catch (Exception e2) { OutputController.getLogger().log(e2); } } // Everything up to the desired class/method must be trusted if (c == null || // class not found (c.getProtectionDomain().getCodeSource() != null && // class is not in bootclasspath c.getProtectionDomain().getCodeSource().getCodeSigners() == null) // class is trusted ) { return false; } } return true; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XServiceManagerStub.java0000644000000000000000000000013213441742745026624 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XServiceManagerStub.java0000644000175000002070000000775713441742745027454 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import javax.jnlp.*; /** * Lookup table for services. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.6 $ */ public class XServiceManagerStub implements ServiceManagerStub { // todo: only include ExtensionInstallerService if an installer // is getting the service, otherwise return null. // todo: fix services to do their own privileged actions that // run less code in the secure environment (or avoid privileged // actions by giving permission to the code source). private static String serviceNames[] = { "javax.jnlp.BasicService", // required "javax.jnlp.DownloadService", // required "javax.jnlp.DownloadService2", "javax.jnlp.ExtendedService", "javax.jnlp.ExtensionInstallerService", // required "javax.jnlp.PersistenceService", "javax.jnlp.FileOpenService", "javax.jnlp.FileSaveService", "javax.jnlp.ClipboardService", "javax.jnlp.PrintService", "javax.jnlp.SingleInstanceService" }; private static Object services[] = { ServiceUtil.createPrivilegedProxy(BasicService.class, new XBasicService()), ServiceUtil.createPrivilegedProxy(DownloadService.class, new XDownloadService()), ServiceUtil.createPrivilegedProxy(DownloadService2.class, new XDownloadService2()), ServiceUtil.createPrivilegedProxy(ExtendedService.class, new XExtendedService()), ServiceUtil.createPrivilegedProxy(ExtensionInstallerService.class, new XExtensionInstallerService()), ServiceUtil.createPrivilegedProxy(PersistenceService.class, new XPersistenceService()), ServiceUtil.createPrivilegedProxy(FileOpenService.class, new XFileOpenService()), ServiceUtil.createPrivilegedProxy(FileSaveService.class, new XFileSaveService()), ServiceUtil.createPrivilegedProxy(ClipboardService.class, new XClipboardService()), ServiceUtil.createPrivilegedProxy(PrintService.class, new XPrintService()), ServiceUtil.createPrivilegedProxy(ExtendedSingleInstanceService.class, new XSingleInstanceService()) }; public XServiceManagerStub() { } /** * Returns the service names. */ public String[] getServiceNames() { // make sure it is a copy because we might be returning to // code we don't own. String result[] = new String[serviceNames.length]; System.arraycopy(serviceNames, 0, result, 0, serviceNames.length); return result; } /** * Returns the service. * * @throws UnavailableServiceException if service is not available */ public Object lookup(String name) throws UnavailableServiceException { // exact match for (int i = 0; i < serviceNames.length; i++) if (serviceNames[i].equals(name)) return services[i]; // substring match for (int i = 0; i < serviceNames.length; i++) if (-1 != serviceNames[i].indexOf(name)) return services[i]; throw new UnavailableServiceException("" + name); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XExtendedService.java0000644000000000000000000000013013441742745026152 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XExtendedService.java0000644000175000002070000000365213441742745026772 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import java.io.File; import java.io.IOException; import javax.jnlp.ExtendedService; import javax.jnlp.FileContents; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; /** * Implementation of ExtendedService * * @author Omair Majid * */ public class XExtendedService implements ExtendedService { public FileContents openFile(File file) throws IOException { File secureFile = new File(file.getPath()); /* FIXME: this opens a file with read/write mode, not just read or write */ if (ServiceUtil.checkAccess(AccessType.READ_FILE, new Object[] { secureFile.getAbsolutePath() })) { return (FileContents) ServiceUtil.createPrivilegedProxy(FileContents.class, new XFileContents(secureFile)); } else { return null; } } public FileContents[] openFiles(File[] files) throws IOException { FileContents[] contents = new FileContents[files.length]; for (int i = 0; i < files.length; i++) { contents[i] = openFile(files[i]); } return contents; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/ExtendedSingleInstanceService.jav0000644000000000000000000000013013441742745030510 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/ExtendedSingleInstanceService.java0000644000175000002070000000325013441742745031463 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import javax.jnlp.SingleInstanceService; import net.sourceforge.jnlp.JNLPFile; /** * Extends SingleInstanceService to provide a few additional methods that are * required to initialize SingleInstanceService and check things. These methods * are not exposed publicly * * @author Omair Majid * */ interface ExtendedSingleInstanceService extends SingleInstanceService { /** * Check if the instance identified by this jnlp file is already running * * @param jnlpFile The JNLPFile that specifies the application * * @throws InstanceExistsException if an instance of this application * already exists * */ void checkSingleInstanceRunning(JNLPFile jnlpFile); /** * Start a single instance service based on the current application */ void initializeSingleInstance(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XFileOpenService.java0000644000000000000000000000013213441742745026115 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XFileOpenService.java0000644000175000002070000000752413441742745026735 0ustar00jvanekmock00000000000000/* XFileOpenService.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.services; import java.io.*; import javax.jnlp.*; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import javax.swing.JFileChooser; /** * The FileOpenService JNLP service. * * @author Joshua Sumali */ class XFileOpenService implements FileOpenService { protected XFileOpenService() { } /** * Prompts the user to select a single file. */ public FileContents openFileDialog(java.lang.String pathHint, java.lang.String[] extensions) throws java.io.IOException { if (ServiceUtil.checkAccess(AccessType.READ_FILE)) { //open a file dialog here, let the user choose the file. JFileChooser chooser = new JFileChooser(); int chosen = chooser.showOpenDialog(null); if (chosen == JFileChooser.APPROVE_OPTION) { return (FileContents) ServiceUtil.createPrivilegedProxy( FileContents.class, new XFileContents(chooser.getSelectedFile())); } else { return null; } } else { return null; } } /** * Prompts the user to select one or more files. */ public FileContents[] openMultiFileDialog(java.lang.String pathHint, java.lang.String[] extensions) throws java.io.IOException { if (ServiceUtil.checkAccess(AccessType.WRITE_FILE)) { JFileChooser chooser = new JFileChooser(); chooser.setMultiSelectionEnabled(true); int chosen = chooser.showOpenDialog(null); if (chosen == JFileChooser.APPROVE_OPTION) { File[] files = chooser.getSelectedFiles(); int length = files.length; FileContents[] result = new FileContents[length]; for (int i = 0; i < length; i++) { XFileContents xfile = new XFileContents(files[i]); result[i] = (FileContents) ServiceUtil.createPrivilegedProxy(FileContents.class, xfile); } return result; } else { return null; } } else { return null; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/SingleInstanceLock.java0000644000000000000000000000013213441742745026462 xustar0030 mtime=1552401893.041832819 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/SingleInstanceLock.java0000644000175000002070000001326213441742745027276 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.net.BindException; import java.net.ServerSocket; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.util.FileUtils; /** * This class represents a Lock for single instance jnlp applications * * The lock is per-session, per user. * * @author Omair Majid */ class SingleInstanceLock { JNLPFile jnlpFile; File lockFile = null; public static final int INVALID_PORT = Integer.MIN_VALUE; int port = INVALID_PORT; /** * Create an object to manage the instance lock for the specified JNLP file. * * @param jnlpFile the jnlpfile to create the lock for */ public SingleInstanceLock(JNLPFile jnlpFile) { this.jnlpFile = jnlpFile; lockFile = getLockFile(); } /** * Create/overwrite the instance lock for the jnlp file. * * @param localPort the network port for the lock * @throws IOException on any io problems */ public void createWithPort(int localPort) throws IOException { FileUtils.createRestrictedFile(lockFile, true); BufferedWriter lockFileWriter = new BufferedWriter(new FileWriter(lockFile, false)); lockFileWriter.write(String.valueOf(localPort)); lockFileWriter.newLine(); lockFileWriter.flush(); lockFileWriter.close(); } /** * Returns true if the lock if valid. That is, the lock exists, and port it * points to is listening for incoming messages. */ public boolean isValid() { return (exists() && getPort() != INVALID_PORT && !isPortFree(getPort())); } /** * Returns the port in this lock file. */ public int getPort() { if (!exists()) { return INVALID_PORT; } try { parseFile(); } catch (NumberFormatException e) { port = INVALID_PORT; } catch (IOException e) { port = INVALID_PORT; } return port; } /** * Returns true if the lock file already exists. */ private boolean exists() { return lockFile.exists(); } /** * Returns true if the port is free. */ private boolean isPortFree(int port) { try { ServerSocket socket = new ServerSocket(port); socket.close(); return true; } catch (BindException e) { return false; } catch (IOException e) { throw new RuntimeException(e); } } /** * Return a file object that represents the lock file. The lock file itself * may or may not exist. */ private File getLockFile() { File baseDir = PathsAndFiles.LOCKS_DIR.getFile(); if (!baseDir.isDirectory()) { if (!baseDir.getParentFile().isDirectory() && !baseDir.getParentFile().mkdirs()) { throw new RuntimeException(R("RNoLockDir", baseDir)); } try { FileUtils.createRestrictedDirectory(baseDir); } catch (IOException e) { throw new RuntimeException(R("RNoLockDir", baseDir)); } } String lockFileName = getLockFileName(); File applicationLockFile = new File(baseDir, lockFileName); return applicationLockFile; } /** * Returns the name of the lock file. */ private String getLockFileName() { String initialName = ""; if (jnlpFile.getSourceLocation() != null) { initialName = initialName + jnlpFile.getSourceLocation(); } else { initialName = initialName + jnlpFile.getFileLocation(); } if (jnlpFile.getFileVersion() != null) { initialName = initialName + jnlpFile.getFileVersion().toString(); } initialName = initialName + getCurrentDisplay(); return FileUtils.sanitizeFileName(initialName); } /** * Parse the lock file. * * @throws NumberFormatException * @throws IOException */ private void parseFile() throws NumberFormatException, IOException { BufferedReader lockFileReader = new BufferedReader(new FileReader(lockFile)); int port = Integer.valueOf(lockFileReader.readLine()); lockFileReader.close(); this.port = port; } /** * Returns a string identifying this display. * * Implementation note: On systems with X support, this is the DISPLAY * variable * * @return a string that is guaranteed to be not null. */ private String getCurrentDisplay() { String display = System.getenv("DISPLAY"); return (display == null) ? "" : display; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XPersistenceService.java0000644000000000000000000000013213441742745026700 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XPersistenceService.java0000644000175000002070000001453413441742745027517 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import java.io.*; import java.net.*; import java.util.*; import javax.jnlp.*; import net.sourceforge.jnlp.cache.*; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.*; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.OutputController; /** * The BasicService JNLP service. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.7 $ */ class XPersistenceService implements PersistenceService { // todo: recheck delete, etc to make sure security is tight protected XPersistenceService() { } /** * Checks whether the application has access to URL area * requested. If the method returns normally then the specified * location can be accessed by the current application. * * @throws MalformedURLException if the application cannot access the location */ protected void checkLocation(URL location) throws MalformedURLException { ApplicationInstance app = JNLPRuntime.getApplication(); if (app == null) throw new MalformedURLException("Cannot determine the current application."); URL source = app.getJNLPFile().getCodeBase(); if (!source.getHost().equalsIgnoreCase(location.getHost()) && !ServiceUtil.isSigned(app)) // Allow trusted application to have access to data from a different host throw new MalformedURLException( "Untrusted application cannot access data from a different host."); // test for above codebase, not perfect but works for now String requestPath = location.getFile(); if (-1 != requestPath.lastIndexOf("/")) requestPath = requestPath.substring(0, requestPath.lastIndexOf("/")); else requestPath = ""; OutputController.getLogger().log("codebase path: " + source.getFile()); OutputController.getLogger().log("request path: " + requestPath); if (!source.getFile().startsWith(requestPath) && !ServiceUtil.isSigned(app)) // Allow trusted application to have access to data below source URL path throw new MalformedURLException( "Cannot access data below source URL path."); } /** * Converts a URL into a file in the persistence store. * * @return the file */ protected File toCacheFile(URL location) throws MalformedURLException { String pcache = PathsAndFiles.PCACHE_DIR.getFullPath(); return CacheUtil.urlToPath(location, pcache); } /** * * @return the maximum size of storage that got granted, in bytes * @throws MalformedURLException if the application cannot access the location */ public long create(URL location, long maxsize) throws MalformedURLException, IOException { checkLocation(location); File file = toCacheFile(location); FileUtils.createParentDir(file, "Persistence store for " + location.toString()); if (file.exists()) throw new IOException("File already exists."); FileUtils.createRestrictedFile(file, true); return maxsize; } /** * * @throws MalformedURLException if the application cannot access the location */ public void delete(URL location) throws MalformedURLException, IOException { checkLocation(location); FileUtils.deleteWithErrMesg(toCacheFile(location), " tocache"); } /** * * @throws MalformedURLException if the application cannot access the location */ public FileContents get(URL location) throws MalformedURLException, IOException, FileNotFoundException { checkLocation(location); File file = toCacheFile(location); if (!file.exists()) { throw new FileNotFoundException("Persistence store for " + location.toString() + " is not found."); } FileUtils.createParentDir(file, "Persistence store for " + location.toString()); return (FileContents) ServiceUtil.createPrivilegedProxy(FileContents.class, new XFileContents(file)); } /** * * @throws MalformedURLException if the application cannot access the location */ public String[] getNames(URL location) throws MalformedURLException, IOException { checkLocation(location); File file = toCacheFile(location); if (!file.isDirectory()) return new String[0]; List result = new ArrayList(); // check whether this is right: only add files and not directories. File entries[] = file.listFiles(); for (int i = 0; i < entries.length; i++) if (entries[i].isFile()) result.add(entries[i].getName()); return result.toArray(new String[result.size()]); } /** * * @throws MalformedURLException if the application cannot access the location */ public int getTag(URL location) throws MalformedURLException, IOException { checkLocation(location); // todo: actually implement tags if (toCacheFile(location).exists()) return PersistenceService.CACHED; return PersistenceService.CACHED; } /** * * @throws MalformedURLException if the application cannot access the location */ public void setTag(URL location, int tag) throws MalformedURLException, IOException { checkLocation(location); // todo: actually implement tags } } icedtea-web-1.8/netx/net/sourceforge/jnlp/services/PaxHeaders.7406/XDownloadService.java0000644000000000000000000000013213441742745026163 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/services/XDownloadService.java0000644000175000002070000001735113441742745027002 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.services; import java.io.*; import java.net.*; import javax.jnlp.*; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.runtime.JNLPClassLoader; import net.sourceforge.jnlp.runtime.ManageJnlpResources; import net.sourceforge.jnlp.runtime.JNLPRuntime; /** * The DownloadService JNLP service. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.7 $ */ class XDownloadService implements DownloadService { /** * Returns the {@link JNLPClassLoader} of the application * @return the {@link JNLPClassLoader} of the application */ JNLPClassLoader getClassLoader() { return (JNLPClassLoader) JNLPRuntime.getApplication().getClassLoader(); } /** * Returns a listener that will automatically display download * progress to the user. * @return always {@code null} */ public DownloadServiceListener getDefaultProgressWindow() { return null; } /** * Returns whether the part in an extension (specified by the * url and version) is cached locally. */ public boolean isExtensionPartCached(URL ref, String version, String part) { boolean allCached = true; Version resourceVersion = (version == null) ? null : new Version(version); JARDesc[] jars = ManageJnlpResources.findJars(this.getClassLoader(), ref, part, resourceVersion); if (jars.length <= 0) return false; for (int i = 0; i < jars.length && allCached; i++) { allCached = CacheUtil.isCached(jars[i].getLocation(), resourceVersion); } return allCached; } /** * Returns whether the parts in an extension (specified by the * url and version) are cached locally. */ public boolean isExtensionPartCached(URL ref, String version, String[] parts) { boolean allCached = true; if (parts.length <= 0) return false; for (String eachPart : parts) allCached = this.isExtensionPartCached(ref, version, eachPart); return allCached; } /** * Returns whether the part of the calling application is cached * locally. If called by code specified by an extension * descriptor, the specified part refers to the extension not * the application. */ public boolean isPartCached(String part) { boolean allCached = true; JARDesc[] jars = ManageJnlpResources.findJars(this.getClassLoader(), null, part, null); if (jars.length <= 0) return false; for (int i = 0; i < jars.length && allCached; i++) { allCached = CacheUtil.isCached(jars[i].getLocation(), null); } return allCached; } /** * Returns whether all of the parts of the calling application * are cached locally. If called by code in an extension, the * part refers the the part of the extension not the * application. */ public boolean isPartCached(String[] parts) { boolean allCached = true; if (parts.length <= 0) return false; for (String eachPart : parts) allCached = this.isPartCached(eachPart); return allCached; } /** * Returns whether the resource is cached locally. This method * only returns true if the resource is specified by the calling * application or extension. */ public boolean isResourceCached(URL ref, String version) { return ManageJnlpResources.isExternalResourceCached(this.getClassLoader(), ref, version); } /** * Downloads the parts of an extension. * * @throws IOException */ public void loadExtensionPart(URL ref, String version, String[] parts, DownloadServiceListener progress) throws IOException { for (String eachPart : parts) this.loadExtensionPart(ref, version, eachPart, progress); } /** * Downloads a part of an extension. * * @throws IOException */ public void loadExtensionPart(URL ref, String version, String part, DownloadServiceListener progress) throws IOException { Version resourceVersion = (version == null) ? null : new Version(version); ManageJnlpResources.downloadJars(this.getClassLoader(), ref, part, resourceVersion); } /** * Downloads the parts. * * @throws IOException */ public void loadPart(String[] parts, DownloadServiceListener progress) throws IOException { for (String eachPart : parts) this.loadPart(eachPart, progress); } /** * Downloads the part. * * @throws IOException */ public void loadPart(String part, DownloadServiceListener progress) throws IOException { ManageJnlpResources.downloadJars(this.getClassLoader(), null, part, null); } /** * Downloads a resource. * * @throws IOException */ public void loadResource(URL ref, String version, DownloadServiceListener progress) throws IOException { ManageJnlpResources.loadExternalResouceToCache(this.getClassLoader(), ref, version); } /** * Notify the system that an extension's part is no longer * important to cache. * * @throws IOException */ public void removeExtensionPart(URL ref, String version, String part) throws IOException { Version resourceVersion = (version == null) ? null : new Version(version); JARDesc[] jars = ManageJnlpResources.findJars(this.getClassLoader(), ref, part, resourceVersion); ManageJnlpResources.removeCachedJars(this.getClassLoader(), ref, jars); } /** * Notify the system that an extension's parts are no longer * important to cache. * * @throws IOException */ public void removeExtensionPart(URL ref, String version, String[] parts) throws IOException { for (String eachPart : parts) this.removeExtensionPart(ref, version, eachPart); } /** * Notifies the system that a part is no longer important to * cache. * * @throws IOException */ public void removePart(String part) throws IOException { JARDesc[] jars = ManageJnlpResources.findJars(this.getClassLoader(), null, part, null); ManageJnlpResources.removeCachedJars(this.getClassLoader(), null, jars); } /** * Notifies the system that the parts is no longer important to * cache. * * @throws IOException */ public void removePart(String[] parts) throws IOException { for (String eachPart : parts) this.removePart(eachPart); } /** * Notifies the system that the resource is no longer important * to cache. * * @throws IOException */ public void removeResource(URL ref, String version) throws IOException { ManageJnlpResources.removeExternalCachedResource(this.getClassLoader(), ref, version); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/security0000644000000000000000000000013113441742745022046 xustar0030 mtime=1552401893.061832777 29 atime=1552410887.11418344 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/0000755000175000002070000000000013441742745022734 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/PluginAppVerifier.java0000644000000000000000000000013213441742745026362 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PluginAppVerifier.java0000644000175000002070000002141413441742745027174 0ustar00jvanekmock00000000000000/* PluginAppVerifier.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import static net.sourceforge.jnlp.runtime.Translator.R; import java.security.cert.CertPath; import java.util.ArrayList; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogresults.YesNoSandbox; import net.sourceforge.jnlp.tools.CertInformation; import net.sourceforge.jnlp.tools.JarCertVerifier; public class PluginAppVerifier implements AppVerifier { @Override public boolean hasAlreadyTrustedPublisher( Map certs, Map signedJars) { boolean allPublishersTrusted = true; for(String jarName : signedJars.keySet()) { int numbSignableEntries = signedJars.get(jarName); boolean publisherTrusted = false; for (CertInformation certInfo : certs.values()) { if(certInfo.isSignerOfJar(jarName) && numbSignableEntries == certInfo.getNumJarEntriesSigned(jarName) && certInfo.isPublisherAlreadyTrusted()) { publisherTrusted = true; break; } } allPublishersTrusted &= publisherTrusted; } return allPublishersTrusted; } @Override public boolean hasRootInCacerts(Map certs, Map signedJars) { boolean allRootCAsTrusted = true; for(String jarName : signedJars.keySet()) { int numbSignableEntries = signedJars.get(jarName); boolean rootCATrusted = false; for (CertInformation certInfo : certs.values()) { if(certInfo.isSignerOfJar(jarName) && numbSignableEntries == certInfo.getNumJarEntriesSigned(jarName) && certInfo.isRootInCacerts()) { rootCATrusted = true; break; } } allRootCAsTrusted &= rootCATrusted; } return allRootCAsTrusted; } @Override public boolean isFullySigned(Map certs, Map signedJars) { boolean isFullySigned = true; for(String jarName : signedJars.keySet()) { int numbSignableEntries = signedJars.get(jarName); boolean isSigned = false; for (CertInformation certInfo : certs.values()) { if(certInfo.isSignerOfJar(jarName) && numbSignableEntries == certInfo.getNumJarEntriesSigned(jarName)) { isSigned = true; break; } } isFullySigned &= isSigned; } return isFullySigned; } @Override public void checkTrustWithUser(SecurityDelegate securityDelegate, JarCertVerifier jcv, JNLPFile file) throws LaunchException { List certPaths = buildCertPathsList(jcv); List alreadyApprovedByUser = new ArrayList(); for (String jarName : jcv.getJarSignableEntries().keySet()) { boolean trustFoundOrApproved = false; for (CertPath cPathApproved : alreadyApprovedByUser) { jcv.setCurrentlyUsedCertPath(cPathApproved); CertInformation info = jcv.getCertInformation(cPathApproved); if (info.isSignerOfJar(jarName) && alreadyApprovedByUser.contains(cPathApproved)) { trustFoundOrApproved = true; break; } } if (trustFoundOrApproved) { continue; } for (CertPath cPath : certPaths) { jcv.setCurrentlyUsedCertPath(cPath); CertInformation info = jcv.getCertInformation(cPath); if (info.isSignerOfJar(jarName)) { if (info.isPublisherAlreadyTrusted()) { trustFoundOrApproved = true; alreadyApprovedByUser.add(cPath); break; } AccessType dialogType; if (info.isRootInCacerts() && !info.hasSigningIssues()) { dialogType = AccessType.VERIFIED; } else if (info.isRootInCacerts()) { dialogType = AccessType.SIGNING_ERROR; } else { dialogType = AccessType.UNVERIFIED; } YesNoSandbox action = SecurityDialogs.showCertWarningDialog( dialogType, file, jcv, securityDelegate); if (action != null && action.toBoolean()) { if (action.compareValue(BasicDialogValue.Primitive.SANDBOX)) { securityDelegate.setRunInSandbox(); } alreadyApprovedByUser.add(cPath); trustFoundOrApproved = true; break; } } } if (!trustFoundOrApproved) { throw new LaunchException(null, null, R("LSFatal"), R("LCLaunching"), R("LCancelOnUserRequest"), ""); } } } /** * Build a list of all the CertPaths that were detected in the provided * JCV, placing them in the most trusted possible order. * @param jcv The verifier containing the CertPaths to examine. * @return A list of CertPaths sorted in the following order: Signers with * 1. Already trusted publishers * 2. Roots in the CA store and have no signing issues * 3. Roots in the CA store but have signing issues * 4. Everything else */ public List buildCertPathsList(JarCertVerifier jcv) { List certPathsList = jcv.getCertsList(); List returnList = new ArrayList(); for (CertPath cPath : certPathsList) { if (!returnList.contains(cPath) && jcv.getCertInformation(cPath).isPublisherAlreadyTrusted()) returnList.add(cPath); } for (CertPath cPath : certPathsList) { if (!returnList.contains(cPath) && jcv.getCertInformation(cPath).isRootInCacerts() && !jcv.getCertInformation(cPath).hasSigningIssues()) returnList.add(cPath); } for (CertPath cPath : certPathsList) { if (!returnList.contains(cPath) && jcv.getCertInformation(cPath).isRootInCacerts() && jcv.getCertInformation(cPath).hasSigningIssues()) returnList.add(cPath); } for (CertPath cPath : certPathsList) { if (!returnList.contains(cPath)) returnList.add(cPath); } return returnList; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/CertVerifier.java0000644000000000000000000000013213441742745025360 xustar0030 mtime=1552401893.060832779 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/CertVerifier.java0000644000175000002070000000613013441742745026170 0ustar00jvanekmock00000000000000/* CertVerifier.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.security.cert.CertPath; import java.security.cert.Certificate; import java.util.List; /** * An interface that provides various details about certificates of an app. */ public interface CertVerifier { /** * @return if the publisher is already trusted */ public boolean getAlreadyTrustPublisher(); /** * @return if the root is in CA certs */ public boolean getRootInCacerts(); /** * @return if there are signing issues with the certificate being verified * @param certPath to be validated */ public boolean hasSigningIssues(CertPath certPath); /** * @return the details regarding issue with this certificate * @param certPath certificate */ public List getDetails(CertPath certPath); /** * @return a valid certificate path to this certificate being verified * @param certPath to be read */ public CertPath getCertPath(CertPath certPath); /** * @return the application's publisher's certificate. * @param certPath to be read for publisher */ public abstract Certificate getPublisher(CertPath certPath); /** * @return the application's root's certificate. This * may return the same certificate as getPublisher(CertPath certPath) in * the event that the application is self signed. * @param certPath certificate * */ public abstract Certificate getRoot(CertPath certPath); } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/VariableX509TrustManager.java0000644000000000000000000000013213441742745027437 xustar0030 mtime=1552401893.035832831 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java0000644000175000002070000004056113441742745030255 0ustar00jvanekmock00000000000000/* VariableX509TrustManager.java Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.Socket; import java.security.AccessController; import java.security.KeyStore; import java.security.PrivilegedAction; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLSocket; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogresults.YesNoSandbox; import net.sourceforge.jnlp.util.logging.OutputController; import sun.security.util.HostnameChecker; import sun.security.validator.ValidatorException; /** * This class implements an X509 Trust Manager. The certificates it trusts are * "variable", in the sense that it can dynamically, and temporarily support * different certificates that are not in the keystore. */ final public class VariableX509TrustManager { /** TrustManagers containing trusted CAs */ private X509TrustManager[] caTrustManagers = null; /** TrustManagers containing trusted certificates */ private X509TrustManager[] certTrustManagers = null; /** TrustManagers containing trusted client certificates */ private X509TrustManager[] clientTrustManagers = null; private ArrayList temporarilyTrusted = new ArrayList<>(); private ArrayList temporarilyUntrusted = new ArrayList<>(); private static VariableX509TrustManager instance = null; /** * Constructor initializes the system, user and custom stores */ public VariableX509TrustManager() { /* * Load TrustManagers for trusted certificates */ try { /** KeyStores containing trusted certificates */ KeyStore[] trustedCertKeyStores = KeyStores.getCertKeyStores(); certTrustManagers = new X509TrustManager[trustedCertKeyStores.length]; for (int j = 0; j < trustedCertKeyStores.length; j++) { TrustManagerFactory tmFactory = TrustManagerFactory.getInstance("SunX509", "SunJSSE"); tmFactory.init(trustedCertKeyStores[j]); // tm factory initialized, now get the managers so we can assign the X509 one TrustManager[] trustManagers = tmFactory.getTrustManagers(); for (TrustManager trustManager : trustManagers) { if (trustManager instanceof X509TrustManager) { certTrustManagers[j] = (X509TrustManager) trustManager; } } } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } /* * Load TrustManagers for trusted CAs */ try { /** KeyStores containing trusted CAs */ KeyStore[] trustedCAKeyStores = KeyStores.getCAKeyStores(); caTrustManagers = new X509TrustManager[trustedCAKeyStores.length]; for (int j = 0; j < caTrustManagers.length; j++) { TrustManagerFactory tmFactory = TrustManagerFactory.getInstance("SunX509", "SunJSSE"); tmFactory.init(trustedCAKeyStores[j]); // tm factory initialized, now get the managers so we can extract the X509 one TrustManager[] trustManagers = tmFactory.getTrustManagers(); for (TrustManager trustManager : trustManagers) { if (trustManager instanceof X509TrustManager) { caTrustManagers[j] = (X509TrustManager) trustManager; } } } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } /* * Load TrustManagers for trusted clients certificates */ try { KeyStore[] clientKeyStores = KeyStores.getClientKeyStores(); clientTrustManagers = new X509TrustManager[clientKeyStores.length]; for (int j = 0; j < clientTrustManagers.length; j++) { TrustManagerFactory tmFactory = TrustManagerFactory.getInstance("SunX509", "SunJSSE"); tmFactory.init(clientKeyStores[j]); // tm factory initialized, now get the managers so we can extract the X509 one TrustManager[] trustManagers = tmFactory.getTrustManagers(); for (TrustManager trustManager : trustManagers) { if (trustManager instanceof X509TrustManager) { clientTrustManagers[j] = (X509TrustManager) trustManager; } } } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } /** * Check if client is trusted (no support for custom here, only system/user) * @param chain certificate chain * @param authType type of authentification * @param hostName hostnem * @throws java.security.cert.CertificateException if certificate is wrong */ public void checkTrustClient(X509Certificate[] chain, String authType, String hostName) throws CertificateException { boolean trusted = false; ValidatorException savedException = null; for (X509TrustManager clientTrustManager : clientTrustManagers) { try { clientTrustManager.checkClientTrusted(chain, authType); trusted = true; break; }catch (ValidatorException caex) { savedException = caex; } } if (trusted) { return; } throw savedException; } /** * Check if the server is trusted. * * First, existing stores are checked to see if the certificate is trusted. * Next, if the certificate is not explicitly trusted by the user, a host * name check is performed. The user is them prompted as needed. * * @param chain The cert chain * @param authType The auth type algorithm * @param hostName The expected hostName that the server should have * @param socket The SSLSocket in use (may be null) * @param engine The SSLEngine in use (may be null) * @throws java.security.cert.CertificateException if certificate is wrong */ public synchronized void checkTrustServer(X509Certificate[] chain, String authType, String hostName, SSLSocket socket, SSLEngine engine) throws CertificateException { CertificateException ce = null; boolean trusted = true; boolean CNMatched = false; // Check trust stores try { checkAllManagers(chain, authType, socket, engine); } catch (CertificateException e) { trusted = false; ce = e; } // If the certificate is not explicitly trusted, we // check host match if (!isExplicitlyTrusted(chain, authType)) { if (hostName != null) { try { HostnameChecker checker = HostnameChecker .getInstance(HostnameChecker.TYPE_TLS); checker.match(hostName, chain[0]); // only need to match @ 0 for CN CNMatched = true; } catch (CertificateException e) { ce = e; } } } else { // If it is explicitly trusted, just return right away. return; } // If it is (not explicitly trusted) AND // ((it is not in store) OR (there is a host mismatch)) if (!trusted || !CNMatched) { if (!isTemporarilyUntrusted(chain[0])) { boolean b = askUser(chain, authType, trusted, CNMatched, hostName); if (b) { temporarilyTrust(chain[0]); return; } else { temporarilyUntrust(chain[0]); } } throw ce; } } /** * Check system, user and custom trust manager. * * This method is intended to work with both, JRE6 and JRE7. If socket * and engine are null, it assumes that the call is for JRE6 (i.e. not * javax.net.ssl.X509ExtendedTrustManager which is Java 7 specific). If * either of those are not null, it will assume that the caTrustManagers * are javax.net.ssl.X509ExtendedTrustManager instances and will * invoke their check methods. * * @param chain The certificate chain * @param authType The authentication type * @param socket the SSLSocket being used for the connection * @param engine the SSLEngine being used for the connection */ private void checkAllManagers(X509Certificate[] chain, String authType, Socket socket, SSLEngine engine) throws CertificateException { // first try CA TrustManagers boolean trusted = false; ValidatorException savedException = null; for (X509TrustManager caTrustManager : caTrustManagers) { try { if (socket == null && engine == null) { caTrustManager.checkServerTrusted(chain, authType); } else { try { Class x509ETMClass = Class.forName("javax.net.ssl.X509ExtendedTrustManager"); if (engine == null) { Method mcheckServerTrusted = x509ETMClass.getDeclaredMethod("checkServerTrusted", X509Certificate[].class, String.class, Socket.class); mcheckServerTrusted.invoke(caTrustManager, chain, authType, socket); } else { Method mcheckServerTrusted = x509ETMClass.getDeclaredMethod("checkServerTrusted", X509Certificate[].class, String.class, SSLEngine.class); mcheckServerTrusted.invoke(caTrustManager, chain, authType, engine); } }catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | ClassNotFoundException nsme) { throw new ValidatorException(nsme.getMessage()); } } trusted = true; break; }catch (ValidatorException caex) { savedException = caex; } } if (trusted) { return; } for (X509TrustManager certTrustManager : certTrustManagers) { try { certTrustManager.checkServerTrusted(chain, authType); trusted = true; break; }catch (ValidatorException caex) { savedException = caex; } } if (trusted) { return; } // finally check temp trusted certs if (!temporarilyTrusted.contains(chain[0])) { if (savedException == null) { // OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "IMPOSSIBLE!"); throw new ValidatorException(ValidatorException.T_SIGNATURE_ERROR, chain[0]); } throw savedException; } } /** * Return if the user explicitly trusted this i.e. in userTrustManager or temporarilyTrusted */ private boolean isExplicitlyTrusted(X509Certificate[] chain, String authType) { boolean explicitlyTrusted = false; for (X509TrustManager certTrustManager : certTrustManagers) { try { certTrustManager.checkServerTrusted(chain, authType); explicitlyTrusted = true; break; }catch (ValidatorException uex) { if (temporarilyTrusted.contains(chain[0])) { explicitlyTrusted = true; break; } }catch (CertificateException ce) { // not explicitly trusted } } return explicitlyTrusted; } protected X509Certificate[] getAcceptedIssuers() { List issuers = new ArrayList<>(); for (X509TrustManager caTrustManager : caTrustManagers) { issuers.addAll(Arrays.asList(caTrustManager.getAcceptedIssuers())); } return issuers.toArray(new X509Certificate[issuers.size()]); } /** * Temporarily untrust the given cert - do not ask the user to trust this * certificate again * * @param c The certificate to trust */ private void temporarilyUntrust(Certificate c) { temporarilyUntrusted.add(c); } /** * Was this certificate explicitly untrusted by user? * * @param c the certificate * @return true if the user was presented with this certificate and chose * not to trust it */ private boolean isTemporarilyUntrusted(Certificate c) { return temporarilyUntrusted.contains(c); } /** * Temporarily trust the given cert (runtime) * * @param c The certificate to trust */ private void temporarilyTrust(Certificate c) { temporarilyTrusted.add(c); } /** * Ask user if the certificate should be trusted * * @param chain The certificate chain * @param authType The authentication algorithm * @return user's response */ private boolean askUser(final X509Certificate[] chain, final String authType, final boolean isTrusted, final boolean hostMatched, final String hostName) { return AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { YesNoSandbox r = SecurityDialogs.showCertWarningDialog( AccessType.UNVERIFIED, null, new HttpsCertVerifier(chain, authType, isTrusted, hostMatched, hostName), null); if (r == null) { return false; } return r.compareValue(BasicDialogValue.Primitive.YES); } }); } /** * Return an instance of this singleton * * @return The instance */ public static VariableX509TrustManager getInstance() { if (instance == null) instance = new VariableX509TrustManager(); return instance; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/KeyStores.java0000644000000000000000000000013213441742745024717 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/KeyStores.java0000644000175000002070000003121613441742745025532 0ustar00jvanekmock00000000000000/* KeyStores.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.AllPermission; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import net.sourceforge.jnlp.config.InfrastructureFileDescriptor; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.OutputController; /** * The {@code KeyStores} class allows easily accessing the various KeyStores * used. */ public final class KeyStores { public static class KeyStoreWithPath { private final KeyStore ks; private final String path; public KeyStoreWithPath(KeyStore ks, String path) { this.ks = ks; this.path = path; } public KeyStore getKs() { return ks; } public String getPath() { return path; } } /* this gets turned into user-readable strings, see toUserReadableString */ public enum Level { USER, SYSTEM, } public enum Type { CERTS, JSSE_CERTS, CA_CERTS, JSSE_CA_CERTS, CLIENT_CERTS, } public static final Map keystoresPaths = new HashMap<>(); private static final String KEYSTORE_TYPE = "JKS"; /** * Returns a KeyStore corresponding to the appropriate level level (user or * system) and type. * * @param level whether the KeyStore desired is a user-level or system-level * KeyStore * @param type the type of KeyStore desired * @return a KeyStore containing certificates from the appropriate */ public static final KeyStoreWithPath getKeyStore(Level level, Type type) { boolean create; if (level == Level.USER) { create = true; } else { create = false; } return getKeyStore(level, type, create); } /** * Returns a KeyStore corresponding to the appropriate level level (user or * system) and type. * * @param level whether the KeyStore desired is a user-level or system-level * KeyStore * @param type the type of KeyStore desired * @param create true if keystore can be created * @return a KeyStore containing certificates from the appropriate */ private static final KeyStoreWithPath getKeyStore(Level level, Type type, boolean create) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(new AllPermission()); } String location = getKeyStoreLocation(level, type).getFullPath(); KeyStore ks = null; try { ks = createKeyStoreFromFile(new File(location), create); //hashcode is used instead of instance so when no references are left //to keystore, then this will not be blocker for garbage collection keystoresPaths.put(ks.hashCode(), location); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } return new KeyStoreWithPath(ks, location); } public static String getPathToKeystore(int k) { String s = keystoresPaths.get(k); if (s == null) { return "unknown keystore location"; } return s; } /** * Returns an array of KeyStore that contain certificates that are trusted. * The KeyStores contain certificates from different sources. * * @return an array of KeyStore containing trusted Certificates */ public static final KeyStore[] getCertKeyStores() { List result = new ArrayList<>(10); /* System-level JSSE certificates */ KeyStore ks = getKeyStore(Level.SYSTEM, Type.JSSE_CERTS).getKs(); if (ks != null) { result.add(ks); } /* System-level certificates */ ks = getKeyStore(Level.SYSTEM, Type.CERTS).getKs(); if (ks != null) { result.add(ks); } /* User-level JSSE certificates */ ks = getKeyStore(Level.USER, Type.JSSE_CERTS).getKs(); if (ks != null) { result.add(ks); } /* User-level certificates */ ks = getKeyStore(Level.USER, Type.CERTS).getKs(); if (ks != null) { result.add(ks); } return result.toArray(new KeyStore[result.size()]); } /** * Returns an array of KeyStore that contain trusted CA certificates. * * @return an array of KeyStore containing trusted CA certificates */ public static final KeyStore[] getCAKeyStores() { List result = new ArrayList<>(10); /* System-level JSSE CA certificates */ KeyStore ks = getKeyStore(Level.SYSTEM, Type.JSSE_CA_CERTS).getKs(); if (ks != null) { result.add(ks); } /* System-level CA certificates */ ks = getKeyStore(Level.SYSTEM, Type.CA_CERTS).getKs(); if (ks != null) { result.add(ks); } /* User-level JSSE CA certificates */ ks = getKeyStore(Level.USER, Type.JSSE_CA_CERTS).getKs(); if (ks != null) { result.add(ks); } /* User-level CA certificates */ ks = getKeyStore(Level.USER, Type.CA_CERTS).getKs(); if (ks != null) { result.add(ks); } return result.toArray(new KeyStore[result.size()]); } /** * Returns KeyStores containing trusted client certificates * * @return an array of KeyStore objects that can be used to check client * authentication certificates */ public static KeyStore[] getClientKeyStores() { List result = new ArrayList<>(); KeyStore ks = getKeyStore(Level.SYSTEM, Type.CLIENT_CERTS).getKs(); if (ks != null) { result.add(ks); } ks = getKeyStore(Level.USER, Type.CLIENT_CERTS).getKs(); if (ks != null) { result.add(ks); } return result.toArray(new KeyStore[result.size()]); } /** * Returns the location of a KeyStore corresponding to the given level and * type. * * @param level the specified level of the key store to be returned. * @param type the specified type of the key store to be returned. * @return the location of the key store. */ public static final InfrastructureFileDescriptor getKeyStoreLocation(Level level, Type type) { switch (level) { case SYSTEM: switch (type) { case JSSE_CA_CERTS: return PathsAndFiles.SYS_JSSECAC; case CA_CERTS: return PathsAndFiles.SYS_CACERT; case JSSE_CERTS: return PathsAndFiles.SYS_JSSECERT; case CERTS: return PathsAndFiles.SYS_CERT; case CLIENT_CERTS: return PathsAndFiles.SYS_CLIENTCERT; } break; case USER: switch (type) { case JSSE_CA_CERTS: return PathsAndFiles.USER_JSSECAC; case CA_CERTS: return PathsAndFiles.USER_CACERTS; case JSSE_CERTS: return PathsAndFiles.USER_JSSECER; case CERTS: return PathsAndFiles.USER_CERTS; case CLIENT_CERTS: return PathsAndFiles.USER_CLIENTCERT; } break; } throw new RuntimeException("Unspported"); } /** * Returns a String that can be used as a translation key to create a * user-visible representation of this KeyStore. Creates a string by * concatenating a level and type, converting everything to Title Case and * removing the _'s. (USER,CA_CERTS) becomes UserCaCerts. * * @param level the level of the key store. * @param type the type of the key store. * @return the translation key. */ public static final String toTranslatableString(Level level, Type type) { StringBuilder response = new StringBuilder(); response.append("KS"); if (level != null) { String levelString = level.toString(); response.append(levelString.substring(0, 1).toUpperCase()); response.append(levelString.substring(1).toLowerCase()); } if (type != null) { String typeString = type.toString(); StringTokenizer tokenizer = new StringTokenizer(typeString, "_"); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); response.append(token.substring(0, 1).toUpperCase()); response.append(token.substring(1).toLowerCase()); } } return response.toString(); } /** * Returns a human readable name for this KeyStore * * @param level the level of the KeyStore * @param type the type of KeyStore * @return a localized name for this KeyStore */ public static String toDisplayableString(Level level, Type type) { return Translator.R(toTranslatableString(level, type)); } /** * Reads the file (using the password) and uses it to create a new * {@link KeyStore}. If the file does not exist and should not be created, * it returns an empty but initialized KeyStore * * @param file the file to load information from * @return a KeyStore containing data from the file */ private static final KeyStore createKeyStoreFromFile(File file, boolean createIfNotFound) throws IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException { FileInputStream fis = null; KeyStore ks = null; try { if (createIfNotFound && !file.exists()) { File parent = file.getParentFile(); if (!parent.isDirectory() && !parent.mkdirs()) { throw new IOException("unable to create " + parent); } FileUtils.createRestrictedFile(file, true); ks = KeyStore.getInstance(KEYSTORE_TYPE); SecurityUtil.loadKeyStore(ks, null); SecurityUtil.storeKeyStore(ks, file); } if (file.exists()) { ks = KeyStore.getInstance(KEYSTORE_TYPE); SecurityUtil.loadKeyStore(ks, file); } else { ks = KeyStore.getInstance(KEYSTORE_TYPE); SecurityUtil.loadKeyStore(ks, null); } } finally { if (fis != null) { fis.close(); } } return ks; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/policyeditor0000644000000000000000000000013113441742745024554 xustar0030 mtime=1552401893.067832765 29 atime=1552410887.11418344 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/0000755000175000002070000000000013441742745025442 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEditor.java0000644000000000000000000000013213441742745030103 xustar0030 mtime=1552401893.067832765 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java0000644000175000002070000022641413441742745030724 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.Color; import java.awt.Container; import java.awt.Dialog.ModalityType; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Window; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyAdapter; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.ref.WeakReference; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import javax.swing.AbstractAction; import javax.swing.AbstractButton; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.SwingWorker; import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.sourceforge.jnlp.about.AboutDialog; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.policyeditor.PolicyEditorPermissions.Group; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.FileUtils.OpenFileResult; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.docprovider.PolicyEditorTextsProvider; import net.sourceforge.jnlp.util.docprovider.TextsProvider; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.PlainTextFormatter; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.optionparser.OptionParser; import net.sourceforge.swing.SwingUtils; import sun.security.provider.PolicyParser; /** * This class provides a policy editing tool as a simpler alternate to * the JDK PolicyTool. */ public class PolicyEditor extends JPanel { private boolean closed = false; private final Map checkboxMap = new TreeMap<>(); private final List groupBoxList = new ArrayList<>(Group.values().length); private final JScrollPane scrollPane = new JScrollPane(); private final DefaultListModel listModel = new DefaultListModel<>(); private final JList list = new JList<>(listModel); private final JButton okButton = new JButton(), closeButton = new JButton(), addEntryButton = new JButton(), removeEntryButton = new JButton(); private final JFileChooser fileChooser; private CustomPolicyViewer cpViewer = null; /** * See showChangesSavedDialog/showCouldNotSaveDialog. This weak reference is needed because * there is a modal child dialog which can sometimes appear after the editor has been closed * and disposed. In this case, its parent should be set to 'null', but otherwise the parent * should be the editor so that the dialog is modal. */ private final WeakReference parentPolicyEditor = new WeakReference<>(this); public final PolicyEditorController policyEditorController = new PolicyEditorController(); private final ActionListener okButtonAction, addEntryButtonAction, removeEntryButtonAction, newButtonAction, openButtonAction, openDefaultButtonAction, saveAsButtonAction, viewCustomButtonAction, modifyCodebaseButtonAction, modifyPrincipalsButtonAction, modifySignedByButtonAction, copyEntryButtonAction, pasteEntryButtonAction, policyEditorHelpButtonAction, aboutPolicyEditorButtonAction, aboutItwButtonAction; private final ActionListener closeButtonAction; private static class JCheckBoxWithGroup extends JCheckBox { private final PolicyEditorPermissions.Group group; private JCheckBoxWithGroup(Group group) { super(group.getTitle()); this.group = group; } public Group getGroup() { return group; } private void setState(final Map map) { final List backup = new LinkedList<>(); for (final ActionListener l : this.getActionListeners()) { backup.add(l); this.removeActionListener(l); } final int i = group.getState(map); this.setBackground(getParent().getBackground()); if (i > 0) { this.setSelected(true); } if (i < 0) { this.setSelected(false); } if (i == 0) { this.setBackground(Color.yellow); this.setSelected(false); } for (final ActionListener al : backup) { this.addActionListener(al); } } } private static class PrincipalsPanel extends JPanel { private final DefaultListModel principals = new DefaultListModel<>(); public PrincipalsPanel(final Collection entries) { super(); setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); for (final PolicyParser.PrincipalEntry principalEntry : entries) { principals.addElement(principalEntry); } final JList principalsList = new JList<>(principals); final JScrollPane scrollPane = new JScrollPane(principalsList); final JButton addButton = new JButton(R("PEAddPrincipal")); addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final JTextField className = new JTextField(); final JTextField principalName = new JTextField(); final int option = JOptionPane.showConfirmDialog( null, new Object[]{R("PEPrincipalClassNameInputLabel"), className, R("PEPrincipalPrincipalNameInputLabel"), principalName}, R("PEAddPrincipal"), JOptionPane.OK_CANCEL_OPTION ); if (option == JOptionPane.OK_OPTION) { final PolicyParser.PrincipalEntry entry = new PolicyParser.PrincipalEntry(className.getText(), principalName.getText()); principals.addElement(entry); } } }); final JButton removeButton = new JButton(R("PERemovePrincipal")); removeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { principals.removeElement(principalsList.getSelectedValue()); } }); final JButton editButton = new JButton(R("PEEditPrincipal")); editButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final PolicyParser.PrincipalEntry entry = principalsList.getSelectedValue(); if (entry == null) { return; } final JTextField className = new JTextField(); final JTextField principalName = new JTextField(); className.setText(entry.getDisplayClass()); principalName.setText(entry.getDisplayName()); final int option = JOptionPane.showConfirmDialog( null, new Object[]{R("PEPrincipalClassNameInputLabel"), className, R("PEPrincipalPrincipalNameInputLabel"), principalName}, R("PEEditPrincipal"), JOptionPane.OK_CANCEL_OPTION ); if (option == JOptionPane.OK_OPTION) { principals.removeElement(entry); final PolicyParser.PrincipalEntry newEntry = new PolicyParser.PrincipalEntry(className.getText(), principalName.getText()); principals.addElement(newEntry); } } }); add(scrollPane); add(addButton); add(editButton); add(removeButton); } public List getPrincipals() { final List entries = new ArrayList<>(principals.size()); for (final PolicyParser.PrincipalEntry entry : Collections.list(principals.elements())) { entries.add(entry); } return entries; } } public PolicyEditor(final String filepath) { super(); setLayout(new GridBagLayout()); for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { final JCheckBox box = new JCheckBox(); box.setText(perm.getName()); box.setToolTipText(perm.getDescription()); checkboxMap.put(perm, box); } setFile(filepath); addDefaultAllAppletsIdentifier(); setChangesMade(false); fileChooser = new JFileChooser(policyEditorController.getFile()); fileChooser.setFileHidingEnabled(false); okButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent event) { if (policyEditorController.getFile() == null) { final int choice = fileChooser.showOpenDialog(PolicyEditor.this); if (choice == JFileChooser.APPROVE_OPTION) { PolicyEditor.this.setFile(fileChooser.getSelectedFile().getAbsolutePath()); } } // May still be null if user cancelled the file chooser if (policyEditorController.getFile() != null) { setChangesMade(true); savePolicyFile(); } } }; okButton.setText(R("ButApply")); okButton.addActionListener(okButtonAction); addEntryButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { addNewIdentifierInteractive(); } }; addEntryButton.setText(R("PEAddEntry")); addEntryButton.addActionListener(addEntryButtonAction); removeEntryButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { removeIdentifier(getSelectedPolicyIdentifier()); } }; removeEntryButton.setText(R("PERemoveEntry")); removeEntryButton.addActionListener(removeEntryButtonAction); newButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { if (!promptOnSaveChangesMade(false)) { return; } setFile(null); setChangesMade(false); } }; openButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { if (!promptOnSaveChangesMade(true)) { return; } final int choice = fileChooser.showOpenDialog(PolicyEditor.this); if (choice == JFileChooser.APPROVE_OPTION) { PolicyEditor.this.setFile(fileChooser.getSelectedFile().getAbsolutePath()); openAndParsePolicyFile(); } } }; openDefaultButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent event) { if (!promptOnSaveChangesMade(true)) { return; } try { PolicyEditor.this.setFile(getDefaultPolicyFilePath()); PolicyEditor.this.getFile().createNewFile(); } catch (final IOException | URISyntaxException e) { OutputController.getLogger().log(e); return; } openAndParsePolicyFile(); } }; saveAsButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final int choice = fileChooser.showSaveDialog(PolicyEditor.this); if (choice == JFileChooser.APPROVE_OPTION) { PolicyEditor.this.setFile(fileChooser.getSelectedFile().getAbsolutePath()); setChangesMade(true); savePolicyFile(); } } }; modifyCodebaseButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { if (getSelectedPolicyIdentifier().equals(PolicyIdentifier.ALL_APPLETS_IDENTIFIER)) { return; } final String oldCodebase = getSelectedPolicyIdentifier().getCodebase(); String newCodebase; do { newCodebase = JOptionPane.showInputDialog(PolicyEditor.this, R("PEModifyCodebase"), oldCodebase); if (newCodebase == null) { return; } } while (!validateCodebase(newCodebase)); modifyCodebase(getSelectedPolicyIdentifier(), newCodebase); } }; modifyPrincipalsButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { if (getSelectedPolicyIdentifier().equals(PolicyIdentifier.ALL_APPLETS_IDENTIFIER)) { return; } final PrincipalsPanel panel = new PrincipalsPanel(getSelectedPolicyIdentifier().getPrincipals()); final int option = JOptionPane.showConfirmDialog( null, new Object[]{ R("PEPrincipalsInputLabel"), panel }, R("PEEntryPrompt"), JOptionPane.OK_CANCEL_OPTION ); if (option == JOptionPane.OK_OPTION) { modifyPrincipals(getSelectedPolicyIdentifier(), panel.getPrincipals()); } } }; modifySignedByButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { if (getSelectedPolicyIdentifier().equals(PolicyIdentifier.ALL_APPLETS_IDENTIFIER)) { return; } final String newSignedBy = JOptionPane.showInputDialog(PolicyEditor.this, R("PEModifySignedBy"), getSelectedPolicyIdentifier().getSignedBy()); if (newSignedBy == null) { return; } modifySignedBy(getSelectedPolicyIdentifier(), newSignedBy); } }; copyEntryButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { copyEntry(getSelectedPolicyIdentifier()); } }; pasteEntryButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { PolicyIdentifier identifier = null; try { identifier = PolicyEditorController.getPolicyEntryFromClipboard().getPolicyIdentifier(); pasteEntry(promptForPolicyIdentifier(identifier)); } catch (final UnsupportedFlavorException ufe) { OutputController.getLogger().log(ufe); showClipboardErrorDialog(); } catch (final PolicyParser.ParsingException pe) { OutputController.getLogger().log(pe); showInvalidPolicyExceptionDialog(identifier); } catch (final IOException ioe) { OutputController.getLogger().log(ioe); showCouldNotAccessClipboardDialog(); } } }; viewCustomButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { final PolicyIdentifier policyIdentifier = getSelectedPolicyIdentifier(); if (policyIdentifier == null) { return; } if (cpViewer == null) { cpViewer = new CustomPolicyViewer(PolicyEditor.this, policyIdentifier); cpViewer.setVisible(true); } else { cpViewer.toFront(); cpViewer.repaint(); } } }); } }; policyEditorHelpButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { new PolicyEditorAboutDialog(R("PEHelpDialogTitle"), R("PEHelpDialogContent")).setVisible(true); } }; aboutPolicyEditorButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { boolean modal = getModality(); AboutDialog.display(modal, TextsProvider.POLICY_EDITOR, AboutDialog.ShowPage.HELP); } }; aboutItwButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { boolean modal = getModality(); AboutDialog.display(modal, TextsProvider.POLICY_EDITOR); } }; closeButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent event) { final Window parentWindow = SwingUtils.getWindowAncestor(PolicyEditor.this); if (parentWindow instanceof PolicyEditorWindow) { ((PolicyEditorWindow) parentWindow).quit(); } } }; closeButton.setText(R("ButClose")); closeButton.addActionListener(closeButtonAction); setupLayout(); } private static String getDefaultPolicyFilePath() throws URISyntaxException { return new File(new URI(PathsAndFiles.JAVA_POLICY.getFullPath())).getAbsolutePath(); } private void addDefaultAllAppletsIdentifier() { addNewEntry(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); } private boolean getModality() { boolean modal = false; Container parent = PolicyEditor.this; while (true) { if (parent == null) { break; } if (parent instanceof JDialog) { modal = ((JDialog) parent).isModal(); break; } parent = parent.getParent(); } return modal; } /** * * @param async use asynchronous saving, which displays a progress dialog, or use synchronous, which blocks the * EDT but allows for eg the on-disk file to be changed without resorting to a busy-wait loop * @return false iff the user wishes to cancel the operation and keep the current editor state */ private boolean promptOnSaveChangesMade(final boolean async) { if (policyEditorController.changesMade()) { final int save = JOptionPane.showConfirmDialog(this, R("PESaveChanges")); if (save == JOptionPane.YES_OPTION) { if (getFile() == null) { final int choice = fileChooser.showSaveDialog(this); if (choice == JFileChooser.APPROVE_OPTION) { this.setFile(fileChooser.getSelectedFile().getAbsolutePath()); } else if (choice == JFileChooser.CANCEL_OPTION) { return false; } } if (async) { savePolicyFile(); } else { try { policyEditorController.savePolicyFile(); } catch (final IOException e) { showCouldNotSaveDialog(); } } } else if (save == JOptionPane.CANCEL_OPTION) { return false; } } return true; } public void setFile(final String filepath) { if (filepath != null) { policyEditorController.setFile(new File(filepath)); } else { policyEditorController.setFile(null); resetEntries(); addDefaultAllAppletsIdentifier(); } setParentWindowTitle(getWindowTitleForStatus()); } private void setParentWindowTitle(final String title) { SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { final Window parent = SwingUtils.getWindowAncestor(PolicyEditor.this); if (!(parent instanceof PolicyEditorWindow)) { return; } final PolicyEditorWindow window = (PolicyEditorWindow) parent; window.setTitle(title); } }); } private String getWindowTitleForStatus() { final String filepath; final File file = getFile(); if (file != null) { filepath = file.getPath(); } else { filepath = null; } final String titleAndPath; if (filepath != null) { titleAndPath = R("PETitleWithPath", filepath); } else { titleAndPath = R("PETitle"); } final String result; if (policyEditorController.changesMade()) { result = R("PETitleWithChangesMade", titleAndPath); } else { result = titleAndPath; } return result; } private PolicyIdentifier getSelectedPolicyIdentifier() { return list.getSelectedValue(); } private static void preparePolicyEditorWindow(final PolicyEditorWindow w, final PolicyEditor e) { w.setModalityType(ModalityType.MODELESS); //at least some default w.setPolicyEditor(e); w.setTitle(R("PETitle")); w.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); w.setJMenuBar(createMenuBar(w.getPolicyEditor())); setupPolicyEditorWindow(w.asWindow(), w.getPolicyEditor()); } private static void setupPolicyEditorWindow(final Window window, final PolicyEditor editor) { window.add(editor); window.pack(); editor.setVisible(true); window.addWindowListener(new WindowAdapter() { @Override public void windowClosing(final WindowEvent e) { ((PolicyEditorWindow) window).quit(); } }); } public interface PolicyEditorWindow { void setTitle(String s); void setDefaultCloseOperation(int i); PolicyEditor getPolicyEditor(); void setPolicyEditor(PolicyEditor e); void setJMenuBar(JMenuBar menu); Window asWindow(); void setModalityType(ModalityType modalityType); void quit(); } private static class PolicyEditorFrame extends JFrame implements PolicyEditorWindow { private PolicyEditor editor; private PolicyEditorFrame(final PolicyEditor editor) { super(); setIconImages(ImageResources.INSTANCE.getApplicationImages()); preparePolicyEditorWindow(this, editor); } @Override public final void setTitle(String title) { super.setTitle(title); } @Override public final PolicyEditor getPolicyEditor() { return editor; } @Override public final void setPolicyEditor(final PolicyEditor e) { editor = e; } @Override public final void setDefaultCloseOperation(final int operation) { super.setDefaultCloseOperation(operation); } @Override public final void setJMenuBar(final JMenuBar menu) { super.setJMenuBar(menu); } @Override public final Window asWindow() { return this; } @Override public void setModalityType(final ModalityType type) { //no op for frame } @Override public void quit() { policyEditorWindowQuit(this); } } /* * Casting a Window to PolicyEditorWindow is not generally safe - be sure that * the argument passed to this method is actually a PolicyEditorDialog or PolicyEditorFrame. */ private static void policyEditorWindowQuit(final Window window) { final PolicyEditor editor = ((PolicyEditorWindow) window).getPolicyEditor(); editor.parentPolicyEditor.clear(); if (editor.policyEditorController.changesMade()) { final int save = JOptionPane.showConfirmDialog(window, R("PESaveChanges")); if (save == JOptionPane.YES_OPTION) { if (editor.policyEditorController.getFile() == null) { final int choice = editor.fileChooser.showSaveDialog(window); if (choice == JFileChooser.APPROVE_OPTION) { editor.setFile(editor.fileChooser.getSelectedFile().getAbsolutePath()); } else if (choice == JFileChooser.CANCEL_OPTION) { return; } } try { editor.policyEditorController.savePolicyFile(); } catch (final IOException e) { OutputController.getLogger().log(e); editor.showCouldNotSaveDialog(); return; } } else if (save == JOptionPane.CANCEL_OPTION) { return; } } editor.setClosed(); window.dispose(); } public static PolicyEditorWindow getPolicyEditorFrame(final String filepath) { return new PolicyEditorFrame(new PolicyEditor(filepath)); } private static class PolicyEditorDialog extends JDialog implements PolicyEditorWindow { private PolicyEditor editor; private PolicyEditorDialog(final PolicyEditor editor) { super(); preparePolicyEditorWindow(this, editor); } @Override public final void setTitle(final String title) { super.setTitle(title); } @Override public final PolicyEditor getPolicyEditor() { return editor; } @Override public final void setPolicyEditor(final PolicyEditor e) { editor = e; } @Override public final void setDefaultCloseOperation(final int operation) { super.setDefaultCloseOperation(operation); } @Override public final void setJMenuBar(final JMenuBar menu) { super.setJMenuBar(menu); } @Override public final Window asWindow() { return this; } @Override public void setModalityType(final ModalityType type) { super.setModalityType(type); } @Override public void quit() { policyEditorWindowQuit(this); } } public static PolicyEditorWindow getPolicyEditorDialog(final String filepath) { return new PolicyEditorDialog(new PolicyEditor(filepath)); } private void setClosed() { closed = true; } /** * Check if the PolicyEditor instance has been visually closed * @return if the PolicyEditor instance has been closed */ public boolean isClosed() { return closed; } /** * Called by the Custom Policy Viewer on its parent Policy Editor when * the Custom Policy Viewer is closing */ void customPolicyViewerClosing() { cpViewer = null; } /** * Add a new identifier to the editor's model. * @param identifier to be added */ public void addNewEntry(final PolicyIdentifier identifier) { if (!validateCodebase(identifier.getCodebase())) { return; } policyEditorController.addIdentifier(identifier); SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { listModel.clear(); for (final PolicyIdentifier identifier : policyEditorController.getIdentifiers()) { listModel.addElement(identifier); } list.setSelectedValue(identifier, true); updateCheckboxes(identifier); } }); } static PolicyIdentifier identifierFromCodebase(final String codebase) { if (codebase.isEmpty() || codebase.equals(Translator.R("PEGlobalSettings"))) { return PolicyIdentifier.ALL_APPLETS_IDENTIFIER; } return new PolicyIdentifier(null, Collections.emptyList(), codebase); } private static boolean validateCodebase(final String codebase) { if (codebase == null || codebase.isEmpty()) { return true; } try { new URL(codebase); } catch (final MalformedURLException mue) { return false; } return true; } public File getFile() { return policyEditorController.getFile(); } /** * Display an input dialog, which will disappear when the user enters a valid entry * or when the user presses cancel. */ public void addNewIdentifierInteractive() { SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { final PolicyIdentifier identifier = promptForPolicyIdentifier(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); if (identifier == null) { return; } addNewEntry(identifier); } }); } private PolicyIdentifier promptForPolicyIdentifier(final PolicyIdentifier initialValues) { PolicyIdentifier identifier = initialValues; final JTextField codebase = new JTextField(); final JTextField signedBy = new JTextField(); final PrincipalsPanel principalsPanel = new PrincipalsPanel(Collections.emptySet()); while (identifier.equals(initialValues) || identifier.equals(PolicyIdentifier.ALL_APPLETS_IDENTIFIER) || !validateCodebase(codebase.getText())) { codebase.setText(identifier.getCodebase()); signedBy.setText(identifier.getSignedBy()); final int option = JOptionPane.showConfirmDialog( PolicyEditor.this, new Object[]{R("PECodebaseInputLabel"), codebase, R("PEPrincipalsInputLabel"), principalsPanel, R("PESignedByInputLabel"), signedBy}, R("PEEntryPrompt"), JOptionPane.OK_CANCEL_OPTION ); if (option == JOptionPane.OK_OPTION) { final String cb = codebase.getText().trim().isEmpty() ? null : codebase.getText().trim(); final String sb = signedBy.getText().trim().isEmpty() ? null : signedBy.getText().trim(); identifier = new PolicyIdentifier(sb, principalsPanel.getPrincipals(), cb); if (identifier.equals(initialValues)) { JOptionPane.showMessageDialog(null, R("PEInvalidIdentifier")); } else if (identifier.equals(PolicyIdentifier.ALL_APPLETS_IDENTIFIER)) { JOptionPane.showMessageDialog(null, R("PEIdentifierMatchesAll")); } } else { return null; } } return identifier; } /** * Remove an identifier from the editor's model * @param identifier to be removed */ public void removeIdentifier(final PolicyIdentifier identifier) { if (identifier.equals(PolicyIdentifier.ALL_APPLETS_IDENTIFIER)) { return; } int previousIndex = list.getSelectedIndex() - 1; if (previousIndex < 0) { previousIndex = 0; } policyEditorController.removeIdentifier(identifier); final int fIndex = previousIndex; SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { listModel.removeElement(identifier); list.setSelectedIndex(fIndex); } }); setChangesMade(true); } public void modifyCodebase(final PolicyIdentifier identifier, final String newCodebase) { final PolicyIdentifier newIdentifier = new PolicyIdentifier(identifier.getSignedBy(), identifier.getPrincipals(), newCodebase); replaceIdentifier(identifier, newIdentifier); } public void modifyPrincipals(final PolicyIdentifier identifier, final List principalEntries) { final PolicyIdentifier newIdentifier = new PolicyIdentifier(identifier.getSignedBy(), principalEntries, identifier.getCodebase()); replaceIdentifier(identifier, newIdentifier); } public void modifySignedBy(final PolicyIdentifier identifier, final String newSignedBy) { final PolicyIdentifier newIdentifier = new PolicyIdentifier(newSignedBy, identifier.getPrincipals(), identifier.getCodebase()); replaceIdentifier(identifier, newIdentifier); } private void replaceIdentifier(final PolicyIdentifier oldIdentifier, final PolicyIdentifier newIdentifier) { if (oldIdentifier.equals(PolicyIdentifier.ALL_APPLETS_IDENTIFIER) || newIdentifier.equals(PolicyIdentifier.ALL_APPLETS_IDENTIFIER)) { return; } final Map permissions = getPermissions(oldIdentifier); final Collection customPermissions = getCustomPermissions(oldIdentifier); removeIdentifier(oldIdentifier); addNewEntry(newIdentifier); for (final Map.Entry entry : permissions.entrySet()) { setPermission(newIdentifier, entry.getKey(), entry.getValue()); } for (final PolicyParser.PermissionEntry permission : customPermissions) { addCustomPermission(newIdentifier, permission); } updateCheckboxes(newIdentifier); } /** * Copy an entry to the system clipboard * @param identifier the identifier to copy */ public void copyEntry(final PolicyIdentifier identifier) { if (!policyEditorController.getIdentifiers().contains(identifier)) { return; } policyEditorController.copyPolicyEntryToClipboard(identifier); } /** * Paste a grant entry from the system clipboard with a new identifier */ public void pasteEntry(final PolicyIdentifier identifier) throws UnsupportedFlavorException, PolicyParser.ParsingException, IOException { addNewEntry(identifier); final PolicyEntry policyEntry = PolicyEditorController.getPolicyEntryFromClipboard(); final PolicyEntry newEntry = new PolicyEntry.Builder() .signedBy(identifier.getSignedBy()) .principals(identifier.getPrincipals()) .codebase(identifier.getCodebase()) .permissions(policyEntry.getPermissions()) .customPermissions(policyEntry.getCustomPermissions()) .build(); policyEditorController.addPolicyEntry(newEntry); setChangesMade(true); updateCheckboxes(identifier); } Set getCodebases() { final Set codebases = new HashSet<>(); for (final PolicyIdentifier identifier : policyEditorController.getIdentifiers()) { if (isCodeBaseIdentifier(identifier)) { codebases.add(identifier.getCodebase()); } } return codebases; } static boolean isCodeBaseIdentifier(final PolicyIdentifier identifier) { return (identifier.getSignedBy() == null || identifier.getSignedBy().isEmpty()) && (identifier.getPrincipals() == null || identifier.getPrincipals().isEmpty()) && identifier.getCodebase() != null; } public void setPermission(final PolicyIdentifier identifier, final PolicyEditorPermissions permission, final boolean state) { policyEditorController.setPermission(identifier, permission, state); } public Map getPermissions(final PolicyIdentifier identifier) { return policyEditorController.getPermissions(identifier); } public void addCustomPermission(final PolicyIdentifier identifier, final PolicyParser.PermissionEntry permission) { policyEditorController.addCustomPermission(identifier, permission); } public Collection getCustomPermissions(final PolicyIdentifier identifier) { return policyEditorController.getCustomPermissions(identifier); } public void clearCustomPermissions(final PolicyIdentifier identifier) { policyEditorController.clearCustomIdentifier(identifier); } /** * Update the checkboxes to show the permissions granted to the specified identifier * @param identifier whose permissions to display */ private void updateCheckboxes(final PolicyIdentifier identifier) { SwingUtils.invokeAndWait(new Runnable() { @Override public void run() { updateCheckboxesImpl(identifier); } }); } private void updateCheckboxesImpl(final PolicyIdentifier identifier) { if (!listModel.contains(identifier)) { return; } final Map map = policyEditorController.getCopyOfPermissions().get(identifier); for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { final JCheckBox box = checkboxMap.get(perm); for (final ActionListener l : box.getActionListeners()) { box.removeActionListener(l); } final boolean state = policyEditorController.getPermission(identifier, perm); for (final JCheckBoxWithGroup jg : groupBoxList) { jg.setState(map); } box.setSelected(state); box.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { setChangesMade(true); policyEditorController.setPermission(identifier, perm, box.isSelected()); for (JCheckBoxWithGroup jg : groupBoxList) { jg.setState(map); } } }); } } /** * Set a mnemonic key for a menu item or button * @param button the component for which to set a mnemonic * @param mnemonic the mnemonic to set */ private static void setButtonMnemonic(final AbstractButton button, final String mnemonic) { if (mnemonic.length() != 1) { OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, "Could not set mnemonic \"" + mnemonic + "\" for " + button); return; } final char ch = mnemonic.charAt(0); button.setMnemonic(ch); } private static void setMenuItemAccelerator(final JMenuItem menuItem, final String accelerator) { final KeyStroke ks = KeyStroke.getKeyStroke(accelerator); menuItem.setAccelerator(ks); } private static JMenuBar createMenuBar(final PolicyEditor editor) { final JMenuBar menuBar = new JMenuBar(); final JMenu fileMenu = new JMenu(R("PEFileMenu")); setButtonMnemonic(fileMenu, R("PEFileMenuMnemonic")); final JMenuItem newItem = new JMenuItem(R("PENewMenuItem")); setButtonMnemonic(newItem, R("PENewMenuItemMnemonic")); setMenuItemAccelerator(newItem, R("PENewMenuItemAccelerator")); newItem.addActionListener(editor.newButtonAction); fileMenu.add(newItem); final JMenuItem openItem = new JMenuItem(R("PEOpenMenuItem")); setButtonMnemonic(openItem, R("PEOpenMenuItemMnemonic")); setMenuItemAccelerator(openItem, R("PEOpenMenuItemAccelerator")); openItem.addActionListener(editor.openButtonAction); fileMenu.add(openItem); final JMenuItem openDefaultItem = new JMenuItem(R("PEOpenDefaultMenuItem")); setButtonMnemonic(openDefaultItem, R("PEOpenDefaultMenuItemMnemonic")); setMenuItemAccelerator(openDefaultItem, R("PEOpenDefaultMenuItemAccelerator")); openDefaultItem.addActionListener(editor.openDefaultButtonAction); fileMenu.add(openDefaultItem); final JMenuItem saveItem = new JMenuItem(R("PESaveMenuItem")); setButtonMnemonic(saveItem, R("PESaveMenuItemMnemonic")); setMenuItemAccelerator(saveItem, R("PESaveMenuItemAccelerator")); saveItem.addActionListener(editor.okButtonAction); fileMenu.add(saveItem); final JMenuItem saveAsItem = new JMenuItem(R("PESaveAsMenuItem")); setButtonMnemonic(saveAsItem, R("PESaveAsMenuItemMnemonic")); setMenuItemAccelerator(saveAsItem, R("PESaveAsMenuItemAccelerator")); saveAsItem.addActionListener(editor.saveAsButtonAction); fileMenu.add(saveAsItem); fileMenu.addSeparator(); final JMenuItem exitItem = new JMenuItem(R("PEExitMenuItem")); setButtonMnemonic(exitItem, R("PEExitMenuItemMnemonic")); setMenuItemAccelerator(exitItem, R("PEExitMenuItemAccelerator")); exitItem.addActionListener(editor.closeButtonAction); fileMenu.add(exitItem); menuBar.add(fileMenu); final JMenu entryMenu = new JMenu(R("PEEntryMenu")); setButtonMnemonic(entryMenu, R("PEEntryMenuMnemonic")); final JMenuItem addEntryItem = new JMenuItem(R("PEAddEntryItem")); setButtonMnemonic(addEntryItem, R("PEAddEntryItemMnemonic")); setMenuItemAccelerator(addEntryItem, R("PEAddEntryItemAccelerator")); addEntryItem.addActionListener(editor.addEntryButtonAction); entryMenu.add(addEntryItem); final JMenuItem removeEntryItem = new JMenuItem(R("PERemoveEntryItem")); setButtonMnemonic(removeEntryItem, R("PERemoveEntryItemMnemonic")); setMenuItemAccelerator(removeEntryItem, R("PERemoveEntryItemAccelerator")); removeEntryItem.addActionListener(editor.removeEntryButtonAction); entryMenu.add(removeEntryItem); entryMenu.addSeparator(); final JMenu modifySubmenuItem = new JMenu(R("PEModifySubmenuItem")); setButtonMnemonic(modifySubmenuItem, R("PEModifySubmenuItemMnemonic")); final JMenuItem modifyCodebaseItem = new JMenuItem(R("PEModifyCodebaseItem")); setButtonMnemonic(modifyCodebaseItem, R("PEModifyEntryCodebaseItemMnemonic")); setMenuItemAccelerator(modifyCodebaseItem, R("PEModifyEntryCodebaseItemAccelerator")); modifyCodebaseItem.addActionListener(editor.modifyCodebaseButtonAction); modifySubmenuItem.add(modifyCodebaseItem); final JMenuItem modifyPrincipalsItem = new JMenuItem(R("PEModifyPrincipalsItem")); setButtonMnemonic(modifyPrincipalsItem, R("PEModifyEntryPrincipalsItemMnemonic")); setMenuItemAccelerator(modifyPrincipalsItem, R("PEModifyEntryPrincipalsItemAccelerator")); modifyPrincipalsItem.addActionListener(editor.modifyPrincipalsButtonAction); modifySubmenuItem.add(modifyPrincipalsItem); final JMenuItem modifySignedByItem = new JMenuItem(R("PEModifySignedByItem")); setButtonMnemonic(modifySignedByItem, R("PEModifyEntrySignedByItemMnemonic")); setMenuItemAccelerator(modifySignedByItem, R("PEModifyEntrySignedByItemAccelerator")); modifySignedByItem.addActionListener(editor.modifySignedByButtonAction); modifySubmenuItem.add(modifySignedByItem); entryMenu.add(modifySubmenuItem); entryMenu.addSeparator(); final JMenuItem copyEntryItem = new JMenuItem(R("PECopyEntryItem")); setButtonMnemonic(copyEntryItem, R("PECopyEntryItemMnemonic")); setMenuItemAccelerator(copyEntryItem, R("PECopyEntryItemAccelerator")); copyEntryItem.addActionListener(editor.copyEntryButtonAction); entryMenu.add(copyEntryItem); menuBar.add(entryMenu); final JMenuItem pasteEntryItem = new JMenuItem(R("PEPasteEntryItem")); setButtonMnemonic(pasteEntryItem, R("PEPasteEntryItemMnemonic")); setMenuItemAccelerator(pasteEntryItem, R("PEPasteEntryItemAccelerator")); pasteEntryItem.addActionListener(editor.pasteEntryButtonAction); entryMenu.add(pasteEntryItem); final JMenu viewMenu = new JMenu(R("PEViewMenu")); setButtonMnemonic(viewMenu, R("PEViewMenuMnemonic")); final JMenuItem customPermissionsItem = new JMenuItem(R("PECustomPermissionsItem")); setButtonMnemonic(customPermissionsItem, R("PECustomPermissionsItemMnemonic")); setMenuItemAccelerator(customPermissionsItem, R("PECustomPermissionsItemAccelerator")); customPermissionsItem.addActionListener(editor.viewCustomButtonAction); viewMenu.add(customPermissionsItem); menuBar.add(viewMenu); final JMenu helpMenu = new JMenu(R("PEHelpMenu")); setButtonMnemonic(helpMenu, R("PEHelpMenuMnemonic")); final JMenuItem aboutPolicyEditorItem = new JMenuItem(R("PEAboutPolicyEditorItem")); setButtonMnemonic(aboutPolicyEditorItem, R("PEAboutPolicyEditorItemMnemonic")); aboutPolicyEditorItem.addActionListener(editor.aboutPolicyEditorButtonAction); helpMenu.add(aboutPolicyEditorItem); final JMenuItem aboutITW = new JMenuItem(R("CPTabAbout")); //setButtonMnemonic(aboutPolicyEditorItem, R("PEAboutPolicyEditorItemMnemonic")); aboutITW.addActionListener(editor.aboutItwButtonAction); helpMenu.add(aboutITW); final JMenuItem policyEditorHelpItem = new JMenuItem(R("PEPolicyEditorHelpItem")); setButtonMnemonic(policyEditorHelpItem, R("PEPolicyEditorHelpItemMnemonic")); policyEditorHelpItem.addActionListener(editor.policyEditorHelpButtonAction); helpMenu.addSeparator(); helpMenu.add(policyEditorHelpItem); menuBar.add(helpMenu); /* * JList has default Ctrl-C and Ctrl-V bindings, which we want to override with custom actions */ final InputMap listInputMap = editor.list.getInputMap(); final ActionMap listActionMap = editor.list.getActionMap(); final Action listCopyOverrideAction = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { editor.copyEntryButtonAction.actionPerformed(e); } }; final Action listPasteOverrideAction = new AbstractAction() { @Override public void actionPerformed(final ActionEvent e) { editor.pasteEntryButtonAction.actionPerformed(e); } }; listInputMap.put(copyEntryItem.getAccelerator(), "CopyEntryOverride"); listActionMap.put("CopyEntryOverride", listCopyOverrideAction); listInputMap.put(pasteEntryItem.getAccelerator(), "PasteEntryOverride"); listActionMap.put("PasteEntryOverride", listPasteOverrideAction); return menuBar; } /** * Lay out all controls, tooltips, etc. */ private void setupLayout() { final JLabel checkboxLabel = new JLabel(); checkboxLabel.setText(R("PECheckboxLabel")); checkboxLabel.setBorder(new EmptyBorder(2, 2, 2, 2)); final GridBagConstraints checkboxLabelConstraints = new GridBagConstraints(); checkboxLabelConstraints.gridx = 2; checkboxLabelConstraints.gridy = 0; checkboxLabelConstraints.fill = GridBagConstraints.HORIZONTAL; add(checkboxLabel, checkboxLabelConstraints); final GridBagConstraints checkboxConstraints = new GridBagConstraints(); checkboxConstraints.anchor = GridBagConstraints.LINE_START; checkboxConstraints.fill = GridBagConstraints.HORIZONTAL; checkboxConstraints.weightx = 0; checkboxConstraints.weighty = 0; checkboxConstraints.gridx = 2; checkboxConstraints.gridy = 1; for (final JCheckBox box : checkboxMap.values()) { if (PolicyEditorPermissions.Group.anyContains(box, checkboxMap)) { //do not show boxes in any group continue; } add(box, checkboxConstraints); checkboxConstraints.gridx++; // Two columns of checkboxes if (checkboxConstraints.gridx > 3) { checkboxConstraints.gridx = 2; checkboxConstraints.gridy++; } } // add groups for (final PolicyEditorPermissions.Group g : PolicyEditorPermissions.Group.values()) { // no matter what, put group title on new line checkboxConstraints.gridy++; // all groups are in second column checkboxConstraints.gridx = 2; final JCheckBoxWithGroup groupCh = new JCheckBoxWithGroup(g); groupBoxList.add(groupCh); final JPanel groupPanel = new JPanel(new GridBagLayout()); groupPanel.setBorder(new LineBorder(Color.black)); groupCh.setToolTipText(R("PEGRightClick")); groupCh.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(final MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON3) { toggleExpandedCheckboxGroupPanel(groupPanel); } } }); groupCh.addKeyListener(new KeyAdapter() { @Override public void keyPressed(final KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_CONTEXT_MENU) { toggleExpandedCheckboxGroupPanel(groupPanel); } } }); groupCh.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final PolicyIdentifier identifier = getSelectedPolicyIdentifier(); if (identifier == null) { return; } List backup = new LinkedList<>(); for (final ActionListener l : groupCh.getActionListeners()) { backup.add(l); groupCh.removeActionListener(l); } for (final PolicyEditorPermissions p : groupCh.getGroup().getPermissions()) { policyEditorController.setPermission(identifier, p, groupCh.isSelected()); } setChangesMade(true); updateCheckboxes(identifier); for (final ActionListener al : backup) { groupCh.addActionListener(al); } } }); add(groupCh, checkboxConstraints); // place panel with members below the title checkboxConstraints.gridy++; checkboxConstraints.gridx = 2; // spread group's panel over two columns checkboxConstraints.gridwidth = 2; checkboxConstraints.fill = GridBagConstraints.BOTH; add(groupPanel, checkboxConstraints); final GridBagConstraints groupCheckboxLabelConstraints = new GridBagConstraints(); groupCheckboxLabelConstraints.anchor = GridBagConstraints.LINE_START; groupCheckboxLabelConstraints.weightx = 0; groupCheckboxLabelConstraints.weighty = 0; groupCheckboxLabelConstraints.gridx = 1; groupCheckboxLabelConstraints.gridy = 1; for (final PolicyEditorPermissions p : g.getPermissions()) { groupPanel.add(checkboxMap.get(p), groupCheckboxLabelConstraints); // Two columns of checkboxes groupCheckboxLabelConstraints.gridx++; if (groupCheckboxLabelConstraints.gridx > 2) { groupCheckboxLabelConstraints.gridx = 1; groupCheckboxLabelConstraints.gridy++; } } groupPanel.setVisible(false); // reset checkboxConstraints.gridwidth = 1; } final JLabel entriesListLabel = new JLabel(R("PEEntriesLabel")); entriesListLabel.setBorder(new EmptyBorder(2, 2, 2, 2)); final GridBagConstraints listLabelConstraints = new GridBagConstraints(); listLabelConstraints.fill = GridBagConstraints.HORIZONTAL; listLabelConstraints.gridx = 0; listLabelConstraints.gridy = 0; add(entriesListLabel, listLabelConstraints); list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(final ListSelectionEvent e) { if (e.getValueIsAdjusting()) { return; // ignore first click, act on release } updateCheckboxes(getSelectedPolicyIdentifier()); } }); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setViewportView(list); final GridBagConstraints listConstraints = new GridBagConstraints(); listConstraints.fill = GridBagConstraints.BOTH; listConstraints.weightx = 1; listConstraints.weighty = 1; listConstraints.gridheight = checkboxConstraints.gridy + 1; listConstraints.gridwidth = 2; listConstraints.gridx = 0; listConstraints.gridy = 1; add(scrollPane, listConstraints); final GridBagConstraints addEntryButtonConstraints = new GridBagConstraints(); addEntryButtonConstraints.fill = GridBagConstraints.HORIZONTAL; addEntryButtonConstraints.gridx = 0; addEntryButtonConstraints.gridy = listConstraints.gridy + listConstraints.gridheight + 1; setButtonMnemonic(addEntryButton, R("PEAddEntryMnemonic")); add(addEntryButton, addEntryButtonConstraints); final GridBagConstraints removeEntryButtonConstraints = new GridBagConstraints(); removeEntryButtonConstraints.fill = GridBagConstraints.HORIZONTAL; removeEntryButtonConstraints.gridx = addEntryButtonConstraints.gridx + 1; removeEntryButtonConstraints.gridy = addEntryButtonConstraints.gridy; setButtonMnemonic(removeEntryButton, R("PERemoveEntryMnemonic")); removeEntryButton.setPreferredSize(addEntryButton.getPreferredSize()); add(removeEntryButton, removeEntryButtonConstraints); final GridBagConstraints okButtonConstraints = new GridBagConstraints(); okButtonConstraints.fill = GridBagConstraints.HORIZONTAL; okButtonConstraints.gridx = removeEntryButtonConstraints.gridx + 2; okButtonConstraints.gridy = removeEntryButtonConstraints.gridy; add(okButton, okButtonConstraints); final GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); cancelButtonConstraints.fill = GridBagConstraints.HORIZONTAL; cancelButtonConstraints.gridx = okButtonConstraints.gridx + 1; cancelButtonConstraints.gridy = okButtonConstraints.gridy; add(closeButton, cancelButtonConstraints); setMinimumSize(getPreferredSize()); } void setChangesMade(final boolean b) { policyEditorController.setChangesMade(b); SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { setParentWindowTitle(getWindowTitleForStatus()); } }); } private void resetEntries() { listModel.clear(); policyEditorController.clear(); } /** * @return whether this PolicyEditor is currently opening or saving a policy file to disk */ public boolean isPerformingIO() { return policyEditorController.isPerformingIO(); } public void openPolicyFileSynchronously() { if (getFile() == null) { return; } resetEntries(); final OpenFileResult ofr = FileUtils.testFilePermissions(getFile()); if (ofr == OpenFileResult.FAILURE || ofr == OpenFileResult.NOT_FILE) { addDefaultAllAppletsIdentifier(); OutputController.getLogger().log(R("PECouldNotOpen")); } if (ofr == OpenFileResult.CANT_WRITE) { OutputController.getLogger().log(R("RFileReadOnly")); } try { policyEditorController.openAndParsePolicyFile(); } catch (IOException | PolicyParser.ParsingException e) { OutputController.getLogger().log(e); return; } for (final PolicyIdentifier identifier : policyEditorController.getIdentifiers()) { if (!listModel.contains(identifier)) { listModel.addElement(identifier); } } addDefaultAllAppletsIdentifier(); updateCheckboxes(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); setChangesMade(false); } public void openAndParsePolicyFile() { if (getFile() == null) { return; } resetEntries(); final OpenFileResult ofr = FileUtils.testFilePermissions(getFile()); if (ofr == OpenFileResult.FAILURE || ofr == OpenFileResult.NOT_FILE) { addDefaultAllAppletsIdentifier(); if (policyEditorController.getFile().exists()) { FileUtils.showCouldNotOpenFilepathDialog(PolicyEditor.this, policyEditorController.getFile().getPath()); } return; } if (ofr == OpenFileResult.CANT_WRITE) { FileUtils.showReadOnlyDialog(PolicyEditor.this); } final Window parentWindow = SwingUtils.getWindowAncestor(this); final JDialog progressIndicator = new IndeterminateProgressDialog(parentWindow, "Loading..."); final SwingWorker openPolicyFileWorker = new SwingWorker() { @Override protected Void doInBackground() throws Exception { try { if (parentWindow != null) { SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { progressIndicator.setLocationRelativeTo(parentWindow); progressIndicator.setVisible(true); } }); } policyEditorController.openAndParsePolicyFile(); } catch (final FileNotFoundException fnfe) { OutputController.getLogger().log(fnfe); FileUtils.showCouldNotOpenDialog(PolicyEditor.this, R("PECouldNotOpen")); } catch (final IOException | PolicyParser.ParsingException e) { OutputController.getLogger().log(e); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, R("RCantOpenFile", policyEditorController.getFile().getPath())); FileUtils.showCouldNotOpenDialog(PolicyEditor.this, R("PECouldNotOpen")); } return null; } @Override public void done() { for (final PolicyIdentifier identifier : policyEditorController.getIdentifiers()) { if (!listModel.contains(identifier)) { listModel.addElement(identifier); } } addDefaultAllAppletsIdentifier(); updateCheckboxes(PolicyIdentifier.ALL_APPLETS_IDENTIFIER); progressIndicator.setVisible(false); progressIndicator.dispose(); setChangesMade(false); } }; openPolicyFileWorker.execute(); } /** * Save the policy model into the file pointed to by the filePath field. */ private void savePolicyFile() { final int overwriteChanges = checkPolicyChangesWithDialog(); switch (overwriteChanges) { case JOptionPane.YES_OPTION: openAndParsePolicyFile(); return; case JOptionPane.NO_OPTION: break; case JOptionPane.CANCEL_OPTION: return; default: break; } final Window parentWindow = SwingUtils.getWindowAncestor(this); final JDialog progressIndicator = new IndeterminateProgressDialog(parentWindow, "Saving..."); final SwingWorker savePolicyFileWorker = new SwingWorker() { @Override public Void doInBackground() throws Exception { try { if (parentWindow != null) { SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { progressIndicator.setLocationRelativeTo(parentWindow); progressIndicator.setVisible(true); } }); } policyEditorController.savePolicyFile(); } catch (final IOException e) { OutputController.getLogger().log(e); showCouldNotSaveDialog(); } return null; } @Override public void done() { showChangesSavedDialog(); progressIndicator.setVisible(false); progressIndicator.dispose(); setChangesMade(false); } }; savePolicyFileWorker.execute(); } /** * Show a dialog informing the user that their changes have been saved. */ private void showChangesSavedDialog() { // This dialog is often displayed when closing the editor, and so PolicyEditor // may already be disposed when this dialog appears. Give a weak reference so // that this dialog doesn't prevent the JVM from exiting SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(parentPolicyEditor.get(), R("PEChangesSaved")); } }); } /** * Show a dialog informing the user that their changes could not be saved. */ private void showCouldNotSaveDialog() { // This dialog is often displayed when closing the editor, and so PolicyEditor // may already be disposed when this dialog appears. Give a weak reference so // that this dialog doesn't prevent the JVM from exiting SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(parentPolicyEditor.get(), R("PECouldNotSave"), R("Error"), JOptionPane.ERROR_MESSAGE); } }); } private void showClipboardErrorDialog() { SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(parentPolicyEditor.get(), R("PEClipboardError"), R("Error"), JOptionPane.ERROR_MESSAGE); } }); } private void showInvalidPolicyExceptionDialog(final PolicyIdentifier identifier) { SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(parentPolicyEditor.get(), R("PEInvalidPolicy", identifier.toString()), R("Error"), JOptionPane.ERROR_MESSAGE); } }); } private void showCouldNotAccessClipboardDialog() { SwingUtils.invokeRunnableOrEnqueueLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(parentPolicyEditor.get(), R("PEClipboardAccessError"), R("Error"), JOptionPane.ERROR_MESSAGE); } }); } /** * Detect if the policy settings have changed, either on-disk or in-app. * If an on-disk change has occurred, update the Md5. * @return The user's choice (Yes/No/Cancel - see JOptionPane constants). * "Cancel" if the file hasn't changed but the user has made modifications * to the settings. "No" otherwise */ private int checkPolicyChangesWithDialog() { boolean changed; try { changed = policyEditorController.fileHasChanged(); } catch (FileNotFoundException e) { OutputController.getLogger().log(e); JOptionPane.showMessageDialog(PolicyEditor.this, R("PEFileMissing"), R("PEFileModified"), JOptionPane.WARNING_MESSAGE); return JOptionPane.NO_OPTION; } catch (IOException e) { OutputController.getLogger().log(e); changed = true; } if (changed) { String policyFilePath; try { policyFilePath = policyEditorController.getFile().getCanonicalPath(); } catch (final IOException e) { OutputController.getLogger().log(e); policyFilePath = policyEditorController.getFile().getPath(); } return JOptionPane.showConfirmDialog(PolicyEditor.this, R("PEFileModifiedDetail", policyFilePath, R("PEFileModified"), JOptionPane.YES_NO_CANCEL_OPTION)); } else if (!policyEditorController.changesMade()) { //Return without saving or reloading return JOptionPane.CANCEL_OPTION; } return JOptionPane.NO_OPTION; } private void toggleExpandedCheckboxGroupPanel(final JPanel groupPanel) { groupPanel.setVisible(!groupPanel.isVisible()); PolicyEditor.this.validate(); final Window w = SwingUtils.getWindowAncestor(PolicyEditor.this); if (w != null) { w.pack(); } } /** * Start a Policy Editor instance. * @param args "-file $FILENAME" and/or "-codebase $CODEBASE" are accepted flag/value pairs. * -file specifies a file path to be opened by the editor. If none is provided, the default * policy file location for the user is opened. * -help will print a help message and immediately return (no editor instance opens) */ public static void main(final String[] args) { // setup Swing EDT tracing: SwingUtils.setup(); final OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getPolicyEditorOptions()); if (optionParser.hasOption(OptionsDefinitions.OPTIONS.VERBOSE)) { JNLPRuntime.setDebug(true); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP1)) { final TextsProvider helpMessagesProvider = new PolicyEditorTextsProvider("utf-8", new PlainTextFormatter(), true, true); String HELP_MESSAGE = "\n"; if (JNLPRuntime.isDebug()) { HELP_MESSAGE = HELP_MESSAGE + helpMessagesProvider.writeToString(); } else { HELP_MESSAGE = HELP_MESSAGE + helpMessagesProvider.prepare().getSynopsis() + helpMessagesProvider.getFormatter().getNewLine() + helpMessagesProvider.prepare().getOptions() + helpMessagesProvider.getFormatter().getNewLine(); } OutputController.getLogger().printOut(HELP_MESSAGE); return; } try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (final Exception e) { // not really important, so just ignore } final String filepath = getFilePathArgument(optionParser); final String codebase = getCodebaseArgument(optionParser); final String signedBy = getSignedByArgument(optionParser); final Set principals = getPrincipalsArgument(optionParser); SwingUtils.invokeLater(new Runnable() { @Override public void run() { final PolicyEditorWindow frame = getPolicyEditorFrame(filepath); frame.getPolicyEditor().openPolicyFileSynchronously(); frame.getPolicyEditor().addNewEntry(new PolicyIdentifier(signedBy, principals, codebase)); frame.asWindow().setVisible(true); } }); } static String getCodebaseArgument(final OptionParser optionParser) { if (optionParser.hasOption(OptionsDefinitions.OPTIONS.CODEBASE)) { final String codebase = optionParser.getParam(OptionsDefinitions.OPTIONS.CODEBASE); try { new URL(codebase); } catch (final MalformedURLException e) { throw new IllegalArgumentException(R("PEInvalidUrl", codebase), e); } return codebase; } else { return null; } } static String getSignedByArgument(final OptionParser optionParser) { if (optionParser.hasOption(OptionsDefinitions.OPTIONS.SIGNEDBY)) { final String signedBy = optionParser.getParam(OptionsDefinitions.OPTIONS.SIGNEDBY); if (signedBy.isEmpty()) { throw new IllegalArgumentException(R("PESignedByEmpty")); } else { return signedBy; } } else { return null; } } static Set getPrincipalsArgument(final OptionParser optionParser) { if (optionParser.hasOption(OptionsDefinitions.OPTIONS.PRINCIPALS)) { final List rawPrincipals = optionParser.getParams(OptionsDefinitions.OPTIONS.PRINCIPALS); final Set principals = new HashSet<>(); for (int i = 0; i < rawPrincipals.size(); i+= 2) { principals.add(new PolicyParser.PrincipalEntry(rawPrincipals.get(i), rawPrincipals.get(i + 1))); } return principals; } else { return Collections.emptySet(); } } static String getFilePathArgument(final OptionParser optionParser) { final boolean openDefaultFile = optionParser.hasOption(OptionsDefinitions.OPTIONS.DEFAULTFILE); final boolean hasFileArgument = optionParser.hasOption(OptionsDefinitions.OPTIONS.FILE); final boolean hasMainArgument = optionParser.mainArgExists(); if ((hasFileArgument && openDefaultFile) || (hasMainArgument && openDefaultFile)) { throw new IllegalArgumentException(R("PEDefaultFileFilePathSpecifiedError")); } else if (hasFileArgument && hasMainArgument) { throw new IllegalArgumentException(R("PEMainArgAndFileSwitchSpecifiedError")); } String filepath = null; if (hasFileArgument) { filepath = cleanFilePathArgument(optionParser.getParam(OptionsDefinitions.OPTIONS.FILE)); } else if (hasMainArgument) { filepath = cleanFilePathArgument(optionParser.getMainArg()); } else if (openDefaultFile) { try { filepath = getDefaultPolicyFilePath(); } catch (URISyntaxException e) { OutputController.getLogger().log(e); throw new RuntimeException(e); } } return filepath; } private static String cleanFilePathArgument(final String filepath) { if (filepath == null) { return null; } else if (filepath.isEmpty() || filepath.trim().isEmpty()) { return null; } else { return filepath; } } /** * Create a new PolicyEditor instance without passing argv. The returned instance is not * yet set visible. * @param filepath a policy file to open at start, or null if no file to load * @return a reference to a new PolicyEditor instance */ public static PolicyEditor createInstance(final String filepath) { return new PolicyEditor(filepath); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyIdentifier.jav0000644000000000000000000000013113441742745030575 xustar0029 mtime=1552401893.04083282 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PolicyIdentifier.java0000644000175000002070000001473613441742745031562 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import net.sourceforge.jnlp.runtime.Translator; import sun.security.provider.PolicyParser; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; // http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html public class PolicyIdentifier implements Comparable, Serializable { public static final PolicyIdentifier ALL_APPLETS_IDENTIFIER = new PolicyIdentifier(null, Collections.emptySet(), null) { @Override public String toString() { return Translator.R("PEGlobalSettings"); } }; private final String signedBy; private final LinkedHashSet principals = new LinkedHashSet<>(); private final String codebase; public PolicyIdentifier(final String signedBy, final Collection principals, final String codebase) { if (signedBy != null && signedBy.isEmpty()) { this.signedBy = null; } else { this.signedBy = signedBy; } this.principals.addAll(principals); if (codebase == null) { this.codebase = ""; } else { this.codebase = codebase; } } public String getSignedBy() { return signedBy; } public Set getPrincipals() { return principals; } public String getCodebase() { return codebase; } public static boolean isDefaultPolicyIdentifier(final PolicyIdentifier policyIdentifier) { return policyIdentifier.getSignedBy() == null && policyIdentifier.getPrincipals().isEmpty() && policyIdentifier.getCodebase().isEmpty(); } @Override public String toString() { final String newline = "
    "; final List props = new ArrayList<>(); if (!codebase.isEmpty()) { props.add("codebase=" + codebase); props.add(newline); } if (!principals.isEmpty()) { props.add("principals=" + principals); props.add(newline); } if (signedBy != null && !signedBy.isEmpty()) { props.add("signedBy=" + signedBy); props.add(newline); } final StringBuilder sb = new StringBuilder(); sb.append(""); if (!props.isEmpty()) { for (final String prop : props.subList(0, props.size() - 1)) { sb.append(prop); } } sb.append(""); return sb.toString(); } public String toStringNoHtml() { return "codebase='" + codebase + '\'' + " principals=" + principals + " signedBy='" + signedBy + '\''; } @Override public boolean equals(final Object o) { if (this == o) return true; if (!(o instanceof PolicyIdentifier)) return false; final PolicyIdentifier that = (PolicyIdentifier) o; if (signedBy != null ? !signedBy.equals(that.signedBy) : that.signedBy != null) return false; if (!principals.equals(that.principals)) return false; return codebase.equals(that.codebase); } @Override public int hashCode() { int result = signedBy != null ? signedBy.hashCode() : 0; result = 31 * result + (principals != null ? principals.hashCode() : 0); result = 31 * result + (codebase.hashCode()); return result; } @Override public int compareTo(PolicyIdentifier policyIdentifier) { if (this.equals(ALL_APPLETS_IDENTIFIER) && policyIdentifier.equals(ALL_APPLETS_IDENTIFIER)) { return 0; } else if (this.equals(ALL_APPLETS_IDENTIFIER) && !policyIdentifier.equals(ALL_APPLETS_IDENTIFIER)) { return -1; } else if (!this.equals(ALL_APPLETS_IDENTIFIER) && policyIdentifier.equals(ALL_APPLETS_IDENTIFIER)) { return 1; } final int codebaseComparison = compareComparable(this.getCodebase(), policyIdentifier.getCodebase()); if (codebaseComparison != 0) { return codebaseComparison; } final int signedByComparison = compareComparable(this.getSignedBy(), policyIdentifier.getSignedBy()); if (signedByComparison != 0) { return signedByComparison; } return Integer.compare(this.getPrincipals().hashCode(), policyIdentifier.getPrincipals().hashCode()); } private static > int compareComparable(T a, T b) { if (a == null && b != null) { return 1; } else if (a != null && b == null) { return -1; } else if (a == b) { return 0; } else { return a.compareTo(b); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PermissionTarget.jav0000644000000000000000000000013213441742745030633 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PermissionTarget.java0000644000175000002070000000554513441742745031615 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; /** * Defines the set of targets required for the default permissions */ public enum PermissionTarget { NONE(""), ALL("*"), ALL_FILES("<>"), USER_HOME("${user.home}"), TMPDIR("${java.io.tmpdir}"), CLIPBOARD("accessClipboard"), PRINT("queuePrintJob"), PLAY("play"), RECORD("record"), REFLECT("suppressAccessChecks"), GETENV("getenv.*"), ACCESS_THREADS("modifyThread"), ACCESS_THREAD_GROUPS("modifyThreadGroup"), ACCESS_CLASS_IN_PACKAGE("accessClassInPackage.*"), DECLARED_MEMBERS("accessDeclaredMembers"), CLASSLOADER("getClassLoader"); public final String target; private PermissionTarget(final String target) { this.target = target; } /** * If there is any target that matches the string, return it. * If no matches, return NONE; * @param string a permission target value * @return the closest matching default targets value */ public static PermissionTarget fromString(final String string) { for (final PermissionTarget target : PermissionTarget.values()) { if (string.trim().equals(target.target)) { return target; } } return NONE; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEditorControll0000644000000000000000000000013213441742745030700 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java0000644000175000002070000002011513441742745032756 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import net.sourceforge.jnlp.util.logging.OutputController; import sun.security.provider.PolicyParser; import static net.sourceforge.jnlp.security.policyeditor.PolicyEntry.POLICY_ENTRY_DATA_FLAVOR; public class PolicyEditorController { public final PolicyFileModel policyFile = new PolicyFileModel(); private volatile boolean changesMade = false; private volatile boolean performingIO = false; boolean changesMade() { return changesMade; } void setChangesMade(final boolean b) { changesMade = b; } boolean isPerformingIO() { return performingIO; } void setPerformingIO(final boolean b) { performingIO = b; } public void setFile(final File file) { boolean changedFile = policyFile.setFile(file); setChangesMade(changedFile); } public File getFile() { return policyFile.getFile(); } public boolean fileHasChanged() throws IOException { return policyFile.hasChanged(); } public boolean addIdentifier(final PolicyIdentifier identifier) { final boolean existed = policyFile.addIdentifier(identifier); if (!existed) { setChangesMade(true); } return existed; } public void removeIdentifier(final PolicyIdentifier identifier) { setChangesMade(true); policyFile.removeIdentifier(identifier); } public SortedSet getIdentifiers() { return new TreeSet<>(policyFile.getIdentifiers()); } public Map> getCopyOfPermissions() { return policyFile.getCopyOfPermissions(); } public void setPermission(final PolicyIdentifier identifier, final PolicyEditorPermissions permission, final boolean state) { if (getPermission(identifier, permission) != state) { setChangesMade(true); } policyFile.setPermission(identifier, permission, state); } public boolean getPermission(final PolicyIdentifier identifier, final PolicyEditorPermissions permission) { return policyFile.getPermission(identifier, permission); } public Map getPermissions(final PolicyIdentifier identifier) { policyFile.addIdentifier(identifier); return new HashMap<>(policyFile.getCopyOfPermissions().get(identifier)); } public void clear() { setChangesMade(true); policyFile.clearPermissions(); } public void clearPermissions() { setChangesMade(true); policyFile.clearPermissions(); } public void addCustomPermissions(final PolicyIdentifier identifier, final Collection permissions) { if (!policyFile.getCopyOfCustomPermissions().containsKey(identifier) || !policyFile.getCopyOfCustomPermissions().get(identifier).equals(permissions)) { setChangesMade(true); } policyFile.addCustomPermissions(identifier, permissions); } public void addCustomPermission(final PolicyIdentifier identifier, final PolicyParser.PermissionEntry permission) { final Map> customs = policyFile.getCopyOfCustomPermissions(); if (customs == null || !customs.containsKey(identifier) || (customs.containsKey(identifier) && !customs.get(identifier).contains(permission))) { setChangesMade(true); } addCustomPermissions(identifier, Collections.singletonList(permission)); } public Set getCustomPermissions(final PolicyIdentifier identifier) { policyFile.addIdentifier(identifier); return new HashSet<>(policyFile.getCopyOfCustomPermissions().get(identifier)); } public void addPolicyEntry(final PolicyEntry policyEntry) { addIdentifier(policyEntry.getPolicyIdentifier()); for (final PolicyEditorPermissions permission : policyEntry.getPermissions()) { setPermission(policyEntry.getPolicyIdentifier(), permission, true); } addCustomPermissions(policyEntry.getPolicyIdentifier(), policyEntry.getCustomPermissions()); } public void clearCustomPermissions() { setChangesMade(true); policyFile.clearCustomPermissions(); } public void clearCustomIdentifier(final PolicyIdentifier identifier) { setChangesMade(true); policyFile.clearCustomIdentifier(identifier); } public void openAndParsePolicyFile() throws IOException, PolicyParser.ParsingException { setPerformingIO(true); policyFile.openAndParsePolicyFile(); setChangesMade(false); setPerformingIO(false); } public void savePolicyFile() throws IOException { setPerformingIO(true); policyFile.savePolicyFile(); setChangesMade(false); setPerformingIO(false); } public void copyPolicyEntryToClipboard(final PolicyIdentifier identifier) { final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); final PolicyEntry policyEntry = getPolicyEntry(identifier); clipboard.setContents(policyEntry, null); } public PolicyEntry getPolicyEntry(final PolicyIdentifier identifier) { final Collection enabledPermissions = new HashSet<>(); for (final Map.Entry entry : getPermissions(identifier).entrySet()) { if (entry.getValue()) { enabledPermissions.add(entry.getKey()); } } return new PolicyEntry.Builder() .identifier(identifier) .permissions(enabledPermissions) .customPermissions(getCustomPermissions(identifier)) .build(); } public static PolicyEntry getPolicyEntryFromClipboard() throws IOException, UnsupportedFlavorException, PolicyParser.ParsingException { final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); return (PolicyEntry) clipboard.getContents(null).getTransferData(POLICY_ENTRY_DATA_FLAVOR); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/CustomPolicyViewer.j0000644000000000000000000000013213441742745030621 xustar0030 mtime=1552401893.037832827 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewer.java0000644000175000002070000002724413441742745032132 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import sun.security.provider.PolicyParser; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Collection; import java.util.Objects; import java.util.TreeSet; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.WindowConstants; import javax.swing.border.EmptyBorder; /** * This implements a simple list viewer for custom policies, ie policies * that do not have a dedicated checkbox in PolicyEditor. It also allows * for adding new custom permissions and removing permissions. */ public class CustomPolicyViewer extends JFrame { private final Collection customPermissions = new TreeSet<>(); private final JScrollPane scrollPane = new JScrollPane(); private final DefaultListModel listModel = new DefaultListModel<>(); private final JList list = new JList<>(listModel); private final JButton addButton = new JButton(), removeButton = new JButton(), closeButton = new JButton(); private final JLabel listLabel = new JLabel(); private final ActionListener addButtonAction, removeButtonAction, closeButtonAction; private final PolicyEditor parent; private final PolicyIdentifier policyIdentifier; /** * @param parent the parent PolicyEditor which created this CustomPolicyViewer * @param policyIdentifier the policy identifier for which these custom permissions are enabled */ public CustomPolicyViewer(final PolicyEditor parent, final PolicyIdentifier policyIdentifier) { super(); Objects.requireNonNull(parent); Objects.requireNonNull(policyIdentifier); this.parent = parent; this.policyIdentifier = policyIdentifier; setLayout(new GridBagLayout()); setTitle(R("PECPTitle")); for (final PolicyParser.PermissionEntry permissionEntry : parent.getCustomPermissions(policyIdentifier)) { customPermissions.add(DisplayablePermission.from(permissionEntry)); } for (final DisplayablePermission perm : customPermissions) { listModel.addElement(perm); } addButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final String prefill = R("PECPType") + " " + R("PECPTarget") + " [" + R("PECPActions") + "]"; String string = JOptionPane.showInputDialog(CustomPolicyViewer.this, R("PECPPrompt"), prefill); if (string == null || string.isEmpty()) { return; } string = string.replaceAll("\\s+", " ").trim(); final String[] parts = string.split(" "); if (parts.length < 2) { return; } final String type = parts[0], target = parts[1]; final String actions; if (parts.length > 2) { actions = parts[2]; } else { actions = ""; } final PolicyParser.PermissionEntry perm = new PolicyParser.PermissionEntry(type, target, actions); addCustomPermission(perm); } }; addButton.setText(R("PECPAddButton")); addButton.addActionListener(addButtonAction); removeButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { final PolicyParser.PermissionEntry selected = list.getSelectedValue(); if (selected == null) { return; } removeCustomPermission(selected); } }; removeButton.setText(R("PECPRemoveButton")); removeButton.addActionListener(removeButtonAction); closeButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { quit(); } }; closeButton.setText(R("PECPCloseButton")); closeButton.addActionListener(closeButtonAction); listLabel.setText(R("PECPListLabel", policyIdentifier.toStringNoHtml())); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); list.setSelectedIndex(0); setupLayout(); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(final WindowEvent e) { quit(); } }); } private void setupLayout() { final GridBagConstraints labelConstraints = new GridBagConstraints(); labelConstraints.gridx = 0; labelConstraints.gridy = 0; final EmptyBorder border = new EmptyBorder(2, 2, 2, 2); listLabel.setBorder(border); add(listLabel, labelConstraints); final GridBagConstraints scrollPaneConstraints = new GridBagConstraints(); scrollPaneConstraints.gridx = 0; scrollPaneConstraints.gridy = 1; scrollPaneConstraints.weightx = 1; scrollPaneConstraints.weighty = 1; scrollPaneConstraints.gridwidth = 3; scrollPaneConstraints.fill = GridBagConstraints.BOTH; list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); scrollPane.setViewportView(list); add(scrollPane, scrollPaneConstraints); final GridBagConstraints addButtonConstraints = new GridBagConstraints(); addButtonConstraints.gridx = 0; addButtonConstraints.gridy = scrollPaneConstraints.gridy + 1; addButtonConstraints.fill = GridBagConstraints.HORIZONTAL; add(addButton, addButtonConstraints); final GridBagConstraints removeButtonConstraints = new GridBagConstraints(); removeButtonConstraints.gridx = addButtonConstraints.gridx + 1; removeButtonConstraints.gridy = addButtonConstraints.gridy; removeButtonConstraints.fill = GridBagConstraints.HORIZONTAL; add(removeButton, removeButtonConstraints); final GridBagConstraints closeButtonConstraints = new GridBagConstraints(); closeButtonConstraints.gridx = removeButtonConstraints.gridx + 1; closeButtonConstraints.gridy = removeButtonConstraints.gridy; closeButtonConstraints.fill = GridBagConstraints.HORIZONTAL; add(closeButton, closeButtonConstraints); pack(); setMinimumSize(getPreferredSize()); } private void quit() { parent.customPolicyViewerClosing(); dispose(); } /** * Update the custom permissions map. Used by the Custom Policy Viewer to update its parent * PolicyEditor to changes it has made */ private void updateCustomPermissions() { parent.setChangesMade(true); parent.clearCustomPermissions(policyIdentifier); for (final PolicyParser.PermissionEntry permission : customPermissions) { parent.addCustomPermission(policyIdentifier, permission); } } void addCustomPermission(final PolicyParser.PermissionEntry permission) { Objects.requireNonNull(permission); final DisplayablePermission displayablePermission = DisplayablePermission.from(permission); if (customPermissions.add(displayablePermission)) { listModel.addElement(displayablePermission); updateCustomPermissions(); } list.setSelectedValue(permission, true); } void removeCustomPermission(final PolicyParser.PermissionEntry permission) { Objects.requireNonNull(permission); customPermissions.remove(DisplayablePermission.from(permission)); listModel.removeElement(permission); updateCustomPermissions(); } Collection getCopyOfCustomPermissions() { return new TreeSet<>(customPermissions); } public static class DisplayablePermission extends PolicyParser.PermissionEntry implements Comparable { public DisplayablePermission(final PermissionType type, final PermissionTarget target) { this(type, target, PermissionActions.NONE); } public DisplayablePermission(final PermissionType type, final PermissionTarget target, final PermissionActions actions) { this(type.type, target.target, actions.rawString()); } public DisplayablePermission(final String type, final String target) { this(type, target, null); } public DisplayablePermission(final String permission, final String name, final String action) { super(permission, name, action); } public static DisplayablePermission from(final PolicyParser.PermissionEntry permissionEntry) { return new DisplayablePermission(permissionEntry.permission, permissionEntry.name, permissionEntry.action); } @Override public int compareTo(final PolicyParser.PermissionEntry o) { return super.name.compareTo(o.name); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("permission "); sb.append(permission); sb.append(" \""); sb.append(name); sb.append("\""); if (this.action == null || !this.action.trim().equals(PermissionActions.NONE.rawString())) { sb.append(", \""); sb.append(action); sb.append("\""); } sb.append(";"); return sb.toString(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyFileModel.java0000644000000000000000000000013213441742745030515 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java0000644000175000002070000002773213441742745031340 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.channels.FileLock; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.MD5SumWatcher; import net.sourceforge.jnlp.util.logging.OutputController; import sun.security.provider.PolicyParser; import static net.sourceforge.jnlp.security.policyeditor.PolicyIdentifier.isDefaultPolicyIdentifier; public class PolicyFileModel { private File file; /** * Maps Codebases to Maps of Permissions and whether that Permission is set or not. The Codebase keys correspond to * the Codebases in the list UI, and the Permission->Boolean maps correspond to the checkboxes associated with * each Codebase. */ private final Map> permissionsMap = Collections.synchronizedMap(new HashMap>()); private final Map> customPermissionsMap = Collections.synchronizedMap(new HashMap>()); private KeystoreInfo keystoreInfo = new KeystoreInfo(null, null, null, null); private MD5SumWatcher fileWatcher; private PolicyParser parser = new PolicyParser(false); PolicyFileModel(final String filepath) { this(new File(filepath)); } PolicyFileModel(final File file) { setFile(file); } PolicyFileModel() { } synchronized boolean setFile(final File file) { this.file = file; boolean sameFile = Objects.equals(this.file, file); return !sameFile; } synchronized File getFile() { return file; } synchronized PolicyParser getParser() { return parser; } /** * Open the file pointed to by the filePath field. This is either provided by the * "-file" command line flag, or if none given, comes from DeploymentConfiguration. */ synchronized void openAndParsePolicyFile() throws IOException, PolicyParser.ParsingException { parser = new PolicyParser(false); fileWatcher = new MD5SumWatcher(file); fileWatcher.update(); clearPermissions(); final FileLock fileLock = FileUtils.getFileLock(file.getAbsolutePath(), false, true); try { parser.read(new FileReader(file)); keystoreInfo = new KeystoreInfo(parser.getKeyStoreUrl(), parser.getKeyStoreType(), parser.getKeyStoreProvider(), parser.getStorePassURL()); final Set grantEntries = new HashSet<>(Collections.list(parser.grantElements())); synchronized (permissionsMap) { synchronized (customPermissionsMap) { for (final PolicyParser.GrantEntry grantEntry : grantEntries) { PolicyIdentifier policyIdentifier = new PolicyIdentifier(grantEntry.signedBy, grantEntry.principals, grantEntry.codeBase); if (isDefaultPolicyIdentifier(policyIdentifier)) { policyIdentifier = PolicyIdentifier.ALL_APPLETS_IDENTIFIER; } addIdentifier(policyIdentifier); for (final PolicyParser.PermissionEntry permissionEntry : grantEntry.permissionEntries) { final PolicyEditorPermissions editorPermissions = PolicyEditorPermissions.fromPermissionEntry(permissionEntry); if (editorPermissions != null) { permissionsMap.get(policyIdentifier).put(editorPermissions, true); } else { customPermissionsMap.get(policyIdentifier).add(permissionEntry); } } } } } } finally { try { fileLock.release(); } catch (final IOException e) { OutputController.getLogger().log(e); } } } /** * Save the policy model into the file pointed to by the filePath field. */ synchronized void savePolicyFile() throws IOException { parser = new PolicyParser(false); FileLock fileLock = null; try { fileLock = FileUtils.getFileLock(file.getAbsolutePath(), false, true); synchronized (permissionsMap) { for (final PolicyIdentifier identifier : permissionsMap.keySet()) { final String codebase; if (identifier.getCodebase().isEmpty()) { codebase = null; } else { codebase = identifier.getCodebase(); } final PolicyParser.GrantEntry grantEntry = new PolicyParser.GrantEntry(identifier.getSignedBy(), codebase); for (final Map.Entry entry : permissionsMap.get(identifier).entrySet()) { if (entry.getValue()) { final PolicyEditorPermissions permission = entry.getKey(); final String actionsString; if (permission.getActions().equals(PermissionActions.NONE)) { actionsString = null; } else { actionsString = permission.getActions().rawString(); } final PolicyParser.PermissionEntry permissionEntry = new PolicyParser.PermissionEntry(permission.getType().type, permission.getTarget().target, actionsString); grantEntry.add(permissionEntry); } } for (final PolicyParser.PermissionEntry customPermission : customPermissionsMap.get(identifier)) { grantEntry.add(customPermission); } grantEntry.principals.addAll(identifier.getPrincipals()); parser.add(grantEntry); } } parser.write(new FileWriter(file)); } catch (final IOException e) { OutputController.getLogger().log(e); } finally { if (fileLock != null) { try { fileLock.release(); } catch (final IOException e) { OutputController.getLogger().log(e); } } } fileWatcher = new MD5SumWatcher(file); fileWatcher.update(); } synchronized boolean hasChanged() throws IOException { return fileWatcher != null && fileWatcher.update(); } synchronized SortedSet getIdentifiers() { return new TreeSet<>(permissionsMap.keySet()); } synchronized KeystoreInfo getKeystoreInfo() { return keystoreInfo; } /** * Add a new identifier. No action is taken if the identifier has already been added. * @param identifier for which a permissions mapping is required * @return true iff there was already an entry for this identifier */ synchronized boolean addIdentifier(final PolicyIdentifier identifier) { Objects.requireNonNull(identifier); boolean existingCodebase = true; if (!permissionsMap.containsKey(identifier)) { final Map map = new HashMap<>(); for (final PolicyEditorPermissions perm : PolicyEditorPermissions.values()) { map.put(perm, false); } permissionsMap.put(identifier, map); existingCodebase = false; } if (!customPermissionsMap.containsKey(identifier)) { customPermissionsMap.put(identifier, new HashSet()); existingCodebase = false; } return existingCodebase; } synchronized void clearPermissions() { permissionsMap.clear(); clearCustomPermissions(); } synchronized void removeIdentifier(final PolicyIdentifier identifier) { Objects.requireNonNull(identifier); permissionsMap.remove(identifier); customPermissionsMap.remove(identifier); } synchronized void setPermission(final PolicyIdentifier identifier, final PolicyEditorPermissions permission, final boolean state) { Objects.requireNonNull(identifier); Objects.requireNonNull(permission); addIdentifier(identifier); permissionsMap.get(identifier).put(permission, state); } synchronized boolean getPermission(final PolicyIdentifier identifier, final PolicyEditorPermissions permission) { Objects.requireNonNull(identifier); Objects.requireNonNull(permission); if (!permissionsMap.containsKey(identifier)) { return false; } return permissionsMap.get(identifier).get(permission); } synchronized Map> getCopyOfPermissions() { return new HashMap<>(permissionsMap); } synchronized void clearCustomPermissions() { customPermissionsMap.clear(); } synchronized void clearCustomIdentifier(final PolicyIdentifier identifier) { Objects.requireNonNull(identifier); if (!customPermissionsMap.containsKey(identifier)) { return; } customPermissionsMap.get(identifier).clear(); } synchronized void addCustomPermissions(final PolicyIdentifier identifier, final Collection permissions) { Objects.requireNonNull(identifier); Objects.requireNonNull(permissions); addIdentifier(identifier); customPermissionsMap.get(identifier).addAll(permissions); } synchronized Map> getCopyOfCustomPermissions() { return new HashMap<>(customPermissionsMap); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PermissionActions.ja0000644000000000000000000000013213441742745030617 xustar0030 mtime=1552401893.041832819 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PermissionActions.java0000644000175000002070000000646713441742745031773 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * Defines the set of actions required for the default permissions */ public enum PermissionActions { NONE(""), READ("read"), WRITE("write"), EXECUTE("execute"), DELETE("delete"), READLINK("readlink"), FILE_ALL("read,write,execute,delete,readlink"), ACCEPT("accept"), LISTEN("listen"), CONNECT("connect"), RESOLVE("resolve"), NETALL("accept,listen,connect,resolve"); private final String rawActions; private final Set actions; private PermissionActions(final String actions) { this.rawActions = actions; this.actions = setFromString(actions); } /** * If there is any default action set that matches the string, return it. * If no matches, return NONE. * @param string a comma-separated list of permission actions * @return the closest matching default actions value */ public static PermissionActions fromString(final String string) { final Collection actions = setFromString(string); for (final PermissionActions action : PermissionActions.values()) { if (actions.equals(action.actions)) { return action; } } return NONE; } public Collection getActions() { return new HashSet<>(this.actions); } private static Set setFromString(final String string) { final Set set = new HashSet<>(); Collections.addAll(set, string.split(",")); return set; } public String rawString() { return rawActions; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEditorPermissi0000644000000000000000000000013213441742745030677 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java0000644000175000002070000002761113441742745033156 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import sun.security.provider.PolicyParser; import java.io.Serializable; import java.util.Map; import javax.swing.JCheckBox; import static net.sourceforge.jnlp.runtime.Translator.R; /** * Defines the set of default permissions for PolicyEditor, ie the ones which are assigned * dedicated checkboxes */ public enum PolicyEditorPermissions implements Serializable { READ_LOCAL_FILES(R("PEReadFiles"), R("PEReadFilesDetail"), PermissionType.FILE_PERMISSION, PermissionTarget.USER_HOME, PermissionActions.READ), WRITE_LOCAL_FILES(R("PEWriteFiles"), R("PEWriteFilesDetail"), PermissionType.FILE_PERMISSION, PermissionTarget.USER_HOME, PermissionActions.WRITE), DELETE_LOCAL_FILES(R("PEDeleteFiles"), R("PEDeleteFilesDetail"), PermissionType.FILE_PERMISSION, PermissionTarget.USER_HOME, PermissionActions.DELETE), READ_PROPERTIES(R("PEReadProps"), R("PEReadPropsDetail"), PermissionType.PROPERTY_PERMISSION, PermissionTarget.ALL, PermissionActions.READ), WRITE_PROPERTIES(R("PEWriteProps"), R("PEWritePropsDetail"), PermissionType.PROPERTY_PERMISSION, PermissionTarget.ALL, PermissionActions.WRITE), READ_SYSTEM_FILES(R("PEReadSystemFiles"), R("PEReadSystemFilesDetail"), PermissionType.FILE_PERMISSION, PermissionTarget.ALL_FILES, PermissionActions.READ), WRITE_SYSTEM_FILES(R("PEWriteSystemFiles"), R("PEWriteSystemFilesDetail"), PermissionType.FILE_PERMISSION, PermissionTarget.ALL_FILES, PermissionActions.WRITE), READ_TMP_FILES(R("PEReadTempFiles"), R("PEReadTempFilesDetail"), PermissionType.FILE_PERMISSION, PermissionTarget.TMPDIR, PermissionActions.READ), WRITE_TMP_FILES(R("PEWriteTempFiles"), R("PEWriteTempFilesDetail"), PermissionType.FILE_PERMISSION, PermissionTarget.TMPDIR, PermissionActions.WRITE), DELETE_TMP_FILES(R("PEDeleteTempFiles"), R("PEDeleteTempFilesDetail"), PermissionType.FILE_PERMISSION, PermissionTarget.TMPDIR, PermissionActions.DELETE), JAVA_REFLECTION(R("PEReflection"), R("PEReflectionDetail"), PermissionType.REFLECT_PERMISSION, PermissionTarget.REFLECT, PermissionActions.NONE), GET_CLASSLOADER(R("PEClassLoader"), R("PEClassLoaderDetail"), PermissionType.RUNTIME_PERMISSION, PermissionTarget.CLASSLOADER, PermissionActions.NONE), ACCESS_CLASS_IN_PACKAGE(R("PEClassInPackage"), R("PEClassInPackageDetail"), PermissionType.RUNTIME_PERMISSION, PermissionTarget.ACCESS_CLASS_IN_PACKAGE, PermissionActions.NONE), ACCESS_DECLARED_MEMBERS(R("PEDeclaredMembers"), R("PEDeclaredMembersDetail"), PermissionType.RUNTIME_PERMISSION, PermissionTarget.DECLARED_MEMBERS, PermissionActions.NONE), ACCESS_THREADS(R("PEAccessThreads"), R("PEAccessThreadsDetail"), PermissionType.RUNTIME_PERMISSION, PermissionTarget.ACCESS_THREADS, PermissionActions.NONE), ACCESS_THREAD_GROUPS(R("PEAccessThreadGroups"), R("PEAccessThreadGroupsDetail"), PermissionType.RUNTIME_PERMISSION, PermissionTarget.ACCESS_THREAD_GROUPS, PermissionActions.NONE), NETWORK(R("PENetwork"), R("PENetworkDetail"), PermissionType.SOCKET_PERMISSION, PermissionTarget.ALL, PermissionActions.NETALL), EXEC_COMMANDS(R("PEExec"), R("PEExecDetail"), PermissionType.FILE_PERMISSION, PermissionTarget.ALL_FILES, PermissionActions.EXECUTE), GET_ENV(R("PEGetEnv"), R("PEGetEnvDetail"), PermissionType.RUNTIME_PERMISSION, PermissionTarget.GETENV, PermissionActions.NONE), ALL_AWT(R("PEAWTPermission"), R("PEAWTPermissionDetail"), PermissionType.AWT_PERMISSION, PermissionTarget.ALL, PermissionActions.NONE), CLIPBOARD(R("PEClipboard"), R("PEClipboardDetail"), PermissionType.AWT_PERMISSION, PermissionTarget.CLIPBOARD, PermissionActions.NONE), PLAY_AUDIO(R("PEPlayAudio"), R("PEPlayAudioDetail"), PermissionType.AUDIO_PERMISSION, PermissionTarget.PLAY, PermissionActions.NONE), RECORD_AUDIO(R("PERecordAudio"), R("PERecordAudioDetail"), PermissionType.AUDIO_PERMISSION, PermissionTarget.RECORD, PermissionActions.NONE), PRINT(R("PEPrint"), R("PEPrintDetail"), PermissionType.RUNTIME_PERMISSION, PermissionTarget.PRINT, PermissionActions.NONE); public static enum Group { ReadFileSystem(R("PEGReadFileSystem"), READ_LOCAL_FILES, READ_PROPERTIES, READ_SYSTEM_FILES, READ_TMP_FILES, GET_ENV), WriteFileSystem(R("PEGWriteFileSystem"), WRITE_LOCAL_FILES, DELETE_LOCAL_FILES, WRITE_PROPERTIES, WRITE_SYSTEM_FILES, WRITE_TMP_FILES, DELETE_TMP_FILES, EXEC_COMMANDS), AccessUnownedCode(R("PEGAccessUnownedCode"), JAVA_REFLECTION, GET_CLASSLOADER, ACCESS_CLASS_IN_PACKAGE, ACCESS_DECLARED_MEMBERS, ACCESS_THREADS, ACCESS_THREAD_GROUPS), MediaAccess(R("PEGMediaAccess"), PLAY_AUDIO, RECORD_AUDIO, PRINT, CLIPBOARD); private final PolicyEditorPermissions[] permissions; private final String title; private Group(final String title, final PolicyEditorPermissions... permissions) { this.title = title; this.permissions = permissions; } public static boolean anyContains(final PolicyEditorPermissions permission) { for (final Group g : Group.values()) { if (g.contains(permission)) { return true; } } return false; } public static boolean anyContains(final JCheckBox view, final Map checkboxMap) { for (final Map.Entry pairs : checkboxMap.entrySet()) { if (pairs.getValue() == view) { for (final Group g : Group.values()) { if (g.contains(pairs.getKey())) { return true; } } } } return false; } /* * + all is selected * 0 invalid * - none is selected */ public int getState(final Map map) { boolean allTrue = true; boolean allFalse = true; for (final PolicyEditorPermissions pp : getPermissions()) { final Boolean b = map.get(pp); if (b == null) { return 0; } if (b) { allFalse = false; } else { allTrue = false; } } if (allFalse) { return -1; } if (allTrue) { return 1; } return 0; } public boolean contains(final PolicyEditorPermissions permission) { for (final PolicyEditorPermissions policyEditorPermissions : permissions) { if (policyEditorPermissions == permission) { return true; } } return false; } /** * Return title for policy extended by drop-down mark. * * @return title with down-pointing arrow */ public String getTitle() { return title + " Ы‡"; } public PolicyEditorPermissions[] getPermissions() { return permissions; } } private final String name, description; private final PermissionType type; private final PermissionTarget target; private final PermissionActions actions; private PolicyEditorPermissions(final String name, final String description, final PermissionType type, final PermissionTarget target, final PermissionActions actions) { this.name = name; this.description = description; this.type = type; this.target = target; this.actions = actions; } /** * A short human-readable name for this permission * @return the name of this permission */ public String getName() { return this.name; } /** * A longer human-readable description for this permission * @return the description of this permission */ public String getDescription() { return this.description; } /** * @return the type of this permission, eg java.io.FilePermission */ public PermissionType getType() { return this.type; } /** * @return the target of this permission, eg ${user.home}${/}* */ public PermissionTarget getTarget() { return this.target; } /** * @return the actions of this permission, eg read,write */ public PermissionActions getActions() { return this.actions; } /** * A full String representation of this permission as it should appear when * written into a policy file * @return a policy file-ready String representation of this permission */ public String toPermissionString() { final StringBuilder sb = new StringBuilder(); sb.append("permission "); sb.append(this.type.type); sb.append(" \""); sb.append(this.target.target); sb.append("\""); if (!this.actions.equals(PermissionActions.NONE)) { sb.append(", \""); sb.append(setToActionList(this.actions.getActions().toString())); sb.append("\""); } sb.append(";"); return sb.toString(); } private static String setToActionList(final String string) { return string.replaceAll("[\\[\\]\\s]", ""); } public static PolicyEditorPermissions fromPermissionEntry(final PolicyParser.PermissionEntry permissionEntry) { for (final PolicyEditorPermissions permission : values()) { final String actionsString; if (permission.getActions().equals(PermissionActions.NONE)) { actionsString = null; } else { actionsString = permission.getActions().rawString(); } final PolicyParser.PermissionEntry editorEntry = new PolicyParser.PermissionEntry(permission.getType().type, permission.getTarget().target, actionsString); if (editorEntry.equals(permissionEntry)) { return permission; } } return null; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/IndeterminateProgres0000644000000000000000000000013213441742745030707 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/IndeterminateProgressDialog.java0000644000175000002070000000421413441742745033743 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import java.awt.Window; import javax.swing.JDialog; import javax.swing.JProgressBar; public class IndeterminateProgressDialog extends JDialog { private final JProgressBar progressBar = new JProgressBar(); public IndeterminateProgressDialog(final Window parent, final String title) { super(parent); this.setTitle(title); this.setModalityType(ModalityType.DOCUMENT_MODAL); progressBar.setIndeterminate(true); this.add(progressBar); this.pack(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEditorAboutDia0000644000000000000000000000013213441742745030574 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorAboutDialog.java0000644000175000002070000001204313441742745033026 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.security.policyeditor; import net.sourceforge.jnlp.util.logging.OutputController; import javax.swing.border.EmptyBorder; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.html.HTMLEditorKit; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.ScrollPaneConstants; import javax.swing.KeyStroke; import java.awt.GridBagLayout; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.Dimension; import java.awt.Desktop; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.IOException; import java.net.URISyntaxException; import static net.sourceforge.jnlp.runtime.Translator.R; public class PolicyEditorAboutDialog extends JFrame { private final String content; private final JScrollPane scrollPane = new JScrollPane(); private final JTextPane textArea = new JTextPane(); private final JPanel noWrapPanel = new JPanel(); private final JButton closeButton = new JButton(R("ButClose")); private final ActionListener closeButtonAction; private final KeyListener closeKeyListener; public PolicyEditorAboutDialog(final String title, final String content) { super(title); this.content = content; setupLayout(); closeButtonAction = new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { close(); } }; closeButton.addActionListener(closeButtonAction); closeKeyListener = new CloseKeyListener(); scrollPane.addKeyListener(closeKeyListener); textArea.addKeyListener(closeKeyListener); noWrapPanel.addKeyListener(closeKeyListener); closeButton.addKeyListener(closeKeyListener); setDefaultCloseOperation(DISPOSE_ON_CLOSE); } private void close() { this.setVisible(false); this.dispose(); } private void setupLayout() { setLayout(new GridBagLayout()); textArea.setEditorKit(new HTMLEditorKit()); textArea.setContentType("text/html"); textArea.setText(content); textArea.setEditable(false); textArea.addHyperlinkListener(new UrlHyperlinkListener()); noWrapPanel.setLayout(new BorderLayout()); noWrapPanel.add(textArea, BorderLayout.CENTER); scrollPane.setViewportView(textArea); textArea.setCaretPosition(0); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); final GridBagConstraints panelConstraints = new GridBagConstraints(); panelConstraints.gridwidth = 3; panelConstraints.weighty = 1.0; panelConstraints.fill = GridBagConstraints.BOTH; final EmptyBorder scrollPaneBorder = new EmptyBorder(5, 5, 5, 5); scrollPane.setBorder(scrollPaneBorder); final EmptyBorder textAreaBorder = new EmptyBorder(0, 10, 10, 10); textArea.setBorder(textAreaBorder); add(scrollPane, panelConstraints); final GridBagConstraints closeButtonConstraints = new GridBagConstraints(); closeButtonConstraints.weightx = 1.0; closeButtonConstraints.weighty = 0.0; closeButtonConstraints.gridx = 1; closeButtonConstraints.gridy = 1; closeButtonConstraints.insets = new Insets(0, 0, 5, 0); add(closeButton, closeButtonConstraints); setMinimumSize(new Dimension(500, 400)); setPreferredSize(getMinimumSize()); pack(); } private class CloseKeyListener implements KeyListener { @Override public void keyTyped(final KeyEvent e) { } @Override public void keyPressed(final KeyEvent e) { if (e.getExtendedKeyCode() == KeyStroke.getKeyStroke(R("PEAboutPolicyEditorCloseAccelerator")).getKeyCode() || e.getExtendedKeyCode() == KeyEvent.VK_ESCAPE) { close(); } } @Override public void keyReleased(final KeyEvent e) { } } private static class UrlHyperlinkListener implements HyperlinkListener { @Override public void hyperlinkUpdate(HyperlinkEvent event) { if (Desktop.isDesktopSupported() && event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { try { Desktop.getDesktop().browse(event.getURL().toURI()); } catch (final URISyntaxException | IOException ex) { OutputController.getLogger().log(ex); } } } } public static void main(final String[] args) { final PolicyEditorAboutDialog dialog = new PolicyEditorAboutDialog(R("PEHelpDialogTitle"), R("PEHelpDialogContent")); dialog.setVisible(true); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PolicyEntry.java0000644000000000000000000000013213441742745027756 xustar0030 mtime=1552401893.041832819 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEntry.java0000644000175000002070000001254213441742745030572 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; import java.util.EnumSet; import java.util.HashSet; import java.util.Objects; import java.util.Set; import sun.security.provider.PolicyParser; /** * This class represents a "grant" entry in a policy file. This is defined as a policy entry block * which begins with the keyword "grant" and ends with the delimiter "};". */ public class PolicyEntry implements Serializable, Transferable { public static class Builder { private String signedBy, codebase; private final Set permissions = EnumSet.noneOf(PolicyEditorPermissions.class); private final Set customPermissions = new HashSet<>(); private final Set principals = new HashSet<>(); public Builder signedBy(final String signedBy) { this.signedBy = signedBy; return this; } public Builder principals(final Collection principals) { this.principals.addAll(principals); return this; } public Builder codebase(final String codebase) { this.codebase = codebase; return this; } public Builder identifier(final PolicyIdentifier identifier) { return signedBy(identifier.getSignedBy()) .codebase(identifier.getCodebase()) .principals(identifier.getPrincipals()); } public Builder permissions(final Collection permissions) { this.permissions.addAll(permissions); return this; } public Builder customPermissions(final Collection customPermissions) { this.customPermissions.addAll(customPermissions); return this; } public PolicyEntry build() { return new PolicyEntry(this); } } public static final DataFlavor POLICY_ENTRY_DATA_FLAVOR = new DataFlavor(PolicyEntry.class, "PolicyEntry"); private final PolicyIdentifier policyIdentifier; private final Set permissions = new HashSet<>(); private final Set customPermissions = new HashSet<>(); private PolicyEntry(final Builder builder) { this.policyIdentifier = new PolicyIdentifier(builder.signedBy, builder.principals, builder.codebase); this.permissions.addAll(builder.permissions); this.permissions.remove(null); this.customPermissions.addAll(builder.customPermissions); this.customPermissions.remove(null); } public PolicyIdentifier getPolicyIdentifier() { return policyIdentifier; } public Set getPermissions() { return permissions; } public Set getCustomPermissions() { return customPermissions; } @Override public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] { POLICY_ENTRY_DATA_FLAVOR }; } @Override public boolean isDataFlavorSupported(final DataFlavor dataFlavor) { return Objects.equals(POLICY_ENTRY_DATA_FLAVOR, dataFlavor); } @Override public Object getTransferData(final DataFlavor dataFlavor) throws UnsupportedFlavorException, IOException { if (!Arrays.asList(getTransferDataFlavors()).contains(dataFlavor)) { throw new UnsupportedFlavorException(dataFlavor); } return this; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/KeystoreInfo.java0000644000000000000000000000013113441742745030115 xustar0029 mtime=1552401893.04083282 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/KeystoreInfo.java0000644000175000002070000000727013441742745030734 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; import java.net.URL; import java.util.Objects; // http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html public class KeystoreInfo { private final String keyStoreUrl; private final String keyStoreType; private final String keyStoreProvider; private final String keyStorePasswordUrl; public KeystoreInfo(final String keyStoreUrl, final String keyStoreType, final String keyStoreProvider, final String keyStorePasswordUrl) { this.keyStoreUrl = keyStoreUrl; this.keyStoreType = keyStoreType; this.keyStoreProvider = keyStoreProvider; this.keyStorePasswordUrl = keyStorePasswordUrl; } public String getKeyStoreUrl() { return keyStoreUrl; } public String getKeyStoreType() { return keyStoreType; } public String getKeyStoreProvider() { return keyStoreProvider; } public String getKeyStorePasswordUrl() { return keyStorePasswordUrl; } @Override public String toString() { return "KeystoreInfo{" + "keyStoreUrl='" + keyStoreUrl + '\'' + ", keyStoreType='" + keyStoreType + '\'' + ", keyStoreProvider='" + keyStoreProvider + '\'' + ", keyStorePasswordUrl='" + keyStorePasswordUrl + '\'' + '}'; } @Override public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final KeystoreInfo that = (KeystoreInfo) o; if (!keyStorePasswordUrl.equals(that.keyStorePasswordUrl)) { return false; } if (!keyStoreProvider.equals(that.keyStoreProvider)) { return false; } if (!keyStoreType.equals(that.keyStoreType)) { return false; } if (!keyStoreUrl.equals(that.keyStoreUrl)) { return false; } return true; } @Override public int hashCode() { return Objects.hash(keyStoreUrl, keyStoreType, keyStoreProvider, keyStorePasswordUrl); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PaxHeaders.7406/PermissionType.java0000644000000000000000000000013213441742745030467 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/policyeditor/PermissionType.java0000644000175000002070000000532613441742745031305 0ustar00jvanekmock00000000000000/*Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.policyeditor; /** * Defines the set of types required for the default permissions */ public enum PermissionType { NONE(""), FILE_PERMISSION("java.io.FilePermission"), PROPERTY_PERMISSION("java.util.PropertyPermission"), AWT_PERMISSION("java.awt.AWTPermission"), SOCKET_PERMISSION("java.net.SocketPermission"), RUNTIME_PERMISSION("java.lang.RuntimePermission"), AUDIO_PERMISSION("javax.sound.sampled.AudioPermission"), REFLECT_PERMISSION("java.lang.reflect.ReflectPermission"); public final String type; private PermissionType(final String type) { this.type = type; } /** * If there is any type that matches the string, return it. * If no matches, return NONE. * @param string a permission type value * @return the closest matching default permission type */ public static PermissionType fromString(final String string) { for (final PermissionType type : PermissionType.values()) { if (string.trim().equals(type.type)) { return type; } } return NONE; } }icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/dialogs0000644000000000000000000000013113441742745023470 xustar0030 mtime=1552401893.064832771 29 atime=1552410887.11418344 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/0000755000175000002070000000000013441742745024356 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/SingleCertInfoPane.java0000644000000000000000000000013213441742745030070 xustar0030 mtime=1552401893.064832771 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/SingleCertInfoPane.java0000644000175000002070000000632113441742745030702 0ustar00jvanekmock00000000000000/* SingleCertInfoPane.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import java.security.cert.X509Certificate; import java.util.ArrayList; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeSelectionModel; import net.sourceforge.jnlp.security.CertVerifier; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.SecurityUtil; public class SingleCertInfoPane extends CertsInfoPane { public SingleCertInfoPane(SecurityDialog x, CertVerifier certVerifier) { super(x, certVerifier); } @Override protected void buildTree() { X509Certificate cert = parent.getCert(); String subjectString = SecurityUtil.getCN(cert.getSubjectX500Principal().getName()); String issuerString = SecurityUtil.getCN(cert.getIssuerX500Principal().getName()); DefaultMutableTreeNode top = new DefaultMutableTreeNode(subjectString + " (" + issuerString + ")"); tree = new JTree(top); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addTreeSelectionListener(new TreeSelectionHandler()); } @Override protected void populateTable() { X509Certificate c = parent.getCert(); certNames = new String[1]; certsData = new ArrayList(); certsData.add(parseCert(c)); certNames[0] = SecurityUtil.getCN(c.getSubjectX500Principal().getName()) + " (" + SecurityUtil.getCN(c.getIssuerX500Principal().getName()) + ")"; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/CertWarningPane.java0000644000000000000000000000013213441742745027440 xustar0030 mtime=1552401893.063832773 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java0000644000175000002070000003504213441742745030254 0ustar00jvanekmock00000000000000/* CertWarningPane.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.security.KeyStore; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.security.CertVerifier; import net.sourceforge.jnlp.security.CertificateUtils; import net.sourceforge.jnlp.security.HttpsCertVerifier; import net.sourceforge.jnlp.security.KeyStores; import net.sourceforge.jnlp.security.KeyStores.Level; import net.sourceforge.jnlp.security.KeyStores.Type; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.security.SecurityUtil; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.SetValueHandler; import net.sourceforge.jnlp.security.dialogresults.YesNoSandbox; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.jdk89acesses.SunMiscLauncher; /** * Provides the panel for using inside a SecurityDialog. These dialogs are * used to warn the user when either signed code (with or without signing * issues) is going to be run, or when service permission (file, clipboard, * printer, etc) is needed with unsigned code. * * @author Joshua Sumali */ public class CertWarningPane extends SecurityDialogPanel { private final JNLPFile file; private final AccessType accessType; private final Certificate cert; private JCheckBox alwaysTrust; private final CertVerifier certVerifier; private final SecurityDelegate securityDelegate; private JPanel topPanel, infoPanel, buttonPanel, bottomPanel; private JLabel topLabel, nameLabel, publisherLabel, fromLabel, bottomLabel; private JButton run, sandbox, advancedOptions, cancel, moreInfo; private boolean alwaysTrustSelected; private String bottomLabelWarningText; public CertWarningPane(SecurityDialog x, CertVerifier certVerifier, SecurityDelegate securityDelegate) { super(x, certVerifier); this.certVerifier = certVerifier; this.securityDelegate = securityDelegate; this.accessType = parent.getAccessType(); this.file = parent.getFile(); this.cert = parent.getCertVerifier().getPublisher(null); addComponents(); } /** * Creates the actual GUI components, and adds it to this panel */ private void addComponents() { setTextAndLabels(); addButtons(); } private void setTextAndLabels() { String name = ""; String publisher = ""; String from = ""; //We don't worry about exceptions when trying to fill in //these strings -- we just want to fill in as many as possible. try { if ((certVerifier instanceof HttpsCertVerifier) && (cert instanceof X509Certificate)) { name = SecurityUtil.getCN(((X509Certificate) cert) .getSubjectX500Principal().getName()); } else if (file instanceof PluginBridge) { name = file.getTitle(); } else { name = file.getInformation().getTitle(); } } catch (Exception e) { } try { if (cert instanceof X509Certificate) { publisher = SecurityUtil.getCN(((X509Certificate) cert) .getSubjectX500Principal().getName()); } } catch (Exception e) { } try { if (file instanceof PluginBridge) { from = file.getCodeBase().getHost(); } else { from = file.getInformation().getHomepage().toString(); } } catch (Exception e) { } // Labels String topLabelText = ""; bottomLabelWarningText = parent.getCertVerifier().getRootInCacerts() ? R("STrustedSource") : R("SUntrustedSource"); String iconLocation = "net/sourceforge/jnlp/resources/"; alwaysTrustSelected = false; if (certVerifier instanceof HttpsCertVerifier) { // HTTPS certs that are verified do not prompt for a dialog. // @see VariableX509TrustManager#checkServerTrusted topLabelText = R("SHttpsUnverified") + " " + R("Continue"); iconLocation += "warning.png"; } else { switch (accessType) { case VERIFIED: topLabelText = R("SSigVerified"); iconLocation += "question.png"; alwaysTrustSelected = true; break; case UNVERIFIED: topLabelText = R("SSigUnverified"); iconLocation += "warning.png"; bottomLabelWarningText += " " + R("SWarnFullPermissionsIgnorePolicy"); break; case SIGNING_ERROR: topLabelText = R("SSignatureError"); iconLocation += "warning.png"; bottomLabelWarningText += " " + R("SWarnFullPermissionsIgnorePolicy"); break; } } ImageIcon icon = getImageIcon(iconLocation); topLabel = new JLabel(htmlWrap(topLabelText), icon, SwingConstants.LEFT); topLabel.setFont(new Font(topLabel.getFont().toString(), Font.BOLD, 12)); topPanel = new JPanel(new BorderLayout()); topPanel.setBackground(Color.WHITE); topPanel.add(topLabel, BorderLayout.CENTER); topPanel.setPreferredSize(new Dimension(400, 75)); topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //application info nameLabel = new JLabel(R("Name") + ": " + name); nameLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); publisherLabel = new JLabel(R("Publisher") + ": " + publisher); publisherLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); fromLabel = new JLabel(R("From") + ": " + from); fromLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); } private ImageIcon getImageIcon(final String imageLocation) { return SunMiscLauncher.getSecureImageIcon(imageLocation); } private void addButtons() { alwaysTrust = new JCheckBox(R("SAlwaysTrustPublisher")); alwaysTrust.setEnabled(true); alwaysTrust.setSelected(alwaysTrustSelected); infoPanel = new JPanel(new GridLayout(4, 1)); infoPanel.add(nameLabel); infoPanel.add(publisherLabel); final boolean isHttpsCertTrustDialog = certVerifier instanceof HttpsCertVerifier; if (!isHttpsCertTrustDialog) { infoPanel.add(fromLabel); } infoPanel.add(alwaysTrust); infoPanel.setBorder(BorderFactory.createEmptyBorder(25, 25, 25, 25)); //run and cancel buttons buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); run = new JButton(); if (isHttpsCertTrustDialog) { run.setText(R("ButYes")); } else { run.setText(R("ButRun")); } sandbox = new JButton(R("ButSandbox")); advancedOptions = new TemporaryPermissionsButton(file, securityDelegate, sandbox); cancel = new JButton(); if (isHttpsCertTrustDialog) { cancel.setText(R("ButNo")); } else { cancel.setText(R("ButCancel")); } if (isHttpsCertTrustDialog) { run.setToolTipText(R("CertWarnHTTPSAcceptTip")); } else { run.setToolTipText(R("CertWarnRunTip")); } sandbox.setToolTipText(R("CertWarnSandboxTip")); advancedOptions.setToolTipText(R("CertWarnPolicyTip")); if (isHttpsCertTrustDialog) { cancel.setToolTipText(R("CertWarnHTTPSRejectTip")); } else { cancel.setToolTipText(R("CertWarnCancelTip")); } alwaysTrust.addActionListener(new ButtonDisableListener(sandbox)); sandbox.setEnabled(!alwaysTrust.isSelected()); run.addActionListener(SetValueHandler.createSetValueListener(parent, YesNoSandbox.yes())); run.addActionListener(new CheckBoxListener()); sandbox.addActionListener(SetValueHandler.createSetValueListener(parent, YesNoSandbox.sandbox())); cancel.addActionListener(SetValueHandler.createSetValueListener(parent, YesNoSandbox.no())); initialFocusComponent = cancel; buttonPanel.add(run); // Only iff this dialog is being invoked by VariableX509TrustManager. // In this case, the "sandbox" button and temporary permissions do not make any sense, // as we are asking the user if they trust some certificate that is not being used to sign an app // (eg "do you trust this certificate presented for the HTTPS connection to the applet's host site") // Since this dialog isn't talking about an applet/application, there is nothing to run sandboxed. if (!isHttpsCertTrustDialog) { buttonPanel.add(sandbox); buttonPanel.add(advancedOptions); } buttonPanel.add(cancel); buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //all of the above setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(topPanel); add(infoPanel); add(buttonPanel); bottomLabel = new JLabel(htmlWrap(bottomLabelWarningText)); moreInfo = new JButton(R("ButMoreInformation")); moreInfo.addActionListener(new MoreInfoButtonListener()); bottomPanel = new JPanel(); bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.X_AXIS)); bottomPanel.add(bottomLabel); bottomPanel.add(moreInfo); bottomPanel.setPreferredSize(new Dimension(600, 100)); bottomPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); add(bottomPanel); } private class MoreInfoButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { SecurityDialog.showMoreInfoDialog(parent.getCertVerifier(), parent); } } /** * Disable the Sandbox button when the AlwaysTrust checkbox is checked */ private class ButtonDisableListener implements ActionListener { private final JButton button; public ButtonDisableListener(JButton button) { this.button = button; } @Override public void actionPerformed(ActionEvent e) { button.setEnabled(!alwaysTrust.isSelected()); } } /** * Updates the user's KeyStore of trusted Certificates. */ private class CheckBoxListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (alwaysTrust != null && alwaysTrust.isSelected()) { saveCert(); } } } public void saveCert() { try { KeyStore ks = KeyStores.getKeyStore(Level.USER, Type.CERTS).getKs(); X509Certificate c = (X509Certificate) parent.getCertVerifier().getPublisher(null); CertificateUtils.addToKeyStore(c, ks); File keyStoreFile = KeyStores.getKeyStoreLocation(Level.USER, Type.CERTS).getFile(); if (!keyStoreFile.isFile()) { FileUtils.createRestrictedFile(keyStoreFile, true); } SecurityUtil.storeKeyStore(ks, keyStoreFile); OutputController.getLogger().log("certificate is now permanently trusted"); } catch (Exception ex) { // TODO: Let NetX show a dialog here notifying user // about being unable to add cert to keystore OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } } @Override public DialogResult getDefaultNegativeAnswer() { return YesNoSandbox.sandbox(); } @Override public DialogResult getDefaultPositiveAnswer() { return YesNoSandbox.yes(); } @Override public DialogResult readFromStdIn(String what) { return YesNoSandbox.readValue(what); } @Override public String helpToStdIn() { return YesNoSandbox.sandbox().getAllowedValues().toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/apptrustwarningpanel0000644000000000000000000000013113441742745027760 xustar0030 mtime=1552401893.064832771 29 atime=1552410887.11418344 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/0000755000175000002070000000000013441742745030646 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PaxHeaders.7406/Unsi0000644000000000000000000000033013441742745030677 xustar00126 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningPanel.java 30 mtime=1552401893.064832771 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustW0000644000175000002070000001106313441742745034705 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.BorderLayout; import java.awt.Dimension; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JFrame; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletTrustConfirmation; public class UnsignedAppletTrustWarningPanel extends AppTrustWarningPanel { public UnsignedAppletTrustWarningPanel(SecurityDialog securityDialog, final JNLPFile file) { super(file, securityDialog); this.INFO_PANEL_HEIGHT = 250; addComponents(); if (securityDialog != null) { securityDialog.getViwableDialog().setMinimumSize(new Dimension(600, 400)); } } @Override protected ImageIcon getInfoImage() { final String location = "net/sourceforge/jnlp/resources/info-small.png"; return new ImageIcon(ClassLoader.getSystemClassLoader().getResource(location)); } protected static String getTopPanelTextKey() { return "SUnsignedSummary"; } protected static String getInfoPanelTextKey() { return "SUnsignedDetail"; } protected static String getQuestionPanelTextKey() { return "SUnsignedQuestion"; } @Override protected String getTopPanelText() { return htmlWrap(R(getTopPanelTextKey())); } @Override protected String getInfoPanelText() { String text = R(getInfoPanelTextKey(), file.getCodeBase(), file.getSourceLocation()); UnsignedAppletActionEntry rememberedEntry = UnsignedAppletTrustConfirmation.getStoredEntry(file, this.getClass()); if (rememberedEntry != null) { ExecuteAppletAction rememberedAction = rememberedEntry.getAppletSecurityActions().getAction(this.getClass()); if (rememberedAction == ExecuteAppletAction.YES) { text += "
    " + R("SUnsignedAllowedBefore", rememberedEntry.getLocalisedTimeStamp()); } else if (rememberedAction == ExecuteAppletAction.NO) { text += "
    " + R("SUnsignedRejectedBefore", rememberedEntry.getLocalisedTimeStamp()); } } return htmlWrap(text); } @Override protected String getQuestionPanelText() { return htmlWrap(R(getQuestionPanelTextKey())); } public static void main(String[] args) throws Exception { UnsignedAppletTrustWarningPanel w = new UnsignedAppletTrustWarningPanel(null, new JNLPFile(new URL("http://www.geogebra.org/webstart/geogebra.jnlp"))); JFrame f = new JFrame(); f.setSize(600, 400); f.add(w, BorderLayout.CENTER); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PaxHeaders.7406/Matc0000644000000000000000000000032313441742745030647 xustar00121 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/MatchingALACAttributePanel.java 30 mtime=1552401893.038832825 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/MatchingALACAttribut0000644000175000002070000001223213441742745034463 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel; import java.awt.BorderLayout; import java.awt.Dimension; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.HashSet; import java.util.Set; import javax.swing.ImageIcon; import javax.swing.JFrame; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.ParseException; import net.sourceforge.jnlp.runtime.Translator; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletTrustConfirmation; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.util.UrlUtils; /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html#app_library */ public class MatchingALACAttributePanel extends AppTrustWarningPanel { private final String title; private final String codebase; private final String remoteUrls; public MatchingALACAttributePanel(SecurityDialog securityDialog, JNLPFile file, String codebase, String remoteUrls) { super(file, securityDialog); this.title = super.getAppletTitle(); this.codebase = codebase; this.remoteUrls = remoteUrls; TOP_PANEL_HEIGHT = 250; addComponents(); if (securityDialog != null) { securityDialog.getViwableDialog().setMinimumSize(new Dimension(600, 400)); } } @Override protected ImageIcon getInfoImage() { final String location = "net/sourceforge/jnlp/resources/question.png"; return new ImageIcon(ClassLoader.getSystemClassLoader().getResource(location)); } @Override protected String getTopPanelText() { return htmlWrap(Translator.R("ALACAMatchingMainTitle", title, codebase, remoteUrls)); } @Override protected String getInfoPanelText() { String r = Translator.R("ALACAMatchingInfo"); UnsignedAppletActionEntry rememberedEntry = UnsignedAppletTrustConfirmation.getStoredEntry(file, this.getClass()); if (rememberedEntry != null) { ExecuteAppletAction rememberedAction = rememberedEntry.getAppletSecurityActions().getAction(this.getClass()); if (rememberedAction == ExecuteAppletAction.YES) { r += "
    " + R("SUnsignedAllowedBefore", rememberedEntry.getLocalisedTimeStamp()); } else if (rememberedAction == ExecuteAppletAction.NO) { r += "
    " + R("SUnsignedRejectedBefore", rememberedEntry.getLocalisedTimeStamp()); } } return r; } @Override protected String getQuestionPanelText() { return "";//htmlWrap(Translator.R("SRememberOption")); } @Override public String getAppletTitle() { return ""; } public static void main(String[] args) throws MalformedURLException, IOException, ParseException { Set s = new HashSet<>(); s.add(new URL("http:/blah.com/blah")); s.add(new URL("http:/blah.com/blah/blah")); MatchingALACAttributePanel w = new MatchingALACAttributePanel(null, new JNLPFile(new URL("http://www.geogebra.org/webstart/geogebra.jnlp")), "http://nbblah.url", UrlUtils.setOfUrlsToHtmlList(s)); JFrame f = new JFrame(); f.setSize(600, 400); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(w, BorderLayout.CENTER); f.setVisible(true); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PaxHeaders.7406/AppT0000644000000000000000000000031513441742745030630 xustar00115 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java 30 mtime=1552401893.039832823 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel0000644000175000002070000002625313441742745034671 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Desktop; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.PluginBridge; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.appletextendedsecurity.ExtendedAppletSecurityHelp; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.SetValueHandler; import net.sourceforge.jnlp.security.dialogresults.YesNoSandboxLimited; import net.sourceforge.jnlp.security.dialogs.SecurityDialogPanel; import net.sourceforge.jnlp.security.dialogs.remember.RememberPanel; import net.sourceforge.jnlp.security.dialogs.remember.RememberPanelResult; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import net.sourceforge.jnlp.util.ScreenFinder; import net.sourceforge.jnlp.util.logging.OutputController; /* * This class is meant to provide a common layout and functionality for warning dialogs * that appear when the user needs to confirm the running of applets/applications. * Subclasses include UnsignedAppletTrustWarningPanel, for unsigned plugin applets, and * PartiallySignedAppTrustWarningPanel, for partially signed JNLP applications as well as * plugin applets. New implementations should be added to the unit test at * unit/net/sourceforge/jnlp/security/AppTrustWarningPanelTest */ public abstract class AppTrustWarningPanel extends SecurityDialogPanel implements RememberableDialog{ protected int PANE_WIDTH = 500; protected int TOP_PANEL_HEIGHT = 60; protected int INFO_PANEL_HEIGHT = 160; protected int INFO_PANEL_HINT_HEIGHT = 25; protected int QUESTION_PANEL_HEIGHT = 35; protected List buttons; protected JButton allowButton; protected JButton rejectButton; protected JButton helpButton; protected RememberPanel rememberPanel; protected JNLPFile file; /* * Subclasses should call addComponents() IMMEDIATELY after calling the super() constructor! */ public AppTrustWarningPanel(JNLPFile file, SecurityDialog securityDialog) { super(securityDialog); this.file = file; this.parent = securityDialog; rememberPanel = new RememberPanel(file.getCodeBase()); this.buttons = new ArrayList<>(); allowButton = new JButton(R("ButProceed")); rejectButton = new JButton(R("ButCancel")); helpButton = new JButton(R("APPEXTSECguiPanelHelpButton")); allowButton.addActionListener(SetValueHandler.createSetValueListener(parent, YesNoSandboxLimited.yes())); rejectButton.addActionListener(SetValueHandler.createSetValueListener(parent, YesNoSandboxLimited.no())); helpButton.addActionListener(getHelpButtonAction()); buttons.add(allowButton); buttons.add(rejectButton); buttons.add(helpButton); } /* * Provides an image to be displayed near the upper left corner of the dialog. */ protected abstract ImageIcon getInfoImage(); /* * Provides a short description of why the dialog is appearing. The message is expected to be HTML-formatted. */ protected abstract String getTopPanelText(); /* * Provides in-depth information on why the dialog is appearing. The message is expected to be HTML-formatted. */ protected abstract String getInfoPanelText(); /* * This provides the text for the final prompt to the user. The message is expected to be HTML formatted. * The user's action is a direct response to this question. */ protected abstract String getQuestionPanelText(); public final JButton getAllowButton() { return allowButton; } public final JButton getRejectButton() { return rejectButton; } protected ActionListener getHelpButtonAction() { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JDialog d = new ExtendedAppletSecurityHelp(null, false, "dialogue"); ScreenFinder.centerWindowsToCurrentScreen(d); d.setVisible(true); } }; } private void setupTopPanel() { final String topLabelText = getTopPanelText(); JLabel topLabel = new JLabel(topLabelText, getInfoImage(), SwingConstants.LEFT); topLabel.setFont(new Font(topLabel.getFont().toString(), Font.BOLD, 12)); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.setBackground(Color.WHITE); topPanel.add(topLabel, BorderLayout.CENTER); topPanel.setPreferredSize(new Dimension(PANE_WIDTH, TOP_PANEL_HEIGHT)); topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); add(topPanel); } protected String getAppletTitle() { String title; try { if (file instanceof PluginBridge) { title = file.getTitle(); } else { title = file.getInformation().getTitle(); } } catch (Exception e) { title = ""; } return title; } private void setupInfoPanel() { JPanel infoPanel = new JPanel(new BorderLayout()); String titleText = getAppletTitle(); JLabel titleLabel = new JLabel(titleText); titleLabel.setFont(new Font(titleLabel.getFont().getName(), Font.BOLD, 18)); String infoLabelText = getInfoPanelText(); JEditorPane infoLabel = new JEditorPane("text/html", htmlWrap(infoLabelText)); infoLabel.setBackground(infoPanel.getBackground()); infoLabel.setEditable(false); infoLabel.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { try { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { Desktop.getDesktop().browse(e.getURL().toURI()); } } catch (IOException | URISyntaxException ex) { OutputController.getLogger().log(ex); } } }); int panelHeight = titleLabel.getHeight() + INFO_PANEL_HEIGHT + INFO_PANEL_HINT_HEIGHT; infoPanel.add(titleLabel, BorderLayout.PAGE_START); infoPanel.add(infoLabel, BorderLayout.CENTER); infoPanel.setPreferredSize(new Dimension(PANE_WIDTH, panelHeight)); infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); add(infoPanel); } private void setupQuestionsPanel() { JPanel questionPanel = new JPanel(new BorderLayout()); final String questionPanelText = getQuestionPanelText(); questionPanel.add(new JLabel(questionPanelText), BorderLayout.EAST); questionPanel.setPreferredSize(new Dimension(PANE_WIDTH, QUESTION_PANEL_HEIGHT)); questionPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); add(questionPanel); } private JPanel createButtonPanel() { JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); for (final JButton button : buttons) { buttonPanel.add(button); } buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); return buttonPanel; } // Set up 'Remember Option' checkbox & Proceed/Cancel buttons private void setupButtonAndCheckBoxPanel() { JPanel outerPanel = new JPanel(new BorderLayout()); outerPanel.add(rememberPanel, BorderLayout.SOUTH); outerPanel.add(createButtonPanel(), BorderLayout.EAST); add(outerPanel); } /** * Creates the actual GUI components, and adds it to this panel. This should * be called by all subclasses IMMEDIATELY after calling the super() * constructor! */ protected final void addComponents() { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); setupTopPanel(); setupInfoPanel(); setupQuestionsPanel(); setupButtonAndCheckBoxPanel(); } @Override public RememberPanelResult getRemeberAction() { return rememberPanel.getRememberAction(); } @Override public JNLPFile getFile() { return file; } @Override public DialogResult getValue() { return parent.getValue(); } @Override public DialogResult readValue(String s) { return YesNoSandboxLimited.readValue(s); } @Override public DialogResult getDefaultNegativeAnswer() { return YesNoSandboxLimited.no(); } @Override public DialogResult getDefaultPositiveAnswer() { return YesNoSandboxLimited.yes(); } @Override public DialogResult readFromStdIn(String what) { return YesNoSandboxLimited.readValue(what); } @Override public String helpToStdIn() { return YesNoSandboxLimited.yes().getAllowedValues().toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PaxHeaders.7406/AppT0000644000000000000000000000031613441742745030631 xustar00116 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningDialog.java 30 mtime=1552401893.039832823 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningDialo0000644000175000002070000000505713441742745034661 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.security.SecurityDialog; /** * A panel that confirms that the user is OK with unsigned code running. */ public class AppTrustWarningDialog { public static AppTrustWarningPanel unsigned(final SecurityDialog dialog, final JNLPFile file) { return new UnsignedAppletTrustWarningPanel(dialog, file); } public static AppTrustWarningPanel partiallySigned(final SecurityDialog dialog, final JNLPFile file, final SecurityDelegate securityDelegate) { return new PartiallySignedAppTrustWarningPanel(file, dialog, securityDelegate); } public static AppTrustWarningPanel matchingAlaca(SecurityDialog x, JNLPFile file, String codebase, String remoteUrls) { return new MatchingALACAttributePanel(x, file, codebase, remoteUrls); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PaxHeaders.7406/Part0000644000000000000000000000033313441742745030672 xustar00130 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java 29 mtime=1552401893.04583281 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTr0000644000175000002070000001621013441742745034633 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.Dimension; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import javax.swing.ImageIcon; import javax.swing.JButton; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.SecurityUtil; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletTrustConfirmation; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.SetValueHandler; import net.sourceforge.jnlp.security.dialogresults.YesNoSandbox; import net.sourceforge.jnlp.security.dialogs.TemporaryPermissionsButton; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.tools.CertInformation; import net.sourceforge.jnlp.tools.JarCertVerifier; public class PartiallySignedAppTrustWarningPanel extends AppTrustWarningPanel { private final JarCertVerifier jcv; private final JButton sandboxButton; private final JButton advancedOptionsButton; public PartiallySignedAppTrustWarningPanel(JNLPFile file, SecurityDialog securityDialog, SecurityDelegate securityDelegate) { super(file, securityDialog); this.jcv = (JarCertVerifier) securityDialog.getCertVerifier(); this.INFO_PANEL_HEIGHT = 250; sandboxButton = new JButton(); sandboxButton.setText(R("ButSandbox")); sandboxButton.addActionListener(SetValueHandler.createSetValueListener(parent, YesNoSandbox.sandbox())); advancedOptionsButton = new TemporaryPermissionsButton(file, securityDelegate, sandboxButton); buttons.add(1, sandboxButton); buttons.add(2, advancedOptionsButton); addComponents(); securityDialog.getViwableDialog().setMinimumSize(new Dimension(600, 400)); } private String getAppletInfo() { Certificate c = jcv.getPublisher(null); String publisher = ""; String from = ""; try { if (c instanceof X509Certificate) { publisher = SecurityUtil.getCN(((X509Certificate) c).getSubjectX500Principal().getName()); } } catch (Exception e) { } try { if (file instanceof PluginBridge) { from = file.getNotNullProbalbeCodeBase().toExternalForm(); } else { from = file.getInformation().getHomepage().toExternalForm(); } } catch (Exception e) { } return "
    " + R("Publisher") + ": " + publisher + "
    " + R("From") + ": " + from + ""; } private String getSigningInfo() { CertInformation info = jcv.getCertInformation(jcv.getCertPath(null)); if (info != null && info.isRootInCacerts() && !info.hasSigningIssues()) { return R("SSigVerified"); } else if (info != null && info.isRootInCacerts()) { return R("SSigUnverified"); } else { return R("SSignatureError"); } } @Override protected ImageIcon getInfoImage() { final String location = "net/sourceforge/jnlp/resources/warning.png"; return new ImageIcon(ClassLoader.getSystemClassLoader().getResource(location)); } protected static String getTopPanelTextKey() { return "SPartiallySignedSummary"; } protected static String getInfoPanelTextKey() { return "SPartiallySignedDetail"; } protected static String getQuestionPanelTextKey() { return "SPartiallySignedQuestion"; } @Override protected String getTopPanelText() { return htmlWrap(R(getTopPanelTextKey())); } @Override protected String getInfoPanelText() { String text = getAppletInfo(); text += "

    " + R(getInfoPanelTextKey(), file.getCodeBase(), file.getSourceLocation()); text += "

    " + getSigningInfo(); UnsignedAppletActionEntry rememberedEntry = UnsignedAppletTrustConfirmation.getStoredEntry(file, this.getClass()); if (rememberedEntry != null) { ExecuteAppletAction rememberedAction = rememberedEntry.getAppletSecurityActions().getAction(this.getClass()); if (rememberedAction == ExecuteAppletAction.YES) { text += "
    " + R("SUnsignedAllowedBefore", rememberedEntry.getLocalisedTimeStamp()); } else if (rememberedAction == ExecuteAppletAction.NO) { text += "
    " + R("SUnsignedRejectedBefore", rememberedEntry.getLocalisedTimeStamp()); } } return htmlWrap(text); } @Override protected String getQuestionPanelText() { return htmlWrap(R(getQuestionPanelTextKey())); } @Override public DialogResult readValue(String s) { return YesNoSandbox.readValue(s); } @Override public DialogResult getDefaultNegativeAnswer() { return YesNoSandbox.sandbox(); } @Override public DialogResult getDefaultPositiveAnswer() { return YesNoSandbox.yes(); } @Override public DialogResult readFromStdIn(String what) { return YesNoSandbox.readValue(what); } @Override public String helpToStdIn() { return YesNoSandbox.sandbox().getAllowedValues().toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/PasswordAuthenticationPan0000644000000000000000000000013213441742745030632 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PasswordAuthenticationPane.java0000644000175000002070000001611013441742745032526 0ustar00jvanekmock00000000000000/* PasswordAuthenticationPane -- requests authentication information from users Copyright (C) 2010 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import java.awt.BorderLayout; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.NamePassword; /** * Modal non-minimizable dialog to request http authentication credentials */ public class PasswordAuthenticationPane extends SecurityDialogPanel { private final JTextField jtfUserName = new JTextField(); private final JPasswordField jpfPassword = new JPasswordField(); private final String host; private final int port; private final String prompt; private final String type; public PasswordAuthenticationPane(SecurityDialog parent, Object[] extras) { super(parent); host = (String) extras[0]; port = (Integer) extras[1]; prompt = (String) extras[2]; type = (String) extras[3]; addComponents(); } /** * Initialized the dialog components */ public final void addComponents() { JLabel jlInfo = new JLabel(""); jlInfo.setText("" + R("SAuthenticationPrompt", type, host, prompt) + ""); setLayout(new GridBagLayout()); JLabel jlUserName = new JLabel(R("Username")); JLabel jlPassword = new JLabel(R("Password")); JButton jbOK = new JButton(R("ButOk")); JButton jbCancel = new JButton(R("ButCancel")); jtfUserName.setSize(20, 10); jpfPassword.setSize(20, 10); GridBagConstraints c; c = new GridBagConstraints(); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 0; c.gridy = 0; c.gridwidth = 2; c.insets = new Insets(10, 5, 3, 3); add(jlInfo, c); c = new GridBagConstraints(); c.gridx = 0; c.gridy = 1; c.insets = new Insets(10, 5, 3, 3); add(jlUserName, c); c = new GridBagConstraints(); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridy = 1; c.insets = new Insets(10, 5, 3, 3); c.weightx = 1.0; add(jtfUserName, c); c = new GridBagConstraints(); c.gridx = 0; c.gridy = 2; c.insets = new Insets(5, 5, 3, 3); add(jlPassword, c); c = new GridBagConstraints(); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridy = 2; c.insets = new Insets(5, 5, 3, 3); c.weightx = 1.0; add(jpfPassword, c); c = new GridBagConstraints(); c.anchor = GridBagConstraints.SOUTHEAST; c.gridx = 1; c.gridy = 3; c.insets = new Insets(5, 5, 3, 70); c.weightx = 0.0; add(jbCancel, c); c = new GridBagConstraints(); c.anchor = GridBagConstraints.SOUTHEAST; c.gridx = 1; c.gridy = 3; c.insets = new Insets(5, 5, 3, 3); c.weightx = 0.0; add(jbOK, c); setMinimumSize(new Dimension(400, 150)); setMaximumSize(new Dimension(1024, 150)); setSize(400, 150); if (parent!=null){ parent.getViwableDialog().setLocationRelativeTo(null); } initialFocusComponent = jtfUserName; ActionListener acceptActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { parent.setValue(new NamePassword(jtfUserName.getText(), jpfPassword.getPassword())); parent.getViwableDialog().dispose(); } }; ActionListener cancelActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { parent.setValue(null); parent.getViwableDialog().dispose(); } }; // OK => read supplied info and pass it on jbOK.addActionListener(acceptActionListener); // Cancel => discard supplied info and pass on an empty auth jbCancel.addActionListener(cancelActionListener); // "return" key in either user or password field => OK jtfUserName.addActionListener(acceptActionListener); jpfPassword.addActionListener(acceptActionListener); } @Override public DialogResult getDefaultNegativeAnswer() { return null; } @Override public DialogResult getDefaultPositiveAnswer() { return null; } @Override public DialogResult readFromStdIn(String what) { return NamePassword.readValue(what); } @Override public String helpToStdIn() { return Translator.R("PAPstdinInfo"); } public static void main(String[] args) { PasswordAuthenticationPane w = new PasswordAuthenticationPane(null, new Object[]{"host",666,"prompt","type"}); JFrame f = new JFrame(); f.setSize(400, 200); f.add(w, BorderLayout.CENTER); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/AccessWarningPane.java0000644000000000000000000000013213441742745027744 xustar0030 mtime=1552401893.037832827 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java0000644000175000002070000005105613441742745030563 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.ShortcutDesc; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.CertVerifier; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.security.dialogresults.AccessWarningPaneComplexReturn; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.YesNo; import net.sourceforge.jnlp.security.dialogs.remember.RememberPanelResult; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.XDesktopEntry; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.PlainTextFormatter; import net.sourceforge.jnlp.jdk89acesses.SunMiscLauncher; /** * Provides a panel to show inside a SecurityDialog. These dialogs are * used to warn the user when either signed code (with or without signing * issues) is going to be run, or when service permission (file, clipboard, * printer, etc) is needed with unsigned code. * * @author Joshua Sumali */ public class AccessWarningPane extends SecurityDialogPanel implements RememberableDialog{ private Object[] extras; private JCheckBox desktopCheck; private JCheckBox menuCheck; HtmlShortcutPanel htmlPanelDesktop; HtmlShortcutPanel htmlPanelMenu; RememberPanel rememberPanel; public AccessWarningPane(SecurityDialog x, CertVerifier certVerifier) { super(x, certVerifier); addComponents(); } public AccessWarningPane(SecurityDialog x, Object[] extras, CertVerifier certVerifier) { super(x, certVerifier); this.extras = extras; addComponents(); } /** * Creates the actual GUI components, and adds it to this panel */ private void addComponents() { AccessType type = parent.getAccessType(); JNLPFile file = parent.getFile(); String name = ""; String publisher = ""; String from = ""; //We don't worry about exceptions when trying to fill in //these strings -- we just want to fill in as many as possible. try { name = file.getInformation().getTitle() != null ? file.getInformation().getTitle() : R("SNoAssociatedCertificate"); } catch (Exception e) { } try { publisher = file.getInformation().getVendor() != null ? file.getInformation().getVendor() + " " + R("SUnverified") : R("SNoAssociatedCertificate"); } catch (Exception e) { } try { from = !file.getInformation().getHomepage().toString().equals("") ? file.getInformation().getHomepage().toString() : file.getSourceLocation().getAuthority(); } catch (Exception e) { from = file.getSourceLocation().getAuthority(); } //Top label String topLabelText = ""; switch (type) { case READ_FILE: if (extras != null && extras.length > 0 && extras[0] instanceof String) { topLabelText = R("SFileReadAccess", FileUtils.displayablePath((String) extras[0])); } else { topLabelText = R("SFileReadAccess", R("AFileOnTheMachine")); } break; case WRITE_FILE: if (extras != null && extras.length > 0 && extras[0] instanceof String) { topLabelText = R("SFileWriteAccess", FileUtils.displayablePath((String) extras[0])); } else { topLabelText = R("SFileWriteAccess", R("AFileOnTheMachine")); } break; case CREATE_DESTKOP_SHORTCUT: topLabelText = R("SDesktopShortcut"); break; case CLIPBOARD_READ: topLabelText = R("SClipboardReadAccess"); break; case CLIPBOARD_WRITE: topLabelText = R("SClipboardWriteAccess"); break; case PRINTER: topLabelText = R("SPrinterAccess"); break; case NETWORK: if (extras != null && extras.length >= 0) topLabelText = R("SNetworkAccess", extras[0]); else topLabelText = R("SNetworkAccess", "(address here)"); } ImageIcon icon = SunMiscLauncher.getSecureImageIcon("net/sourceforge/jnlp/resources/question.png"); JLabel topLabel = new JLabel(htmlWrap(topLabelText), icon, SwingConstants.LEFT); topLabel.setFont(new Font(topLabel.getFont().toString(), Font.BOLD, 12)); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.setBackground(Color.WHITE); topPanel.add(topLabel, BorderLayout.CENTER); topPanel.setPreferredSize(new Dimension(450, 100)); topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //application info JLabel nameLabel = new JLabel(R("Name") + ": " + name); nameLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JLabel publisherLabel = new JLabel(R("Publisher") + ": " + publisher); publisherLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JLabel fromLabel = new JLabel(R("From") + ": " + from); fromLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); final JButton run = new JButton(R("ButOk")); final JButton cancel = new JButton(R("ButCancel")); JPanel infoPanel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.gridx = 0; c.gridy = 0; c.anchor = GridBagConstraints.NORTHWEST; infoPanel.add(nameLabel, c); c.gridy++; infoPanel.add(publisherLabel, c); c.gridy++; infoPanel.add(fromLabel,c); c.gridy++; if (type == AccessType.CREATE_DESTKOP_SHORTCUT) { if (file.getInformation() != null && file.getInformation().getShortcut() != null && file.getInformation().getShortcut().onDesktop()) { desktopCheck = new JCheckBox(R("EXAWdesktopWants")); desktopCheck.setSelected(true); } else { desktopCheck = new JCheckBox(R("EXAWdesktopDontWants")); desktopCheck.setSelected(false); } if (file.getInformation() != null && file.getInformation().getShortcut() !=null && file.getInformation().getShortcut().toMenu()) { if (file.getInformation().getShortcut() != null && file.getInformation().getShortcut().getMenu() != null && file.getInformation().getShortcut().getMenu().getSubMenu() != null) { menuCheck = new JCheckBox(R("EXAWsubmenu",file.getInformation().getShortcut().getMenu().getSubMenu())); } else { menuCheck = new JCheckBox(R("EXAWmenuWants")); } menuCheck.setSelected(true); } else { menuCheck = new JCheckBox(R("EXAWmenuDontWants")); menuCheck.setSelected(false); } infoPanel.add(new JLabel("___________________________________________________"),c); c.gridy++; infoPanel.add(desktopCheck,c); c.gridy++; if (!JNLPRuntime.isWebstartApplication()) { htmlPanelDesktop = new HtmlShortcutPanel(); infoPanel.add(htmlPanelDesktop, c); htmlPanelDesktop.setVisible(false); c.gridy++; } infoPanel.add(menuCheck,c); c.gridy++; if (!JNLPRuntime.isWebstartApplication()) { htmlPanelMenu = new HtmlShortcutPanel(); infoPanel.add(htmlPanelMenu, c); htmlPanelMenu.setVisible(false); c.gridy++; } infoPanel.add(new JLabel(R("EXAWsettingsInfo", ShortcutDesc.deploymentJavawsShortcutToString(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_CREATE_DESKTOP_SHORTCUT)), R("CPTabDesktopIntegration"))),c); c.gridy++; infoPanel.add(new JLabel(R("EXAWsettingsManage", R("CPTabMenuShortcuts"))),c); c.gridy++; infoPanel.validate(); } rememberPanel = new RememberPanel(); infoPanel.add(rememberPanel,c); c.gridy++; infoPanel.setBorder(BorderFactory.createEmptyBorder(25, 25, 25, 25)); //run and cancel buttons JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton showAdvanced = new JButton(R("ButAdvancedOptions")); showAdvanced.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { negateVisibility(rememberPanel); negateVisibility(htmlPanelDesktop); negateVisibility(htmlPanelMenu); AccessWarningPane.this.parent.getViwableDialog().pack(); } private void negateVisibility(JComponent a) { if (a != null){ a.setVisible(!a.isVisible()); } } } ); run.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { parent.setValue(getModifier(BasicDialogValue.Primitive.YES)); parent.getViwableDialog().dispose(); } }); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { parent.setValue(getModifier(BasicDialogValue.Primitive.NO)); parent.getViwableDialog().dispose(); } }); initialFocusComponent = cancel; buttonPanel.add(run); buttonPanel.add(cancel); buttonPanel.add(showAdvanced); buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //all of the above setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(topPanel); add(infoPanel); add(buttonPanel); rememberPanel.setVisible(false); this.parent.getViwableDialog().pack(); } private AccessWarningPaneComplexReturn getModifier(BasicDialogValue.Primitive button) { AccessWarningPaneComplexReturn ar = new AccessWarningPaneComplexReturn(button); if (desktopCheck != null) { if (htmlPanelDesktop != null) { //html ar.setDekstop(htmlPanelDesktop.getShortcutResult(desktopCheck.isSelected())); } else { //jnlp ar.setDekstop(new AccessWarningPaneComplexReturn.ShortcutResult(desktopCheck.isSelected())); } } if (menuCheck != null) { if (htmlPanelMenu != null) { //html ar.setMenu(htmlPanelMenu.getShortcutResult(menuCheck.isSelected())); } else { //jnlp ar.setMenu(new AccessWarningPaneComplexReturn.ShortcutResult(menuCheck.isSelected())); } } return ar; } private class RememberPanel extends JPanel { final JRadioButton byApp = new JRadioButton(R("EXAWrememberByApp")); final JRadioButton byPage = new JRadioButton(R("EXAWrememberByPage")); final JRadioButton dont = new JRadioButton(R("EXAWdontRemember"), true); public RememberPanel() { super(new FlowLayout(FlowLayout.CENTER, 1, 5)); this.setBorder(new EmptyBorder(0, 0, 0, 0)); this.add(byApp); this.add(byPage); this.add(dont); byApp.setToolTipText(R("EXAWrememberByAppTooltip")); byPage.setToolTipText(R("EXAWrememberByPageTooltip")); dont.setToolTipText(R("EXAWdontRememberTooltip")); final ButtonGroup bg = new ButtonGroup(); bg.add(byApp); bg.add(byPage); bg.add(dont); this.validate(); } private boolean isRemembered(){ return !dont.isSelected(); } private boolean isRememebredForCodebase(){ return byPage.isSelected(); } private RememberPanelResult getResult() { return new RememberPanelResult(isRemembered(), isRememebredForCodebase()); } } private class HtmlShortcutPanel extends JPanel { final JRadioButton browser = new JRadioButton(R("EXAWbrowser"), true); final JComboBox browsers = new JComboBox<>(XDesktopEntry.BROWSERS); final JRadioButton jnlpGen = new JRadioButton(R("EXAWgenjnlp")); final JRadioButton jnlpHref = new JRadioButton(R("EXAWjnlphref")); final JRadioButton javawsHtml = new JRadioButton(R("EXAWhtml")); final JCheckBox fix = new JCheckBox(R("EXAWfixhref")); final ActionListener modifySecondaryControls = new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { if (browser.isSelected()) { browsers.setEnabled(true); } else { browsers.setEnabled(false); } if (jnlpHref.isSelected()) { fix.setEnabled(true); fix.setSelected(true); } else { fix.setEnabled(false); fix.setSelected(false); } } }; public HtmlShortcutPanel() { super(new FlowLayout(FlowLayout.CENTER, 1, 5)); this.setBorder(new EmptyBorder(0, 0, 0, 0)); addMainComponents(); setTooltips(); ButtonGroup bg = createRadiosGroup(); // init checkbox modifySecondaryControls.actionPerformed(null); this.validate(); } public AccessWarningPaneComplexReturn.ShortcutResult getShortcutResult(boolean mainResolution) { AccessWarningPaneComplexReturn.ShortcutResult r = new AccessWarningPaneComplexReturn.ShortcutResult(mainResolution); r.setBrowser((String) browsers.getSelectedItem()); r.setFixHref(fix.isSelected()); if (browser.isSelected()) { r.setShortcutType(AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.BROWSER); } else if (jnlpGen.isSelected()) { r.setShortcutType(AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.GENERATED_JNLP); } else if (jnlpHref.isSelected()) { r.setShortcutType(AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.JNLP_HREF); } else if (javawsHtml.isSelected()) { r.setShortcutType(AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.JAVAWS_HTML); } return r; } private ButtonGroup createRadiosGroup() { ButtonGroup bg = new ButtonGroup(); bg.add(browser); bg.add(jnlpGen); bg.add(jnlpHref); bg.add(javawsHtml); setCheckboxModifierListener(); return bg; } private void setCheckboxModifierListener() { browser.addActionListener(modifySecondaryControls); jnlpGen.addActionListener(modifySecondaryControls); jnlpHref.addActionListener(modifySecondaryControls); javawsHtml.addActionListener(modifySecondaryControls); } private void addMainComponents() { this.add(browser); browsers.setEditable(true); browsers.setSelectedItem(XDesktopEntry.getBrowserBin()); this.add(browsers); this.add(jnlpGen); this.add(jnlpHref); this.add(javawsHtml); this.add(fix); if (parent.getFile() instanceof PluginBridge && ((PluginBridge)(parent.getFile())).haveDebugJnlp()){ jnlpHref.setEnabled(true); } else { jnlpHref.setEnabled(false); } } private void setTooltips() { browser.setToolTipText(R("EXAWbrowserTolltip")); browsers.setToolTipText(R("EXAWbrowsersTolltip")); jnlpGen.setToolTipText(R("EXAWgeneratedTolltip")); jnlpHref.setToolTipText(R("EXAWhrefTolltip")); javawsHtml.setToolTipText(R("EXAWhtmlTolltip")); fix.setToolTipText(R("EXAWfixTolltip")); } } @Override public RememberPanelResult getRemeberAction() { return rememberPanel.getResult(); } @Override public DialogResult getValue() { return parent.getValue(); } @Override public JNLPFile getFile() { return parent.getFile(); } @Override public DialogResult readValue(String s) { return AccessWarningPaneComplexReturn.readValue(s); } @Override public DialogResult getDefaultNegativeAnswer() { return new AccessWarningPaneComplexReturn(false); } @Override public DialogResult getDefaultPositiveAnswer() { return new AccessWarningPaneComplexReturn(true); } @Override public DialogResult readFromStdIn(String what) { return AccessWarningPaneComplexReturn.readValue(what); } @Override public String helpToStdIn() { if (parent.getAccessType() == AccessType.CREATE_DESTKOP_SHORTCUT){ return Translator.R("AWPstdoutHint1") + PlainTextFormatter.getLineSeparator() + Translator.R("AWPstdoutHint2") + PlainTextFormatter.getLineSeparator() + Translator.R("AWPstdoutHint3", AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.allValues()) + PlainTextFormatter.getLineSeparator() + Translator.R("AWPstdoutHint1") + PlainTextFormatter.getLineSeparator(); } else { return YesNo.yes().getAllowedValues().toString(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/remember0000644000000000000000000000013113441742745025266 xustar0030 mtime=1552401893.065832769 29 atime=1552410887.11418344 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/0000755000175000002070000000000013441742745026154 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/PaxHeaders.7406/SavedRememberAct0000644000000000000000000000013213441742745030440 xustar0030 mtime=1552401893.065832769 30 atime=1552402157.230253496 30 ctime=1552410887.035183625 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/SavedRememberAction.java0000644000175000002070000000535113441742745032702 0ustar00jvanekmock00000000000000/* Copyright (C) 2008-2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.remember; public class SavedRememberAction { private final ExecuteAppletAction action; private final String savedValue; public SavedRememberAction(ExecuteAppletAction action, String savedValue) { this.action = action; this.savedValue = savedValue; } public ExecuteAppletAction getAction() { return action; } public String getSavedValue() { return savedValue; } @Override public String toString() { return toShortString(); } public String toLongString() { String s=sanitizeSavedValue(); return action.toString()+"{"+s+"}"; } private String sanitizeSavedValue() { String s=savedValue; if (savedValue==null || savedValue.trim().isEmpty()){ s=""; } return s; } public String toShortString() { String s=sanitizeSavedValue(); return action.toChar()+"{"+s+"}"; } public boolean isRemember() { return action == ExecuteAppletAction.ALWAYS || action == ExecuteAppletAction.NEVER; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/PaxHeaders.7406/RememberPanelRes0000644000000000000000000000013213441742745030457 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/RememberPanelResult.java0000644000175000002070000000420513441742745032735 0ustar00jvanekmock00000000000000/* Copyright (C) 2008-2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.remember; public class RememberPanelResult { //when null, then information was not available private final Boolean remember; private final Boolean codebase; public RememberPanelResult(Boolean remember, Boolean codebase) { this.remember = remember; this.codebase = codebase; } public boolean isRemember() { return remember; } public boolean isCodebase() { return codebase; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/PaxHeaders.7406/ExecuteAppletAct0000644000000000000000000000013213441742745030467 xustar0030 mtime=1552401893.037832827 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/ExecuteAppletAction.java0000644000175000002070000000704413441742745032732 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.remember; import net.sourceforge.jnlp.runtime.Translator; public enum ExecuteAppletAction { ALWAYS, NEVER, YES, NO; public String toChar() { switch (this) { case ALWAYS: return "A"; case YES: return "y"; case NEVER: return "N"; case NO: return "n"; } throw new RuntimeException("Unknown ExecuteUnsignedApplet"); } public String toExplanation() { switch (this) { case ALWAYS: return Translator.R("APPEXTSECunsignedAppletActionAlways"); case NEVER: return Translator.R("APPEXTSECunsignedAppletActionNever"); case YES: return Translator.R("APPEXTSECunsignedAppletActionYes"); // return Translator.R("APPEXTSECunsignedAppletActionSandbox"); deal with this string later case NO: return Translator.R("APPEXTSECunsignedAppletActionNo"); } throw new RuntimeException("Unknown UnsignedAppletAction"); } public static ExecuteAppletAction fromString(String s) { if (s.length() == 0) { throw new RuntimeException("Undefined zero-length ExecuteAppletAction String representatio"); } return fromChar(s.charAt(0)); } public static ExecuteAppletAction fromChar(char s) { switch (s) { case 'A': return ExecuteAppletAction.ALWAYS; case 'N': return ExecuteAppletAction.NEVER; case 'y': return ExecuteAppletAction.YES; case 'n': return ExecuteAppletAction.NO; } throw new RuntimeException("Unknown ExecuteUnsignedApplet for " + s); } @Override public String toString() { return toChar() + " - " + toExplanation(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/PaxHeaders.7406/RememberPanel.ja0000644000000000000000000000013113441742745030375 xustar0029 mtime=1552401893.04083282 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/RememberPanel.java0000644000175000002070000001250513441742745031540 0ustar00jvanekmock00000000000000/* Copyright (C) 2008-2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.remember; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.MalformedURLException; import java.net.URL; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JPanel; import javax.swing.JRadioButton; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.security.dialogs.SecurityDialogPanel; import net.sourceforge.jnlp.util.logging.OutputController; public class RememberPanel extends JPanel implements RemeberActionProvider { protected JCheckBox permanencyCheckBox; protected JRadioButton applyToAppletButton; protected JRadioButton applyToCodeBaseButton; private final URL codebase; public RememberPanel(URL codebase) { this((codebase == null) ? null : codebase.toExternalForm()); } public RememberPanel(String codebase) { super(new GridLayout(2 /*rows*/, 1 /*column*/)); this.codebase = initCodebase(codebase); this.add(createCheckBoxPanel(), BorderLayout.WEST); this.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); this.add(createMatchOptionsPanel()); this.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); if (this.codebase == null) { applyToCodeBaseButton.setVisible(false); } } private JPanel createCheckBoxPanel() { JPanel checkBoxPanel = new JPanel(new BorderLayout()); permanencyCheckBox = new JCheckBox(SecurityDialogPanel.htmlWrap(R("SRememberOption"))); permanencyCheckBox.addActionListener(permanencyListener()); checkBoxPanel.add(permanencyCheckBox, BorderLayout.SOUTH); return checkBoxPanel; } private JPanel createMatchOptionsPanel() { JPanel matchOptionsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); ButtonGroup group = new ButtonGroup(); applyToAppletButton = new JRadioButton(R("SRememberAppletOnly")); applyToAppletButton.setSelected(true); applyToAppletButton.setEnabled(false); // Start disabled until 'Remember this option' is selected applyToCodeBaseButton = new JRadioButton(SecurityDialogPanel.htmlWrap(R("SRememberCodebase", codebase))); applyToCodeBaseButton.setEnabled(false); group.add(applyToAppletButton); group.add(applyToCodeBaseButton); matchOptionsPanel.add(applyToAppletButton); matchOptionsPanel.add(applyToCodeBaseButton); return matchOptionsPanel; } // Toggles whether 'match applet' or 'match codebase' options are greyed out protected ActionListener permanencyListener() { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { applyToAppletButton.setEnabled(permanencyCheckBox.isSelected()); applyToCodeBaseButton.setEnabled(permanencyCheckBox.isSelected()); } }; } public boolean isAlwaysSelected() { return permanencyCheckBox.isSelected(); } public boolean isCodebaseSelected() { return applyToCodeBaseButton.isSelected(); } private URL initCodebase(String codebase) { if (codebase != null) { try { return new URL(codebase); } catch (MalformedURLException ex) { OutputController.getLogger().log(ex); } } return null; } @Override public RememberPanelResult getRememberAction() { return new RememberPanelResult(permanencyCheckBox.isSelected(), applyToCodeBaseButton.isSelected()); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/PaxHeaders.7406/RemeberActionPro0000644000000000000000000000013213441742745030467 xustar0030 mtime=1552401893.043832814 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/RemeberActionProvider.java0000644000175000002070000000343413441742745033255 0ustar00jvanekmock00000000000000/* Copyright (C) 2008-2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.remember; public interface RemeberActionProvider { public RememberPanelResult getRememberAction(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/PaxHeaders.7406/AppletSecurityAc0000644000000000000000000000013213441742745030510 xustar0030 mtime=1552401893.048832804 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/AppletSecurityActions.java0000644000175000002070000002230713441742745033321 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.remember; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel.MatchingALACAttributePanel; import net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel.UnsignedAppletTrustWarningPanel; import net.sourceforge.jnlp.util.logging.OutputController; //from legacy, just wrapper around map public class AppletSecurityActions implements Iterable { private final Map actions = new HashMap<>(); /* * quick setup method when new item , with one action, is added */ public static AppletSecurityActions fromAction(Class id, SavedRememberAction s) { AppletSecurityActions asas = new AppletSecurityActions(); asas.setAction(id, s); return asas; } /** * * ClassName:ACTION{savedvalue};ClassName:ACTION{savedvalue};... eg * MatchingALACAttributePanel:A{true};PartiallySignedAppTrustWarningPanel:a{S}; * * @param s * @return */ public static AppletSecurityActions fromString(String s) { if (s == null) { s = ""; } s = s.trim(); AppletSecurityActions asas = new AppletSecurityActions(); if (s.isEmpty()) { return asas; } if (s.contains(";") || s.contains(":") || s.contains("{") || s.contains("}")) { String[] ss = s.split("};"); for (String string : ss) { string = string.trim(); if (string.isEmpty()) { continue; } int nameIndex = string.indexOf(":"); int valueIndex = string.indexOf("{"); if (nameIndex < 0 || valueIndex < 0) { continue; } String name = string.substring(0, nameIndex); String action = string.substring(nameIndex + 1, valueIndex); String value = string.substring(valueIndex + 1); //rather null if empty? if it si null, and expected, then NPE should never be thrown if (value.isEmpty()) { value = null; //or empty string is better. What if saved value really is empty string? //Special sequence for null? } asas.actions.put(name, new SavedRememberAction(ExecuteAppletAction.fromChar(action.charAt(0)), value)); } return asas; } else { return readLegacySave(s); } } private static AppletSecurityActions readLegacySave(String s) { if (s == null) { s = ""; } s = s.trim(); //to not return on leading space, may be dangerous, //but the s shouldbe already trimmed before bubbling here. //does " A" means UNSET(1)+ALWAYS(2) or ALWAYS(1)+UNSET(2) //or UNSET(1)+UNSET(2)? AppletSecurityActions asas = new AppletSecurityActions(); int i = 0; for (char x : s.toCharArray()) { if (Character.isWhitespace(x)) { break; } if (x == 2) { //only two elements were known for 1.6 or older break; } //unset is no op now if (x == 'X') { i++; continue; } if (x == 's' || x == 'S') { continue; } char nwX = x; if (x == 's') { nwX = 'y'; } if (x == 'S') { nwX = 'A'; } ExecuteAppletAction q = ExecuteAppletAction.fromChar(nwX); if (i == 0) { SavedRememberAction sa = new SavedRememberAction(q, legacyToCurrent(x));//maybe better switch then toChar? asas.actions.put(classToKey(UnsignedAppletTrustWarningPanel.class), sa); } else if (i == 1) { SavedRememberAction sa = new SavedRememberAction(q, legacyToCurrent(x));//maybe better switch then toChar? asas.actions.put(classToKey(MatchingALACAttributePanel.class), sa); } else { OutputController.getLogger().log("Unknown saved legacy item on position " + i + " of char: " + x); } i++; } return asas; } private static String legacyToCurrent(char q) { switch (q) { case 'y': case 'A': return "YES"; case 'n': case 'N': return "NO"; case 's': case 'S': return "SANDBOX"; } throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } public ExecuteAppletAction getAction(Class clazz) { return getAction(classToKey(clazz)); } public ExecuteAppletAction getAction(String clazz) { SavedRememberAction o = getActionEntry(clazz); if (o == null) { return null; } return o.getAction(); } public SavedRememberAction getActionEntry(Class clazz) { return getActionEntry(classToKey(clazz)); } public SavedRememberAction getActionEntry(String clazz) { return actions.get(clazz); } public void setAction(Class clazz, SavedRememberAction a) { setAction(classToKey(clazz), a); } public void setAction(String i, SavedRememberAction a) { actions.put(i, a); } public void removeAction(Class clazz) { removeAction(classToKey(clazz)); } public void removeAction(String i) { actions.remove(i); } @Override public String toString() { return toShortString(); } public String toLongString() { StringBuilder sb = new StringBuilder(); Collection> l = getEntries(); for (Entry a : l) { sb.append(a.getKey()).append(":").append(a.getValue().toLongString()); } return sb.toString(); } public String toShortString() { StringBuilder sb = new StringBuilder(); Collection> l = getEntries(); for (Entry a : l) { sb.append(a.getKey()).append(":").append(a.getValue().toShortString()).append(";"); } return sb.toString(); } public int getRealCount() { return actions.size(); } /** * stub for testing * * @return */ public Collection getActions() { Collection col = actions.values(); List l = new ArrayList<>(col.size()); for (SavedRememberAction savedRememberAction : col) { l.add(savedRememberAction.getAction()); } return l; } public Collection> getEntries() { return actions.entrySet(); } @Override public Iterator iterator() { return actions.values().iterator(); } /* Simple wrapper. What there wil be need of changing this logic */ private static String classToKey(Class clazz) { return clazz.getSimpleName(); } public void refresh(String aValue) { AppletSecurityActions nev = fromString(aValue); actions.clear(); actions.putAll(nev.actions); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/PaxHeaders.7406/RememberDialog.j0000644000000000000000000000013213441742745030375 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/RememberDialog.java0000644000175000002070000001336013441742745031700 0ustar00jvanekmock00000000000000/* Copyright (C) 2008-2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.remember; import java.awt.Component; import java.awt.Container; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletTrustConfirmation; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogresults.DialogResult; public class RememberDialog { public void setOrUpdateRememberedState(SecurityDialog dialog) { RememberableDialog found = findRememberablePanel(dialog.getSecurityDialogPanel()); if (found == null) { return; } String value = BasicDialogValue.writeNUll(); if (found.getValue()!=null){ value = found.getValue().writeValue(); } SavedRememberAction action = new SavedRememberAction(createAction(found.getRemeberAction().isRemember(), found.getValue()), value); setOrUpdateRememberedState(dialog, found.getRemeberAction().isCodebase(), action); } /* * for headless dialogues */ public void setOrUpdateRememberedState(SecurityDialog dialog, boolean wholeCodebase, SavedRememberAction action) { RememberableDialog found = findRememberablePanel(dialog.getSecurityDialogPanel()); if (found == null) { return; } UnsignedAppletTrustConfirmation.updateAppletAction(found.getFile(), action, wholeCodebase, (Class) found.getClass()); } public SavedRememberAction getRememberedState(SecurityDialog dialog) { RememberableDialog found = findRememberablePanel(dialog.getSecurityDialogPanel()); if (found != null) { return getRememberedState(found); } return null; } public SavedRememberAction getRememberedState(RememberableDialog found) { UnsignedAppletActionEntry entry = UnsignedAppletTrustConfirmation.getStoredEntry(found.getFile(), (found.getClass())); //was saved for this class of found if (entry != null) { SavedRememberAction action = entry.getAppletSecurityActions().getActionEntry(found.getClass()); return action; } return null; } public RememberableDialog findRememberablePanel(Container search) { if (search==null){ return null; } if (search instanceof RememberableDialog){ return (RememberableDialog) search; } //Breadth-first important for (Component comp : search.getComponents()) { if (comp instanceof RememberableDialog) { return (RememberableDialog) comp; } } for (Component comp : search.getComponents()) { if (comp instanceof Container) { RememberableDialog candidate = findRememberablePanel((Container) comp); if (candidate != null) { return candidate; } } } return null; } public static ExecuteAppletAction createAction(boolean pernament, DialogResult value) { if (value == null){ return ExecuteAppletAction.NO; } if (value.toBoolean()){ if (pernament){ return ExecuteAppletAction.ALWAYS; } else { return ExecuteAppletAction.YES; } } else { if (pernament){ return ExecuteAppletAction.NEVER; } else { return ExecuteAppletAction.NO; } } } private static class RememberDialogueHolder { //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom private static final RememberDialog INSTANCE = new RememberDialog(); private static RememberDialog getRememberDialogue() { return RememberDialogueHolder.INSTANCE; } } public static RememberDialog getInstance() { return RememberDialogueHolder.getRememberDialogue(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/PaxHeaders.7406/RememberableDial0000644000000000000000000000013213441742745030443 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/remember/RememberableDialog.java0000644000175000002070000000372413441742745032527 0ustar00jvanekmock00000000000000/* Copyright (C) 2008-2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs.remember; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.security.dialogresults.DialogResult; public interface RememberableDialog { public RememberPanelResult getRemeberAction(); public DialogResult getValue(); public JNLPFile getFile(); public DialogResult readValue(String s); } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/TemporaryPermissionsButto0000644000000000000000000000013213441742745030725 xustar0030 mtime=1552401893.036832829 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java0000644000175000002070000002157213441742745032642 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.Component; import java.awt.Dialog.ModalityType; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.net.MalformedURLException; import java.net.URL; import java.security.Permission; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.security.policyeditor.PolicyEditor; import net.sourceforge.jnlp.security.policyeditor.PolicyEditor.PolicyEditorWindow; import net.sourceforge.jnlp.security.policyeditor.PolicyEditorPermissions; import net.sourceforge.jnlp.security.policyeditor.PolicyIdentifier; import net.sourceforge.jnlp.util.logging.OutputController; import sun.security.provider.PolicyParser; public class TemporaryPermissionsButton extends JButton { private final JPopupMenu menu; private final JButton linkedButton; private PolicyEditorWindow policyEditorWindow = null; private final JNLPFile file; private final SecurityDelegate securityDelegate; private final Collection temporaryPermissions = new HashSet<>(); public TemporaryPermissionsButton(final JNLPFile file, final SecurityDelegate securityDelegate, final JButton linkedButton) { /* If any of the above parameters are null, then the button cannot function - in particular, a null SecurityDelegate * would prevent temporary permissions from being able to be added; a null JNLPFile would prevent PolicyEditor from * being launched with a sensible codebase for the current applet; and a null JButton would prevent the Sandbox button * from being automatically invoked when a set of temporary permissions are selected by the user. */ super("\u2630"); this.menu = createPolicyPermissionsMenu(); this.linkedButton = linkedButton; this.file = file; this.securityDelegate = securityDelegate; if (file == null || securityDelegate == null || linkedButton == null) { this.setEnabled(false); OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Temporary Permissions Button disabled due to null fields." + " file: " + file + ", securityDelegate: " + securityDelegate + ", linkedButton: " + linkedButton); } else { linkedButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { securityDelegate.addPermissions(temporaryPermissions); } }); addMouseListener(new PolicyEditorPopupListener(this)); } } private JPopupMenu createPolicyPermissionsMenu() { final JPopupMenu policyMenu = new JPopupMenu(); final JMenuItem launchPolicyEditor = new JMenuItem(R("CertWarnPolicyEditorItem")); launchPolicyEditor.addActionListener(new PolicyEditorLaunchListener()); policyMenu.add(launchPolicyEditor); policyMenu.addSeparator(); final JCheckBoxMenuItem networkAccess = new JCheckBoxMenuItem(R("STempNetwork")); networkAccess.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.NETWORK))); policyMenu.add(networkAccess); final JCheckBoxMenuItem readLocalFilesAndProperties = new JCheckBoxMenuItem(R("STempReadFilesAndProperties")); readLocalFilesAndProperties.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.ReadFileSystem))); policyMenu.add(readLocalFilesAndProperties); final JCheckBoxMenuItem writeLocalFilesAndProperties = new JCheckBoxMenuItem(R("STempWriteFilesAndProperties")); writeLocalFilesAndProperties.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.WriteFileSystem))); policyMenu.add(writeLocalFilesAndProperties); final JCheckBoxMenuItem reflectionOnly = new JCheckBoxMenuItem(R("STempReflectionAndExternal")); reflectionOnly.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.AccessUnownedCode))); policyMenu.add(reflectionOnly); final JCheckBoxMenuItem allMedia = new JCheckBoxMenuItem(R("STempAllMedia")); allMedia.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.MediaAccess))); policyMenu.add(allMedia); return policyMenu; } private class TemporaryPermissionsListener implements ActionListener { private Collection permissions; public TemporaryPermissionsListener(final Collection permissions) { this.permissions = permissions; } @Override public void actionPerformed(final ActionEvent e) { if (!linkedButton.isEnabled()) { return; } AbstractButton checkBox = (AbstractButton) e.getSource(); if (checkBox.isSelected()) { temporaryPermissions.addAll(permissions); } else { temporaryPermissions.removeAll(permissions); } menu.setVisible(true); } } private class PolicyEditorLaunchListener implements ActionListener { @Override public void actionPerformed(final ActionEvent e) { final String rawFilepath = PathsAndFiles.JAVA_POLICY.getFullPath(); String filepath; try { filepath = new URL(rawFilepath).getPath(); } catch (final MalformedURLException mfue) { filepath = null; } if (policyEditorWindow == null || policyEditorWindow.getPolicyEditor().isClosed()) { policyEditorWindow = PolicyEditor.getPolicyEditorDialog(filepath); policyEditorWindow.getPolicyEditor().openPolicyFileSynchronously(); } else { policyEditorWindow.asWindow().toFront(); policyEditorWindow.asWindow().repaint(); } policyEditorWindow.setModalityType(ModalityType.DOCUMENT_MODAL); policyEditorWindow.getPolicyEditor().addNewEntry(new PolicyIdentifier(null, Collections.emptySet(), file.getNotNullProbalbeCodeBase().toString())); policyEditorWindow.asWindow().setVisible(true); menu.setVisible(false); } } private class PolicyEditorPopupListener extends MouseAdapter { private final Component parent; public PolicyEditorPopupListener(final Component parent) { this.parent = parent; } @Override public void mouseClicked(final MouseEvent e) { menu.show(parent, e.getX(), e.getY()); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/InetSecurity511Panel.java0000644000000000000000000000013213441742745030247 xustar0030 mtime=1552401893.035832831 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/InetSecurity511Panel.java0000644000175000002070000001565413441742745031072 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import java.awt.BorderLayout; import java.awt.Desktop; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.net.MalformedURLException; import java.net.ProxySelector; import java.net.URI; import java.net.URL; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.browser.BrowserAwareProxySelector; import net.sourceforge.jnlp.runtime.JNLPRuntime; import static net.sourceforge.jnlp.runtime.JNLPRuntime.getConfiguration; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.runtime.html.browser.LinkingBrowser; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.YesCancelSkip; import static net.sourceforge.jnlp.security.dialogs.SecurityDialogPanel.htmlWrap; import net.sourceforge.jnlp.util.logging.OutputController; public class InetSecurity511Panel extends SecurityDialogPanel { private static final String INFO_LINK = "https://tools.ietf.org/html/rfc6585#section-6"; private static boolean skip = false; private final LinkingBrowser tabes; public static boolean isSkip() { return skip; } public InetSecurity511Panel(final SecurityDialog sd, final URL url) { super(sd); if (sd != null) { //for testing purposes sd.setValue(YesCancelSkip.yes()); } tabes = new LinkingBrowser(url, false); this.add(tabes); JPanel menu = new JPanel(); JButton done = new JButton(Translator.R("ButDone")); done.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (sd != null) { sd.setValue(YesCancelSkip.yes()); parent.getViwableDialog().dispose(); } } }); JButton noExit = new JButton(Translator.R("Exit511")); noExit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (sd != null) { sd.setValue(YesCancelSkip.cancel()); parent.getViwableDialog().dispose(); } } }); menu.add(done); menu.add(noExit); final JCheckBox ignoreInSession = new JCheckBox(Translator.R("Ignore511")); ignoreInSession.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { skip = ignoreInSession.isSelected(); } }); menu.add(ignoreInSession); this.add(menu, BorderLayout.SOUTH); JLabel title = new JLabel(htmlWrap(Translator.R("Header511", INFO_LINK))); title.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 1) { tabes.getBrowser().gotoUrl(INFO_LINK); } else if (Desktop.isDesktopSupported()) { try { Desktop.getDesktop().browse(new URI(INFO_LINK)); } catch (Exception ex) { OutputController.getLogger().log(ex); if (!JNLPRuntime.isHeadless()) { JOptionPane.showMessageDialog(null, ex); } } } } }); this.add(title, BorderLayout.NORTH); if (sd != null) { //for testing pusposes sd.getViwableDialog().pack(); } } @Override public DialogResult getDefaultNegativeAnswer() { return YesCancelSkip.cancel(); } @Override public DialogResult getDefaultPositiveAnswer() { return YesCancelSkip.yes(); } @Override //skip is only for commandline to pass skip to the static field public DialogResult readFromStdIn(String what) { YesCancelSkip l = YesCancelSkip.readValue(what); if (l.compareValue(BasicDialogValue.Primitive.SKIP)) { skip = true; l = YesCancelSkip.yes(); } return l; } @Override public String helpToStdIn() { return YesCancelSkip.yes().getAllowedValues().toString(); } @Override public String getText() { StringBuilder sb = new StringBuilder(); sb.append(Translator.R("Headless511line0")).append("\n"); List usrls = tabes.getLinksPanel().getAllUrls(); for (String usrl : usrls) { sb.append(usrl).append("\n"); } sb.append(super.getText()).append("\n"); sb.append(Translator.R("Headless511line1")).append("\n"); sb.append(Translator.R("Headless511line2")).append("\n"); sb.append(Translator.R("Headless511line3", OptionsDefinitions.OPTIONS.BROWSER.option)).append("\n"); return sb.toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/MoreInfoPane.java0000644000000000000000000000013213441742745026733 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/MoreInfoPane.java0000644000175000002070000001312313441742745027543 0ustar00jvanekmock00000000000000/* MoreInfoPane.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import net.sourceforge.jnlp.security.CertVerifier; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.SetValueHandler; import net.sourceforge.jnlp.security.dialogresults.Yes; import net.sourceforge.jnlp.jdk89acesses.SunMiscLauncher; /** * Provides the panel for the More Info dialog. This dialog shows details about an * application's signing status. * * @author Joshua Sumali */ public class MoreInfoPane extends SecurityDialogPanel { private final boolean showSignedJNLPWarning; public MoreInfoPane(SecurityDialog x, CertVerifier certVerifier) { super(x, certVerifier); showSignedJNLPWarning= x.requiresSignedJNLPWarning(); addComponents(); } /** * Constructs the GUI components of this panel */ private void addComponents() { List details = certVerifier.getDetails(null); // Show signed JNLP warning if the signed main jar does not have a // signed JNLP file and the launching JNLP file contains special properties if(showSignedJNLPWarning) details.add(R("SJNLPFileIsNotSigned")); int numLabels = details.size(); JPanel errorPanel = new JPanel(new GridLayout(numLabels, 1)); errorPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); errorPanel.setPreferredSize(new Dimension(400, 70 * (numLabels))); for (int i = 0; i < numLabels; i++) { ImageIcon icon = null; if (details.get(i).equals(R("STrustedCertificate"))) { icon = SunMiscLauncher.getSecureImageIcon("net/sourceforge/jnlp/resources/info-small.png"); } else { icon = SunMiscLauncher.getSecureImageIcon("net/sourceforge/jnlp/resources/warning-small.png"); } errorPanel.add(new JLabel(htmlWrap(details.get(i)), icon, SwingConstants.LEFT)); } // Removes signed JNLP warning after it has been used. This will avoid // any alteration to certVerifier. if(showSignedJNLPWarning) details.remove(details.size()-1); JPanel buttonsPanel = new JPanel(new BorderLayout()); JButton certDetails = new JButton(R("SCertificateDetails")); certDetails.addActionListener(new CertInfoButtonListener()); JButton close = new JButton(R("ButClose")); close.addActionListener(SetValueHandler.createSetValueListener(parent, new Yes())); buttonsPanel.add(certDetails, BorderLayout.WEST); buttonsPanel.add(close, BorderLayout.EAST); buttonsPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); add(errorPanel, BorderLayout.NORTH); add(buttonsPanel, BorderLayout.SOUTH); } private class CertInfoButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { SecurityDialog.showCertInfoDialog(parent.getCertVerifier(), parent.getSecurityDialogPanel()); } } @Override public DialogResult getDefaultNegativeAnswer() { return null; } @Override public DialogResult getDefaultPositiveAnswer() { return new Yes(); } @Override public DialogResult readFromStdIn(String what) { return Yes.readValue(what); } @Override public String helpToStdIn() { return new Yes().getAllowedValues().toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/ViwableDialog.java0000644000000000000000000000013213441742745027122 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/ViwableDialog.java0000644000175000002070000001552313441742745027740 0ustar00jvanekmock00000000000000/* Copyright (C) 2016 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import java.awt.Component; import java.awt.Dialog; import java.awt.Dimension; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.JDialog; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.ScreenFinder; /** * This class encapsulate viwable part of SecurityDialog, so it do not need to * extend it. * * It is accepting commons setters for jdialog, but actually applying them right before it is created. * Obviously it do not have getters, but jdialog itself should not be keeper of any information. SecurityPanel is. */ public class ViwableDialog { private JDialog jd = null; List operations = new ArrayList(); public ViwableDialog() { } private JDialog createJDialog() { jd = new JDialog(); jd.setName("ViwableDialog"); SwingUtils.info(jd); jd.setIconImages(ImageResources.INSTANCE.getApplicationImages()); for (Runnable operation : operations) { operation.run(); } // prune operations. May throw NPE if operations used after createJDialog() operations = null; return jd; } public void setMinimumSize(final Dimension minimumSize) { operations.add(new Runnable() { @Override public void run() { jd.setMinimumSize(minimumSize); } }); } public void pack() { operations.add(new Runnable() { @Override public void run() { jd.pack(); } }); } public void setLocationRelativeTo(final Component c) { operations.add(new Runnable() { @Override public void run() { jd.setLocationRelativeTo(c); } }); } public void show() { SwingUtils.invokeAndWait(new Runnable() { @Override public void run() { if (jd == null) { jd = createJDialog(); } jd.setVisible(true); } }); } /** * Called when the SecurityDialog is hidden - either because the user made a * choice (Ok, Cancel, etc) or closed the window */ public void dispose() { // avoid reentrance: if (jd != null) { notifySelectionMade(); jd.dispose(); // recycle: jd = null; } } private final List listeners = new CopyOnWriteArrayList<>(); /** * Notify all the listeners that the user has made a decision using this * security dialog. */ private void notifySelectionMade() { for (ActionListener listener : listeners) { listener.actionPerformed(null); } } /** * Adds an {@link ActionListener} which will be notified if the user makes a * choice using this SecurityDialog. The listener should use * getValue() to actually get the user's response. * * @param listener another action listener to be listen to */ public void addActionListener(ActionListener listener) { listeners.add(listener); } public void add(final SecurityDialogPanel panel, final String constraints) { operations.add(new Runnable() { @Override public void run() { jd.add(panel, constraints); } }); } public void setModalityType(final Dialog.ModalityType modalityType) { operations.add(new Runnable() { @Override public void run() { jd.setModalityType(modalityType); } }); } public void setTitle(final String title) { operations.add(new Runnable() { @Override public void run() { jd.setTitle(title); } }); } public void setDefaultCloseOperation(final int op) { operations.add(new Runnable() { @Override public void run() { jd.setDefaultCloseOperation(op); } }); } private static void centerDialog(JDialog dialog) { ScreenFinder.centerWindowsToCurrentScreen(dialog); } public void centerDialog() { operations.add(new Runnable() { @Override public void run() { centerDialog(jd); } }); } public void setResizable(final boolean b) { // not defered: called when alive if (jd != null) { jd.setResizable(b); } } public void addWindowListener(final WindowAdapter adapter) { operations.add(new Runnable() { @Override public void run() { jd.addWindowListener(adapter); } }); } public void addWindowFocusListener(final WindowAdapter adapter) { operations.add(new Runnable() { @Override public void run() { jd.addWindowFocusListener(adapter); } }); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/MissingALACAttributePanel0000644000000000000000000000013213441742745030367 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.230253496 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/MissingALACAttributePanel.java0000644000175000002070000001734313441742745032127 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Desktop; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Image; import java.io.IOException; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.util.HashSet; import java.util.Set; import javax.imageio.ImageIO; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.SetValueHandler; import net.sourceforge.jnlp.security.dialogresults.YesNo; import net.sourceforge.jnlp.security.dialogs.remember.RememberPanel; import net.sourceforge.jnlp.security.dialogs.remember.RememberPanelResult; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html#app_library */ public class MissingALACAttributePanel extends SecurityDialogPanel implements RememberableDialog{ private RememberPanel rememberPanel; public MissingALACAttributePanel(SecurityDialog x, String title, String codebase, String remoteUrls) { super(x); try { addComponents(title, codebase, remoteUrls); } catch (Exception ex) { throw new RuntimeException(ex); } if (x != null) { x.getViwableDialog().setMinimumSize(new Dimension(600, 400)); } } protected final void addComponents(String title, String codebase, String remoteUrls) throws IOException { URL imgUrl = this.getClass().getResource("/net/sourceforge/jnlp/resources/warning.png"); ImageIcon icon; Image img = ImageIO.read(imgUrl); icon = new ImageIcon(img); String topLabelText = Translator.R("ALACAMissingMainTitle", title, codebase, remoteUrls); String bottomLabelText = Translator.R("ALACAMissingInfo"); JLabel topLabel = new JLabel(htmlWrap(topLabelText), icon, SwingConstants.CENTER); topLabel.setFont(new Font(topLabel.getFont().toString(), Font.BOLD, 12)); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.setBackground(Color.WHITE); topPanel.add(topLabel, BorderLayout.CENTER); topPanel.setPreferredSize(new Dimension(400, 80)); topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); JEditorPane bottomLabel = new JEditorPane("text/html", htmlWrap(bottomLabelText)); bottomLabel.setEditable(false); bottomLabel.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { try { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { Desktop.getDesktop().browse(e.getURL().toURI()); } } catch (IOException | URISyntaxException ex) { OutputController.getLogger().log(ex); } } }); JPanel infoPanel = new JPanel(new BorderLayout()); infoPanel.add(bottomLabel, BorderLayout.CENTER); infoPanel.setPreferredSize(new Dimension(400, 80)); infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); bottomLabel.setBackground(infoPanel.getBackground()); //run and cancel buttons JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton yes = new JButton(Translator.R("ButYes")); JButton no = new JButton(Translator.R("ButNo")); rememberPanel = new RememberPanel(codebase); yes.addActionListener(SetValueHandler.createSetValueListener(parent, YesNo.yes())); no.addActionListener(SetValueHandler.createSetValueListener(parent, YesNo.no())); initialFocusComponent = no; buttonPanel.add(yes); buttonPanel.add(no); buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //all of the above setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(topPanel); add(infoPanel); add(buttonPanel); add(rememberPanel); } public static void main(String[] args) throws MalformedURLException { Set s = new HashSet<>(); s.add(new URL("http:/blah.com/blah")); s.add(new URL("http:/blah.com/blah/blah")); MissingALACAttributePanel w = new MissingALACAttributePanel(null, "HelloWorld", "http://nbblah.url", UrlUtils.setOfUrlsToHtmlList(s)); JFrame f = new JFrame(); f.setSize(600, 400); f.add(w, BorderLayout.CENTER); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } @Override public RememberPanelResult getRemeberAction() { return rememberPanel.getRememberAction(); } @Override public DialogResult getValue() { return parent.getValue(); } @Override public JNLPFile getFile() { return parent.getFile(); } @Override public DialogResult readValue(String s) { return YesNo.readValue(s); } @Override public DialogResult getDefaultNegativeAnswer() { return YesNo.no(); } @Override public DialogResult getDefaultPositiveAnswer() { return YesNo.yes(); } @Override public DialogResult readFromStdIn(String what) { return YesNo.readValue(what); } @Override public String helpToStdIn() { return YesNo.no().getAllowedValues().toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/TemporaryPermissions.java0000644000000000000000000000013213441742745030627 xustar0030 mtime=1552401893.047832806 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java0000644000175000002070000001214213441742745031437 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.security.Permission; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sourceforge.jnlp.security.policyeditor.PermissionActions; import net.sourceforge.jnlp.security.policyeditor.PolicyEditorPermissions; import net.sourceforge.jnlp.util.logging.OutputController; public class TemporaryPermissions { // Look for expandable properties in targets, eg ${user.home} or ${java.io.tmpdir} private static final Pattern expandablePattern = Pattern.compile("\\$\\{([a-zA-Z0-9\\.}]+)*\\}"); public static Collection getPermissions(final PolicyEditorPermissions... editorPermissions) { return getPermissions(Arrays.asList(editorPermissions)); } public static Collection getPermissions(final Collection editorPermissions) { final Collection col = new HashSet(); for (final PolicyEditorPermissions editorPerm : editorPermissions) { col.add(getPermission(editorPerm)); } return Collections.unmodifiableCollection(col); } public static Collection getPermissions(final PolicyEditorPermissions.Group permissionsGroup) { return getPermissions(permissionsGroup.getPermissions()); } public static Permission getPermission(final PolicyEditorPermissions editorPermission) { try { final Class clazz = Class.forName(editorPermission.getType().type); final Constructor ctor; final Permission perm; String target = editorPermission.getTarget().target; Matcher m = expandablePattern.matcher(target); while (m.find()) { // Expand any matches by reading from System properties, eg ${java.io.tmpdir} is /tmp on most systems String s = m.group(1); String p = System.getProperty(s); p = p.replace("\\", "\\\\"); target = m.replaceFirst(p); m = expandablePattern.matcher(target); } if (editorPermission.getActions().equals(PermissionActions.NONE)) { ctor = clazz.getDeclaredConstructor(new Class[] { String.class }); ctor.setAccessible(true); perm = (Permission) ctor.newInstance(target); } else { ctor = clazz.getDeclaredConstructor(new Class[] { String.class, String.class }); ctor.setAccessible(true); perm = (Permission) ctor.newInstance(target, collectionToString(editorPermission.getActions().getActions())); } return perm; } catch (final ClassNotFoundException | SecurityException | NoSuchMethodException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException e) { OutputController.getLogger().log(e); return null; } } private static String collectionToString(final Collection col) { final StringBuilder sb = new StringBuilder(); int count = 0; for (final String str : col) { sb.append(str); if (count < col.size() - 1) { sb.append(","); } ++count; } return sb.toString(); } }icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/CertsInfoPane.java0000644000000000000000000000013213441742745027111 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/CertsInfoPane.java0000644000175000002070000003674313441742745027736 0ustar00jvanekmock00000000000000/* CertsInfoPane.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import static net.sourceforge.jnlp.runtime.Translator.R; import java.util.ArrayList; import java.security.cert.CertPath; import java.security.cert.X509Certificate; import java.security.MessageDigest; /** * Do not remove this two unused imports, nor expands its "*" call. * It is workaround to allow itw to run on jdk8 and older and also on jdk9 and newer */ import sun.security.x509.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.lang.reflect.Method; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeSelectionModel; import net.sourceforge.jnlp.security.CertVerifier; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.SecurityUtil; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.SetValueHandler; import net.sourceforge.jnlp.security.dialogresults.Yes; import net.sourceforge.jnlp.util.logging.OutputController; /** * Provides the panel for the Certificate Info dialog. This dialog displays data from * X509Certificate(s) used in jar signing. * * @author Joshua Sumali */ public class CertsInfoPane extends SecurityDialogPanel { private CertPath certPath; protected JTree tree; private JTable table; private JTextArea output; private ListSelectionModel listSelectionModel; private ListSelectionModel tableSelectionModel; protected String[] certNames; private String[] columnNames = { R("Field"), R("Value") }; protected ArrayList certsData; public CertsInfoPane(SecurityDialog x, CertVerifier certVerifier) { super(x, certVerifier); addComponents(); } /** * Builds the JTree out of CertPaths. */ void buildTree() { certPath = parent.getCertVerifier().getCertPath(null); X509Certificate firstCert = ((X509Certificate) certPath.getCertificates().get(0)); String subjectString = SecurityUtil.getCN(firstCert.getSubjectX500Principal().getName()); String issuerString = SecurityUtil.getCN(firstCert.getIssuerX500Principal().getName()); DefaultMutableTreeNode top = new DefaultMutableTreeNode(subjectString + " (" + issuerString + ")"); //not self signed if (!firstCert.getSubjectDN().equals(firstCert.getIssuerDN()) && (certPath.getCertificates().size() > 1)) { X509Certificate secondCert = ((X509Certificate) certPath.getCertificates().get(1)); subjectString = SecurityUtil.getCN(secondCert.getSubjectX500Principal().getName()); issuerString = SecurityUtil.getCN(secondCert.getIssuerX500Principal().getName()); top.add(new DefaultMutableTreeNode(subjectString + " (" + issuerString + ")")); } tree = new JTree(top); tree.getSelectionModel().setSelectionMode (TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addTreeSelectionListener(new TreeSelectionHandler()); } /** * Fills in certsNames, certsData with data from the certificates. */ protected void populateTable() { certNames = new String[certPath.getCertificates().size()]; certsData = new ArrayList(); for (int i = 0; i < certPath.getCertificates().size(); i++) { X509Certificate c = (X509Certificate) certPath.getCertificates().get(i); certsData.add(parseCert(c)); certNames[i] = SecurityUtil.getCN(c.getSubjectX500Principal().getName()) + " (" + SecurityUtil.getCN(c.getIssuerX500Principal().getName()) + ")"; } } protected String[][] parseCert(X509Certificate c) { String version = "" + c.getVersion(); String serialNumber = c.getSerialNumber().toString(); String signatureAlg = c.getSigAlgName(); String issuer = c.getIssuerX500Principal().toString(); String validity = new CertificateValidity(c.getNotBefore(), c.getNotAfter()).toString(); String subject = c.getSubjectX500Principal().toString(); String signature = jdkIndependentHexEncoder(c.getSignature()); String md5Hash = ""; String sha1Hash = ""; try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(c.getEncoded()); md5Hash = makeFingerprint(digest.digest()); digest = MessageDigest.getInstance("SHA-1"); digest.update(c.getEncoded()); sha1Hash = makeFingerprint(digest.digest()); } catch (Exception e) { //fail quietly } String[][] cert = { { R("Version"), version }, { R("SSerial"), serialNumber }, { R("SSignatureAlgorithm"), signatureAlg }, { R("SIssuer"), issuer }, { R("SValidity"), validity }, { R("SSubject"), subject }, { R("SSignature"), signature }, { R("SMD5Fingerprint"), md5Hash }, { R("SSHA1Fingerprint"), sha1Hash } }; return cert; } private String jdkIndependentHexEncoder(byte[] signature) { try { return jdkIndependentHexEncoderImpl(signature); } catch (Exception ex) { String s = "Failed to encode signature: " + ex.toString(); OutputController.getLogger().log(OutputController.Level.WARNING_ALL, s); OutputController.getLogger().log(ex); return s; } } private String jdkIndependentHexEncoderImpl(byte[] signature) throws Exception { try { OutputController.getLogger().log("trying jdk9's HexDumpEncoder"); Class clazz = Class.forName("sun.security.util.HexDumpEncoder"); Object encoder = clazz.newInstance(); Method m = clazz.getDeclaredMethod("encodeBuffer", byte[].class); //convert our signature into a nice human-readable form. return (String) m.invoke(encoder, signature); } catch (Exception ex) { OutputController.getLogger().log("trying jdk8's HexDumpEncoder"); Class clazz = Class.forName("sun.misc.HexDumpEncoder"); Object encoder = clazz.newInstance(); Method m = clazz.getMethod("encode", byte[].class); //convert our signature into a nice human-readable form. return (String) m.invoke(encoder, signature); } } /** * Constructs the GUI components of this panel */ private void addComponents() { buildTree(); populateTable(); /** //List of Certs list = new JList(certNames); list.setSelectedIndex(0); //assuming there's at least 1 cert listSelectionModel = list.getSelectionModel(); listSelectionModel.addListSelectionListener(new ListSelectionHandler()); JScrollPane listPane = new JScrollPane(list); */ JScrollPane listPane = new JScrollPane(tree); //Table of field-value pairs DefaultTableModel tableModel = new DefaultTableModel(certsData.get(0), columnNames); table = new JTable(tableModel); table.getTableHeader().setReorderingAllowed(false); tableSelectionModel = table.getSelectionModel(); tableSelectionModel.addListSelectionListener(new TableSelectionHandler()); table.setFillsViewportHeight(true); JScrollPane tablePane = new JScrollPane(table); tablePane.setPreferredSize(new Dimension(500, 200)); //Text area to display the larger values output = new JTextArea(); output.setEditable(false); JScrollPane outputPane = new JScrollPane(output, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); outputPane.setPreferredSize(new Dimension(500, 200)); //split pane of the field-value pairs and textbox JSplitPane rightSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, tablePane, outputPane); rightSplitPane.setDividerLocation(0.50); rightSplitPane.setResizeWeight(0.50); JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, listPane, rightSplitPane); mainPane.setDividerLocation(0.30); mainPane.setResizeWeight(0.30); JPanel buttonPane = new JPanel(new BorderLayout()); JButton close = new JButton(R("ButClose")); JButton copyToClipboard = new JButton(R("ButCopy")); close.addActionListener(SetValueHandler.createSetValueListener(parent, new Yes())); copyToClipboard.addActionListener(new CopyToClipboardHandler()); buttonPane.add(close, BorderLayout.EAST); buttonPane.add(copyToClipboard, BorderLayout.WEST); buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); add(mainPane, BorderLayout.CENTER); add(buttonPane, BorderLayout.SOUTH); } /** * Copies the currently selected certificate to the system Clipboard. */ private class CopyToClipboardHandler implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); int certIndex = 0; DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (node == null) { return; } if (node.isRoot()) { certIndex = 0; } else if (node.isLeaf()) { certIndex = 1; } String[][] cert = certsData.get(certIndex); int rows = cert.length; int cols = cert[0].length; String certString = ""; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { certString += cert[i][j]; certString += " "; } certString += "\n"; } clipboard.setContents(new StringSelection(certString), null); } } /** * Updates the JTable when the JTree selection has changed. */ protected class TreeSelectionHandler implements TreeSelectionListener { @Override public void valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (node == null) { return; } if (node.isRoot()) { table.setModel(new DefaultTableModel(certsData.get(0), columnNames)); } else if (node.isLeaf()) { table.setModel(new DefaultTableModel(certsData.get(1), columnNames)); } } } /** * Updates the JTable when the selection on the list has changed. */ private class ListSelectionHandler implements ListSelectionListener { @Override public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = (ListSelectionModel) e.getSource(); int minIndex = lsm.getMinSelectionIndex(); int maxIndex = lsm.getMaxSelectionIndex(); for (int i = minIndex; i <= maxIndex; i++) { if (lsm.isSelectedIndex(i)) { table.setModel(new DefaultTableModel(certsData.get(i), columnNames)); } } } } /** * Updates the JTextArea output when the selection on the JTable * has changed. */ private class TableSelectionHandler implements ListSelectionListener { @Override public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = (ListSelectionModel) e.getSource(); int minIndex = lsm.getMinSelectionIndex(); int maxIndex = lsm.getMaxSelectionIndex(); for (int i = minIndex; i <= maxIndex; i++) { if (lsm.isSelectedIndex(i)) { output.setText((String) table.getValueAt(i, 1)); } } } } /** * Makes a human readable hash fingerprint. * For example: 11:22:33:44:AA:BB:CC:DD:EE:FF. */ private String makeFingerprint(byte[] hash) { String fingerprint = ""; for (int i = 0; i < hash.length; i++) { if (!fingerprint.equals("")) { fingerprint += ":"; } fingerprint += Integer.toHexString( ((hash[i] & 0xFF) | 0x100)).substring(1, 3); } return fingerprint.toUpperCase(); } @Override public DialogResult getDefaultNegativeAnswer() { return null; } @Override public DialogResult getDefaultPositiveAnswer() { return new Yes(); } @Override public DialogResult readFromStdIn(String what) { return Yes.readValue(what); } @Override public String helpToStdIn() { return new Yes().getAllowedValues().toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/MissingPermissionsAttribu0000644000000000000000000000013213441742745030671 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/MissingPermissionsAttributePanel.java0000644000175000002070000001671113441742745033740 0ustar00jvanekmock00000000000000/* AppletWarningPane.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Desktop; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Image; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.SetValueHandler; import net.sourceforge.jnlp.security.dialogresults.YesNo; import net.sourceforge.jnlp.security.dialogs.remember.RememberPanel; import net.sourceforge.jnlp.security.dialogs.remember.RememberPanelResult; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import net.sourceforge.jnlp.util.logging.OutputController; public class MissingPermissionsAttributePanel extends SecurityDialogPanel implements RememberableDialog{ private RememberPanel rememberPanel; public MissingPermissionsAttributePanel(SecurityDialog x, String title, String codebase) { super(x); try { addComponents(title, codebase); } catch (Exception ex) { throw new RuntimeException(ex); } if (x != null) { x.getViwableDialog().setMinimumSize(new Dimension(400, 400)); } } protected final void addComponents(String title, String codebase) throws IOException { URL imgUrl = this.getClass().getResource("/net/sourceforge/jnlp/resources/warning.png"); ImageIcon icon = null; Image img = ImageIO.read(imgUrl); icon = new ImageIcon(img); String topLabelText = Translator.R("MissingPermissionsMainTitle", title, codebase); String bottomLabelText = Translator.R("MissingPermissionsInfo"); JLabel topLabel = new JLabel(htmlWrap(topLabelText), icon, SwingConstants.CENTER); topLabel.setFont(new Font(topLabel.getFont().toString(), Font.BOLD, 12)); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.setBackground(Color.WHITE); topPanel.add(topLabel, BorderLayout.CENTER); topPanel.setPreferredSize(new Dimension(400, 80)); topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); JEditorPane bottomLabel = new JEditorPane("text/html", htmlWrap(bottomLabelText)); bottomLabel.setEditable(false); bottomLabel.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { try { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { Desktop.getDesktop().browse(e.getURL().toURI()); } } catch (IOException ex) { OutputController.getLogger().log(ex); } catch (URISyntaxException ex) { OutputController.getLogger().log(ex); } } }); JPanel infoPanel = new JPanel(new BorderLayout()); infoPanel.add(bottomLabel, BorderLayout.CENTER); infoPanel.setPreferredSize(new Dimension(400, 80)); infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); bottomLabel.setBackground(infoPanel.getBackground()); //run and cancel buttons JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton yes = new JButton(Translator.R("ButYes")); JButton no = new JButton(Translator.R("ButNo")); rememberPanel = new RememberPanel(codebase); yes.addActionListener(SetValueHandler.createSetValueListener(parent, YesNo.yes())); no.addActionListener(SetValueHandler.createSetValueListener(parent, YesNo.no())); initialFocusComponent = no; buttonPanel.add(yes); buttonPanel.add(no); buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //all of the above setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(topPanel); add(infoPanel); add(buttonPanel); add(rememberPanel); validate(); } public static void main(String[] args) { MissingPermissionsAttributePanel w = new MissingPermissionsAttributePanel(null, "HelloWorld", "http://nbblah.url"); JFrame f = new JFrame(); f.setSize(400, 400); f.add(w, BorderLayout.CENTER); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } @Override public RememberPanelResult getRemeberAction() { return rememberPanel.getRememberAction(); } @Override public DialogResult getValue() { return parent.getValue(); } @Override public JNLPFile getFile() { return parent.getFile(); } @Override public DialogResult readValue(String s) { return YesNo.readValue(s); } @Override public DialogResult getDefaultNegativeAnswer() { return YesNo.no(); } @Override public DialogResult getDefaultPositiveAnswer() { return YesNo.yes(); } @Override public DialogResult readFromStdIn(String what) { return YesNo.readValue(what); } @Override public String helpToStdIn() { return YesNo.no().getAllowedValues().toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/SecurityDialogPanel.java0000644000000000000000000000013213441742745030320 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/SecurityDialogPanel.java0000644000175000002070000001562713441742745031143 0ustar00jvanekmock00000000000000/* SecurityDialogPanel.java Copyright (C) 2008-2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.lang.reflect.Method; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JRadioButton; import net.sourceforge.jnlp.security.CertVerifier; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.PlainTextFormatter; import net.sourceforge.jnlp.util.logging.OutputController; /** * Provides a JPanel for use in JNLP warning dialogs. */ public abstract class SecurityDialogPanel extends JPanel { protected SecurityDialog parent; protected JComponent initialFocusComponent = null; CertVerifier certVerifier = null; public SecurityDialogPanel(SecurityDialog dialog, CertVerifier certVerifier) { this.parent = dialog; this.certVerifier = certVerifier; this.setLayout(new BorderLayout()); } public SecurityDialogPanel(SecurityDialog dialog) { this.parent = dialog; this.setLayout(new BorderLayout()); } /** * Needed to get word wrap working in JLabels. * @param s string to be wrapped to html tag * @return */ public static String htmlWrap(String s) { return "" + s + ""; } @Override public void setVisible(boolean aFlag) { super.setVisible(aFlag); requestFocusOnDefaultButton(); } public void requestFocusOnDefaultButton() { if (initialFocusComponent != null) { initialFocusComponent.requestFocusInWindow(); } } public abstract DialogResult getDefaultNegativeAnswer() ; public abstract DialogResult getDefaultPositiveAnswer(); /** this is default SecurityDialog "toString". * All extending panels are recommended to override this. * However, this method is reading possible shown gui, and printing it to output * so free of code, this to string have pretty nice results * @return text gathered from components placed on this panel and cleaned from some html tags */ public String getText() { String s = traverse(this); if (s != null) { s = s.replace("", "").replace("", "") .replace("", "").replace("", "") .replace("", "").replace("", "") .replace("
    ", PlainTextFormatter.getLineSeparator()) .replace("
    ", PlainTextFormatter.getLineSeparator()) .replace("
    ", PlainTextFormatter.getLineSeparator()) .replace("
    ", PlainTextFormatter.getLineSeparator()); //see htmlWrap and its usages.. but eg a href is ok to keep s = s.replaceAll("(?m)^\\s+$", ""); while (s.contains(PlainTextFormatter.getLineSeparator() + PlainTextFormatter.getLineSeparator())) { s = s.replace(PlainTextFormatter.getLineSeparator() + PlainTextFormatter.getLineSeparator(), PlainTextFormatter.getLineSeparator()); } } return s; } private String traverse(Container co) { return traverse(co, true, JButton.class, JRadioButton.class, JCheckBox.class); } private String traverse(Container co, boolean skipClassName, Class... skipClasses) { StringBuilder sb = new StringBuilder(); Component[] c = co.getComponents(); compIter: for (Component c1 : c) { //searching to depth is important if (c1 instanceof Container){ String s = traverse((Container) c1); sb.append(s); } //eg jlabel is also container for (Class clazz : skipClasses) { if (c1.getClass() == clazz){ continue compIter; } } String s; Method getText = getGetText(c1.getClass()); if (getText != null) { s = getText(c1, getText); } else { s = c1.toString(); } if (s != null) { s = s.trim(); if (s.isEmpty()){ continue; } if (!skipClassName){ sb.append(s).append(PlainTextFormatter.getLineSeparator()); } else if (!s.contains(c1.getClass().getSimpleName())) { sb.append(s).append(PlainTextFormatter.getLineSeparator()); } } } return sb.toString(); } private Method getGetText(Class aClass) { try { String methodName = "getText"; return aClass.getMethod(methodName); } catch (Exception ex) { OutputController.getLogger().log(ex); return null; } } private String getText(Component c1, Method getText) { try { return (String) getText.invoke(c1); } catch (Exception ex) { OutputController.getLogger().log(ex); return null; } } public abstract DialogResult readFromStdIn(String what); public abstract String helpToStdIn() ; } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/PaxHeaders.7406/AppletWarningPane.java0000644000000000000000000000013213441742745027770 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogs/AppletWarningPane.java0000644000175000002070000001313013441742745030576 0ustar00jvanekmock00000000000000/* AppletWarningPane.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogs; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.CertVerifier; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.SetValueHandler; import net.sourceforge.jnlp.security.dialogresults.YesNoCancel; public class AppletWarningPane extends SecurityDialogPanel { public AppletWarningPane(SecurityDialog x, CertVerifier certVerifier) { super(x, certVerifier); addComponents(); } protected void addComponents() { //Top label String topLabelText = "While support for verifying signed code" + " has not been implemented yet, some applets will not run " + "properly under the default restricted security level."; String bottomLabelText = "Do you want to run this applet under the " + "restricted security level? (clicking No will run this applet " + "without any security checking, and should only be done if you " + "trust the applet!)"; JLabel topLabel = new JLabel(htmlWrap(topLabelText)); topLabel.setFont(new Font(topLabel.getFont().toString(), Font.BOLD, 12)); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.setBackground(Color.WHITE); topPanel.add(topLabel, BorderLayout.CENTER); topPanel.setPreferredSize(new Dimension(400, 80)); topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); JLabel bottomLabel = new JLabel(htmlWrap(bottomLabelText)); JPanel infoPanel = new JPanel(new BorderLayout()); infoPanel.add(bottomLabel, BorderLayout.CENTER); infoPanel.setPreferredSize(new Dimension(400, 80)); infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //run and cancel buttons JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton yes = new JButton(Translator.R("ButYes")); JButton no = new JButton(Translator.R("ButNo")); JButton cancel = new JButton(Translator.R("ButCancel")); yes.addActionListener(SetValueHandler.createSetValueListener(parent, YesNoCancel.yes())); no.addActionListener(SetValueHandler.createSetValueListener(parent, YesNoCancel.no())); cancel.addActionListener(SetValueHandler.createSetValueListener(parent, YesNoCancel.cancel())); initialFocusComponent = cancel; buttonPanel.add(yes); buttonPanel.add(no); buttonPanel.add(cancel); buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); //all of the above setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(topPanel); add(infoPanel); add(buttonPanel); } @Override public DialogResult getDefaultNegativeAnswer() { return YesNoCancel.no(); } @Override public DialogResult getDefaultPositiveAnswer() { return YesNoCancel.yes(); } @Override public DialogResult readFromStdIn(String what) { return YesNoCancel.readValue(what); } @Override public String helpToStdIn() { return YesNoCancel.cancel().getAllowedValues().toString(); } public static void main(String[] args) { AppletWarningPane w = new AppletWarningPane(null, null); JFrame f = new JFrame(); f.setSize(600, 400); f.add(w, BorderLayout.CENTER); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/dialogresults0000644000000000000000000000013113441742745024727 xustar0030 mtime=1552401893.062832775 29 atime=1552410887.11418344 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/0000755000175000002070000000000013441742745025615 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesCancel.java0000644000000000000000000000013213441742745027516 xustar0030 mtime=1552401893.062832775 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/YesCancel.java0000644000175000002070000000472413441742745030335 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.util.EnumSet; public class YesCancel extends Yes { public static YesCancel yes() { return new YesCancel(BasicDialogValue.Primitive.YES); } public static YesCancel cancel() { return new YesCancel(BasicDialogValue.Primitive.CANCEL); } public static YesCancel readValue(String s) { return new YesCancel(BasicDialogValue.Primitive.valueOf(s)); } protected YesCancel(BasicDialogValue.Primitive valueOf) { super(valueOf); } @Override public int getButtonIndex() { //use rather NO, however nonsense it seems? return BasicDialogValue.Primitive.CANCEL.getLegacyButton(); } @Override public EnumSet getAllowedValues() { return BasicDialogValue.YesCancel; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/SetValueHandler.jav0000644000000000000000000000013213441742745030535 xustar0030 mtime=1552401893.036832829 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/SetValueHandler.java0000644000175000002070000000563113441742745031513 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import net.sourceforge.jnlp.security.SecurityDialog; /** * Creates a handler that sets a dialog's value and then disposes it when * activated * */ public class SetValueHandler implements ActionListener { /** * Create an ActionListener suitable for use with buttons. When this * {@link ActionListener} is invoked, it will set the value of the * {@link SecurityDialog} and then dispossed. * * @param dialog dialog ressonsible for actual operation * @param returnValue may contain also information about default, preselected button * @return the ActionListener instance. */ public static ActionListener createSetValueListener(SecurityDialog dialog, DialogResult returnValue) { return new SetValueHandler(dialog, returnValue); } private final DialogResult returnValue; private final SecurityDialog dialog; private SetValueHandler(SecurityDialog dialog, DialogResult returnValue) { this.dialog = dialog; this.returnValue = returnValue; } @Override public void actionPerformed(ActionEvent e) { dialog.setValue(returnValue); dialog.getViwableDialog().dispose(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesNo.java0000644000000000000000000000013213441742745026705 xustar0030 mtime=1552401893.035832831 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/YesNo.java0000644000175000002070000000435613441742745027525 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.util.EnumSet; public class YesNo extends Yes { public static YesNo yes() { return new YesNo(BasicDialogValue.Primitive.YES); } public static YesNo no() { return new YesNo(BasicDialogValue.Primitive.NO); } public static YesNo readValue(String s) { return new YesNo(BasicDialogValue.Primitive.valueOf(s)); } YesNo(BasicDialogValue.Primitive valueOf) { super(valueOf); } @Override public EnumSet getAllowedValues() { return BasicDialogValue.YesNo; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/AccessWarningPaneCo0000644000000000000000000000013213441742745030545 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/AccessWarningPaneComplexReturn.java0000644000175000002070000001622713441742745034553 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.util.EnumSet; import java.util.Objects; public class AccessWarningPaneComplexReturn implements DialogResult { public static AccessWarningPaneComplexReturn readValue(String s) { String[] sq = s.split(","); BasicDialogValue.Primitive regularReturn = BasicDialogValue.Primitive.valueOf(sq[0]); //the replace is fixing case of not existing shortcuts at all sq = s.replace("()", "( )").split("[()]"); ShortcutResult d = null; if (sq.length > 1) { d = ShortcutResult.readValue(sq[1]); } ShortcutResult m = null; if (sq.length > 3) { m = ShortcutResult.readValue(sq[3]); } AccessWarningPaneComplexReturn a = new AccessWarningPaneComplexReturn(regularReturn); a.dekstop = d; a.menu = m; return a; } @Override public String writeValue() { StringBuilder sb = new StringBuilder(); sb.append(regularReturn.writeValue()).append(",D("); if (dekstop != null) { sb.append(dekstop.writeValue()); } sb.append(")M("); if (menu != null) { sb.append(menu.writeValue()); } sb.append(")"); return sb.toString(); } public static class ShortcutResult { public static ShortcutResult readValue(String s) { if (s.trim().isEmpty()) { return null; } String[] sq = s.split(","); ShortcutResult sr = new ShortcutResult(Boolean.valueOf(sq[3])); sr.browser = sq[0]; sr.fixHref = Boolean.parseBoolean(sq[1]); if (!sq[2].equalsIgnoreCase("null")) { sr.shortcutType = Shortcut.valueOf(sq[2]); } return sr; } public String writeValue() { StringBuilder sb = new StringBuilder(); sb.append(browser).append(",") .append(fixHref).append(",") .append(shortcutType).append(",") .append(create).append(","); return sb.toString(); } public static enum Shortcut { BROWSER, GENERATED_JNLP, JNLP_HREF, JAVAWS_HTML; public static String allValues() { EnumSet all = EnumSet.of(BROWSER, GENERATED_JNLP, JNLP_HREF, JAVAWS_HTML); return all.toString(); } } @Override public boolean equals(Object obj) { if (!(obj instanceof ShortcutResult)) { return false; } ShortcutResult sr = (ShortcutResult) obj; return this.create == sr.create && this.fixHref == sr.fixHref && this.browser.equals(sr.browser) && this.shortcutType == sr.shortcutType; } @Override public int hashCode() { int hash = 3; hash = 89 * hash + Objects.hashCode(this.browser); hash = 89 * hash + (this.fixHref ? 1 : 0); hash = 89 * hash + Objects.hashCode(this.shortcutType); hash = 89 * hash + (this.create ? 1 : 0); return hash; } private String browser = "not_found_browser"; private boolean fixHref = false; private Shortcut shortcutType = null; private final boolean create; ShortcutResult(String browser, boolean fixHref, Shortcut shortcutType, boolean create) { this.browser = browser; this.fixHref = fixHref; this.shortcutType = shortcutType; this.create = create; } public ShortcutResult(boolean create) { this.create = create; } public boolean isCreate() { return create; } public String getBrowser() { return browser; } public Shortcut getShortcutType() { return shortcutType; } public boolean isFixHref() { return fixHref; } public void setBrowser(String browser) { this.browser = browser; } public void setFixHref(boolean fixHref) { this.fixHref = fixHref; } public void setShortcutType(Shortcut shortcutType) { this.shortcutType = shortcutType; } } private final YesNo regularReturn; private ShortcutResult dekstop; private ShortcutResult menu; public AccessWarningPaneComplexReturn(boolean b) { if (b) { this.regularReturn = YesNo.yes(); } else { this.regularReturn = YesNo.no(); } } public AccessWarningPaneComplexReturn(BasicDialogValue.Primitive regularReturn) { this.regularReturn = new YesNo(regularReturn); } public void setDekstop(ShortcutResult dekstop) { this.dekstop = dekstop; } public ShortcutResult getDekstop() { return dekstop; } public void setMenu(ShortcutResult menu) { this.menu = menu; } public ShortcutResult getMenu() { return menu; } @Override public boolean toBoolean() { if (regularReturn == null) { return false; } return regularReturn.toBoolean(); } public YesNo getRegularReturn() { return regularReturn; } @Override public int getButtonIndex() { if (regularReturn == null) { return BasicDialogValue.Primitive.NO.getLegacyButton(); } else { return regularReturn.getButtonIndex(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesNoSandboxLimited0000644000000000000000000000013213441742745030614 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/YesNoSandboxLimited.java0000644000175000002070000000530013441742745032342 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.util.EnumSet; /** * Special case for AppTrustWarningPanel extensions. * Its behaviour is same as YesNo, but if soem extension Need sandbox, it can safely use * YesNoSandbox, and it will be correctly eaten. * */ public class YesNoSandboxLimited extends YesNoSandbox { public static YesNoSandboxLimited yes() { return new YesNoSandboxLimited(BasicDialogValue.Primitive.YES); } public static YesNoSandboxLimited no() { return new YesNoSandboxLimited(BasicDialogValue.Primitive.NO); } public static YesNoSandboxLimited sandbox() { return new YesNoSandboxLimited(BasicDialogValue.Primitive.SANDBOX); } public static YesNoSandboxLimited readValue(String s) { return new YesNoSandboxLimited(BasicDialogValue.Primitive.valueOf(s)); } private YesNoSandboxLimited(BasicDialogValue.Primitive valueOf) { super(valueOf); } @Override public EnumSet getAllowedValues() { return BasicDialogValue.YesNo; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/NamePassword.java0000644000000000000000000000013213441742745030253 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/NamePassword.java0000644000175000002070000000514713441742745031072 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; public class NamePassword implements DialogResult { String name; char[] password; public NamePassword(String name, char[] password) { this.name = name; this.password = password; } @Override public int getButtonIndex() { return BasicDialogValue.Primitive.NO.getLegacyButton(); } public String getName() { return name; } public char[] getPassword() { return password; } //following three methods are not used by this class @Override public boolean toBoolean() { throw new UnsupportedOperationException("Not supported yet."); } public static NamePassword readValue(String s) { int i = s.indexOf(" "); return new NamePassword(s.substring(0,i), s.substring(i+1).toCharArray()); } @Override public String writeValue() { throw new UnsupportedOperationException("Not supported yet."); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesNoCancel.java0000644000000000000000000000013213441742745030013 xustar0030 mtime=1552401893.041832819 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/YesNoCancel.java0000644000175000002070000000464113441742745030630 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.util.EnumSet; public class YesNoCancel extends YesNo { public static YesNoCancel yes() { return new YesNoCancel(BasicDialogValue.Primitive.YES); } public static YesNoCancel no() { return new YesNoCancel(BasicDialogValue.Primitive.NO); } public static YesNoCancel cancel() { return new YesNoCancel(BasicDialogValue.Primitive.CANCEL); } public static YesNoCancel readValue(String s) { return new YesNoCancel(BasicDialogValue.Primitive.valueOf(s)); } private YesNoCancel(BasicDialogValue.Primitive valueOf) { super(valueOf); } @Override public EnumSet getAllowedValues() { return BasicDialogValue.YesNoCancel; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/BasicDialogValue.ja0000644000000000000000000000013113441742745030456 xustar0029 mtime=1552401893.04083282 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/BasicDialogValue.java0000644000175000002070000001147313441742745031624 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.util.EnumSet; public abstract class BasicDialogValue { public static enum Primitive { YES(0), NO(1), CANCEL(2), SANDBOX(2), SKIP(0); private final int legacyButton; private Primitive(int legacyButton) { this.legacyButton = legacyButton; } public int getLegacyButton() { return legacyButton; } } static abstract class PrimitivesSubset implements DialogResult { protected final BasicDialogValue.Primitive value; abstract EnumSet getAllowedValues(); protected PrimitivesSubset(BasicDialogValue.Primitive value) { this.value = value; checkValue(value); } final void checkValue(Primitive p) { if (!getAllowedValues().contains(p)) { throw new RuntimeException("Unsupported primitive " + p + ". Allowed are " + getAllowedValues().toString()); } } @Override public String writeValue() { if (value == null) { return writeNUll(); } return value.name(); } @Override public boolean toBoolean() { if (value == null || value == BasicDialogValue.Primitive.NO || value == BasicDialogValue.Primitive.CANCEL) { return false; } else { return true; } } public BasicDialogValue.Primitive getValue() { return value; } public boolean compareValue(Primitive with) { if (getValue() == null && with == null) { return true; } checkValue(with); return getValue() == with; } public boolean compareValue(PrimitivesSubset with) { if (with == null) { return false; } return compareValue(with.getValue()); } @Override public int getButtonIndex() { return BasicDialogValue.Primitive.NO.getLegacyButton(); } @Override public boolean equals(Object obj) { if (obj instanceof PrimitivesSubset) { return this.compareValue(((PrimitivesSubset) obj)); } return false; } @Override public int hashCode() { return getValue().hashCode(); } } public static final EnumSet Yes = EnumSet.of(Primitive.YES); public static final EnumSet YesNo = EnumSet.of(Primitive.YES, Primitive.NO); public static final EnumSet YesCancel = EnumSet.of(Primitive.YES, Primitive.CANCEL); public static final EnumSet YesCancelSkip = EnumSet.of(Primitive.YES, Primitive.CANCEL, Primitive.SKIP); public static final EnumSet YesNoCancel = EnumSet.of(Primitive.YES, Primitive.NO, Primitive.CANCEL); public static final EnumSet YesNoSandbox = EnumSet.of(Primitive.YES, Primitive.NO, Primitive.SANDBOX); /** * Current convention for null is empty string. * * @return "" */ public static String writeNUll() { return ""; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesCancelSkip.java0000644000000000000000000000013213441742745030345 xustar0030 mtime=1552401893.046832808 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/YesCancelSkip.java0000644000175000002070000000470013441742745031156 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.util.EnumSet; public class YesCancelSkip extends YesCancel { public static YesCancelSkip yes() { return new YesCancelSkip(BasicDialogValue.Primitive.YES); } public static YesCancelSkip cancel() { return new YesCancelSkip(BasicDialogValue.Primitive.CANCEL); } public static YesCancelSkip skip() { return new YesCancelSkip(BasicDialogValue.Primitive.SKIP); } public static YesCancelSkip readValue(String s) { return new YesCancelSkip(BasicDialogValue.Primitive.valueOf(s)); } private YesCancelSkip(BasicDialogValue.Primitive valueOf) { super(valueOf); } @Override public EnumSet getAllowedValues() { return BasicDialogValue.YesCancelSkip; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/YesNoSandbox.java0000644000000000000000000000013213441742745030224 xustar0030 mtime=1552401893.037832827 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/YesNoSandbox.java0000644000175000002070000000466013441742745031042 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.util.EnumSet; public class YesNoSandbox extends YesNo { public static YesNoSandbox yes() { return new YesNoSandbox(BasicDialogValue.Primitive.YES); } public static YesNoSandbox no() { return new YesNoSandbox(BasicDialogValue.Primitive.NO); } public static YesNoSandbox sandbox() { return new YesNoSandbox(BasicDialogValue.Primitive.SANDBOX); } public static YesNoSandbox readValue(String s) { return new YesNoSandbox(BasicDialogValue.Primitive.valueOf(s)); } protected YesNoSandbox(BasicDialogValue.Primitive valueOf) { super(valueOf); } @Override public EnumSet getAllowedValues() { return BasicDialogValue.YesNoSandbox; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/DialogResult.java0000644000000000000000000000013213441742745030246 xustar0030 mtime=1552401893.037832827 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/DialogResult.java0000644000175000002070000000464713441742745031071 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; /** * Note - this interface do not force return type, otherwise we will end with Object again. * It is just pointing out, that what is returned, is DialogResult, so it can be traced via code. * Also it gathers some most used methods on various implementations. Feel free to enlarge the list! * */ public interface DialogResult { /** * the index of the button. By convention 0 = Yes. 1 = No, 2 = Cancel/sandbox * * @return button to be preselected in dialogue */ abstract public int getButtonIndex(); /** * Simplified decision model whether dialog was approved or not. * @return true only and only if dialog was approved */ abstract public boolean toBoolean(); abstract public String writeValue(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/PaxHeaders.7406/Yes.java0000644000000000000000000000013213441742745026410 xustar0030 mtime=1552401893.043832814 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/dialogresults/Yes.java0000644000175000002070000000526213441742745027225 0ustar00jvanekmock00000000000000/* Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.dialogresults; import java.util.EnumSet; public class Yes extends BasicDialogValue.PrimitivesSubset { public static Yes readValue(String s) { BasicDialogValue.Primitive x = BasicDialogValue.Primitive.valueOf(s); if (x == BasicDialogValue.Primitive.YES) { return new Yes(); } throw new RuntimeException("Expected YES and only YES. Got" + x); } public Yes() { super(BasicDialogValue.Primitive.YES); } /** * To allow inheritance. * Overriders have to override getAllowedValues to work. * This one fails with anything else then Yes */ protected Yes(BasicDialogValue.Primitive p) { super(p); } @Override public int getButtonIndex() { return BasicDialogValue.Primitive.YES.getLegacyButton(); } @Override public EnumSet getAllowedValues() { return BasicDialogValue.Yes; } @Override public String toString() { return writeValue(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/appletextendedsecurity0000644000000000000000000000013113441742745026644 xustar0030 mtime=1552401893.061832777 29 atime=1552410887.11418344 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/0000755000175000002070000000000013441742745027532 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.7406/AppletSecu0000644000000000000000000000013213441742745030712 xustar0030 mtime=1552401893.061832777 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/AppletSecurityLevel.java0000644000175000002070000000630413441742745034345 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; import net.sourceforge.jnlp.runtime.Translator; public enum AppletSecurityLevel { DENY_ALL, DENY_UNSIGNED, ASK_UNSIGNED, ALLOW_UNSIGNED; public static String allToString() { return DENY_ALL.toChars() + " " + DENY_UNSIGNED.toChars() + " " + ASK_UNSIGNED.toChars() + " " + ALLOW_UNSIGNED.toChars(); } public String toChars() { return this.name(); } public String toExplanation() { switch (this) { case DENY_ALL: return Translator.R("APPEXTSECappletSecurityLevelExtraHighId") + " - " + Translator.R("APPEXTSECappletSecurityLevelExtraHighExplanation"); case DENY_UNSIGNED: return Translator.R("APPEXTSECappletSecurityLevelVeryHighId") + " - " + Translator.R("APPEXTSECappletSecurityLevelVeryHighExplanation"); case ASK_UNSIGNED: return Translator.R("APPEXTSECappletSecurityLevelHighId") + " - " + Translator.R("APPEXTSECappletSecurityLevelHighExplanation"); case ALLOW_UNSIGNED: return Translator.R("APPEXTSECappletSecurityLevelLowId") + " - " + Translator.R("APPEXTSECappletSecurityLevelLowExplanation"); } throw new RuntimeException("Unknown AppletSecurityLevel"); } public static AppletSecurityLevel fromString(String s) { return AppletSecurityLevel.valueOf(s.toUpperCase()); } @Override public String toString() { return toExplanation(); } public static AppletSecurityLevel getDefault() { return ASK_UNSIGNED; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.7406/UnsignedAp0000644000000000000000000000032213441742745030703 xustar00120 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java 30 mtime=1552401893.036832829 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirm0000644000175000002070000002744313441742745034771 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; import static net.sourceforge.jnlp.runtime.Translator.R; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.security.CertVerifier; import net.sourceforge.jnlp.security.SecurityDialogs; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogresults.YesNo; import net.sourceforge.jnlp.security.dialogresults.YesNoSandbox; import net.sourceforge.jnlp.security.dialogs.remember.SavedRememberAction; import net.sourceforge.jnlp.security.dialogs.remember.AppletSecurityActions; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; public class UnsignedAppletTrustConfirmation { private static final AppletStartupSecuritySettings securitySettings = AppletStartupSecuritySettings.getInstance(); private static boolean unsignedConfirmationIsRequired() { // If we are using the 'high' security setting or higher, we must confirm // if the user wishes to run unsigned applets (not applicable to JNLP-launched apps) return !(AppletSecurityLevel.ALLOW_UNSIGNED == securitySettings.getSecurityLevel()); } private static boolean unsignedAppletsAreForbidden() { // If we are using the 'very high' security setting or higher, we do not // run unsigned applets return AppletSecurityLevel.DENY_UNSIGNED == securitySettings.getSecurityLevel() || AppletSecurityLevel.DENY_ALL == securitySettings.getSecurityLevel(); } /** * Gets the remembered decision, first checking the user policy for an ALWAYS/NEVER, * and then the global policy. * * @param file the plugin file * @param id of wonted action * @return the remembered decision */ public static UnsignedAppletActionEntry getStoredEntry(JNLPFile file, Class id) { UnsignedAppletActionStorage userActionStorage = securitySettings.getUnsignedAppletActionCustomStorage(); UnsignedAppletActionStorage globalActionStorage = securitySettings.getUnsignedAppletActionGlobalStorage(); UnsignedAppletActionEntry globalEntry = getMatchingItem(globalActionStorage, file, id); UnsignedAppletActionEntry userEntry = getMatchingItem(userActionStorage, file, id); ExecuteAppletAction globalAction = globalEntry == null ? null : globalEntry.getAppletSecurityActions().getAction(id); ExecuteAppletAction userAction = userEntry == null ? null : userEntry.getAppletSecurityActions().getAction(id); if (userAction == ExecuteAppletAction.ALWAYS || userAction == ExecuteAppletAction.NEVER) { return userEntry; } else if (globalAction == ExecuteAppletAction.ALWAYS || globalAction == ExecuteAppletAction.NEVER) { return globalEntry; } else { return userEntry; } } public static ExecuteAppletAction getStoredAction(JNLPFile file, Class id) { UnsignedAppletActionEntry x = getStoredEntry(file, id); if (x != null) { return x.getAppletSecurityActions().getAction(id); } return null; } private static UnsignedAppletActionEntry getMatchingItem(UnsignedAppletActionStorage actionStorage, JNLPFile file, Class id) { return actionStorage.getMatchingItem( UrlUtils.normalizeUrlAndStripParams(file.getSourceLocation(), true /* encode local files */).toString(), UrlUtils.normalizeUrlAndStripParams(file.getNotNullProbalbeCodeBase(), true /* encode local files */).toString(), toRelativePaths(getJars(file), file.getNotNullProbalbeCodeBase().toExternalForm()), id); } /* Extract the archives as relative paths */ static List toRelativePaths(List paths, String rootPath) { List fileNames = new ArrayList<>(); for (String path : paths) { if (path.startsWith(rootPath)) { fileNames.add(path.substring(rootPath.length())); } else { fileNames.add(path); } } return fileNames; } public static void updateAppletAction(JNLPFile file, SavedRememberAction behaviour, Boolean rememberForCodeBase, Class id) { UnsignedAppletActionStorage userActionStorage = securitySettings.getUnsignedAppletActionCustomStorage(); userActionStorage.lock(); // We should ensure this operation is atomic try { UnsignedAppletActionEntry oldEntry = getMatchingItem(userActionStorage, file, id); URL codebase = UrlUtils.normalizeUrlAndStripParams(file.getNotNullProbalbeCodeBase(), true /* encode local files */); URL documentbase = UrlUtils.normalizeUrlAndStripParams(file.getSourceLocation(), true /* encode local files */); UrlRegEx codebaseRegex = null; UrlRegEx documentbaseRegex = null; List archiveMatches = null; if (rememberForCodeBase != null) { codebaseRegex = UrlRegEx.quote(codebase.toExternalForm()); if (!rememberForCodeBase) { documentbaseRegex = UrlRegEx.quote(documentbase.toExternalForm()); // Match only this applet archiveMatches = toRelativePaths(getJars(file), file.getNotNullProbalbeCodeBase().toString()); // Match only this applet } else { documentbaseRegex = UrlRegEx.quoteAndStar(UrlUtils.stripFile(documentbase)); // Match any from codebase and sourceFile "base" } } /* Update, if entry exists */ if (oldEntry != null) { oldEntry.getAppletSecurityActions().setAction(id, behaviour); oldEntry.setTimeStamp(new Date()); if (rememberForCodeBase != null) { oldEntry.setDocumentBase(documentbaseRegex); oldEntry.setCodeBase(codebaseRegex); } oldEntry.setArchives(archiveMatches); userActionStorage.update(oldEntry); return; } if (rememberForCodeBase == null){ throw new RuntimeException("Trying to create new entry without codebase. Thats forbidden."); } /* Else, create a new entry */ UnsignedAppletActionEntry entry = new UnsignedAppletActionEntry( AppletSecurityActions.fromAction(id, behaviour), new Date(), documentbaseRegex, codebaseRegex, archiveMatches ); userActionStorage.add(entry); } finally { userActionStorage.unlock(); } } private static List getJars(JNLPFile file) { if (file instanceof PluginBridge) return ((PluginBridge) file).getArchiveJars(); List jars = Arrays.asList(file.getResources().getJARs()); List result = new ArrayList<>(); for (JARDesc jar : jars) { result.add(jar.getLocation().toString()); } return result; } public static void checkUnsignedWithUserIfRequired(JNLPFile file) throws LaunchException { if (unsignedAppletsAreForbidden()) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Not running unsigned applet at " + file.getCodeBase() +" because unsigned applets are disallowed by security policy."); throw new LaunchException(file, null, R("LSFatal"), R("LCClient"), R("LUnsignedApplet"), R("LUnsignedAppletPolicyDenied")); } if (!unsignedConfirmationIsRequired()) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Running unsigned applet at " + file.getCodeBase() +" does not require confirmation according to security policy."); return; } YesNo warningResponse = SecurityDialogs.showUnsignedWarningDialog(file); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Decided action for unsigned applet at " + file.getCodeBase() + " was " + warningResponse); if (warningResponse == null || !warningResponse.compareValue(BasicDialogValue.Primitive.YES)) { throw new LaunchException(file, null, R("LSFatal"), R("LCClient"), R("LUnsignedApplet"), R("LUnsignedAppletUserDenied")); } } public static void checkPartiallySignedWithUserIfRequired(SecurityDelegate securityDelegate, JNLPFile file, CertVerifier certVerifier) throws LaunchException { if (!unsignedConfirmationIsRequired()) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Running partially signed applet at " + file.getCodeBase() + " does not require confirmation according to security policy."); return; } YesNoSandbox warningResponse = SecurityDialogs.showPartiallySignedWarningDialog(file, certVerifier, securityDelegate); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Decided action for unsigned applet at " + file.getCodeBase() + " was " + warningResponse); if (warningResponse == null || warningResponse.compareValue(BasicDialogValue.Primitive.NO)) { throw new LaunchException(file, null, R("LSFatal"), R("LCClient"), R("LPartiallySignedApplet"), R("LPartiallySignedAppletUserDenied")); } //this is due to possible YesNoSandboxLimited if (YesNoSandbox.sandbox().compareValue(warningResponse)) { securityDelegate.setRunInSandbox(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.7406/ExtendedAp0000644000000000000000000000031513441742745030671 xustar00115 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExtendedAppletSecurityHelp.java 30 mtime=1552401893.034832833 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExtendedAppletSecurityHelp0000644000175000002070000002015613441742745034730 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; import java.awt.Dimension; import java.io.IOException; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.docprovider.TextsProvider; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.swing.SwingUtils; public class ExtendedAppletSecurityHelp extends javax.swing.JDialog implements HyperlinkListener { public ExtendedAppletSecurityHelp(java.awt.Frame parent, boolean modal, String reference) { this(parent, modal); mainHtmlPane.scrollToReference(reference); } public ExtendedAppletSecurityHelp(java.awt.Frame parent, boolean modal) { super(parent, modal); Dimension d = new Dimension(600, 400); setPreferredSize(d); setSize(d); initComponents(); mainHtmlPane.setText(getDialogueText()); mainHtmlPane.addHyperlinkListener(ExtendedAppletSecurityHelp.this); mainHtmlPane.setCaretPosition(1); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); } @Override public void hyperlinkUpdate(HyperlinkEvent event) { if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { try { if (event.getURL() == null) { String s = event.getDescription().replace("#", ""); mainHtmlPane.scrollToReference(s); } else { mainHtmlPane.setPage(event.getURL()); } } catch (IOException ioe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ioe); } } } private void initComponents() { scrollPane = new javax.swing.JScrollPane(); mainHtmlPane = new javax.swing.JEditorPane(); mainPanel = new javax.swing.JPanel(); niceSeparator = new javax.swing.JSeparator(); mainButtonsPanel = new javax.swing.JPanel(); navigationPanel = new javax.swing.JPanel(); homeButton = new javax.swing.JButton(); homeAndDialogueButton = new javax.swing.JButton(); closePanel = new javax.swing.JPanel(); closeButton = new javax.swing.JButton(); getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.Y_AXIS)); mainHtmlPane.setContentType("text/html"); mainHtmlPane.setEditable(false); scrollPane.setViewportView(mainHtmlPane); getContentPane().add(scrollPane); javax.swing.GroupLayout mainLayout = new javax.swing.GroupLayout(mainPanel); mainPanel.setLayout(mainLayout); mainLayout.setHorizontalGroup( mainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 485, Short.MAX_VALUE) .addGroup(mainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(mainLayout.createSequentialGroup() .addGap(0, 217, Short.MAX_VALUE) .addComponent(niceSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 218, Short.MAX_VALUE)))); mainLayout.setVerticalGroup( mainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 10, Short.MAX_VALUE) .addGroup(mainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(mainLayout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(niceSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)))); getContentPane().add(mainPanel); mainButtonsPanel.setLayout(new javax.swing.BoxLayout(mainButtonsPanel, javax.swing.BoxLayout.LINE_AXIS)); navigationPanel.setLayout(new javax.swing.BoxLayout(navigationPanel, javax.swing.BoxLayout.LINE_AXIS)); homeButton.setText(Translator.R("SPLASHHome")); homeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { goToIntroSection(evt); } }); navigationPanel.add(homeButton); homeAndDialogueButton.setText(Translator.R("APPEXTSEChelpHomeDialogue")); homeAndDialogueButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { goToDialogueSection(evt); } }); closeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ExtendedAppletSecurityHelp.this.dispose(); } }); navigationPanel.add(homeAndDialogueButton); mainButtonsPanel.add(navigationPanel); closeButton.setText(Translator.R("ButClose")); closePanel.add(closeButton); mainButtonsPanel.add(closePanel); getContentPane().add(mainButtonsPanel); pack(); } private void goToIntroSection(java.awt.event.ActionEvent evt) { mainHtmlPane.setText(getDialogueText()); mainHtmlPane.setCaretPosition(1); } private void goToDialogueSection(java.awt.event.ActionEvent evt) { mainHtmlPane.setText(getDialogueText()); mainHtmlPane.scrollToReference("dialogue"); } public static void main(String args[]) { SwingUtils.invokeLater(new Runnable() { public void run() { ExtendedAppletSecurityHelp dialog = new ExtendedAppletSecurityHelp(null, false); dialog.setVisible(true); } }); } private JButton homeAndDialogueButton; private JButton homeButton; private JButton closeButton; private JEditorPane mainHtmlPane; private JPanel mainButtonsPanel; private JPanel navigationPanel; private JPanel closePanel; private JPanel mainPanel; private JScrollPane scrollPane; private JSeparator niceSeparator; private String getDialogueText() { return Translator.R("APPEXTSEChelp", TextsProvider.ITW_HOME, TextsProvider.ITW_BUGZILLAHOME, TextsProvider.ITW_BUGS, TextsProvider.ITW_EAS); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.7406/UnsignedAp0000644000000000000000000000031613441742745030706 xustar00116 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionStorage.java 30 mtime=1552401893.037832827 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionStorag0000644000175000002070000001432513441742745034722 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; import java.util.List; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; /** * This is abstract access to white/blacklist created from some permanent storage. *

    * It is daclaring adding, updating and searching. Intentionally not removing as * during plugin runtime no deletations should be done. *

    *

    * Implementations of this interface (unless dummy ones:) should ensure correct * communication with permanent storage and be prepared for multiple instances * read/write the same storage at time. *

    */ public interface UnsignedAppletActionStorage { /** * This methods iterates through records in * net.sourceforge.jnlp.config.DeploymentConfiguration#getAppletTrustUserSettingsPath or * net.sourceforge.jnlp.config.DeploymentConfiguration#getAppletTrustGlobalSettingsPath, and is matching * regexes saved here against params. So parameters here are NOT regexes, * but are matched against saved regexes. *

    * {@code null} or empty values are dangerously ignored, user, be aware of it. eg: * match only {@code codeBase} will be {@code null} someCodeBase {@code null} {@code null} match only * {@code documentBase} will be someDocBase {@code null} {@code null} {@code null} match only applet not * regarding code or document base will be {@code null} {@code null} mainClass archives. *

    * @param documentBase * @param codeBase * @param archives * @param id of AppletSecurityAction's ExecuteAppletAction to be used for "strong" search * @return a matching unsigned applet action entry */ public UnsignedAppletActionEntry getMatchingItem(String documentBase, String codeBase, List archives, Class id); /** * Shortcut {@code getMatchingItem(documentBase, null, null, null)} * * @param documentBase * @param id of AppletSecurityAction's ExecuteAppletAction to be used for "strong" search * @return a matching unsigned applet action entry */ public UnsignedAppletActionEntry getMatchingItemByDocumentBase(String documentBase, Class id); /** * Shortcut {@code getMatchingItem(null, codeBase, null, null)} * * @param codeBase * @param id of AppletSecurityAction's ExecuteAppletAction to be used for "strong" search * @return a matching unsigned applet action entry */ public UnsignedAppletActionEntry getMatchingItemByCodeBase(String codeBase, Class id); /** * Shortcut {@code getMatchingItem(documentBase, codeBase, null, null)} * * @param documentBase * @param codeBase * @param id of AppletSecurityAction's ExecuteAppletAction to be used for "strong" search * @return a matching unsigned applet action entry */ public UnsignedAppletActionEntry getMatchingItemByBases(String documentBase, String codeBase, Class id); /** * Will add new record. Note that regexes are stored for bases matching. *

    * eg UnsignedAppletActionEntry which will deny some applet no matter of * page will be {@code new }{@link UnsignedAppletActionEntry#UnsignedAppletActionEntry UnsignedAppletActionEntry}{@code (} ExecuteUnsignedApplet#NEVER{@code , new }{@link java.util.Date#Date() Date()}{@code , null, null, someMain, someArchives)} *

    *

    * eg {@link UnsignedAppletActionEntry} which will * allow all applets on page with same codebase will be {@code new }{@link UnsignedAppletActionEntry#UnsignedAppletActionEntry UnsignedAppletActionEntry}{@code (} ExecuteUnsignedApplet#NEVER {@code , new }{@link java.util.Date#Date() Date()}{@code , ".*", ".*", null, null);} *

    * @param item */ public void add(final UnsignedAppletActionEntry item); /** * Will replace (current impl is matching by object's hashcode. This is not * reloading the list (but still saving after), so * {@link net.sourceforge.jnlp.util.lockingfile.StorageIoException} can be * thrown if it was not loaded before. *

    * Imho this should be used only to actualise timestamps or change * {@link UnsignedAppletActionEntry} *

    * @param item */ public void update(final UnsignedAppletActionEntry item); /** * Lock the storage, if necessary. If no ownership issues arise, can be a no-op. */ public void lock(); /** * Unlock the storage, if necessary. If no ownership issues arise, can be a no-op. */ public void unlock(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.7406/InvalidLin0000644000000000000000000000013213441742745030676 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/InvalidLineException.java0000644000175000002070000000347613441742745034464 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; public class InvalidLineException extends RuntimeException { public InvalidLineException(String s) { super(s); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.7406/impl0000644000000000000000000000013113441742745027605 xustar0030 mtime=1552401893.062832775 29 atime=1552410887.11418344 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/0000755000175000002070000000000013441742745030473 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/PaxHeaders.7406/Unsig0000644000000000000000000000033713441742745030702 xustar00133 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java 30 mtime=1552401893.062832775 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionS0000644000175000002070000001575313441742745034634 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity.impl; import java.io.File; import java.io.IOException; import java.util.Date; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import net.sourceforge.jnlp.security.appletextendedsecurity.UrlRegEx; import net.sourceforge.jnlp.security.dialogs.remember.AppletSecurityActions; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.util.lockingfile.StorageIoException; public class UnsignedAppletActionStorageExtendedImpl extends UnsignedAppletActionStorageImpl { public UnsignedAppletActionStorageExtendedImpl(String location) { this(new File(location)); } public UnsignedAppletActionStorageExtendedImpl(File location) { super(location); } /** * * @return always fresh copy loaded from disc */ public UnsignedAppletActionEntry[] toArray() { lock(); try { readContents(); return items.toArray(new UnsignedAppletActionEntry[items.size()]); } catch (IOException e) { throw new StorageIoException(e); } finally { unlock(); } } public void clear() { doLocked(new Runnable() { @Override public void run() { try { items.clear(); writeContents(); } catch (IOException e) { throw new StorageIoException(e); } } }); } public void removeByBehaviour(final ExecuteAppletAction unsignedAppletAction) { doLocked(new Runnable() { @Override public void run() { try { readContents(); for (int i = 0; i < items.size(); i++) { UnsignedAppletActionEntry unsignedAppletActionEntry = items.get(i); AppletSecurityActions actions = unsignedAppletActionEntry.getAppletSecurityActions(); for (int j = 0; j < actions.getRealCount(); j++) { // ExecuteAppletAction action = actions.getAction(j); // if (action == unsignedAppletAction) { // items.remove(i); // i--; // break; //actions loop // } } } writeContents(); } catch (IOException e) { throw new StorageIoException(e); } } }); } private void swap(final int i, final int ii) { doLocked(new Runnable() { public void run() { try { readContents(); UnsignedAppletActionEntry backup = items.get(i); items.set(i, items.get(ii)); items.set(ii, backup); writeContents(); } catch (IOException e) { throw new StorageIoException(e); } } }); } public int moveUp(int selectedRow) { if (selectedRow <= 0) { return selectedRow; } swap(selectedRow, selectedRow - 1); return selectedRow-1; } public int moveDown(int selectedRow) { if (selectedRow >= items.size() - 1) { return selectedRow; } swap(selectedRow, selectedRow + 1); return selectedRow+1; } public void remove(final int item) { doLocked(new Runnable() { public void run() { try { readContents(); items.remove(item); writeContents(); } catch (IOException ex) { throw new StorageIoException(ex); } } }); } public void modify(final UnsignedAppletActionEntry source, final int columnIndex, final Object aValue) { Runnable r = new Runnable() { @Override public void run() { try { if (!items.contains(source)) { throw new StorageIoException("Item to be modified not found in storage"); } if (columnIndex == 0) { source.getAppletSecurityActions().refresh((String) aValue); } if (columnIndex == 1) { source.setTimeStamp((Date) aValue); } if (columnIndex == 2) { source.setDocumentBase(UrlRegEx.exact((String) aValue)); } if (columnIndex == 3) { source.setCodeBase(UrlRegEx.exact((String) aValue)); } if (columnIndex == 4) { source.setArchives(UnsignedAppletActionEntry.createArchivesList((String) aValue)); } writeContents(); } catch (IOException ex) { throw new StorageIoException(ex); } } }; doLocked(r); } @Override public synchronized void writeContentsLocked() throws IOException { super.writeContentsLocked(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/PaxHeaders.7406/Unsig0000644000000000000000000000032613441742745030700 xustar00125 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java 29 mtime=1552401893.04583281 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionS0000644000175000002070000003063013441742745034623 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity.impl; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.regex.PatternSyntaxException; import net.sourceforge.jnlp.security.appletextendedsecurity.InvalidLineException; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionStorage; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.lockingfile.LockingReaderWriter; import net.sourceforge.jnlp.util.lockingfile.StorageIoException; import net.sourceforge.jnlp.util.logging.OutputController; public class UnsignedAppletActionStorageImpl extends LockingReaderWriter implements UnsignedAppletActionStorage { protected List items; private String readVersion = null; public static final String versionPreffix="#VERSION "; public static final String BACKUP_SUFFIX = "-backup"; public static final int currentVersion = 2; private int lineCounter = 0; private boolean loadingDisabled = false; public UnsignedAppletActionStorageImpl(File location) { super(location); } @Override public void writeContents() throws IOException { super.writeContents(); } @Override public synchronized void writeContentsLocked() throws IOException { super.writeContentsLocked(); } @Override protected void readContents() throws IOException { if (items == null) { items = new ArrayList<>(); } else { items.clear(); } super.readContents(); } @Override protected void readLine(String line) { if (line.trim().length() != 0) { lineCounter++; if (line.startsWith(versionPreffix) && line.trim().split("\\s+").length > 1) { if (readVersion == null) { readVersion = line.trim(); actOnVersionLoad(); } } else { if (lineCounter>0 && readVersion == null){ actOnNoVersionLoad(); } if (!loadingDisabled) { this.items.add(UnsignedAppletActionEntry.createFromString(line)); } } } } @Override public void writeContent(BufferedWriter bw) throws IOException { lineCounter = 0; readVersion = null; bw.write(versionPreffix + currentVersion + " - note, do not edit or modify this line. It may cause removal of this file."); bw.newLine(); for (UnsignedAppletActionEntry item : items) { try{ item.write(bw); bw.newLine(); }catch (InvalidLineException ex){ OutputController.getLogger().log(ex); } } } @Override public void add(final UnsignedAppletActionEntry item) { doLocked(new Runnable() { @Override public void run() { try { readContents(); items.add(item); writeContents(); } catch (IOException ex) { throw new StorageIoException(ex); } } }); } @Override public void update(final UnsignedAppletActionEntry item) { doLocked(new Runnable() { @Override public void run() { try { if (items == null) { throw new StorageIoException("Storage is not initialised, can not update"); } if (!items.contains(item)) { throw new StorageIoException("Storage does not contain item you are updating. can not update"); } writeContents(); } catch (IOException ex) { throw new StorageIoException(ex); } } }); } @Override public UnsignedAppletActionEntry getMatchingItem(String documentBase, String codeBase, List archives, Class id) { List results = getMatchingItems(documentBase, codeBase, archives); if (results == null || results.isEmpty()) { return null; } //no comaprsion id provided if (id == null){ return results.get(0); } // Chose the first result, unless we find a 'stronger' result // Actions such as 'always accept' or 'always reject' are 'stronger' than // the hints 'was accepted' or 'was rejected'. for (UnsignedAppletActionEntry candidate : results) { if (candidate.getAppletSecurityActions().getAction(id) == ExecuteAppletAction.ALWAYS || candidate.getAppletSecurityActions().getAction(id) == ExecuteAppletAction.NEVER) { //return first found strong return candidate; } } //no strong found, return first return results.get(0); } public List getMatchingItems(String documentBase, String codeBase, List archives) { List result = new ArrayList<>(); lock(); try { readContents(); if (items == null) { return result; } for (UnsignedAppletActionEntry unsignedAppletActionEntry : items) { if (isMatching(unsignedAppletActionEntry, documentBase, codeBase, archives)) { result.add(unsignedAppletActionEntry); } } } catch (IOException e) { throw new StorageIoException(e); } finally { unlock(); } return result; } private boolean isMatching(UnsignedAppletActionEntry unsignedAppletActionEntry, String documentBase, String codeBase, List archives) { try { boolean result = true; if (documentBase != null && !documentBase.trim().isEmpty()) { result = result && documentBase.matches(unsignedAppletActionEntry.getDocumentBase().getRegEx()); } if (codeBase != null && !codeBase.trim().isEmpty()) { result = result && codeBase.matches(unsignedAppletActionEntry.getCodeBase().getRegEx()); } if (archives != null) { List saved = unsignedAppletActionEntry.getArchives(); if (saved == null || saved.isEmpty()) { return result; } result = result && compareArchives(archives, saved); } return result; } catch (PatternSyntaxException ex) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, ex); return false; } } @Override public String toString() { return getBackingFile() + " " + super.toString(); } private boolean compareArchives(List archives, List saved) { if (archives == null && saved !=null){ return false; } if (archives != null && saved ==null){ return false; } if (archives == null && saved ==null){ return true; } if (archives.size() != saved.size()) { return false; } Collections.sort(archives); Collections.sort(saved); for (int i = 0; i < saved.size(); i++) { String string1 = saved.get(i); String string2 = archives.get(i); //intentional reference compare if (string1 == string2) { continue; } if (string1 == null || string2 == null) { return false; } if (string1.trim().equals(string2.trim())) { continue; } return false; } return true; } @Override public UnsignedAppletActionEntry getMatchingItemByDocumentBase(String documentBase, Class id) { return getMatchingItem(documentBase, null, null, id); } @Override public UnsignedAppletActionEntry getMatchingItemByCodeBase(String codeBase, Class id) { return getMatchingItem(null, codeBase, null, id); } @Override public UnsignedAppletActionEntry getMatchingItemByBases(String documentBase, String codeBase, Class id) { return getMatchingItem(documentBase, codeBase, null, id); } private void actOnVersionLoad() { String versionS = readVersion.split("\\s+")[1]; int version = 0; try{ version = Integer.valueOf(versionS); } catch (NumberFormatException e){ OutputController.getLogger().log(e); } if (version < 2){ OutputController.getLogger().log("Stoping laoding of vulnereable "+getBackingFile().getAbsolutePath()+". Will be replaced"); loadingDisabled = true; backupOldFile(version, getBackingFile()); } else { loadingDisabled = false; } } private void actOnNoVersionLoad() { readVersion=versionPreffix+"0"; actOnVersionLoad(); } private void backupOldFile(int version, File backingFile) { try { File backup = new File(backingFile.getAbsolutePath() + "." + version + BACKUP_SUFFIX); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "backuping " + getBackingFile().getAbsolutePath() + " as " + backup.getName()); String warning = "- !WARNING! this is automated copy of old " + backingFile.getName() + " which was removed/replaced. Before you blindly copy those items back, please note, that this file might be modified without your approval by evil attacker. It is advised to not return below lines, or verify them before returning"; String s = FileUtils.loadFileAsString(backingFile); s.replaceFirst("\\s*", ""); if (s.startsWith(versionPreffix)) { s = s.replaceFirst("\n", " " + warning + "\n"); } else { s = readVersion + " " + warning + "\n" + s; } FileUtils.saveFile(s, backup); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "Error during backuping: " + ex.getMessage()); OutputController.getLogger().log(ex); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.7406/AppletStar0000644000000000000000000000032013441742745030723 xustar00118 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/AppletStartupSecuritySettings.java 30 mtime=1552401893.044832812 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/AppletStartupSecuritySetti0000644000175000002070000000741713441742745035037 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; import net.sourceforge.jnlp.security.appletextendedsecurity.impl.UnsignedAppletActionStorageImpl; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.lockingfile.StorageIoException; public class AppletStartupSecuritySettings { private static final AppletStartupSecuritySettings instance = new AppletStartupSecuritySettings(); private UnsignedAppletActionStorageImpl globalInstance; private UnsignedAppletActionStorageImpl customInstance; public static AppletStartupSecuritySettings getInstance() { return instance; } public static AppletSecurityLevel getHardcodedDefaultSecurityLevel() { return AppletSecurityLevel.getDefault(); } /** * * @return storage with global items from /etc/ */ public UnsignedAppletActionStorage getUnsignedAppletActionGlobalStorage() { if (globalInstance == null) { globalInstance = new UnsignedAppletActionStorageImpl(PathsAndFiles.APPLET_TRUST_SETTINGS_SYS.getFile()); } return globalInstance; } /** * * @return storage with custom items from /home/ */ public UnsignedAppletActionStorage getUnsignedAppletActionCustomStorage() { if (customInstance == null) { customInstance = new UnsignedAppletActionStorageImpl(PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile()); } return customInstance; } /** * * @return user-set security level or default one if user-set do not exists */ public AppletSecurityLevel getSecurityLevel() { DeploymentConfiguration conf = JNLPRuntime.getConfiguration(); if (conf == null) { throw new StorageIoException("JNLPRuntime configuration is null. Try to reinstall IcedTea-Web"); } String s = conf.getProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL); if (s == null) { return getHardcodedDefaultSecurityLevel(); } return AppletSecurityLevel.fromString(s); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.7406/UnsignedAp0000644000000000000000000000031413441742745030704 xustar00114 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java 30 mtime=1552401893.036832829 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.0000644000175000002070000001416413441742745034643 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.Date; import java.util.List; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.dialogs.remember.AppletSecurityActions; /** * * The name of this class is legacy. * Now it is used to keep state of all remembered security decisions * */ public class UnsignedAppletActionEntry { private final AppletSecurityActions appletSecurityActions; private Date timeStamp; private UrlRegEx documentBase; private UrlRegEx codeBase; private List archives; public static UnsignedAppletActionEntry createFromString(String s) { String[] split = s.split("\\s+"); UnsignedAppletActionEntry nw = new UnsignedAppletActionEntry( AppletSecurityActions.fromString(split[0]), new Date(new Long(split[1])), UrlRegEx.exact(split[2]), null, null); if (split.length > 3) { nw.setCodeBase(UrlRegEx.exact(split[3])); } if (split.length > 4) { nw.setArchives(createArchivesList(s.substring(s.lastIndexOf(split[3]) + split[3].length()).trim())); } return nw; } public UnsignedAppletActionEntry(AppletSecurityActions unsignedAppletAction, Date timeStamp, UrlRegEx documentBase, UrlRegEx codeBase, List archives) { this.appletSecurityActions = unsignedAppletAction; this.timeStamp = timeStamp; this.documentBase = documentBase; this.codeBase = codeBase; this.archives = archives; } @Override public String toString() { return this.serializeToReadableAndParseableString(); } public void write(Writer bw) throws IOException { bw.write(this.serializeToReadableAndParseableString()); } private String serializeToReadableAndParseableString() throws InvalidLineException { String s = appletSecurityActions.toString() + " " + ((timeStamp == null) ? "1" : timeStamp.getTime()) + " " + ((documentBase == null) ? "" : documentBase.getRegEx()) + " " + ((codeBase == null) ? "" : codeBase.getRegEx()) + " " + createArchivesString(archives); if (s.contains("\n") || s.contains("\r") || s.contains("\f")){ throw new InvalidLineException("Cant write line with \\n, \\r or \\f"); } return s; } public Date getTimeStamp() { return timeStamp; } public String getLocalisedTimeStamp() { return JNLPRuntime.getLocalisedTimeStamp(timeStamp); } public UrlRegEx getDocumentBase() { return documentBase; } public void setTimeStamp(Date timeStamp) { this.timeStamp = timeStamp; } public void setDocumentBase(UrlRegEx documentBase) { this.documentBase = documentBase; } /** * should be testing only * * @return */ public AppletSecurityActions getAppletSecurityActions() { return appletSecurityActions; } public UrlRegEx getCodeBase() { return codeBase; } public void setCodeBase(UrlRegEx codeBase) { this.codeBase = codeBase; } public List getArchives() { return archives; } public void setArchives(List archives) { this.archives = archives; } public static String createArchivesString(List listOfArchives) { if (listOfArchives == null) { return ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < listOfArchives.size(); i++) { String string = listOfArchives.get(i); if (string.trim().isEmpty()) { continue; } sb.append(string); if (i != listOfArchives.size() - 1) { sb.append(","); } } return sb.toString(); } public static List createArchivesList(String commedArchives) { if (commedArchives == null) { return null; } if (commedArchives.trim().isEmpty()) { return null; } String[] items = commedArchives.trim().split(","); List r = new ArrayList<>(items.length); for (String string : items) { if (string.trim().isEmpty()) { continue; } r.add(string); } return r; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/PaxHeaders.7406/UrlRegEx.j0000644000000000000000000000013213441742745030572 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/appletextendedsecurity/UrlRegEx.java0000644000175000002070000001016513441742745032075 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.appletextendedsecurity; import java.util.regex.Pattern; public class UrlRegEx { private static String quoteString(String s) { return Pattern.quote(s); } private final String regEx; public static UrlRegEx quote(String s) { return new UrlRegEx(quoteString(s)); } public static UrlRegEx quoteAndStar(String s) { return new UrlRegEx(quoteString(s)+".*"); } public static UrlRegEx exact(String s) { return new UrlRegEx(s); } private UrlRegEx(String s) { regEx = s; } @Override public String toString() { return getRegEx(); } public String getRegEx() { return regEx; } /** * Just cosmetic method to show nicer tables, as \Qsomething\Emaybe is most * common record when cell is edited, the regex is shown fully * * @return unquted pattern or original string */ public String getFilteredRegEx() { try { return simpleUnquote(regEx); } catch (Exception ex) { return regEx; } } //needs testing static String replaceLast(String where, String what, String by) { if (!where.contains(what)) { return where; } StringBuilder b = new StringBuilder(where); b.replace(where.lastIndexOf(what), where.lastIndexOf(what)+what.length(), by); return b.toString(); } //needs testing static String simpleUnquote(String s) { //escaped run needs at least \E\Q, but only single char actually hurts if (s.length()<=1){ return s; } boolean in = false; for(int i = 1 ; i < s.length() ; i++){ if ( i == 0) { continue; } if (!in && s.charAt(i) == 'Q' && s.charAt(i-1) == '\\'){ in = true; String s1=s.substring(0, i - 1); String s2=s.substring(i + 1); s= s1+s2; i = i - 2; continue; } if (in && s.charAt(i) == 'E' && s.charAt(i-1) == '\\'){ String s1=s.substring(0, i - 1); String s2=s.substring(i + 1); s= s1+s2; i = i - 2; in = false; continue; } } //all text\Etext were replaced \Qtext\E\\E\Qtext\E //after above text\\Etext should remain return s.replace("\\\\E", "\\E"); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/SecurityDialogMessage.java0000644000000000000000000000013213441742745027223 xustar0030 mtime=1552401893.033832835 30 atime=1552402157.229253498 30 ctime=1552410887.034183627 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/SecurityDialogMessage.java0000644000175000002070000000626013441742745030037 0ustar00jvanekmock00000000000000/* SecurityDialogMessage.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.security.cert.X509Certificate; import java.util.concurrent.Semaphore; import javax.swing.JDialog; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.security.SecurityDialogs.DialogType; import net.sourceforge.jnlp.security.dialogresults.DialogResult; /** * Represents a message to the security framework to show a specific security * dialog */ public final class SecurityDialogMessage { public SecurityDialogMessage(JNLPFile file) { this.file = file; } /* * These fields contain information need to display the correct dialog type */ public DialogType dialogType; public AccessType accessType; //all informations dilaogs needs are in file. //The only known exception is, and should remain, showAuthenicationPrompt public final JNLPFile file; public CertVerifier certVerifier; public X509Certificate certificate; public Object[] extras; /* * Volatile because this is shared between threads and we dont want threads * to use a cached value of this. */ public volatile DialogResult userResponse; /* * These two fields are used to block/unblock the application or the applet. * If either of them is not null, call release() or dispose() on it to allow * the application/applet to continue. */ public Semaphore lock; //if dialog slip out of awt thread, fake modal dialog is created. This is keeping it. public JDialog toDispose; } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/ConnectionFactory.java0000644000000000000000000000013113441742745026415 xustar0030 mtime=1552401893.033832835 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/ConnectionFactory.java0000644000175000002070000001153513441742745027233 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import javax.net.ssl.HttpsURLConnection; import net.sourceforge.jnlp.util.logging.OutputController; public class ConnectionFactory { private final List httpsConnections = new ArrayList<>(); private boolean isSyncForced() { return false; } public static ConnectionFactory getConnectionFactory() { return ConnectionFactoryHolder.INSTANCE; } private static class ConnectionFactoryHolder { //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom private static volatile ConnectionFactory INSTANCE = new ConnectionFactory(); } public URLConnection openConnection(URL url) throws IOException { OutputController.getLogger().log("Connecting " + url.toExternalForm()); if (url.getProtocol().equalsIgnoreCase("https")) { if (isSyncForced()) { OutputController.getLogger().log("Waiting for " + httpsConnections.size() + " connections to finish"); while (!httpsConnections.isEmpty()) { try { Thread.sleep(100); } catch (InterruptedException ex) { throw new IOException(ex); } } } return openHttpsConnection(url); } else { URLConnection conn = url.openConnection(); OutputController.getLogger().log("done " + url.toExternalForm()); return conn; } } private synchronized URLConnection openHttpsConnection(URL url) throws IOException { URLConnection conn = null; conn = url.openConnection(); OutputController.getLogger().log("Adding " + conn.toString()); httpsConnections.add(conn); OutputController.getLogger().log("done " + url.toExternalForm()); return conn; } public void disconnect(URLConnection conn) { if (conn != null) { OutputController.getLogger().log("Disconnecting " + conn.toString()); if (conn instanceof HttpsURLConnection) { closeHttpsConnection((HttpsURLConnection) conn); } else { if (conn instanceof HttpURLConnection) { ((HttpURLConnection) conn).disconnect(); } } } else { OutputController.getLogger().log("\"Disconnecting\" null connection. This is ok if you are offline."); } } private synchronized void closeHttpsConnection(HttpsURLConnection conn) { conn.disconnect(); //this s intentional search by object value. equals do not work for (int i = 0; i < httpsConnections.size(); i++) { URLConnection urlConnection = httpsConnections.get(i); if (urlConnection == conn) { httpsConnections.remove(i); OutputController.getLogger().log("Removed " + urlConnection.toString()); i--; } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/SecurityUtil.java0000644000000000000000000000013113441742745025433 xustar0030 mtime=1552401893.036832829 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/SecurityUtil.java0000644000175000002070000003511713441742745026253 0ustar00jvanekmock00000000000000/* SecurityUtil.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.security.Key; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import javax.net.ssl.KeyManagerFactory; import net.sourceforge.jnlp.security.KeyStores.Level; import net.sourceforge.jnlp.security.KeyStores.Type; import net.sourceforge.jnlp.util.logging.OutputController; public class SecurityUtil { public static String getTrustedCertsFilename() throws Exception { return KeyStores.getKeyStoreLocation(Level.USER, Type.CERTS).getFullPath(); } /** * Extracts the CN field from a Certificate principal string. Or, if it * can't find that, return the principal unmodified. * * This is a simple (and hence 'wrong') version. See * http://www.ietf.org/rfc/rfc2253.txt for all the gory details. * @param principal string, CN to be extracted from * @return extracted CN */ public static String getCN(String principal) { /* * FIXME Incomplete * * This does not implement RFC 2253 completely * * Issues: * - rfc2253 talks about utf8, java uses utf16. * - theoretically, java should have dealt with all byte encodings * so we shouldnt even see cases like \FF * - if the above is wrong, then we need to deal with cases like * \FF\FF */ int start = principal.indexOf("CN="); if (start == -1) { return principal; } StringBuilder commonName = new StringBuilder(); boolean inQuotes = false; boolean escaped = false; /* * bit 0 = high order bit. bit 1 = low order bit */ char[] hexBits = null; for (int i = start + 3; i < principal.length(); i++) { char ch = principal.charAt(i); switch (ch) { case '"': if (escaped) { commonName.append(ch); escaped = false; } else { inQuotes = !inQuotes; } break; case '\\': if (escaped) { commonName.append(ch); escaped = false; } else { escaped = true; } break; case ',': /* fall through */ case ';': /* fall through */ case '+': if (escaped || inQuotes) { commonName.append(ch); if (escaped) { escaped = false; } } else { return commonName.toString(); } break; default: if (escaped && isHexDigit(ch)) { hexBits = new char[2]; hexBits[0] = ch; } else if (hexBits != null) { if (!isHexDigit(ch)) { /* error parsing */ return ""; } hexBits[1] = ch; commonName.append((char) Integer.parseInt(new String(hexBits), 16)); hexBits = null; } else { commonName.append(ch); } escaped = false; } } return commonName.toString(); } private static boolean isHexDigit(char ch) { return ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')); } /** * Checks the user's home directory to see if the trusted.certs file exists. * If it does not exist, it tries to create an empty keystore. * @return true if the trusted.certs file exists or a new trusted.certs * was created successfully, otherwise false. * @throws java.lang.Exception if check goes wrong */ public static boolean checkTrustedCertsFile() throws Exception { File certFile = new File(getTrustedCertsFilename()); //file does not exist if (!certFile.isFile()) { File dir = certFile.getAbsoluteFile().getParentFile(); boolean madeDir = false; if (!dir.isDirectory()) { madeDir = dir.mkdirs(); } //made directory, or directory exists if (madeDir || dir.isDirectory()) { KeyStore ks = KeyStore.getInstance("JKS"); loadKeyStore(ks, null); storeKeyStore(ks, certFile); return true; } else { return false; } } else { return true; } } /** * @return the keystore associated with the user's trusted.certs file, * or null otherwise. * @throws java.lang.Exception if getting fails */ public static KeyStore getUserKeyStore() throws Exception { KeyStore ks = null; FileInputStream fis = null; if (checkTrustedCertsFile()) { try { File file = new File(getTrustedCertsFilename()); if (file.exists()) { ks = KeyStore.getInstance("JKS"); loadKeyStore(ks, file); } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); throw e; } finally { if (fis != null) fis.close(); } } return ks; } /** * @return the keystore associated with the JDK cacerts file, * or null otherwise. * @throws java.lang.Exception if get fails */ public static KeyStore getCacertsKeyStore() throws Exception { KeyStore caks = null; FileInputStream fis = null; try { File file = new File(System.getProperty("java.home") + "/lib/security/cacerts"); if (file.exists()) { fis = new FileInputStream(file); caks = KeyStore.getInstance("JKS"); caks.load(fis, null); } } catch (Exception e) { caks = null; } finally { if (fis != null) fis.close(); } return caks; } /** * @return the keystore associated with the system certs file, * or null otherwise. * @throws java.lang.Exception if get goes wrong */ public static KeyStore getSystemCertStore() throws Exception { KeyStore caks = null; FileInputStream fis = null; try { File file = new File(System.getProperty("javax.net.ssl.trustStore")); String type = System.getProperty("javax.net.ssl.trustStoreType"); //String provider = "SUN"; char[] password = System.getProperty( "javax.net.ssl.trustStorePassword").toCharArray(); if (file.exists()) { fis = new FileInputStream(file); caks = KeyStore.getInstance(type); caks.load(fis, password); } } catch (Exception e) { caks = null; } finally { if (fis != null) fis.close(); } return caks; } public static void initKeyManagerFactory(KeyManagerFactory kmf, KeyStore ks) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException { try { KeystorePasswordAttempter.INSTANCE.unlockKeystore( new KeystorePasswordAttempter.KeystoreOperation(kmf, ks) { @Override String getId() { return "'init keymanager-factory'"; } @Override Key operateKeystore(char[] pass) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, IOException, CertificateException { kmf.init(ks, pass); return null; } }); } catch (IOException | CertificateException ex) { throw unexpectedException(ex); } } public static void setKeyEntry(KeyStore ks, String alias, Key key, Certificate[] certChain) throws KeyStoreException { try { KeystorePasswordAttempter.INSTANCE.unlockKeystore( new KeystorePasswordAttempter.KeystoreOperation(ks, alias, key, certChain) { @Override String getId() { return "'set key entry'"; } @Override Key operateKeystore(char[] pass) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, IOException, CertificateException { ks.setKeyEntry(alias, key, pass, certChain); return null; } }); } catch (NoSuchAlgorithmException | UnrecoverableKeyException | IOException | CertificateException ex) { throw unexpectedException(ex); } } public static Key getKey(KeyStore ks, String alias) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException { try { return KeystorePasswordAttempter.INSTANCE.unlockKeystore( new KeystorePasswordAttempter.KeystoreOperation(ks, alias, null, null) { @Override String getId() { return "'get key'"; } @Override Key operateKeystore(char[] pass) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, IOException, CertificateException { return ks.getKey(alias, pass); } }); } catch (IOException | CertificateException ex) { throw unexpectedException(ex); } } public static void loadKeyStore(KeyStore ks, File f) throws IOException, NoSuchAlgorithmException, CertificateException { try { KeystorePasswordAttempter.INSTANCE.unlockKeystore( new KeystorePasswordAttempter.KeystoreOperation(ks, f) { @Override String getId() { return "'load keystore'"; } @Override Key operateKeystore(char[] pass) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, IOException, CertificateException { if (f == null) { ks.load(null, pass); } else { try (FileInputStream fis = new FileInputStream(f)) { ks.load(fis, pass); } } return null; } }); } catch (KeyStoreException | UnrecoverableKeyException ex) { throw unexpectedException(ex); } } public static void storeKeyStore(KeyStore ks, File f) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException { try { KeystorePasswordAttempter.INSTANCE.unlockKeystore( new KeystorePasswordAttempter.KeystoreOperation(ks, f) { @Override String getId() { return "'store keystore'"; } @Override Key operateKeystore(char[] pass) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, IOException, CertificateException { if (f == null) { ks.store(null, pass); } else { try (FileOutputStream fos = new FileOutputStream(f)) { ks.store(fos, pass); } } return null; } }); } catch (UnrecoverableKeyException ex) { throw unexpectedException(ex); } } private static RuntimeException unexpectedException(Exception ex) { return new RuntimeException("This usage of KeystorePasswordAttempter shopuld not throw this kind of exception", ex); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/JNLPAuthenticator.java0000644000000000000000000000013113441742745026264 xustar0030 mtime=1552401893.036832829 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/JNLPAuthenticator.java0000644000175000002070000000522513441742745027101 0ustar00jvanekmock00000000000000/* JNLPAuthenticator Copyright (C) 2008 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.net.Authenticator; import java.net.PasswordAuthentication; import net.sourceforge.jnlp.security.dialogresults.NamePassword; public class JNLPAuthenticator extends Authenticator { @Override public PasswordAuthentication getPasswordAuthentication() { // No security check is required here, because the only way to set // parameters for which auth info is needed // (Authenticator:requestPasswordAuthentication()), has a security check String type = this.getRequestorType() == RequestorType.PROXY ? "proxy" : "web"; String host = getRequestingHost(); int port = getRequestingPort(); String prompt = getRequestingPrompt(); NamePassword response = SecurityDialogs.showAuthenicationPrompt(host, port, prompt, type); if (response == null) { return null; } else { return new PasswordAuthentication(response.getName(), response.getPassword()); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/SecurityDialogMessageHandler.java0000644000000000000000000000013113441742745030520 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java0000644000175000002070000003163113441742745031335 0ustar00jvanekmock00000000000000/* SecurityDialogMessageHandler.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.io.IOException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletTrustConfirmation; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogs.CertWarningPane; import net.sourceforge.jnlp.security.dialogs.remember.RememberDialog; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import net.sourceforge.jnlp.security.dialogs.remember.SavedRememberAction; import sun.awt.AppContext; import net.sourceforge.jnlp.util.logging.OutputController; /** * Handles {@link SecurityDialogMessage}s and shows appropriate security * dialogs. *

    * In the current architecture, {@link SecurityDialog}s are shown from a * different {@link AppContext} than the {@link AppContext} that asks for a * security prompt. This ensures that all security prompts are isolated and * their Look and Feel is not affected by the Look and Feel of the * applet/application. *

    *

    * This class contains allows a client application to post a * {@link SecurityDialogMessage}. When this class finds a security message in * the queue, it shows a security warning to the user, and sets * {@link SecurityDialogMessage#userResponse} to the appropriate value. *

    */ public class SecurityDialogMessageHandler implements Runnable { /** the queue of incoming messages to show security dialogs */ private BlockingQueue queue = new LinkedBlockingQueue<>(); /** * Runs the message handler loop. This waits for incoming security messages * and shows a security dialog. */ @Override public void run() { OutputController.getLogger().log("Starting security dialog thread"); while (true) { try { SecurityDialogMessage msg = queue.take(); handleMessage(msg); } catch (InterruptedException e) { } } } /** * Handles a single {@link SecurityDialogMessage} by showing a * {@link SecurityDialog}. *

    * Once the user has made a choice the * {@link SecurityDialogMessage#toDispose} (if not null) is disposed and * {@link SecurityDialogMessage#lock} (in not null) is released. *

    * * @param message the message indicating what type of security dialog to * show */ protected void handleMessage(final SecurityDialogMessage message) { final SecurityDialog dialog = new SecurityDialog(message.dialogType, message.accessType, message.file, message.certVerifier, message.certificate, message.extras); if (processAutomatedAnswers(message, dialog)){ return; } final RememberableDialog found = RememberDialog.getInstance().findRememberablePanel(dialog.getSecurityDialogPanel()); SavedRememberAction action = null; if (found!=null){ action = RememberDialog.getInstance().getRememberedState(found); } if (action != null && action.isRemember()) { message.userResponse = found.readValue(action.getSavedValue()); UnsignedAppletTrustConfirmation.updateAppletAction(found.getFile(), action, null, (Class) found.getClass()); unlockMessagesClient(message); } else { if (!shouldPromptUser()) { message.userResponse = dialog.getDefaultNegativeAnswer(); unlockMessagesClient(message); } else if (isHeadless()) { processMessageInHeadless(dialog, message); } else { processMessageInGui(dialog, found, message); } } } private boolean processAutomatedAnswers(final SecurityDialogMessage message, final SecurityDialog dialog) { if (isXtrustNone()) { message.userResponse = dialog.getDefaultNegativeAnswer(); unlockMessagesClient(message); return true; } if (isXtrustAll()) { message.userResponse = dialog.getDefaultPositiveAnswer(); unlockMessagesClient(message); return true; } return false; } private void processMessageInGui(final SecurityDialog dialog, final RememberableDialog found, final SecurityDialogMessage message) { dialog.getViwableDialog().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (found == null) { message.userResponse = dialog.getValue(); } else { message.userResponse = found.getValue(); RememberDialog.getInstance().setOrUpdateRememberedState(dialog); } unlockMessagesClient(message); } }); dialog.getViwableDialog().show(); } private void processMessageInHeadless(final SecurityDialog dialog, final SecurityDialogMessage message) { try { boolean keepGoing = true; boolean repeatAll = true; do { try { if (repeatAll){ OutputController.getLogger().printOutLn(dialog.getText()); } OutputController.getLogger().printOutLn(Translator.R("HeadlessDialogues")); OutputController.getLogger().printOutLn(dialog.helpToStdIn()); String s = OutputController.getLogger().readLine(); if (s == null) { throw new IOException("Stream closed"); } if (s.trim().toLowerCase().equals("exit")) { JNLPRuntime.exit(0); } boolean codebase = false; boolean remember = false; if (s.startsWith("RC ")){ codebase = true; remember = true; s=s.substring(3); } if (s.startsWith("R ")){ remember = true; s=s.substring(2); } message.userResponse = dialog.readFromStdIn(s); keepGoing = false; try { String value = BasicDialogValue.writeNUll(); if (message.userResponse != null) { value = message.userResponse.writeValue(); } if (dialog.getSecurityDialogPanel() instanceof CertWarningPane) { CertWarningPane cp = (CertWarningPane) (dialog.getSecurityDialogPanel()); if (remember) { cp.saveCert(); } } RememberDialog.getInstance().setOrUpdateRememberedState(dialog, codebase, new SavedRememberAction(RememberDialog.createAction(remember, message.userResponse), value)); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, ex); } } catch (IOException eex) { OutputController.getLogger().log(eex); keepGoing = false; } catch (IllegalArgumentException eeex){ OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, eeex.toString()); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, eeex); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("HDwrongValue")); repeatAll = false; } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, ex.toString()); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); repeatAll = true; } } while (keepGoing); } finally { unlockMessagesClient(message); } } protected void unlockMessagesClient(final SecurityDialogMessage msg) { /* Allow the client to continue on the other side */ if (msg.toDispose != null) { msg.toDispose.dispose(); } if (msg.lock != null) { msg.lock.release(); } } /** * Post a message to the security event queue. This message will be picked * up by the security thread and used to show the appropriate security * dialog. *

    * Once the user has made a choice the * {@link SecurityDialogMessage#toDispose} (if not null) is disposed and * {@link SecurityDialogMessage#lock} (in not null) is released. *

    * * @param message indicates the type of security dialog to show */ public void postMessage(SecurityDialogMessage message) { try { queue.put(message); } catch (InterruptedException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } /** * Returns whether the current runtime configuration allows prompting user * for security warnings. * * @return true if security warnings should be shown to the user. */ private static boolean shouldPromptUser() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { return Boolean.valueOf(JNLPRuntime.getConfiguration() .getProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER)); } }); } /** * Returns whether the current runtime configuration is headless * * @return true X is used */ private static boolean isHeadless() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { return JNLPRuntime.isHeadless(); } }); } /** * Returns whether the current runtime configuration is trustAll * * @return true if xtrustall was specified */ private static boolean isXtrustAll() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { return JNLPRuntime.isTrustAll(); } }); } /** * Returns whether the current runtime configuration is trustNone * * @return true if xtrustnone was specified */ private static boolean isXtrustNone() { return AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { return JNLPRuntime.isTrustNone(); } }); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/HttpsCertVerifier.java0000644000000000000000000000013113441742745026402 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/HttpsCertVerifier.java0000644000175000002070000001771313441742745027224 0ustar00jvanekmock00000000000000/* HttpsCertVerifier.java Copyright (C) 2009 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.IOException; import java.security.KeyStore; import java.security.cert.CertPath; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateFactory; import java.security.cert.CertificateNotYetValidException; import java.security.cert.CertificateParsingException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collection; import java.util.List; import net.sourceforge.jnlp.util.logging.OutputController; import sun.security.util.DerValue; import sun.security.util.HostnameChecker; import sun.security.x509.X500Name; public class HttpsCertVerifier implements CertVerifier { private X509Certificate[] chain; private String authType; private String hostName; private boolean isTrusted; private boolean hostMatched; private ArrayList details = new ArrayList(); public HttpsCertVerifier(X509Certificate[] chain, String authType, boolean isTrusted, boolean hostMatched, String hostName) { this.chain = chain; this.authType = authType; this.hostName = hostName; this.isTrusted = isTrusted; this.hostMatched = hostMatched; } @Override public boolean getAlreadyTrustPublisher() { return isTrusted; } /* XXX: Most of these methods have a CertPath param that should be passed * from the UI dialogs. However, this is not implemented yet so most of * the params are ignored. */ @Override public CertPath getCertPath(CertPath certPath) { // Parameter ignored. ArrayList list = new ArrayList(); for (int i = 0; i < chain.length; i++) list.add(chain[i]); ArrayList certPaths = new ArrayList(); try { certPaths.add(CertificateFactory.getInstance("X.509").generateCertPath(list)); } catch (CertificateException ce) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ce); // carry on } return certPaths.get(0); } @Override public List getDetails(CertPath certPath) { // Parameter ignored. boolean hasExpiredCert = false; boolean hasExpiringCert = false; boolean notYetValidCert = false; boolean isUntrusted = false; boolean CNMisMatch = !hostMatched; if (!getAlreadyTrustPublisher()) isUntrusted = true; for (int i = 0; i < chain.length; i++) { X509Certificate cert = chain[i]; long now = System.currentTimeMillis(); long SIX_MONTHS = 180 * 24 * 60 * 60 * 1000L; long notAfter = cert.getNotAfter().getTime(); if (notAfter < now) { hasExpiredCert = true; } else if (notAfter < now + SIX_MONTHS) { hasExpiringCert = true; } try { cert.checkValidity(); } catch (CertificateNotYetValidException cnyve) { notYetValidCert = true; } catch (CertificateExpiredException cee) { hasExpiredCert = true; } } String altNames = getNamesForCert(chain[0]); if (isUntrusted || hasExpiredCert || hasExpiringCert || notYetValidCert || CNMisMatch) { if (isUntrusted) addToDetails(R("SUntrustedCertificate")); if (hasExpiredCert) addToDetails(R("SHasExpiredCert")); if (hasExpiringCert) addToDetails(R("SHasExpiringCert")); if (notYetValidCert) addToDetails(R("SNotYetValidCert")); if (CNMisMatch) addToDetails(R("SCNMisMatch", altNames, this.hostName)); } return details; } private String getNamesForCert(X509Certificate c) { String names = ""; // We use the specification from // http://java.sun.com/j2se/1.5.0/docs/api/java/security/cert/X509Certificate.html#getSubjectAlternativeNames() // to determine the type of address int ALTNAME_DNS = 2; int ALTNAME_IP = 7; try { Collection> subjAltNames = c.getSubjectAlternativeNames(); X500Name subjectName = HostnameChecker.getSubjectX500Name(c); DerValue derValue = subjectName.findMostSpecificAttribute (X500Name.commonName_oid); names += derValue.getAsString(); if (subjAltNames != null) { for (List next : subjAltNames) { if (((Integer) next.get(0)).intValue() == ALTNAME_IP || ((Integer) next.get(0)).intValue() == ALTNAME_DNS) { names += ", " + (String) next.get(1); } } } if (subjAltNames != null) names = names.substring(2); // remove proceeding ", " } catch (CertificateParsingException cpe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, cpe); } catch (IOException ioe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ioe); } return names; } private void addToDetails(String detail) { if (!details.contains(detail)) details.add(detail); } @Override public Certificate getPublisher(CertPath certPath) { // Paramater ignored. if (chain.length > 0) return (Certificate) chain[0]; return null; } @Override public Certificate getRoot(CertPath certPath) { // Parameter ignored. if (chain.length > 0) return (Certificate) chain[chain.length - 1]; return null; } public boolean getRootInCacerts() { try { KeyStore[] caCertsKeyStores = KeyStores.getCAKeyStores(); return CertificateUtils.inKeyStores((X509Certificate) getRoot(null), caCertsKeyStores); } catch (Exception e) { } return false; } @Override public boolean hasSigningIssues(CertPath certPath) { return false; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/package-info.java0000644000000000000000000000013113441742745025312 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/package-info.java0000644000175000002070000002706013441742745026130 0ustar00jvanekmock00000000000000/* package-info.java Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.*/ /** *package generally about showing various security prompts *

    Following diagram shows how dialog is handled when some application/appelt needs to show it

    * *
    {@code
            ITW-thread(s)               | dialogs-thread                                                                                                                                  X
                                        |                                                                                                                                                 X
       presteps in SecurtyDialogs       |                                                                                                                                                 X
          # eg handle trustall/none     |                                                                                                                                                 X
                |                       |                                                                                                                                                 X
        prepare message                 |                                                                                                                                                 X
                   # set JNLPfile       |                                                                                                                                                 X
                   # set type of dialog |                                                                                                                                                 X
                       see              |                                                                                                                                                 X
                   # extrass...         |                                                                                                                                                 X
                   # lock               |                                                                                                                                                 X
                |                       |                                                                                                                                                 X
        post message to queue           |                                                                                                                                                 X
                | >------------------------------------> | <----------------------------------------------------------------------------------------------------------------------------| X
        wait for result from            |            read message from queue                                                                                                            | X
              getUserResponse(lock lock)|                |                                                                                                                              | X
                                        |            create instance of dialogue                                                                                                        | X
                                        |                |                                                                                                                              | X
                                        |            according to type of dialogue, create and place panel  (this is important, panel is keeper of rememberable decision)               | X
                                        |                |                                                                                                                              | X
                                        |            if panel is instance of RememberableDialog                                                                                         | X
                                        |              else                        then                                                                                                 | X
                                        |                |                          |                                                                                                   | X
                                        |                |                         check whether this applet+action was already stored and permanently remembered in .appletSecurity    | X
                                        |                |                          no                                                                        yes                       | X
                                        |                |<-------------------------|                                                                          |                        | X
                                        |                |                                                                                                     |                        | X
                                        |                |                                                                                                     |                        | X
                                        |                |                                                                                                     |                        | X
                                        |                |                                                                                                     |                        | X
                                        |            add closing and disposing listener(s) to button(s)                                                        |                        | X
                                        |                |     * set return value to listener?                                                                 |                        | X
                                        |                |                                                                                                     |                        | X
                                        |                      according to set value, set default selected button?                                            |                        | X
                                        |                |                                                                                                     |                        | X
                                        |            if his applet+action was already stored in .appletSecurity include text approved/denyed and when          |                        | X
                                        |                |                                                                                                     |                        | X
                                        |            wait for user to click button or close dialogue                                                          |                        | X
                                        |                |                                                                                                     |                        | X
                                        |                --> set selected value (via listener?) to message, dispose dialog -> <- set stored value to message <-|                        | X
                                        |                                                                                    |                                                          | X
                                        |                    if panel is instance of RememberableDialogue crate new, update old(date/decision,jars...) record in .appletSecurity        | X
                                        |                                                                                    |                                                          | X
                | <------------------------------------------------------------------------------------------< unlock lock of this message  >--------------------------------------------| X
      read result from message          |                                                                                                                                                 X
                |                       |                                                                                                                                                 X
       continue accordingly             |                                                                                                                                                 X
                                                                                                                                                                                          X
    }
     *
    * *

    How to make your dialog to be remembered

    *
      *
    • make your extension of SecurityPanel implementing RememberableDialog:
    • *
    *
    *
      *
    • RememberPanelResult getRemeberAction - if your dialogue uses RememberPanel, then you get RememberPanelResult for free
    • *
    • DialogResult getValue() - what your dialogue actually returns. If it is some simple Yes, No.. Then you can use existing types in dialogresults package. If it handles something more complex, you can inspire yourself in AccessWarningPaneComplexReturn
    • *
    • JNLPFile getFile() - ok, file keeps all needed to identify applet/app, so it is a must.
    • *
    • DialogResult readValue(String s) - the dialog must be able to read answer from String, which is supplied to it via engine. If you use some PrimitivesSubset extension, then it is mostly only static call its factory creator from String.
    • *
    *
    *This should be all. The value your type writeValue to file, is then stored under Key, which is your extension of SecurityPanel implementing RememberableDialog name * * */ package net.sourceforge.jnlp.security; icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/SecurityDialog.java0000644000000000000000000000013113441742745025715 xustar0030 mtime=1552401893.044832812 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/SecurityDialog.java0000644000175000002070000003707213441742745026537 0ustar00jvanekmock00000000000000/* SecurityDialog.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dialog.ModalityType; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.net.URL; import java.security.cert.X509Certificate; import javax.swing.JDialog; import java.awt.Window; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.security.SecurityDialogs.DialogType; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogs.AccessWarningPane; import net.sourceforge.jnlp.security.dialogs.AppletWarningPane; import net.sourceforge.jnlp.security.dialogs.CertWarningPane; import net.sourceforge.jnlp.security.dialogs.CertsInfoPane; import net.sourceforge.jnlp.security.dialogs.InetSecurity511Panel; import net.sourceforge.jnlp.security.dialogs.MissingALACAttributePanel; import net.sourceforge.jnlp.security.dialogs.MissingPermissionsAttributePanel; import net.sourceforge.jnlp.security.dialogs.MoreInfoPane; import net.sourceforge.jnlp.security.dialogs.PasswordAuthenticationPane; import net.sourceforge.jnlp.security.dialogs.SecurityDialogPanel; import net.sourceforge.jnlp.security.dialogs.SingleCertInfoPane; import net.sourceforge.jnlp.security.dialogs.ViwableDialog; import net.sourceforge.jnlp.security.dialogs.apptrustwarningpanel.AppTrustWarningDialog; import net.sourceforge.jnlp.util.logging.OutputController; /** * Provides methods for showing security warning dialogs for a wide range of * JNLP security issues. Note that the security dialogs should be running in the * secure AppContext - this class should not be used directly from an applet or * application. See {@link SecurityDialogs} for a way to show security dialogs. * * @author Joshua Sumali */ public class SecurityDialog { /** The type of dialog we want to show */ private final DialogType dialogType; /** The type of access that this dialog is for */ private final AccessType accessType; private SecurityDialogPanel panel; /** The application file associated with this security warning */ private final JNLPFile file; private final CertVerifier certVerifier; private final X509Certificate cert; /** An optional String array that's only necessary when a dialog * label requires some parameters (e.g. showing which address an application * is trying to connect to). */ private final Object[] extras; /** Whether or not this object has been fully initialized */ private boolean initialized = false; private DialogResult value; private ViwableDialog viwableDialog; /** Should show signed JNLP file warning */ private boolean requiresSignedJNLPWarning; SecurityDialog(DialogType dialogType, AccessType accessType, JNLPFile file, CertVerifier JarCertVerifier, X509Certificate cert, Object[] extras) { this.viwableDialog = new ViwableDialog(); this.dialogType = dialogType; this.accessType = accessType; this.file = file; this.certVerifier = JarCertVerifier; this.cert = cert; this.extras = extras; initialized = true; if(file != null) requiresSignedJNLPWarning= file.requiresSignedJNLPWarning(); initDialog(); } /** * Construct a SecurityDialog to display some sort of access warning */ private SecurityDialog(DialogType dialogType, AccessType accessType, JNLPFile file) { this(dialogType, accessType, file, null, null, null); } /** * Create a SecurityDialog to display a certificate-related warning */ private SecurityDialog(DialogType dialogType, AccessType accessType, JNLPFile file, CertVerifier certVerifier) { this(dialogType, accessType, file, certVerifier, null, null); } /** * Create a SecurityDialog to display a certificate-related warning */ private SecurityDialog(DialogType dialogType, AccessType accessType, CertVerifier certVerifier) { this(dialogType, accessType, null, certVerifier, null, null); } /** * Create a SecurityDialog to display some sort of access warning * with more information */ private SecurityDialog(DialogType dialogType, AccessType accessType, JNLPFile file, Object[] extras) { this(dialogType, accessType, file, null, null, extras); } /** * Create a SecurityWarningDailog to display information about a single * certificate */ private SecurityDialog(DialogType dialogType, X509Certificate c) { this(dialogType, null, null, null, c, null); } /** * Returns if this dialog has been fully initialized yet. * @return true if this dialog has been initialized, and false otherwise. */ public boolean isInitialized() { return initialized; } /** * Shows more information regarding jar code signing * * @param certVerifier the JarCertVerifier used to verify this application * @param parent the parent option pane */ public static void showMoreInfoDialog( CertVerifier certVerifier, SecurityDialog parent) { JNLPFile file= parent.getFile(); SecurityDialog dialog = new SecurityDialog(DialogType.MORE_INFO, null, file, certVerifier); dialog.getViwableDialog().setModalityType(ModalityType.APPLICATION_MODAL); dialog.getViwableDialog().show(); dialog.getViwableDialog().dispose(); } /** * Displays CertPath information in a readable table format. * * @param certVerifier the JarCertVerifier used to verify this application * @param parent the parent option pane */ public static void showCertInfoDialog(CertVerifier certVerifier, Component parent) { SecurityDialog dialog = new SecurityDialog(DialogType.CERT_INFO, null, null, certVerifier); dialog.getViwableDialog().setLocationRelativeTo(parent); dialog.getViwableDialog().setModalityType(ModalityType.APPLICATION_MODAL); dialog.getViwableDialog().show(); dialog.getViwableDialog().dispose(); } /** * Displays a single certificate's information. * * @param c the X509 certificate. * @param parent the parent pane. */ public static void showSingleCertInfoDialog(X509Certificate c, Window parent) { SecurityDialog dialog = new SecurityDialog(DialogType.SINGLE_CERT_INFO, c); dialog.getViwableDialog().setLocationRelativeTo(parent); dialog.getViwableDialog().setModalityType(ModalityType.APPLICATION_MODAL); dialog.getViwableDialog().show(); dialog.getViwableDialog().dispose(); } private void initDialog() { String dialogTitle = createTitle(); // Note: ViwableDialog methods are defered until show(): getViwableDialog().setTitle(dialogTitle); getViwableDialog().setModalityType(ModalityType.MODELESS); getViwableDialog().setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); // Initialize panel now as its constructor may call getViwableDialog() defered methods // to modify dialog state: SwingUtils.invokeAndWait(new Runnable() { @Override public void run() { installPanel(); } }); getViwableDialog().pack(); getViwableDialog().centerDialog(); WindowAdapter adapter = new WindowAdapter() { private boolean gotFocus = false; @Override public void windowGainedFocus(WindowEvent we) { // Once window gets focus, set initial focus if (!gotFocus) { selectDefaultButton(); gotFocus = true; } } @Override public void windowOpened(WindowEvent e) { getViwableDialog().setResizable(true); SecurityDialog.this.setValue(null); } @Override public void windowClosed(WindowEvent e) { // called if the user closes the window directly (dispose on close) // always dispose() to unlock message processing getViwableDialog().dispose(); } }; getViwableDialog().addWindowListener(adapter); getViwableDialog().addWindowFocusListener(adapter); } private String createTitle() { return createTitle(dialogType, accessType); } private static String createTitle(DialogType dtype, AccessType atype) { String dialogTitle = ""; if (dtype == DialogType.CERT_WARNING) { if (atype == AccessType.VERIFIED) dialogTitle = "Security Approval Required"; else dialogTitle = "Security Warning"; } else if (dtype == DialogType.MORE_INFO) dialogTitle = "More Information"; else if (dtype == DialogType.CERT_INFO) dialogTitle = "Details - Certificate"; else if (dtype == DialogType.ACCESS_WARNING) dialogTitle = "Security Warning"; else if (dtype == DialogType.APPLET_WARNING) dialogTitle = "Applet Warning"; else if (dtype == DialogType.PARTIALLYSIGNED_WARNING) dialogTitle = "Security Warning"; else if (dtype == DialogType.AUTHENTICATION) dialogTitle = "Authentication Required"; return dialogTitle; } public AccessType getAccessType() { return accessType; } public JNLPFile getFile() { return file; } public CertVerifier getCertVerifier() { return certVerifier; } public X509Certificate getCert() { return cert; } /* * find appropriate JPanel to this Dialog, based on {@link DialogType}. */ private SecurityDialogPanel getPanel() { return getPanel(this); } /* * find appropriate JPanel to given Dialog, based on {@link DialogType}. */ static SecurityDialogPanel getPanel(SecurityDialog sd) { return getPanel(sd.dialogType, sd); } static SecurityDialogPanel getPanel(DialogType type, SecurityDialog sd) { SecurityDialogPanel lpanel = null; if (type == DialogType.CERT_WARNING) { lpanel = new CertWarningPane(sd, sd.certVerifier, (SecurityDelegate) sd.extras[0]); } else if (type == DialogType.MORE_INFO) { lpanel = new MoreInfoPane(sd, sd.certVerifier); } else if (type == DialogType.CERT_INFO) { lpanel = new CertsInfoPane(sd, sd.certVerifier); } else if (type == DialogType.SINGLE_CERT_INFO) { lpanel = new SingleCertInfoPane(sd, sd.certVerifier); } else if (type == DialogType.ACCESS_WARNING) { lpanel = new AccessWarningPane(sd, sd.extras, sd.certVerifier); } else if (type == DialogType.APPLET_WARNING) { lpanel = new AppletWarningPane(sd, sd.certVerifier); } else if (type == DialogType.PARTIALLYSIGNED_WARNING) { lpanel = AppTrustWarningDialog.partiallySigned(sd, sd.file, (SecurityDelegate) sd.extras[0]); } else if (type == DialogType.UNSIGNED_WARNING) { lpanel = AppTrustWarningDialog.unsigned(sd, sd.file); // Only necessary for applets on 'high security' or above } else if (type == DialogType.AUTHENTICATION) { lpanel = new PasswordAuthenticationPane(sd, sd.extras); } else if (type == DialogType.UNSIGNED_EAS_NO_PERMISSIONS_WARNING) { lpanel = new MissingPermissionsAttributePanel(sd, sd.file.getTitle(), sd.file.getNotNullProbalbeCodeBase().toExternalForm()); } else if (type == DialogType.MISSING_ALACA) { lpanel = new MissingALACAttributePanel(sd, sd.file.getTitle(), (String) sd.extras[0], (String) sd.extras[1]); } else if (type == DialogType.MATCHING_ALACA) { lpanel = AppTrustWarningDialog.matchingAlaca(sd, sd.file, (String) sd.extras[0], (String) sd.extras[1]); } else if (type == DialogType.SECURITY_511) { lpanel = new InetSecurity511Panel(sd, (URL) sd.extras[0]); } else { throw new RuntimeException("Unknown value of " + sd.dialogType + ". Panel will be null. Tahts not allowed."); } return lpanel; } /* * Adds the appropriate JPanel to this Dialog, based on {@link DialogType}. */ private void installPanel() { panel = getPanel(); getViwableDialog().add(panel, BorderLayout.CENTER); } private void selectDefaultButton() { if (panel == null) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "initial value panel is null"); } else { panel.requestFocusOnDefaultButton(); } } public void setValue(DialogResult value) { OutputController.getLogger().log("Setting value:" + value); this.value = value; } public DialogResult getValue() { OutputController.getLogger().log("Returning value:" + value); return value; } public boolean requiresSignedJNLPWarning() { return requiresSignedJNLPWarning; } DialogResult getDefaultNegativeAnswer() { return panel.getDefaultNegativeAnswer(); } DialogResult getDefaultPositiveAnswer() { return panel.getDefaultPositiveAnswer(); } String getText() { return panel.getText(); } DialogResult readFromStdIn(String what){ return panel.readFromStdIn(what); } String helpToStdIn(){ return panel.helpToStdIn(); } public ViwableDialog getViwableDialog() { return viwableDialog; } public SecurityDialogPanel getSecurityDialogPanel(){ return panel; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/CertificateUtils.java0000644000000000000000000000013113441742745026231 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/CertificateUtils.java0000644000175000002070000002033713441742745027047 0ustar00jvanekmock00000000000000/* CertificateUtils.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.math.BigInteger; import java.security.Key; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.Enumeration; import java.util.Random; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.replacements.BASE64Encoder; /** * Common utilities to manipulate certificates. Provides methods to add * Certificates to a KeyStores, check if certificates already exist in a * KeyStore and printing certificates. */ public class CertificateUtils { /** * Adds the X509Certficate in the file to the KeyStore. Note that it does * not update the copy of the KeyStore on disk. * @param file file with certificate * @param ks keystore to save to * @throws java.security.cert.CertificateException if certificate is wrong * @throws java.io.IOException if IO fails * @throws java.security.KeyStoreException if keystore fails */ public static final void addToKeyStore(File file, KeyStore ks) throws CertificateException, IOException, KeyStoreException { OutputController.getLogger().log("Importing certificate from " + file + " into " + ks); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); CertificateFactory cf = CertificateFactory.getInstance("X509"); X509Certificate cert = null; try { cert = (X509Certificate) cf.generateCertificate(bis); } catch (ClassCastException cce) { throw new CertificateException("Input file is not an X509 Certificate", cce); } addToKeyStore(cert, ks); } /** * Adds an X509Certificate to the KeyStore. Note that it does not update the * copy of the KeyStore on disk. * @param cert certificate to import * @param ks keystore to save to * @throws java.security.KeyStoreException if keystore fails */ public static final void addToKeyStore(X509Certificate cert, KeyStore ks) throws KeyStoreException { OutputController.getLogger().log("Importing " + cert.getSubjectX500Principal().getName()); // does this certificate already exist? String alias = ks.getCertificateAlias(cert); if (alias != null) { return; } // create a unique alias for this new certificate Random random = new Random(); do { alias = new BigInteger(20, random).toString(); } while (ks.getCertificate(alias) != null); ks.setCertificateEntry(alias, cert); } public static void addPKCS12ToKeyStore(File file, KeyStore ks, char[] password) throws Exception { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); KeyStore keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(bis, password); Enumeration aliasList = keyStore.aliases(); while (aliasList.hasMoreElements()) { String alias = aliasList.nextElement(); Certificate[] certChain = keyStore.getCertificateChain(alias); Key key = keyStore.getKey(alias, password); addPKCS12ToKeyStore(certChain, key, ks); } } public static void addPKCS12ToKeyStore(Certificate[] certChain, Key key, KeyStore ks) throws KeyStoreException { // does this certificate already exist? String alias = ks.getCertificateAlias(certChain[0]); if (alias != null) { return; } // create a unique alias for this new certificate Random random = new Random(); do { alias = new BigInteger(20, random).toString(); } while (ks.getCertificate(alias) != null); SecurityUtil.setKeyEntry(ks, alias, key, certChain); } /** * Checks whether an X509Certificate is already in one of the keystores * @param c the certificate * @param keyStores the KeyStores to check in * @return true if the certificate is present in one of the keystores, false otherwise */ public static final boolean inKeyStores(X509Certificate c, KeyStore[] keyStores) { for (KeyStore keyStore : keyStores) { try { // Check against all certs Enumeration aliases = keyStore.aliases(); while (aliases.hasMoreElements()) { // Verify against this entry String alias = aliases.nextElement(); if (c.equals(keyStore.getCertificate(alias))) { OutputController.getLogger().log(Translator.R("LCertFoundIn", c.getSubjectX500Principal().getName(), KeyStores.getPathToKeystore(keyStore.hashCode()))); return true; } // else continue } }catch (KeyStoreException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); // continue } } return false; } /** * Writes the certificate in base64 encoded from to the print stream. * See http://tools.ietf.org/html/rfc4945#section-6.1 for more information * @param cert sertifcate to export * @param out stream to print it to * @throws java.io.IOException if io fails * @throws java.security.cert.CertificateException if certificate fails */ public static void dump(Certificate cert, PrintStream out) throws IOException, CertificateException { BASE64Encoder encoder = new BASE64Encoder(); out.println("-----BEGIN CERTIFICATE-----"); encoder.encodeBuffer(cert.getEncoded(), out); out.println("-----END CERTIFICATE-----"); } public static void dumpPKCS12(String alias, File file, KeyStore ks, char[] password) throws Exception { Certificate[] certChain = ks.getCertificateChain(alias); Key key = SecurityUtil.getKey(ks, alias); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); KeyStore keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(null, null); keyStore.setKeyEntry(alias, key, password, certChain); keyStore.store(bos, password); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/SecurityDialogs.java0000644000000000000000000000013113441742745026100 xustar0030 mtime=1552401893.036832829 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/SecurityDialogs.java0000644000175000002070000003712413441742745026720 0ustar00jvanekmock00000000000000/* SecurityDialogs.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.awt.Dialog.ModalityType; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.net.NetPermission; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Set; import java.util.concurrent.Semaphore; import javax.swing.JDialog; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.cache.Resource; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.dialogresults.AccessWarningPaneComplexReturn; import net.sourceforge.jnlp.security.dialogresults.DialogResult; import net.sourceforge.jnlp.security.dialogresults.NamePassword; import net.sourceforge.jnlp.security.dialogresults.YesCancel; import net.sourceforge.jnlp.security.dialogresults.YesNoSandbox; import net.sourceforge.jnlp.security.dialogresults.YesNoSandboxLimited; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; /** *

    * A factory for showing many possible types of security warning to the user. *

    *

    * This contains all the public methods that classes outside this package should * use instead of using {@link SecurityDialog} directly. *

    *

    * All of these methods post a message to the * {@link SecurityDialogMessageHandler} and block waiting for a response. *

    */ public class SecurityDialogs { /** * Types of dialogs we can create */ public static enum DialogType { CERT_WARNING, MORE_INFO, CERT_INFO, SINGLE_CERT_INFO, ACCESS_WARNING, PARTIALLYSIGNED_WARNING, UNSIGNED_WARNING, /* requires confirmation with 'high-security' setting */ APPLET_WARNING, AUTHENTICATION, UNSIGNED_EAS_NO_PERMISSIONS_WARNING, /* when Extended applet security is at High Security and no permission attribute is find, */ MISSING_ALACA, /*alaca - Application-Library-Allowable-Codebase Attribute*/ MATCHING_ALACA, SECURITY_511 } /** * The types of access which may need user permission. */ public static enum AccessType { READ_FILE, WRITE_FILE, CREATE_DESTKOP_SHORTCUT, CLIPBOARD_READ, CLIPBOARD_WRITE, PRINTER, NETWORK, VERIFIED, UNVERIFIED, PARTIALLYSIGNED, UNSIGNED, /* requires confirmation with 'high-security' setting */ SIGNING_ERROR } /** * Shows a warning dialog for different types of system access (i.e. file * open/save, clipboard read/write, printing, etc). * * @param accessType the type of system access requested. * @param file the jnlp file associated with the requesting application. * @param extras array of objects used as extra.toString or similarly later * @return true if permission was granted by the user, false otherwise. */ public static AccessWarningPaneComplexReturn showAccessWarningDialog(final AccessType accessType, final JNLPFile file, final Object[] extras) { final SecurityDialogMessage message = new SecurityDialogMessage(file); message.dialogType = DialogType.ACCESS_WARNING; message.accessType = accessType; message.extras = extras; return (AccessWarningPaneComplexReturn) getUserResponse(message); } /** * Shows a warning dialog for when a plugin applet is unsigned. This is used * with 'high-security' setting. * * @param file the file to be base as information source for this dialogue * @return true if permission was granted by the user, false otherwise. */ public static YesNoSandboxLimited showUnsignedWarningDialog(JNLPFile file) { final SecurityDialogMessage message = new SecurityDialogMessage(file); message.dialogType = DialogType.UNSIGNED_WARNING; message.accessType = AccessType.UNSIGNED; DialogResult r = getUserResponse(message); return (YesNoSandboxLimited) r; } /** * Shows a security warning dialog according to the specified type of * access. If {@code accessType} is one of {@link AccessType#VERIFIED} or * {@link AccessType#UNVERIFIED}, extra details will be available with * regards to code signing and signing certificates. * * @param accessType the type of warning dialog to show * @param file the JNLPFile associated with this warning * @param certVerifier the JarCertVerifier used to verify this application * @param securityDelegate the delegate for security atts. * * @return RUN if the user accepted the certificate, SANDBOX if the user * wants the applet to run with only sandbox permissions, or CANCEL if the * user did not accept running the applet */ public static YesNoSandbox showCertWarningDialog(AccessType accessType, JNLPFile file, CertVerifier certVerifier, SecurityDelegate securityDelegate) { final SecurityDialogMessage message = new SecurityDialogMessage(file); message.dialogType = DialogType.CERT_WARNING; message.accessType = accessType; message.certVerifier = certVerifier; message.extras = new Object[]{securityDelegate}; DialogResult selectedValue = getUserResponse(message); return (YesNoSandbox) selectedValue; } /** * Shows a warning dialog for when an applet or application is partially * signed. * * @param file the JNLPFile associated with this warning * @param certVerifier the JarCertVerifier used to verify this application * @param securityDelegate the delegate for security atts. * @return true if permission was granted by the user, false otherwise. */ public static YesNoSandbox showPartiallySignedWarningDialog(JNLPFile file, CertVerifier certVerifier, SecurityDelegate securityDelegate) { final SecurityDialogMessage message = new SecurityDialogMessage(file); message.dialogType = DialogType.PARTIALLYSIGNED_WARNING; message.accessType = AccessType.PARTIALLYSIGNED; message.certVerifier = certVerifier; message.extras = new Object[]{securityDelegate}; DialogResult r = getUserResponse(message); return (YesNoSandbox) r; } /** * Present a dialog to the user asking them for authentication information, * and returns the user's response. The caller must have * NetPermission("requestPasswordAuthentication") for this to work. * * @param host The host for with authentication is needed * @param port The port being accessed * @param prompt The prompt (realm) as presented by the server * @param type The type of server (proxy/web) * @return an array of objects representing user's authentication tokens * @throws SecurityException if the caller does not have the appropriate * permissions. */ public static NamePassword showAuthenicationPrompt(String host, int port, String prompt, String type) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { NetPermission requestPermission = new NetPermission("requestPasswordAuthentication"); sm.checkPermission(requestPermission); } final SecurityDialogMessage message = new SecurityDialogMessage(null); message.dialogType = DialogType.AUTHENTICATION; message.extras = new Object[]{host, port, prompt, type}; DialogResult response = getUserResponse(message); OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Decided action for matching alaca at was " + response); return (NamePassword) response; } public static boolean showMissingALACAttributePanel(JNLPFile file, URL codeBase, Set remoteUrls) { SecurityDialogMessage message = new SecurityDialogMessage(file); message.dialogType = DialogType.MISSING_ALACA; String urlToShow = file.getNotNullProbalbeCodeBase().toExternalForm(); if (codeBase != null) { urlToShow = codeBase.toString(); } else { OutputController.getLogger().log("Warning, null codebase wants to show in ALACA!"); } message.extras = new Object[]{urlToShow, UrlUtils.setOfUrlsToHtmlList(remoteUrls)}; DialogResult selectedValue = getUserResponse(message); OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Decided action for matching alaca at " + file.getCodeBase() + " was " + selectedValue); if (selectedValue == null) { return false; } return selectedValue.toBoolean(); } public static boolean showMatchingALACAttributePanel(JNLPFile file, URL documentBase, Set remoteUrls) { SecurityDialogMessage message = new SecurityDialogMessage(file); message.dialogType = DialogType.MATCHING_ALACA; String docBaseString = "null-documentbase"; if (documentBase != null) { docBaseString = documentBase.toString(); } message.extras = new Object[]{docBaseString, UrlUtils.setOfUrlsToHtmlList(remoteUrls)}; DialogResult selectedValue = getUserResponse(message); OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Decided action for matching alaca at " + file.getCodeBase() + " was " + selectedValue); if (selectedValue != null) { return selectedValue.toBoolean(); } return false; } public static boolean showMissingPermissionsAttributeDialogue(JNLPFile file) { SecurityDialogMessage message = new SecurityDialogMessage(file); message.dialogType = DialogType.UNSIGNED_EAS_NO_PERMISSIONS_WARNING; DialogResult selectedValue = getUserResponse(message); OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Decided action for missing permissions at " + file.getCodeBase() + " was " + selectedValue); if (selectedValue != null) { return selectedValue.toBoolean(); } return false; } /** * Posts the message to the SecurityThread and gets the response. Blocks * until a response has been recieved. It's safe to call this from an * EventDispatchThread. * * @param message the SecuritDialogMessage indicating what type of dialog to * display * @return The user's response. Can be null. The exact answer depends on the * type of message, but generally an Integer corresponding to the value 0 * indicates success/proceed, and everything else indicates failure */ private static DialogResult getUserResponse(final SecurityDialogMessage message) { /* * Want to show a security warning, while blocking the client * application. This would be easy except there is a bug in showing * modal JDialogs in a different AppContext. The source EventQueue - * that sends the message to the (destination) EventQueue which is * supposed to actually show the dialog - must not block. If the source * EventQueue blocks, the destination EventQueue stops responding. So we * have a hack here to work around it. */ /* * If this is the event dispatch thread the use the hack */ if (SwingUtils.isEventDispatchThread()) { /* * Create a tiny modal dialog (which creates a new EventQueue for * this AppContext, but blocks the original client EventQueue) and * then post the message - this makes the source EventQueue continue * running - but dot not allow the actual applet/application to * continue processing */ final JDialog fakeDialog = new JDialog(); fakeDialog.setName("FakeDialog"); SwingUtils.info(fakeDialog); fakeDialog.setSize(0, 0); fakeDialog.setResizable(false); fakeDialog.setModalityType(ModalityType.APPLICATION_MODAL); fakeDialog.addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { message.toDispose = fakeDialog; message.lock = null; AccessController.doPrivileged(new PrivilegedAction() { @Override public Void run() { JNLPRuntime.getSecurityDialogHandler().postMessage(message); return null; } }); } }); /* this dialog will be disposed/hidden when the user closes the security prompt */ fakeDialog.setVisible(true); } else { /* * Otherwise do it the normal way. Post a message to the security * thread to make it show the security dialog. Wait until it tells us * to proceed. */ message.toDispose = null; message.lock = new Semaphore(0); JNLPRuntime.getSecurityDialogHandler().postMessage(message); boolean done = false; while (!done) { try { message.lock.acquire(); done = true; } catch (InterruptedException e) { // ignore; retry } } } return message.userResponse; } // false = termiante ITW // true = continue public static boolean show511Dialogue(Resource r) { SecurityDialogMessage message = new SecurityDialogMessage(null); message.dialogType = DialogType.SECURITY_511; message.extras = new Object[]{r.getLocation()}; DialogResult selectedValue = getUserResponse(message); if (selectedValue != null && selectedValue.equals(YesCancel.cancel())) { return false; //kill command } return true; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/JNLPAppVerifier.java0000644000000000000000000000013113441742745025666 xustar0030 mtime=1552401893.035832831 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/JNLPAppVerifier.java0000644000175000002070000001374413441742745026510 0ustar00jvanekmock00000000000000/* JNLPAppVerifier.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import static net.sourceforge.jnlp.runtime.Translator.R; import java.security.cert.CertPath; import java.util.Map; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.security.dialogresults.BasicDialogValue; import net.sourceforge.jnlp.security.dialogresults.YesNoSandbox; import net.sourceforge.jnlp.tools.CertInformation; import net.sourceforge.jnlp.tools.JarCertVerifier; public class JNLPAppVerifier implements AppVerifier { @Override public boolean hasAlreadyTrustedPublisher( Map certs, Map signedJars) { int sumOfSignableEntries = JarCertVerifier.getTotalJarEntries(signedJars); for (CertInformation certInfo : certs.values()) { Map certSignedJars = certInfo.getSignedJars(); if (JarCertVerifier.getTotalJarEntries(certSignedJars) == sumOfSignableEntries && certInfo.isPublisherAlreadyTrusted()) { return true; } } return false; } @Override public boolean hasRootInCacerts(Map certs, Map signedJars) { int sumOfSignableEntries = JarCertVerifier.getTotalJarEntries(signedJars); for (CertInformation certInfo : certs.values()) { Map certSignedJars = certInfo.getSignedJars(); if (JarCertVerifier.getTotalJarEntries(certSignedJars) == sumOfSignableEntries && certInfo.isRootInCacerts()) { return true; } } return false; } @Override public boolean isFullySigned(Map certs, Map signedJars) { int sumOfSignableEntries = JarCertVerifier.getTotalJarEntries(signedJars); for (CertPath cPath : certs.keySet()) { // If this cert has signed everything, return true if (hasCompletelySignedApp(certs.get(cPath), sumOfSignableEntries)) { return true; } } // No cert found that signed all entries. Return false. return false; } @Override public void checkTrustWithUser(SecurityDelegate securityDelegate, JarCertVerifier jcv, JNLPFile file) throws LaunchException { int sumOfSignableEntries = JarCertVerifier.getTotalJarEntries(jcv.getJarSignableEntries()); for (CertPath cPath : jcv.getCertsList()) { jcv.setCurrentlyUsedCertPath(cPath); CertInformation info = jcv.getCertInformation(cPath); if (hasCompletelySignedApp(info, sumOfSignableEntries)) { if (info.isPublisherAlreadyTrusted()) { return; } AccessType dialogType; if (info.isRootInCacerts() && !info.hasSigningIssues()) { dialogType = AccessType.VERIFIED; } else if (info.isRootInCacerts()) { dialogType = AccessType.SIGNING_ERROR; } else { dialogType = AccessType.UNVERIFIED; } YesNoSandbox action = SecurityDialogs.showCertWarningDialog( dialogType, file, jcv, securityDelegate); if (action != null && action.toBoolean()) { if (action.compareValue(BasicDialogValue.Primitive.SANDBOX)) { securityDelegate.setRunInSandbox(); } return; } } } throw new LaunchException(null, null, R("LSFatal"), R("LCLaunching"), R("LCancelOnUserRequest"), ""); } /** * Find out if the CertPath with the given info has fully signed the app. * @param info The information regarding the CertPath in question * @param sumOfSignableEntries The total number of signable entries in the app. * @return True if the signer has fully signed this app. */ public boolean hasCompletelySignedApp(CertInformation info, int sumOfSignableEntries) { return JarCertVerifier.getTotalJarEntries(info.getSignedJars()) == sumOfSignableEntries; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/viewer0000644000000000000000000000013013441742745023346 xustar0030 mtime=1552401893.068832762 29 atime=1552410887.11418344 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/viewer/0000755000175000002070000000000013441742745024235 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/security/viewer/PaxHeaders.7406/CertificateViewer.java0000644000000000000000000000013113441742745027673 xustar0030 mtime=1552401893.068832762 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/viewer/CertificateViewer.java0000644000175000002070000000744013441742745030511 0ustar00jvanekmock00000000000000/* CertificateViewer.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.viewer; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.ScreenFinder; import net.sourceforge.swing.SwingUtils; public class CertificateViewer extends JFrame { private boolean initialized = false; private static final String dialogTitle = R("CVCertificateViewer"); CertificatePane panel; public CertificateViewer() { super(dialogTitle); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setName("CertificateViewer"); SwingUtils.info(this); setIconImages(ImageResources.INSTANCE.getApplicationImages()); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); panel = new CertificatePane(this); add(panel); pack(); WindowAdapter adapter = new WindowAdapter() { private boolean gotFocus = false; public void windowGainedFocus(WindowEvent we) { // Once window gets focus, set initial focus if (!gotFocus) { panel.focusOnDefaultButton(); gotFocus = true; } } }; addWindowFocusListener(adapter); initialized = true; } public boolean isInitialized() { return initialized; } private void centerDialog() { ScreenFinder.centerWindowsToCurrentScreen(this); } private static void showCertificateViewer() { JNLPRuntime.initialize(true); CertificateViewer cv = new CertificateViewer(); cv.setResizable(true); cv.centerDialog(); cv.setVisible(true); } public static void main(String[] args) throws Exception { SwingUtils.invokeAndWait(new Runnable() { @Override public void run() { CertificateViewer.showCertificateViewer(); } }); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/viewer/PaxHeaders.7406/CertificatePane.java0000644000000000000000000000013113441742745027315 xustar0030 mtime=1552401893.047832806 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java0000644000175000002070000005335113441742745030135 0ustar00jvanekmock00000000000000/* CertificatePane.java Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security.viewer; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; import java.io.PrintStream; import java.security.KeyStore; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextField; import java.awt.Window; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.table.DefaultTableModel; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.CertificateUtils; import net.sourceforge.jnlp.security.KeyStores; import net.sourceforge.jnlp.security.SecurityUtil; import net.sourceforge.jnlp.security.SecurityDialog; import net.sourceforge.jnlp.security.KeyStores.Level; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.OutputController; public class CertificatePane extends JPanel { /** * The certificates stored in the certificates file. */ private ArrayList certs = null; private static final Dimension TABLE_DIMENSION = new Dimension(500, 200); /** * "Issued To" and "Issued By" string pairs for certs. */ private String[][] issuedToAndBy = null; private final String[] columnNames = { R("CVIssuedTo"), R("CVIssuedBy") }; private final CertificateType[] certificateTypes = new CertificateType[] { new CertificateType(KeyStores.Type.CA_CERTS), new CertificateType(KeyStores.Type.JSSE_CA_CERTS), new CertificateType(KeyStores.Type.CERTS), new CertificateType(KeyStores.Type.JSSE_CERTS), new CertificateType(KeyStores.Type.CLIENT_CERTS) }; JTabbedPane tabbedPane; JTextField certPath = new JTextField(); private final JTable userTable; private final JTable systemTable; private JComboBox certificateTypeCombo; private KeyStores.Type currentKeyStoreType; private KeyStores.Level currentKeyStoreLevel; /** JComponents that should be disbled for system store */ private final List disableForSystem; private Window parent; private JComponent defaultFocusComponent = null; /** * The Current KeyStore. Only one table/tab is visible for interaction to * the user. This KeyStore corresponds to that. */ private KeyStores.KeyStoreWithPath keyStore = null; public CertificatePane(Window parent) { super(); this.parent = parent; userTable = new JTable(null); systemTable = new JTable(null); disableForSystem = new ArrayList<>(); addComponents(); currentKeyStoreType = ((CertificateType) (certificateTypeCombo.getSelectedItem())).getType(); if (tabbedPane.getSelectedIndex() == 0) { currentKeyStoreLevel = Level.USER; } else { currentKeyStoreLevel = Level.SYSTEM; } repopulateTables(); } /** * Reads the user's trusted.cacerts keystore. */ private void initializeKeyStore() { try { keyStore = KeyStores.getKeyStore(currentKeyStoreLevel, currentKeyStoreType); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } //create the GUI here. private void addComponents() { JPanel main = new JPanel(new BorderLayout()); JPanel certificateTypePanel = new JPanel(new BorderLayout()); certificateTypePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JLabel certificateTypeLabel = new JLabel(R("CVCertificateType")); certificateTypeCombo = new JComboBox<>(certificateTypes); certificateTypeCombo.addActionListener(new CertificateTypeListener()); certificateTypePanel.add(certificateTypeLabel, BorderLayout.LINE_START); certificateTypePanel.add(certificateTypeCombo, BorderLayout.CENTER); JPanel tablePanel = new JPanel(new BorderLayout()); // User Table DefaultTableModel userTableModel = new DefaultTableModel(issuedToAndBy, columnNames); userTable.setModel(userTableModel); userTable.getTableHeader().setReorderingAllowed(false); userTable.setFillsViewportHeight(true); JScrollPane userTablePane = new JScrollPane(userTable); userTablePane.setPreferredSize(TABLE_DIMENSION); userTablePane.setSize(TABLE_DIMENSION); userTablePane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // System Table DefaultTableModel systemTableModel = new DefaultTableModel(issuedToAndBy, columnNames); systemTable.setModel(systemTableModel); systemTable.getTableHeader().setReorderingAllowed(false); systemTable.setFillsViewportHeight(true); JScrollPane systemTablePane = new JScrollPane(systemTable); systemTablePane.setPreferredSize(TABLE_DIMENSION); systemTablePane.setSize(TABLE_DIMENSION); systemTablePane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); tabbedPane = new JTabbedPane(); tabbedPane.addTab(R("CVUser"), userTablePane); tabbedPane.addTab(R("CVSystem"), systemTablePane); tabbedPane.addChangeListener(new TabChangeListener()); JPanel buttonPanel = new JPanel(new FlowLayout()); String[] buttonNames = { R("CVImport"), R("CVExport"), R("CVRemove"), R("CVDetails") }; char[] buttonMnemonics = { KeyEvent.VK_I, KeyEvent.VK_E, KeyEvent.VK_M, KeyEvent.VK_D }; ActionListener[] listeners = { new ImportButtonListener(), new ExportButtonListener(), new RemoveButtonListener(), new DetailsButtonListener() }; JButton button; //get the max width int maxWidth = 0; for (int i = 0; i < buttonNames.length; i++) { button = new JButton(buttonNames[i]); maxWidth = Math.max(maxWidth, button.getMinimumSize().width); } for (int i = 0; i < buttonNames.length; i++) { button = new JButton(buttonNames[i]); button.setMnemonic(buttonMnemonics[i]); button.addActionListener(listeners[i]); button.setSize(maxWidth, button.getSize().height); // import and remove buttons if (i == 0 || i == 2) { disableForSystem.add(button); } buttonPanel.add(button); } tablePanel.add(tabbedPane, BorderLayout.CENTER); JPanel buttonPanelWrapper = new JPanel(new BorderLayout()); certPath.setEditable(false); buttonPanelWrapper.add(certPath, BorderLayout.CENTER); buttonPanelWrapper.add(buttonPanel, BorderLayout.EAST); tablePanel.add(buttonPanelWrapper, BorderLayout.SOUTH); main.add(certificateTypePanel, BorderLayout.NORTH); main.add(tablePanel, BorderLayout.CENTER); if (parent != null) { JPanel closePanel = new JPanel(new BorderLayout()); closePanel.setBorder(BorderFactory.createEmptyBorder(7, 7, 7, 7)); JButton closeButton = new JButton(R("ButClose")); closeButton.addActionListener(new CloseButtonListener()); defaultFocusComponent = closeButton; closePanel.add(closeButton, BorderLayout.EAST); JButton openAll = new JButton(R("ButLunchFullItwSettings")); openAll.addActionListener(new FullSettingsButtonListener()); closePanel.add(openAll, BorderLayout.WEST); main.add(closePanel, BorderLayout.SOUTH); } setLayout(new GridLayout(0,1)); add(main); } /** * Read in the optionPane's keystore to issuedToAndBy. */ private void readKeyStore() { Enumeration aliases = null; certs = new ArrayList<>(); try { //Get all of the X509Certificates and put them into an ArrayList aliases = keyStore.getKs().aliases(); while (aliases.hasMoreElements()) { Certificate c = keyStore.getKs().getCertificate(aliases.nextElement()); if (c instanceof X509Certificate) { certs.add((X509Certificate) c); } } //get the publisher and root information issuedToAndBy = new String[certs.size()][2]; for (int i = 0; i < certs.size(); i++) { X509Certificate c = certs.get(i); issuedToAndBy[i][0] = SecurityUtil.getCN(c.getSubjectX500Principal().getName()); issuedToAndBy[i][1] = SecurityUtil.getCN(c.getIssuerX500Principal().getName()); } } catch (Exception e) { // TODO handle exception OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } /** * Re-reads the certs file and repopulates the JTable. This is typically * called after a certificate was deleted from the keystore. */ private void repopulateTables() { initializeKeyStore(); readKeyStore(); try { File src = new File(keyStore.getPath()); File resolved = src.getCanonicalFile(); if (resolved.equals(src)) { certPath.setText(keyStore.getPath()); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, keyStore.getPath()); } else { certPath.setText(keyStore.getPath() + " -> " + resolved.getCanonicalPath()); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, keyStore.getPath() + " -> " + resolved.getCanonicalPath()); } } catch (Exception ex) { OutputController.getLogger().log(ex); } DefaultTableModel tableModel = new DefaultTableModel(issuedToAndBy, columnNames); userTable.setModel(tableModel); tableModel = new DefaultTableModel(issuedToAndBy, columnNames); systemTable.setModel(tableModel); } public void focusOnDefaultButton() { if (defaultFocusComponent != null) { defaultFocusComponent.requestFocusInWindow(); } } private char[] getPassword(final String label) { JPasswordField jpf = new JPasswordField(); int result = JOptionPane.showConfirmDialog(parent, new Object[]{label, jpf}, R("CVPasswordTitle"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE); if (result == JOptionPane.OK_OPTION) { return jpf.getPassword(); } return null; } /** Allows storing KeyStores.Types in a JComponent */ private static class CertificateType { private final KeyStores.Type type; public CertificateType(KeyStores.Type type) { this.type = type; } public KeyStores.Type getType() { return type; } @Override public String toString() { return KeyStores.toDisplayableString(null, type); } } /** Invoked when a user selects a different certificate type */ private class CertificateTypeListener implements ActionListener { @Override @SuppressWarnings("unchecked")//this is just certificateTypeCombo, nothing else public void actionPerformed(ActionEvent e) { JComboBox source = (JComboBox) e.getSource(); CertificateType type = (CertificateType) source.getSelectedItem(); currentKeyStoreType = type.getType(); repopulateTables(); } } /** * Invoked when a user selects a different tab (switches from user to system * or vice versa). Changes the currentKeyStore Enables or disables buttons. */ private class TabChangeListener implements ChangeListener { @Override public void stateChanged(ChangeEvent e) { JTabbedPane source = (JTabbedPane) e.getSource(); switch (source.getSelectedIndex()) { case 0: currentKeyStoreLevel = Level.USER; for (JComponent component : disableForSystem) { component.setEnabled(true); } break; case 1: currentKeyStoreLevel = Level.SYSTEM; for (JComponent component : disableForSystem) { component.setEnabled(false); } break; } repopulateTables(); } } private class ImportButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); int returnVal = chooser.showOpenDialog(parent); if (returnVal == JFileChooser.APPROVE_OPTION) { try { KeyStore ks = keyStore.getKs(); if (currentKeyStoreType == KeyStores.Type.CLIENT_CERTS) { char[] password = getPassword(R("CVImportPasswordMessage")); if (password != null) { CertificateUtils.addPKCS12ToKeyStore( chooser.getSelectedFile(), ks, password); } else { return; } } else { CertificateUtils.addToKeyStore(chooser.getSelectedFile(), ks); } File keyStoreFile = KeyStores.getKeyStoreLocation(currentKeyStoreLevel, currentKeyStoreType).getFile(); if (!keyStoreFile.isFile()) { FileUtils.createRestrictedFile(keyStoreFile, true); } SecurityUtil.storeKeyStore(ks, keyStoreFile); repopulateTables(); } catch (Exception ex) { // TODO: handle exception OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } } } } private class ExportButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { final JTable table ; if (currentKeyStoreLevel == Level.USER) { table = userTable; } else { table = systemTable; } //For now, let's just export in -rfc mode as keytool does. //we'll write to a file the exported certificate. try { int selectedRow = table.getSelectedRow(); if (selectedRow != -1) { JFileChooser chooser = new JFileChooser(); int returnVal = chooser.showOpenDialog(parent); if (returnVal == JFileChooser.APPROVE_OPTION) { String alias = keyStore.getKs().getCertificateAlias(certs .get(selectedRow)); if (alias != null) { if (currentKeyStoreType == KeyStores.Type.CLIENT_CERTS) { char[] password = getPassword(R("CVExportPasswordMessage")); if (password != null) { CertificateUtils.dumpPKCS12(alias, chooser.getSelectedFile(), keyStore.getKs(), password); } } else { Certificate c = keyStore.getKs().getCertificate(alias); PrintStream ps = new PrintStream(chooser.getSelectedFile().getAbsolutePath()); CertificateUtils.dump(c, ps); } repopulateTables(); } } } } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } } } private class RemoveButtonListener implements ActionListener { /** * Removes a certificate from the keyStore and writes changes to disk. */ @Override public void actionPerformed(ActionEvent e) { final JTable table; if (currentKeyStoreLevel == Level.USER) { table = userTable; } else { table = systemTable; } try { int selectedRow = table.getSelectedRow(); if (selectedRow != -1) { String alias = keyStore.getKs().getCertificateAlias(certs.get(selectedRow)); if (alias != null) { int i = JOptionPane.showConfirmDialog(parent, R("CVRemoveConfirmMessage"), R("CVRemoveConfirmTitle"), JOptionPane.YES_NO_OPTION); if (i == 0) { keyStore.getKs().deleteEntry(alias); File keyStoreFile = KeyStores.getKeyStoreLocation(currentKeyStoreLevel, currentKeyStoreType).getFile(); if (!keyStoreFile.isFile()) { FileUtils.createRestrictedFile(keyStoreFile, true); } SecurityUtil.storeKeyStore(keyStore.getKs(), keyStoreFile); } } repopulateTables(); } } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } } } private class DetailsButtonListener implements ActionListener { /** * Shows the details of a trusted certificate. */ @Override public void actionPerformed(ActionEvent e) { final JTable table; if (currentKeyStoreLevel == Level.USER) { table = userTable; } else { table = systemTable; } int selectedRow = table.getSelectedRow(); if (selectedRow != -1 && selectedRow >= 0) { X509Certificate c = certs.get(selectedRow); SecurityDialog.showSingleCertInfoDialog(c, parent); } } } private class CloseButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JNLPRuntime.exit(0); } } private class FullSettingsButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { try { net.sourceforge.jnlp.controlpanel.ControlPanel.main(new String[0]); parent.dispose(); } catch (Exception ex) { OutputController.getLogger().log(ex); JOptionPane.showMessageDialog(parent, ex); } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/VariableX509TrustManagerJDK7.java0000644000000000000000000000013113441742745030056 xustar0030 mtime=1552401893.042832816 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/VariableX509TrustManagerJDK7.java0000644000175000002070000001201213441742745030663 0ustar00jvanekmock00000000000000/* VariableX509TrustManagerJDK7.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.Socket; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import javax.net.ssl.X509ExtendedTrustManager; public class VariableX509TrustManagerJDK7 extends X509ExtendedTrustManager { private VariableX509TrustManager vX509TM = VariableX509TrustManager.getInstance(); @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { vX509TM.checkTrustClient(chain, authType, null /* hostname*/); } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { vX509TM.checkTrustServer(chain, authType, null /* hostname*/, null /* socket */, null /* engine */); } @Override public X509Certificate[] getAcceptedIssuers() { return vX509TM.getAcceptedIssuers(); } @Override public void checkClientTrusted(X509Certificate[] chain, String authType, Socket socket) throws CertificateException { checkTrustClient(chain, authType, socket, null); } @Override public void checkServerTrusted(X509Certificate[] chain, String authType, Socket socket) throws CertificateException { checkTrustServer(chain, authType, socket, null); } @Override public void checkClientTrusted(X509Certificate[] chain, String authType, SSLEngine engine) throws CertificateException { checkTrustClient(chain, authType, null, engine); } @Override public void checkServerTrusted(X509Certificate[] chain, String authType, SSLEngine engine) throws CertificateException { checkTrustServer(chain, authType, null, engine); } /** * Check if the server is trusted * * @param chain The cert chain * @param authType The auth type algorithm * @param socket the SSLSocket, may be null * @param engine the SSLEngine, may be null */ private void checkTrustServer(X509Certificate[] chain, String authType, Socket socket, SSLEngine engine) throws CertificateException { String hostName = null; if (socket != null) { hostName = ((SSLSocket) socket).getHandshakeSession().getPeerHost(); } else if (engine != null) { hostName = engine.getHandshakeSession().getPeerHost(); } vX509TM.checkTrustServer(chain, authType, hostName, (SSLSocket) socket, engine); } /** * Check if the client is trusted * * @param chain The cert chain * @param authType The auth type algorithm * @param socket the SSLSocket, if provided * @param engine the SSLEngine, if provided */ private void checkTrustClient(X509Certificate[] chain, String authType, Socket socket, SSLEngine engine) throws CertificateException { String hostName = null; if (socket != null) { hostName = ((SSLSocket) socket).getHandshakeSession().getPeerHost(); } else if (engine != null) { hostName = engine.getHandshakeSession().getPeerHost(); } vX509TM.checkTrustClient(chain, authType, hostName); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/KeystorePasswordAttempter.java0000644000000000000000000000013113441742745030204 xustar0030 mtime=1552401893.041832819 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/KeystorePasswordAttempter.java0000644000175000002070000002174213441742745031023 0ustar00jvanekmock00000000000000/* CertificatePane.java Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.io.File; import java.io.IOException; import java.security.Key; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.net.ssl.KeyManagerFactory; import javax.swing.JOptionPane; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.OutputController; class KeystorePasswordAttempter { private static final char[] DEFAULT_PASSWORD = "changeit".toCharArray(); private static char[] getTrustedCertsPassword() { return DEFAULT_PASSWORD; } static class SavedPassword { private final char[] pass; public SavedPassword(char[] pass) { this.pass = pass; } } /** * This password can read any keystore. But if you save with him, integrity * of keystore will be lsot for ever. */ static class AllmightyPassword extends SavedPassword { public AllmightyPassword() { super(null); } } static abstract class KeystoreOperation { protected final KeyManagerFactory kmf; protected final KeyStore ks; protected final String alias; protected final Key key; protected final Certificate[] certChain; protected final File f; public KeystoreOperation(KeyStore ks, File f) { this(null, ks, null, null, null, f); } public KeystoreOperation(KeyStore ks, String alias, Key key, Certificate[] certChain) { this(null, ks, alias, key, certChain, null); } public KeystoreOperation(KeyStore ks, String alias, Key key, Certificate[] certChain, File f) { this(null, ks, alias, key, certChain, f); } public KeystoreOperation(KeyManagerFactory kmf, KeyStore ks) { this(kmf, ks, null, null, null, null); } public KeystoreOperation(KeyManagerFactory kmf, KeyStore ks, String alias, Key key, Certificate[] certChain, File f) { this.kmf = kmf; this.ks = ks; this.alias = alias; this.key = key; this.certChain = certChain; this.f = f; } abstract Key operateKeystore(char[] pass) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, IOException, CertificateException; abstract String getId(); } //static final KeystorePasswordAttempter INSTANCE = new KeystorePasswordAttempter(new SavedPassword(getTrustedCertsPassword()), new AllmightyPassword()); static final KeystorePasswordAttempter INSTANCE = new KeystorePasswordAttempter(new SavedPassword(getTrustedCertsPassword())); private final List passes; private final Map sucesfullPerKeystore = new HashMap<>(); private KeystorePasswordAttempter(SavedPassword... initialPasswords) { passes = new ArrayList<>(initialPasswords.length); passes.addAll(Arrays.asList(initialPasswords)); } Key unlockKeystore(KeystoreOperation operation) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, IOException, CertificateException { SavedPassword sucessfullKey = sucesfullPerKeystore.get(operation.ks); Exception firstEx = null; String messages = ""; List localPases = new ArrayList<>(); if (sucessfullKey != null){ //sucessfull must be firts. If it is not, then writing to keystore by illegal password, will kill kesytore's integrity localPases.add(sucessfullKey); } localPases.addAll(passes); for (int i = 0; i < localPases.size(); i++) { SavedPassword pass = localPases.get(i); try { //we expect, that any keystore is loaded before readed. //so we are wrting by correct password //if no sucessfull passwrod was provided during rading, then finish(firstEx); will save us from overwrite Key result = operation.operateKeystore(pass.pass); //ok we were sucessfull //save the loading password for storing purposes (and another reading too) sucesfullPerKeystore.put(operation.ks, pass); return result; } catch (KeyStoreException | NoSuchAlgorithmException | UnrecoverableKeyException | IOException | CertificateException ex) { if (firstEx == null) { firstEx = ex; } messages += "'" + ex.getMessage() + "' "; OutputController.getLogger().log(ex); //tried all known, ask for new or finally die if (i + 1 == localPases.size()) { String s1 = Translator.R("KSresultUntilNow", messages, operation.getId(), (i + 1)); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, s1); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("KSinvalidPassword")); if (JNLPRuntime.isHeadless()) { OutputController.getLogger().printOutLn(s1 + "\n" + Translator.R("KSheadlesWarning")); String s = OutputController.getLogger().readLine(); if (s == null || s.trim().isEmpty()) { finish(firstEx); } //if input is null or empty , exception is thrown from finish method addPnewPassword(s, localPases); } else { String s = JOptionPane.showInputDialog(s1 + "\n" + Translator.R("KSnwPassHelp")); if (s == null) { finish(firstEx); } //if input is null, exception is thrown from finish method addPnewPassword(s, localPases); } //user already read all messages, now show only last one messages = ""; } } } return null; } private void addPnewPassword(String s, List localPases) { SavedPassword users = new SavedPassword(s.toCharArray()); passes.add(users); localPases.add(users); } private void finish(Exception ex) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, IOException, CertificateException { if (ex instanceof KeyStoreException) { throw (KeyStoreException) ex; } else if (ex instanceof NoSuchAlgorithmException) { throw (NoSuchAlgorithmException) ex; } else if (ex instanceof UnrecoverableKeyException) { throw (UnrecoverableKeyException) ex; } else if (ex instanceof IOException) { throw (IOException) ex; } else if (ex instanceof CertificateException) { throw (CertificateException) ex; } else { throw new RuntimeException("Unexpected exception", ex); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/security/PaxHeaders.7406/AppVerifier.java0000644000000000000000000000013013441742745025201 xustar0029 mtime=1552401893.04083282 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/security/AppVerifier.java0000644000175000002070000000762713441742745026027 0ustar00jvanekmock00000000000000/* AppVerifier.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.security; import java.security.cert.CertPath; import java.util.Map; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.tools.CertInformation; import net.sourceforge.jnlp.tools.JarCertVerifier; /** * An interface that provides various details about an app's signers. */ public interface AppVerifier { /** * Checks if the app has already found trust in its publisher(s). * @param certs The certs to search through and their cert information * @param signedJars A map of all the jars of this app and the number of * signed entries each one has. * @return True if the app trusts its publishers. */ public boolean hasAlreadyTrustedPublisher( Map certs, Map signedJars); /** * Checks if the app has signer(s) whose certs along their chains are in CA certs. * @param certs The certs to search through and their cert information * @param signedJars A map of all the jars of this app and the number of * signed entries each one has. * @return True if the app has a root in the CA certs store. */ public boolean hasRootInCacerts(Map certs, Map signedJars); /** * Checks if the app's jars are covered by the provided certificates, enough * to consider the app fully signed. * @param certs Any possible signer and their respective information regarding this app. * @param signedJars A map of all the jars of this app and the number of * signed entries each one has. * @return true if jar is fully signed */ public boolean isFullySigned(Map certs, Map signedJars); /** * Prompt the user with requests for trusting the certificates used by this app * @param securityDelegate parental security * @param jcv jar verifier * @param file jnlp fiel to provide information * @throws LaunchException if it fails to verify */ public void checkTrustWithUser(SecurityDelegate securityDelegate, JarCertVerifier jcv, JNLPFile file) throws LaunchException; } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/runtime0000644000000000000000000000013013441742745021661 xustar0030 mtime=1552401893.059832781 29 atime=1552410887.11418344 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/0000755000175000002070000000000013441742745022550 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/ManifestAttributesChecker.java0000644000000000000000000000013113441742745027704 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java0000644000175000002070000005530613441742745030526 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import net.sourceforge.jnlp.ExtensionDesc; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.JNLPFile.ManifestBoolean; import net.sourceforge.jnlp.SecurityDesc.RequestedPermissionLevel; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.ResourcesDesc; import net.sourceforge.jnlp.SecurityDesc; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SecurityDelegate; import net.sourceforge.jnlp.runtime.JNLPClassLoader.SigningState; import net.sourceforge.jnlp.security.SecurityDialogs; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletStartupSecuritySettings; import net.sourceforge.jnlp.util.ClasspathMatcher.ClasspathMatchers; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; import static net.sourceforge.jnlp.config.BasicValueValidators.splitCombination; import static net.sourceforge.jnlp.runtime.Translator.R; public class ManifestAttributesChecker { private final SecurityDesc security; private final JNLPFile file; private final SigningState signing; private final SecurityDelegate securityDelegate; public ManifestAttributesChecker(final SecurityDesc security, final JNLPFile file, final SigningState signing, final SecurityDelegate securityDelegate) throws LaunchException { this.security = security; this.file = file; this.signing = signing; this.securityDelegate = securityDelegate; } public enum MANIFEST_ATTRIBUTES_CHECK { ALL, NONE, PERMISSIONS, CODEBASE, TRUSTED, ALAC, ENTRYPOINT } void checkAll() throws LaunchException { List attributesCheck = getAttributesCheck(); if (attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.NONE)) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("MACDisabledMessage")); } else { if (attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.TRUSTED) || attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.ALL)) { checkTrustedOnlyAttribute(); } else { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("MACCheckSkipped", "Trusted-Only", "TRUSTED")); } if (attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.CODEBASE) || attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.ALL)) { checkCodebaseAttribute(); } else { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("MACCheckSkipped", "Codebase", "CODEBASE")); } if (attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS) || attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.ALL)) { checkPermissionsAttribute(); } else { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("MACCheckSkipped", "Permissions", "PERMISSIONS")); } if (attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.ALAC) || attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.ALL)) { checkApplicationLibraryAllowableCodebaseAttribute(); } else { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("MACCheckSkipped", "Application Library Allowable Codebase", "ALAC")); } if (attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT) || attributesCheck.contains(MANIFEST_ATTRIBUTES_CHECK.ALL)) { checkEntryPoint(); } else { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("MACCheckSkipped", "Entry-Point", "ENTRYPOINT")); } } } public static List getAttributesCheck() { final String deploymentProperty = JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK); String[] attributesCheck = splitCombination(deploymentProperty); List manifestAttributesCheckList = new ArrayList<>(); for (String attribute : attributesCheck) { for (MANIFEST_ATTRIBUTES_CHECK manifestAttribute : MANIFEST_ATTRIBUTES_CHECK.values()) { if (manifestAttribute.toString().equals(attribute)) { manifestAttributesCheckList.add(manifestAttribute); } } } return manifestAttributesCheckList; } /* * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html#entry_pt */ private void checkEntryPoint() throws LaunchException { if (signing == SigningState.NONE) { return; /*when app is not signed at all, then skip this check*/ } if (file.getLaunchInfo() == null) { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Entry-Point can not be checked now, because of not existing launch info."); return; } if (file.getLaunchInfo().getMainClass() == null) { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Entry-Point can not be checked now, because of unknown main class."); return; } final String[] eps = file.getManifestsAttributes().getEntryPoints(); String mainClass = file.getLaunchInfo().getMainClass(); if (eps == null) { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Entry-Point manifest attribute for yours '" + mainClass + "'not found. Continuing."); return; } for (String ep : eps) { if (ep.equals(mainClass)) { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Entry-Point of " + ep + " mathches " + mainClass + " continuing."); return; } } throw new LaunchException("None of the entry points specified: '" + file.getManifestsAttributes().getEntryPointString() + "' matched the main class " + mainClass + " and apelt is signed. This is a security error and the app will not be launched."); } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html#trusted_only */ private void checkTrustedOnlyAttribute() throws LaunchException { final ManifestBoolean trustedOnly = file.getManifestsAttributes().isTrustedOnly(); if (trustedOnly == ManifestBoolean.UNDEFINED) { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Trusted Only manifest attribute not found. Continuing."); return; } if (trustedOnly == ManifestBoolean.FALSE) { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Trusted Only manifest attribute is false. Continuing."); return; } final Object desc = security.getSecurityType(); final String securityType; if (desc == null) { securityType = "Not Specified"; } else if (desc.equals(SecurityDesc.ALL_PERMISSIONS)) { securityType = "All-Permission"; } else if (desc.equals(SecurityDesc.SANDBOX_PERMISSIONS)) { securityType = "Sandbox"; } else if (desc.equals(SecurityDesc.J2EE_PERMISSIONS)) { securityType = "J2EE"; } else { securityType = "Unknown"; } final boolean isFullySigned = signing == SigningState.FULL; final boolean isSandboxed = securityDelegate.getRunInSandbox(); final boolean requestsCorrectPermissions = (isFullySigned && SecurityDesc.ALL_PERMISSIONS.equals(desc)) || (isSandboxed && SecurityDesc.SANDBOX_PERMISSIONS.equals(desc)); final String signedMsg; if (isFullySigned && !isSandboxed) { signedMsg = R("STOAsignedMsgFully"); } else if (isFullySigned && isSandboxed) { signedMsg = R("STOAsignedMsgAndSandbox"); } else { signedMsg = R("STOAsignedMsgPartiall"); } OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Trusted Only manifest attribute is \"true\". " + signedMsg + " and requests permission level: " + securityType); if (!(isFullySigned && requestsCorrectPermissions)) { throw new LaunchException(R("STrustedOnlyAttributeFailure", signedMsg, securityType)); } } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#codebase */ private void checkCodebaseAttribute() throws LaunchException { if (file.getCodeBase() == null || file.getCodeBase().getProtocol().equals("file")) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("CBCheckFile")); return; } final Object securityType = security.getSecurityType(); final URL codebase = UrlUtils.guessCodeBase(file); final ClasspathMatchers codebaseAtt = file.getManifestsAttributes().getCodebase(); if (codebaseAtt == null) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("CBCheckNoEntry")); return; } if (securityType.equals(SecurityDesc.SANDBOX_PERMISSIONS)) { if (codebaseAtt.matches(codebase)) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CBCheckUnsignedPass")); } else { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, R("CBCheckUnsignedFail")); } } else { if (codebaseAtt.matches(codebase)) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CBCheckOkSignedOk")); } else { if (file instanceof PluginBridge) { throw new LaunchException(R("CBCheckSignedAppletDontMatchException", file.getManifestsAttributes().getCodebase().toString(), codebase)); } else { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, R("CBCheckSignedFail")); } } } } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html#permissions */ private void checkPermissionsAttribute() throws LaunchException { if (securityDelegate.getRunInSandbox()) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "The 'Permissions' attribute of this application is '" + file.getManifestsAttributes().permissionsToString() + "'. You have chosen the Sandbox run option, which overrides the Permissions manifest attribute, or the applet has already been automatically sandboxed."); return; } final ManifestBoolean sandboxForced = file.getManifestsAttributes().isSandboxForced(); // If the attribute is not specified in the manifest, prompt the user. Oracle's spec says that the // attribute is required, but this breaks a lot of existing applets. Therefore, when on the highest // security level, we refuse to run these applets. On the standard security level, we ask. And on the // lowest security level, we simply proceed without asking. if (sandboxForced == ManifestBoolean.UNDEFINED) { final AppletSecurityLevel itwSecurityLevel = AppletStartupSecuritySettings.getInstance().getSecurityLevel(); if (itwSecurityLevel == AppletSecurityLevel.DENY_UNSIGNED) { throw new LaunchException("Your Extended applets security is at 'Very high', and this application is missing the 'permissions' attribute in manifest. This is fatal"); } if (itwSecurityLevel == AppletSecurityLevel.ASK_UNSIGNED) { final boolean userApproved = SecurityDialogs.showMissingPermissionsAttributeDialogue(file); if (!userApproved) { throw new LaunchException("Your Extended applets security is at 'high' and this application is missing the 'permissions' attribute in manifest. And you have refused to run it."); } else { OutputController.getLogger().log("Your Extended applets security is at 'high' and this application is missing the 'permissions' attribute in manifest. And you have allowed to run it."); } } return; } final RequestedPermissionLevel requestedPermissions = file.getRequestedPermissionLevel(); validateRequestedPermissionLevelMatchesManifestPermissions(requestedPermissions, sandboxForced); if (file instanceof PluginBridge) { // HTML applet if (isNoneOrDefault(requestedPermissions)) { if (sandboxForced == ManifestBoolean.TRUE && signing != SigningState.NONE) { securityDelegate.setRunInSandbox(); } } } else { // JNLP if (isNoneOrDefault(requestedPermissions)) { if (sandboxForced == ManifestBoolean.TRUE && signing != SigningState.NONE) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "The 'permissions' attribute is '" + file.getManifestsAttributes().permissionsToString() + "' and the applet is signed. Forcing sandbox."); securityDelegate.setRunInSandbox(); } if (sandboxForced == ManifestBoolean.FALSE && signing == SigningState.NONE) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "The 'permissions' attribute is '" + file.getManifestsAttributes().permissionsToString() + "' and the applet is unsigned. Forcing sandbox."); securityDelegate.setRunInSandbox(); } } } } private static boolean isLowSecurity() { return AppletStartupSecuritySettings.getInstance().getSecurityLevel().equals(AppletSecurityLevel.ALLOW_UNSIGNED); } private static boolean isNoneOrDefault(final RequestedPermissionLevel requested) { return requested == RequestedPermissionLevel.NONE || requested == RequestedPermissionLevel.DEFAULT; } private void validateRequestedPermissionLevelMatchesManifestPermissions(final RequestedPermissionLevel requested, final ManifestBoolean sandboxForced) throws LaunchException { if (requested == RequestedPermissionLevel.ALL && sandboxForced != ManifestBoolean.FALSE) { throw new LaunchException("The 'permissions' attribute is '" + file.getManifestsAttributes().permissionsToString() + "' but the applet requested " + requested + ". This is fatal"); } if (requested == RequestedPermissionLevel.SANDBOX && sandboxForced != ManifestBoolean.TRUE) { throw new LaunchException("The 'permissions' attribute is '" + file.getManifestsAttributes().permissionsToString() + "' but the applet requested " + requested + ". This is fatal"); } } private void checkApplicationLibraryAllowableCodebaseAttribute() throws LaunchException { //conditions URL codebase = file.getCodeBase(); URL documentBase = null; if (file instanceof PluginBridge) { documentBase = ((PluginBridge) file).getSourceLocation(); } if (documentBase == null) { documentBase = file.getCodeBase(); } //cases Set usedUrls = new HashSet(); URL sourceLocation = file.getSourceLocation(); ResourcesDesc[] resourcesDescs = file.getResourcesDescs(); if (sourceLocation != null) { usedUrls.add(UrlUtils.removeFileName(sourceLocation)); } for (ResourcesDesc resourcesDesc : resourcesDescs) { ExtensionDesc[] ex = resourcesDesc.getExtensions(); if (ex != null) { for (ExtensionDesc extensionDesc : ex) { if (extensionDesc != null) { usedUrls.add(UrlUtils.removeFileName(extensionDesc.getLocation())); } } } JARDesc[] jars = resourcesDesc.getJARs(); if (jars != null) { for (JARDesc jarDesc : jars) { if (jarDesc != null) { usedUrls.add(UrlUtils.removeFileName(jarDesc.getLocation())); } } } JNLPFile jnlp = resourcesDesc.getJNLPFile(); if (jnlp != null) { usedUrls.add(UrlUtils.removeFileName(jnlp.getSourceLocation())); } } OutputController.getLogger().log("Found alaca URLs to be verified"); for (URL url : usedUrls) { OutputController.getLogger().log(" - " + url.toExternalForm()); } if (usedUrls.isEmpty()) { //I hope this is the case, when the resources is/are //only codebase classes. Then it should be safe to return. OutputController.getLogger().log("The application is not using any url resources, skipping Application-Library-Allowable-Codebase Attribute check."); return; } boolean allOk = true; for (URL u : usedUrls) { if (UrlUtils.equalsIgnoreLastSlash(u, codebase) && UrlUtils.equalsIgnoreLastSlash(u, stripDocbase(documentBase))) { OutputController.getLogger().log("OK - "+u.toExternalForm()+" is from codebase/docbase."); } else { allOk = false; OutputController.getLogger().log("Warning! "+u.toExternalForm()+" is NOT from codebase/docbase."); } } if (allOk) { //all resoources are from codebase or document base. it is ok to proceeed. OutputController.getLogger().log("All applications resources (" + usedUrls.toArray(new URL[0])[0] + ") are from codebas/documentbase " + codebase + "/" + documentBase + ", skipping Application-Library-Allowable-Codebase Attribute check."); return; } ClasspathMatchers att = null; if (signing == SigningState.NONE) { //for unsigned app we are ignoring value in manifesdt (may be faked) } else { att = file.getManifestsAttributes().getApplicationLibraryAllowableCodebase(); } if (att == null) { final boolean userApproved = SecurityDialogs.showMissingALACAttributePanel(file, documentBase, usedUrls); if (!userApproved) { throw new LaunchException("The application uses non-codebase resources, has no Application-Library-Allowable-Codebase Attribute, and was blocked from running by the user"); } else { OutputController.getLogger().log("The application uses non-codebase resources, has no Application-Library-Allowable-Codebase Attribute, and was allowed to run by the user or user's security settings"); return; } } else { for (URL foundUrl : usedUrls) { if (!att.matches(foundUrl)) { throw new LaunchException("The resource from " + foundUrl + " does not match the location in Application-Library-Allowable-Codebase Attribute " + att + ". Blocking the application from running."); } else { OutputController.getLogger().log("The resource from " + foundUrl + " does match the location in Application-Library-Allowable-Codebase Attribute " + att + ". Continuing."); } } } final boolean userApproved = isLowSecurity() || SecurityDialogs.showMatchingALACAttributePanel(file, documentBase, usedUrls); if (!userApproved) { throw new LaunchException("The application uses non-codebase resources, which do match its Application-Library-Allowable-Codebase Attribute, but was blocked from running by the user."); } else { OutputController.getLogger().log("The application uses non-codebase resources, which do match its Application-Library-Allowable-Codebase Attribute, and was allowed to run by the user or user's security settings."); } } //package private for testing //not perfect but ok for usecase static URL stripDocbase(URL documentBase) { String s = documentBase.toExternalForm(); if (s.endsWith("/") || s.endsWith("\\")) { return documentBase; } int i1 = s.lastIndexOf("/"); int i2 = s.lastIndexOf("\\"); int i = Math.max(i1, i2); if (i <= 8 || i >= s.length()) { return documentBase; } s = s.substring(0, i+1); try { documentBase = new URL(s); } catch (MalformedURLException ex) { OutputController.getLogger().log(ex); } return documentBase; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/JNLPClassLoader.java0000644000000000000000000000013113441742745025462 xustar0030 mtime=1552401893.058832783 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java0000644000175000002070000031615313441742745026304 0ustar00jvanekmock00000000000000// // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.SocketPermission; import java.net.URL; import java.net.URLClassLoader; import java.security.AccessControlContext; import java.security.AccessControlException; import java.security.AccessController; import java.security.AllPermission; import java.security.CodeSource; import java.security.Permission; import java.security.PermissionCollection; import java.security.Permissions; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.security.ProtectionDomain; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantLock; import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.Manifest; import net.sourceforge.jnlp.AppletDesc; import net.sourceforge.jnlp.ApplicationDesc; import net.sourceforge.jnlp.ExtensionDesc; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.JNLPMatcher; import net.sourceforge.jnlp.JNLPMatcherException; import net.sourceforge.jnlp.jdk89acesses.JarIndexAccess; import net.sourceforge.jnlp.LaunchDesc; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.NullJnlpFileException; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ParseException; import net.sourceforge.jnlp.ParserSettings; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.ResourcesDesc; import net.sourceforge.jnlp.SecurityDesc; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.cache.IllegalResourceDescriptorException; import net.sourceforge.jnlp.cache.NativeLibraryStorage; import net.sourceforge.jnlp.cache.ResourceTracker; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.security.AppVerifier; import net.sourceforge.jnlp.security.JNLPAppVerifier; import net.sourceforge.jnlp.security.PluginAppVerifier; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletTrustConfirmation; import net.sourceforge.jnlp.tools.JarCertVerifier; import net.sourceforge.jnlp.util.JarFile; import net.sourceforge.jnlp.util.StreamUtils; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; import static net.sourceforge.jnlp.runtime.Translator.R; /** * Classloader that takes it's resources from a JNLP file. If the JNLP file * defines extensions, separate classloaders for these will be created * automatically. Classes are loaded with the security context when the * classloader was created. * * @author Jon A. Maxwell * (JAM) - initial author * @version $Revision: 1.20 $ */ public class JNLPClassLoader extends URLClassLoader { // todo: initializePermissions should get the permissions from // extension classes too so that main file classes can load // resources in an extension. /** * Signed JNLP File and Template */ final public static String TEMPLATE = "JNLP-INF/APPLICATION_TEMPLATE.JNLP"; final public static String APPLICATION = "JNLP-INF/APPLICATION.JNLP"; /** * Actions to specify how cache is to be managed * */ public static enum DownloadAction { DOWNLOAD_TO_CACHE, REMOVE_FROM_CACHE, CHECK_CACHE } public static enum SigningState { FULL, PARTIAL, NONE } /** * True if the application has a signed JNLP File */ private boolean isSignedJNLP = false; /** * map from JNLPFile unique key to shared classloader */ private static Map uniqueKeyToLoader = new ConcurrentHashMap<>(); /** * map from JNLPFile unique key to lock, the lock is needed to enforce * correct initialization of applets that share a unique key */ private static Map uniqueKeyToLock = new HashMap<>(); /** * Provides a search path & temporary storage for native code */ private NativeLibraryStorage nativeLibraryStorage; /** * security context */ private final AccessControlContext acc = AccessController.getContext(); /** * the permissions for the cached jar files */ private List resourcePermissions; /** * the app */ private ApplicationInstance app = null; // here for faster lookup in security manager /** * list of this, local and global loaders this loader uses */ private JNLPClassLoader loaders[] = null; // ..[0]==this /** * whether to strictly adhere to the spec or not */ private final boolean strict; /** * loads the resources */ private final ResourceTracker tracker = new ResourceTracker(true); // prefetch /** * the update policy for resources */ private UpdatePolicy updatePolicy; /** * the JNLP file */ private JNLPFile file; /** * the resources section */ private ResourcesDesc resources; /** * the security section */ private SecurityDesc security; /** * Permissions granted by the user during runtime. */ private final ArrayList runtimePermissions = new ArrayList<>(); /** * all jars not yet part of classloader or active Synchronized since this * field may become shared data between multiple classloading threads. See * loadClass(String) and CodebaseClassLoader.findClassNonRecursive(String). */ private final List available = Collections.synchronizedList(new ArrayList()); /** * the jar cert verifier tool to verify our jars */ private final JarCertVerifier jcv; private SigningState signing = SigningState.NONE; /** * ArrayList containing jar indexes for various jars available to this * classloader Synchronized since this field may become shared data between * multiple classloading threads/ See loadClass(String) and * CodebaseClassLoader.findClassNonRecursive(String). */ private final List jarIndexes = Collections.synchronizedList(new ArrayList()); /** * Set of classpath strings declared in the manifest.mf files Synchronized * since this field may become shared data between multiple classloading * threads. See loadClass(String) and * CodebaseClassLoader.findClassNonRecursive(String). */ private final Set classpaths = Collections.synchronizedSet(new HashSet()); /** * File entries in the jar files available to this classloader Synchronized * sinc this field may become shared data between multiple classloading * threads. See loadClass(String) and * CodebaseClassLoader.findClassNonRecursive(String). */ private final Set jarEntries = Collections.synchronizedSet(new TreeSet()); /** * Map of specific original (remote) CodeSource Urls to securitydesc * Synchronized since this field may become shared data between multiple * classloading threads. See loadClass(String) and * CodebaseClassLoader.findClassNonRecursive(String). */ private final Map jarLocationSecurityMap = Collections.synchronizedMap(new HashMap()); /*Set to prevent once tried-to-get resources to be tried again*/ private final Set alreadyTried = Collections.synchronizedSet(new HashSet()); /** * Loader for codebase (which is a path, rather than a file) */ private CodeBaseClassLoader codeBaseLoader; /** * True if the jar with the main class has been found * */ private boolean foundMainJar = false; /** * Name of the application's main class */ private String mainClass = null; /** * Variable to track how many times this loader is in use */ private int useCount = 0; private boolean enableCodeBase = false; private final SecurityDelegate securityDelegate; private ManifestAttributesChecker mac; /** * Create a new JNLPClassLoader from the specified file. * * @param file the JNLP file * @param policy update policy of loader * @throws net.sourceforge.jnlp.LaunchException if app can not be loaded */ protected JNLPClassLoader(JNLPFile file, UpdatePolicy policy) throws LaunchException { this(file, policy, null, false); } /** * Create a new JNLPClassLoader from the specified file. * * @param file the JNLP file * @param policy the UpdatePolicy for this class loader * @param mainName name of the application's main class * @param enableCodeBase switch whether this classloader can search in * codebase or not * @throws net.sourceforge.jnlp.LaunchException when need to kill an app * comes. * */ protected JNLPClassLoader(JNLPFile file, UpdatePolicy policy, String mainName, boolean enableCodeBase) throws LaunchException { super(new URL[0], JNLPClassLoader.class.getClassLoader()); OutputController.getLogger().log("New classloader: " + file.getFileLocation()); strict = Boolean.valueOf(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_STRICT_JNLP_CLASSLOADER)); this.file = file; this.updatePolicy = policy; this.resources = file.getResources(); this.nativeLibraryStorage = new NativeLibraryStorage(tracker); this.mainClass = mainName; this.enableCodeBase = enableCodeBase; AppVerifier verifier; if (file instanceof PluginBridge && !((PluginBridge) file).useJNLPHref()) { verifier = new PluginAppVerifier(); } else { verifier = new JNLPAppVerifier(); } jcv = new JarCertVerifier(verifier); if (this.enableCodeBase) { addToCodeBaseLoader(this.file.getCodeBase()); } this.securityDelegate = new SecurityDelegateImpl(this); // initialize extensions initializeExtensions(); initializeResources(); // initialize permissions initializeReadJarPermissions(); installShutdownHooks(); } public static boolean isCertUnderestimated() { return Boolean.valueOf(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_SECURITY_ITW_IGNORECERTISSUES)) && !JNLPRuntime.isSecurityEnabled(); } private static void consultCertificateSecurityException(LaunchException ex) throws LaunchException { if (isCertUnderestimated()) { OutputController.getLogger().log(OptionsDefinitions.OPTIONS.NOSEC.option + " and " + DeploymentConfiguration.KEY_SECURITY_ITW_IGNORECERTISSUES + " are declared. Ignoring certificate issue"); OutputController.getLogger().log(ex); } else { throw ex; } } public boolean isStrict() { return strict; } /** * Install JVM shutdown hooks to clean up resources allocated by this * ClassLoader. */ private void installShutdownHooks() { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { /* * Delete only the native dir created by this classloader (if * there is one). Other classloaders (parent, peers) will all * cleanup things they created */ nativeLibraryStorage.cleanupTemporaryFolder(); } }); } private void setSecurity() throws LaunchException { URL codebase = UrlUtils.guessCodeBase(file); this.security = securityDelegate.getClassLoaderSecurity(codebase); } /** * Gets the lock for a given unique key, creating one if it does not yet * exist. This operation is atomic & thread-safe. * * @param uniqueKey the file whose unique key should be used * @return the lock */ private static ReentrantLock getUniqueKeyLock(String uniqueKey) { synchronized (uniqueKeyToLock) { ReentrantLock storedLock = uniqueKeyToLock.get(uniqueKey); if (storedLock == null) { storedLock = new ReentrantLock(); uniqueKeyToLock.put(uniqueKey, storedLock); } return storedLock; } } /** * Creates a fully initialized JNLP classloader for the specified JNLPFile, * to be used as an applet/application's classloader. In contrast, JNLP * classloaders can also be constructed simply to merge its resources into * another classloader. * * @param file the file to load classes for * @param policy the update policy to use when downloading resources * @param mainName Overrides the main class name of the application */ private static JNLPClassLoader createInstance(JNLPFile file, UpdatePolicy policy, String mainName, boolean enableCodeBase) throws LaunchException { String uniqueKey = file.getUniqueKey(); JNLPClassLoader baseLoader = uniqueKeyToLoader.get(uniqueKey); JNLPClassLoader loader = new JNLPClassLoader(file, policy, mainName, enableCodeBase); // If security level is 'high' or greater, we must check if the user allows unsigned applets // when the JNLPClassLoader is created. We do so here, because doing so in the constructor // causes unwanted side-effects for some applets. However, if the loader has been tagged // with "runInSandbox", then we do not show this dialog - since this tag indicates that // the user was already shown a CertWarning dialog and has chosen to run the applet sandboxed. // This means they've already agreed to running the applet and have specified with which // permission level to do it! if (loader.getSigningState() == SigningState.PARTIAL) { loader.securityDelegate.promptUserOnPartialSigning(); } else if (!loader.getSigning() && !loader.securityDelegate.userPromptedForSandbox() && file instanceof PluginBridge) { UnsignedAppletTrustConfirmation.checkUnsignedWithUserIfRequired((PluginBridge) file); } // New loader init may have caused extentions to create a // loader for this unique key. Check. JNLPClassLoader extLoader = uniqueKeyToLoader.get(uniqueKey); if (extLoader != null && extLoader != loader) { if (loader.getSigning() != extLoader.getSigning()) { loader.securityDelegate.promptUserOnPartialSigning(); } loader.merge(extLoader); extLoader.decrementLoaderUseCount(); // loader urls have been merged, ext loader is no longer used } // loader is now current + ext. But we also need to think of // the baseLoader if (baseLoader != null && baseLoader != loader) { loader.merge(baseLoader); } return loader; } /** * Returns a JNLP classloader for the specified JNLP file. * * @param file the file to load classes for * @param policy the update policy to use when downloading resources * @param enableCodeBase true if codebase can be searched (ok for * applets,false for apps) * @return existing classloader. creates new if none reliable exists * @throws net.sourceforge.jnlp.LaunchException when launch is doomed */ public static JNLPClassLoader getInstance(JNLPFile file, UpdatePolicy policy, boolean enableCodeBase) throws LaunchException { return getInstance(file, policy, null, enableCodeBase); } /** * Returns a JNLP classloader for the specified JNLP file. * * @param file the file to load classes for * @param policy the update policy to use when downloading resources * @param mainName Overrides the main class name of the application * @param enableCodeBase ue if codebase can be searched (ok for * applets,false for apps) * @return existing classloader. creates new if none reliable exists * @throws net.sourceforge.jnlp.LaunchException when launch is doomed */ public static JNLPClassLoader getInstance(JNLPFile file, UpdatePolicy policy, String mainName, boolean enableCodeBase) throws LaunchException { JNLPClassLoader loader; String uniqueKey = file.getUniqueKey(); synchronized (getUniqueKeyLock(uniqueKey)) { JNLPClassLoader baseLoader = uniqueKeyToLoader.get(uniqueKey); // A null baseloader implies that no loader has been created // for this codebase/jnlp yet. Create one. if (baseLoader == null || (file.isApplication() && !baseLoader.getJNLPFile().getFileLocation().equals(file.getFileLocation()))) { loader = createInstance(file, policy, mainName, enableCodeBase); } else { // if key is same and locations match, this is the loader we want if (!file.isApplication()) { // If this is an applet, we do need to consider its loader loader = new JNLPClassLoader(file, policy, mainName, enableCodeBase); if (baseLoader != null) { baseLoader.merge(loader); } } loader = baseLoader; } // loaders are mapped to a unique key. Only extensions and parent // share a key, so it is safe to always share based on it loader.incrementLoaderUseCount(); uniqueKeyToLoader.put(uniqueKey, loader); } return loader; } /** * Returns a JNLP classloader for the JNLP file at the specified location. * * @param location the file's location * @param uniqueKey key to manage applets/applications in shared vm * @param version the file's version * @param settings settings of parser * @param policy the update policy to use when downloading resources * @param mainName Overrides the main class name of the application * @param enableCodeBase whether to enable codebase search or not * @return classlaoder of this appp * @throws java.io.IOException when IO fails * @throws net.sourceforge.jnlp.ParseException when parsing fails * @throws net.sourceforge.jnlp.LaunchException when launch is doomed */ public static JNLPClassLoader getInstance(URL location, String uniqueKey, Version version, ParserSettings settings, UpdatePolicy policy, String mainName, boolean enableCodeBase) throws IOException, ParseException, LaunchException { JNLPClassLoader loader; synchronized (getUniqueKeyLock(uniqueKey)) { loader = uniqueKeyToLoader.get(uniqueKey); if (loader == null || !location.equals(loader.getJNLPFile().getFileLocation())) { JNLPFile jnlpFile = new JNLPFile(location, uniqueKey, version, settings, policy); loader = getInstance(jnlpFile, policy, mainName, enableCodeBase); } } return loader; } /** * Load the extensions specified in the JNLP file. */ void initializeExtensions() { ExtensionDesc[] extDescs = resources.getExtensions(); List loaderList = new ArrayList<>(); loaderList.add(this); if (mainClass == null) { Object obj = file.getLaunchInfo(); if (obj instanceof ApplicationDesc) { ApplicationDesc ad = (ApplicationDesc) file.getLaunchInfo(); mainClass = ad.getMainClass(); } else if (obj instanceof AppletDesc) { AppletDesc ad = (AppletDesc) file.getLaunchInfo(); mainClass = ad.getMainClass(); } } //if (ext != null) { for (ExtensionDesc ext : extDescs) { try { String uniqueKey = this.getJNLPFile().getUniqueKey(); JNLPClassLoader loader = getInstance(ext.getLocation(), uniqueKey, ext.getVersion(), file.getParserSettings(), updatePolicy, mainClass, this.enableCodeBase); loaderList.add(loader); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } } //} loaders = loaderList.toArray(new JNLPClassLoader[loaderList.size()]); } /** * Make permission objects for the classpath. */ void initializeReadJarPermissions() { resourcePermissions = new ArrayList<>(); JARDesc jars[] = resources.getJARs(); for (JARDesc jar : jars) { Permission p = CacheUtil.getReadPermission(jar.getLocation(), jar.getVersion()); if (p == null) { OutputController.getLogger().log("Unable to add permission for " + jar.getLocation()); } else { resourcePermissions.add(p); OutputController.getLogger().log("Permission added: " + p.toString()); } } } /** * Check if a described jar file is invalid * * @param jar the jar to check * @return true if file exists AND is an invalid jar, false otherwise */ boolean isInvalidJar(JARDesc jar) { File cacheFile = tracker.getCacheFile(jar.getLocation()); if (cacheFile == null) { return false;//File cannot be retrieved, do not claim it is an invalid jar } boolean isInvalid = false; try { JarFile jarFile = new JarFile(cacheFile.getAbsolutePath()); jarFile.close(); } catch (IOException ioe) { //Catch a ZipException or any other read failure isInvalid = true; } return isInvalid; } /** * Determine how invalid jars should be handled * * @return whether to filter invalid jars, or error later on */ private boolean shouldFilterInvalidJars() { if (file instanceof PluginBridge) { PluginBridge pluginBridge = (PluginBridge) file; /*Ignore on applet, ie !useJNLPHref*/ return !pluginBridge.useJNLPHref(); } return false;//Error is default behaviour } /** * Load all of the JARs used in this JNLP file into the ResourceTracker for * downloading. */ void initializeResources() throws LaunchException { if (file instanceof PluginBridge) { PluginBridge bridge = (PluginBridge) file; for (String codeBaseFolder : bridge.getCodeBaseFolders()) { try { addToCodeBaseLoader(new URL(file.getCodeBase(), codeBaseFolder)); } catch (MalformedURLException mfe) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "Problem trying to add folder to code base:"); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, mfe); } } } JARDesc jars[] = resources.getJARs(); if (jars.length == 0) { boolean allSigned = (loaders.length > 1) /* has extensions */; for (int i = 1; i < loaders.length; i++) { if (!loaders[i].getSigning()) { allSigned = false; break; } } if (allSigned) { signing = SigningState.FULL; } else { signing = SigningState.NONE; } //Check if main jar is found within extensions foundMainJar = foundMainJar || hasMainInExtensions(); setSecurity(); initializeManifestAttributesChecker(); mac.checkAll(); return; } List initialJars = new ArrayList<>(); for (JARDesc jar : jars) { available.add(jar); if (jar.isEager()) { initialJars.add(jar); // regardless of part } tracker.addResource(jar.getLocation(), jar.getVersion(), file.getDownloadOptions(), jar.isCacheable() ? JNLPRuntime.getDefaultUpdatePolicy() : UpdatePolicy.FORCE); } //If there are no eager jars, initialize the first jar if (initialJars.isEmpty()) { initialJars.add(jars[0]); } if (strict) { fillInPartJars(initialJars); // add in each initial part's lazy jars } waitForJars(initialJars); //download the jars first. //A ZipException will propagate later on if the jar is invalid and not checked here if (shouldFilterInvalidJars()) { //We filter any invalid jars Iterator iterator = initialJars.iterator(); while (iterator.hasNext()) { JARDesc jar = iterator.next(); if (isInvalidJar(jar)) { //Remove this jar as an available jar iterator.remove(); tracker.removeResource(jar.getLocation()); available.remove(jar); } } } if (JNLPRuntime.isVerifying()) { try { jcv.add(initialJars, tracker); } catch (Exception e) { //we caught an Exception from the JarCertVerifier class. //Note: one of these exceptions could be from not being able //to read the cacerts or trusted.certs files. OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); LaunchException ex = new LaunchException(null, null, R("LSFatal"), R("LCInit"), R("LFatalVerification"), R("LFatalVerificationInfo") + ": " + e.getMessage()); consultCertificateSecurityException(ex); } //Case when at least one jar has some signing if (jcv.isFullySigned()) { signing = SigningState.FULL; // Check for main class in the downloaded jars, and check/verify signed JNLP fill checkForMain(initialJars); // If jar with main class was not found, check available resources while (!foundMainJar && available != null && !available.isEmpty()) { addNextResource(); } // If the jar with main class was not found, check extension // jnlp's resources foundMainJar = foundMainJar || hasMainInExtensions(); boolean externalAppletMainClass = (file.getLaunchInfo() != null && !foundMainJar && (available == null || available.isEmpty())); // We do this check here simply to ensure that if there are no JARs at all, // and also no main-class in the codebase (ie the applet doesn't really exist), we // fail ASAP rather than continuing (and showing the NotAllSigned dialog for no applet) if (externalAppletMainClass) { if (codeBaseLoader != null) { try { codeBaseLoader.findClass(mainClass); } catch (ClassNotFoundException extCnfe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, extCnfe); throw new LaunchException(file, extCnfe, R("LSFatal"), R("LCInit"), R("LCantDetermineMainClass"), R("LCantDetermineMainClassInfo")); } } else { throw new LaunchException(file, null, R("LSFatal"), R("LCInit"), R("LCantDetermineMainClass"), R("LCantDetermineMainClassInfo")); } } // If externalAppletMainClass is true and a LaunchException was not thrown above, // then the main-class can be loaded from the applet codebase, but is obviously not signed if (externalAppletMainClass) { checkPartialSigningWithUser(); } // If main jar was found, but a signed JNLP file was not located if (!isSignedJNLP && foundMainJar) { file.setSignedJNLPAsMissing(); } //user does not trust this publisher if (!jcv.isTriviallySigned()) { checkTrustWithUser(); } else { /** * If the user trusts this publisher (i.e. the publisher's * certificate is in the user's trusted.certs file), we do * not show any dialogs. */ } } else { // Otherwise this jar is simply unsigned -- make sure to ask // for permission on certain actions signing = SigningState.NONE; } } setSecurity(); final Set validJars = new HashSet<>(); boolean containsSignedJar = false, containsUnsignedJar = false; for (JARDesc jarDesc : file.getResources().getJARs()) { File cachedFile; try { cachedFile = tracker.getCacheFile(jarDesc.getLocation()); } catch (IllegalResourceDescriptorException irde) { //Caused by ignored resource being removed due to not being valid OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "JAR " + jarDesc.getLocation() + " is not a valid jar file. Continuing."); continue; } if (cachedFile == null) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "JAR " + jarDesc.getLocation() + " not found. Continuing."); continue; // JAR not found. Keep going. } validJars.add(jarDesc); final URL codebase = getJnlpFileCodebase(); final SecurityDesc jarSecurity = securityDelegate.getCodebaseSecurityDesc(jarDesc, codebase); if (jarSecurity.getSecurityType().equals(SecurityDesc.SANDBOX_PERMISSIONS)) { containsUnsignedJar = true; } else { containsSignedJar = true; } if (containsUnsignedJar && containsSignedJar) { signing = SigningState.PARTIAL; break; } } if (containsSignedJar && containsUnsignedJar) { checkPartialSigningWithUser(); } setSecurity(); initializeManifestAttributesChecker(); mac.checkAll(); for (JARDesc jarDesc : validJars) { final URL codebase = getJnlpFileCodebase(); final SecurityDesc jarSecurity = securityDelegate.getCodebaseSecurityDesc(jarDesc, codebase); jarLocationSecurityMap.put(jarDesc.getLocation(), jarSecurity); } activateJars(initialJars); } private void initializeManifestAttributesChecker() throws LaunchException { if (mac == null) { file.getManifestsAttributes().setLoader(this); mac = new ManifestAttributesChecker(security, file, signing, securityDelegate); } } private URL getJnlpFileCodebase() { final URL codebase; if (file.getCodeBase() != null) { codebase = file.getCodeBase(); } else { // FIXME: codebase should be the codebase of the Main Jar not // the location. Although, it still works in the current state. codebase = file.getResources().getMainJAR().getLocation(); } return codebase; } /** * * * Checks for the jar that contains the attribute. * * @param jars Jars that are checked to see if they contain the main class * @param name attribute to be found * @return value of attribute if found */ public String checkForAttributeInJars(List jars, Attributes.Name name) { if (jars.isEmpty()) { return null; } // Check main jar JARDesc mainJarDesc = ResourcesDesc.getMainJAR(jars); String result = getManifestAttribute(mainJarDesc.getLocation(), name); if (result != null) { return result; } // Check first jar JARDesc firstJarDesc = jars.get(0); result = getManifestAttribute(firstJarDesc.getLocation(), name); if (result != null) { return result; } // Still not found? Iterate and set if only 1 was found for (JARDesc jarDesc : jars) { String attributeInThisJar = getManifestAttribute(jarDesc.getLocation(), name); if (attributeInThisJar != null) { if (result == null) { // first main class result = attributeInThisJar; } else { // There is more than one main class. Set to null and break. result = null; break; } } } return result; } /** * * * Checks for the jar that contains the main class. If the main class was * found, it checks to see if the jar is signed and whether it contains a * signed JNLP file * * @param jars Jars that are checked to see if they contain the main class * @throws LaunchException Thrown if the signed JNLP file, within the main * jar, fails to be verified or does not match */ void checkForMain(List jars) throws LaunchException { // Check launch info if (mainClass == null) { LaunchDesc launchDesc = file.getLaunchInfo(); if (launchDesc != null) { mainClass = launchDesc.getMainClass(); } } // The main class may be specified in the manifest if (mainClass == null) { mainClass = checkForAttributeInJars(jars, Attributes.Name.MAIN_CLASS); } String desiredJarEntryName = mainClass + ".class"; for (JARDesc jar : jars) { try { File localFile = tracker .getCacheFile(jar.getLocation()); if (localFile == null) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "JAR " + jar.getLocation() + " not found. Continuing."); continue; // JAR not found. Keep going. } JarFile jarFile = new JarFile(localFile); for (JarEntry entry : Collections.list(jarFile.entries())) { String jeName = entry.getName().replaceAll("/", "."); if (jeName.equals(desiredJarEntryName)) { foundMainJar = true; verifySignedJNLP(jar, jarFile); break; } } jarFile.close(); } catch (IOException e) { /* * After this exception is caught, it is escaped. This will skip * the jarFile that may have thrown this exception and move on * to the next jarFile (if there are any) */ } } } /** * Gets the name of the main method if specified in the manifest * * @param location The JAR location * @return the main class name, null if there isn't one of if there was an * error */ String getMainClassName(URL location) { return getManifestAttribute(location, Attributes.Name.MAIN_CLASS); } /** * Gets the name of the main method if specified in the manifest * * @param location The JAR location * @param attribute name of the attribute to find * @return the attribute value, null if there isn't one of if there was an * error */ public String getManifestAttribute(URL location, Attributes.Name attribute) { String attributeValue = null; File f = tracker.getCacheFile(location); if (f != null) { JarFile mainJar = null; try { mainJar = new JarFile(f); Manifest manifest = mainJar.getManifest(); if (manifest == null || manifest.getMainAttributes() == null) { //yes, jars without manifest exists return null; } attributeValue = manifest.getMainAttributes().getValue(attribute); } catch (IOException ioe) { attributeValue = null; } finally { StreamUtils.closeSilently(mainJar); } } return attributeValue; } /** * @return true if this loader has the main jar */ public boolean hasMainJar() { return this.foundMainJar; } /** * Returns true if extension loaders have the main jar */ private boolean hasMainInExtensions() { boolean foundMain = false; for (int i = 1; i < loaders.length && !foundMain; i++) { foundMain = loaders[i].hasMainJar(); } return foundMain; } /** * Is called by checkForMain() to check if the jar file is signed and if it * contains a signed JNLP file. * * @param jarDesc JARDesc of jar * @param jarFile the jar file * @throws LaunchException thrown if the signed JNLP file, within the main * jar, fails to be verified or does not match */ private void verifySignedJNLP(JARDesc jarDesc, JarFile jarFile) throws LaunchException { List desc = new ArrayList<>(); desc.add(jarDesc); try { // NOTE: verification should have happened by now. In other words, // calling jcv.verifyJars(desc, tracker) here should have no affect. if (jcv.isFullySigned()) { for (JarEntry je : Collections.list(jarFile.entries())) { String jeName = je.getName().toUpperCase(); if (jeName.equals(TEMPLATE) || jeName.equals(APPLICATION)) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Creating Jar InputStream from JarEntry"); InputStream inStream = jarFile.getInputStream(je); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Creating File InputStream from lauching JNLP file"); JNLPFile jnlp = this.getJNLPFile(); File jn; // If the file is on the local file system, use original path, otherwise find cached file if (jnlp.getFileLocation().getProtocol().toLowerCase().equals("file")) { jn = new File(jnlp.getFileLocation().getPath()); } else { jn = CacheUtil.getCacheFile(jnlp.getFileLocation(), null); } InputStream jnlpStream = new FileInputStream(jn); JNLPMatcher matcher; if (jeName.equals(APPLICATION)) { // If signed application was found OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "APPLICATION.JNLP has been located within signed JAR. Starting verfication..."); matcher = new JNLPMatcher(inStream, jnlpStream, false, jnlp.getParserSettings()); } else { // Otherwise template was found OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "APPLICATION_TEMPLATE.JNLP has been located within signed JAR. Starting verfication..."); matcher = new JNLPMatcher(inStream, jnlpStream, true, jnlp.getParserSettings()); } // If signed JNLP file does not matches launching JNLP file, throw JNLPMatcherException if (!matcher.isMatch()) { throw new JNLPMatcherException("Signed Application did not match launching JNLP File"); } this.isSignedJNLP = true; OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Signed Application Verification Successful"); break; } } } } catch (JNLPMatcherException e) { /* * Throws LaunchException if signed JNLP file fails to be verified * or fails to match the launching JNLP file */ LaunchException ex = new LaunchException(file, null, R("LSFatal"), R("LCClient"), R("LSignedJNLPFileDidNotMatch"), R(e.getMessage())); consultCertificateSecurityException(ex); /* * Throwing this exception will fail to initialize the application * resulting in the termination of the application */ } catch (Exception e) { OutputController.getLogger().log(e); /* * After this exception is caught, it is escaped. If an exception is * thrown while handling the jar file, (mainly for * JarCertVerifier.add) it assumes the jar file is unsigned and * skip the check for a signed JNLP file */ } OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Ending check for signed JNLP file..."); } /** * Prompt the user for trust on all the signers that require approval. * * @throws LaunchException if the user does not approve every dialog prompt. */ private void checkTrustWithUser() throws LaunchException { if (securityDelegate.getRunInSandbox()) { return; } if (getSigningState() == SigningState.FULL && jcv.isFullySigned() && !jcv.getAlreadyTrustPublisher()) { jcv.checkTrustWithUser(securityDelegate, file); } } /* * Sets whether applets are to be run sandboxed, regardless of JAR * signing. This MUST be called before any call to initializeResources, * setSecurity, activateJars, or any other method that sets the value * of this.security or adds entries into this.jarLocationSecurityMap. * @throws LaunchException if security settings have been initialized before * this method is called */ public void setRunInSandbox() throws LaunchException { securityDelegate.setRunInSandbox(); } public boolean userPromptedForSandbox() { return securityDelegate.getRunInSandbox(); } /** * Add applet's codebase URL. This allows compatibility with applets that * load resources from their codebase instead of through JARs, but can slow * down resource loading. Resources loaded from the codebase are not cached. */ public void enableCodeBase() { addToCodeBaseLoader(file.getCodeBase()); } /** * Sets the JNLP app this group is for; can only be called once. * * @param app application to be ser to this group */ public void setApplication(ApplicationInstance app) { if (this.app != null) { OutputController.getLogger().log(new IllegalStateException("Application can only be set once")); return; } this.app = app; } /** * @return the JNLP app for this classloader */ public ApplicationInstance getApplication() { return app; } /** * @return the JNLP file the classloader was created from. */ public JNLPFile getJNLPFile() { return file; } /** * Returns the permissions for the CodeSource. */ @Override protected PermissionCollection getPermissions(CodeSource cs) { try { Permissions result = new Permissions(); // should check for extensions or boot, automatically give all // access w/o security dialog once we actually check certificates. // copy security permissions from SecurityDesc element if (security != null) { // Security desc. is used only to track security settings for the // application. However, an application may comprise of multiple // jars, and as such, security must be evaluated on a per jar basis. // set default perms PermissionCollection permissions = security.getSandBoxPermissions(); // If more than default is needed: // 1. Code must be signed // 2. ALL or J2EE permissions must be requested (note: plugin requests ALL automatically) if (cs == null) { throw new NullPointerException("Code source was null"); } if (cs.getCodeSigners() != null) { if (cs.getLocation() == null) { throw new NullPointerException("Code source location was null"); } if (getCodeSourceSecurity(cs.getLocation()) == null) { throw new NullPointerException("Code source security was null"); } if (getCodeSourceSecurity(cs.getLocation()).getSecurityType() == null) { OutputController.getLogger().log(new NullPointerException("Warning! Code source security type was null")); } Object securityType = getCodeSourceSecurity(cs.getLocation()).getSecurityType(); if (SecurityDesc.ALL_PERMISSIONS.equals(securityType) || SecurityDesc.J2EE_PERMISSIONS.equals(securityType)) { permissions = getCodeSourceSecurity(cs.getLocation()).getPermissions(cs); } } for (Permission perm : Collections.list(permissions.elements())) { result.add(perm); } } // add in permission to read the cached JAR files for (Permission perm : resourcePermissions) { result.add(perm); } // add in the permissions that the user granted. for (Permission perm : runtimePermissions) { result.add(perm); } // Class from host X should be allowed to connect to host X if (cs.getLocation() != null && cs.getLocation().getHost().length() > 0) { result.add(new SocketPermission(UrlUtils.getHostAndPort(cs.getLocation()), "connect, accept")); } return result; } catch (RuntimeException ex) { OutputController.getLogger().log(ex); throw ex; } } protected void addPermission(Permission p) { runtimePermissions.add(p); } /** * Adds to the specified list of JARS any other JARs that need to be loaded * at the same time as the JARs specified (ie, are in the same part). * * @param jars jar archives to be added */ protected void fillInPartJars(List jars) { //can not use iterator, will rise ConcurrentModificationException on jars.add(jar); for (int x = 0; x < jars.size(); x++) { String part = jars.get(x).getPart(); // "available" field can be affected by two different threads // working in loadClass(String) synchronized (available) { for (JARDesc jar : available) { if (part != null && part.equals(jar.getPart())) { if (!jars.contains(jar)) { jars.add(jar); } } } } } } /** * Ensures that the list of jars have all been transferred, and makes them * available to the classloader. If a jar contains native code, the * libraries will be extracted and placed in the path. * * @param jars the list of jars to load */ protected void activateJars(final List jars) { PrivilegedAction activate = new PrivilegedAction() { @SuppressWarnings("deprecation") @Override public Void run() { // transfer the Jars waitForJars(jars); for (JARDesc jar : jars) { available.remove(jar); // add jar File localFile = tracker.getCacheFile(jar.getLocation()); try { URL location = jar.getLocation(); // non-cacheable, use source location if (localFile != null) { // TODO: Should be toURI().toURL() location = localFile.toURL(); // cached file // This is really not the best way.. but we need some way for // PluginAppletViewer::getCachedImageRef() to check if the image // is available locally, and it cannot use getResources() because // that prefetches the resource, which confuses MediaTracker.waitForAll() // which does a wait(), waiting for notification (presumably // thrown after a resource is fetched). This bug manifests itself // particularly when using The FileManager applet from Webmin. try (JarFile jarFile = new JarFile(localFile)) { for (JarEntry je : Collections.list(jarFile.entries())) { // another jar in my jar? it is more likely than you think if (je.getName().endsWith(".jar")) { // We need to extract that jar so that it can be loaded // (inline loading with "jar:..!/..." path will not work // with standard classloader methods) String extractedJarLocation = localFile + ".nested/" + je.getName(); File parentDir = new File(extractedJarLocation).getParentFile(); if (!parentDir.isDirectory() && !parentDir.mkdirs()) { throw new RuntimeException(R("RNestedJarExtration")); } FileOutputStream extractedJar = new FileOutputStream(extractedJarLocation); InputStream is = jarFile.getInputStream(je); byte[] bytes = new byte[1024]; int read = is.read(bytes); int fileSize = read; while (read > 0) { extractedJar.write(bytes, 0, read); read = is.read(bytes); fileSize += read; } is.close(); extractedJar.close(); // 0 byte file? skip if (fileSize <= 0) { continue; } tracker.addResource(new File(extractedJarLocation).toURL(), null, null, null); URL codebase = file.getCodeBase(); if (codebase == null) { //FIXME: codebase should be the codebase of the Main Jar not //the location. Although, it still works in the current state. codebase = file.getResources().getMainJAR().getLocation(); } final SecurityDesc jarSecurity = securityDelegate.getJarPermissions(codebase); try { URL fileURL = new URL("file://" + extractedJarLocation); // there is no remote URL for this, so lets fake one URL fakeRemote = new URL(jar.getLocation().toString() + "!" + je.getName()); CachedJarFileCallback.getInstance().addMapping(fakeRemote, fileURL); addURL(fakeRemote); jarLocationSecurityMap.put(fakeRemote, jarSecurity); } catch (MalformedURLException mfue) { OutputController.getLogger().log(OutputController.Level.WARNING_DEBUG, "Unable to add extracted nested jar to classpath"); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, mfue); } } jarEntries.add(je.getName()); } } } addURL(jar.getLocation()); // there is currently no mechanism to cache files per // instance.. so only index cached files if (localFile != null) { CachedJarFileCallback.getInstance().addMapping(jar.getLocation(), localFile.toURI().toURL()); try (JarFile jarFile = new JarFile(localFile.getAbsolutePath())) { Manifest mf = jarFile.getManifest(); // Only check classpath if this is the plugin and there is no jnlp_href usage. // Note that this is different from proprietary plugin behaviour. // If jnlp_href is used, the app should be treated similarly to when // it is run from javaws as a webstart. if (file instanceof PluginBridge && !((PluginBridge) file).useJNLPHref()) { classpaths.addAll(getClassPathsFromManifest(mf, jar.getLocation().getPath())); } JarIndexAccess index = JarIndexAccess.getJarIndex(jarFile); if (index != null) { jarIndexes.add(index); } } } else { CachedJarFileCallback.getInstance().addMapping(jar.getLocation(), jar.getLocation()); } OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Activate jar: " + location); } catch (Exception ex) { OutputController.getLogger().log(ex); } // some programs place a native library in any jar nativeLibraryStorage.addSearchJar(jar.getLocation()); } return null; } }; AccessController.doPrivileged(activate, acc); } /** * Return the absolute path to the native library. */ protected String findLibrary(String lib) { String syslib = System.mapLibraryName(lib); File libFile = nativeLibraryStorage.findLibrary(syslib); if (libFile != null) { return libFile.toString(); } String result = super.findLibrary(lib); if (result != null) { return result; } return findLibraryExt(lib); } /** * Try to find the library path from another peer classloader. * * @param lib library to be found * @return location of library */ protected String findLibraryExt(String lib) { for (JNLPClassLoader loader : loaders) { String result = null; if (loader != this) { result = loader.findLibrary(lib); } if (result != null) { return result; } } return null; } /** * Wait for a group of JARs, and send download events if there is a download * listener or display a progress window otherwise. * * @param jars the jars */ private void waitForJars(List jars) { URL urls[] = new URL[jars.size()]; for (int i = 0; i < jars.size(); i++) { JARDesc jar = jars.get(i); urls[i] = jar.getLocation(); } CacheUtil.waitForResources(app, tracker, urls, file.getTitle()); } /** * Find the loaded class in this loader or any of its extension loaders. * * @param name name of class * @return the class found by name */ protected Class findLoadedClassAll(String name) { for (JNLPClassLoader loader : loaders) { Class result; if (loader == this) { result = JNLPClassLoader.super.findLoadedClass(name); } else { result = loader.findLoadedClassAll(name); } if (result != null) { return result; } } // Result is still null. Return what the codebaseloader // has (which returns null if it is not loaded there either) if (codeBaseLoader != null) { return codeBaseLoader.findLoadedClassFromParent(name); } else { return null; } } /** * Find a JAR in the shared 'extension' classloaders, this classloader, or * one of the classloaders for the JNLP file's extensions. This method used * to be qualified "synchronized." This was done solely for the purpose of * ensuring only one thread entered the method at a time. This was not * strictly necessary - ensuring that all affected fields are thread-safe is * sufficient. Locking on the JNLPClassLoader instance when this method is * called can result in deadlock if another thread is dealing with the * CodebaseClassLoader at the same time. This solution is very heavy-handed * as the instance lock is not truly required, and taking the lock on the * classloader instance when not needed is not in general a good idea * because it can and will lead to deadlock when multithreaded classloading * is in effect. The solution is to keep the fields thread safe on their * own. This is accomplished by wrapping them in Collections.synchronized* * to provide atomic add/remove operations, and synchronizing on them when * iterating or performing multiple mutations. See bug report RH976833. On * some systems this bug will manifest itself as deadlock on every webpage * with more than one Java applet, potentially also causing the browser * process to hang. More information in the mailing list archives: * http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2013-September/024536.html * * Affected fields: available, classpaths, jarIndexes, jarEntries, * jarLocationSecurityMap */ @Override public Class loadClass(String name) throws ClassNotFoundException { Class result = findLoadedClassAll(name); // try parent classloader if (result == null) { try { ClassLoader parent = getParent(); if (parent == null) { parent = ClassLoader.getSystemClassLoader(); } return parent.loadClass(name); } catch (ClassNotFoundException ex) { } } // filter out 'bad' package names like java, javax // validPackage(name); // search this and the extension loaders if (result == null) { try { result = loadClassExt(name); } catch (ClassNotFoundException cnfe) { // Not found in external loader either // Look in 'Class-Path' as specified in the manifest file try { // This field synchronized before iterating over it since it may // be shared data between threads synchronized (classpaths) { for (String classpath : classpaths) { JARDesc desc; try { URL jarUrl = new URL(file.getCodeBase(), classpath); desc = new JARDesc(jarUrl, null, null, false, true, false, true); } catch (MalformedURLException mfe) { throw new ClassNotFoundException(name, mfe); } addNewJar(desc); } } result = loadClassExt(name); return result; } catch (ClassNotFoundException cnfe1) { OutputController.getLogger().log(cnfe1); } // As a last resort, look in any available indexes // Currently this loads jars directly from the site. We cannot cache it because this // call is initiated from within the applet, which does not have disk read/write permissions // This field synchronized before iterating over it since it may // be shared data between threads synchronized (jarIndexes) { for (JarIndexAccess index : jarIndexes) { // Non-generic code in sun.misc.JarIndex @SuppressWarnings("unchecked") LinkedList jarList = index.get(name.replace('.', '/')); if (jarList != null) { for (String jarName : jarList) { JARDesc desc; try { desc = new JARDesc(new URL(file.getCodeBase(), jarName), null, null, false, true, false, true); } catch (MalformedURLException mfe) { throw new ClassNotFoundException(name); } try { addNewJar(desc); } catch (Exception e) { OutputController.getLogger().log(e); } } // If it still fails, let it error out result = loadClassExt(name); } } } } } if (result == null) { throw new ClassNotFoundException(name); } return result; } /** * Adds a new JARDesc into this classloader. *

    * This will add the JARDesc into the resourceTracker and block until it is * downloaded. *

    * * @param desc the JARDesc for the new jar */ private void addNewJar(final JARDesc desc) { this.addNewJar(desc, JNLPRuntime.getDefaultUpdatePolicy()); } /** * Adds a new JARDesc into this classloader. * * @param desc the JARDesc for the new jar * @param updatePolicy the UpdatePolicy for the resource */ private void addNewJar(final JARDesc desc, UpdatePolicy updatePolicy) { available.add(desc); tracker.addResource(desc.getLocation(), desc.getVersion(), null, updatePolicy ); // Give read permissions to the cached jar file AccessController.doPrivileged(new PrivilegedAction() { @Override public Void run() { Permission p = CacheUtil.getReadPermission(desc.getLocation(), desc.getVersion()); resourcePermissions.add(p); return null; } }); final URL remoteURL = desc.getLocation(); final URL cachedUrl = tracker.getCacheURL(remoteURL); // blocks till download available.remove(desc); // Resource downloaded. Remove from available list. try { // Verify if needed final List jars = new ArrayList<>(); jars.add(desc); // Decide what level of security this jar should have // The verification and security setting functions rely on // having AllPermissions as those actions normally happen // during initialization. We therefore need to do those // actions as privileged. AccessController.doPrivileged(new PrivilegedExceptionAction() { @Override public Void run() throws Exception { jcv.add(jars, tracker); checkTrustWithUser(); final SecurityDesc security = securityDelegate.getJarPermissions(file.getCodeBase()); jarLocationSecurityMap.put(remoteURL, security); return null; } }); addURL(remoteURL); CachedJarFileCallback.getInstance().addMapping(remoteURL, cachedUrl); } catch (Exception e) { // Do nothing. This code is called by loadClass which cannot // throw additional exceptions. So instead, just ignore it. // Exception => jar will not get added to classpath, which will // result in CNFE from loadClass. OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } /** * Find the class in this loader or any of its extension loaders. */ @Override protected Class findClass(String name) throws ClassNotFoundException { for (JNLPClassLoader loader : loaders) { try { if (loader == this) { final String fName = name; return AccessController.doPrivileged( new PrivilegedExceptionAction>() { @Override public Class run() throws ClassNotFoundException { return JNLPClassLoader.super.findClass(fName); } }, getAccessControlContextForClassLoading()); } else { return loader.findClass(name); } } catch (ClassNotFoundException | PrivilegedActionException ex) { } catch (ClassFormatError cfe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, cfe); } catch (NullJnlpFileException ex) { throw new ClassNotFoundException(this.mainClass + " in main classloader ", ex); } } // Try codebase loader if (codeBaseLoader != null) { return codeBaseLoader.findClassNonRecursive(name); } // All else failed. Throw CNFE throw new ClassNotFoundException(name); } /** * Search for the class by incrementally adding resources to the classloader * and its extension classloaders until the resource is found. */ private Class loadClassExt(String name) throws ClassNotFoundException { // make recursive addAvailable(); // find it try { return findClass(name); } catch (ClassNotFoundException ex) { } // add resources until found while (true) { JNLPClassLoader addedTo = null; try { addedTo = addNextResource(); } catch (LaunchException e) { /* * This method will never handle any search for the main class * [It is handled in initializeResources()]. Therefore, this * exception will never be thrown here and is escaped */ throw new IllegalStateException(e); } if (addedTo == null) { throw new ClassNotFoundException(name); } try { return addedTo.findClass(name); } catch (ClassNotFoundException ex) { } } } /** * Finds the resource in this, the parent, or the extension class loaders. * * @return a {@link URL} for the resource, or {@code null} if the resource * could not be found. */ @Override public URL findResource(String name) { URL result = null; try { Enumeration e = findResources(name); if (e.hasMoreElements()) { result = e.nextElement(); } } catch (IOException e) { OutputController.getLogger().log(e); } // If result is still null, look in the codebase loader if (result == null && codeBaseLoader != null) { result = codeBaseLoader.findResource(name); } return result; } /** * Find the resources in this, the parent, or the extension class loaders. * Load lazy resources if not found in current resources. */ @Override public Enumeration findResources(String name) throws IOException { Enumeration lresources = findResourcesBySearching(name); try { // if not found, load all lazy resources; repeat search while (!lresources.hasMoreElements() && addNextResource() != null) { lresources = findResourcesBySearching(name); } } catch (LaunchException le) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, le); } return lresources; } /** * Find the resources in this, the parent, or the extension class loaders. */ private Enumeration findResourcesBySearching(String name) throws IOException { List lresources = new ArrayList<>(); Enumeration e = null; for (JNLPClassLoader loader : loaders) { // TODO check if this will blow up or not // if loaders[1].getResource() is called, wont it call getResource() on // the original caller? infinite recursion? if (loader == this) { final String fName = name; try { e = AccessController.doPrivileged( new PrivilegedExceptionAction>() { @Override public Enumeration run() throws IOException { return JNLPClassLoader.super.findResources(fName); } }, getAccessControlContextForClassLoading()); } catch (PrivilegedActionException pae) { } } else { e = loader.findResources(name); } final Enumeration fURLEnum = e; try { lresources.addAll(AccessController.doPrivileged( new PrivilegedExceptionAction>() { @Override public Collection run() { List resources = new ArrayList<>(); while (fURLEnum != null && fURLEnum.hasMoreElements()) { resources.add(fURLEnum.nextElement()); } return resources; } }, getAccessControlContextForClassLoading())); } catch (PrivilegedActionException pae) { } } // Add resources from codebase (only if nothing was found above, // otherwise the server will get hammered) if (lresources.isEmpty() && codeBaseLoader != null) { e = codeBaseLoader.findResources(name); while (e.hasMoreElements()) { lresources.add(e.nextElement()); } } return Collections.enumeration(lresources); } /** * Returns if the specified resource is available locally from a cached jar * * @param s The name of the resource * @return Whether or not the resource is available locally */ public boolean resourceAvailableLocally(String s) { return jarEntries.contains(s); } /** * Adds whatever resources have already been downloaded in the background. */ protected void addAvailable() { // go through available, check tracker for it and all of its // part brothers being available immediately, add them. for (int i = 1; i < loaders.length; i++) { loaders[i].addAvailable(); } } /** * Adds the next unused resource to the classloader. That resource and all * those in the same part will be downloaded and added to the classloader * before returning. If there are no more resources to add, the method * returns immediately. * * @return the classloader that resources were added to, or null * @throws LaunchException Thrown if the signed JNLP file, within the main * jar, fails to be verified or does not match */ protected JNLPClassLoader addNextResource() throws LaunchException { if (available.isEmpty()) { for (int i = 1; i < loaders.length; i++) { JNLPClassLoader result = loaders[i].addNextResource(); if (result != null) { return result; } } return null; } // add jar List jars = new ArrayList<>(); jars.add(available.get(0)); fillInPartJars(jars); checkForMain(jars); activateJars(jars); return this; } // this part compatibility with previous classloader /** * @return title if available. Substitutions if not. * @deprecated */ @Deprecated public String getExtensionName() { String result = file.getInformation().getTitle(); if (result == null) { result = file.getInformation().getDescription(); } if (result == null && file.getFileLocation() != null) { result = file.getFileLocation().toString(); } if (result == null && file.getCodeBase() != null) { result = file.getCodeBase().toString(); } return result; } /** * @return location if jnlp * @deprecated */ @Deprecated public String getExtensionHREF() { return file.getFileLocation().toString(); } public boolean getSigning() { return signing == SigningState.FULL; } /** * Call this when it's suspected that an applet's permission level may have * just changed from Full Signing to Partial Signing. This will display a * one-time prompt asking the user to confirm running the partially signed * applet. Partially Signed applets always start off as appearing to be * Fully Signed, and then during the initialization or loading process, we * find that we actually need to demote the applet to Partial, either due to * finding that not all of its JARs are actually signed, or because it needs * to load something unsigned out of the codebase. */ private void checkPartialSigningWithUser() { if (signing == SigningState.FULL && JNLPRuntime.isVerifying()) { signing = SigningState.PARTIAL; try { securityDelegate.promptUserOnPartialSigning(); } catch (LaunchException e) { throw new RuntimeException("The signed applet required loading of unsigned code from the codebase, " + "which the user refused", e); } } } public SigningState getSigningState() { return signing; } protected SecurityDesc getSecurity() { return security; } /** * Returns the security descriptor for given code source URL * * @param source the origin (remote) url of the code * @return The SecurityDescriptor for that source */ protected SecurityDesc getCodeSourceSecurity(URL source) { SecurityDesc sec = jarLocationSecurityMap.get(source); synchronized (alreadyTried) { if (sec == null && !alreadyTried.contains(source)) { alreadyTried.add(source); //try to load the jar which is requesting the permissions, but was NOT downloaded by standard way OutputController.getLogger().log("Application is trying to get permissions for " + source.toString() + ", which was not added by standard way. Trying to download and verify!"); try { JARDesc des = new JARDesc(source, null, null, false, false, false, false); addNewJar(des); sec = jarLocationSecurityMap.get(source); } catch (Throwable t) { OutputController.getLogger().log(t); sec = null; } } } if (sec == null) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("LNoSecInstance", source.toString())); } return sec; } /** * Merges the code source/security descriptor mapping from another loader * * @param extLoader The loader form which to merge * @throws SecurityException if the code is called from an untrusted source */ private void merge(JNLPClassLoader extLoader) { try { System.getSecurityManager().checkPermission(new AllPermission()); } catch (SecurityException se) { throw new SecurityException("JNLPClassLoader() may only be called from trusted sources!"); } // jars for (URL u : extLoader.getURLs()) { addURL(u); } // Codebase addToCodeBaseLoader(extLoader.file.getCodeBase()); // native search paths for (File nativeDirectory : extLoader.nativeLibraryStorage.getSearchDirectories()) { nativeLibraryStorage.addSearchDirectory(nativeDirectory); } // security descriptors synchronized (jarLocationSecurityMap) { for (URL key : extLoader.jarLocationSecurityMap.keySet()) { jarLocationSecurityMap.put(key, extLoader.jarLocationSecurityMap.get(key)); } } } /** * Adds the given path to the path loader * * @param u the path to add * @throws IllegalArgumentException If the given url is not a path */ private void addToCodeBaseLoader(URL u) { if (u == null) { return; } // Only paths may be added if (!u.getFile().endsWith("/")) { throw new IllegalArgumentException("addToPathLoader only accepts path based URLs"); } // If there is no loader yet, create one, else add it to the // existing one (happens when called from merge()) if (codeBaseLoader == null) { codeBaseLoader = new CodeBaseClassLoader(new URL[]{u}, this); } else { codeBaseLoader.addURL(u); } } /** * Returns a set of paths that indicate the Class-Path entries in the * manifest file. The paths are rooted in the same directory as the * originalJarPath. * * @param mf the manifest * @param originalJarPath the remote/original path of the jar containing the * manifest * @return a Set of String where each string is a path to the jar on the * original jar's classpath. */ private Set getClassPathsFromManifest(Manifest mf, String originalJarPath) { Set result = new HashSet<>(); if (mf != null) { // extract the Class-Path entries from the manifest and split them String classpath = mf.getMainAttributes().getValue("Class-Path"); if (classpath == null || classpath.trim().length() == 0) { return result; } String[] paths = classpath.split(" +"); for (String path : paths) { if (path.trim().length() == 0) { continue; } // we want to search for jars in the same subdir on the server // as the original jar that contains the manifest file, so find // out its subdirectory and use that as the dir String dir = ""; int lastSlash = originalJarPath.lastIndexOf("/"); if (lastSlash != -1) { dir = originalJarPath.substring(0, lastSlash + 1); } String fullPath = dir + path; result.add(fullPath); } } return result; } /** * Increments loader use count by 1 * * @throws SecurityException if caller is not trusted */ private void incrementLoaderUseCount() { // For use by trusted code only if (System.getSecurityManager() != null) { System.getSecurityManager().checkPermission(new AllPermission()); } // NB: There will only ever be one class-loader per unique-key synchronized (getUniqueKeyLock(file.getUniqueKey())) { useCount++; } } /** * Returns all loaders that this loader uses, including itself */ JNLPClassLoader[] getLoaders() { return loaders; } /** * Remove jars from the file system. * * @param jars Jars marked for removal. */ void removeJars(JARDesc[] jars) { for (JARDesc eachJar : jars) { try { tracker.removeResource(eachJar.getLocation()); } catch (Exception e) { OutputController.getLogger().log(e); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Failed to remove resource from tracker, continuing.."); } File cachedFile = CacheUtil.getCacheFile(eachJar.getLocation(), null); String directoryUrl = CacheUtil.getCacheParentDirectory(cachedFile.getAbsolutePath()); File directory = new File(directoryUrl); OutputController.getLogger().log("Deleting cached file: " + cachedFile.getAbsolutePath()); cachedFile.delete(); OutputController.getLogger().log("Deleting cached directory: " + directory.getAbsolutePath()); directory.delete(); } } /** * Downloads and initializes jars into this loader. * * @param ref Path of the launch or extension JNLP File containing the * resource. If null, main JNLP's file location will be used instead. * @param part The name of the path. * @throws LaunchException */ void initializeNewJarDownload(URL ref, String part, Version version) { JARDesc[] jars = ManageJnlpResources.findJars(this, ref, part, version); for (JARDesc eachJar : jars) { OutputController.getLogger().log("Downloading and initializing jar: " + eachJar.getLocation().toString()); this.addNewJar(eachJar, UpdatePolicy.FORCE); } } /** * Manages DownloadService jars which are not mentioned in the JNLP file * * @param ref Path to the resource. * @param version The version of resource. If null, no version is specified. * @param action The action to perform with the resource. Either * DOWNLOADTOCACHE, REMOVEFROMCACHE, or CHECKCACHE. * @return true if CHECKCACHE and the resource is cached. */ boolean manageExternalJars(URL ref, String version, DownloadAction action) { boolean approved = false; JNLPClassLoader foundLoader = LocateJnlpClassLoader.getLoaderByResourceUrl(this, ref, version); Version resourceVersion = (version == null) ? null : new Version(version); if (foundLoader != null) { approved = true; } else if (ref.toString().startsWith(file.getNotNullProbalbeCodeBase().toString())) { approved = true; } else if (SecurityDesc.ALL_PERMISSIONS.equals(security.getSecurityType())) { approved = true; } if (approved) { if (foundLoader == null) { foundLoader = this; } if (action == DownloadAction.DOWNLOAD_TO_CACHE) { JARDesc jarToCache = new JARDesc(ref, resourceVersion, null, false, true, false, true); OutputController.getLogger().log("Downloading and initializing jar: " + ref.toString()); foundLoader.addNewJar(jarToCache, UpdatePolicy.FORCE); } else if (action == DownloadAction.REMOVE_FROM_CACHE) { JARDesc[] jarToRemove = {new JARDesc(ref, resourceVersion, null, false, true, false, true)}; foundLoader.removeJars(jarToRemove); } else if (action == DownloadAction.CHECK_CACHE) { return CacheUtil.isCached(ref, resourceVersion); } } return false; } /** * Decrements loader use count by 1 * * If count reaches 0, loader is removed from list of available loaders * * @throws SecurityException if caller is not trusted */ public void decrementLoaderUseCount() { // For use by trusted code only if (System.getSecurityManager() != null) { System.getSecurityManager().checkPermission(new AllPermission()); } String uniqueKey = file.getUniqueKey(); // NB: There will only ever be one class-loader per unique-key synchronized (getUniqueKeyLock(uniqueKey)) { useCount--; if (useCount <= 0) { uniqueKeyToLoader.remove(uniqueKey); } } } /** * Returns an appropriate AccessControlContext for loading classes in the * running instance. * * The default context during class-loading only allows connection to * codebase. However applets are allowed to load jars from arbitrary * locations and the codebase only access falls short if a class from one * location needs a class from another. * * Given protected access since CodeBaseClassloader uses this function too. * * @return The appropriate AccessControlContext for loading classes for this * instance */ public AccessControlContext getAccessControlContextForClassLoading() { AccessControlContext context = AccessController.getContext(); try { context.checkPermission(new AllPermission()); return context; // If context already has all permissions, don't bother } catch (AccessControlException ace) { // continue below } // Since this is for class-loading, technically any class from one jar // should be able to access a class from another, therefore making the // original context code source irrelevant PermissionCollection permissions = this.security.getSandBoxPermissions(); // Local cache access permissions for (Permission resourcePermission : resourcePermissions) { permissions.add(resourcePermission); } // Permissions for all remote hosting urls synchronized (jarLocationSecurityMap) { for (URL u : jarLocationSecurityMap.keySet()) { permissions.add(new SocketPermission(UrlUtils.getHostAndPort(u), "connect, accept")); } } // Permissions for codebase urls (if there is a loader) if (codeBaseLoader != null) { for (URL u : codeBaseLoader.getURLs()) { permissions.add(new SocketPermission(UrlUtils.getHostAndPort(u), "connect, accept")); } } ProtectionDomain pd = new ProtectionDomain(null, permissions); return new AccessControlContext(new ProtectionDomain[]{pd}); } public String getMainClass() { return mainClass; } /** * SecurityDelegate, in real usage, relies on having a "parent" * JNLPClassLoader instance. However, JNLPClassLoaders are very large, * heavyweight, difficult-to-mock objects, which means that unit testing on * anything that uses a SecurityDelegate can become very difficult. For * example, JarCertVerifier is designed separated from the ClassLoader so it * can be tested in isolation. However, JCV needs some sort of access back * to JNLPClassLoader instances to be able to invoke setRunInSandbox(). The * SecurityDelegate handles this, allowing JCV to be tested without * instantiating JNLPClassLoaders, by creating a fake SecurityDelegate that * does not require one. */ public static interface SecurityDelegate { public boolean isPluginApplet(); public boolean userPromptedForPartialSigning(); public boolean userPromptedForSandbox(); public SecurityDesc getCodebaseSecurityDesc(final JARDesc jarDesc, final URL codebaseHost); public SecurityDesc getClassLoaderSecurity(final URL codebaseHost) throws LaunchException; public SecurityDesc getJarPermissions(final URL codebaseHost); public void promptUserOnPartialSigning() throws LaunchException; public void setRunInSandbox() throws LaunchException; public boolean getRunInSandbox(); public void addPermission(final Permission perm); public void addPermissions(final PermissionCollection perms); public void addPermissions(final Collection perms); } /** * Handles security decision logic for the JNLPClassLoader, eg which * permission level to assign to JARs. */ public static class SecurityDelegateImpl implements SecurityDelegate { private final JNLPClassLoader classLoader; private boolean runInSandbox; private boolean promptedForPartialSigning; private boolean promptedForSandbox; public SecurityDelegateImpl(final JNLPClassLoader classLoader) { this.classLoader = classLoader; runInSandbox = false; promptedForSandbox = false; } @Override public boolean isPluginApplet() { return classLoader.file instanceof PluginBridge; } @Override public SecurityDesc getCodebaseSecurityDesc(final JARDesc jarDesc, final URL codebaseHost) { if (runInSandbox) { return new SecurityDesc(classLoader.file, SecurityDesc.SANDBOX_PERMISSIONS, codebaseHost); } else if (isPluginApplet()) { try { if (JarCertVerifier.isJarSigned(jarDesc, new PluginAppVerifier(), classLoader.tracker)) { return new SecurityDesc(classLoader.file, SecurityDesc.ALL_PERMISSIONS, codebaseHost); } else { return new SecurityDesc(classLoader.file, SecurityDesc.SANDBOX_PERMISSIONS, codebaseHost); } } catch (final Exception e) { OutputController.getLogger().log(e); return new SecurityDesc(classLoader.file, SecurityDesc.SANDBOX_PERMISSIONS, codebaseHost); } } else { return classLoader.file.getSecurity(); } } @Override public SecurityDesc getClassLoaderSecurity(final URL codebaseHost) throws LaunchException { if (isPluginApplet()) { if (!runInSandbox && classLoader.getSigning()) { return new SecurityDesc(classLoader.file, SecurityDesc.ALL_PERMISSIONS, codebaseHost); } else { return new SecurityDesc(classLoader.file, SecurityDesc.SANDBOX_PERMISSIONS, codebaseHost); } } else /* * Various combinations of the jars being signed and tags being * present are possible. They are treated as follows * * Jars JNLP File Result * * Signed Appropriate Permissions * Signed no Sandbox * Unsigned Error * Unsigned no Sandbox * */ if (!runInSandbox && !classLoader.getSigning() && !classLoader.file.getSecurity().getSecurityType().equals(SecurityDesc.SANDBOX_PERMISSIONS)) { if (classLoader.jcv.allJarsSigned()) { LaunchException ex = new LaunchException(classLoader.file, null, R("LSFatal"), R("LCClient"), R("LSignedJNLPAppDifferentCerts"), R("LSignedJNLPAppDifferentCertsInfo")); consultCertificateSecurityException(ex); return consultResult(codebaseHost); } else { LaunchException ex = new LaunchException(classLoader.file, null, R("LSFatal"), R("LCClient"), R("LUnsignedJarWithSecurity"), R("LUnsignedJarWithSecurityInfo"));; consultCertificateSecurityException(ex); return consultResult(codebaseHost); } } else return consultResult(codebaseHost); } private SecurityDesc consultResult(URL codebaseHost){ if (!runInSandbox && classLoader.getSigning()) { return classLoader.file.getSecurity(); } else { return new SecurityDesc(classLoader.file, SecurityDesc.SANDBOX_PERMISSIONS, codebaseHost); } } @Override public SecurityDesc getJarPermissions(final URL codebaseHost) { if (!runInSandbox && classLoader.jcv.isFullySigned()) { // Already trust application, nested jar should be given return new SecurityDesc(classLoader.file, SecurityDesc.ALL_PERMISSIONS, codebaseHost); } else { return new SecurityDesc(classLoader.file, SecurityDesc.SANDBOX_PERMISSIONS, codebaseHost); } } @Override public void setRunInSandbox() throws LaunchException { if (runInSandbox && classLoader.security != null && !classLoader.jarLocationSecurityMap.isEmpty()) { throw new LaunchException(classLoader.file, null, R("LSFatal"), R("LCInit"), R("LRunInSandboxError"), R("LRunInSandboxErrorInfo")); } JNLPRuntime.reloadPolicy(); // ensure that we have the most up-to-date custom policy loaded since the user may have just launched PolicyEditor // to create a custom policy for the applet they are about to run this.promptedForSandbox = true; this.runInSandbox = true; } @Override public void promptUserOnPartialSigning() throws LaunchException { if (promptedForPartialSigning) { return; } promptedForPartialSigning = true; UnsignedAppletTrustConfirmation.checkPartiallySignedWithUserIfRequired(this, classLoader.file, classLoader.jcv); } @Override public boolean getRunInSandbox() { return this.runInSandbox; } @Override public boolean userPromptedForPartialSigning() { return this.promptedForPartialSigning; } @Override public boolean userPromptedForSandbox() { return this.promptedForSandbox; } @Override public void addPermission(final Permission perm) { classLoader.addPermission(perm); } @Override public void addPermissions(final PermissionCollection perms) { Enumeration e = perms.elements(); while (e.hasMoreElements()) { addPermission(e.nextElement()); } } @Override public void addPermissions(final Collection perms) { for (final Permission perm : perms) { addPermission(perm); } } } /* * Helper class to expose protected URLClassLoader methods. * Classes loaded from the codebase are absolutely NOT signed, by definition! * If the CodeBaseClassLoader is used to load any classes in JNLPClassLoader, * then you *MUST* check if the JNLPClassLoader is set to FULL signing. If so, * then it must be set instead to PARTIAL, and the user prompted if it is okay * to proceed. If the JNLPClassLoader is already PARTIAL or NONE signing, then * nothing must be done. This is required so that we can support partial signing * of applets but also ensure that using codebase loading in conjunction with * signed JARs still results in the user having to confirm that this is * acceptable. */ public static class CodeBaseClassLoader extends URLClassLoader { JNLPClassLoader parentJNLPClassLoader; /** * Classes that are not found, so that findClass can skip them next time */ ConcurrentHashMap notFoundResources = new ConcurrentHashMap(); public CodeBaseClassLoader(URL[] urls, JNLPClassLoader cl) { super(urls, cl); parentJNLPClassLoader = cl; } @Override public void addURL(URL url) { super.addURL(url); } /* * Use with care! Check the class-level Javadoc before calling this. */ Class findClassNonRecursive(final String name) throws ClassNotFoundException { // If we have searched this path before, don't try again if (Arrays.equals(super.getURLs(), notFoundResources.get(name))) { throw new ClassNotFoundException(name); } try { return AccessController.doPrivileged( new PrivilegedExceptionAction>() { public Class run() throws ClassNotFoundException { Class c = CodeBaseClassLoader.super.findClass(name); parentJNLPClassLoader.checkPartialSigningWithUser(); return c; } }, parentJNLPClassLoader.getAccessControlContextForClassLoading()); } catch (PrivilegedActionException pae) { notFoundResources.put(name, super.getURLs()); throw new ClassNotFoundException("Could not find class " + name, pae); } catch (NullJnlpFileException njf) { notFoundResources.put(name, super.getURLs()); throw new ClassNotFoundException("Could not find class " + name, njf); } } /* * Use with care! Check the class-level Javadoc before calling this. */ @Override public Class findClass(String name) throws ClassNotFoundException { // Calls JNLPClassLoader#findClass which may call into this.findClassNonRecursive Class c = getParentJNLPClassLoader().findClass(name); parentJNLPClassLoader.checkPartialSigningWithUser(); return c; } /** * Returns the output of super.findLoadedClass(). * * The method is renamed because ClassLoader.findLoadedClass() is final * * @param name The name of the class to find * @return Output of ClassLoader.findLoadedClass() which is the class if * found, null otherwise * @see java.lang.ClassLoader#findLoadedClass(String) */ public Class findLoadedClassFromParent(String name) { return findLoadedClass(name); } /** * Returns JNLPClassLoader that encompasses this loader * * @return parent JNLPClassLoader */ public JNLPClassLoader getParentJNLPClassLoader() { return parentJNLPClassLoader; } @Override public Enumeration findResources(String name) throws IOException { // If we have searched this path before, don't try again if (Arrays.equals(super.getURLs(), notFoundResources.get(name))) { return (new Vector(0)).elements(); } if (!name.startsWith("META-INF")) { Enumeration urls = super.findResources(name); if (!urls.hasMoreElements()) { notFoundResources.put(name, super.getURLs()); } return urls; } return (new Vector(0)).elements(); } @Override public URL findResource(String name) { // If we have searched this path before, don't try again if (Arrays.equals(super.getURLs(), notFoundResources.get(name))) { return null; } URL url = null; if (!name.startsWith("META-INF")) { try { final String fName = name; url = AccessController.doPrivileged( new PrivilegedExceptionAction() { public URL run() { return CodeBaseClassLoader.super.findResource(fName); } }, parentJNLPClassLoader.getAccessControlContextForClassLoading()); } catch (PrivilegedActionException pae) { } if (url == null) { notFoundResources.put(name, super.getURLs()); } return url; } return null; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/AppletAudioClip.java0000644000000000000000000000013113441742745025621 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/AppletAudioClip.java0000644000175000002070000000562313441742745026440 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import java.net.*; import java.applet.*; import javax.sound.sampled.*; import net.sourceforge.jnlp.util.logging.OutputController; // based on Deane Richan's AppletAudioClip /** * An applet audio clip using the javax.sound API. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.8 $ */ public class AppletAudioClip implements AudioClip { /** the clip */ private Clip clip; /** * Creates new AudioClip. If the clip cannot be opened no * exception is thrown, instead the methods of the AudioClip * return without performing any operations. * * @param location the clip location */ public AppletAudioClip(URL location) { try { AudioInputStream stream = AudioSystem.getAudioInputStream(location); clip = (Clip) AudioSystem.getLine(new Line.Info(Clip.class)); clip.open(stream); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Error loading sound:" + location.toString()); OutputController.getLogger().log(ex); clip = null; } } /** * Plays the clip in a continuous loop until the stop method is * called. */ public void loop() { if (clip == null) return; clip.loop(Clip.LOOP_CONTINUOUSLY); } /** * Plays the clip from the beginning. */ public void play() { if (clip == null) return; // applet audio clip resets to beginning when played again clip.stop(); clip.setFramePosition(0); clip.start(); } /** * Stops playing the clip. */ public void stop() { if (clip == null) return; clip.stop(); } /** * Stops playing the clip and disposes it; the clip cannot be * played after being disposed. */ void dispose() { if (clip != null) { clip.stop(); clip.flush(); clip.close(); } clip = null; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/package-info.java0000644000000000000000000000013113441742745025126 xustar0030 mtime=1552401893.033832835 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/package-info.java0000644000175000002070000000336413441742745025745 0ustar00jvanekmock00000000000000/* package-info.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.*/ /** * This package contains the classes that manage the secure runtime environment * for JNLP apps. */ package net.sourceforge.jnlp.runtime; icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/LocateJnlpClassLoader.java0000644000000000000000000000013113441742745026752 xustar0030 mtime=1552401893.032832837 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/LocateJnlpClassLoader.java0000644000175000002070000001051713441742745027567 0ustar00jvanekmock00000000000000/* LocateJNLPClassLoader.java Copyright (C) 2012, Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.net.URL; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.ResourcesDesc; import net.sourceforge.jnlp.Version; class LocateJnlpClassLoader { /** * Locates the JNLPClassLoader of the JNLP file. * @param rootClassLoader Root JNLPClassLoader of the application. * @param urlToJnlpFile Path of the JNLP file. If {@code null}, main JNLP file's location * be used instead * @return the JNLPClassLoader of the JNLP file. */ static JNLPClassLoader getLoaderByJnlpFile(final JNLPClassLoader rootClassLoader, URL urlToJnlpFile) { if (rootClassLoader == null) return null; JNLPFile file = rootClassLoader.getJNLPFile(); if (urlToJnlpFile == null) urlToJnlpFile = rootClassLoader.getJNLPFile().getFileLocation(); if (file.getFileLocation().equals(urlToJnlpFile)) return rootClassLoader; for (JNLPClassLoader loader : rootClassLoader.getLoaders()) { if (rootClassLoader != loader) { JNLPClassLoader foundLoader = LocateJnlpClassLoader.getLoaderByJnlpFile(loader, urlToJnlpFile); if (foundLoader != null) return foundLoader; } } return null; } /** * Locates the JNLPClassLoader of the JNLP file's resource. * @param rootClassLoader Root JNLPClassLoader of the application. * @param ref Path of the launch or extension JNLP File. If {@code null}, * main JNLP file's location will be used instead. * @param version The version of resource. Is null if no version is specified * @return the JNLPClassLoader of the JNLP file's resource. */ static JNLPClassLoader getLoaderByResourceUrl(final JNLPClassLoader rootClassLoader, final URL ref, final String version) { Version resourceVersion = (version == null) ? null : new Version(version); for (JNLPClassLoader loader : rootClassLoader.getLoaders()) { ResourcesDesc resources = loader.getJNLPFile().getResources(); for (JARDesc eachJar : resources.getJARs()) { if (ref.equals(eachJar.getLocation()) && (resourceVersion == null || resourceVersion.equals(eachJar.getVersion()))) return loader; } } for (JNLPClassLoader loader : rootClassLoader.getLoaders()) { if (rootClassLoader != loader) { JNLPClassLoader foundLoader = LocateJnlpClassLoader.getLoaderByResourceUrl(loader, ref, version); if (foundLoader != null) return foundLoader; } } return null; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/FakePacEvaluator.java0000644000000000000000000000013113441742745025757 xustar0030 mtime=1552401893.032832837 30 atime=1552402157.229253498 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/FakePacEvaluator.java0000644000175000002070000000412513441742745026572 0ustar00jvanekmock00000000000000/* FakePacEvaluator.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import static net.sourceforge.jnlp.runtime.Translator.R; import java.net.URL; import net.sourceforge.jnlp.util.logging.OutputController; /** * A dummy PacEvaluator that always returns "DIRECT" */ public class FakePacEvaluator implements PacEvaluator { @Override public String getProxies(URL url) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, R("RPRoxyPacNotSupported")); return "DIRECT"; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/html0000644000000000000000000000013013441742745022625 xustar0030 mtime=1552401893.060832779 29 atime=1552410887.11418344 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/0000755000175000002070000000000013441742745023514 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/PaxHeaders.7406/ElementValidator.java0000644000000000000000000000013113441742745027005 xustar0030 mtime=1552401893.060832779 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/ElementValidator.java0000644000175000002070000000342013441742745027615 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime.html; import org.w3c.dom.Element; interface ElementValidator { public boolean isElementValid(Element e); } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/PaxHeaders.7406/AppletParser.java0000644000000000000000000000013113441742745026150 xustar0030 mtime=1552401893.033832835 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/AppletParser.java0000644000175000002070000001540313441742745026764 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime.html; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.ParseException; import net.sourceforge.jnlp.Parser; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.PluginParameters; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; public class AppletParser { private static final String[] PARAMS = new String[]{ "param", "PARAM", "Param" }; private final Element source; private final URL docBase; public AppletParser(Element applet, URL docbase) { this.source = applet; this.docBase = docbase; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("width: ").append(source.getAttribute("width")).append("\n"); sb.append("height: ").append(source.getAttribute("height")).append("\n"); sb.append("codebase: ").append(source.getAttribute("codebase")).append("\n"); sb.append("code: ").append(source.getAttribute("code")).append("\n"); sb.append("archive: ").append(source.getAttribute("archive")).append("\n"); sb.append("data: ").append(source.getAttribute("data")).append("\n"); List found = findParams(); sb.append("params: ").append(found.size()).append("\n"); for (Element element : found) { sb.append("param: ").append(element.getAttribute("name")).append("=").append(element.getAttribute("value")).append("\n"); } return sb.toString(); } public PluginBridge toPluginBridge() throws Exception { return new PluginBridge( createCodebase(), docBase, getArchives(), getMain(), //removing all chars from number - like whitespace, px and so on... new Integer(sanitizeSize(source.getAttribute("width"))), new Integer(sanitizeSize(source.getAttribute("height"))), createParams()); } private URL createCodebase() throws ParseException, MalformedURLException { String inHtmlCodebase = source.getAttribute("codebase"); if (inHtmlCodebase != null && inHtmlCodebase.trim().isEmpty()) { inHtmlCodebase = "."; } URL u = Parser.getURL(inHtmlCodebase, "In html " + source.getNodeName() + "'s codebase", docBase, false); if (!u.toExternalForm().endsWith("/")) { u = new URL(u.toExternalForm() + "/"); } return u; } private PluginParameters createParams() { Map data = new HashMap<>(); List found = findParams(); for (Element element : found) { data.put(element.getAttribute("name"), element.getAttribute("value")); } //strange compatibility issue if (data.get("jnlp_href") == null) { if (data.get("code") == null && data.get("object") == null) { data.put("code", source.getAttribute("code")); } } //push all attributes to map NamedNodeMap atts = source.getAttributes(); for (int i = 0; i < atts.getLength(); i++) { String name = atts.item(i).getNodeName(); String value = atts.item(i).getTextContent(); if (name.trim().equalsIgnoreCase("width") || name.trim().equalsIgnoreCase("height")) { value = sanitizeSize(value); } data.put(name, value); } return new PluginParameters(data); } private List findParams() { return AppletExtractor.findElements(PARAMS, source, new ElementValidator() { @Override public boolean isElementValid(Element e) { return true; } }); } private String getMain() { String s = source.getAttribute("code"); if (s == null || s.trim().length() == 0) { List found = findParams(); for (Element element : found) { if (element.getAttribute("name").equalsIgnoreCase("code")) { s = element.getAttribute("value"); break; } } } if (s == null || s.trim().length() == 0) { s = source.getAttribute("classid"); if (s != null && s.contains(":")) { s = s.split(":")[1]; } } return s; } private String getArchives() { String s = source.getAttribute("archive"); if (s == null || s.trim().length() == 0) { List found = findParams(); for (Element element : found) { if (element.getAttribute("name").equalsIgnoreCase("archive")) { s = element.getAttribute("value"); break; } } } return s; } static String sanitizeSize(String attribute) { if (attribute == null) { return "1"; } //remove all nondigits return attribute.replaceAll("[^0-9]+", ""); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/PaxHeaders.7406/browser0000644000000000000000000000013013441742745024310 xustar0030 mtime=1552401893.041832819 29 atime=1552410887.11418344 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/browser/0000755000175000002070000000000013441742745025177 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/browser/PaxHeaders.7406/HtmlBrowserPanel.java0000644000000000000000000000013113441742745030461 xustar0030 mtime=1552401893.032832837 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/browser/HtmlBrowserPanel.java0000644000175000002070000004014513441742745031276 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime.html.browser; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.html.HTMLDocument; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; /** * this calss intentioanlly NOT cache any content, but always load data. Its * original usecase was to to implement http proxy logging. And there reloads * really metters. * */ public class HtmlBrowserPanel extends JPanel { private void fireDocumentChanged(String current) { for (DocumentChangededListener documentChangededListener : documentChangededListeners) { documentChangededListener.documentChangeded(current); } } private void fireAddressChanged(String url) { for (DocumentChangededListener documentChangededListener : documentChangededListeners) { documentChangededListener.addressChangeded(url); } } private void fireAddressChanged(URL url) { for (DocumentChangededListener documentChangededListener : documentChangededListeners) { documentChangededListener.addressChangeded(url); } } public void addDocumentChangedListener(DocumentChangededListener i) { documentChangededListeners.add(i); } List documentChangededListeners = new ArrayList<>(); public URL getUrl() { if (current == null) { return null; } return current.url; } private static class State { private static String removeMeta(String string) { return string.replaceAll("(?i)<\\s*meta.*?>", ""); //any meta chars confuse 3.2 html jeditorpane heavily } final URL url; final String source; final String all; private State(URL url, String all, String html) { this.url = url; this.all = all; this.source = html; } private String getSource() { if (all == null || all.trim().isEmpty()) { return source; } return all; } private String getHtml() { if (source == null || source.trim().isEmpty()) { return removeMeta(all); } else { return removeMeta(source); } } } private class History { private final List visited = new ArrayList(); private final List backed = new ArrayList(); private URL back() { if (visited.isEmpty()) { return null; } URL q = visited.get(0); visited.remove(0); put(current, backed); URL u = loadCatched(q); //override current createTooltips(); return q; } private URL fwd() { if (backed.isEmpty()) { return null; } URL q = backed.get(0); backed.remove(0); put(current, visited); URL u = loadCatched(q); //override current createTooltips(); return q; } private void put(URL url, List where) { if (url != null) { if (where.isEmpty()) { where.add(0, url); } else if (!where.get(0).equals(url)) { where.add(0, url); } } } private void put(State current, List where) { if (current != null) { put(current.url, where); } } private void visit(String text) { put(current, visited); URL u = loadCatched(text); //override current createTooltips(); } private void visit(URL url) { put(current, visited); URL u = loadCatched(url); //override current createTooltips(); } private void createTooltips() { createTooltip(visited, backButton, Translator.R("BUTback")); createTooltip(backed, fwdButton, Translator.R("BUTforward")); } private void createTooltip(List visited, JButton b, String title) { StringBuilder sb = new StringBuilder("

    " + title + "

      "); JPopupMenu p = new JPopupMenu(); for (final URL url : visited) { sb.append("
    1. ").append(url.toExternalForm()).append("
    2. "); JMenuItem jim = new JMenuItem(url.toExternalForm()); jim.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { visit(url); } }); p.add(jim); } b.removeAll();; b.setComponentPopupMenu(p); sb.append("
    "); b.setToolTipText(sb.toString()); } } private final JPanel customUrl = new JPanel(new BorderLayout()); private final JPanel mainButtons = new JPanel(new GridLayout(1, 0)); private final JPanel tools = new JPanel(new BorderLayout()); private final JTextField goTo = new JTextField(); private final JButton gotoButton = new JButton(Translator.R("BrowserGoTo")); private final JButton backButton = new JButton("<<<"); private final JButton reloadButton = new JButton(Translator.R("BUTreload")); private final JButton fwdButton = new JButton(">>>"); private final JToggleButton viewSourceButton = new JToggleButton(Translator.R("BrowserSource")); private final JCheckBox socketCheckbox = new JCheckBox(Translator.R("BrowserSocket")); private final JComboBox encodingBox = new JComboBox<>(new Charset[]{ null, Charset.forName("US-ASCII"), Charset.forName("UTF-8"), Charset.forName("ISO-8859-1"), Charset.forName("UTF-16"), Charset.forName("UTF-16BE"), Charset.forName("UTF-16LE") }); private static final String TEXTPLAIN = "text/plain"; private static final String TEXTHTML = "text/html"; //because of various relaodings, those are always recreated private JEditorPane currentHtml; private JScrollPane currentScrollHtml; private State current; private boolean source = false; private boolean useSocket = false; private final History history = new History(); public HtmlBrowserPanel(final URL url) { this(url, false); } public HtmlBrowserPanel(final String url) { this(url, false); } public HtmlBrowserPanel(final URL url, boolean socket) { super(new BorderLayout()); setUseSocket(socket); crateGui(); URL u = loadCatched(url); } public HtmlBrowserPanel(final String url, boolean socket) { super(new BorderLayout()); setUseSocket(socket); crateGui(); URL u = loadCatched(url); } private URL loadCatched(String url) { try { URL u = new URL(url); load(u); return u; } catch (Exception ex) { OutputController.getLogger().log(ex); if (!JNLPRuntime.isHeadless()) { JOptionPane.showMessageDialog(null, ex); } return null; } } private URL loadCatched(URL url) { try { load(url); return url; } catch (Exception ex) { OutputController.getLogger().log(ex); if (!JNLPRuntime.isHeadless()) { JOptionPane.showMessageDialog(null, ex); } return null; } } private void load(URL url) throws IOException { goTo.setText(url.toExternalForm()); fireAddressChanged(url); fireAddressChanged(url.toExternalForm()); //url conenction is checking response code.It can be used as 511 is unimplemented String[] result; if (isUseSocket()) { OutputController.getLogger().log("Using socket connection"); Charset ch = (Charset)(encodingBox.getSelectedItem()); if (ch == null) { result = UrlUtils.loadUrlWithInvalidHeader(url); } else { result = UrlUtils.loadUrlWithInvalidHeader(url, ch); } } else { OutputController.getLogger().log("Using URLconnection"); String s; Charset ch = (Charset)(encodingBox.getSelectedItem()); if (ch == null) { s = UrlUtils.loadUrl(url); } else { s = UrlUtils.loadUrl(url, ch); } result = new String[]{s, s, s}; } OutputController.getLogger().log(result[0]); if (result[2].trim().isEmpty()) { result[2] = result[1]; } current = new State(url, result[0], result[2]); if (source) { currentHtml = new JEditorPane(TEXTPLAIN, current.getSource()); if (encodingBox.getSelectedItem()!=null){ currentHtml.getDocument().putProperty("IgnoreCharsetDirective", Boolean.TRUE); } } else { currentHtml = new JEditorPane(TEXTHTML, current.getHtml()); if (encodingBox.getSelectedItem()!=null){ currentHtml.getDocument().putProperty("IgnoreCharsetDirective", Boolean.TRUE); } ((HTMLDocument) currentHtml.getDocument()).setBase(current.url); } fireDocumentChanged(getCurrentSource()); currentHtml.setEditable(false);//oherwise hyperlinks dont work currentHtml.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { URL u = e.getURL(); history.visit(u); } } }); if (currentScrollHtml != null) { this.remove(currentScrollHtml); } currentScrollHtml = new JScrollPane(currentHtml); this.add(currentScrollHtml); this.validate(); } private void crateGui() { mainButtons.add(backButton); backButton.setToolTipText(Translator.R("BUTback")); mainButtons.add(reloadButton); mainButtons.add(fwdButton); fwdButton.setToolTipText(Translator.R("BUTforward")); mainButtons.add(viewSourceButton); mainButtons.add(socketCheckbox); socketCheckbox.setSelected(isUseSocket()); socketCheckbox.setToolTipText(Translator.R("BrowserSocketHelp")); customUrl.add(gotoButton, BorderLayout.WEST); customUrl.add(goTo); customUrl.add(encodingBox, BorderLayout.EAST); tools.add(customUrl, BorderLayout.SOUTH); tools.add(mainButtons, BorderLayout.NORTH); gotoButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { gotoUrl(goTo.getText()); } }); reloadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { URL u = loadCatched(goTo.getText()); } }); goTo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { gotoUrl(goTo.getText()); } }); backButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { URL u = history.back(); } }); fwdButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { URL u = history.fwd(); } }); socketCheckbox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setUseSocket(socketCheckbox.isSelected()); } }); viewSourceButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { source = !source; if (current == null || currentHtml == null) { return; } showBySource(); } }); this.add(tools, BorderLayout.NORTH); } private void showBySource() { if (source) { currentHtml.setContentType(TEXTPLAIN); currentHtml.setText(current.getSource()); } else { currentHtml.setContentType(TEXTHTML); currentHtml.setText(current.getHtml()); ((HTMLDocument) currentHtml.getDocument()).setBase(current.url); } } private void setUseSocket(boolean b) { useSocket = b; if (socketCheckbox != null) { socketCheckbox.setSelected(b); } } public boolean isUseSocket() { return useSocket; } public static void warn() { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("BrowserWarningLine1")); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("BrowserWarningLine2")); } public static void showStandAloneWindow(String url, boolean socket) { warn(); JFrame f = new JFrame(); f.add(new HtmlBrowserPanel(url, socket)); f.pack(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } public String getCurrentSource() { if (current == null) { return ""; } return current.getSource(); } public void gotoUrl(String text) { history.visit(text); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/browser/PaxHeaders.7406/LinkingBrowser.java0000644000000000000000000000013113441742745030170 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/browser/LinkingBrowser.java0000644000175000002070000001016013441742745030777 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime.html.browser; import java.net.Authenticator; import java.net.ProxySelector; import java.net.URL; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import net.sourceforge.jnlp.browser.BrowserAwareProxySelector; import static net.sourceforge.jnlp.runtime.JNLPRuntime.getConfiguration; import net.sourceforge.jnlp.security.JNLPAuthenticator; import net.sourceforge.jnlp.util.logging.JavaConsole; public class LinkingBrowser extends JTabbedPane { private final HtmlBrowserPanel browser; private final LinksPanel linksPanel = new LinksPanel(); public LinkingBrowser(final URL url) { this(url, false); } public LinkingBrowser(final String url) { this(url, false); } public LinkingBrowser(final URL url, boolean socket) { super(); browser = new HtmlBrowserPanel(url, socket); createGui(browser); } public LinkingBrowser(final String url, boolean socket) { super(); browser = new HtmlBrowserPanel(url, socket); createGui(browser); } private void createGui(HtmlBrowserPanel lBrowser) { linksPanel.addressChangeded(lBrowser.getUrl()); linksPanel.parseAndAdd(lBrowser.getCurrentSource()); linksPanel.setInternalBrowser(lBrowser); lBrowser.addDocumentChangedListener(linksPanel); this.addTab("html", lBrowser); //jeditropane this.addTab("links", new JScrollPane(linksPanel)); // set of found links - copyToClipboard, execute in browser, show... } public static void showStandAloneWindow(String url, boolean socket) { if (JavaConsole.canShowOnStartup(true)) { JavaConsole.getConsole().showConsoleLater(); } // plug in a custom authenticator and proxy selector Authenticator.setDefault(new JNLPAuthenticator()); BrowserAwareProxySelector proxySelector = new BrowserAwareProxySelector(getConfiguration()); proxySelector.initialize(); ProxySelector.setDefault(proxySelector); createFrame(url, socket, JFrame.EXIT_ON_CLOSE); } public static void createFrame(String url, boolean socket, int action) { HtmlBrowserPanel.warn(); JFrame f = new JFrame(); f.add(new LinkingBrowser(url, socket)); f.pack(); f.setDefaultCloseOperation(action); f.setVisible(true); } public HtmlBrowserPanel getBrowser() { return browser; } public LinksPanel getLinksPanel() { return linksPanel; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/browser/PaxHeaders.7406/DocumentChangededList0000644000000000000000000000013113441742745030506 xustar0030 mtime=1552401893.041832819 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/browser/DocumentChangededListener.java0000644000175000002070000000354213441742745033115 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime.html.browser; import java.net.URL; public interface DocumentChangededListener { public void documentChangeded(String current); public void addressChangeded(String url); public void addressChangeded(URL url); } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/browser/PaxHeaders.7406/LinksPanel.java0000644000000000000000000000013113441742745027271 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/browser/LinksPanel.java0000644000175000002070000002057713441742745030115 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime.html.browser; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Desktop; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; public class LinksPanel extends JPanel implements DocumentChangededListener { private URL baseUrl; private final Set added = new HashSet<>(); private HtmlBrowserPanel browser; public void setInternalBrowser(HtmlBrowserPanel browser) { this.browser = browser; } private static int counter = 0; private class RowHolder extends JPanel { //shoudl go from text state private final String url; public RowHolder(final String urll) { super(new BorderLayout()); counter++; Color bg = this.getBackground(); if (counter % 2 == 1) { bg = new Color(Math.max(0, bg.getRed() - 20), Math.min(255, bg.getGreen() + 20), Math.max(0, bg.getBlue() - 20)); } this.url = urll; JLabel l = new JLabel(url); l.setBackground(bg); this.add(l); JPanel buttonsPanel = new JPanel(new GridLayout(1, 0)); buttonsPanel.setBackground(bg); JButton b1 = new JButton(Translator.R("BrowserOpenExternal")); b1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { Desktop.getDesktop().browse(new URI(url)); } catch (Exception ex) { OutputController.getLogger().log(ex); if (!JNLPRuntime.isHeadless()) { JOptionPane.showMessageDialog(null, ex); } } } }); buttonsPanel.add(b1); //if (browser != null) { JButton b2 = new JButton(Translator.R("BrowserOpeninternal")); b2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { browser.gotoUrl(url); } }); buttonsPanel.add(b2); //} JButton b3 = new JButton(Translator.R("BrowserCopyUrlToClip")); b3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { StringSelection selection = new StringSelection(url); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(selection, selection); } }); buttonsPanel.add(b3); this.setBackground(bg); this.add(buttonsPanel, BorderLayout.EAST); } } public LinksPanel() { super(new GridLayout(0, 1)); addClearButton(); } private void addClearButton() { JButton clear = new JButton(Translator.R("BrowserClearAll")); clear.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { LinksPanel.this.removeAll(); added.clear(); addClearButton(); } }); this.add(clear); } public void setBaseUrl(URL baseUrl) { this.baseUrl = baseUrl; } public static final String URL_REGEX = "\\(?\\b(https://|http://|www[.])[-A-Za-z0-9+&;@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]"; public static final Pattern URL_REGEX_PATTERN = Pattern.compile(URL_REGEX); public List pullAbsoluteLinks(String text) { List links = new ArrayList<>(); Matcher m = URL_REGEX_PATTERN.matcher(text); while (m.find()) { String urlStr = m.group(); if (urlStr.startsWith("(") && urlStr.endsWith(")")) { urlStr = urlStr.substring(1, urlStr.length() - 1); } links.add(urlStr); } return links; } private static final String HTML_QUOTING_REGEX = "(\"|')"; public static final String HREF_REGEX_START = "(?i)href\\s*=\\s*" + HTML_QUOTING_REGEX; private static final String HREF_REGEX_END = HTML_QUOTING_REGEX; public static final String HREF_REGEX = HREF_REGEX_START + ".*?" + HREF_REGEX_END; public static final Pattern HREF_REGEX_PATERN = Pattern.compile(HREF_REGEX); public List pullHrefs(String text) { List links = new ArrayList<>(); Matcher m = HREF_REGEX_PATERN.matcher(text); while (m.find()) { String urlStr = m.group(); urlStr = urlStr.replaceFirst(HREF_REGEX_START, ""); urlStr = urlStr.substring(0, urlStr.length() - 1); links.add(urlStr); } return links; } public void parseAndAdd(String currentSource) { List l = pullAbsoluteLinks(currentSource); for (String string : l) { addLink(string); } l = pullHrefs(currentSource); for (String string : l) { if (added.add(string)) { //not added => relative url addLink(absolutize(string)); } } } private String absolutize(String string) { if (baseUrl == null) { return string; } return UrlUtils.ensureSlashTail(UrlUtils.removeFileName(baseUrl)).toExternalForm() + string; } @Override public void documentChangeded(String current) { parseAndAdd(current); } private void addLink(String string) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, string); if (added.add(string)) { this.add(new RowHolder(string)); } } @Override public void addressChangeded(String url) { addLink(url); } @Override public void addressChangeded(URL url) { if (url != null) { baseUrl = url; addLink(url.toExternalForm()); } } public List getAllUrls() { return new ArrayList<>(added); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/PaxHeaders.7406/AppletExtractor.java0000644000000000000000000000013113441742745026667 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/AppletExtractor.java0000644000175000002070000001635513441742745027512 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime.html; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.net.URL; import java.util.LinkedList; import java.util.List; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ParseException; import net.sourceforge.jnlp.Parser; import net.sourceforge.jnlp.ParserSettings; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.OutputController; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * This class is taking HTML document url as input, try to sanitize with * tagsoup, if availale - and then finds and applet declarations here. Then it * returns first, selected or last one as PluginBridge instance. See parse * method. */ public class AppletExtractor { private final URL html; private static final String[] APPLETS = new String[]{ "applet", "APPLET", "Applet", "object", "OBJECT", "Object", "embed", "EMBED", "Embed"}; private final ParserSettings ps; public AppletExtractor(URL html) { this(html, null); } public AppletExtractor(URL html, ParserSettings ps) { JNLPRuntime.saveHistory(html.toExternalForm()); this.html = html; this.ps = ps; } public URL getHtml() { return html; } private InputStream cleanStreamIfPossible(InputStream is) { try { if (ps != null && ps.isMalformedXmlAllowed()){ Object parser = Parser.getParserInstance(ps); Method m = parser.getClass().getMethod("xmlizeInputStream", InputStream.class); return (InputStream) m.invoke(null, is); } else { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, Translator.R("TAGSOUPhtmlNotUsed", OptionsDefinitions.OPTIONS.XML.option)); } } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, Translator.R("TAGSOUPhtmlBroken")); OutputController.getLogger().log(ex); } return is; } public List findAppletsOnPage() { try{ return findAppletsOnPageImpl(openDocument(cleanStreamIfPossible(JNLPFile.openURL(html, null, UpdatePolicy.ALWAYS)))); } catch (SAXException sex) { throw new RuntimeException(new ParseException(sex)); } catch (IOException | ParserConfigurationException ex) { throw new RuntimeException(ex); } } private List findAppletsOnPageImpl(Document doc) throws ParserConfigurationException, SAXException, IOException { OutputController.getLogger().log("Root element :" + doc.getDocumentElement().getNodeName()); //search for applets //search for embed/object // findElements(String[] elements, Element doc, ElementValidator elementValidator) { List found = new LinkedList(); for (String key : elements) { NodeList nList = doc.getElementsByTagName(key); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); OutputController.getLogger().log("Found in html: " + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; if (elementValidator.isElementValid(eElement)) { found.add(eElement); } } } } return found; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/PaxHeaders.7406/AppletsFilter.java0000644000000000000000000000013113441742745026324 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/html/AppletsFilter.java0000644000175000002070000000746213441742745027146 0ustar00jvanekmock00000000000000/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package net.sourceforge.jnlp.runtime.html; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.OutputController; import org.w3c.dom.Element; import org.xml.sax.SAXException; /** * * @author jvanek */ public class AppletsFilter { private final List found; private final URL docBase; private final List ids; public AppletsFilter(List found, URL docBase, List ids) { this.found = found; this.docBase = docBase; this.ids = ids; } public List getApplets() throws ParserConfigurationException, SAXException, IOException { List appletElement = getAppletElements(); List aps = new ArrayList<>(appletElement.size()); for (int i = 0; i < appletElement.size(); i++) { Element element = appletElement.get(i); AppletParser ap = new AppletParser(element, docBase); aps.add(ap); OutputController.getLogger().log("added: "+(aps.size()-1)); OutputController.getLogger().log(ap.toString()); } return aps; } private List getAppletElements() throws ParserConfigurationException, SAXException, IOException { if (found.isEmpty()) { throw new RuntimeException(Translator.R("HTMLnoneFound")); } List id = sanitizeFilter(); List r = new ArrayList<>(found.size()); for (int i = 0; i < found.size(); i++) { Element element = found.get(i); if (id.contains(i)) { r.add(element); OutputController.getLogger().log("adding applet id: " + i + " as: " + (r.size() - 1)); } } return r; } private List sanitizeFilter() { List r = new ArrayList<>(found.size()); if (ids.isEmpty()) { if (found.size() > 1) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("HTMLmoreThenOne", found.size())); } r.add(0); return r; } if (ids.size() == 1 && ids.get(0).equalsIgnoreCase("all")) { for (int i = 0; i < found.size(); i++) { r.add(i); } return r; } for (int i = 0; i < ids.size(); i++) { Integer id = null; try { id = Integer.parseInt(ids.get(i)); } catch (NumberFormatException ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); continue; } if (id < 0) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "You have selected lesser then 0th applet. Using first"); if (!r.contains(0)) { r.add(0); } continue; } if (id >= found.size()) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "You have selected higher then " + (found.size() - 1) + "th applet. Using last"); if (!r.contains(found.size() - 1)) { r.add(found.size() - 1); } continue; } OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Using " + id + "th applet from total of count " + (found.size() - 1)); r.add(id); } return r; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/PacEvaluatorFactory.java0000644000000000000000000000013113441742745026520 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PacEvaluatorFactory.java0000644000175000002070000001001413441742745027325 0ustar00jvanekmock00000000000000/* PacEvaluatorFactory.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.Properties; import net.sourceforge.jnlp.util.logging.OutputController; public class PacEvaluatorFactory { public static PacEvaluator getPacEvaluator(URL pacUrl) { boolean useRhino = false; ClassLoader cl = PacEvaluatorFactory.class.getClassLoader(); if (cl == null) { cl = ClassLoader.getSystemClassLoader(); } Properties properties = null; try (InputStream in = cl.getResourceAsStream("net/sourceforge/jnlp/build.properties")) { properties = new Properties(); properties.load(in); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "PAC provider is broken or don't exists. This is ok unless your applicatin is using JavaScript."); OutputController.getLogger().log(e); } if (properties == null) { return new FakePacEvaluator(); } String available = properties.getProperty("rhino.available"); useRhino = Boolean.valueOf(available); if (useRhino) { try { Class evaluator = Class.forName("net.sourceforge.jnlp.runtime.RhinoBasedPacEvaluator"); Constructor constructor = evaluator.getConstructor(URL.class); return (PacEvaluator) constructor.newInstance(pacUrl); } catch (ClassNotFoundException e) { // ignore } catch (InstantiationException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } catch (IllegalAccessException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } catch (NoSuchMethodException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } catch (IllegalArgumentException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } catch (InvocationTargetException e) { if (e.getCause() != null) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e.getCause()); } } } return new FakePacEvaluator(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/JNLPProxySelector.java0000644000000000000000000000013113441742745026110 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java0000644000175000002070000003726213441742745026733 0ustar00jvanekmock00000000000000// Copyright (C) 2010 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.MalformedURLException; import java.net.Proxy; import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; import java.net.URL; import java.net.UnknownHostException; import java.net.Proxy.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.util.logging.OutputController; /** * A ProxySelector specific to JNLPs. This proxy uses the deployment * configuration to determine what to do. * * @see java.net.ProxySelector */ public abstract class JNLPProxySelector extends ProxySelector { public static final int PROXY_TYPE_UNKNOWN = -1; public static final int PROXY_TYPE_NONE = 0; public static final int PROXY_TYPE_MANUAL = 1; public static final int PROXY_TYPE_AUTO = 2; public static final int PROXY_TYPE_BROWSER = 3; /** The default port to use as a fallback. Currently squid's default port */ public static final int FALLBACK_PROXY_PORT = 3128; private PacEvaluator pacEvaluator = null; /** The proxy type. See PROXY_TYPE_* constants */ private int proxyType = PROXY_TYPE_UNKNOWN; /** the URL to the PAC file */ private URL autoConfigUrl = null; /** a list of URLs that should be bypassed for proxy purposes */ private List bypassList = null; /** whether localhost should be bypassed for proxy purposes */ private boolean bypassLocal = false; /** * whether the http proxy should be used for https and ftp protocols as well */ private boolean sameProxy = false; private String proxyHttpHost; private int proxyHttpPort; private String proxyHttpsHost; private int proxyHttpsPort; private String proxyFtpHost; private int proxyFtpPort; private String proxySocks4Host; private int proxySocks4Port; // FIXME what is this? where should it be used? private String overrideHosts = null; public JNLPProxySelector(DeploymentConfiguration config) { parseConfiguration(config); } /** * Initialize this ProxySelector by reading the configuration */ private void parseConfiguration(DeploymentConfiguration config) { proxyType = Integer.valueOf(config.getProperty(DeploymentConfiguration.KEY_PROXY_TYPE)); String autoConfigString = config.getProperty(DeploymentConfiguration.KEY_PROXY_AUTO_CONFIG_URL); if (autoConfigString != null) { try { autoConfigUrl = new URL(autoConfigString); } catch (MalformedURLException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } if (autoConfigUrl != null) { pacEvaluator = PacEvaluatorFactory.getPacEvaluator(autoConfigUrl); } bypassList = new ArrayList<>(); String proxyBypass = config.getProperty(DeploymentConfiguration.KEY_PROXY_BYPASS_LIST); if (proxyBypass != null) { StringTokenizer tokenizer = new StringTokenizer(proxyBypass, ","); while (tokenizer.hasMoreTokens()) { String host = tokenizer.nextToken(); if (host != null && host.trim().length() != 0) { bypassList.add(host); } } } bypassLocal = Boolean.valueOf(config .getProperty(DeploymentConfiguration.KEY_PROXY_BYPASS_LOCAL)); sameProxy = Boolean.valueOf(config.getProperty(DeploymentConfiguration.KEY_PROXY_SAME)); proxyHttpHost = getHost(config, DeploymentConfiguration.KEY_PROXY_HTTP_HOST); proxyHttpPort = getPort(config, DeploymentConfiguration.KEY_PROXY_HTTP_PORT); proxyHttpsHost = getHost(config, DeploymentConfiguration.KEY_PROXY_HTTPS_HOST); proxyHttpsPort = getPort(config, DeploymentConfiguration.KEY_PROXY_HTTPS_PORT); proxyFtpHost = getHost(config, DeploymentConfiguration.KEY_PROXY_FTP_HOST); proxyFtpPort = getPort(config, DeploymentConfiguration.KEY_PROXY_FTP_PORT); proxySocks4Host = getHost(config, DeploymentConfiguration.KEY_PROXY_SOCKS4_HOST); proxySocks4Port = getPort(config, DeploymentConfiguration.KEY_PROXY_SOCKS4_PORT); overrideHosts = config.getProperty(DeploymentConfiguration.KEY_PROXY_OVERRIDE_HOSTS); } /** * Uses the given key to get a host from the configuraion */ private String getHost(DeploymentConfiguration config, String key) { String proxyHost = config.getProperty(key); if (proxyHost != null) { proxyHost = proxyHost.trim(); } return proxyHost; } /** * Uses the given key to get a port from the configuration */ private int getPort(DeploymentConfiguration config, String key) { int proxyPort = FALLBACK_PROXY_PORT; String port; port = config.getProperty(key); if (port != null && port.trim().length() != 0) { try { proxyPort = Integer.valueOf(port); } catch (NumberFormatException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } return proxyPort; } /** * {@inheritDoc} */ @Override public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ioe); } /** * {@inheritDoc} * @return list of proxies on URI */ @Override public List select(URI uri) { OutputController.getLogger().log("Selecting proxy for: " + uri); if (inBypassList(uri)) { List proxies = Arrays.asList(new Proxy[] { Proxy.NO_PROXY }); OutputController.getLogger().log("Selected proxies: " + Arrays.toString(proxies.toArray())); return proxies; } List proxies = new ArrayList<>(); switch (proxyType) { case PROXY_TYPE_MANUAL: proxies.addAll(getFromConfiguration(uri)); break; case PROXY_TYPE_AUTO: proxies.addAll(getFromPAC(uri)); break; case PROXY_TYPE_BROWSER: proxies.addAll(getFromBrowser(uri)); break; case PROXY_TYPE_UNKNOWN: // fall through case PROXY_TYPE_NONE: // fall through default: proxies.add(Proxy.NO_PROXY); break; } OutputController.getLogger().log("Selected proxies: " + Arrays.toString(proxies.toArray())); return proxies; } /** * Returns true if the uri should be bypassed for proxy purposes */ private boolean inBypassList(URI uri) { try { String scheme = uri.getScheme(); /* scheme can be http/https/ftp/socket */ switch (scheme) { case "http": case "https": case "ftp": URL url = uri.toURL(); if (bypassLocal && isLocalHost(url.getHost())) { return true; } if (bypassList.contains(url.getHost())) { return true; } break; case "socket": String host = uri.getHost(); if (bypassLocal && isLocalHost(host)) { return true; } if (bypassList.contains(host)) { return true; } break; } } catch (MalformedURLException e) { return false; } return false; } /** * @return true if the host is the hostname or the IP address of the * localhost * @param host host to verify */ private boolean isLocalHost(String host) { try { if (InetAddress.getByName(host).isLoopbackAddress()) { return true; } } catch (UnknownHostException e1) { // continue } try { if (host.equals(InetAddress.getLocalHost().getHostName())) { return true; } } catch (UnknownHostException e) { // continue } try { if (host.equals(InetAddress.getLocalHost().getHostAddress())) { return true; } } catch (UnknownHostException e) { // continue } return false; } /** * Returns a list of proxies by using the information in the deployment * configuration * * @param uri uri to read * @return a List of Proxy objects */ private List getFromConfiguration(URI uri) { return getFromArguments(uri, sameProxy, false, proxyHttpsHost, proxyHttpsPort, proxyHttpHost, proxyHttpPort, proxyFtpHost, proxyFtpPort, proxySocks4Host, proxySocks4Port); } /** * Returns a list of proxies by using the arguments * * @param uri name and code says it all * @param sameProxy name and code says it all * @param sameProxyIncludesSocket name and code says it all * @param proxyHttpsHost name and code says it all * @param proxyHttpsPort name and code says it all * @param proxyHttpHost name and code says it all * @param proxyHttpPort name and code says it all * @param proxyFtpHost name and code says it all * @param proxyFtpPort name and code says it all * @param proxySocks4Host name and code says it all * @param proxySocks4Port name and code says it all * @return a List of Proxy objects */ protected static List getFromArguments(URI uri, boolean sameProxy, boolean sameProxyIncludesSocket, String proxyHttpsHost, int proxyHttpsPort, String proxyHttpHost, int proxyHttpPort, String proxyFtpHost, int proxyFtpPort, String proxySocks4Host, int proxySocks4Port) { List proxies = new ArrayList<>(); String scheme = uri.getScheme(); boolean socksProxyAdded = false; if (sameProxy) { if (proxyHttpHost != null) { SocketAddress sa = new InetSocketAddress(proxyHttpHost, proxyHttpPort); if ((scheme.equals("https") || scheme.equals("http") || scheme.equals("ftp"))) { Proxy proxy = new Proxy(Type.HTTP, sa); proxies.add(proxy); } else if (scheme.equals("socket") && sameProxyIncludesSocket) { Proxy proxy = new Proxy(Type.SOCKS, sa); proxies.add(proxy); socksProxyAdded = true; } } } else if (scheme.equals("http") && proxyHttpHost != null) { SocketAddress sa = new InetSocketAddress(proxyHttpHost, proxyHttpPort); proxies.add(new Proxy(Type.HTTP, sa)); } else if (scheme.equals("https") && proxyHttpsHost != null) { SocketAddress sa = new InetSocketAddress(proxyHttpsHost, proxyHttpsPort); proxies.add(new Proxy(Type.HTTP, sa)); } else if (scheme.equals("ftp") && proxyFtpHost != null) { SocketAddress sa = new InetSocketAddress(proxyFtpHost, proxyFtpPort); proxies.add(new Proxy(Type.HTTP, sa)); } if (!socksProxyAdded && (proxySocks4Host != null)) { SocketAddress sa = new InetSocketAddress(proxySocks4Host, proxySocks4Port); proxies.add(new Proxy(Type.SOCKS, sa)); socksProxyAdded = true; } if (proxies.isEmpty()) { proxies.add(Proxy.NO_PROXY); } return proxies; } /** * Returns a list of proxies by using the Proxy Auto Config (PAC) file. See * http://en.wikipedia.org/wiki/Proxy_auto-config#The_PAC_file for more * information. * * @param uri uri to PAC * @return a List of valid Proxy objects */ protected List getFromPAC(URI uri) { if (autoConfigUrl == null || uri.getScheme().equals("socket")) { return Arrays.asList(new Proxy[] { Proxy.NO_PROXY }); } List proxies = new ArrayList<>(); try { String proxiesString = pacEvaluator.getProxies(uri.toURL()); proxies.addAll(getProxiesFromPacResult(proxiesString)); } catch (MalformedURLException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); proxies.add(Proxy.NO_PROXY); } return proxies; } /** * Returns a list of proxies by querying the browser * * @param uri the uri to get proxies for * @return a list of proxies */ protected abstract List getFromBrowser(URI uri); /** * Converts a proxy string from a browser into a List of Proxy objects * suitable for java. * @param pacString a string indicating proxies. For example * "PROXY foo.bar:3128; DIRECT" * @return a list of Proxy objects representing the parsed string. In * case of malformed input, an empty list may be returned */ public static List getProxiesFromPacResult(String pacString) { List proxies = new ArrayList<>(); String[] tokens = pacString.split(";"); for (String token: tokens) { if (token.startsWith("PROXY")) { String hostPortPair = token.substring("PROXY".length()).trim(); if (!hostPortPair.contains(":")) { continue; } String host = hostPortPair.split(":")[0]; int port; try { port = Integer.valueOf(hostPortPair.split(":")[1]); } catch (NumberFormatException nfe) { continue; } SocketAddress sa = new InetSocketAddress(host, port); proxies.add(new Proxy(Type.HTTP, sa)); } else if (token.startsWith("SOCKS")) { String hostPortPair = token.substring("SOCKS".length()).trim(); if (!hostPortPair.contains(":")) { continue; } String host = hostPortPair.split(":")[0]; int port; try { port = Integer.valueOf(hostPortPair.split(":")[1]); } catch (NumberFormatException nfe) { continue; } SocketAddress sa = new InetSocketAddress(host, port); proxies.add(new Proxy(Type.SOCKS, sa)); } else if (token.startsWith("DIRECT")) { proxies.add(Proxy.NO_PROXY); } else { OutputController.getLogger().log("Unrecognized proxy token: " + token); } } return proxies; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/AppletInstance.java0000644000000000000000000000013113441742745025514 xustar0030 mtime=1552401893.030832841 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/AppletInstance.java0000644000175000002070000001063513441742745026332 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import java.applet.*; import java.awt.*; import net.sourceforge.jnlp.*; import net.sourceforge.jnlp.util.logging.OutputController; /** * Represents a launched application instance created from a JNLP * file. This class does not control the operation of the applet, * use the AppletEnvironment class to start and stop the applet. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.9 $ */ public class AppletInstance extends ApplicationInstance { /** whether the applet's stop and destroy methods have been called */ private boolean appletStopped = false; /** the applet */ private Applet applet; /** the applet environment */ final private AppletEnvironment environment; /** * Create a New Task based on the Specified URL * @param file pluginbrifge to build instance on * @param group thread group of this instance * @param loader classlaoder for this instance * @param applet applet of this instance */ public AppletInstance(JNLPFile file, ThreadGroup group, ClassLoader loader, Applet applet) { super(file, group, loader); this.applet = applet; this.environment = new AppletEnvironment(file, this); } /** * Set the applet of this launched application; can only be called once. * @param applet to be set */ public void setApplet(Applet applet) { if (this.applet != null) { OutputController.getLogger().log(new IllegalStateException("Applet can only be set once.")); return; } this.applet = applet; } /** * Create a New Task based on the Specified URL * @param file pluginbrifge to build instance on * @param group thread group of this instance * @param loader classlaoder for this instance * @param applet applet of this instance * @param cont Container where to place applet */ public AppletInstance(JNLPFile file, ThreadGroup group, ClassLoader loader, Applet applet, Container cont) { super(file, group, loader); this.applet = applet; this.environment = new AppletEnvironment(file, this, cont); } /** * Sets whether the applet is resizable or not. Applets default * to being not resizable. * @param resizable boolean to allwo resizing */ public void setResizable(boolean resizable) { Container c = environment.getAppletFrame(); if (c instanceof Frame) ((Frame) c).setResizable(resizable); } /** * @return whether the applet is resizable. */ public boolean isResizable() { Container c = environment.getAppletFrame(); if (c instanceof Frame) return ((Frame) c).isResizable(); return false; } /** * @return the application title. */ @Override public String getTitle() { return getJNLPFile().getApplet().getName(); } /** * @return the applet environment. */ public AppletEnvironment getAppletEnvironment() { return environment; } /** * @return the applet. */ public Applet getApplet() { return applet; } /** * Stop the application and destroy its resources. */ @Override public void destroy() { if (appletStopped) return; appletStopped = true; try { applet.stop(); applet.destroy(); } catch (Exception ex) { OutputController.getLogger().log(ex); } environment.destroy(); super.destroy(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/pac-funcs.js0000644000000000000000000000013113441742745024154 xustar0030 mtime=1552401893.035832831 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/pac-funcs.js0000644000175000002070000006223513441742745024775 0ustar00jvanekmock00000000000000/* pac-funcs.js Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ /* * These helper functions are required to be able to parse Proxy Auto Config * (PAC) files. PAC files will use these helper functions to decide the best * proxy for connecting to a host. * * This implementation is based on the description of the functions at: * http://web.archive.org/web/20060424005037/wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html */ /** * Returns true if the host does not contain a domain (there are no dots) */ function isPlainHostName(host) { if (host.indexOf(".") === -1) { return true; } else { return false; } } /** * Returns true if the host is part of the domain (the host ends with domain) */ function dnsDomainIs(host, domain) { var loc = host.lastIndexOf(domain); if (loc === -1) { return false; } if (loc + domain.length === host.length) { // host ends with domain return true; } return false; } /** * Returns true if the host is an exact match of hostdom or if host is not a * fully qualified name but has the same hostname as hostdom */ function localHostOrDomainIs(host, hostdom) { if (host === hostdom) { // exact match return true; } var firstdot = hostdom.indexOf("."); if (firstdot === -1) { // hostdom has no dots return false; } if (host === hostdom.substring(0, firstdot)) { // hostname matches return true; } return false; } /** * Returns true if the host name can be resolved. */ function isResolvable(host) { try { java.net.InetAddress.getByName(host); return true; } catch (e) { //if (e.javaException instanceof java.net.UnknownHostException) { return false; //} else { // throw e; //} } } /** * Return true if the ip address of the host matches the pattern given the mask. */ function isInNet(host, pattern, mask) { if (!isResolvable(host)) { return false; } var hostIp = dnsResolve(host); var hostParts = hostIp.split("."); var patternParts = pattern.split("."); var maskParts = mask.split("."); if (hostParts.length !== 4 || patternParts.length !== hostParts.length || maskParts.length !== hostParts.length) { return false; } var matched = true; for (var i = 0; i < hostParts.length; i++) { var partMatches = (hostParts[i] & maskParts[i]) === (patternParts[i] & maskParts[i]); matched = matched && partMatches; } return matched; } /** * Returns the IP address of the host as a string */ function dnsResolve(host) { return java.net.InetAddress.getByName(host).getHostAddress() + ""; } /** * Returns the local IP address */ function myIpAddress() { return java.net.InetAddress.getLocalHost().getHostAddress() + ""; } /** * Returns the number of domains in a hostname */ function dnsDomainLevels(host) { var levels = 0; for (var i = 0; i < host.length; i++) { if (host[i] === '.') { levels++; } } return levels; } /** * Returns true if the shell expression matches the given input string */ function shExpMatch(str, shExp) { // TODO support all special characters // right now we support only * and ? try { // turn shExp into a regular expression var work = ""; // escape characters for (var i = 0; i < shExp.length; i++) { var ch = shExp[i]; switch (ch) { case "\\": work = work + "\\\\"; break; case "^": work = work + "\\^"; break; case "$": work = work + "\\$"; break; case "+": work = work + "\\+"; break; case ".": work = work + "\\."; break; case "(": work = work + "\\("; break; case ")": work = work + "\\)"; break; case "{": work = work + "\\{"; break; case "}": work = work + "\\}"; break; case "[": work = work + "\\["; break; case "]": work = work + "\\]"; break; case "?": work = work + ".{1}"; break; case "*": work = work + ".*"; break; default: work = work + ch; } } var regExp = "^" + work + "$"; // match //java.lang.System.out.println("") //java.lang.System.out.println("Input String : " + str); //java.lang.System.out.println("Input Pattern : " + shExp); //java.lang.System.out.println("RegExp : " + regExp.toString()); var match = str.match(regExp); if (match === null) { return false; } else { return true; } } catch (e) { return false; } } /** * Returns true if the current weekday matches the desired weekday(s) * * Possible ways of calling: * weekdayRange(wd1); * weekdayRange(wd1, "GMT"); * weekdayRange(wd1, wd2); * weekdayRange(wd1, wd2, "GMT"); * * Where wd1 and wd2 are one of "SUN", "MON", "TUE", "WED", "THU", "FRI" and * "SAT" * * The argument "GMT", if present, is always the last argument */ function weekdayRange() { var wd1; var wd2; var gmt = false; function isWeekDay(day) { if (day === "SUN" || day === "MON" || day === "TUE" || day === "WED" || day === "THU" || day === "FRI" || day === "SAT") { return true; } return false; } function strToWeekDay(str) { switch (str) { case "SUN": return 0; case "MON": return 1; case "TUE": return 2; case "WED": return 3; case "THU": return 4; case "FRI": return 5; case "SAT": return 6; default: return 0; } } if (arguments.length > 1) { if (arguments[arguments.length-1] === "GMT") { gmt = true; arguments.splice(0,arguments.length-1); } } if (arguments.length === 0) { return false; } wd1 = arguments[0]; if (!isWeekDay(wd1)) { return false; } var today = new Date().getDay(); if (arguments.length >= 2) { // return true if current weekday is between wd1 and wd2 (inclusive) wd2 = arguments[1]; if (!isWeekDay(wd2)) { return false; } var day1 = strToWeekDay(wd1); var day2 = strToWeekDay(wd2); if (day1 <= day2) { if ( day1 <= today && today <= day2) { return true; } return false; } else { if (day1 <= today || today <= day2) { return true; } return false; } } else { // return true if the current weekday is wd1 if (strToWeekDay(wd1) === today) { return true; } return false; } } /** * Returns true if the current date matches the given date(s) * * Possible ways of calling: * dateRange(day) * dateRange(day1, day2) * dateRange(month) * dateRange(month1, month2) * dateRange(year) * dateRange(year1, year2) * dateRange(day1, month1, day2, month2) * dateRange(month1, year1, month2, year2) * dateRange(day1, month1, year1, day2, month2, year2) * * The parameter "GMT" may additionally be passed as the last argument in any * of the above ways of calling. */ function dateRange() { switch (arguments.length) { case 1: return isDateInRange_internallForIcedTeaWebTesting(new Date(),arguments[0]); case 2: return isDateInRange_internallForIcedTeaWebTesting(new Date(),arguments[0],arguments[1]); case 3: return isDateInRange_internallForIcedTeaWebTesting(new Date(),arguments[0],arguments[1],arguments[2]); case 4: return isDateInRange_internallForIcedTeaWebTesting(new Date(),arguments[0],arguments[1],arguments[2],arguments[3]); case 5: return isDateInRange_internallForIcedTeaWebTesting(new Date(),arguments[0],arguments[1],arguments[2],arguments[3],arguments[4]); case 6: return isDateInRange_internallForIcedTeaWebTesting(new Date(),arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]); case 7: return isDateInRange_internallForIcedTeaWebTesting(new Date(),arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5],arguments[6]); //GMT default: return false; } } function isDateInRange_internallForIcedTeaWebTesting() { function isDate(date) { if (typeof(date) === 'number' && (date <= 31 && date >= 1)) { return true; } return false; } function strToMonth(month) { switch (month) { case "JAN": return 0; case "FEB": return 1; case "MAR": return 2; case "APR": return 3; case "MAY": return 4; case "JUN": return 5; case "JUL": return 6; case "AUG": return 7; case "SEP": return 8; case "OCT": return 9; case "NOV": return 10; case "DEC": return 11; default: return 0; } } function isMonth(month) { if (month === "JAN" || month === "FEB" || month === "MAR" || month === "APR" || month === "MAY" || month === "JUN" || month === "JUL" || month === "AUG" || month === "SEP" || month === "OCT" || month === "NOV" || month === "DEC") { return true; } return false; } function isYear(year) { if (typeof(year) === 'number') { return true; } return false; } function inDateRange(today, date1, date2) { if (date1 <= date2) { if (date1 <= today.getDate() && today.getDate() <= date2) { return true; } else { return false; } } else { if (date1 <= today.getDate() || today.getDate() <= date2) { return true; } else { return false; } } } function inMonthRange(today, month1, month2) { if (month1 <= month2) { if (month1 <= today.getMonth() && today.getMonth() <= month2) { return true; } else { return false; } } else { if (month1 <= today.getMonth() || today.getMonth() <= month2) { return true; } else { return false; } } } function inYearRange(today, year1, year2) { if (year1 <= today.getFullYear() && today.getFullYear() <= year2) { return true; } else { return false; } } function inMonthDateRange(today, date1, month1, date2, month2) { if (month1 === month2) { if (today.getMonth() === month1) { if (date1 <= today.getDate() && today.getDate() <= date2) { return true; } else { return false; } } else { if (date1 <= date2) { return false; } else { return true; } } } else if (month1 < month2) { if (month1 <= today.getMonth() && today.getMonth() <= month2) { if (today.getMonth() === month1) { if (today.getDate() >= date1) { return true; } else { return false; } } else if (today.getMonth() === month2) { if (today.getDate() <= date2) { return true; } else { return false; } } else { return true; } } else { return false; } } else { if (month1 <= today.getMonth() || today.getMonth() <= month2) { if (today.getMonth() === month1) { if (today.getDate() >= date1) { return true; } else { return false; } } else if (today.getMonth() === month2) { if (today.getDate() <= date2) { return true; } else { return false; } } else { return true; } } else { return false; } } } function inYearMonthRange(today, month1, year1, month2, year2) { if (year1 === year2) { if (today.getFullYear() === year1) { if (month1 <= today.getMonth() && today.getMonth() <= month2) { return true; } else { return false; } } else { return false; } } if (year1 < year2) { if (year1 <= today.getFullYear() && today.getFullYear() <= year2) { if (today.getFullYear() === year1) { if (today.getMonth() >= month1) { return true; } else { return false; } } else if (today.getFullYear() === year2) { if (today.getMonth() <= month2) { return true; } else { return false; } } else { return true; } } else { return false; } } else { return false; } } function inYearMonthDateRange(today, date1, month1, year1, date2, month2, year2) { if (year1 === year2) { if (year1 === today.getFullYear()) { if ((month1 <= today.getMonth()) && (today.getMonth() <= month2)) { if (month1 === month2) { if (date1 <= today.getDate() && today.getDate() <= date2) { return true; } else { return false; } } else if (today.getMonth() === month1) { if (today.getDate() >= date1) { return true; } else { return false; } } else if (today.getMonth() === month2) { if (today.getDate() <= date2) { return true; } else { return false; } } else { return true; } } else { return false; } } else { return false; } } else if (year1 < year2) { if (year1 <= today.getFullYear() && today.getFullYear() <= year2) { if (today.getFullYear() === year1) { if (today.getMonth() === month1) { if (today.getDate() >= date1) { return true; } else { return false; } } else if (today.getMonth() > month1) { return true; } else { return false; } } else if (today.getFullYear() === year2) { if (today.getMonth() === month2) { if (today.getDate() <= date1) { return true; } else { return false; } } else if (today.getMonth() < month2) { return true; } else { return false; } } else { return true; } } else { return false; } } else { return false; } } // note: watch out for wrapping around of dates. date ranges, like // month=9 to month=8, wrap around and cover the entire year. this // makes everything more interesting var gmt; if (arguments.length > 2) { if (arguments[arguments.length-1] === "GMT") { gmt = true; arguments.splice(0,arguments.length-1); } } // TODO: change date to gmt, whatever var today = arguments[0] var arg1; var arg2; var arg3; var arg4; var arg5; var arg6; switch (arguments.length-1) { case 1: var arg = arguments[1]; if (isDate(arg)) { if (today.getDate() === arg) { return true; } else { return false; } } else if (isMonth(arg)) { if (strToMonth(arg) === today.getMonth()) { return true; } else { return false; } } else { // year if (today.getFullYear() === arg) { return true; } else { return false; } } case 2: arg1 = arguments[1]; arg2 = arguments[2]; if (isDate(arg1) && isDate(arg2)) { var date1 = arg1; var date2 = arg2; return inDateRange(today, date1, date2); } else if (isMonth(arg1) && isMonth(arg2)) { var month1 = strToMonth(arg1); var month2 = strToMonth(arg2); return inMonthRange(today, month1, month2); } else if (isYear(arg1) && isYear(arg2)) { var year1 = arg1; var year2 = arg2; return inYearRange(today, year1, year2); } else { return false; } case 4: arg1 = arguments[1]; arg2 = arguments[2]; arg3 = arguments[3]; arg4 = arguments[4]; if (isDate(arg1) && isMonth(arg2) && isDate(arg3) && isMonth(arg4)) { var date1 = arg1; var month1 = strToMonth(arg2); var date2 = arg3; var month2 = strToMonth(arg4); return inMonthDateRange(today, date1, month1, date2, month2); } else if (isMonth(arg1) && isYear(arg2) && isMonth(arg3) && isYear(arg4)) { var month1 = strToMonth(arg1); var year1 = arg2; var month2 = strToMonth(arg3); var year2 = arg4; return inYearMonthRange(today, month1, year1, month2, year2); } else { return false; } case 6: arg1 = arguments[1]; arg2 = arguments[2]; arg3 = arguments[3]; arg4 = arguments[4]; arg5 = arguments[5]; arg6 = arguments[6]; if (isDate(arg1) && isMonth(arg2) && isYear(arg3) && isDate(arg4) && isMonth(arg5) && isYear(arg6)) { var day1 = arg1; var month1 = strToMonth(arg2); var year1 = arg3; var day2 = arg4; var month2 = strToMonth(arg5); var year2 = arg6; return inYearMonthDateRange(today, day1, month1, year1, day2, month2, year2); } else { return false; } default: return false; } } /** * Returns true if the current time matches the range given * * timeRange(hour) * timeRange(hour1, hour2) * timeRange(hour1, min1, hour2, min2) * timeRange(hour1, min1, sec1, hour2, min2, sec2) * * The string "GMT" can be used as the last additional parameter in addition to * the methods listed above. */ function timeRange() { // watch out for wrap around of times var gmt; if (arguments.length > 1) { if (arguments[arguments.length-1] === "GMT") { gmt = true; arguments.splice(0,arguments.length-1); } } function isHour(hour) { if (typeof(hour) === "number" && ( 0 <= hour && hour <= 23)) { return true; } else { return false; } } function isMin(minute) { if (typeof(minute) === "number" && (0 <= minute && minute <= 59)) { return true; } else { return false; } } function inHourRange(now, hour1, hour2) { if (hour1 === hour2) { if (now.getHours() === hour1) { return true; } else { return false; } } else if (hour1 < hour2) { if (hour1 <= now.getHours() && now.getHours() <= hour2) { return true; } else { return false; } } else { if (hour1 <= now.getHours() || now.getHours() <= hour2) { return true; } else { return false; } } } function inHourMinuteRange(now, hour1, min1, hour2, min2) { if (hour1 == hour2) { if (now.getHours() == hour1) { if (min1 <= min2) { if (min1 <= now.getMinutes() && now.getMinutes() <= min2) { return true; } else { return false; } } else { if (min1 <= now.getMinutes() || now.getMinutes() <= min2) { return true; } else { return false; } } } else { if (min1 <= min2) { return false; } else { return true; } } } else if (hour1 < hour2) { if (hour1 <= now.getHours() && now.getHours() <= hour2) { return true; } else { return false; } } else { if (hour1 <= now.getHours() || now.getHours() <= hour2) { return true; } else { return false; } } } var today = new Date(); switch (arguments.length) { case 1: var hour = arguments[0]; if (today.getHours() === hour) { return true; } else { return false; } case 2: var hour1 = arguments[0]; var hour2 = arguments[1]; if (isHour(hour1) && isHour(hour2)) { return inHourRange(today, hour1, hour2); } else { return false; } case 4: var hour1 = arguments[0]; var min1 = arguments[1]; var hour2 = arguments[2]; var min2 = arguments[3]; if (isHour(hour1) && isMin(min1) && isHour(hour2) && isMin(min2)) { return inHourMinuteRange(today, hour1, min1, hour2, min2); } else { return false; } case 6: var hour1 = arguments[0]; var min1 = arguments[1]; var sec1 = arguments[2]; var hour2 = arguments[3]; var min2 = arguments[4]; var sec2 = arguments[5]; // TODO handle seconds properly return inHourMinuteRange(today, hour1, min1, hour2, min2); default: return false; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/JnlpBoot.java0000644000000000000000000000013113441742745024331 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/JnlpBoot.java0000644000175000002070000000571313441742745025150 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception */ package net.sourceforge.jnlp.runtime; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.Launcher; import net.sourceforge.jnlp.ParserSettings; import static net.sourceforge.jnlp.runtime.Boot.init; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.optionparser.OptionParser; public final class JnlpBoot { private final OptionParser optionParser; public JnlpBoot(OptionParser optionParser) { this.optionParser = optionParser; } boolean run(Map> extra) { ParserSettings settings = init(extra); if (settings == null) { return false; } try { OutputController.getLogger().log("Proceeding with jnlp"); Launcher launcher = new Launcher(true); launcher.setParserSettings(settings); launcher.setInformationToMerge(extra); launcher.launch(Boot.getFileLocation()); } catch (LaunchException ex) { // default handler prints this JNLPRuntime.exit(1); } catch (Exception ex) { OutputController.getLogger().log(ex); Boot.fatalError(R("RUnexpected", ex.toString(), ex.getStackTrace()[0])); } return true; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/CachedJarFileCallback.java0000644000000000000000000000013113441742745026623 xustar0030 mtime=1552401893.033832835 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java0000644000175000002070000001572313441742745027444 0ustar00jvanekmock00000000000000/* CachedJarFileCallback.java Copyright (C) 2011 Red Hat, Inc. Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import net.sourceforge.jnlp.security.ConnectionFactory; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.JarFile; import net.sourceforge.jnlp.util.UrlUtils; import sun.net.www.protocol.jar.URLJarFile; import sun.net.www.protocol.jar.URLJarFileCallBack; /** * Invoked by URLJarFile to get a JarFile corresponding to a URL. * * Large parts of this class are based on JarFileFactory and URLJarFile. */ final class CachedJarFileCallback implements URLJarFileCallBack { private static final CachedJarFileCallback INSTANCE = new CachedJarFileCallback(); public synchronized static CachedJarFileCallback getInstance() { return INSTANCE; } /* our managed cache */ private final Map mapping; private CachedJarFileCallback() { mapping = new ConcurrentHashMap(); } protected void addMapping(URL remoteUrl, URL localUrl) { mapping.put(remoteUrl, localUrl); } @Override public java.util.jar.JarFile retrieve(URL url) throws IOException { URL localUrl = mapping.get(url); if (localUrl == null) { if (url.getRef() != null) { url = new URL(url.toString().substring(0, url.toString().lastIndexOf(url.getRef()) - 1)); localUrl = mapping.get(url); } } if (localUrl == null) { /* * If the jar url is not known, treat it as it would be treated in * general by URLJarFile. */ return cacheJarFile(url); } if (UrlUtils.isLocalFile(localUrl)) { // if it is known to us, just return the cached file JarFile returnFile = new JarFile(localUrl.getPath()); try { // Blank out the class-path because: // 1) Web Start does not support it // 2) For the plug-in, we want to cache files from class-path so we do it manually returnFile.getManifest().getMainAttributes().putValue("Class-Path", ""); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Class-Path attribute cleared for " + returnFile.getName()); } catch (NullPointerException npe) { // Discard NPE here. Maybe there was no manifest, maybe there were no attributes, etc. } return returnFile; } else { // throw new IllegalStateException("a non-local file in cache"); return null; } } /* * This method is a copy of URLJarFile.retrieve() without the callback check. */ private java.util.jar.JarFile cacheJarFile(URL url) throws IOException { java.util.jar.JarFile result = null; final int BUF_SIZE = 2048; URLConnection conn = ConnectionFactory.getConnectionFactory().openConnection(url); /* get the stream before asserting privileges */ final InputStream in = conn.getInputStream(); try { result = AccessController.doPrivileged(new PrivilegedExceptionAction() { @Override public java.util.jar.JarFile run() throws IOException { OutputStream out = null; File tmpFile = null; try { tmpFile = File.createTempFile("jar_cache", null); tmpFile.deleteOnExit(); out = new FileOutputStream(tmpFile); int read = 0; byte[] buf = new byte[BUF_SIZE]; while ((read = in.read(buf)) != -1) { out.write(buf, 0, read); } out.close(); out = null; return new URLJarFile(tmpFile, null); } catch (IOException e) { if (tmpFile != null) { tmpFile.delete(); } throw e; } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }); } catch (PrivilegedActionException pae) { throw (IOException) pae.getException(); } finally{ ConnectionFactory.getConnectionFactory().disconnect(conn); } return result; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/RhinoBasedPacEvaluator.java0000644000000000000000000000013113441742745027127 xustar0030 mtime=1552401893.037832827 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/RhinoBasedPacEvaluator.java0000644000175000002070000002430113441742745027740 0ustar00jvanekmock00000000000000/* RhinoBasedPacEvaluator.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.SocketPermission; import java.net.URL; import java.security.AccessControlContext; import java.security.AccessController; import java.security.Permissions; import java.security.PrivilegedAction; import java.security.ProtectionDomain; import java.util.PropertyPermission; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.TimedHashMap; import org.mozilla.javascript.Context; import org.mozilla.javascript.Function; import org.mozilla.javascript.Scriptable; /** * Represents a Proxy Auto Config file. This object can be used to evaluate the * proxy file to find the proxy for a given url. * * @see The PAC File */ public class RhinoBasedPacEvaluator implements PacEvaluator { private final String pacHelperFunctionContents; private final String pacContents; private final URL pacUrl; private final TimedHashMap cache; /** * Initialize a new object by using the PAC file located at the given URL. * * @param pacUrl the url of the PAC file to use */ public RhinoBasedPacEvaluator(URL pacUrl) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Using the Rhino based PAC evaluator for url " + pacUrl); pacHelperFunctionContents = getHelperFunctionContents(); this.pacUrl = pacUrl; pacContents = getPacContents(pacUrl); cache = new TimedHashMap(); } /** * Get the proxies for accessing a given URL. The result is obtained by * evaluating the PAC file with the given url (and the host) as input. * * This method performs caching of the result. * * @param url the url for which a proxy is desired * @return a list of proxies in a string like *
    "PROXY foo.example.com:8080; PROXY bar.example.com:8080; DIRECT"
    * * @see #getProxiesWithoutCaching(URL) */ public String getProxies(URL url) { String cachedResult = getFromCache(url); if (cachedResult != null) { return cachedResult; } String result = getProxiesWithoutCaching(url); addToCache(url, result); return result; } /** * Get the proxies for accessing a given URL. The result is obtained by * evaluating the PAC file with the given url (and the host) as input. * * @param url the url for which a proxy is desired * @return a list of proxies in a string like *
    "PROXY example.com:3128; DIRECT"
    * * @see #getProxies(URL) */ private String getProxiesWithoutCaching(URL url) { if (pacHelperFunctionContents == null) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Error loading pac functions"); return "DIRECT"; } EvaluatePacAction evaluatePacAction = new EvaluatePacAction(pacContents, pacUrl.toString(), pacHelperFunctionContents, url); // Purposefully giving only these permissions rather than using java.policy. The "evaluatePacAction" // isn't supposed to do very much and so doesn't require all the default permissions given by // java.policy Permissions p = new Permissions(); p.add(new RuntimePermission("accessClassInPackage.org.mozilla.javascript")); p.add(new SocketPermission("*", "resolve")); p.add(new PropertyPermission("java.vm.name", "read")); ProtectionDomain pd = new ProtectionDomain(null, p); AccessControlContext context = new AccessControlContext(new ProtectionDomain[] { pd }); return AccessController.doPrivileged(evaluatePacAction, context); } /** * Returns the contents of file at pacUrl as a String. */ private String getPacContents(URL pacUrl) { StringBuilder contents = null; try { String line = null; contents = new StringBuilder(); BufferedReader pacReader = new BufferedReader(new InputStreamReader(pacUrl.openStream())); try { while ((line = pacReader.readLine()) != null) { // OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, line); contents = contents.append(line).append("\n"); } } finally { pacReader.close(); } } catch (IOException e) { contents = null; } return (contents != null) ? contents.toString() : null; } /** * Returns the pac helper functions as a String. The functions are read * from net/sourceforge/jnlp/resources/pac-funcs.js */ private String getHelperFunctionContents() { StringBuilder contents = null; try { String line; ClassLoader cl = this.getClass().getClassLoader(); if (cl == null) { cl = ClassLoader.getSystemClassLoader(); } InputStream in = cl.getResourceAsStream("net/sourceforge/jnlp/runtime/pac-funcs.js"); BufferedReader pacFuncsReader = new BufferedReader(new InputStreamReader(in)); try { contents = new StringBuilder(); while ((line = pacFuncsReader.readLine()) != null) { // OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL,line); contents = contents.append(line).append("\n"); } } finally { pacFuncsReader.close(); } } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); contents = null; } return (contents != null) ? contents.toString() : null; } /** * Gets an entry from the cache */ private String getFromCache(URL url) { String lookupString = url.getProtocol() + "://" + url.getHost(); String result = cache.get(lookupString); return result; } /** * Adds an entry to the cache */ private void addToCache(URL url, String proxyResult) { String lookupString = url.getAuthority() + "://" + url.getHost(); cache.put(lookupString, proxyResult); } /** * Helper classs to run remote javascript code (specified by the user as * PAC URL) inside a sandbox. */ private static class EvaluatePacAction implements PrivilegedAction { private String pacContents; private String pacUrl; private String pacFuncsContents; private URL url; public EvaluatePacAction(String pacContents, String pacUrl, String pacFuncsContents, URL url) { this.pacContents = pacContents; this.pacUrl = pacUrl; this.pacFuncsContents = pacFuncsContents; this.url = url; } public String run() { Context cx = Context.enter(); try { /* * TODO defense in depth. * * This is already running within a sandbox, but we can (and we * should) lock it down further. Look into ClassShutter. */ Scriptable scope = cx.initStandardObjects(); // any optimization level greater than -1 will trigger code generation // and this block will then need classloader permissions cx.setOptimizationLevel(-1); Object result = null; result = cx.evaluateString(scope, pacFuncsContents, "internal", 1, null); result = cx.evaluateString(scope, pacContents, pacUrl, 1, null); Object functionObj = scope.get("FindProxyForURL", scope); if (!(functionObj instanceof Function)) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "FindProxyForURL not found"); return null; } else { Function findProxyFunction = (Function) functionObj; Object[] args = { url.toString(), url.getHost() }; result = findProxyFunction.call(cx, scope, scope, args); return (String) result; } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); return "DIRECT"; } finally { Context.exit(); } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/JNLPRuntime.java0000644000000000000000000000013113441742745024711 xustar0030 mtime=1552401893.036832829 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java0000644000175000002070000010150413441742745025523 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.EventQueue; import java.awt.GraphicsEnvironment; import java.awt.HeadlessException; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.net.Authenticator; import java.net.InetAddress; import java.net.ProxySelector; import java.net.URL; import java.net.UnknownHostException; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.security.AllPermission; import java.security.KeyStore; import java.security.Policy; import java.security.Security; import java.text.DateFormat; import java.util.Date; import java.util.List; import javax.jnlp.ServiceManager; import javax.naming.ConfigurationException; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.swing.JOptionPane; import javax.swing.UIManager; import javax.swing.text.html.parser.ParserDelegator; import net.sourceforge.jnlp.DefaultLaunchHandler; import net.sourceforge.jnlp.GuiLaunchHandler; import net.sourceforge.jnlp.LaunchHandler; import net.sourceforge.jnlp.Launcher; import net.sourceforge.jnlp.browser.BrowserAwareProxySelector; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.cache.DefaultDownloadIndicator; import net.sourceforge.jnlp.cache.DownloadIndicator; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.security.JNLPAuthenticator; import net.sourceforge.jnlp.security.KeyStores; import net.sourceforge.jnlp.security.SecurityDialogMessageHandler; import net.sourceforge.jnlp.security.SecurityUtil; import net.sourceforge.jnlp.services.XServiceManagerStub; import net.sourceforge.jnlp.util.BasicExceptionDialog; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.JavaConsole; import net.sourceforge.jnlp.util.logging.LogConfig; import net.sourceforge.jnlp.util.logging.OutputController; import sun.net.www.protocol.jar.URLJarFile; /** *

    * Configure and access the runtime environment. This class * stores global jnlp properties such as default download * indicators, the install/base directory, the default resource * update policy, etc. Some settings, such as the base directory, * cannot be changed once the runtime has been initialized. *

    *

    * The JNLP runtime can be locked to prevent further changes to * the runtime environment except by a specified class. If set, * only instances of the exit class can exit the JVM or * change the JNLP runtime settings once the runtime has been * initialized. *

    * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.19 $ */ public class JNLPRuntime { /** * java-abrt-connector can print out specific application String method, it is good to save visited urls for reproduce purposes. * For javaws we can read the destination jnlp from commandline * However for plugin (url arrive via pipes). Also for plugin we can not be sure which opened tab/window * have caused the crash. Thats why the individual urls are added, not replaced. */ private static String history = ""; /** the security manager */ private static JNLPSecurityManager security; /** the security policy */ private static JNLPPolicy policy; /** handles all security message to show appropriate security dialogs */ private static SecurityDialogMessageHandler securityDialogMessageHandler; /** a default launch handler */ private static LaunchHandler handler = null; /** default download indicator */ private static DownloadIndicator indicator = null; /** update policy that controls when to check for updates */ private static UpdatePolicy updatePolicy = UpdatePolicy.ALWAYS; /** whether initialized */ private static boolean initialized = false; /** whether netx is in command-line mode (headless) */ private static boolean headless = false; private static boolean headlessChecked = false; /** whether we'll be checking for jar signing */ private static boolean verify = true; /** whether the runtime uses security */ private static boolean securityEnabled = true; /** whether debug mode is on */ private static boolean debug = false; /** * whether plugin debug mode is on */ private static Boolean pluginDebug = null; /** mutex to wait on, for initialization */ public static Object initMutex = new Object(); /** set to true if this is a webstart application. */ private static boolean isWebstartApplication; /** set to false to indicate another JVM should not be spawned, even if necessary */ private static boolean forksAllowed = true; /** all security dialogs will be consumed and pretented as being verified by user and allowed.*/ private static boolean trustAll=false; /** flag keeping rest of jnlpruntime live that javaws was lunched as -html */ private static boolean html=false; /** all security dialogs will be consumed and we will pretend the Sandbox option was chosen */ private static boolean trustNone = false; /** allows 301.302.303.307.308 redirects to be followed when downloading resources*/ private static boolean allowRedirect = false;; /** when this is true, ITW will not attempt any inet connections and will work only with what is in cache*/ private static boolean offlineForced = false; private static Boolean onlineDetected = null; /** * Header is not checked and so eg * gifar exploit is * possible.
    * However if jar file is a bit corrupted, then it sometimes can work so * this switch can disable the header check. * @see Gifar attack */ private static boolean ignoreHeaders=false; /** contains the arguments passed to the jnlp runtime */ private static List initialArguments; /** a lock which is held to indicate that an instance of netx is running */ private static FileLock fileLock; /** * Returns whether the JNLP runtime environment has been * initialized. Once initialized, some properties such as the * base directory cannot be changed. Before * @return whether this runtime was already initialilsed */ public static boolean isInitialized() { return initialized; } /** * Initialize the JNLP runtime environment by installing the * security manager and security policy, initializing the JNLP * standard services, etc. *

    * This method should be called from the main AppContext/Thread. *

    *

    * This method cannot be called more than once. Once * initialized, methods that alter the runtime can only be * called by the exit class. *

    * * @param isApplication is {@code true} if a webstart application is being * initialized * @throws IllegalStateException if the runtime was previously initialized */ public static void initialize(boolean isApplication) throws IllegalStateException { checkInitialized(); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { OutputController.getLogger().log("Unable to set system look and feel"); } if (JavaConsole.canShowOnStartup(isApplication)) { JavaConsole.getConsole().showConsoleLater(); } /* exit if there is a fatal exception loading the configuration */ if (getConfiguration().getLoadingException() != null) { if (getConfiguration().getLoadingException() instanceof ConfigurationException){ // ConfigurationException is thrown only if deployment.config's field // deployment.system.config.mandatory is true, and the destination //where deployment.system.config points is not readable throw new RuntimeException(getConfiguration().getLoadingException()); } OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("RConfigurationError")+": "+getConfiguration().getLoadingException().getMessage()); } isWebstartApplication = isApplication; //Setting the system property for javawebstart's version. //The version stored will be the same as java's version. System.setProperty("javawebstart.version", "javaws-" + System.getProperty("java.version")); if (!isHeadless() && indicator == null) indicator = new DefaultDownloadIndicator(); if (handler == null) { if (isHeadless()) { handler = new DefaultLaunchHandler(OutputController.getLogger()); } else { handler = new GuiLaunchHandler(OutputController.getLogger()); } } ServiceManager.setServiceManagerStub(new XServiceManagerStub()); // ignored if we're running under Web Start policy = new JNLPPolicy(); security = new JNLPSecurityManager(); // side effect: create JWindow doMainAppContextHacks(); if (securityEnabled) { Policy.setPolicy(policy); // do first b/c our SM blocks setPolicy System.setSecurityManager(security); } securityDialogMessageHandler = startSecurityThreads(); // wire in custom authenticator for SSL connections try { SSLSocketFactory sslSocketFactory; SSLContext context = SSLContext.getInstance("SSL"); KeyStore ks = KeyStores.getKeyStore(KeyStores.Level.USER, KeyStores.Type.CLIENT_CERTS).getKs(); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); SecurityUtil.initKeyManagerFactory(kmf, ks); TrustManager[] trust = new TrustManager[] { getSSLSocketTrustManager() }; context.init(kmf.getKeyManagers(), trust, null); sslSocketFactory = context.getSocketFactory(); HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Unable to set SSLSocketfactory (may _prevent_ access to sites that should be trusted)! Continuing anyway..."); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } // plug in a custom authenticator and proxy selector Authenticator.setDefault(new JNLPAuthenticator()); BrowserAwareProxySelector proxySelector = new BrowserAwareProxySelector(getConfiguration()); proxySelector.initialize(); ProxySelector.setDefault(proxySelector); // Restrict access to netx classes Security.setProperty("package.access", Security.getProperty("package.access")+",net.sourceforge.jnlp"); URLJarFile.setCallBack(CachedJarFileCallback.getInstance()); initialized = true; } public static void reloadPolicy() { policy.refresh(); } /** * Returns a TrustManager ideal for the running VM. * * @return TrustManager the trust manager to use for verifying https certificates */ private static TrustManager getSSLSocketTrustManager() throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException { try { Class trustManagerClass; Constructor tmCtor; if (System.getProperty("java.version").startsWith("1.6")) { // Java 6 try { trustManagerClass = Class.forName("net.sourceforge.jnlp.security.VariableX509TrustManagerJDK6"); } catch (ClassNotFoundException cnfe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Unable to find class net.sourceforge.jnlp.security.VariableX509TrustManagerJDK6"); return null; } } else { // Java 7 or more (technically could be <= 1.5 but <= 1.5 is unsupported) try { trustManagerClass = Class.forName("net.sourceforge.jnlp.security.VariableX509TrustManagerJDK7"); } catch (ClassNotFoundException cnfe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Unable to find class net.sourceforge.jnlp.security.VariableX509TrustManagerJDK7"); return null; } } Constructor[] tmCtors = trustManagerClass.getDeclaredConstructors(); tmCtor = tmCtors[0]; for (Constructor ctor : tmCtors) { if (tmCtor.getGenericParameterTypes().length == 0) { tmCtor = ctor; break; } } return (TrustManager) tmCtor.newInstance(); } catch (RuntimeException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Unable to load JDK-specific TrustManager. Was this version of IcedTea-Web compiled with JDK 6 or 7?"); OutputController.getLogger().log(e); throw e; } } /** * This must NOT be called form the application ThreadGroup. An application * can inject events into its {@link EventQueue} and bypass the security * dialogs. * * @return a {@link SecurityDialogMessageHandler} that can be used to post * security messages */ private static SecurityDialogMessageHandler startSecurityThreads() { ThreadGroup securityThreadGroup = new ThreadGroup("NetxSecurityThreadGroup"); SecurityDialogMessageHandler runner = new SecurityDialogMessageHandler(); Thread securityThread = new Thread(securityThreadGroup, runner, "NetxSecurityThread"); securityThread.setDaemon(true); securityThread.start(); return runner; } /** * Performs a few hacks that are needed for the main AppContext * * @see Launcher#doPerApplicationAppContextHacks */ private static void doMainAppContextHacks() { /* * With OpenJDK6 (but not with 7) a per-AppContext dtd is maintained. * This dtd is created by the ParserDelgate. However, the code in * HTMLEditorKit (used to render HTML in labels and textpanes) creates * the ParserDelegate only if there are no existing ParserDelegates. The * result is that all other AppContexts see a null dtd. */ new ParserDelegator(); } public static void setOfflineForced(boolean b) { offlineForced = b; OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Forcing of offline set to: " + offlineForced); } public static boolean isOfflineForced() { return offlineForced; } public static void setOnlineDetected(boolean online) { onlineDetected = online; OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Detected online set to: " + onlineDetected); } public static boolean isOnlineDetected() { if (onlineDetected == null) { //"file" protocol do not do online check //sugest online for this case return true; } return onlineDetected; } public static boolean isOnline() { if (isOfflineForced()) { return false; } return isOnlineDetected(); } public static void detectOnline(URL location) { if (onlineDetected != null) { return; } JNLPRuntime.setOnlineDetected(isConnectable(location)); } public static boolean isConnectable(URL location) { if (location.getProtocol().equals("file")) { return true; } try { InetAddress.getByName(location.getHost()); } catch (UnknownHostException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "The host of " + location.toExternalForm() + " file seems down, or you are simply offline."); return false; } return true; } /** * see Double-checked locking in Java * for cases how not to do lazy initialization * and Initialization on demand holder idiom * for ITW approach */ private static class DeploymentConfigurationHolder { private static final DeploymentConfiguration INSTANCE = initConfiguration(); private static DeploymentConfiguration initConfiguration() { DeploymentConfiguration config = new DeploymentConfiguration(); try { config.load(); config.copyTo(System.getProperties()); } catch (ConfigurationException ex) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("RConfigurationError")); //mark this exceptionas we can die on it later config.setLoadingException(ex); //to be sure - we MUST die - http://docs.oracle.com/javase/6/docs/technotes/guides/deployment/deployment-guide/properties.html }catch(Exception t){ //all exceptions are causing InstantiatizationError so this do it much more readble OutputController.getLogger().log(OutputController.Level.ERROR_ALL, t); OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("RFailingToDefault")); if (!JNLPRuntime.isHeadless()){ JOptionPane.showMessageDialog(null, R("RFailingToDefault")+"\n"+t.toString()); } //try to survive this unlikely exception config.resetToDefaults(); } finally { OutputController.getLogger().startConsumer(); } return config; } } /** * Gets the Configuration associated with this runtime * * @return a {@link DeploymentConfiguration} object that can be queried to * find relevant configuration settings */ public static DeploymentConfiguration getConfiguration() { return DeploymentConfigurationHolder.INSTANCE; } /** * @return true if a webstart application has been initialized, and false * for a plugin applet. */ public static boolean isWebstartApplication() { return isWebstartApplication; } /** * @return whether the JNLP client will use any AWT/Swing * components. */ public static boolean isHeadless() { if (!headless && !headlessChecked) { checkHeadless(); } return headless; } /** * @return whether we are verifying code signing. */ public static boolean isVerifying() { return verify; } /** * Sets whether the JNLP client will use any AWT/Swing * components. In headless mode, client features that use the * AWT are disabled such that the client can be used in * headless mode ({@code java.awt.headless=true}). * * @param enabled true if application do not wont/need gui or X at all * @throws IllegalStateException if the runtime was previously initialized */ public static void setHeadless(boolean enabled) { checkInitialized(); headless = enabled; } public static void setAllowRedirect(boolean enabled) { checkInitialized(); allowRedirect = enabled; } public static boolean isAllowRedirect() { return allowRedirect; } /** * Sets whether we will verify code signing. * * @param enabled true if app should verify signatures * @throws IllegalStateException if the runtime was previously initialized */ public static void setVerify(boolean enabled) { checkInitialized(); verify = enabled; } /** * Returns whether the secure runtime environment is enabled. * @return true if security manager is created */ public static boolean isSecurityEnabled() { return securityEnabled; } /** * Sets whether to enable the secure runtime environment. * Disabling security can increase performance for some * applications, and can be used to use netx with other code * that uses its own security manager or policy. *

    * Disabling security is not recommended and should only be * used if the JNLP files opened are trusted. This method can * only be called before initalizing the runtime. *

    * * @param enabled whether security should be enabled * @throws IllegalStateException if the runtime is already initialized */ public static void setSecurityEnabled(boolean enabled) { checkInitialized(); securityEnabled = enabled; } /** * * @return the {@link SecurityDialogMessageHandler} that should be used to * post security dialog messages */ public static SecurityDialogMessageHandler getSecurityDialogHandler() { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(new AllPermission()); } return securityDialogMessageHandler; } /** * Set a class that can exit the JVM; if not set then any class * can exit the JVM. * * @param exitClass a class that can exit the JVM * @throws IllegalStateException if caller is not the exit class */ public static void setExitClass(Class exitClass) { checkExitClass(); security.setExitClass(exitClass); } /** * Disables applets from calling exit. * * Once disabled, exit cannot be re-enabled for the duration of the JVM instance */ public static void disableExit() { security.disableExit(); } /** * @return the current Application, or null if none can be * determined. */ public static ApplicationInstance getApplication() { return security.getApplication(); } /** * @return whether debug statements for the JNLP client code * should be printed. */ public static boolean isDebug() { return isSetDebug() || isPluginDebug() || LogConfig.getLogConfig().isEnableLogging(); } public static boolean isSetDebug() { return debug; } /** * Sets whether debug statements for the JNLP client code * should be printed to the standard output. * * @param enabled set to true if you need full debug output * @throws IllegalStateException if caller is not the exit class */ public static void setDebug(boolean enabled) { checkExitClass(); debug = enabled; } /** * Sets the default update policy. * * @param policy global update policy of environment * @throws IllegalStateException if caller is not the exit class */ public static void setDefaultUpdatePolicy(UpdatePolicy policy) { checkExitClass(); updatePolicy = policy; } /** * @return the default update policy. */ public static UpdatePolicy getDefaultUpdatePolicy() { return updatePolicy; } /** * Sets the default launch handler. * @param handler default handler */ public static void setDefaultLaunchHandler(LaunchHandler handler) { checkExitClass(); JNLPRuntime.handler = handler; } /** * Returns the default launch handler. * @return default handler */ public static LaunchHandler getDefaultLaunchHandler() { return handler; } /** * Sets the default download indicator. * * @param indicator where to show progress * @throws IllegalStateException if caller is not the exit class */ public static void setDefaultDownloadIndicator(DownloadIndicator indicator) { checkExitClass(); JNLPRuntime.indicator = indicator; } /** * @return the default download indicator. */ public static DownloadIndicator getDefaultDownloadIndicator() { return indicator; } public static String getLocalisedTimeStamp(Date timestamp) { return DateFormat.getInstance().format(timestamp); } /** * @return {@code true} if the current runtime will fork */ public static boolean getForksAllowed() { return forksAllowed; } public static void setForksAllowed(boolean value) { checkInitialized(); forksAllowed = value; } /** * Throws an exception if called when the runtime is already initialized. */ private static void checkInitialized() { if (initialized) throw new IllegalStateException("JNLPRuntime already initialized."); } /** * Throws an exception if called with security enabled but a caller is not * the exit class and the runtime has been initialized. */ private static void checkExitClass() { if (securityEnabled && initialized) if (!security.isExitClass()) throw new IllegalStateException("Caller is not the exit class"); } /** * Check whether the VM is in headless mode. */ private static void checkHeadless() { //if (GraphicsEnvironment.isHeadless()) // jdk1.4+ only // headless = true; try { if ("true".equalsIgnoreCase(System.getProperty("java.awt.headless"))) { headless = true; } if (!headless) { boolean noCheck = Boolean.valueOf(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.IGNORE_HEADLESS_CHECK)); if (noCheck) { headless = false; OutputController.getLogger().log(DeploymentConfiguration.IGNORE_HEADLESS_CHECK + " set to " + noCheck + ". Avoding headless check."); } else { try { if (GraphicsEnvironment.isHeadless()) { throw new HeadlessException(); } } catch (HeadlessException ex) { headless = true; OutputController.getLogger().log(ex); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("HEADLESS_MISSCONFIGURED")); } } } } catch (SecurityException ex) { } finally { headlessChecked = true; } } /** * @return {@code true} if running on Windows */ public static boolean isWindows() { String os = System.getProperty("os.name"); return (os != null && os.startsWith("Windows")); } /** * @return {@code true} if running on a Unix or Unix-like system (including * Linux and *BSD) */ @Deprecated public static boolean isUnix() { String sep = System.getProperty("file.separator"); return (sep != null && sep.equals("/")); } public static void setInitialArgments(List args) { checkInitialized(); SecurityManager securityManager = System.getSecurityManager(); if (securityManager != null) securityManager.checkPermission(new AllPermission()); initialArguments = args; } public static List getInitialArguments() { return initialArguments; } /** * Indicate that netx is running by creating the * {@link DeploymentConfiguration#KEY_USER_NETX_RUNNING_FILE} and * acquiring a shared lock on it */ public synchronized static void markNetxRunning() { if (fileLock != null) return; try { String message = "This file is used to check if netx is running"; File netxRunningFile = PathsAndFiles.MAIN_LOCK.getFile(); if (!netxRunningFile.exists()) { FileUtils.createParentDir(netxRunningFile); FileUtils.createRestrictedFile(netxRunningFile, true); try (FileOutputStream fos = new FileOutputStream(netxRunningFile)) { fos.write(message.getBytes()); } } FileInputStream is = new FileInputStream(netxRunningFile); FileChannel channel = is.getChannel(); fileLock = channel.lock(0, 1, true); if (!fileLock.isShared()){ // We know shared locks aren't offered on this system. FileLock temp = null; for (long pos = 1; temp == null && pos < Long.MAX_VALUE - 1; pos++){ temp = channel.tryLock(pos, 1, false); // No point in requesting for shared lock. } fileLock.release(); // We can release now, since we hold another lock. fileLock = temp; // Keep the new lock so we can release later. } if (fileLock != null && fileLock.isShared()) { OutputController.getLogger().log("Acquired shared lock on " + netxRunningFile.toString() + " to indicate javaws is running"); } } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } Runtime.getRuntime().addShutdownHook(new Thread("JNLPRuntimeShutdownHookThread") { @Override public void run() { markNetxStopped(); CacheUtil.cleanCache(); } }); } /** * Indicate that netx is stopped by releasing the shared lock on * {@link DeploymentConfiguration#KEY_USER_NETX_RUNNING_FILE}. */ private static void markNetxStopped() { if (fileLock == null) { return; } try { fileLock.release(); fileLock.channel().close(); fileLock = null; OutputController.getLogger().log("Release shared lock on " + PathsAndFiles.MAIN_LOCK.getFullPath()); } catch (IOException e) { OutputController.getLogger().log(e); } } public static void setHtml(boolean html) { JNLPRuntime.html = html; } public static boolean isHtml() { return html; } public static void setTrustAll(boolean b) { trustAll=b; } public static boolean isTrustAll() { return trustAll; } public static void setTrustNone(final boolean b) { trustNone = b; } public static boolean isTrustNone() { return trustNone; } public static boolean isIgnoreHeaders() { return ignoreHeaders; } public static void setIgnoreHeaders(boolean ignoreHeaders) { JNLPRuntime.ignoreHeaders = ignoreHeaders; } private static boolean isPluginDebug() { if (pluginDebug == null) { try { //there are cases when this itself is not allowed by security manager, and so //throws exception. Under some conditions it can couse deadlock pluginDebug = System.getenv().containsKey("ICEDTEAPLUGIN_DEBUG"); } catch (Exception ex) { pluginDebug = false; OutputController.getLogger().log(ex); } } return pluginDebug; } public static void exit(int i) { try { OutputController.getLogger().close(); while (BasicExceptionDialog.areShown()){ Thread.sleep(100); } } catch (Exception ex) { //to late } System.exit(i); } public static void saveHistory(String documentBase) { JNLPRuntime.history += " " + documentBase + " "; } /** * Used by java-abrt-connector via reflection * @return history */ private static String getHistory() { return history; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/ApplicationInstance.java0000644000000000000000000000013113441742745026532 xustar0030 mtime=1552401893.035832831 30 atime=1552402157.228253501 29 ctime=1552410887.03318363 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java0000644000175000002070000004167213441742745027355 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import java.awt.Window; import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.security.AccessControlContext; import java.security.AccessController; import java.security.CodeSource; import java.security.PrivilegedAction; import java.security.ProtectionDomain; import javax.swing.event.EventListenerList; import sun.awt.AppContext; import net.sourceforge.jnlp.JNLPFile; import net.sourceforge.jnlp.PropertyDesc; import net.sourceforge.jnlp.SecurityDesc; import net.sourceforge.jnlp.ShortcutDesc; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.event.ApplicationEvent; import net.sourceforge.jnlp.event.ApplicationListener; import net.sourceforge.jnlp.security.SecurityDialogs; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.security.dialogresults.AccessWarningPaneComplexReturn; import net.sourceforge.jnlp.util.GenericDesktopEntry; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.WeakList; import net.sourceforge.jnlp.util.XDesktopEntry; /** * Represents a running instance of an application described in a * JNLPFile. This class provides a way to track the application's * resources and destroy the application. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.15 $ */ public class ApplicationInstance { // todo: should attempt to unload the environment variables // installed by the application. /** the file */ private final JNLPFile file; /** the thread group */ private final ThreadGroup group; /** the classloader */ private final ClassLoader loader; /** *

    * Every application/applet gets its own AppContext. This allows us to do * things like have two different look and feels for two different applets * (running in the same VM), allows untrusted programs to manipulate the * event queue (safely) and (possibly) more. *

    *

    * It is set to the AppContext which created this ApplicationInstance *

    */ private final AppContext appContext; /** whether the application has stopped running */ private boolean stopped = false; /** weak list of windows opened by the application */ private final WeakList weakWindows = new WeakList<>(); /** list of application listeners */ private final EventListenerList listeners = new EventListenerList(); /** whether or not this application is signed */ private boolean isSigned = false; /** * Create an application instance for the file. This should be done in the * appropriate {@link ThreadGroup} only. * @param file jnlpfile for which the instance do exists * @param group thread group to which it belongs * @param loader loader for this application */ public ApplicationInstance(JNLPFile file, ThreadGroup group, ClassLoader loader) { this.file = file; this.group = group; this.loader = loader; this.isSigned = ((JNLPClassLoader) loader).getSigning(); this.appContext = AppContext.getAppContext(); } /** * Add an Application listener * @param listener listener to be added */ public void addApplicationListener(ApplicationListener listener) { listeners.add(ApplicationListener.class, listener); } /** * Remove an Application Listener * @param listener to be removed */ public void removeApplicationListener(ApplicationListener listener) { listeners.remove(ApplicationListener.class, listener); } /** * Notify listeners that the application has been terminated. */ protected void fireDestroyed() { Object list[] = listeners.getListenerList(); ApplicationEvent event = null; for (int i = list.length - 1; i > 0; i -= 2) { // last to first required if (event == null) event = new ApplicationEvent(this); ((ApplicationListener) list[i]).applicationDestroyed(event); } } /** * Initialize the application's environment (installs * environment variables, etc). */ public void initialize() { installEnvironment(); addMenuAndDesktopEntries(); } /** * Creates menu and desktop entries if required by the jnlp file or settings */ private void addMenuAndDesktopEntries() { ShortcutDesc sd = file.getInformation().getShortcut(); if (JNLPRuntime.isWindows()) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Generating windows desktop shorcut"); try { Object instance = null; try { Class cl = Class.forName("net.sourceforge.jnlp.util.WindowsDesktopEntry"); Constructor cons = cl.getConstructor(JNLPFile.class); instance = cons.newInstance(file); //catch both, for case that mslink was removed after build } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | ClassNotFoundException | NoClassDefFoundError | InstantiationException e) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, e); } GenericDesktopEntry wde = (GenericDesktopEntry) instance; if (!wde.getDesktopIconFile().exists()) { // if the desktop shortcut doesn't exist ask AccessWarningPaneComplexReturn ics = getComplexReturn(sd); if (ics != null && ics.toBoolean()) { boolean isDesktop = false; if (ics.getDekstop() != null && ics.getDekstop().isCreate()) { isDesktop = true; } boolean isMenu = false; if (ics.getMenu() != null && ics.getMenu().isCreate()) { isMenu = true; } // if setting is always create theen ics will be true but "get" properties will be null, so set to create if (ics.getDekstop() == null && ics.toBoolean()) { isDesktop = true; }; if (ics.getMenu() == null && ics.toBoolean()) { isMenu = true; }; // create shortcuts if its ok if (isDesktop) { wde.createShortcutOnWindowsDesktop(); } if (isMenu) { wde.createWindowsMenu(); } } } else { // refresh shortcut if it already exists wde.createShortcutOnWindowsDesktop(); wde.createWindowsMenu(); } } catch (Throwable ex) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, ex); String message = Translator.R("WinDesktopError"); OutputController.getLogger().log(OutputController.Level.WARNING_ALL, message); } } else { // do non-windows desktop stuff GenericDesktopEntry entry = new XDesktopEntry(file); File possibleDesktopFile = entry.getDesktopIconFile(); File possibleMenuFile = entry.getLinuxMenuIconFile(); File generatedJnlp = entry.getGeneratedJnlpFileName(); //if one of menu or desktop exists, do not bother user boolean exists = false; if (possibleDesktopFile.exists()) { OutputController.getLogger().log("ApplicationInstance.addMenuAndDesktopEntries(): file - " + possibleDesktopFile.getAbsolutePath() + " already exists. Refreshing and not proceeding with desktop additions"); exists = true; if (JNLPRuntime.isOnline()) { entry.refreshExistingShortcuts(false, true); //update } } if (possibleMenuFile.exists()) { OutputController.getLogger().log("ApplicationInstance.addMenuAndDesktopEntries(): file - " + possibleMenuFile.getAbsolutePath() + " already exists. Refreshing and not proceeding with desktop additions"); exists = true; if (JNLPRuntime.isOnline()) { entry.refreshExistingShortcuts(true, false); //update } } if (generatedJnlp.exists()) { OutputController.getLogger().log("ApplicationInstance.addMenuAndDesktopEntries(): generated file - " + generatedJnlp.getAbsolutePath() + " already exists. Refreshing and not proceeding with desktop additions"); exists = true; if (JNLPRuntime.isOnline()) { entry.refreshExistingShortcuts(true, true); //update } } if (exists){ return; } AccessWarningPaneComplexReturn ics = getComplexReturn(sd); if (ics !=null && ics.toBoolean()) { entry.createDesktopShortcuts(ics.getMenu(), ics.getDekstop(), isSigned()); } } } /** * Indicates whether a desktop launcher/shortcut should be created for this * application instance * * @param sd the ShortcutDesc element from the JNLP file * @return true if a desktop shortcut should be created */ private AccessWarningPaneComplexReturn getComplexReturn(ShortcutDesc sd) { if (JNLPRuntime.isTrustAll()) { boolean mainResult = (sd != null && (sd.onDesktop() || sd.getMenu() != null)); AccessWarningPaneComplexReturn r = new AccessWarningPaneComplexReturn(mainResult); if (mainResult){ if (sd.onDesktop()){ r.setDekstop(new AccessWarningPaneComplexReturn.ShortcutResult(true)); r.getDekstop().setBrowser(XDesktopEntry.getBrowserBin()); r.getDekstop().setShortcutType(AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.BROWSER); } if (sd.getMenu() != null){ r.setMenu(new AccessWarningPaneComplexReturn.ShortcutResult(true)); r.getMenu().setBrowser(XDesktopEntry.getBrowserBin()); r.getMenu().setShortcutType(AccessWarningPaneComplexReturn.ShortcutResult.Shortcut.BROWSER); } } return r; } String currentSetting = JNLPRuntime.getConfiguration() .getProperty(DeploymentConfiguration.KEY_CREATE_DESKTOP_SHORTCUT); /* * check configuration and possibly prompt user to find out if a * shortcut should be created or not */ switch (currentSetting) { case ShortcutDesc.CREATE_NEVER: return new AccessWarningPaneComplexReturn(false); case ShortcutDesc.CREATE_ALWAYS: return new AccessWarningPaneComplexReturn(true); case ShortcutDesc.CREATE_ASK_USER: return SecurityDialogs.showAccessWarningDialog(AccessType.CREATE_DESTKOP_SHORTCUT, file, null); case ShortcutDesc.CREATE_ASK_USER_IF_HINTED: if (sd != null && (sd.onDesktop() || sd.toMenu())) { return SecurityDialogs.showAccessWarningDialog(AccessType.CREATE_DESTKOP_SHORTCUT, file, null); } case ShortcutDesc.CREATE_ALWAYS_IF_HINTED: if (sd != null && (sd.onDesktop() || sd.toMenu())) { return new AccessWarningPaneComplexReturn(true); } } return new AccessWarningPaneComplexReturn(false); } /** * Releases the application's resources before it is collected. * Only collectable if classloader and thread group are * also collectable so basically is almost never called (an * application would have to close its windows and exit its * threads but not call JNLPRuntime.exit). */ @Override public void finalize() { destroy(); } /** * Install the environment variables. */ void installEnvironment() { final PropertyDesc props[] = file.getResources().getProperties(); CodeSource cs = new CodeSource((URL) null, (java.security.cert.Certificate[]) null); JNLPClassLoader loader = (JNLPClassLoader) this.loader; SecurityDesc s = loader.getSecurity(); ProtectionDomain pd = new ProtectionDomain(cs, s.getPermissions(cs), null, null); // Add to hashmap AccessControlContext acc = new AccessControlContext(new ProtectionDomain[] { pd }); PrivilegedAction installProps = new PrivilegedAction() { @Override public Object run() { for (PropertyDesc propDesc : props) { System.setProperty(propDesc.getKey(), propDesc.getValue()); } return null; } }; AccessController.doPrivileged(installProps, acc); } /** * Returns the jnlpfile on which is this application based * @return JNLP file for this task. */ public JNLPFile getJNLPFile() { return file; } /** * Returns the application title. * @return the title of this application */ public String getTitle() { return file.getTitle(); } /** * Returns whether the application is running. * @return state of application */ public boolean isRunning() { return !stopped; } /** * Stop the application and destroy its resources. */ @SuppressWarnings("deprecation") public void destroy() { if (stopped) return; try { // destroy resources for (Window w : weakWindows) { if (w != null) w.dispose(); } weakWindows.clear(); // interrupt threads Thread threads[] = new Thread[group.activeCount() * 2]; int nthreads = group.enumerate(threads); for (int i = 0; i < nthreads; i++) { OutputController.getLogger().log("Interrupt thread: " + threads[i]); threads[i].interrupt(); } // then stop Thread.yield(); nthreads = group.enumerate(threads); for (int i = 0; i < nthreads; i++) { OutputController.getLogger().log("Stop thread: " + threads[i]); threads[i].stop(); } // then destroy - except Thread.destroy() not implemented in jdk } finally { stopped = true; fireDestroyed(); } } /** * Returns the thread group. * * @return thread group of this application, unless it is stopped * @throws IllegalStateException if the app is not running */ public ThreadGroup getThreadGroup() throws IllegalStateException { if (stopped) throw new IllegalStateException(); return group; } /** * Returns the classloader. * * @return the classloader of this application, unless it is stopped * @throws IllegalStateException if the app is not running */ public ClassLoader getClassLoader() throws IllegalStateException { if (stopped) throw new IllegalStateException(); return loader; } /** * Adds a window that this application opened. When the * application is disposed, these windows will also be disposed. * @param window to be added */ protected void addWindow(Window window) { weakWindows.add(window); weakWindows.trimToSize(); } /** * @return whether or not this application is signed. */ public boolean isSigned() { return isSigned; } /** * * @return application context of this instance */ public AppContext getAppContext() { return appContext; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/PacEvaluator.java0000644000000000000000000000013213441742745025171 xustar0030 mtime=1552401893.041832819 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PacEvaluator.java0000644000175000002070000000427213441742745026006 0ustar00jvanekmock00000000000000/* PacEvaluator.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.net.URL; /** * This interface represents an object which can evaluate Proxy Auto Config * files. */ public interface PacEvaluator { /** * Get the proxies for accessing a given URL. The result is obtained by * evaluating the PAC file with the given url (and the host) as input. * * @param url the url for which a proxy is desired * @return a list of proxies in a string like *
    "PROXY foo.example.com:8080; PROXY bar.example.com:8080; DIRECT"
    */ public String getProxies(URL url); } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/JNLPPolicy.java0000644000000000000000000000013113441742745024525 xustar0029 mtime=1552401893.04083282 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/JNLPPolicy.java0000644000175000002070000001710313441742745025340 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.security.*; import java.util.Enumeration; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.util.logging.OutputController; /** * Policy for JNLP environment. This class delegates to the * system policy but always grants permissions to the JNLP code * and system CodeSources (no separate policy file needed). This * class may also grant permissions to applications at runtime if * approved by the user. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.7 $ */ public class JNLPPolicy extends Policy { /** classes from this source have all permissions */ private static CodeSource shellSource; /** classes from this source have all permissions */ private static CodeSource systemSource; /** the previous policy */ private static Policy systemPolicy; private final String jreExtDir; /** the system level policy for jnlps */ private Policy systemJnlpPolicy = null; /** the user-level policy for jnlps */ private Policy userJnlpPolicy = null; protected JNLPPolicy() { shellSource = JNLPPolicy.class.getProtectionDomain().getCodeSource(); systemSource = Policy.class.getProtectionDomain().getCodeSource(); systemPolicy = Policy.getPolicy(); systemJnlpPolicy = getPolicyFromConfig(DeploymentConfiguration.KEY_SYSTEM_SECURITY_POLICY); userJnlpPolicy = getPolicyFromUrl(PathsAndFiles.JAVA_POLICY.getFullPath()); String jre = System.getProperty("java.home"); jreExtDir = jre + File.separator + "lib" + File.separator + "ext"; } /** * Return a mutable, heterogeneous-capable permission collection * for the source. */ public PermissionCollection getPermissions(CodeSource source) { if (source.equals(systemSource) || source.equals(shellSource)) return getAllPermissions(); if (isSystemJar(source)) { return getAllPermissions(); } // if we check the SecurityDesc here then keep in mind that // code can add properties at runtime to the ResourcesDesc! if (JNLPRuntime.getApplication() != null) { if (JNLPRuntime.getApplication().getClassLoader() instanceof JNLPClassLoader) { JNLPClassLoader cl = (JNLPClassLoader) JNLPRuntime.getApplication().getClassLoader(); PermissionCollection clPermissions = cl.getPermissions(source); Enumeration e; CodeSource appletCS = new CodeSource(JNLPRuntime.getApplication().getJNLPFile().getSourceLocation(), (java.security.cert.Certificate[]) null); // systempolicy permissions need to be accounted for as well e = systemPolicy.getPermissions(appletCS).elements(); while (e.hasMoreElements()) { clPermissions.add(e.nextElement()); } // and so do permissions from the jnlp-specific system policy if (systemJnlpPolicy != null) { e = systemJnlpPolicy.getPermissions(appletCS).elements(); while (e.hasMoreElements()) { clPermissions.add(e.nextElement()); } } // and permissiosn from jnlp-specific user policy too if (userJnlpPolicy != null) { e = userJnlpPolicy.getPermissions(appletCS).elements(); while (e.hasMoreElements()) { clPermissions.add(e.nextElement()); } CodeSource appletCodebaseSource = new CodeSource(JNLPRuntime.getApplication().getJNLPFile().getCodeBase(), (java.security.cert.Certificate[]) null); e = userJnlpPolicy.getPermissions(appletCodebaseSource).elements(); while (e.hasMoreElements()) { clPermissions.add(e.nextElement()); } } return clPermissions; } } // delegate to original Policy object; required to run under WebStart return systemPolicy.getPermissions(source); } /** * Refresh. */ public void refresh() { if (userJnlpPolicy != null) { userJnlpPolicy.refresh(); } } /** * Return an all-permissions collection. */ private Permissions getAllPermissions() { Permissions result = new Permissions(); result.add(new AllPermission()); return result; } /** * Returns true if the CodeSource corresponds to a system jar. That is, * it's part of the JRE. */ private boolean isSystemJar(CodeSource source) { if (source == null || source.getLocation() == null) { return false; } // anything in JRE/lib/ext is a system jar and has full permissions String sourceProtocol = source.getLocation().getProtocol(); String sourcePath = source.getLocation().getPath(); if (sourceProtocol.toUpperCase().equals("FILE") && sourcePath.startsWith(jreExtDir)) { return true; } return false; } /** * Constructs a delegate policy based on a config setting * @param key a KEY_* in DeploymentConfiguration * @return a policy based on the configuration set by the user */ private Policy getPolicyFromConfig(String key) { DeploymentConfiguration config = JNLPRuntime.getConfiguration(); String policyLocation = config.getProperty(key); return getPolicyFromUrl(policyLocation); } /** * Constructs a delegate policy based on a config setting * @param key a KEY_* in DeploymentConfiguration * @return a policy based on the configuration set by the user */ private Policy getPolicyFromUrl(String policyLocation) { Policy policy = null; if (policyLocation != null) { try { URI policyUri = new URI(policyLocation.replace("\\","/")); policy = getInstance("JavaPolicy", new URIParameter(policyUri)); } catch (IllegalArgumentException | NoSuchAlgorithmException | URISyntaxException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } return policy; } public boolean implies(ProtectionDomain domain, Permission permission) { //Include the permissions that may be added during runtime. PermissionCollection pc = getPermissions(domain.getCodeSource()); return super.implies(domain, permission) || pc.implies(permission); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/AppletEnvironment.java0000644000000000000000000000013213441742745026255 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java0000644000175000002070000002651713441742745027100 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import net.sourceforge.jnlp.util.logging.OutputController; import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.*; import java.util.List; import java.lang.reflect.InvocationTargetException; import java.net.*; import java.io.*; import javax.jnlp.ServiceManager; import javax.swing.*; import net.sourceforge.jnlp.*; import net.sourceforge.jnlp.services.ServiceUtil; import net.sourceforge.jnlp.splashscreen.SplashController; import net.sourceforge.jnlp.util.*; import net.sourceforge.swing.SwingUtils; /** * The applet environment including stub, context, and frame. The * default environment puts the applet in a non-resiable frame; * this can be changed by obtaining the frame and setting it * resizable. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.12 $ */ public class AppletEnvironment implements AppletContext, AppletStub { /** the JNLP file */ private JNLPFile file; /** the applet */ private Applet applet; /** the parameters */ private Map parameters; /** the applet container */ private Container cont; /** weak references to the audio clips */ private final WeakList weakClips = new WeakList<>(); /** whether the applet has been started / displayed */ private boolean appletStarted = false; /** whether the applet has been destroyed */ private boolean destroyed = false; /** * Create a new applet environment for the applet specified by * the JNLP file. * @param file jnlp file base to construct environment * @param appletInstance applet for this environment * @param cont container to place this applet to */ public AppletEnvironment(JNLPFile file, final AppletInstance appletInstance, Container cont) { this.file = file; this.applet = appletInstance.getApplet(); parameters = file.getApplet().getParameters(); this.cont = cont; } /** * Create a new applet environment for the applet specified by * the JNLP file, in a new frame. * @param file jnlp file base to construct environment * @param appletInstance applet for this environment */ public AppletEnvironment(JNLPFile file, final AppletInstance appletInstance) { this(file, appletInstance, null); Frame frame = new Frame(file.getApplet().getName() + " - Applet"); frame.setResizable(false); appletInstance.addWindow(frame); // may not need this once security manager can close windows // that do not have app code on the stack WindowListener closer = new WindowAdapter() { @Override public void windowClosing(WindowEvent event) { appletInstance.destroy(); JNLPRuntime.exit(0); } }; frame.addWindowListener(closer); this.cont = frame; } /** * Checks whether the applet has been destroyed, and throws an * IllegalStateException if the applet has been destroyed of. * * @throws IllegalStateException */ private void checkDestroyed() { if (destroyed) { throw new IllegalStateException("Illegal applet stub/context access: applet destroyed."); } } /** * Disposes the applet's resources and disables the applet * environment from further use; after calling this method the * applet stub and context methods throw IllegalStateExceptions. */ public void destroy() { destroyed = true; List clips = weakClips.hardList(); for (AppletAudioClip clip : clips) { clip.dispose(); } } /** * @return the frame that contains the applet. Disposing this * frame will destroy the applet. */ public Container getAppletFrame() { // TODO: rename this method to getAppletContainer ? return cont; } /** * container must be SplashContoler. * @return container */ public SplashController getSplashController() { if (cont instanceof SplashController) { return (SplashController) cont; } else { return null; } } /** * Initialize, start, and show the applet. */ public void startApplet() { checkDestroyed(); if (appletStarted) { return; } appletStarted = true; try { AppletDesc appletDesc = file.getApplet(); if (cont instanceof AppletStub) { applet.setStub((AppletStub) cont); } else { applet.setStub(this); } cont.setLayout(new BorderLayout()); cont.add("Center", applet); cont.validate(); // This is only needed if the applet is in its own frame. if (cont instanceof Frame) { Frame frame = (Frame) cont; frame.pack(); // cause insets to be calculated Insets insets = frame.getInsets(); frame.setSize(appletDesc.getWidth() + insets.left + insets.right, appletDesc.getHeight() + insets.top + insets.bottom); } try { SwingUtils.callOnAppContext(new Runnable() { @Override public void run() { // do first because some applets need to be displayed before // starting (they use Component.getImage or something) cont.setVisible(true); applet.init(); applet.start(); cont.invalidate(); // this should force the applet to cont.validate(); // the correct size and to repaint cont.repaint(); } }); } catch (InterruptedException | InvocationTargetException ie) { OutputController.getLogger().log(ie); } } catch (Exception ex) { OutputController.getLogger().log(ex); // should also kill the applet? } } // applet context methods /** * Returns the applet if the applet's name is specified, * otherwise return null. */ @Override public Applet getApplet(String name) { checkDestroyed(); if (name != null && name.equals(file.getApplet().getName())) { return applet; } else { return null; } } /** * Set the applet of this environment; can only be called once. * @param applet source of this environment */ public void setApplet(Applet applet) { if (this.applet != null) { OutputController.getLogger().log(new IllegalStateException("Applet can only be set once.")); return; } this.applet = applet; } /** * Returns an enumeration that contains only the applet * from the JNLP file. */ @Override public Enumeration getApplets() { checkDestroyed(); return Collections.enumeration(Arrays.asList(new Applet[] { applet })); } /** * @param location source of clip * @return an audio clip. */ @Override public AudioClip getAudioClip(URL location) { checkDestroyed(); AppletAudioClip clip = new AppletAudioClip(location); weakClips.add(clip); weakClips.trimToSize(); return clip; } /** * @return an image loaded from the specified location. * @param location location of image */ @Override public Image getImage(URL location) { checkDestroyed(); //return Toolkit.getDefaultToolkit().createImage(location); Image image = (new ImageIcon(location)).getImage(); return image; } /** * @param uRL url of document */ @Override public void showDocument(java.net.URL uRL) { checkDestroyed(); ServiceUtil.getBasicService().showDocument(uRL); } /** * Not implemented yet. * @param uRL source of document * @param str _self, _parent, _top, _blank or "name". Have sense only for applets. Not implemented for our javaws world */ @Override public void showDocument(java.net.URL uRL, java.lang.String str) { checkDestroyed(); ServiceUtil.getBasicService().showDocument(uRL); } /** * Not implemented yet. * @param str id of applet */ @Override public void showStatus(java.lang.String str) { checkDestroyed(); } /** * Required for JRE1.4, but not implemented yet. */ @Override public void setStream(String key, InputStream stream) { checkDestroyed(); } /** * Required for JRE1.4, but not implemented yet. */ @Override public InputStream getStream(String key) { checkDestroyed(); return null; } /** * Required for JRE1.4, but not implemented yet. */ @Override public Iterator getStreamKeys() { checkDestroyed(); return null; } // stub methods @Override public void appletResize(int width, int height) { checkDestroyed(); if (cont instanceof Frame) { Frame frame = (Frame) cont; Insets insets = frame.getInsets(); frame.setSize(width + insets.left + insets.right, height + insets.top + insets.bottom); } } @Override public AppletContext getAppletContext() { checkDestroyed(); return this; } @Override public URL getCodeBase() { checkDestroyed(); return file.getCodeBase(); } @Override public URL getDocumentBase() { checkDestroyed(); URL db = file.getApplet().getDocumentBase(); if (db == null) { return getCodeBase(); } else { return db; } } // FIXME: Sun's applet code forces all parameters to lower case. // Does Netx's JNLP code do the same, so we can remove the first lookup? @Override public String getParameter(String name) { checkDestroyed(); String s = parameters.get(name); if (s != null) { return s; } return parameters.get(name.toLowerCase()); } @Override public boolean isActive() { checkDestroyed(); // it won't be started or stopped, so if it can call it's running return true; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/Translator.java0000644000000000000000000000013213441742745024734 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/Translator.java0000644000175000002070000001060213441742745025543 0ustar00jvanekmock00000000000000// Copyright (C) 2010 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import java.text.MessageFormat; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import net.sourceforge.jnlp.config.DeploymentConfiguration; /** * Utility class to provide simple methods to help localize messages */ public class Translator { private static class TranslatorHolder { //https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java //https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom private static final Translator INSTANCE = new Translator(); private static Translator getTransaltor() { return TranslatorHolder.INSTANCE; } } /** * the localized resource strings */ private final ResourceBundle resources; Translator() { this("net.sourceforge.jnlp.resources.Messages"); } Translator(String s) { try { resources = ResourceBundle.getBundle(s); } catch (Exception ex) { throw new IllegalStateException("No bundles found for Locale: " + Locale.getDefault().toString() + "and missing base resource bundle in javaws.jar:net/sourceforge/jnlp/resource/Messages.properties"); } } Translator(ResourceBundle resources) { this.resources = resources; } public static Translator getInstance() { return TranslatorHolder.getTransaltor(); } /** * Return a translated (localized) version of the message * @param message the message to translate * @return a string representing the localized message */ public static String R(String message) { return R(message, new Object[0]); } /** * @param message key to be found in properties * @param params params to be expanded to message * @return the localized string for the message */ public static String R(String message, Object... params) { return getInstance().getMessage(message, params); } /** * convenient method to show VVPossibleBrowserValues with all four params * * @return translation of VVPossibleBrowserValues with all params in */ public static String VVPossibleBrowserValues() { return R("VVPossibleBrowserValues", DeploymentConfiguration.LEGACY_WIN32_URL__HANDLER, DeploymentConfiguration.BROWSER_ENV_VAR, DeploymentConfiguration.INTERNAL_HTML, DeploymentConfiguration.ALWAYS_ASK, DeploymentConfiguration.KEY_BROWSER_PATH ); } /** * @return the localized resource string using the specified arguments. * @param key key to be found in properties * @param args params to be expanded to message */ protected String getMessage(String key, Object... args) { return MessageFormat.format(getMessage(key), args); } /** * Returns the localized resource string identified by the * specified key. If the message is empty, a null is * returned. */ private String getMessage(String key) { try { String result = resources.getString(key); if (result.length() == 0) return ""; else return result; } catch (NullPointerException e) { return getMessage("RNoResource", new Object[]{key}); } catch (MissingResourceException | ClassCastException e) { if (key == "RNoResource") { return "No localized text found"; } else { return getMessage("RNoResource", new Object[]{key}); } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/JNLPSecurityManager.java0000644000000000000000000000013213441742745026371 xustar0030 mtime=1552401893.033832835 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java0000644000175000002070000004164213441742745027210 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.Window; import java.net.SocketPermission; import java.security.AccessControlException; import java.security.Permission; import net.sourceforge.jnlp.security.SecurityDialogs.AccessType; import net.sourceforge.jnlp.services.ServiceUtil; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.WeakList; import net.sourceforge.swing.SwingUtils; import sun.awt.AWTSecurityManager; import sun.awt.AppContext; /** * Security manager for JNLP environment. This security manager * cannot be replaced as it always denies attempts to replace the * security manager or policy. *

    * The JNLP security manager tracks windows created by an * application, allowing those windows to be disposed when the * application exits but the JVM does not. If security is not * enabled then the first application to call System.exit will * halt the JVM. *

    * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.17 $ */ class JNLPSecurityManager extends AWTSecurityManager { // todo: some apps like JDiskReport can close the VM even when // an exit class is set - fix! // todo: create an event dispatch thread for each application, // so that the context classloader doesn't have to be switched // to the foreground application (the currently the approach // since some apps need their classloader as event dispatch // thread's context classloader). // todo: use a custom Permission object to identify the current // application in an AccessControlContext by setting a side // effect in its implies method. Use a custom // AllPermissions-like permission to do this for apps granted // all permissions (but investigate whether this will nuke // the all-permission optimizations in the JRE). // todo: does not exit app if close button pressed on JFrame // with CLOSE_ON_EXIT (or whatever) set; if doesn't exit, use an // WindowListener to catch WindowClosing event, then if exit is // called immediately afterwards from AWT thread. // todo: deny all permissions to applications that should have // already been 'shut down' by closing their resources and // interrupt the threads if operating in a shared-VM (exit class // set). Deny will probably will slow checks down a lot though. // todo: weak remember last getProperty application and // re-install properties if another application calls, or find // another way for different apps to have different properties // in java.lang.Sytem with the same names. /** only class that can exit the JVM, if set */ private Object exitClass = null; /** this exception prevents exiting the JVM */ private SecurityException closeAppEx = // making here prevents huge stack traces new SecurityException(R("RShutdown")); /** weak list of windows created */ private WeakList weakWindows = new WeakList(); /** weak list of applications corresponding to window list */ private WeakList weakApplications = new WeakList(); /** Sets whether or not exit is allowed (in the context of the plugin, this is always false) */ private boolean exitAllowed = true; /** * The AppContext of the main application (netx). We need to store this here * so we can return this when no code from an external application is * running on the thread */ private AppContext mainAppContext; /** * Creates a JNLP SecurityManager. */ JNLPSecurityManager() { // this has the side-effect of creating the Swing shared Frame // owner. Since no application is running at this time, it is // not added to any window list when checkTopLevelWindow is // called for it (and not disposed). if (!JNLPRuntime.isHeadless()) { /* is it really useful ? */ SwingUtils.getOrCreateWindowOwner(); } mainAppContext = AppContext.getAppContext(); } /** * Returns whether the exit class is present on the stack, or * true if no exit class is set. */ public boolean isExitClass() { return isExitClass(getClassContext()); } /** * Returns whether the exit class is present on the stack, or * true if no exit class is set. */ private boolean isExitClass(Class stack[]) { if (exitClass == null) { return true; } for (int i = 0; i < stack.length; i++) { if (stack[i] == exitClass) { return true; } } return false; } /** * Set the exit class, which is the only class that can exit the * JVM; if not set then any class can exit the JVM. * * @param exitClass the exit class * @throws IllegalStateException if the exit class is already set */ public void setExitClass(Class exitClass) throws IllegalStateException { if (this.exitClass != null) { throw new IllegalStateException(R("RExitTaken")); } this.exitClass = exitClass; } /** * Return the current Application, or null if none can be * determined. */ protected ApplicationInstance getApplication() { return getApplication(Thread.currentThread(), getClassContext(), 0); } /** * Return the application the opened the specified window (only * call from event dispatch thread). */ protected ApplicationInstance getApplication(Window window) { for (int i = weakWindows.size(); i-- > 0;) { Window w = weakWindows.get(i); if (w == null) { weakWindows.remove(i); weakApplications.remove(i); } if (w == window) { return weakApplications.get(i); } } return null; } /** * Return the current Application, or null. */ protected ApplicationInstance getApplication(Thread thread, Class stack[], int maxDepth) { ClassLoader cl; JNLPClassLoader jnlpCl; cl = thread.getContextClassLoader(); while (cl != null) { jnlpCl = getJnlpClassLoader(cl); if (jnlpCl != null && jnlpCl.getApplication() != null) { return jnlpCl.getApplication(); } cl = cl.getParent(); } if (maxDepth <= 0) { maxDepth = stack.length; } // this needs to be tightened up for (int i = 0; i < stack.length && i < maxDepth; i++) { cl = stack[i].getClassLoader(); while (cl != null) { jnlpCl = getJnlpClassLoader(cl); if (jnlpCl != null && jnlpCl.getApplication() != null) { return jnlpCl.getApplication(); } cl = cl.getParent(); } } return null; } /** * Returns the JNLPClassLoader associated with the given ClassLoader, or * null. * @param cl a ClassLoader * @return JNLPClassLoader or null */ private JNLPClassLoader getJnlpClassLoader(ClassLoader cl) { // Since we want to deal with JNLPClassLoader, extract it if this // is a codebase loader if (cl instanceof JNLPClassLoader.CodeBaseClassLoader) { cl = ((JNLPClassLoader.CodeBaseClassLoader) cl).getParentJNLPClassLoader(); } if (cl instanceof JNLPClassLoader) { JNLPClassLoader loader = (JNLPClassLoader) cl; return loader; } return null; } /** * Returns the application's thread group if the application can * be determined; otherwise returns super.getThreadGroup() */ @Override public ThreadGroup getThreadGroup() { ApplicationInstance app = getApplication(); if (app == null) { return super.getThreadGroup(); } return app.getThreadGroup(); } /** * Throws a SecurityException if the permission is denied, * otherwise return normally. This method always denies * permission to change the security manager or policy. */ @Override public void checkPermission(Permission perm) { String name = perm.getName(); // Enable this manually -- it can kill ITW if left uncommented // if (false) // System.out.println("Checking permission: " + perm.toString()); if (!JNLPRuntime.isWebstartApplication() && ("setPolicy".equals(name) || "setSecurityManager".equals(name))) { throw new SecurityException(R("RCantReplaceSM")); } try { // deny all permissions to stopped applications // The call to getApplication() below might not work if an // application hasn't been fully initialized yet. // if (JNLPRuntime.isDebug()) { // if (!"getClassLoader".equals(name)) { // ApplicationInstance app = getApplication(); // if (app != null && !app.isRunning()) // throw new SecurityException(R("RDenyStopped")); // } // } super.checkPermission(perm); } catch (SecurityException ex) { OutputController.getLogger().log("Denying permission: " + perm); throw ex; } } /** * Asks the user whether or not to grant permission. * @param perm the permission to be granted * @return true if the permission was granted, false otherwise. */ private boolean askPermission(Permission perm) { ApplicationInstance app = getApplication(); if (app != null && !app.isSigned()) { if (perm instanceof SocketPermission && ServiceUtil.checkAccess(AccessType.NETWORK, perm.getName())) { return true; } } return false; } /** * Adds a permission to the JNLPClassLoader. * @param perm the permission to add to the JNLPClassLoader */ private void addPermission(Permission perm) { if (JNLPRuntime.getApplication().getClassLoader() instanceof JNLPClassLoader) { JNLPClassLoader cl = (JNLPClassLoader) JNLPRuntime.getApplication().getClassLoader(); cl.addPermission(perm); if (JNLPRuntime.isDebug()) { if (cl.getSecurity() == null) { if (cl.getPermissions(null).implies(perm)){ OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Added permission: " + perm.toString()); } else { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Unable to add permission: " + perm.toString()); } } else { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Cannot get permissions for null codesource when classloader security is not null"); } } } else { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Unable to add permission: " + perm + ", classloader not JNLP."); } } /** * Checks whether the window can be displayed without an applet * warning banner, and adds the window to the list of windows to * be disposed when the calling application exits. */ @Override public boolean checkTopLevelWindow(Object window) { ApplicationInstance app = getApplication(); // remember window -> application mapping for focus, close on exit if (app != null && window instanceof Window) { Window w = (Window) window; OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "SM: app: " + app.getTitle() + " is adding a window: " + window + " with appContext " + AppContext.getAppContext()); weakWindows.add(w); // for mapping window -> app weakApplications.add(app); app.addWindow(w); } // todo: set awt.appletWarning to custom message // todo: logo on with glass pane on JFrame/JWindow? return super.checkTopLevelWindow(window); } /** * Checks whether the caller can exit the system. This method * identifies whether the caller is a real call to Runtime.exec * and has special behavior when returning from this method * would exit the JVM and an exit class is set: if the caller is * not the exit class then the calling application will be * stopped and its resources destroyed (when possible), and an * exception will be thrown to prevent the JVM from shutting * down. *

    * Calls not from Runtime.exit or with no exit class set will * behave normally, and the exit class can always exit the JVM. *

    */ @Override public void checkExit(int status) { // applets are not allowed to exit, but the plugin main class (primordial loader) is Class stack[] = getClassContext(); if (!exitAllowed) { for (int i = 0; i < stack.length; i++) { if (stack[i].getClassLoader() != null) { throw new AccessControlException("Applets may not call System.exit()"); } } } super.checkExit(status); boolean realCall = (stack[1] == Runtime.class); if (isExitClass(stack)) { return; } // to Runtime.exit or fake call to see if app has permission // not called from Runtime.exit() if (!realCall) { // apps that can't exit should think they can exit normally super.checkExit(status); return; } // but when they really call, stop only the app instead of the JVM ApplicationInstance app = getApplication(Thread.currentThread(), stack, 0); if (app == null) { throw new SecurityException(R("RExitNoApp")); } app.destroy(); throw closeAppEx; } protected void disableExit() { exitAllowed = false; } /** * This returns the appropriate {@link AppContext}. Hooks in AppContext * check if the current {@link SecurityManager} is an instance of * AWTSecurityManager and if so, call this method to give it a chance to * return the appropriate appContext based on the application that is * running. *

    * This can be called from any thread (possibly a swing thread) to find out * the AppContext for the thread (which may correspond to a particular * applet). *

    */ @Override public AppContext getAppContext() { ApplicationInstance app = getApplication(); if (app == null) { /* * if we cannot find an application based on the code on the stack, * then assume it is the main application */ return mainAppContext; } else { return app.getAppContext(); } } /** * Tests if a client can get access to the AWT event queue. This version allows * complete access to the EventQueue for its own AppContext-specific EventQueue. * * FIXME there are probably huge security implications for this. Eg: * http://hg.openjdk.java.net/jdk7/awt/jdk/rev/8022709a306d * * @exception SecurityException if the caller does not have * permission to accesss the AWT event queue. */ @Override public void checkAwtEventQueueAccess() { /* * this is the templace of the code that should allow applets access to * eventqueues */ // AppContext appContext = AppContext.getAppContext(); // ApplicationInstance instance = getApplication(); // if ((appContext == mainAppContext) && (instance != null)) { // If we're about to allow access to the main EventQueue, // and anything untrusted is on the class context stack, // disallow access. super.checkAwtEventQueueAccess(); // } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/Boot.java0000644000000000000000000000013213441742745023506 xustar0030 mtime=1552401893.032832837 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/Boot.java0000644000175000002070000003676313441742745024335 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.runtime; import java.io.File; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.UIManager; import net.sourceforge.jnlp.LaunchException; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ParserSettings; import net.sourceforge.jnlp.PropertyDesc; import net.sourceforge.jnlp.about.AboutDialog; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.security.viewer.CertificateViewer; import net.sourceforge.jnlp.services.ServiceUtil; import net.sourceforge.jnlp.util.docprovider.IcedTeaWebTextsProvider; import net.sourceforge.jnlp.util.docprovider.JavaWsTextsProvider; import net.sourceforge.jnlp.util.docprovider.TextsProvider; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.PlainTextFormatter; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.optionparser.InvalidArgumentException; import net.sourceforge.jnlp.util.optionparser.OptionParser; import net.sourceforge.jnlp.util.optionparser.UnevenParameterException; import sun.awt.AppContext; import sun.awt.SunToolkit; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.runtime.html.browser.LinkingBrowser; import net.sourceforge.swing.SwingUtils; /** * This is the main entry point for the JNLP client. The main method parses the * command line parameters and loads a JNLP file into the secure runtime * environment. This class is meant to be called from the command line or file * association; to initialize the netx engine from other code invoke the * {@link JNLPRuntime#initialize} method after configuring the runtime. * * @author Jon A. Maxwell * (JAM) - initial author * @version $Revision: 1.21 $ */ public final class Boot implements PrivilegedAction { // todo: decide whether a spawned netx (external launch) // should inherit the same options as this instance (store argv?) public static final String name = Boot.class.getPackage().getImplementationTitle(); public static final String version = Boot.class.getPackage().getImplementationVersion(); private static final String nameAndVersion = name + " " + version; private static final String miniLicense = "\n" + " netx - an open-source JNLP client.\n" + " Copyright (C) 2001-2003 Jon A. Maxwell (JAM)\n" + "\n" + " // This library is free software; you can redistribute it and/or\n" + " modify it under the terms of the GNU Lesser General Public\n" + " License as published by the Free Software Foundation; either\n" + " version 2.1 of the License, or (at your option) any later version.\n" + "\n" + " This library is distributed in the hope that it will be useful,\n" + " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" + " Lesser General Public License for more details.\n" + "\n" + " You should have received a copy of the GNU Lesser General Public\n" + " License along with this library; if not, write to the Free Software\n" + " Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n" + "\n"; private static OptionParser optionParser; public static OptionParser getOptionParser() { return optionParser; } /** * Launch the JNLP file specified by the command-line arguments. * * @param argsIn launching arguments */ public static void main(String[] argsIn) throws UnevenParameterException { // setup Swing EDT tracing: SwingUtils.setup(); optionParser = new OptionParser(argsIn, OptionsDefinitions.getJavaWsOptions()); if (optionParser.hasOption(OptionsDefinitions.OPTIONS.VERBOSE)) { JNLPRuntime.setDebug(true); } if (AppContext.getAppContext() == null) { SunToolkit.createNewAppContext(); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS)) { JNLPRuntime.setHeadless(true); } DeploymentConfiguration.move14AndOlderFilesTo15StructureCatched(); if (optionParser.hasOption(OptionsDefinitions.OPTIONS.VIEWER)) { try { CertificateViewer.main(null); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } finally { //no matter what happens, terminate return; } } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.VERSION)) { OutputController.getLogger().printOutLn(nameAndVersion); JNLPRuntime.exit(0); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.LICENSE)) { OutputController.getLogger().printOutLn(miniLicense); JNLPRuntime.exit(0); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP1)) { handleMessage(); JNLPRuntime.exit(0); } List properties = optionParser.getParams(OptionsDefinitions.OPTIONS.PROPERTY); if (properties != null) { for (String prop : properties) { try { PropertyDesc propDesc = PropertyDesc.fromString(prop); JNLPRuntime.getConfiguration().setProperty(propDesc.getKey(), propDesc.getValue()); } catch (LaunchException ex) { OutputController.getLogger().log(ex); } } } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.ABOUT)) { handleAbout(); if (JNLPRuntime.isHeadless()) { JNLPRuntime.exit(0); } else { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { OutputController.getLogger().log("Unable to set system look and feel"); } OutputController.getLogger().printOutLn(R("BLaunchAbout")); AboutDialog.display(TextsProvider.JAVAWS); return; } } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.UPDATE)) { int value = Integer.parseInt(optionParser.getParam(OptionsDefinitions.OPTIONS.UPDATE)); JNLPRuntime.setDefaultUpdatePolicy(new UpdatePolicy(value * 1000l)); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.NOUPDATE)) { JNLPRuntime.setDefaultUpdatePolicy(UpdatePolicy.NEVER); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.NOFORK)) { JNLPRuntime.setForksAllowed(false); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.TRUSTALL)) { JNLPRuntime.setTrustAll(true); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HTML)) { JNLPRuntime.setHtml(true); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.TRUSTNONE)) { JNLPRuntime.setTrustNone(true); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.NOHEADERS)) { JNLPRuntime.setIgnoreHeaders(true); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.REDIRECT)) { JNLPRuntime.setAllowRedirect(true); } //if it is browser go by ots own, otherwise procedd with normal ITW logic if (optionParser.hasOption(OptionsDefinitions.OPTIONS.BROWSER)) { String url = optionParser.getParam(OptionsDefinitions.OPTIONS.BROWSER); LinkingBrowser.showStandAloneWindow(url, false); } else { JNLPRuntime.setInitialArgments(Arrays.asList(argsIn)); AccessController.doPrivileged(new Boot()); } } private static void handleMessage() { final TextsProvider helpMessagesProvider = new JavaWsTextsProvider("utf-8", new PlainTextFormatter(), true, true); String helpMessage = "\n"; if (JNLPRuntime.isDebug()) { helpMessage += helpMessagesProvider.writeToString(); } else { helpMessage = helpMessage + helpMessagesProvider.prepare().getSynopsis() + helpMessagesProvider.getFormatter().getNewLine() + helpMessagesProvider.prepare().getOptions() + helpMessagesProvider.getFormatter().getNewLine(); } OutputController.getLogger().printOut(helpMessage); } private static void handleAbout() { final TextsProvider aboutMessagesProvider = new IcedTeaWebTextsProvider("utf-8", new PlainTextFormatter(), false, true); String itwInfoMessage = "" + nameAndVersion + "\n\n"; if (JNLPRuntime.isDebug()) { itwInfoMessage += aboutMessagesProvider.writeToString(); } else { itwInfoMessage = itwInfoMessage + aboutMessagesProvider.prepare().getIntroduction(); } OutputController.getLogger().printOut(itwInfoMessage); } static String fixJnlpProtocol(String param) { //remove jnlp: for case like jnlp:https://some.app/file.jnlp if (param.matches("^jnlp[s]?:.*://.*")) { param = param.replaceFirst("^jnlp[s]?:", ""); } //transalte jnlp://some.app/file.jnlp to http/https return param.replaceFirst("^jnlp:", "http:").replaceFirst("^jnlps:", "https:"); } /** * The privileged part (jdk1.3 compatibility). */ @Override public Void run() { Map> extra = new HashMap<>(); if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HTML)) { boolean run = new HtmlBoot(optionParser).run(extra); if (!run) { return null; } } else { boolean run = new JnlpBoot(optionParser).run(extra); if (!run) { return null; } } return null; } static void fatalError(String message) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "netx: " + message); JNLPRuntime.exit(1); } /** * Returns the url of file to open; does not return if no file was * specified, or if the file location was invalid. */ static URL getFileLocation() { String location = null; try { location = getMainFile(); } catch (InvalidArgumentException e) { OutputController.getLogger().log(e); fatalError("Invalid argument: " + e); } if (location == null) { handleMessage(); JNLPRuntime.exit(1); } OutputController.getLogger().log(R("BFileLoc") + ": " + location); URL url = null; try { if (new File(location).exists()) // TODO: Should be toURI().toURL() { url = new File(location).toURL(); // Why use file.getCanonicalFile? } else if (ServiceUtil.getBasicService() != null) { OutputController.getLogger().log("Warning, null basicService"); url = new URL(ServiceUtil.getBasicService().getCodeBase(), location); } else { url = new URL(location); } } catch (Exception e) { OutputController.getLogger().log(e); fatalError("Invalid jnlp file " + location); } return url; } /** * Gets the JNLP file from the command line arguments, or exits upon error. */ private static String getMainFile() throws InvalidArgumentException { if (optionParser.getMainArgs().size() > 1 || (optionParser.mainArgExists() && optionParser.hasOption(OptionsDefinitions.OPTIONS.JNLP)) || (optionParser.mainArgExists() && optionParser.hasOption(OptionsDefinitions.OPTIONS.HTML)) || (optionParser.hasOption(OptionsDefinitions.OPTIONS.JNLP) && optionParser.hasOption(OptionsDefinitions.OPTIONS.HTML))) { throw new InvalidArgumentException(optionParser.getMainArgs().toString()); } else if (optionParser.hasOption(OptionsDefinitions.OPTIONS.JNLP)) { return fixJnlpProtocol(optionParser.getParam(OptionsDefinitions.OPTIONS.JNLP)); } else if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HTML)) { return optionParser.getParam(OptionsDefinitions.OPTIONS.HTML); } else if (optionParser.mainArgExists()) { return fixJnlpProtocol(optionParser.getMainArg()); } handleMessage(); JNLPRuntime.exit(0); return null; } static ParserSettings init(Map> extra) { JNLPRuntime.setSecurityEnabled(!optionParser.hasOption(OptionsDefinitions.OPTIONS.NOSEC)); JNLPRuntime.setOfflineForced(optionParser.hasOption(OptionsDefinitions.OPTIONS.OFFLINE)); JNLPRuntime.initialize(true); if (optionParser.hasOption(OptionsDefinitions.OPTIONS.LISTCACHEIDS)) { List optionArgs = optionParser.getMainArgs(); if (optionArgs.size() > 0) { //clear one app CacheUtil.listCacheIds(optionArgs.get(0), true, true); } else { // clear all cache CacheUtil.listCacheIds(".*", true, true); } return null; } /* * FIXME * This should have been done with the rest of the argument parsing * code. But we need to know what the cache and base directories are, * and baseDir is initialized here */ if (optionParser.hasOption(OptionsDefinitions.OPTIONS.CLEARCACHE)) { List optionArgs = optionParser.getMainArgs(); if (optionArgs.size() > 0) { //clear one app CacheUtil.clearCache(optionArgs.get(0), true, true); } else { // clear all cache CacheUtil.clearCache(); } return null; } extra.put("arguments", optionParser.getParams(OptionsDefinitions.OPTIONS.ARG)); extra.put("parameters", optionParser.getParams(OptionsDefinitions.OPTIONS.PARAM)); extra.put("properties", optionParser.getParams(OptionsDefinitions.OPTIONS.PROPERTY)); return ParserSettings.setGlobalParserSettingsFromOptionParser(optionParser); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/ManageJnlpResources.java0000644000000000000000000000013213441742745026512 xustar0030 mtime=1552401893.039832823 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/ManageJnlpResources.java0000644000175000002070000001420313441742745027322 0ustar00jvanekmock00000000000000/* ManageJnlpResources.java Copyright (C) 2012, Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.runtime; import java.net.URL; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.ResourcesDesc; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.runtime.JNLPClassLoader.DownloadAction; public class ManageJnlpResources { /** * Returns jars from the JNLP file with the part name provided. * @param rootClassLoader Root JNLPClassLoader of the application. * @param ref Path of the launch or extension JNLP File containing the * resource. If null, main JNLP's file location will be used instead. * @param part The name of the part. * @param version version of jar * @return jars found. */ public static JARDesc[] findJars(final JNLPClassLoader rootClassLoader, final URL ref, final String part, final Version version) { JNLPClassLoader foundLoader = LocateJnlpClassLoader.getLoaderByJnlpFile(rootClassLoader, ref); if (foundLoader != null) { List foundJars = new ArrayList<>(); ResourcesDesc resources = foundLoader.getJNLPFile().getResources(); for (JARDesc eachJar : resources.getJARs(part)) { if (version == null || version.equals(eachJar.getVersion())) foundJars.add(eachJar); } return foundJars.toArray(new JARDesc[foundJars.size()]); } return new JARDesc[] {}; } /** * Removes jars from cache. * @param classLoader JNLPClassLoader of the application that is associated to the resource. * @param ref Path of the launch or extension JNLP File containing the * resource. If null, main JNLP's file location will be used instead. * @param jars Jars marked for removal. */ public static void removeCachedJars(final JNLPClassLoader classLoader, final URL ref, final JARDesc[] jars) { JNLPClassLoader foundLoader = LocateJnlpClassLoader.getLoaderByJnlpFile(classLoader, ref); if (foundLoader != null) foundLoader.removeJars(jars); } /** * Downloads jars identified by part name. * @param classLoader JNLPClassLoader of the application that is associated to the resource. * @param ref Path of the launch or extension JNLP File containing the * resource. If null, main JNLP's file location will be used instead. * @param part The name of the path. * @param version version of jar to be downlaoded */ public static void downloadJars(final JNLPClassLoader classLoader, final URL ref, final String part, final Version version) { JNLPClassLoader foundLoader = LocateJnlpClassLoader.getLoaderByJnlpFile(classLoader, ref); if (foundLoader != null) foundLoader.initializeNewJarDownload(ref, part, version); } /** * Downloads and initializes resources which are not mentioned in the jnlp file. * Used by DownloadService. * @param rootClassLoader Root JNLPClassLoader of the application. * @param ref Path to the resource. * @param version The version of resource. If null, no version is specified. */ public static void loadExternalResouceToCache(final JNLPClassLoader rootClassLoader, final URL ref, final String version) { rootClassLoader.manageExternalJars(ref, version, DownloadAction.DOWNLOAD_TO_CACHE); } /** * Removes resource which are not mentioned in the jnlp file. * Used by DownloadService. * @param rootClassLoader Root JNLPClassLoader of the application. * @param ref Path to the resource. * @param version The version of resource. If null, no version is specified. */ public static void removeExternalCachedResource(final JNLPClassLoader rootClassLoader, final URL ref, final String version) { rootClassLoader.manageExternalJars(ref, version, DownloadAction.REMOVE_FROM_CACHE); } /** * Returns {@code true} if the resource (not mentioned in the jnlp file) is cached, otherwise {@code false} * Used by DownloadService. * @param rootClassLoader Root {@link JNLPClassLoader} of the application. * @param ref Path to the resource. * @param version The version of resource. If {@code null}, no version is specified. * @return {@code true} if the external resource is cached, otherwise {@code false} */ public static boolean isExternalResourceCached(final JNLPClassLoader rootClassLoader, final URL ref, final String version) { return rootClassLoader.manageExternalJars(ref, version, DownloadAction.CHECK_CACHE); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/PaxHeaders.7406/HtmlBoot.java0000644000000000000000000000013213441742745024333 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/runtime/HtmlBoot.java0000644000175000002070000001733713441742745025156 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception */ package net.sourceforge.jnlp.runtime; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.util.List; import java.util.Map; import javax.swing.JFrame; import net.sourceforge.jnlp.JNLPSplashScreen; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.ParserSettings; import net.sourceforge.jnlp.PluginBridge; import net.sourceforge.jnlp.runtime.html.AppletExtractor; import net.sourceforge.jnlp.runtime.html.AppletParser; import net.sourceforge.jnlp.runtime.html.AppletsFilter; import net.sourceforge.jnlp.util.ScreenFinder; import net.sourceforge.jnlp.util.logging.OutputController; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.util.optionparser.OptionParser; import net.sourceforge.swing.SwingUtils; public final class HtmlBoot { private final OptionParser optionParser; public HtmlBoot(OptionParser optionParser) { this.optionParser = optionParser; } private JFrame invokePluginMain(PluginBridge pb, URL html) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { Class c = Class.forName("sun.applet.PluginMain"); Method m = c.getMethod("javawsHtmlMain", PluginBridge.class, URL.class); return (JFrame) m.invoke(null, pb, html); } private static void changeMovement(int[] move) { if (move[0] > 0) { if (move[0] % 2 == 0) { move[1] += 100; } else { move[2] += 100; } } } private Point changeMovementSigns(int[] move) { int x = move[1]; int y = move[2]; switch (move[0] % 4) { case 0: x = -x; y = y; break; case 1: x = x; y = y; break; case 2: x = x; y = -y; break; case 3: x = -x; y = -y; break; } return new Point(x, y); } private JNLPSplashScreen splashScreen; boolean run(Map> extra) { if (!optionParser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS)) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { splashScreen = new JNLPSplashScreen(null, null); splashScreen.setSplashImageURL(null); splashScreen.setVisible(true); } ; } ); } List vars = optionParser.getParams(OptionsDefinitions.OPTIONS.HTML); JNLPRuntime.setForksAllowed(false);//needed? ParserSettings settings = Boot.init(extra); if (settings == null) { return false; } try { OutputController.getLogger().log("Proceeding with html"); final URL html = Boot.getFileLocation(); AppletExtractor axe = new AppletExtractor(html, settings); AppletsFilter filtered = new AppletsFilter(axe.findAppletsOnPage(), html, vars.subList(1, vars.size())); List applets = filtered.getApplets(); // this hack was needed in early phases of the patch. Now it sees to be not neede. Keeping inside to remove after much more testing // will be replaced by regular JNLPRuntime is initialised // System.setSecurityManager(new SecurityManager() { // // @Override // public void checkPermission(Permission perm) { // // // } // // }); final int[] move = new int[]{0, 0, 0}; for (AppletParser appletParser : applets) { //place the applets correctly over screen changeMovement(move); final PluginBridge pb = appletParser.toPluginBridge(); if (splashScreen != null) { splashScreen.setFile(pb); } final JFrame f = invokePluginMain(pb, html); //close all applets in time f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); SwingUtils.invokeLater(new Runnable() { @Override public void run() { Point movement = changeMovementSigns(move); f.pack(); ScreenFinder.centerWindowsToCurrentScreen(f); Rectangle r = f.getBounds(); r.x += movement.x; r.y += movement.y; f.setBounds(r); f.setVisible(true); } }); move[0]++; } if (splashScreen != null) { splashScreen.stopAnimation(); splashScreen.setVisible(false); splashScreen.dispose(); } } catch (final Exception ex) { OutputController.getLogger().log(ex); if (splashScreen != null) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { splashScreen.setErrorSplash(ex); splashScreen.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); splashScreen.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { Boot.fatalError(R("RUnexpected", ex.toString(), ex.getStackTrace()[0])); } }); } }); } else { Boot.fatalError(R("RUnexpected", ex.toString(), ex.getStackTrace()[0])); } } return true; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/resources0000644000000000000000000000013113441742745022211 xustar0030 mtime=1552401893.055832789 29 atime=1552410887.11418344 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/0000755000175000002070000000000013441742745023077 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/install.png0000644000000000000000000000013213441742745024443 xustar0030 mtime=1552401893.055832789 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/install.png0000644000175000002070000000442413441742745025257 0ustar00jvanekmock00000000000000‰PNG  IHDRw4q{xˆ pHYs  d_‘ЦIDATxкэыqл:…зž”ѕЇЄњжЄЈ8uаюCїGШоХ›Є(ŸoF3‰,тEр`Бx€xЪќ]бKтязСщ1™П_ёЪ ‰ˆ<н ?Ж3>]пМФЉ№Њ  W!ВсЧ7Š­nŒoy э*ЖЕя:у4xm№•СП/a] ў'} hYтЮsрЌ„ѓqяDєї„щ~ћNZ5wZвЕЕъˆѓLn-ф#pFQїB{Мїњьш›Лxэ_ыž9г„Њ%И•Рc щМЎвXc\dpйяђ{,ъ№3mаЉœEдMABмСYGі>бnя­jFиcбwшЅы?5…62Ќ#;Цв‘Фœ“ЈЛžјхбjљЗŒ=›А–уeб.ъ(L$ЦЁ•ZБg„бПтUQЖŒeЏ˜t„щ GsVИМмщ™ƒ4ФqЮ хгмSя!№gЗtMe™AмСYp‰К;яУЎб}чшѓ*<ЧФ1ъŒЂєм)єZЬЧёrЦ0 щО1-Хщ ЫЇћ…nНTвT UcYAмСYХнfFљœш{СŠХЭDbfž‹\"чіsbтАLЧх„2’:–xD`™ŽбGсфЪч ?2/єm X*9bщ !ўX…uYTm§nL‹M”я;§'t$/A^R„KдЎ‰АŒ№ь•ЮГФ ь?J]ыЇTGтvўgЉS*j3ПщѓRlЧhGжп%ЌkЁF§З„1Пь{Z4рЅ?n7ЏBЛЄТ2И.aќкј-ЪзЯ[П\љtћйFY№КбroEWZж.‘ЦP§хУYіœАЅмK‡Ÿ]€-лHЮеж%Уќ>ЖŽM№Q•ж2gDЙ(/^Јыœ•ЮХQ“–œы(З,г–Ястžбто+Рв„…кXдУ2в4Жc­uЙyш`\с$ІD_ї‰љН$€ЙЄDмЅ1q^Да^гFŠЛ4!ŠwIљT‹уmGїХнаv# ГЃИЛФ}ЂёЋРcSЛЮн0ѕЯZЧ>а#дWMeЫЏ “/Єл3щрц чЬш#•n[Ё'ЅхгФжЖZЧ%Щ‘#}ИлсMKlє‰ŸрёЈйЁjЈЮpp‰:h…њ\jŒи wЅЇќсˆœkЩ3щГTЖ#жФщjкшSЁИп O…ТžГ6п‰шз2yБNю”LNЎ“Сz™ьиšK№R_6(?'ф{єСA %ђЙ3ZьRV~-эш’x& їЪŒ.Qœсwм3”#u&NIўжпЌсЌaЧсЦm,uІЩЄ-U>wgЙз|FЙ‘tпЋж’mБц}ž ?ZˆЃgA”ŽRЃ€‹яd/шžХНDј|Ї8ЋЮчGЌDiѕУЯe…KPР(И•т^-юН„Ѕтlя@м{о–=q?‰И—К+ЄВŽъ­п#Х}дсnАЊ€И'п-ЕœЗїНжЇвБЗИЬ7ќь@м“B7кš,їН–&о›ИЪЛF5рБxю|>^јAџ– Ояœ=}ХяwіЏд~Ж -ЯтќŒЯп§ЄqkГя?w˜ІžrЦ=Ў`ЄqЎЯцжЅЧ#§—ЬsвГ=їЃ†q~›6б3 7rыќmЧxZђ{”[f"LЄ‚урмАыEЙ… Ѕ;ВgAŒGдэ‰ЩУzD тВєљ ѕЕ3 Еg:г‹S oЄ№ŽŠc‹ЕмGMЈŽ˜уРHаŠtІŠDSкNПўЭъ ОeŒлЉSB‹мЮэШŽŒЇіlˆ­ЌЫоƒјUмG;36/1Ѓ{—iїq]уЌ^Gm )ЄУПJ4ЩVњL_w‘K!ЭЂЇЉ(Оч^ўњwЎФVдNо‹ЅЊ:_јы t\ЈoRŽЁЎqї~l/'ю+ыЅЋ–ќŒ~{ТWбhУEmлвз[Ј(rѕЬСщщыafм%"C.ѕЮYЃsCx=n„RыaЄеЌI>`Ћзrї‰8sТ?'ЌЂжх‘pЯ€‘–{ЩШŸЋ{Н–ћœicІРБ@XsQˆc\Fs4J0$Ÿ)]UШCьЈгЧoЉџМ—_йqoёэO™tЦљзƒХ=О$>‹CUКЙtЇЫюА•ИчvwOђ9эЙчZђ(]Ђa™яRwЄо7™NЌ‹ЙS G |ЮТnѕ7‡зVйDEtˆ{э96ЊтЗ3aЗ*яJ\W’Ј qЯмGˆ;wГRщsКAмЅяKtŒЫЃйCмUЅ%lvˆЃd”Аѕ’HWQЖŠЏц4Ч‰њGHƒ­ї”aW*юŠ>_CзЊC%Ѓж’,'юžјЃМ7їgЁWѓ•хЈоЙџAџ&YGnxЅmwц&G_рёЦˆ5ЗaщJc'ЄЬRŽД D\ЂЋDUBЛЏнХЎЂ6ј:Р5ёЪфы=аВлђ›—ЮvЋ–џ_Љ~cUЊMђІЂјїЙuєНК3 #р5žIAЇюŽu‚kUš8MщJѕj™Ѓv;ša›„}ЄkhІђ{eЙŽев>;ƒСїC‘М‹д$ Ykh]Qw}B№jС“vЈ†.+ФcёЇюDеBћmЯQњ~е"zЎqыЦ›aиН97џzоvtR#;LА‚’іj‚ЊƒпЈD;е•qЊhT›‹Ѓ&/ІряZј^%žSLОу№rљб™ђ.EOћЙdИТшnхzцAыэЈj'3Йй§šЪюиА4€%>,ч&ј‘І @к­Еe~жх]zp>&Ц_XS~ы08Е~-1,Ї›Ѕœn–узУР=џvЈС“БGb1m'rЮŠ*§СЫУ›њc5‰U阢Гщ[M!яDЦ–ЗuѓЇћŸчŠmуП’Bћ'рP_oщюЦGN)JаЇ ,KЫ­…ЧБОВіѕWœ>YёrQHЉЩf)е(.V0ТŠkам\QPЉ9zи<д­8zщѓКА! AJZ0У VЙŠiЊЙS@kKАїУѓ5ЫкRРОЧіЗюиЊuЋ™ДT R)HЇч8…Q$БЪŒ ™ŒЫЖлЊŽулЗ+а TЎИц§7ЭГz&iœф Ь&ёі Ы˜д‚<™tзЭЮ`RПщ"…Д2§ƒзC†žJž0zNˆ~›к (жf!™gПЈр{bЏњ№0™џtцŸ7}{ƒИя‹sЗЫMбТГ"зˆLFђћЄ$SXX'э:zнj:№зsРЭх>‘ЏЮ)ЇЋ-gЖЭ<;Ж›?;3'sћ*6КШ l;/Я ув"ЛўЎjўјtD^в…€K†Eoл6ёД*„щЛЧ­юўWz^t№Љ’іmИе.%8Чeщ  ЕxDZWЦфхП1‘_\кЎVn=К*JМХ<чб/у’[Iјub‰їN,шZЅтоЇЛВ|c#я(oTFD{Ј№АW&сfA{ <й!‰Хр2wœЈeGРЧш—п1HреутЁx”ЖœлI№жуMЂNphПB<"VєтћuQоЕWЌlЈуї‰.Ÿ.ЬEжŠ% Ш7eц<§ЊлНчјіз?ШEAЯQ6(ђж{іИpQ~$Ні†Vљ Z+9Р џгЄПд3GCyЖ•IENDЎB`‚icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/hideDownloadDetails.png0000644000000000000000000000013213441742745026704 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/hideDownloadDetails.png0000644000175000002070000000153613441742745027521 0ustar00jvanekmock00000000000000‰PNG  IHDR‰ bKGDџдATђ pHYs  šœtIMEн $gлфЬыIDAT8Ы…“OHT{Ч?їЯмjЇЉЙ3ѓдДmBIW њьЁgТ]ДSAˆYДDlсFZД[DZ1„+[%С{-TˆBFZA+/уи&sgN #f3г~ќЮЙПs?œѓ;ч‡ˆPiЖišKІiNоjБџT5M›I$‹ХФыѕоNNƒA­*8eYжН‘‘ЩхrХx<.РMРR1g}>пЋšššПИ<№išvgxxXіііЄЄ­­-щюю`hёzНOЧЦЦЄЗЗW€П(Љ №aПфѓy9Њ ‰Хb,Ž‹ˆШшшЈx<žk€`ђЋB~Пгќѕ( 133C:ў3•JЕйlжмr€ЩdR\з•пizzZoЧЪ–Ќ !]зЅR)) Usssвммќ8QИКК PgFzrrВь}–ДДД$­­­/_E ыКьюю\оЮЯЯWЎЌЌH{{ћрdЅІ`Іiz€kCCC—:;;Љ$лЖбu=еюаnєѕѕ777л˜ŽŽАЬййYvvv‡УX–…aСH$r?™Lтїћ‹Й\Nзuвв4эР^[[c{{лt3ŸЯуК.…BbБˆЎыX–•Эd2зюЂбhC[[›]WWg655 ‡Уджж055…у8ƒРfХ’Uйx<ž а \Ў'‰7]]]ЫѕѕѕЫРђФФФGЙ`л6ЈчтўrŠU3е|Ю_ейqр АЧЧa}}ЧqXXX ЇЇ HР; xx€Ы€WA>џ ЃрkРyрЕˆ<+UЄЉvїїЋm№нк?њчнЁщˆВWсVngž<gp№ч1в@^хџ„€Ќђџ;фŸVпЮЈlž‹Аx8|№lіе |VvУЁПЈ§[)SœЃƒўщЅq|Еwт6IENDЎB`‚icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/jamIcon.jpg0000644000000000000000000000013213441742745024351 xustar0030 mtime=1552401893.030832841 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/jamIcon.jpg0000644000175000002070000002452413441742745025170 0ustar00jvanekmock00000000000000џиџрJFIFhhџлC  !"$"$џР ЉЏџФ џФЕ}!1AQa"q2‘Ё#BБСRб№$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™šЂЃЄЅІЇЈЉЊВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийкстуфхцчшщъёђѓєѕіїјљњџк?ћ.ŠЪ›Yв жэt)uHЕKЈ^X- €M"'Тg;VёŽЛЇј_УЗzцЄe6жШЃођЛОФŽ0:ШюъƒнЧ#­X№эоЇ{Ёйоk:Qв5 ЁqbnVГIн7Їѕ­EQEQE7Е:Š(ІeЗ}кŠYb‚3$’,j nih№ њšБEyР›ˆќAсЙќoЈJ“kzХЬ‹xŽ 6œЬiЇєR0ШzШђЩџ-)пnЄ—тїУнъf]дзїz\][DHOPђЮЃћёFF ^™EQEчџў(x'сЭ”гx[Š;ЁјєыyKйsгd9щїлŽ5ѓЏ‹Пl›їimќ'рј-CwЊ\or0:См=ыH§Аў л5-УзъП|ЄrC#~f+щќ9ёWL’;HзEж`›JšхM˜џYy#Чёlы4QEUyeŠЬ’:ЦЊцwк0x§MXЂМзФ~ПЗеG‰~jёxX’уэДŠMŽВI ЪG#3pˆdСявВnГёcТLі]јCЧП ‰6йgбя“я†иq,!uЯм’9йкЖ|ёЮѓY—Т^&<9тј$)і ŸпзйЛ…ѓуlлЧ ŒŸGЂ™ЙЧдœg5ѓЧХкПС^дЎ4}OКё5єD5­м)fr9й0/И@†Ић?лABo~OЊ6ЩfЗж|жCє0/ѓЉў%~ж:mї†ŸMјyЃыАј‚їCqw іR§ Іїѓ$іЦ=ыфmvџUМеЏeжnЏ/5_§&[Й<љууї’I^“№zЫJж4“mР­_ЧкšNъ+Ќ]Cmъ‘”<ИЦ;Hџt>$јEт›'SЛ?.є8ьI/6ŸЎ<’lў2‘Я$žgЩџ<§+#тŒ_ tИ4Яќёў‰Ј" “E§њ^@ФŸо ђqнфчЈєЏ_ј1ћXУqІё.нХЫ:ФКнЊ'’z|ѓ 8Nџ:uЯњБŠњЏHд,um:-KLНЗПВИ|7Г,АИщ”uъ=ъ§QUх–(#2HыЈ™пhСрѕ5bŠ+ЩО#кЏ…ў+јOЧжЯ4vњЅвxw]Ž$2,БЬьr7hі\l]уїИЎгЧ~№џД 4щціЩнe$t1К}зWLažеЬќ/зЕдёˆМт‹†КдєŠkKїгf/фHЧeиRGEиdцН.О:§ЊО$j.ё•зТ jњ~ŸсћtнЏjRё™#;нС81„Ш|Кф,4OЮБјMбo–]qу{=l‹UЛђіь—Tž@џdŒ(2G Ÿ$ЈsžЙCс{Су}CСыёCсцeqМО5й>Ч G,‘‹]Я“$‘Žq/ S5o…?~hўј›і]­k:]IˆЩ62$лMыƒg§і}+'сW‡тЗЦ)NВbАг.'Йж5Щ!S VіЪwMЗўyŒ‘§ДЏFёŸ<;ЄxCJё& g\[ЉС:<­КXЉк—s@й u>|п2c&L‘И8јWŒќYт_\Awт}rїXžіE%йЛJПу-[С7Пй‹сЏмi[й<в\j2KіЫ,тcЩђ№џ>ЯаWД|V№†ƒунsТВј[Со?АИК–ЫMе5Йќ2№iї1‘‹М'ќДфzмc5с%Ч‰ПgŸŽ рŸ\лУснmеgЛd fуgюn#wиcАŽOџw_mŒmљihЂЋЫ,PFd‘ж5P73ОбƒР'ъjХWўбgќ*й|ЌyŸл:>пїПДэkб+Ю|Im2ўа^ КЖERt a.пЛDВXэƒИќы ј•ЌмјwсЗ‰Ећ!Кг4‹ЛЫ`ыЙ<ШЁwLћe|oрэќ)ћ0OЎhХ­xЫЦž Жг­@ˆNmчŽM№ЉЪdя$~•чŸД ЕПƒЎ‘Ў|ciў“т EІ’MЏ,{жAТya7y2AЎџі]ј!Ф:ї‹t†ƒТБ Zкh.|™ЏчˆЮ:Уя>xќПœїЧёoћ)ќ*‡R‘е|@tйГ?ДпьУшBљŸљО`јё№k_ј]ЏъWZlZМоqъВШ›^!CsaсИ-fЛƒMВѓ˜мЭцf+]џf УШјЬc2c5Шј‹T:ŽЌїP@,-Ѓ•ХЌR;Ѕ”;ф‘R=џМ§йеuд5eћBо\§ БЌЏЩїЏrјїvзП єK јŠчФў+ГћSdš†‹{™KРяБЫpФ~ѓЬџT}‰їиЛтvтŸйx*ђщЧˆДcŽHБчYЧ X\qќбИяž>ˆЂŠЏ,БA’GXе@мЮћFŸЉЋQ^OуiХŸќ3р›HRk?ЭПЎIЪ™UўУ‘ќfPdи‚>sањ”ЏhвHШŠ‹–,>ъзšќ,‚oј›UјЋ{ŠпS‚;DWcІ™—ѓ›8џ_!ѓ?ы˜‹оНUг­5&їKд YьЏ`{{˜O!уu(щљWУ ЏДЯƒџЕќEж.р№я‡Е u;+x ,зІДЧd{љЗ“д~ѓЫ>Еч:G†|Gё3Ц‰g>›wЈј“Ф$vї7[dуэI"GЪ@‘x9џžyЏв­2ЪлOвьєћHт‚кж†(ЃћБЦ‰ДєРРЋѕGRгьЕ=6ыMПЖŽцвъ И‰љI#ш}ˆЭyЏћ0ќНГИ† Эa,‘ікЦј=зЬwL§Pз#спиыРжvЉ§Лт-{Sœœ[эЁ+шkШ?ясЈў$~ШОдєИЄ№%фњ&ЃуВіif†ря“ѓЏд~UђfГЁj>ЕзєgТШ—к}хНЭђHџшO‰?wћЙ<Й ž_ўBЏC§•<%gёTж|sЖвжьE{Ј\ЃШ—2YBпёю„ƒїяo&GќѓяХ^я~ ќ|ВдМ Ќ]ј—EГэѕ(ˆ24EŽйЁіЄoбdпœqƒяї~‹Љйkz-†ЏЇ8–Ъўо+ЋgЦ7ЦщНхƒZ4UyeŠЬ’:ЦЊцwк0x§MXЂЙЯˆ ‹То дѕљa7Fж,Сl ЬЮvCїy{šЮјcснGCаgКзŒјXЙўбж&ˆž{cї(NIŽ rxŒzšцМnOќw'У YЇ‹Fгb†ћХ2л>ЧœIŸ"ФчЂHw#9Ž=ŸХЧЈ[лХI $q"т8уbЊџwfО §Дєэ0ўбњЉа­ЎД›WНдж)$hBЯp<Э‘§їИњ ?dkуі›д_Eвѕ;6пУђмщыr’OБўЮžkс2 ŸігИЏЌў јяТОв"еќ]ЌGЅYЭ(†7hЄv‘ёа"+7JфєŸкроЂт;oля-ДyіW0џшШХw>ё>тН6MKУ:НЎЇgяlђCїЏ№gўЕПEёэЖmєЏ‹бCnз"Ы[в­n|CijЪІт8g‘Qљщ D1‡ьњW—ќ%ЎЛЊъП<hБ\xЖAjoЎfeОžŒfpvuOоuпўЌ Šњ’зіLјzўвєЋЫ§d_й,‚чPГ•!’ьЙў5tqЕ0<Мtѕ=kмќ-ЄкшвМ=hђ=Ў™e œ-!Ы2GСЛ>ЫZєUyeŠЬ’:ЦЊцwк0x§MXЂМВЪиxЧуNЋЈjeŸI№[УgІ[4›т{љ!YІЙuЧпHхŽ4$№LОЕНёCФWš… P]ј—VИK-жcђЩ9ћЮћA;!]ѓ?ВFjЧУ_ Zx3У+Ѓ[нMЈ\ДЏs}Ј]gОКsћЩф>Ї\&С“ŠыkœёзŠєxjяФ>%ПŠЦТпяHFчgўEч{ž1OЫѓџу‡Х[_‰Ÿ,4x‚M. Ќ?Аь­-,Z8e‰%BYнB›:uЯќѓЏЃnД2ыRДдntл;‹л=џfИ’нZX7§џ-њІ{уЎ+‚ёoС…ў&Мдѕ GТ–iЈлМS]лЇ•"Бџ–Ш1АKЮ|ЬgыЭi|јeЂќ,№эюƒ jЅэ­нѓп;ъFюВ6"qћБХwДQ_žпЕяŠVчуŸ‰`бžмA§™|ё‘ ˜#G#Џђб$Т{yuєgьa№ў ќ,‡Фv’C­x€›‰ŒБЦ;pј‚>;:mЌБ^ћEUy%ŠЬ’:ЦЊцwк0x§MXЂМУСGMјууя Я$(u$Вё ‚љх‰р[I›шЏnŸї№TzЉўж§Їt{)рVЗ№п…чд­ЮьДнЯф~‘Х џЖ•ъtWЭџ№PV˜|в|ЌљG_‹~:џЧНЦпзёПс…e§™є‹Ÿhъжqii=…ЄQЭw,І6;їЩПЮ л.‘“вНїсЧ†,|р#Ті ‚пMЕ[}ы—ц8ћђ`wwочнытgУtёді’Kу_xx[DёљІ-Ђч;6чпќkШ|№‡і€б5KJытьѓЩdћЌmo.ЎЏ­uЛ2М€ЦВ2yЏЃДoэьлqЊ-ВпљIіЅЖ/хyИљіoчfzwЧНyпэ…$№ Iуkог$ЛH]!м=мŽŽDоHЮ[їxчgЕxoƒЁј7w4eПэ#ё;OМHЬmцjгiАЎЮй–ˆ1лyЏЇ>ј~/xb;МOЎјšнхiсПеяVюfGЧЫцЈљ“ИњзцяŽЌќGЅ|OезФКK6Й зwЖ“Ёž6%ќЯŸf<ШмŸћї_ ŸГчФј‘№взФ2[[Z^Чq%ЅхЕЎL0H„m O№˜Ьn?пЏHЂŠ*Мq‘•€ЦGкИЏу‘V(Џ-јгk&Јјoт5Ђ*ќЧЌШДЉЦЫ‚јхж?нЫп§Y5WЧ3[ј?уЧ‡|cЉLmДmcFŸBМЛ‘ж8-fI’{f‘ЯќєЬЈ+з(Џ §Йl>й№ъљёдЌю?9ћRГМ9ЏЏ‰О ќГ•ZћZгэюw'ћ=%‘ёџmmѓЏЁшЂŠЬеt­;Q6яЈiЖЗцвeКЖћD '“2gd‰ПюШ3УѕЎ+Pј+№ГQёEпˆ/ќЇ\ъ7Žђм4Ёо)ЯЮцо^ђNKьЯ=kCс›сџ†ч№фZНЦЅЇХ4њZOУclјлlI“iоwžNў•цџ uзEјЃё“^гlneMfў;{ЃžЪк(р†нЯё˜ЖяЙњU/иNМГј-}sCЁ­Э=Јьш‘EйєxфOј}EUyeŠЬ’:ЦЊцwк0x§MXЂЈj–6Ж™uІъёнY]Тіз?)$n6:b2+ШdЕ>втјwёL›Хе. žŸ­Hal’:љїУ!W(‘м9>Y§йЎЃіyšўo„z\:–Ѓ.Ѓqes{cіЩ[sЬ–їsРŽр­z-s~9№О‰у_ _xk^Жk:љBJFGu`F*рл }+тЏ…кОПр_~јSт­eЁјОF‰Ь{<б˜#и?чœžlrлJћцИŸŒ>/Л№/УЭWХ–К$šигB<–Љ?”Ц=с]їlИ2§:вЃјeё+У~<№о›Јiњ–˜/юэтm2+єškf#;xќptЎъŠ+’јЇт§?Р~еќ]ЉЈhь-їGяѕвџЫ8ѓъ_>ѕё€эМ_ёSУ^ј9рћЛЛ_ щр\x‡XФG%ЫЗœўo'>Y%C2DvЬqxgBвќ5 XјDГK-6Х<Ј!ROЏзulбE^Yb‚3$ŽБЊЙіŒ?SV(ЂŠђџ‡7кУщоё—Œ<3ЇыP4внBкЌj<ЩцyЩfЧ?ы=ужН GдtэZТ=CJПЕд-%ЛЙЕ™eŽOЃ'ЏWЩŸЖ—…&№ПŠ|;ёЏGT2YпYХoх№ЯљАIŸј–~БзеvЗмлEqЭБЌˆ}UљbО7јћ(јŽчЧЗzЧ€ЕXщ3\ЅЭД2Эіn?…1ƒfўЅ_П№яэ{џЩ,ЗкŽ-ќ›{ˆ>иUА‚mщЬўџ™јг4Ÿ†о9§žЇт4WƒЦPВМ> гlm] 9“ЮIИѓЩыиф}YЄъ6šЖgЊщг,іЗЖщqjуЄ‘КяCљs_'|zдuŽПьОјFі;];DiЅОНlДfty0‡ўY“хЁучyщ_L|3№f‘р/iўб#+ojƒtЌ>yхЧЯ3ћЙќkЉЂŠ(ЊђЫ™$uT ЬяД`№ њšБEђџэу‰zя‰ќ_рFБXјwL†чWhэd’ђѕfŒ %№D‰к7§лт@9ЏŸџg_…чЦ^(}WYгэ №†^mZуPim (œ:ЧВшМЈkў ыК—Ф}ФgТvs\iіS’кk‹ ’ўіѕ#tкŸ'ШwР’Оi№‹uŸјОгХž0Х}k,’ dн ЄƒчGAШЫєХ}т­у§ж‡тјLEнЮ-vn;d…# ž‘Є‚MќЈьq_lœuьkЬ~-н|fАИ‚їс……ѕ[(с =†ІЎ“™7œК?˜‰Гf'Быž:џџТ; ёœš3jЭ“*iqIКz'яЩњёєЇxЫФКG„М5т-v№YщЖ Ї”ž@Ш ИюЬчhЩЧ№žЋ}Ўќd§Ѓќ-/‹t‰4ыM^k_БZВlлЅя–Tџ–›у2~ѓњ`Wш]QEUyeŠЬ’:ЦЊцwк0x§MXЂŠђкЇР—ž?јAІi6Ÿkж4љтПгэФˆЛнxџW#рqЮЪјџі}јЛЋ|-зќЙ„ђш;ЕўŸ1юwћžg™ўГїuш:фОјСЋjŸ№І~ъ'ХRƒSЛз5 ˜у6’йнРy9џž_нёЦu–­№ЏCё4кяХяjпќYgxсь,biДшІЮ2<ф„?єц<­WёЇŒЯэё_РгtЙД*'1Olв"…_ѕ“Мeщ„| Ÿу~—Ћќј§oтЯXкищб™l-З–гb%ЭГGž>Ÿ#оGŽGLќ)јчр?ˆF; йlѕГ/Ї]ТcpGоимЦыœєsаWЊŸЁЯ 5Ъ|Cёп„ўщQj~-езMЗ™™!оWЦv" $Ÿѓя_#ъ>?ГјщёЃJЖзІИ‡Сі7{Ќ<;пЖj3m;S Н7Мœ>ї#Œѓ фзOу}ab§ПМ7 ‚lVжХ”Ід %ЌЄьЧћззШCl!‚ЖжСЧЭSQEQUх–(#2HыЈ™пhСрѕ5bŠ)ЇgАѓŸЦџ~ЭoЌ ŸХІkšн•дw.™bГЭpЩРŠiQ|З\uŽGээ^Msу/‰_‘| №ЧУQxWТV­хЭŒžD1E щ<ЉБvrЧЫHЯџ[^у№іe№‚dћvЎŸ№”ъ&3oэSьбŒž›ЖЮягŒW;ћ;xGH№ЏЦЏŠna‡Ч-u)БЖТCo.šэН&ЖŒvс“Ÿ/ѕЏsјрпјыУ“xwФкr^YLлдr7ј“ЯПН|НтЯиТчэ '…Nw|гœзПiЗvz•„ж0][\GО)рHއћЎ:ек(ЂЋЫ,PFd‘ж5P73ОбƒР'ъjХQеЕ #NŸQдю ГБЕ‰ЅИИ™Т$h9$žеђ6БћE|Kёя‰Їа>јa Й#ьђЌk­›Ийџq ‡!ў>ебiО*xоЭ[тЏХV+[‰ЭЃлJeGcѓљЗќГ’Л?~ЬŸ |-{іЩt§CФ’ §вkG,qрtђблНžЦжвТв;++Xm-ЁM‘лУЂ"њ^? З^]ёвџс•Ї‡,lО&щ ­ чx4шL’ътIБЪBбЇЩ!эЪ~•ЮјSс6ЗЄhКuџ€ў$xлУ)$i2шктGml­ѓ˜<“Ы œp§ёZ~$ИјчсЭ*kіё'Тй­-“|їz••еŠъяч”пŠђ-#іјƒyЋЫ`/ОLcmЅхМЙБ…‡ГЮлsэ^ЏЃк|jёЇ†рЛ›Ч^№эНм~d2шd—ЬбžЫ3ЯГЁћш*ЭЏСOЋGЊјЧФО'ёЬбЖѓkЎп l•џйЖDџР#кНJвкоТЮKKxmэ AQEDD„U[Џ8ј№oсчу˜ъўБKЫ‰<Щu+8жоѓЏ˜‹—џцМcXјёскKЋ|ёцІЩН$mтD‡Ь8УdOp:вСёћтЯУ§B;O‹п d[B/lah|v<Ы!С>ZяєЏc№ЦЏ†~5[x4oиУЈЭГe…ѓ}šфЛŒ„Dѕўцёž3ЭzU^Yb‚3$ŽБЊЙіŒ?SV+хŸкЯФџŒќ]Ѓќ№<ВK{rEЦЎ!™ЃUSў­f#Ÿ-Pљ’IЬUя? М сЯјnпD№§„0ЌqFЗ&(в{Зy“:цIяя[кЕєZv‘yЉ\+4vP<ђў ‹МтМсЗ…ЃрйM<Та2\G8Œ_FѓЯгеЛк;DЙжцЅсoH№$чЩВё]Ь3}žyѓГЫ(#§пЬdїџЫ>}ЇјюЖў8ј…р†Я:ш:ЩКеuOБЫДнCИMъGШфœџР+ГёOТOы~Пб №w†ьLіГAo•ЎщЯЇk:UŽЇi!м`НЖIЂ?T~+ТО4ўЭоё Ћы~Ж‹Тњ§КyЖ№YDАл\Мcф]€Ї’фрy‰‚9'5Ю|јс­x[Y—Р?М§ђ‚ЯRд•ќЦШй;уqqФ|œWе A†Ш†Yb‚3$ŽБЊЙіŒ?SU|AЋXшКЁЎj2yvZ}ГнNищh\ŸШWЮПАўЌZx›тЏˆкKНk[КЉuqЫMŸьoи˜ѓякОœЈнA]Ў!ПŠМ{RјkdЁОјлХоМеЕАОyЌˆџFvЧ8щXО"ʼṓGŸФšПˆ­О%јvе3}o§š–жщ‘ћшЪo;љўbkš/ƒў9jЖщ?иќ+ё&ТлФ›ЪЖ[­˜—Э“trг1ŽEyЦПh|MјЯЁкjж)a­h6rЦёH‚)Џэ^UпгЬ“ќтКQё‹сюЛћ'Яс-ARл^I]2+gf{˜РђЇЩШ§мrћcАэ}рќёO‹ѓЇйEсїбЕ+‹ЈќПАЮіУgœђcaыїКyrWЊ|kв<ЖП№•јЧХз‡–ЮбуŽ]?\’ШЮƒ/БQyЧLdџ/txќKт/‡П ў,ЛЖЗ][GЉЫ+Я&4‰hbѕŸпѓфћј§ц{зЙЭ№­пЧ№—Ф_Žz‰Є‡PВа.lШ{Љ!GmЬўk•MЧЯзчіџ< р­sSјЅёkХv–Ж”uЭPи-Ьi,Q@’М’Oѓf2ф:э' NНЧ-ЌA}ь#рЭ>сѕu{§eБж9YYчŸЫЯ,ЦN;|щ^ћyт/_~в_4=nH4- D†И­ sЇrR8оGљарЋфuцЌjŸ4§Чо-аЕm,Zшžг Ле5У1ГЮЧХГяП™ЧЯкЇјYёЏТ?5вlЁеє]I [Zы%МЗpŸљiоў`уз№ЏQЏ2јї№УNјЅр‰є™жu[qцщWЏZ №ž3хО0рuш1ц_Б—Ф=VтпRјWтбuЙсђТлэl7­Д{ррЫ9§‡ЋЏЄЅ–(#2HыЈ™пhСрѕ5хЕўЎ4oйчФг „Rн$Љ–ц@ѓ ‘ќЬЎЇр‡ТŸ|+ ж9-ДиMР_љюу|ŸљоЛjŒр2Љb з5у^<јuёZјБ7‹|'ёќ#e§•  `{ЖšdiЯт˜“‡љШ9#Эd_ќ7јсты Д|Oв,tK”ђя-єM7tЗhGяЄdЫп“г?C^—т†ўё†Дяы^ГОгДШV->оmЊЈКaг…AСэTєOƒŸ 4}3ћ>Чся‡$Зъ~з`—оЯ$лмў5Б<m}iЈ[ј/Уpойћ%ТiPЌmћ›fSБгЕp_ЕŠМ7с…ђ7ˆє=ФъфGoЅjœ2’'ё‡D'ї‰ї ƒкЙйћТ_ >$јRЧФ7^š{НцKvбѕ-bъўлObЪC;уdˆ#?:vмЭz6№_сО™№ёМ <8ЗšЗMu,73<Žf+ЗЮWЮє*эљ6u#Нixkс_€ќ3Њмjњ6‚ЫЊмDбОЃsy=ЭвЎнИIІw’1ƒŒЁЋ’ёЯСЧ—рЮ™№ЗРКˆвt‘дІК•ЬГлnf›н#Ог‘NVОјяZј›р–ЖЗ№в|>№ф aІЅхТМqF‘ю6ђ‡ЫчŒ`ŸœšцяХŽ= ёеJwТ}#ТОj^ж\“љзG_$Y"щ?№Q#Д)jP;ЪЃž[NоЧёx‡ч_WЫ,PFd‘ж5P73ОбƒР'ъkцOј(ђ‡~аc‰ктїWkˆіv[Ш…?<~FОЁРэР’=iеЫјїСОёж…§тН ^ЯrЪ‘Ш]_ћШшwЇqСЬщžј‡сK—Oјтл[ауUŽпGёЉѓœ^Ц|Цыџ-OыZџ№xюЫўB?ц0ЙBжтЙ?MЗ)o]Нs?МWЄxТ‡ŠѕЖ™l,6˜Х˜эНФhЋџqљз”iПЕ_УY0кХŠ Username=U\u017eivatelsk\u00e9 jm\u00e9no: Value=Hodnota Version=Verze # about dialogue AboutDialogueTabAbout=O aplikaci IcedTea-Web AboutDialogueTabAuthors=Auto\u0159i AboutDialogueTabChangelog=Seznam zm\u011bn AboutDialogueTabNews=Novinky AboutDialogueTabGPLv2=GPLv2 # version check minidialogue JREversionDontMatch=Varov\u00e1n\u00ed \u2013 prost\u0159ed\u00ed JRE ve va\u0161em po\u010d\u00edta\u010di ({0}) nesouhlas\u00ed s po\u017eadovan\u00fdm prost\u0159ed\u00edm JRE ({1}). JREContinueDialogSentence2=Chcete pokra\u010dovat? JREContinueDialogSentenceTitle=Nekompatibiln\u00ed prost\u0159ed\u00ed JRE # missing permissions dialogue MissingPermissionsMainTitle=Aplikace {0} z {1} postr\u00e1d\u00e1 atribut \u201epermissions\u201c. Aplikaci bez tohoto elementu byste nem\u011bli v\u011b\u0159it. Chcete povolit b\u011bh t\u00e9to aplikace? MissingPermissionsInfo=Chcete-li z\u00edskat v\u00edce informac\u00ed, nav\u0161tivte n\u00e1sleduj\u00edc\u00ed weby:
    JAR File Manifest Attributes
    a
    Preventing the repurposing of Applications. # missing Application-Library-Allowable-Codebase dialogue ALACAMissingMainTitle=Aplikace {0} z {1} pou\u017e\u00edv\u00e1 zdroje z n\u00e1sleduj\u00edc\u00edch vzd\u00e1len\u00fdch um\u00edst\u011bn\u00ed: {2} Pokud se aplikace nahr\u00e1v\u00e1 z jin\u00e9ho um\u00edst\u011bn\u00ed, ne\u017e o\u010dek\u00e1v\u00e1te, bu\u010fte velice opatrn\u00ed. Ur\u010dit\u011b chcete spustit tuto aplikaci? ALACAMissingInfo=Chcete-li z\u00edskat v\u00edce informac\u00ed, nav\u0161tivte n\u00e1sleduj\u00edc\u00ed weby:
    JAR File Manifest Attributes
    a
    Preventing the Repurposing of an Applications. # matching Application-Library-Allowable-Codebase dialogue ALACAMatchingMainTitle=Aplikace {0} z {1} pou\u017e\u00edv\u00e1 zdroje z n\u00e1sleduj\u00edc\u00edch vzd\u00e1len\u00fdch um\u00edst\u011bn\u00ed:
    {2}
    Um\u00edst\u011bn\u00ed se zdaj\u00ed b\u00fdt v po\u0159\u00e1dku. Ur\u010dit\u011b chcete spustit tuto aplikaci? ALACAMatchingInfo=Chcete-li z\u00edskat v\u00edce informac\u00ed, nav\u0161tivte n\u00e1sleduj\u00edc\u00ed weby:
    JAR File Manifest Attributes
    a
    Preventing the Repurposing of an Applications. MACDisabledMessage=Kontroly atribut\u016f v manifestu jsou vypnut\u00e9. MACCheckSkipped=kontrola {0} vynech\u00e1na, proto\u017ee vlastnost deployment.manifest.attributes.check nen\u00ed nastavena na hodnotu ALL nebo obsahuje {1} v kombinaci s mo\u017enost\u00ed # LS - Severity LSMinor=Mal\u00e1 LSFatal=Z\u00e1va\u017en\u00e1 # LC - Category LCSystem=Syst\u00e9mov\u00e1 chyba LCExternalLaunch=Chyba extern\u00edho spu\u0161t\u011bn\u00ed LCFileFormat=Chybn\u00fd form\u00e1t souboru LCReadError=Chyba p\u0159i \u010dten\u00ed LCClient=Chyba aplikace LCLaunching=Chyba p\u0159i spou\u0161t\u011bn\u00ed LCNotSupported=Nepodporovan\u00e1 funkce LCInit=Chyba inicializace LAllThreadGroup=V\u0161echny aplikace JNLP LNullUpdatePolicy=Z\u00e1sady pro aktualizaci nesm\u00ed b\u00fdt pr\u00e1zdn\u00e9. LThreadInterrupted=Vl\u00e1kno bylo p\u0159eru\u0161eno p\u0159i \u010dek\u00e1n\u00ed na spu\u0161t\u011bn\u00ed souboru. LThreadInterruptedInfo=Tato akce m\u016f\u017ee v\u00e9st k zablokov\u00e1n\u00ed nebo jin\u00e9mu po\u0161kozen\u00ed v pr\u016fb\u011bhu spou\u0161t\u011bn\u00ed. Restartujte aplikaci/prohl\u00ed\u017ee\u010d. LCouldNotLaunch=Nelze spustit soubor JNLP. LCouldNotLaunchInfo=Aplikace nebyla inicializov\u00e1na. Chcete-li z\u00edskat v\u00edce informac\u00ed, spus\u0165te javaws/prohl\u00ed\u017ee\u010d z p\u0159\u00edkazov\u00e9 \u0159\u00e1dky a za\u0161lete hl\u00e1\u0161en\u00ed o chyb\u011b. LCantRead=Nelze \u010d\u00edst nebo analyzovat soubor JNLP. LCantReadInfo=M\u016f\u017eete zkusit st\u00e1hnout tento soubor ru\u010dn\u011b a zaslat ho prost\u0159ednictv\u00edm hl\u00e1\u0161en\u00ed o chyb\u011b t\u00fdmu IcedTea-Web. LNullLocation=Nelze ur\u010dit um\u00edst\u011bn\u00ed souboru JNLP. LNullLocationInfo=Byl u\u010din\u011bn pokus o spu\u0161t\u011bn\u00ed souboru JNLP v jin\u00e9m prost\u0159ed\u00ed JVM, av\u0161ak soubor nebyl nalezen. Chcete-li spustit extern\u00ed prost\u0159ed\u00ed JVM, modul runtime mus\u00ed b\u00fdt schopen nal\u00e9zt soubor .jnlp v lok\u00e1ln\u00edm souborov\u00e9m syst\u00e9mu nebo na serveru. LNetxJarMissing=Nelze ur\u010dit um\u00edst\u011bn\u00ed souboru javaws.jar. LNetxJarMissingInfo=Byl u\u010din\u011bn pokus o spu\u0161t\u011bn\u00ed souboru JNLP v jin\u00e9m prost\u0159ed\u00ed JVM, av\u0161ak soubor javaws.jar nebyl nalezen. Chcete-li spustit extern\u00ed prost\u0159ed\u00ed JVM, modul runtime mus\u00ed b\u00fdt schopen nal\u00e9zt soubor javaws.jar. LNotToSpec=Soubor JNLP p\u0159esn\u011b neodpov\u00edd\u00e1 specifikaci. LNotToSpecInfo=Soubor JNLP obsahuje data, kter\u00e1 jsou zak\u00e1z\u00e1na v r\u00e1mci specifikace JNLP. Modul runtime se m\u016f\u017ee pokusit ignorovat neplatn\u00e9 informace a pokra\u010dovat ve spou\u0161t\u011bn\u00ed souboru. LNotApplication=Nejedn\u00e1 se o soubor aplikace. LNotApplicationInfo=Byl u\u010din\u011bn pokus o na\u010dten\u00ed souboru, kter\u00fd nen\u00ed aplikac\u00ed, jako soubor aplikace. LNotApplet=Nejedn\u00e1 se o soubor apletu. LNotAppletInfo=Byl u\u010din\u011bn pokus o na\u010dten\u00ed souboru, kter\u00fd nen\u00ed apletem, jako soubor apletu. LNoInstallers=Instal\u00e1tory nejsou podporov\u00e1ny. LNoInstallersInfo=Instal\u00e1tory JNLP je\u0161t\u011b nejsou podporov\u00e1ny. LInitApplet=Nelze inicializovat aplet. LInitAppletInfo=Dal\u0161\u00ed informace z\u00edsk\u00e1te kliknut\u00edm na tla\u010d\u00edtko Dal\u0161\u00ed informace... LInitApplication=Nelze inicializovat aplikaci. LInitApplicationInfo=Aplikace nebyla inicializov\u00e1na. Chcete-li z\u00edskat v\u00edce informac\u00ed, spus\u0165te javaws z p\u0159\u00edkazov\u00e9 \u0159\u00e1dky. LNotLaunchable=Nejedn\u00e1 se o spustiteln\u00fd soubor JNLP. LNotLaunchableInfo=Soubor mus\u00ed b\u00fdt aplikac\u00ed, apletem nebo instal\u00e1torem JNLP. LCantDetermineMainClass=Nezn\u00e1m\u00e1 t\u0159\u00edda Main-Class. LCantDetermineMainClassInfo=Nelze ur\u010dit t\u0159\u00eddu main class pro tuto aplikaci. LUnsignedJarWithSecurity=Nelze ud\u011blit opr\u00e1vn\u011bn\u00ed nepodepsan\u00fdm soubor\u016fm JAR. LUnsignedJarWithSecurityInfo=Aplikace po\u017e\u00e1dala o bezpe\u010dnostn\u00ed opr\u00e1vn\u011bn\u00ed, av\u0161ak soubory JAR nejsou podeps\u00e1ny. LSignedJNLPAppDifferentCerts=Aplikace JNLP nen\u00ed kompletn\u011b podepsan\u00e1 jednou certifika\u010dn\u00ed autoritou. LSignedJNLPAppDifferentCertsInfo=Jednotliv\u00e9 komponenty aplikace JNLP jsou individu\u00e1ln\u011b podeps\u00e1ny, nicm\u00e9n\u011b pro v\u0161echny polo\u017eky mus\u00ed b\u00fdt jeden spole\u010dn\u00fd podepisovatel. LUnsignedApplet=Aplet nebyl podepsan\u00fd. LUnsignedAppletPolicyDenied=Aplet nebyl podepsan\u00fd a bezpe\u010dnostn\u00ed z\u00e1sady zabr\u00e1nily jeho spu\u0161t\u011bn\u00ed. LUnsignedAppletUserDenied=Aplet nebyl podepsan\u00fd a byl vyhodnocen jako ned\u016fv\u011bryhodn\u00fd. LPartiallySignedApplet=Aplet byl \u010d\u00e1ste\u010dn\u011b podepsan\u00fd. LPartiallySignedAppletUserDenied=Aplet byl \u010d\u00e1ste\u010dn\u011b podepsan\u00fd a u\u017eivatel ho vyhodnotil jako ned\u016fv\u011bryhodn\u00fd. LSignedAppJarUsingUnsignedJar=Podepsan\u00e1 aplikace pou\u017e\u00edvaj\u00edc\u00ed nepodepsan\u00e9 soubory JAR. LSignedAppJarUsingUnsignedJarInfo=Hlavn\u00ed soubor JAR aplikace je podepsan\u00fd, av\u0161ak n\u011bkter\u00e9 z dal\u0161\u00edch pou\u017e\u00edvan\u00fdch soubor\u016f JAR nejsou podeps\u00e1ny. LRunInSandboxError=Vol\u00e1n\u00ed pro b\u011bh v izolovan\u00e9m prostoru (sandbox) bylo vykon\u00e1no p\u0159\u00edli\u0161 pozd\u011b. LRunInSandboxErrorInfo=Zavad\u011b\u010d t\u0159\u00edd dostal hl\u00e1\u0161en\u00ed, aby spustil aplet v izolovan\u00e9m prost\u0159ed\u00ed, av\u0161ak bezpe\u010dnostn\u00ed nastaven\u00ed ji\u017e byla inicializov\u00e1na. LSignedJNLPFileDidNotMatch=Podepsan\u00fd soubor JNLP se neshoduje se spou\u0161t\u011bn\u00fdm souborem JNLP. LNoSecInstance=Chyba: Neexistuje bezpe\u010dnostn\u00ed instance pro aplikaci {0}. Aplikace m\u016f\u017ee m\u00edt pot\u00ed\u017ee pokra\u010dovat. LCertFoundIn=Certifik\u00e1t {0} byl nalezen v arch\u00edvu cacerts ({1}). LSingleInstanceExists=Ji\u017e existuje jin\u00e1 instance tohoto apletu. Nelze provozovat v\u00edce instanc\u00ed apletu z\u00e1rove\u0148. JNotApplet=Soubor nen\u00ed aplet. JNotApplication=Soubor nen\u00ed aplikace. JNotComponent=Soubor nen\u00ed komponenta. JNotInstaller=Soubor nen\u00ed instal\u00e1tor. JInvalidExtensionDescriptor=P\u0159\u00edpona souboru neodkazuje na komponentu nebo instal\u00e1tor (n\u00e1zev={1}, um\u00edst\u011bn\u00ed={2}). LNotVerified=Soubory JAR nebyly ov\u011b\u0159eny. LCancelOnUserRequest=Zru\u0161eno u\u017eivatelem. LFatalVerification=P\u0159i ov\u011b\u0159ov\u00e1n\u00ed soubor\u016f JAR do\u0161lo k z\u00e1va\u017en\u00e9 chyb\u011b. LFatalVerificationInfo=Do\u0161lo k v\u00fdjimce ve t\u0159\u00edd\u011b JarCertVerifier. P\u0159\u00ed\u010dinou t\u00e9to v\u00fdjimky m\u016f\u017ee b\u00fdt neschopnost \u010d\u00edst soubory cacerts nebo trusted.certs. LNotVerifiedDialog=Nemohly b\u00fdt ov\u011b\u0159eny v\u0161echny soubory JAR. LAskToContinue=Chcete p\u0159esto pokra\u010dovat ve spou\u0161t\u011bn\u00ed t\u00e9to aplikace? # Parser PInvalidRoot=Element \u201eroot\u201c nen\u00ed elementem jnlp. PNoResources=Nen\u00ed definov\u00e1n element \u201eresources\u201c. PUntrustedNative=Nelze deklarovat element \u201enativelib\u201c, ani\u017e by bylo po\u017e\u00e1d\u00e1no o p\u0159\u00edslu\u0161n\u00e1 opr\u00e1vn\u011bn\u00ed. PExtensionHasJ2SE=V souboru roz\u0161\u00ed\u0159en\u00ed nelze deklarovat element \u201ej2se\u201c. PInnerJ2SE=Uvnit\u0159 elementu \u201ej2se\u201c nelze deklarovat dal\u0161\u00ed element \u201ej2se\u201c. PTwoMains=V elementu \u201eresources\u201c je duplicitn\u011b definov\u00e1n atribut \u201emain\u201c (lze definovat pouze jeden). PNativeHasMain=V elementu \u201enativelib\u201c nelze deklarovat atribut \u201emain\u201c. PNoInfoElement=Nen\u00ed definov\u00e1n element \u201einformation\u201c. PMissingTitle=N\u00e1zev PMissingVendor=Dodavatel PMissingElement=Pro va\u0161e n\u00e1rodn\u00ed prost\u0159ed\u00ed nebyla zad\u00e1na sekce {0}, ani neexistuje v\u00fdchoz\u00ed hodnota v souboru JNLP. PMissingMandatoryWarning=Je v\u0161ak p\u0159\u00edli\u0161 mnoho aplikac\u00ed, u kter\u00fdch se vyskytuje tento probl\u00e9m. Proto bude pou\u017eit fale\u0161n\u00fd \u00fadaj: PMissingMandatorySubstitution={0} je po\u0161kozen\u00fd nebo chyb\u00ed. T\u00e9to aplikaci nev\u011b\u0159te! PTwoDescriptions=Duplicitn\u00ed elementy \u201edescription\u201c typu {0} jsou neplatn\u00e9. PSharing=Element \u201esharing-allowed\u201c je neplatn\u00fd ve standardn\u00edm souboru JNLP. PTwoSecurity=V ka\u017ed\u00e9m souboru JNLP m\u016f\u017ee b\u00fdt pouze jeden element \u201esecurity\u201c. PEmptySecurity=Element \u201esecurity\u201c je definov\u00e1n, av\u0161ak neobsahuje element \u201epermissions\u201c. PTwoDescriptors=V ka\u017ed\u00e9m souboru JNLP m\u016f\u017ee b\u00fdt pouze jeden element \u201eapplication-desc\u201c. PTwoDesktops=Je povolen pouze jeden element \u201edesktop\u201c. PTwoMenus=Je povolen pouze jeden element \u201emenu\u201c. PTwoTitles=Je povolen pouze jeden element \u201etitle\u201c. PTwoIcons=Je povolen pouze jeden element \u201eicon\u201c. PTwoUpdates=Je povolen pouze jeden element \u201eupdate\u201c. PUnknownApplet=Nezn\u00e1m\u00fd aplet PBadWidth=Neplatn\u00e1 \u0161\u00ed\u0159ka apletu PBadHeight=Neplatn\u00e1 v\u00fd\u0161ka apletu PUrlNotInCodebase=Relativn\u00ed adresa URL neuv\u00e1d\u00ed podadres\u00e1\u0159 se z\u00e1kladnou k\u00f3du (codebase). (uzel (node)={0}, odkaz (href)={1}, z\u00e1kladna k\u00f3du (codebase)={2}) PBadRelativeUrl=Neplatn\u00e1 relativn\u00ed adresa URL (uzel (node)={0}, odkaz (href)={1}, z\u00e1kladna k\u00f3du (codebase)={2}) PBadNonrelativeUrl=Neplatn\u00e1 absolutn\u00ed adresa URL (uzel (node)={0}, odkaz (href)={1}) PNeedsAttribute=Element {0} mus\u00ed deklarovat atribut {1}. PBadXML=Neplatn\u00e1 syntax dokumentu XML PBadHeapSize=Neplatn\u00e1 hodnota pro velikost haldy (heap size) ({0}) # Runtime BLaunchAbout=Prob\u00edh\u00e1 spou\u0161t\u011bn\u00ed okna O aplikaci IcedTea-Web... BLaunchAboutFailure=Spu\u0161t\u011bn\u00ed okna O aplikaci IcedTea-Web se nezda\u0159ilo. BNeedsFile=Je nutn\u00e9 zadat soubor JNLP. RNoAboutJnlp=Nelze nal\u00e9zt soubor about.jnlp. BFileLoc=Um\u00edst\u011bn\u00ed souboru JNLP BBadProp=Neplatn\u00fd form\u00e1t vlastnosti {0} (platn\u00fd form\u00e1t: kl\u00ed\u010d=hodnota) BBadParam=Neplatn\u00fd form\u00e1t parametru {0} (platn\u00fd form\u00e1t: n\u00e1zev=hodnota) BNoDir=Adres\u00e1\u0159 {0} neexistuje. BNoCodeOrObjectApplet=Zna\u010dka apletu mus\u00ed deklarovat atribut \u201ecode\u201c nebo \u201eobject\u201c nebo \u201ejnlp_href\u201c. RNoResource=Chyb\u011bj\u00edc\u00ed zdroj: {0} RShutdown=Tato v\u00fdjimka zabra\u0148uje ukon\u010den\u00ed prost\u0159ed\u00ed JVM, av\u0161ak proces byl ukon\u010den. RExitTaken=T\u0159\u00edda exit class m\u016f\u017ee b\u00fdt nastavena pouze jednou a pouze ta pak m\u016f\u017ee ukon\u010dit prost\u0159ed\u00ed JVM. RCantReplaceSM=Nen\u00ed dovoleno vym\u011bnit t\u0159\u00eddu SecurityManager. RCantCreateFile=Nelze vytvo\u0159it soubor {0}. RCantDeleteFile=Nelze smazat soubor {0}. RCantOpenFile=Nepoda\u0159ilo se otev\u0159\u00edt soubor {0}. RCantWriteFile=Nepoda\u0159ilo se zapisovat do souboru {0}. RFileReadOnly=Soubor bude otev\u0159en v re\u017eimu pro \u010dten\u00ed. RExpectedFile={0} m\u011bl b\u00fdt dle o\u010dek\u00e1v\u00e1n\u00ed soubor, ale nen\u00ed. RRemoveRPermFailed=Selhalo odstra\u0148ov\u00e1n\u00ed opr\u00e1vn\u011bn\u00ed ke \u010dten\u00ed u souboru {0}. RRemoveWPermFailed=Selhalo odstra\u0148ov\u00e1n\u00ed opr\u00e1vn\u011bn\u00ed k z\u00e1pisu u souboru {0}. RRemoveXPermFailed=Selhalo odstra\u0148ov\u00e1n\u00ed opr\u00e1vn\u011bn\u00ed ke spou\u0161t\u011bn\u00ed u souboru {0}. RGetRPermFailed=Selhalo z\u00edsk\u00e1v\u00e1n\u00ed opr\u00e1vn\u011bn\u00ed ke \u010dten\u00ed u souboru {0}. RGetWPermFailed=Selhalo z\u00edsk\u00e1v\u00e1n\u00ed opr\u00e1vn\u011bn\u00ed k z\u00e1pisu u souboru {0}. RGetXPermFailed=Selhalo z\u00edsk\u00e1v\u00e1n\u00ed opr\u00e1vn\u011bn\u00ed ke spou\u0161t\u011bn\u00ed u souboru {0}. RCantCreateDir=Nelze vytvo\u0159it adres\u00e1\u0159 {0}. RCantRename=Nelze prov\u00e9st p\u0159ejmenov\u00e1n\u00ed z {0} na {1}. RDenyStopped=Pozastaven\u00e1 aplikace nem\u00e1 pat\u0159i\u010dn\u00e1 opr\u00e1vn\u011bn\u00ed. RExitNoApp=Nelze ukon\u010dit prost\u0159ed\u00ed JVM, proto\u017ee sou\u010dasn\u00e1 aplikace neodpov\u00edd\u00e1. RNoLockDir=Nelze vytvo\u0159it uzamykac\u00ed adres\u00e1\u0159 ({0}). RNestedJarExtration=Nelze extrahovat vno\u0159en\u00fd soubor JAR. RUnexpected=Neo\u010dek\u00e1van\u00e1 v\u00fdjimka {0} v n\u00e1sleduj\u00edc\u00ed \u010d\u00e1sti v\u00fdpisu trasov\u00e1n\u00ed: {1} RConfigurationError=P\u0159i \u010dten\u00ed konfigurace do\u0161lo k z\u00e1va\u017en\u00e9 chyb\u011b. Pokra\u010duji s pr\u00e1zdnou konfigurac\u00ed. Opravte chybu. RConfigurationFatal=CHYBA: P\u0159i na\u010d\u00edt\u00e1n\u00ed konfigurace do\u0161lo k z\u00e1va\u017en\u00e9 chyb\u011b. Mo\u017en\u00e1 je nutn\u00e9 pou\u017e\u00edt glob\u00e1ln\u00ed konfiguraci, kter\u00e1 v\u0161ak nebyla nalezena. RFailingToDefault=Bude pou\u017eita v\u00fdchoz\u00ed konfigurace. RPRoxyPacNotSupported=Pou\u017eit\u00ed soubor\u016f PAC (Proxy Auto Config) nen\u00ed podporov\u00e1no. RProxyFirefoxNotFound=Nelze pou\u017e\u00edt nastaven\u00ed proxy server\u016f prohl\u00ed\u017ee\u010de Firefox. Je pou\u017eito nastaven\u00ed bez proxy serveru (DIRECT). RProxyFirefoxOptionNotImplemented=Mo\u017enost nastaven\u00ed proxy serveru prohl\u00ed\u017ee\u010de {0} ({1}) je\u0161t\u011b nen\u00ed podporov\u00e1na. RBrowserLocationPromptTitle=Vyberte obslu\u017en\u00fd program (prohl\u00ed\u017ee\u010d) pro tuto adresu URL: HTMLnoneFound=Na t\u00e9to str\u00e1nce html nebyl nalezen \u017e\u00e1dn\u00fd aplet (podporov\u00e1ny jsou zna\u010dky \u201eobject\u201c, \u201eembed\u201c a \u201eapplet\u201c). HTMLmoreThenOne=Bylo nalezeno v\u00edce aplet\u016f ({0}). Pou\u017eije se prvn\u00ed. M\u016f\u017eete specifikovat \u010d\u00edsla aplet\u016f nebo pou\u017e\u00edt volbu \u201ev\u0161echny\u201c (all) a vybrat tak, kter\u00e9 aplety chcete spustit. # icedtea-web man (note, spaces are important due to man pages markup ITWintroL1={0}poskytuje svobodn\u00fd z\u00e1suvn\u00fd modul pro webov\u00fd prohl\u00ed\u017ee\u010d, kter\u00fd spou\u0161t\u00ed aplety napsan\u00e9 v programovac\u00edm jazyce Java, a implementaci technologie Java Web Start, p\u016fvodn\u011b zalo\u017een\u00e9 na projektu NetX. ITWintroL2=NetX umo\u017e\u0148uje pro aplety a aplikace Java jejich stahov\u00e1n\u00ed po s\u00edti, zapisov\u00e1n\u00ed do vyrovn\u00e1vac\u00ed pam\u011bti a (ve v\u00fdchoz\u00edm stavu) spou\u0161t\u011bn\u00ed v bezpe\u010dn\u00e9m izolovan\u00e9m prostoru (sandbox). N\u00e1sledn\u00e1 spu\u0161t\u011bn\u00ed apletu automaticky st\u00e1hnou nejnov\u011bj\u0161\u00ed verzi. Nastaven\u00ed aktualizac\u00ed a zabezpe\u010den\u00ed lze nastavit (mimo jin\u00e9) pomoc\u00ed p\u0159\u00edkazu itw-settings. ITWintroL3={0} tak\u00e9 obsahuje z\u00e1suvn\u00fd modul, kter\u00fd {1} ve webov\u00fdch prohl\u00ed\u017ee\u010d\u00edch. ITWintroUrlCaption = zapne aplety Java BFileInfoAuthors=Jm\u00e9na a e-mailov\u00e9 adresy p\u0159isp\u011bvatel\u016f do projektu naleznete v souboru AUTHORS v ko\u0159enov\u00e9m adres\u00e1\u0159i aplikace IcedTea-Web. BFileInfoCopying=Kompletn\u00ed licen\u010dn\u00ed ujedn\u00e1n\u00ed GPLv2 tohoto projektu naleznete v souboru COPYING v ko\u0159enov\u00e9m adres\u00e1\u0159i aplikace IcedTea-Web. BFileInfoNews=Novinky o vyd\u00e1n\u00edch aplikac\u00ed tohoto projektu naleznete v souboru NEWS v ko\u0159enov\u00e9m adres\u00e1\u0159i aplikace IcedTea-Web. ITWdescO1title=Modul\u00e1rn\u00ed ITWdescO1text=M\u016f\u017eete snadno dod\u00e1vat aplikac\u00edm mo\u017enosti protokolu JNLP. ITWdescO2title=\u0160et\u0159\u00ed pam\u011b\u0165 ITWdescO2text=M\u016f\u017eete spou\u0161t\u011bt programy ve sd\u00edlen\u00fdch prost\u0159ed\u00edch JVM. ITWdescO3title=Rychl\u00fd start ITWdescO3text=Urychlen\u00ed startu aplikac\u00ed spou\u0161t\u011bn\u00edm z vyrovn\u00e1vac\u00ed pam\u011bti. ITWdescO4title=Zabezpe\u010den\u00ed ITWdescO4text=V\u0161echny aplikace m\u016f\u017eete spou\u0161t\u011bt v izolovan\u00e9m prostoru a protokolovat jejich aktivity. ITWdescO5title=Automatick\u00e9 aktualizace ITWdescO5text=Aplikace se m\u016f\u017eou automaticky aktualizovat bez speci\u00e1ln\u00edho k\u00f3du. ITWdescO6title=Nasazen\u00ed po s\u00edti ITWdescO6text=Nasazujte aplikace p\u0159es internet, nikoliv pomoc\u00ed instal\u00e1tor\u016f. ITWdescO7title=Otev\u0159en\u00fd zdrojov\u00fd k\u00f3d ITWdescO7text=GNU Lesser General Public License. ITWdescL1=V\u00edce informac\u00ed naleznete na {0} nebo p\u0159\u00edmo na domovsk\u00fdch str\u00e1nk\u00e1ch {1}. ITWdescWikiUrlTitle=wiki projektu IcedTea ITWdescItwWikiUrlTitle=IcedTea-Web \u2013 domovsk\u00e1 str\u00e1nka ITWdescL2=Pomoc p\u0159i \u0159e\u0161en\u00ed b\u011b\u017en\u00fdch pot\u00ed\u017e\u00ed s aplikac\u00ed IcedTea-Web najdete {0}. ITWdescIssuesUrlTitle=zde ITWdescL3=Hlavn\u00ed vlastnosti NetX: ITWoptionsL1={0} projektu IcedTea je dostupn\u00e1 na wiki. ITWoptionsQuickStartUrlCaption=Rychl\u00e1 \u00favodn\u00ed p\u0159\u00edru\u010dka ITWoptionsCodeUrlUrlCaption=stylu z\u00e1pisu k\u00f3du ITWoptionsL2=Pokyny ke {0} a instrukce pro {1} pro IcedTea-Web jsou takt\u00e9\u017e dostupn\u00e9. Opravy doprov\u00e1zejte testy jednotliv\u00fdch \u010d\u00e1st\u00ed (unit tests) a {2}, ne\u017e je za\u0161lete do {3}. ITWoptionsEclipseUrlCaption=nastaven\u00ed v\u00fdvojov\u00e9ho prost\u0159ed\u00ed Eclipse ITWoptionsReproducersUrlCaption=testy vnit\u0159n\u00ed integrace ITWoptionsDistroUrlCaption=mailing listu ITWoptionsL3=P\u0159isp\u00edv\u00e1n\u00ed do projektu: # policyeditor man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. PEintro= - zobrazen\u00ed a \u00fapravy nastaven\u00ed bezpe\u010dnostn\u00edch z\u00e1sad pro javaws a z\u00e1suvn\u00fd modul prohl\u00ed\u017ee\u010de PEsynopseP1=policy_file PEsynopseP2=url PEdescL1=je grafick\u00e1 aplikace s omezenou podporou p\u0159\u00edkazov\u00e9 \u0159\u00e1dky slou\u017e\u00edc\u00ed ke zobrazen\u00ed a \u00faprav\u011b nastaven\u00ed bezpe\u010dnostn\u00edch z\u00e1sad aplet\u016f pou\u017e\u00edvan\u00e1 implementac\u00ed rozhran\u00ed javaws pou\u017e\u00edvanou aplikac\u00ed IcedTea-Web a z\u00e1suvn\u00fdm modulem prohl\u00ed\u017ee\u010de. Jedn\u00e1 se o jednodu\u0161\u0161\u00ed, sn\u00e1ze pou\u017eitelnou a p\u0159\u00edstupn\u011bj\u0161\u00ed alternativu ke standardn\u00edmu n\u00e1stroji JDK Policy Tool. Spr\u00e1vci a zku\u0161en\u00ed u\u017eivatel\u00e9, kte\u0159\u00ed pot\u0159ebuj\u00ed dokonalou kontrolu nad soubory se z\u00e1sadami by m\u011bli rad\u011bji pou\u017e\u00edt n\u00e1stroj Policy Tool ne\u017e n\u00e1stroj PolicyEditor. PEdescL2=Pokud je p\u0159\u00edkaz spu\u0161t\u011bn bez dal\u0161\u00edch argument\u016f, neotev\u0159e se \u017e\u00e1dn\u00fd soubor. P\u0159i n\u00e1sledn\u00e9m ulo\u017een\u00ed souboru budete dot\u00e1z\u00e1n\u00ed, kam se m\u00e1 soubor ulo\u017eit. V opa\u010dn\u00e9m p\u0159\u00edpad\u011b pokud je cesta k souboru zad\u00e1na jako argument v p\u0159\u00edkazov\u00e9 \u0159\u00e1dce, zadan\u00e1 cesta bude pou\u017eita jako soubor se z\u00e1sadami. PEexampleL1=Zobraz\u00ed grafick\u00e9 rozhran\u00ed a otev\u0159e v\u00fdchoz\u00ed soubor se z\u00e1sadami. PEexampleL2=Zobraz\u00ed grafick\u00fd editor bez otev\u0159en\u00e9ho souboru se z\u00e1sadami. # javaws man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. JWSintro= - klient aplikace Java Web Start JWSdescL1=je implementac\u00ed klienta protokolu JNLP. Pou\u017e\u00edv\u00e1 soubor JNLP (Java Network Launch Protocol) k bezpe\u010dn\u00e9mu spou\u0161t\u011bn\u00ed vzd\u00e1len\u00fdch aplikac\u00ed a aplet\u016f Java. Tato implementace {0} je vytv\u00e1\u0159ena v r\u00e1mci projektu IcedTea a je zalo\u017eena na projektu NetX. JWSdescL2=Soubor JNLP je v jazyce xml a popisuje, jak bezpe\u010dn\u011b spou\u0161t\u011bt vzd\u00e1len\u00e9 aplikace a aplety Java. JWSoptionsL1=P\u0159i zad\u00e1v\u00e1n\u00ed voleb m\u016f\u017ee b\u00fdt soubor JNLP zad\u00e1n v p\u0159\u00edkazu za volbou -jnlp, nebo jako samostatn\u00e1 volba bez dal\u0161\u00edch argument\u016f. Soubor HTML, kter\u00fd spou\u0161t\u00ed soubor JNLP lze uv\u00e9st za argumentem -html. JWSoptionsL2=Soubor JNLP lze specifikovat bu\u010f pomoc\u00ed adresy URL nebo pomoc\u00ed cesty k m\u00edstn\u00edmu souboru. JWSoptionsL3=Soubor JNLP by m\u011bl b\u00fdt specifikov\u00e1n pouze jednou \u2013 bu\u010f jako hlavn\u00ed argument za volbou -jnlp, nebo v r\u00e1mci souboru HTML. JWSoptionsTitle1=Mo\u017enosti spou\u0161t\u011bn\u00ed: JWSoptionsTitle2=Ovl\u00e1dac\u00ed mo\u017enosti: JWSexampleL1=Zobraz\u00ed z\u00e1kladn\u00ed n\u00e1pov\u011bdu a informace o aplikaci. JWSexampleL2=Zobraz\u00ed z\u00e1kladn\u00ed n\u00e1pov\u011bdu a informace o aplikaci pouze v termin\u00e1lu. JWSexampleL3=Spust\u00ed aplikaci {0} p\u0159\u00edmo z um\u00edst\u011bn\u00ed {1}, ani\u017e by aplikace byla sta\u017eena, bez kontroly hlavi\u010dek a ve vynucen\u00e9m virtu\u00e1ln\u00edm prost\u0159ed\u00ed. # Boot options, message should be shorter than this ----------------> BOUsage=[-volby-spu\u0161t\u011bn\u00ed] soubor jnlp BOUsage2=[-volby-ovl\u00e1d\u00e1n\u00ed] BOJnlp = Um\u00edst\u011bn\u00ed souboru JNLP ke spu\u0161t\u011bn\u00ed (URL nebo soubor) BOHtml = Um\u00edst\u011bn\u00ed souboru HTML ke spu\u0161t\u011bn\u00ed (URL nebo soubor) K vybr\u00e1n\u00ed aplet\u016f na str\u00e1nce m\u016f\u017eete pou\u017e\u00edt parametr ALL nebo \u010d\u00edsla (jako 1 2 5). A\u010dkoliv se jedn\u00e1 o experiment\u00e1ln\u00ed p\u0159ep\u00edna\u010d, jeho pou\u017eit\u00ed by m\u011blo b\u00fdt bezpe\u010dn\u00e9. BOArg = P\u0159id\u00e1 p\u0159ed spu\u0161t\u011bn\u00edm parametr aplikace. BOParam = P\u0159id\u00e1 p\u0159ed spu\u0161t\u011bn\u00edm parametr apletu. BOProperty = P\u0159ed spu\u0161t\u011bn\u00edm nastav\u00ed syst\u00e9movou vlastnost. BOUpdate = Zkontroluje aktualizace. BOLicense = Zobraz\u00ed licenci GPL a ukon\u010d\u00ed aplikaci. BOVerbose = Zapne podrobn\u00fd v\u00fdstup. BOAbout = Uk\u00e1\u017ee vzorovou aplikaci. BOVersion = Vyp\u00ed\u0161e verzi aplikace IcedTea-Web a ukon\u010d\u00ed aplikaci. BONosecurity= Vypne zabezpe\u010den\u00e9 b\u011bhov\u00e9 prost\u0159ed\u00ed. K obejit\u00ed po\u0161kozen\u00fdch podpis\u016f budete tak\u00e9 pot\u0159ebovat nastaven\u00ed vlastnosti deployment.security.itw.ignorecertissues. BONoupdate = Vypne kontrolu aktualizac\u00ed. BOHeadless = Vypne ve\u0161ker\u00e9 grafick\u00e9 prvky u\u017eiv. rozhran\u00ed IcedTea-Web. BOStrict = Zapne striktn\u00ed kontrolu souborov\u00e9ho form\u00e1tu JNLP. BOViewer = Zobraz\u00ed prohl\u00ed\u017ee\u010d d\u016fv\u011bryhodn\u00fdch certifik\u00e1t\u016f. BOXml = Pou\u017eije pro anal\u00fdzu souboru JNLP striktn\u00ed XML parser. BOredirect = N\u00e1sleduje p\u0159esm\u011brov\u00e1n\u00ed HTTP. BXnofork = Zak\u00e1\u017ee vytv\u00e1\u0159en\u00ed jin\u00fdch prost\u0159ed\u00ed JVM. BXclearcache= Vy\u010dist\u00ed vyrovn\u00e1vac\u00ed pam\u011b\u0165 aplikace JNLP. Pokud zad\u00e1te argument, sma\u017ee se pouze ur\u010den\u00e1 aplikace. BXSingleCacheCleared=Prob\u00edh\u00e1 \u010di\u0161t\u011bn\u00ed vyrovn\u00e1vac\u00ed pam\u011bti pro polo\u017eku: {0} BXSingleCacheClearNotFound=Nebylo nalezeno ID pro polo\u017eku {0}! BXSingleCacheMoreThenOneId=Bylo nalezeno v\u00edce ID pro polo\u017eku {0}! BXSingleCacheFileCount=Po\u010det zm\u011bn\u011bn\u00fdch soubor\u016f: {0} BXcacheids = Zobraz\u00ed seznam dostupn\u00fdch identifik\u00e1tor\u016f ve vyrovn\u00e1vac\u00ed pam\u011bti, kter\u00e9 lze pou\u017e\u00edt ke smaz\u00e1n\u00ed konkr\u00e9tn\u00edch aplikac\u00ed. BXignoreheaders= Vynech\u00e1 ov\u011b\u0159ov\u00e1n\u00ed hlavi\u010dky souboru JAR. BXoffline = Zabr\u00e1n\u00ed ITW v p\u0159ipojen\u00ed k s\u00edti. Bude pou\u017eita pouze vyrovn\u00e1vac\u00ed pam\u011b\u0165. Aplikace se st\u00e1le m\u016f\u017ee p\u0159ipojit. BOHelp1 = Vyp\u00ed\u0161e informace o podporovan\u00fdch p\u0159\u00edkazech a z\u00e1kladn\u00edm pou\u017eit\u00ed. BOHelp2 = Vyp\u00ed\u0161e informace o podporovan\u00fdch p\u0159\u00edkazech a z\u00e1kladn\u00edm pou\u017eit\u00ed. Lze tak\u00e9 zadat parametr k vyps\u00e1n\u00ed podrobn\u00e9 n\u00e1pov\u011bdy k tomuto p\u0159\u00edkazu. BOTrustnone = M\u00edsto dot\u00e1z\u00e1n\u00ed se u\u017eivatele bude p\u0159edpokl\u00e1dat z\u00e1pornou odpov\u011b\u010f na v\u0161echny dotazy. # Itweb-settings boot commands IBOList=Zobraz\u00ed seznam v\u0161ech nastaven\u00ed aplikace IcedTea-Web a jejich aktu\u00e1ln\u00edch hodnot. IBOGet=Zobraz\u00ed hodnotu zadan\u00e9ho nastaven\u00ed. IBOInfo=Zobraz\u00ed dal\u0161\u00ed informace o uveden\u00e9m nastaven\u00ed. Obsahuje popis, aktu\u00e1ln\u00ed hodnotu, mo\u017en\u00e9 dal\u0161\u00ed hodnoty a zdroj nastaven\u00ed. IBOSet=Nastav\u00ed nov\u011b zadanou hodnotu nastaven\u00ed (pokud p\u016fjde o platnou hodnotu). IBOResetAll= Obnov\u00ed v\u00fdchoz\u00ed hodnoty v\u0161ech nastaven\u00ed. IBOReset=Obnov\u00ed v\u00fdchoz\u00ed hodnotu zadan\u00e9ho nastaven\u00ed. IBOCheck=Zkontroluje, zda maj\u00ed sou\u010dasn\u00e1 nastaven\u00ed platn\u00e9 hodnoty. PBOFile=Ud\u00e1v\u00e1 cestu k souboru se z\u00e1sadami, kter\u00fd se m\u00e1 otev\u0159\u00edt. Pokud je zad\u00e1n p\u0159esn\u011b jeden argument, a nejedn\u00e1 se o tento p\u0159\u00edznak, je interpretov\u00e1n jako cesta k souboru, kter\u00fd se m\u00e1 otev\u0159\u00edt, jako kdyby byl tento p\u0159\u00edznak zad\u00e1n prvn\u00ed. Tento p\u0159\u00edznak existuje hlavn\u011b z d\u016fvodu kompatibility s n\u00e1strojem Policy Tool. PBODefaultFile=Deklaruje, \u017ee m\u00e1 b\u00fdt otev\u0159en v\u00fdchoz\u00ed soubor se z\u00e1sadami na \u00farovni u\u017eivatele. To je soubor, kter\u00fd je aplikac\u00ed IcedTea-Web obvykle pou\u017e\u00edv\u00e1n k rozhodov\u00e1n\u00ed o vlastn\u00edch z\u00e1sad\u00e1ch a opr\u00e1vn\u011bn\u00edch pro aplety (pokud neexistuje jin\u00e1 konfigurace). PBOCodebase=Ud\u00e1v\u00e1 adresu URL z\u00e1kladny k\u00f3du (codebase) apletu. Lze pou\u017e\u00edt spole\u010dn\u011b s volbami ostatn\u00edch selektor\u016f k v\u00fdb\u011bru existuj\u00edc\u00ed z\u00e1sady p\u0159i otev\u0159en\u00ed editoru. Pokud \u017e\u00e1dn\u00e1 neexistuje, bude vytvo\u0159ena a vybr\u00e1na. PBOSignedBy=Ud\u00e1v\u00e1 z\u00e1stupn\u00fd n\u00e1zev pro certifik\u00e1t ulo\u017een\u00fd v ulo\u017ei\u0161ti kl\u00ed\u010d\u016f. Lze pou\u017e\u00edt spole\u010dn\u011b s volbami ostatn\u00edch selektor\u016f k v\u00fdb\u011bru existuj\u00edc\u00ed z\u00e1sady p\u0159i otev\u0159en\u00ed editoru. Pokud \u017e\u00e1dn\u00e1 neexistuje, bude vytvo\u0159ena a vybr\u00e1na. PBOPrincipals=Ud\u00e1v\u00e1 n\u00e1zev t\u0159\u00eddy / n\u00e1zev objektu Principal (odd\u011blen\u00e9 mezerou) pro identifik\u00e1tor z\u00e1sady. Lze pou\u017e\u00edt spole\u010dn\u011b s volbami ostatn\u00edch selektor\u016f k v\u00fdb\u011bru existuj\u00edc\u00ed z\u00e1sady p\u0159i otev\u0159en\u00ed editoru. Pokud \u017e\u00e1dn\u00e1 neexistuje, bude vytvo\u0159ena a vybr\u00e1na. # Option Parser OPUnevenParams=Pro argument {0} se o\u010dek\u00e1v\u00e1 sud\u00fd po\u010det parametr\u016f. # NumberOfArguments descriptions. NOAnone=Neo\u010dek\u00e1v\u00e1 se \u017e\u00e1dn\u00fd argument. NOAone=O\u010dek\u00e1v\u00e1 se p\u0159esn\u011b jeden argument. NOAonemore=O\u010dek\u00e1v\u00e1 se jeden nebo v\u00edce argument\u016f. NOAnonorone=O\u010dek\u00e1v\u00e1 se \u017e\u00e1dn\u00fd nebo jeden argument. NOAevennumber=O\u010dek\u00e1v\u00e1 se sud\u00fd po\u010det argument\u016f ve form\u00e1tu parametr=hodnota. # Allowed man sections manNAME=N\u00c1ZEV manSYNOPSIS=ANOTACE manDESCRIPTION=POPIS manOPTIONS=MO\u017dNOSTI manCOMMANDS=P\u0158\u00cdKAZY manEXAMPLES=P\u0158\u00cdKLADY manFILES=SOUBORY manBUGS=CHYBY manAUTHOR=AUTOR manSEE_ALSO=VIZ T\u00c9\u017d # Cache CAutoGen=vygenerov\u00e1no automaticky \u2013 nem\u011bnit CNotCacheable={0} nen\u00ed zdroj, kter\u00fd lze zapsat do vyrovn\u00e1vac\u00ed pam\u011bti. CDownloading=Prob\u00edh\u00e1 stahov\u00e1n\u00ed. CComplete=Dokon\u010deno CChooseCache=Zvolit adres\u00e1\u0159 pro vyrovn\u00e1vac\u00ed pam\u011b\u0165... CChooseCacheInfo=NetX pot\u0159ebuje um\u00edst\u011bn\u00ed pro uchov\u00e1v\u00e1n\u00ed soubor\u016f vyrovn\u00e1vac\u00ed pam\u011bti. CChooseCacheDir=Adres\u00e1\u0159 vyrovn\u00e1vac\u00ed pam\u011bti CCannotClearCache=Moment\u00e1ln\u011b nelze vy\u010distit vyrovn\u00e1vac\u00ed pam\u011b\u0165. Zkuste to pozd\u011bji. Pokud probl\u00e9m p\u0159etrv\u00e1v\u00e1, zkuste zav\u0159\u00edt prohl\u00ed\u017ee\u010de a aplikace JNLP. Jako posledn\u00ed prost\u0159edek m\u016f\u017eete zkusit zab\u00edt v\u0161echny Java aplikace. \\\n Vyrovn\u00e1vac\u00ed pam\u011b\u0165 m\u016f\u017eete vy\u010distit pomoc\u00ed p\u0159\u00edkazu javaws -Xclearcache nebo pomoc\u00ed programu itw-settings, volby Vyrovn\u00e1vac\u00ed pam\u011b\u0165 -> Zobrazit soubory... -> Vy\u010distit vyrovn\u00e1vac\u00ed pam\u011b\u0165. CFakeCache=Vyrovn\u00e1vac\u00ed pam\u011b\u0165 je po\u0161kozena. Prob\u00edh\u00e1 oprava. CFakedCache=Po\u0161kozen\u00e1 vyrovn\u00e1vac\u00ed pam\u011b\u0165 byla opravena. D\u016frazn\u011b doporu\u010dujeme co nejd\u0159\u00edve spustit p\u0159\u00edkaz \u201ejavaws -Xclearcache\u201c a pak znovu spustit aplikaci. M\u016f\u017eete tak\u00e9 pou\u017e\u00edt program itw-settings, volby Vyrovn\u00e1vac\u00ed pam\u011b\u0165 -> Zobrazit soubory... -> Vy\u010distit vyrovn\u00e1vac\u00ed pam\u011b\u0165. # extended access warning pane EXAWdesktopWants=Z\u00e1stupce na plo\u0161e (vy\u017e\u00e1d\u00e1no aplikac\u00ed) EXAWdesktopDontWants=Z\u00e1stupce na plo\u0161e (nevy\u017e\u00e1d\u00e1no aplikac\u00ed) EXAWsubmenu=Z\u00e1stupce v m\u00edstn\u00ed nab\u00eddce (aplikace se ji pokus\u00ed vytvo\u0159it v podnab\u00eddce \u2013 {0}) EXAWmenuWants=Z\u00e1stupce v m\u00edstn\u00ed nab\u00eddce (vy\u017e\u00e1d\u00e1no aplikac\u00ed) EXAWmenuDontWants=Z\u00e1stupce v m\u00edstn\u00ed nab\u00eddce (nevy\u017e\u00e1d\u00e1no aplikac\u00ed) EXAWsettingsInfo=Va\u0161e sou\u010dasn\u00e9 nastaven\u00ed: {0}. M\u016f\u017eete ho zm\u011bnit v programu itweb-settings v panelu {1}. EXAWsettingsManage=Spravovat existuj\u00edc\u00ed polo\u017eky nab\u00eddek v programu itweb-settings v panelu {0}. EXAWrememberByApp=Pamatovat podle aplikace EXAWrememberByPage=Pamatovat podle dom\u00e9ny EXAWdontRemember=Nepamatovat EXAWrememberByAppTooltip=Tato aplikace nebude po\u017eadovat dal\u0161\u00ed opr\u00e1vn\u011bn\u00ed. EXAWrememberByPageTooltip=V\u0161echny aplikace z t\u00e9to dom\u00e9ny ji\u017e nebudou zas\u00edlat dal\u0161\u00ed dotazy a pou\u017eij\u00ed sou\u010dasn\u00e9 rozhodnut\u00ed na v\u0161echna opr\u00e1vn\u011bn\u00ed. EXAWdontRememberTooltip=Va\u0161e rozhodnut\u00ed bude pou\u017eito pouze pro toto jedin\u00e9 opr\u00e1vn\u011bn\u00ed pro toto jedin\u00e9 spu\u0161t\u011bn\u00ed. EXAWbrowser=z\u00e1stupce prohl\u00ed\u017ee\u010de na plo\u0161e EXAWgenjnlp=vytvo\u0159en soubor jnlp EXAWjnlphref=jnlp href EXAWhtml=javaws html EXAWfixhref=oprav\u00ed pot\u00ed\u017ee v jnlp-href EXAWbrowserTolltip=Z\u00e1stupce prohl\u00ed\u017ee\u010de
  • Tato volba vytvo\u0159\u00ed z\u00e1stupce, s jeho\u017e pomoc\u00ed otev\u0159ete prohl\u00ed\u017ee\u010d s na\u010dtenou aktu\u00e1ln\u00ed str\u00e1nkou.
  • Pokud v\u00e1\u0161 prohl\u00ed\u017ee\u010d podporuje prohl\u00ed\u017een\u00ed offline, je to ta nejbezpe\u010dn\u011bj\u0161\u00ed mo\u017enost.
  • EXAWbrowsersTolltip=prohl\u00ed\u017ee\u010d pou\u017eit\u00fd pro spu\u0161t\u011bn\u00ed tohoto apletu (spust\u00ed IcedTea-Web pozd\u011bji)
  • V\u00fdchoz\u00ed prohl\u00ed\u017ee\u010d byl p\u0159ednastaven.
  • M\u016f\u017eete p\u0159idat dal\u0161\u00ed prohl\u00ed\u017ee\u010de dle va\u0161ich preferenc\u00ed.
  • EXAWgeneratedTolltip=
  • Soubor JNLP bude vygenerov\u00e1n ze sou\u010dasn\u00e9 str\u00e1nky HTML.
  • Kdy\u017e pou\u017eijete z\u00e1stupce ke spu\u0161t\u011bn\u00ed, rozhran\u00ed javaws spust\u00ed tento soubor JNLP.
  • Aplet pak pob\u011b\u017e\u00ed bez prohl\u00ed\u017ee\u010de.
  • A\u010dkoliv je tato funkce experiment\u00e1ln\u00ed, funguje p\u0159ekvapiv\u011b dob\u0159e.
  • EXAWhrefTolltip=N\u011bkter\u00e9 aplety pouze odkazuj\u00ed na soubor JNLP, kter\u00fd obsahuje informace o zdroj\u00edch t\u00e9to aplikace.
  • Pou\u017eit\u00edm t\u00e9to mo\u017enosti dan\u00fd soubor JNLP ulo\u017e\u00edte pro pou\u017eit\u00ed p\u0159i n\u00e1sleduj\u00edc\u00edch spu\u0161t\u011bn\u00edch.
  • Rozhran\u00ed javaws aplet spust\u00ed a ten pob\u011b\u017e\u00ed mimo prohl\u00ed\u017ee\u010d.
  • A\u010dkoliv to zn\u00ed dob\u0159e, p\u0159ekvapiv\u011b to nefunguje.
  • EXAWhtmlTolltip=Pou\u017eit\u00edm p\u0159ep\u00edna\u010de -html se m\u016f\u017ee rozhran\u00ed javaws pokusit analyzovat html, aplet z n\u011bho extrahovat a spustit ho mimo prohl\u00ed\u017ee\u010d.
  • Vysoce experiment\u00e1ln\u00ed funkce.
  • Ale fakt super!
  • EXAWfixTolltip=N\u011bkter\u00e9 soubory JNLP odkazovan\u00e9 z aplet\u016f nejsou navr\u017eeny tak, aby mohly b\u00fdt pou\u017eity jako aplikace JNLP.
  • Tato volba p\u0159id\u00e1 do dan\u00e9ho souboru JNLP elementy, o kter\u00fdch se v\u00ed, \u017ee \u010dasto chyb\u00ed (pokud opravdu chyb\u00ed).
  • # Security SFileReadAccess=Aplikace vy\u017eaduje p\u0159\u00edstup ke \u010dten\u00ed souboru {0}. Chcete tuto akci povolit? SFileWriteAccess=Aplikace vy\u017eaduje p\u0159\u00edstup k zapisov\u00e1n\u00ed do souboru {0}. Chcete tuto akci povolit? SDesktopShortcut=Aplikace vy\u017eaduje opr\u00e1vn\u011bn\u00ed k vytvo\u0159en\u00ed z\u00e1stupce na plo\u0161e a v m\u00edstn\u00ed nab\u00eddce. Chcete tuto akci povolit? WinDesktopError=Nepoda\u0159ilo se vytvo\u0159it ikony na plo\u0161e syst\u00e9mu Windows. Va\u0161e instalace IcedTea-Web byla pravd\u011bpodobn\u011b zkompilov\u00e1na bez souboru mslinks.jar nebo tento soubor nelze nal\u00e9zt. Zkuste to opravit. Pokud to nepom\u016f\u017ee, m\u016f\u017ee b\u00fdt chyba v samotn\u00e9 aplikaci. Pe\u010dliv\u011b prostudujte v\u00fd\u0161e uveden\u00e9 v\u00fdjimky a kontaktujte t\u00fdm IcedTea-Web. SSigUnverified=Digit\u00e1ln\u00ed podpis aplikace nelze ov\u011b\u0159it. Chcete aplikaci spustit? Aplikace z\u00edsk\u00e1 neomezen\u00fd p\u0159\u00edstup k va\u0161emu po\u010d\u00edta\u010di. SSigVerified=Digit\u00e1ln\u00ed podpis aplikace byl ov\u011b\u0159en. Chcete aplikaci spustit? Aplikace z\u00edsk\u00e1 neomezen\u00fd p\u0159\u00edstup k va\u0161emu po\u010d\u00edta\u010di. SSignatureError=Digit\u00e1ln\u00ed podpis aplikace obsahuje chybu. Chcete aplikaci spustit? Aplikace z\u00edsk\u00e1 neomezen\u00fd p\u0159\u00edstup k va\u0161emu po\u010d\u00edta\u010di. SUntrustedSource=Digit\u00e1ln\u00ed podpis nelze ov\u011b\u0159it pomoc\u00ed d\u016fv\u011bryhodn\u00e9ho zdroje. Aplikaci spus\u0165te, pouze pokud v\u011b\u0159\u00edte p\u016fvodu aplikace. SWarnFullPermissionsIgnorePolicy=Spou\u0161t\u011bn\u00e9mu k\u00f3du budou ud\u011blena pln\u00e1 opr\u00e1vn\u011bn\u00ed bez ohledu na p\u0159\u00edpadn\u00e1 va\u0161e vlastn\u00ed z\u00e1sady chov\u00e1n\u00ed prost\u0159ed\u00ed Java. STrustedSource=Digit\u00e1ln\u00ed podpis byl ov\u011b\u0159en pomoc\u00ed d\u016fv\u011bryhodn\u00e9ho zdroje. SClipboardReadAccess=Aplikace po\u017eaduje p\u0159\u00edstup ke \u010dten\u00ed syst\u00e9mov\u00e9 schr\u00e1nky. Chcete tuto akci povolit? SClipboardWriteAccess=Aplikace vy\u017eaduje p\u0159\u00edstup k zapisov\u00e1n\u00ed do syst\u00e9mov\u00e9 schr\u00e1nky. Chcete tuto akci povolit? SPrinterAccess=Aplikace vy\u017eaduje p\u0159\u00edstup k tisk\u00e1rn\u011b. Chcete tuto akci povolit? SNetworkAccess=Aplikace vy\u017eaduje povolen\u00ed k vytvo\u0159en\u00ed spojen\u00ed s {0}. Chcete tuto akci povolit? SNoAssociatedCertificate=<\u017e\u00e1dn\u00fd p\u0159idru\u017een\u00fd certifik\u00e1t> SUnverified=(neov\u011b\u0159eno) SAlwaysTrustPublisher=V\u017edy d\u016fv\u011b\u0159ovat obsahu od tohoto vydavatele SHttpsUnverified=Certifik\u00e1t HTTPS webu nelze ov\u011b\u0159it. SRememberOption=Zapamatovat si tuto volbu? SRememberAppletOnly=Pro aplet SRememberCodebase=Pro web {0} SUnsignedSummary=Do\u0161lo k pokusu o spu\u0161t\u011bn\u00ed nepodepsan\u00e9 aplikace Java. SUnsignedDetail=Do\u0161lo k pokusu o spu\u0161t\u011bn\u00ed nepodepsan\u00e9 aplikace z n\u00e1sleduj\u00edc\u00edho um\u00edst\u011bn\u00ed:
    \u00a0\u00a0{0}
    Str\u00e1nka, kter\u00e1 p\u0159edala tento po\u017eadavek:
    \u00a0\u00a0{1}

    Doporu\u010dujeme, abyste spou\u0161t\u011bli aplikace pouze z web\u016f, kter\u00fdm d\u016fv\u011b\u0159ujete. SUnsignedAllowedBefore=Tento aplet jste ji\u017e d\u0159\u00edve povolili ({0}). SUnsignedRejectedBefore=Tento aplet jste ji\u017e d\u0159\u00edve odm\u00edtli ({0}). SUnsignedQuestion=Povolit spu\u0161t\u011bn\u00ed apletu? SPartiallySignedSummary=Podeps\u00e1ny jsou jen \u010d\u00e1sti k\u00f3du t\u00e9to aplikace. SPartiallySignedDetail=Tato aplikace obsahuje podepsan\u00fd i nepodepsan\u00fd k\u00f3d. Podepsan\u00fd k\u00f3d je bezpe\u010dn\u00fd, pokud d\u016fv\u011b\u0159ujete poskytovateli tohoto k\u00f3du. Nepodepsan\u00e9 \u010d\u00e1sti v\u0161ak mohou obsahovat k\u00f3d, kter\u00fd nen\u00ed pod kontrolou d\u016fv\u011bryhodn\u00e9ho poskytovatele. SPartiallySignedQuestion=Chcete p\u0159esto pokra\u010dovat a spustit aplikaci? SAuthenticationPrompt=Server {0} na adrese {1} vy\u017eaduje ov\u011b\u0159en\u00ed. Zpr\u00e1va: \u201e{2}\u201c SJNLPFileIsNotSigned=Tato aplikace obsahuje digit\u00e1ln\u00ed podpis, v r\u00e1mci kter\u00e9ho v\u0161ak nen\u00ed podeps\u00e1n spou\u0161t\u011bn\u00fd soubor JNLP. STrustedOnlyAttributeFailure=Element \u201etrusted-only\u201c v manifestu aplikace m\u00e1 hodnotu true. {0} a po\u017eaduje n\u00e1sleduj\u00edc\u00ed \u00farove\u0148 opr\u00e1vn\u011bn\u00ed: {1}. To nen\u00ed dovoleno. STOAsignedMsgFully = Aplet je kompletn\u011b podepsan\u00fd. STOAsignedMsgAndSandbox = Aplet je kompletn\u011b podepsan\u00fd a spou\u0161t\u00ed se v izolovan\u00e9m prostoru (sandbox). STOAsignedMsgPartiall = Aplet nen\u00ed kompletn\u011b podepsan\u00fd. STempNetwork=Povolit p\u0159\u00edchoz\u00ed a odchoz\u00ed s\u00ed\u0165ov\u00e1 p\u0159ipojen\u00ed STempReadFilesAndProperties=Opr\u00e1vn\u011bn\u00ed pouze ke \u010dten\u00ed ke v\u0161em soubor\u016fm a vlastnostem STempWriteFilesAndProperties=Opr\u00e1vn\u011bn\u00ed pouze k z\u00e1pisu ke v\u0161em soubor\u016fm a vlastnostem STempReflectionAndExternal=P\u0159\u00edstup k Java Reflection a extern\u00edmu k\u00f3du STempAllMedia=V\u0161echna m\u00e9dia (p\u0159\u00edstup k tisku, audiu, schr\u00e1nce) # Security - used for the More Information dialog SBadKeyUsage=Zdroj obsahuje polo\u017eky, u nich\u017e roz\u0161\u00ed\u0159en\u00ed pou\u017eit\u00ed kl\u00ed\u010de KeyUsage certifik\u00e1tu podepisovatele nedovoluje podeps\u00e1n\u00ed k\u00f3du. SBadExtendedKeyUsage=Zdroj obsahuje polo\u017eky, u nich\u017e roz\u0161\u00ed\u0159en\u00ed pou\u017eit\u00ed kl\u00ed\u010de ExtendedKeyUsage certifik\u00e1tu podepisovatele nedovoluje podeps\u00e1n\u00ed k\u00f3du. SBadNetscapeCertType=Zdroj obsahuje polo\u017eky, u nich\u017e roz\u0161\u00ed\u0159en\u00ed pou\u017eit\u00ed kl\u00ed\u010de NetscapeCertType certifik\u00e1tu podepisovatele nedovoluje podeps\u00e1n\u00ed k\u00f3du. SHasExpiredCert=Platnost digit\u00e1ln\u00edho podpisu vypr\u0161ela. SHasExpiringCert=Zdroje obsahuj\u00ed polo\u017eky, u nich\u017e vypr\u0161\u00ed platnost certifik\u00e1tu jejich podepisovatele do \u0161esti m\u011bs\u00edc\u016f. SNotYetValidCert=Zdroje obsahuj\u00ed polo\u017eky, u nich\u017e je\u0161t\u011b nen\u00ed platn\u00fd certifik\u00e1t podepisovatele. SUntrustedCertificate=Digit\u00e1ln\u00ed podpis byl vytvo\u0159en pomoc\u00ed ned\u016fv\u011bryhodn\u00e9ho certifik\u00e1tu. STrustedCertificate=Digit\u00e1ln\u00ed podpis byl vytvo\u0159en pomoc\u00ed d\u016fv\u011bryhodn\u00e9ho certifik\u00e1tu. SCNMisMatch=O\u010dek\u00e1van\u00fd n\u00e1zev hostitele pro tento certifik\u00e1t je: {0}.
    Adresa, ke kter\u00e9 se navazuje p\u0159ipojen\u00ed: {1}. SRunWithoutRestrictions=Tato aplikace bude spu\u0161t\u011bna bez obvykl\u00fdch bezpe\u010dnostn\u00edch omezen\u00ed aplikovan\u00fdch platformou Java. SCertificateDetails=Podrobnosti certifik\u00e1tu # Security - certificate information SIssuer=Vydavatel SSerial=S\u00e9riov\u00e9 \u010d\u00edslo SMD5Fingerprint=Otisk MD5 SSHA1Fingerprint=Otisk SHA1 SSignature=Podpis SSignatureAlgorithm=Algoritmus podpisu SSubject=Subjekt SValidity=Platnost # Certificate Viewer CVCertificateViewer=Certifik\u00e1ty CVCertificateType=Typ certifik\u00e1tu CVDetails=Podrobnosti CVExport=Exportovat CVExportPasswordMessage=Zadejte heslo pro ochranu souboru s kl\u00ed\u010di: CVImport=Importovat CVImportPasswordMessage=Zadejte heslo pro p\u0159\u00edstup k souboru: CVIssuedBy=Vydavatel: CVIssuedTo=P\u0159\u00edjemce: CVPasswordTitle=Vy\u017eadov\u00e1no ov\u011b\u0159en\u00ed CVRemove=Odstranit CVRemoveConfirmMessage=Skute\u010dn\u011b chcete odstranit vybran\u00fd certifik\u00e1t? CVRemoveConfirmTitle=Potvrzen\u00ed odstran\u011bn\u00ed certifik\u00e1tu CVUser=U\u017eivatel CVSystem=Syst\u00e9m # KeyStores: see KeyStores.java KS=\u00dalo\u017ei\u0161t\u011b kl\u00ed\u010d\u016f KSCerts=D\u016fv\u011bryhodn\u00e9 certifik\u00e1ty KSJsseCerts=D\u016fv\u011bryhodn\u00e9 certifik\u00e1ty JSSE KSCaCerts=D\u016fv\u011bryhodn\u00e9 certifik\u00e1ty Root CA KSJsseCaCerts=D\u016fv\u011bryhodn\u00e9 certifik\u00e1ty JSSE Root CA KSClientCerts=Certifik\u00e1ty pro ov\u011b\u0159en\u00ed klienta # KeyStores: set password KSresultUntilNow=P\u0159i operaci s ulo\u017ei\u0161t\u011bm kl\u00ed\u010d\u016f {1} do\u0161lo k v\u00fdjimce {0}. Po\u010det pokus\u016f o odem\u010den\u00ed: {2} KSinvalidPassword=Neplatn\u00e9 heslo? KSheadlesWarning=Zadejte nov\u00e9 heslo a klikn\u011bte na tla\u010d\u00edtko OK. Nebo m\u016f\u017eete opustit tento dialog stisknut\u00edm kl\u00e1vesy Enter na pr\u00e1zdn\u00e9m \u0159\u00e1dku. KSnwPassHelp=Zadejte nov\u00e9 heslo a klikn\u011bte na tla\u010d\u00edtko OK. Nebo m\u016f\u017eete opustit tento dialog zm\u00e1\u010dknut\u00edm jak\u00e9hokoliv jin\u00e9ho tla\u010d\u00edtka. HeadlessDialogues=Zadejte \u201eexit\u201c pro ukon\u010den\u00ed aplikace ITW, nebo zadejte jednu z n\u00ed\u017ee uveden\u00fdch hodnot. Chcete-li, aby si aplikace zapamatovala rozhodnut\u00ed, zadejte p\u0159ed n\u011bj p\u00edsmeno \u201eR\u201c nebo p\u0159\u00edpadn\u011b p\u00edsmena \u201eRC\u201c s platnost\u00ed pro celou z\u00e1kladnu k\u00f3du. AWPstdoutHint1=M\u016f\u017eete zadat YES/NO nebo komplexn\u00ed v\u00fdraz zpracovateln\u00fd pomoc\u00ed funkce AccessWarningPaneComplexReturn.readValue. AWPstdoutHint2=Nap\u0159.: YES,D(not_found_browser,false,null,true,)M(firefox,false,null,false,) AWPstdoutHint3=where: global_answer,desktop_shortcut(browser_bin,fixJnlpHref,type:null_or_one_of{0},really_create)same_for_menu... PAPstdinInfo=Zadejte U\u017dIVATELSK\u00c9 JM\u00c9NO mezera HESLO. Ve jm\u00e9n\u011b nejsou dovoleny mezery. Nen\u00ed podporov\u00e1n \u017e\u00e1dn\u00fd bezpe\u010dnostn\u00ed mechanizmus pro zad\u00e1v\u00e1n\u00ed hesla. Chra\u0148te sv\u016fj monitor p\u0159ed ciz\u00edmi pohledy. HDwrongValue=Pravd\u011bpodobn\u011b \u0161patn\u00e1 hodnota? # HTTP 511 Headless511line0=*** Nalezen\u00e9 adresy URL *** Headless511line1=Nane\u0161t\u011bst\u00ed aplikace ITW p\u0159\u00edmo nepodporuje hl\u00e1\u0161en\u00ed 511 v re\u017eimu bez grafick\u00e9ho rozhran\u00ed. Headless511line2=Jedna z v\u00fd\u0161e uveden\u00fdch adres URL, pokud ji nav\u0161t\u00edv\u00edte pomoc\u00ed jin\u00e9ho programu, v\u00e1m pom\u016f\u017ee vy\u0159e\u0161it v\u00e1\u0161 probl\u00e9m s ov\u011b\u0159ov\u00e1n\u00edm. Pak zadejte odpov\u011b\u010f. Headless511line3=Pokud jste zoufal\u00ed, zkuste v re\u017eimu bez grafick\u00e9ho rozhran\u00ed konzolov\u00fd prohl\u00ed\u017ee\u010d Lynx, v grafick\u00e9m rozhran\u00ed ov\u0161em v re\u017eimu bez prohl\u00ed\u017ee\u010de zkuste \u201ejavaws {0}\u201c dostupn\u00fd v ITW. Exit511=Ukon\u010dit aplikaci IcedTea-Web Ignore511=Ignorovat toto sezen\u00ed Header511=

    HTTP 511 \u2013 Network Authentication Required (vy\u017eadov\u00e1no ov\u011b\u0159en\u00ed v s\u00edti)

    M\u016f\u017eete vyplnit formul\u00e1\u0159 n\u00ed\u017ee nebo m\u016f\u017eete zkusit odkazy na druh\u00e9 kart\u011b a pokra\u010dovat v prohl\u00ed\u017ee\u010di

    What is 511 Network Authentication Required # Browser BrowserGoTo=P\u0159ej\u00edt na: BrowserSource=Zdroj BrowserSocket=Pou\u017e\u00edt p\u0159\u00edm\u00e9 spojen\u00ed na soket BrowserSocketHelp=Pokud je tato mo\u017enost pou\u017eita, otev\u0159e se p\u0159\u00edm\u00e9 spojen\u00ed adresy URL na soket. M\u016f\u017eete vid\u011bt hlavi\u010dky a jin\u00e9 podivn\u00e9 v\u011bci.
    N\u011bkter\u00e1 spojen\u00ed v\u0161ak mohou neo\u010dek\u00e1van\u011b selhat. BrowserOpenExternal=Otev\u0159\u00edt v extern\u00edm prohl\u00ed\u017ee\u010di BrowserOpeninternal=Otev\u0159\u00edt v integrovan\u00e9m prohl\u00ed\u017ee\u010di BrowserCopyUrlToClip=Kop\u00edrovat do schr\u00e1nky BrowserClearAll=Vy\u010distit v\u0161e BrowserWarningLine1=VAROV\u00c1N\u00cd: Toto je prohl\u00ed\u017ee\u010d podporuj\u00edc\u00ed HTML verzi 3.2. Nen\u00ed ur\u010den k b\u011b\u017en\u00e9mu prohl\u00ed\u017een\u00ed web\u016f! BrowserWarningLine2=Je poskytov\u00e1n bez jak\u00fdchkoliv z\u00e1ruk! BrowserArg=Spus\u0165te integrovan\u00fd prohl\u00ed\u017ee\u010d. Pou\u017eijte ho jen ve stavu nouze! # Deployment Configuration messages DCIncorrectValue=Vlastnost {0} m\u00e1 nespr\u00e1vnou hodnotu {1}. Mo\u017en\u00e9 hodnoty {2}. DCInternal=Vnit\u0159n\u00ed chyba: {0} DCSourceInternal= DCUnknownSettingWithName=Vlastnost {0} je nezn\u00e1m\u00e1. DCmaindircheckNotexists=P\u0159es v\u0161echny pokusy nebyl v\u00e1\u0161 konfigura\u010dn\u00ed adres\u00e1\u0159 {0} nalezen. DCmaindircheckNotdir=V\u00e1\u0161 konfigura\u010dn\u00ed adres\u00e1\u0159 {0} nen\u00ed adres\u00e1\u0159. DCmaindircheckRwproblem=V\u00e1\u0161 konfigura\u010dn\u00ed adres\u00e1\u0159 {0} nen\u00ed mo\u017en\u00e9 spr\u00e1vn\u011b \u010d\u00edst ani do n\u011bj zapisovat. # Value Validator messages. Messages should follow "Possible values ..." VVRustCpModifiers=Pouze pro spou\u0161t\u011b\u010de nativn\u00ed pro jazyk Rust! Vlastnosti CP a XbootCP jsou mezerou odd\u011blen\u00e9 \u010dleny bootcp/cp, kter\u00e9 se maj\u00ed odebrat nebo p\u0159idat. Nap\u0159. '...cp.add=/usr/java/rhino.jar /usr/java/scary.jar' p\u0159id\u00e1 uveden\u00e9 dva soubory JAR do cp. Nap\u0159.: '...bootcp.remove=rhino.jar tagsoup.jar' odstran\u00ed uveden\u00e9 dva soubory JAR bez ohledu na cestu. Odstran\u011bn\u00ed prob\u011bhne jako prvn\u00ed. VVPossibleValues=Mo\u017en\u00e9 hodnoty {0} VVPossibleBooleanValues=jsou {0} nebo {1}. VVPossibleFileValues=obsahuj\u00ed absolutn\u00ed um\u00edst\u011bn\u00ed souboru nebo adres\u00e1\u0159e. VVPossibleRangedIntegerValues=jsou v rozmez\u00ed {0} a\u017e {1} (v\u010detn\u011b). VVPossibleUrlValues=obsahuj\u00ed jakoukoliv platnou adresu URL (nap\u0159. http://icedtea.classpath.org/hg/). VVPossibleBrowserValues=Nastaven\u00ed cesty k prohl\u00ed\u017ee\u010di nebo jak\u00e9hokoli jin\u00e9ho p\u0159\u00edkazu ke spu\u0161t\u011bn\u00ed adresy URL. Pokud nen\u00ed nastavena, pou\u017eije se v\u00fdchoz\u00ed prohl\u00ed\u017ee\u010d. Pokud nen\u00ed v\u00fdchoz\u00ed prohl\u00ed\u017ee\u010d k dispozici, budete vyzv\u00e1ni k zad\u00e1n\u00ed aplikace, kter\u00e1 adresu URL zpracuje. Nap\u0159.: p\u0159\u00edkazy jako firefox nebo (pro Windows) {0}, microsoft-edge, (pro Mac) safari, (pro Linux) xdg-open. V re\u017eimu bez grafick\u00e9ho rozhran\u00ed m\u016f\u017eete pou\u017e\u00edt wget, curl nebo Lynx. Soubory JNLP m\u016f\u017eou b\u00fdt spu\u0161t\u011bny tak\u00e9 prost\u0159ednictv\u00edm javaws. Sv\u016fj vlastn\u00ed prohl\u00ed\u017ee\u010d m\u016f\u017eete nastavit pomoc\u00ed vlastnosti {4}. K tomuto \u00fa\u010delu slou\u017e\u00ed prom\u011bnn\u00e1 prost\u0159ed\u00ed ${1}. Intern\u00ed prohl\u00ed\u017ee\u010d m\u016f\u017eete spustit pomoc\u00ed kl\u00ed\u010dov\u00e9ho slova {2}. Ov\u0161em nedoporu\u010dujeme to. Je to hrozn\u00fd postup. Chcete-li m\u00edsto v\u00fdchoz\u00edch nastaven\u00ed poka\u017ed\u00e9 vynutit pou\u017eit\u00ed p\u0159\u00edkazov\u00e9ho \u0159\u00e1dku, pou\u017eijte {3}. VVBrowserVerificationPass=Ov\u011b\u0159en\u00ed prob\u011bhlo v po\u0159\u00e1dku: {0} VVBrowserVerificationFail=Ov\u011b\u0159en\u00ed selhalo. Viz p\u0159\u00edklady. VVBrowserSaveNotAllowed=Pro kl\u00ed\u010d {1} jste nastavili hodnotu {0}. Hodnotu nelze p\u0159epsat. VVBrowserSaveAllowed=V\u00e1\u0161 v\u00fdb\u011br bude ulo\u017een jako {0}. # Control Panel - Main CPMainDescriptionShort=Nastaven\u00ed aplikace IcedTea-Web CPMainDescriptionLong=Nastaven\u00ed fungov\u00e1n\u00ed z\u00e1suvn\u00e9ho modulu prohl\u00ed\u017ee\u010de (IcedTeaNPPlugin) a rozhran\u00ed javaws (NetX) # Control Panel - Tab Descriptions CPAboutDescription=Zobrazen\u00ed informace o verzi ovl\u00e1dac\u00edho panelu IcedTea CPNetworkSettingsDescription=Nastaven\u00ed s\u00edt\u011b v\u010detn\u011b zp\u016fsobu p\u0159ipojen\u00ed aplikace IcedTea-Web k Internetu a p\u0159\u00edpadn\u00e9ho pou\u017eit\u00ed proxy server\u016f CPTempInternetFilesDescription=Ukl\u00e1d\u00e1n\u00ed dat aplikac\u00ed prost\u0159ed\u00edm Java, aby bylo p\u0159i p\u0159\u00ed\u0161t\u00edm spu\u0161t\u011bn\u00ed umo\u017en\u011bno rychlej\u0161\u00ed na\u010dten\u00ed CPJRESettingsDescription=Zobrazen\u00ed a spravov\u00e1n\u00ed verze a nastaven\u00ed prost\u0159ed\u00ed Java Runtime Environment pro aplikace a aplety Java CPCertificatesDescription=Pou\u017eit\u00ed certifik\u00e1t\u016f k pozitivn\u00ed identifikaci v\u00e1s, certifikac\u00ed, certifika\u010dn\u00edch autorit a vydavatel\u016f CPSecurityDescription=Konfigurace nastaven\u00ed zabezpe\u010den\u00ed CPDebuggingDescription=Zapnut\u00ed mo\u017enost\u00ed pom\u00e1haj\u00edc\u00edch p\u0159i lad\u011bn\u00ed CPDesktopIntegrationDescription=Nastaven\u00ed, zda m\u00e1 b\u00fdt povoleno vytvo\u0159en\u00ed z\u00e1stupce na plo\u0161e CPDesktopIntegrationShowIntegrations=Zobrazen\u00ed okna integrace s pracovn\u00ed plochou a nab\u00eddkami. CPDesktopIntegrationLinuxOnly=Spr\u00e1vce integrace s pracovn\u00ed plochou je k dispozici pouze pro opera\u010dn\u00ed syst\u00e9m Linux. CPJVMPluginArguments=Nastaven\u00ed parametr\u016f prost\u0159ed\u00ed JVM pro z\u00e1suvn\u00fd modul CPJVMitwExec=Nastaven\u00ed prost\u0159ed\u00ed JVM pro aplikaci IcedTea-Web (pracuje nejl\u00e9pe s prost\u0159ed\u00edm OpenJDK) CPJVMitwExecValidation=Ov\u011b\u0159en\u00ed prost\u0159ed\u00ed JVM pro aplikaci IcedTea-Web CPJVMPluginSelectExec=Vyhledat prost\u0159ed\u00ed JVM pro aplikaci IcedTea-Web CPJVMnone=\u017d\u00e1dn\u00e9 v\u00fdsledky ov\u011b\u0159en\u00ed pro cestu CPJVMvalidated=V\u00fdsledky ov\u011b\u0159en\u00ed pro cestu CPJVMvalueNotSet=Hodnota nen\u00ed nastavena. Bude pou\u017eito p\u0159edvolen\u00e9 prost\u0159ed\u00ed JVM. CPJVMnotLaunched=Chyba: proces nebyl spu\u0161t\u011bn. V\u00edce informac\u00ed naleznete ve v\u00fdstupu konzole. CPJVMnoSuccess=Chyba: proces nebyl \u00fasp\u011b\u0161n\u011b ukon\u010den. Podrobnosti naleznete ve v\u00fdstupu konzole, av\u0161ak va\u0161e prost\u0159ed\u00ed Java nen\u00ed spr\u00e1vn\u011b nastaveno. CPJVMopenJdkFound=Super! Bylo detekov\u00e1no prost\u0159ed\u00ed OpenJDK. CPJVMjdk5=Rozpozn\u00e1no prost\u0159ed\u00ed JDK 5. Prost\u0159ed\u00ed JDK 7 a star\u0161\u00ed ji\u017e nejsou podporov\u00e1na. CPJVMjdk6=Rozpozn\u00e1no prost\u0159ed\u00ed JDK 6. Prost\u0159ed\u00ed JDK 7 a star\u0161\u00ed ji\u017e nejsou podporov\u00e1na. CPJVMjdk7=Rozpozn\u00e1no prost\u0159ed\u00ed JDK 7. Prost\u0159ed\u00ed JDK 7 a star\u0161\u00ed ji\u017e nejsou podporov\u00e1na. CPJVMjdk8=Rozpozn\u00e1no prost\u0159ed\u00ed JDK 8. Prost\u0159ed\u00ed JDK 8 a nov\u011bj\u0161\u00ed jsou podporov\u00e1na. CPJVMjdk9=Rozpozn\u00e1no prost\u0159ed\u00ed JDK9 nebo nov\u011bj\u0161\u00ed. Prost\u0159ed\u00ed JDK 8 a nov\u011bj\u0161\u00ed jsou podporov\u00e1na. Prost\u0159ed\u00ed JDK 9 m\u016f\u017ee m\u00edt probl\u00e9my s modularitou. CPJVMjdk=Nezn\u00e1m\u00e1 verze. T\u011b\u017eko \u0159\u00edci, zda je podporovan\u00e1. Chcete-li zjistit skute\u010dnou verzi, pod\u00edvejte se na popisek okna nebo standardn\u00ed v\u00fdstup v konzoli (z\u00e1le\u017e\u00ed na \u00farovni podrobnost\u00ed v\u00fdstupu). CPJVMoracleFound=V\u00fdborn\u011b! Bylo detekov\u00e1no prost\u0159ed\u00ed Oracle Java. CPJVMibmFound=Dob\u0159e! Bylo detekov\u00e1no prost\u0159ed\u00ed IBM Java. CPJVMgijFound=Varov\u00e1n\u00ed! Bylo detekov\u00e1no prost\u0159ed\u00ed gij. CPJVMstrangeProcess=Zadan\u00e1 cesta je spustiteln\u00fd proces, ov\u0161em nebyl rozpozn\u00e1n jako aplikace Java. Ve v\u00fdstupu konzole ov\u011b\u0159te verzi prost\u0159ed\u00ed Java. CPJVMnotDir=Chyba: cesta, kterou jste vybrali, nen\u00ed adres\u00e1\u0159. CPJVMisDir=OK, cesta, kterou jste vybrali, je adres\u00e1\u0159. CPJVMnoJava=Chyba: adres\u00e1\u0159, kter\u00fd jste vybrali, neobsahuje podadres\u00e1\u0159 a soubor \u201ebin/java\u201c. CPJVMjava=OK, adres\u00e1\u0159, kter\u00fd jste vybrali, obsahuje podadres\u00e1\u0159 a soubor \u201ebin/java\u201c. CPJVMnoRtJar=Chyba: adres\u00e1\u0159, kter\u00fd jste vybrali, neobsahuje podadres\u00e1\u0159 a soubor \u201elib/rt.jar\u201c. CPJVMrtJar=OK, adres\u00e1\u0159, kter\u00fd jste vybrali, obsahuje podadres\u00e1\u0159 a soubor \u201elib/rt.jar\u201c. CPJVMPluginAllowTTValidation=Ov\u011b\u0159it prost\u0159ed\u00ed JRE ihned CPJVMNotokMessage1=Zadali jste neplatnou hodnotu
    • ({0})
    prost\u0159ed\u00ed JDK. Chybov\u00e1 zpr\u00e1va: CPJVMNotokMessage2=Tuto zpr\u00e1vu vid\u00edte pravd\u011bpodobn\u011b proto\u017ee:
    * V\u00e1\u0161 syst\u00e9m nepro\u0161el n\u011bkter\u00fdm z ov\u011b\u0159ovac\u00edch test\u016f
    * Bylo detekov\u00e1no jin\u00e9 prost\u0159ed\u00ed ne\u017e OpenJDK
    S neplatn\u00fdm prost\u0159ed\u00edm JDK nebude se pravd\u011bpodobn\u011b nebude aplikace IcedTea-Web schopna spustit.
    Pokud havaruje, budete muset upravit nebo odstranit vlastnost {0} ve va\u0161em konfigura\u010dn\u00edm souboru.
    • {1}
    M\u011bli byste d\u016fv\u011b\u0159ovat sv\u00fdm administr\u00e1tor\u016fm nebo aspo\u0148 zkusit ve sv\u00e9m syst\u00e9mu nal\u00e9zt prost\u0159ed\u00ed OpenJDK, nebo byste m\u011bli dob\u0159e v\u011bd\u011bt, co d\u011bl\u00e1te. CPJVMconfirmInvalidJdkTitle=Potvrzen\u00ed neplatn\u00e9ho prost\u0159ed\u00ed JDK CPJVMconfirmReset=Obnovit v\u00fdchoz\u00ed nastaven\u00ed? CPPolicyDetail=Zobrazen\u00ed nebo upravov\u00e1n\u00ed va\u0161eho u\u017eivatelsk\u00e9ho souboru se z\u00e1sadami prost\u0159ed\u00ed Java: Toto nastaven\u00ed v\u00e1m umo\u017en\u00ed ud\u011blit nebo odep\u0159\u00edt opr\u00e1vn\u011bn\u00ed modulu runtime pro aplet bez ohledu na standardn\u00ed bezpe\u010dnostn\u00ed pravidla pro pr\u00e1ci v izolovan\u00e9m prostoru (sandbox). CPPolicyTooltip=Otev\u0159\u00edt soubor {0} v n\u00e1stroji PolicyEditor. CPPolicyEditorNotFound=Nelze nal\u00e9zt editor pro tvorbu souboru syst\u00e9mov\u00fdch z\u00e1sad. Zkontrolujte, zda je n\u00e1stroj Policy Tool dosa\u017eiteln\u00fd z PATH. # Control Panel - Buttons CPButAbout=O aplikaci IcedTea-Web CPButNetworkSettings=Nastaven\u00ed s\u00edt\u011b... CPButSettings=Nastaven\u00ed... CPButView=Zobrazit... CPButCertificates=Certifik\u00e1ty... CPButSimpleEditor=Jednoduch\u00fd editor CPButAdvancedEditor=Roz\u0161\u00ed\u0159en\u00fd editor # Control Panel - Headers CPHead=Ovl\u00e1dac\u00ed panel IcedTea-Web CPHeadAbout=\u00a0O aplikaci IcedTea-Web\u00a0 CPHeadNetworkSettings=\u00a0Nastaven\u00ed proxy server\u016f s\u00edt\u011b\u00a0 CPHeadTempInternetFiles=\u00a0Do\u010dasn\u00e9 soubory Internetu\u00a0 CPHeadJRESettings=\u00a0Nastaven\u00ed prost\u0159ed\u00ed Java Runtime Environment\u00a0 CPHeadCertificates=\u00a0Certifik\u00e1ty\u00a0 CPHeadDebugging=\u00a0Nastaven\u00ed lad\u011bn\u00ed\u00a0 CPHeadDesktopIntegration=\u00a0Integrace s pracovn\u00ed plochou\u00a0 CPHeadSecurity=\u00a0Nastaven\u00ed zabezpe\u010den\u00ed\u00a0 CPHeadJVMSettings=\u00a0Nastaven\u00ed JVM\u00a0 CPHeadPolicy=\u00a0Vlastn\u00ed nastaven\u00ed z\u00e1sad\u00a0 # Control Panel - Tabs CPTabAbout=O aplikaci IcedTea-Web CPTabCache=Vyrovn\u00e1vac\u00ed pam\u011b\u0165 CPTabCertificate=Certifik\u00e1ty CPTabClassLoader=Zavad\u011b\u010de t\u0159\u00edd CPTabDebugging=Lad\u011bn\u00ed CPTabDesktopIntegration=Integrace s pracovn\u00ed plochou CPTabMenuShortcuts=Spr\u00e1va nainstalovan\u00fdch m\u00edstn\u00edch nab\u00eddek a z\u00e1stupc\u016f CPTabNetwork=S\u00ed\u0165 CPTabRuntimes=Moduly runtime CPTabSecurity=Zabezpe\u010den\u00ed CPTabJVMSettings=Nastaven\u00ed JVM CPTabPolicy=Nastaven\u00ed z\u00e1sad # Control Panel - AboutPanel CPAboutInfo=Toto je ovl\u00e1dac\u00ed panel umo\u017e\u0148uj\u00edc\u00ed \u00fapravu nastaven\u00ed v souboru deployment.properties.
    Dokud nebudou implementov\u00e1ny v\u0161echny funkce, n\u011bkter\u00e9 z nich nebudou aktivn\u00ed.
    V sou\u010dasnosti je pou\u017e\u00edv\u00e1n\u00ed v\u00edce prost\u0159ed\u00ed JRE omezeno na OpenJDK.
    # Control Panel - AdvancedProxySettings APSDialogTitle=Nastaven\u00ed s\u00edt\u011b APSServersPanel=Servery APSProxyTypeLabel=Typ APSProxyAddressLabel=Adresa proxy serveru APSProxyPortLabel=Port proxy serveru APSLabelHTTP=HTTP APSLabelSecure=Zabezpe\u010den\u00fd APSLabelFTP=FTP APSLabelSocks=Socks APSSameProxyForAllProtocols=Pou\u017e\u00edt stejn\u00fd proxy server pro v\u0161echny protokoly APSExceptionsLabel=V\u00fdjimky APSExceptionsDescription=Nepou\u017e\u00edvat proxy server pro adresy za\u010d\u00ednaj\u00edc\u00ed na APSExceptionInstruction=Odd\u011blte ka\u017edou polo\u017eku st\u0159edn\u00edkem. # Control Panel - DebugginPanel CPDebuggingPossibilites=V\u00fdstupy protokolov\u00e1n\u00ed DPEnableLogging=Zapnout lad\u011bn\u00ed DPEnableLoggingHint=Kdy\u017e je tento p\u0159ep\u00edna\u010d zapnut\u00fd, jsou protokolov\u00e1ny tak\u00e9 zpr\u00e1vy z lad\u011bn\u00ed. Ekvivalent pou\u017eit\u00ed p\u0159ep\u00edna\u010de -verbose nebo pou\u017eit\u00ed nastaven\u00ed ICEDTEAPLUGIN_DEBUG=true. DPEnableHeaders=Povolit hlavi\u010dky DPEnableHeadersHint=Kdy\u017e je tento p\u0159ep\u00edna\u010d zapnut\u00fd, ka\u017ed\u00e1 zaprotokolovan\u00e1 zpr\u00e1va m\u00e1 hlavi\u010dku s dodate\u010dn\u00fdmi informacemi, jako jsou nap\u0159\u00edklad podrobnosti o u\u017eivateli, um\u00edst\u011bn\u00ed v k\u00f3du a \u010dasu. DPEnableFile=Zapnout protokolov\u00e1n\u00ed do souboru DPEnableLegacyFileLog=Nezapisujte p\u0159\u00edmo do souboru, m\u00edsto toho pou\u017eijte funkce bal\u00ed\u010dku java.util.logging. DPEnableClientAppFileLogging=Pro klientsk\u00e9 aplikace poskytuje i v\u00fdstup do souboru. DPEnableLegacyFileLogHint=java.util.logging ve v\u00fdjime\u010dn\u00fdch p\u0159\u00edpadech zp\u016fsobuje zablokov\u00e1n\u00ed u aplikac\u00ed s vlastn\u00edmi protokolovac\u00edmi roz\u0161\u00ed\u0159en\u00edmi. DPEnableClientAppFileLoggingHint=Protokolov\u00e1n\u00ed u klientsk\u00fdch aplikac\u00ed ob\u010das s bal\u00ed\u010dkem java.util.logging nefunguje. CPFilesLogsDestDir=Adres\u00e1\u0159 pro souborov\u00e9 protokoly CPFilesLogsDestDirResert=Obnovit v\u00fdchoz\u00ed nastaven\u00ed DPEnableFileHint=Zpr\u00e1vy v\u00fdstupu budou ulo\u017eeny do souboru v adres\u00e1\u0159i {0}. DPEnableStds=Zapnout protokolov\u00e1n\u00ed na standardn\u00ed v\u00fdstupy DPEnableStdsHint=Zpr\u00e1vy budou vyps\u00e1ny na standardn\u00edch v\u00fdstupech. DPEnableSyslog=Zapnout protokolov\u00e1n\u00ed do syst\u00e9mov\u00fdch protokol\u016f DPEnableSyslogHint=Zpr\u00e1vy v\u00fdstupu budou ulo\u017eeny do syst\u00e9mov\u00fdch protokol\u016f. DPDisable=Vypnout DPHide=Skr\u00fdt p\u0159i spou\u0161t\u011bn\u00ed DPShow=Zobrazit p\u0159i spou\u0161t\u011bn\u00ed DPShowPluginOnly=Zobrazit p\u0159i spou\u0161t\u011bn\u00ed z\u00e1suvn\u00e9ho modulu DPShowJavawsOnly=Zobrazit p\u0159i spou\u0161t\u011bn\u00ed javaws DPJavaConsole=Konzola Java DPJavaConsoleDisabledHint=Konzola Java je vypnuta. Pomoc\u00ed programu itw-settings ji m\u016f\u017eete zapnout a nastavit jej\u00ed zobrazov\u00e1n\u00ed/nezobrazov\u00e1n\u00ed po startu. # PolicyEditor PETitle=PolicyEditor PETitleWithPath=PolicyEditor \u2013 {0} PETitleWithChangesMade={0} * PEReadProps=\u010cten\u00ed syst\u00e9mov\u00fdch vlastnosti PEReadPropsDetail=Povol\u00ed aplet\u016fm \u010d\u00edst syst\u00e9mov\u00e9 vlastnosti, jako jen va\u0161e u\u017eivatelsk\u00e9 jm\u00e9no a um\u00edst\u011bn\u00ed domovsk\u00e9ho adres\u00e1\u0159e. PEWriteProps=Z\u00e1pis do syst\u00e9mov\u00fdch vlastnost\u00ed PEWritePropsDetail=Povol\u00ed aplet\u016fm zapisovat do syst\u00e9mov\u00fdch vlastnost\u00ed (nebo je p\u0159episovat). PEReadFiles=\u010cten\u00ed z lok\u00e1ln\u00edch soubor\u016f PEReadFilesDetail=Povol\u00ed aplet\u016fm \u010d\u00edst ze soubor\u016f ve va\u0161em domovsk\u00e9m adres\u00e1\u0159i. PEWriteFiles=Z\u00e1pis do lok\u00e1ln\u00edch soubor\u016f PEWriteFilesDetail=Povol\u00ed aplet\u016fm zapisovat do soubor\u016f ve va\u0161em domovsk\u00e9m adres\u00e1\u0159i. PEDeleteFiles=Maz\u00e1n\u00ed m\u00edstn\u00edch soubor\u016f PEDeleteFilesDetail=Povol\u00ed aplet\u016fm mazat soubory ve va\u0161em domovsk\u00e9m adres\u00e1\u0159i. PEReadSystemFiles=\u010cten\u00ed v\u0161ech syst\u00e9mov\u00fdch soubor\u016f PEReadSystemFilesDetail=Povol\u00ed aplet\u016fm p\u0159istupovat ke v\u0161em um\u00edst\u011bn\u00edm ve va\u0161em po\u010d\u00edta\u010di v re\u017eimu pro \u010dten\u00ed. PEWriteSystemFiles=Z\u00e1pis do v\u0161ech syst\u00e9mov\u00fdch soubor\u016f PEWriteSystemFilesDetail=Povol\u00ed aplet\u016fm zapisovat do v\u0161ech um\u00edst\u011bn\u00ed ve va\u0161em po\u010d\u00edta\u010di. PEReadTempFiles=\u010cten\u00ed z do\u010dasn\u00fdch soubor\u016f PEReadTempFilesDetail=Povol\u00ed aplet\u016fm \u010d\u00edst z adres\u00e1\u0159e s do\u010dasn\u00fdmi soubory. PEWriteTempFiles=Z\u00e1pis do do\u010dasn\u00fdch soubor\u016f PEWriteTempFilesDetail=Povol\u00ed aplet\u016fm zapisovat do adres\u00e1\u0159e s do\u010dasn\u00fdmi soubory. PEDeleteTempFiles=Maz\u00e1n\u00ed do\u010dasn\u00fdch soubor\u016f PEDeleteTempFilesDetail=Povol\u00ed aplet\u016fm mazat soubory v adres\u00e1\u0159i s do\u010dasn\u00fdmi soubory. PEAWTPermission=P\u0159\u00edstup k okenn\u00edmu syst\u00e9mu PEAWTPermissionDetail=Povol\u00ed aplet\u016fm p\u0159\u00edstup ke v\u0161em funkc\u00edm sady n\u00e1stroj\u016f AWT (Abstract Window Toolkit) PEClipboard=P\u0159\u00edstup do schr\u00e1nky PEClipboardDetail=Povol\u00ed aplet\u016fm \u010d\u00edst a zapisovat ve schr\u00e1nce. PENetwork=P\u0159\u00edstup k s\u00edti PENetworkDetail=Povol\u00ed aplet\u016fm navazovat jak\u00e1koli s\u00ed\u0165ov\u00e1 spojen\u00ed. PEPrint=Tisknut\u00ed dokument\u016f PEPrintDetail=Povol\u00ed aplet\u016fm p\u0159id\u00e1vat \u00falohy do tiskov\u00e9 fronty. PEPlayAudio=P\u0159ehr\u00e1v\u00e1n\u00ed zvuk\u016f PEPlayAudioDetail=Povol\u00ed aplet\u016fm p\u0159ehr\u00e1vat zvuky, nikoliv v\u0161ak zvuky nahr\u00e1vat. PERecordAudio=Nahr\u00e1v\u00e1n\u00ed audia PERecordAudioDetail=Povol\u00ed aplet\u016fm nahr\u00e1vat audio, av\u0161ak nikoli ho op\u011bt p\u0159ehr\u00e1vat. PEReflection=Java Reflection PEReflectionDetail=Povol\u00ed aplet\u016fm p\u0159\u00edstup k Java Reflection API. PEClassLoader=P\u0159\u00edstup k zavad\u011b\u010di t\u0159\u00edd PEClassLoaderDetail=Povol\u00ed aplet\u016fm p\u0159\u00edstup k syst\u00e9mov\u00e9mu zavad\u011b\u010di t\u0159\u00edd (\u010dasto pou\u017e\u00edv\u00e1no s Java Reflection). PEClassInPackage=P\u0159\u00edstup k ostatn\u00edm bal\u00ed\u010dk\u016fm PEClassInPackageDetail=Povol\u00ed aplet\u016fm p\u0159\u00edstup k t\u0159\u00edd\u00e1m ostatn\u00edch bal\u00ed\u010dk\u016f aplet\u016f (\u010dasto pou\u017e\u00edv\u00e1no s Java Reflection). PEDeclaredMembers=P\u0159\u00edstup k soukrom\u00fdm dat\u016fm t\u0159\u00edd PEDeclaredMembersDetail=Povol\u00ed aplet\u016fm p\u0159\u00edstup k norm\u00e1ln\u011b skryt\u00fdm dat\u016fm ostatn\u00edch t\u0159\u00edd Java (\u010dasto pou\u017e\u00edv\u00e1no s Java Reflection). PEAccessThreads=Pr\u00e1ce s vl\u00e1kny PEAccessThreadsDetail=Umo\u017en\u00ed aplet\u016fm spou\u0161t\u011bt, zastavovat \u010di jinak spravovat vl\u00e1kna. PEAccessThreadGroups=Pr\u00e1ce se skupinami vl\u00e1ken PEAccessThreadGroupsDetail=Umo\u017en\u00ed aplet\u016fm spou\u0161t\u011bt, zastavovat \u010di jinak spravovat skupiny vl\u00e1ken. PEExec=Spou\u0161t\u011bn\u00ed p\u0159\u00edkaz\u016f PEExecDetail=Umo\u017en\u00ed aplet\u016fm spou\u0161t\u011bt syst\u00e9mov\u00e9 p\u0159\u00edkazy. PEGetEnv=P\u0159\u00edstup k prom\u011bnn\u00fdm prost\u0159ed\u00ed PEGetEnvDetail=Umo\u017en\u00ed aplet\u016fm p\u0159\u00edstup ke \u010dten\u00ed prom\u011bnn\u00fdch syst\u00e9mov\u00e9ho prost\u0159ed\u00ed. PECouldNotOpen=Nelze otev\u0159\u00edt soubor se z\u00e1sadami PECouldNotSave=Nelze ulo\u017eit soubor se z\u00e1sadami PEAddEntry=P\u0159idat novou... PERemoveEntry=Odstranit PEEntryPrompt=Zadejte nov\u00fd identifik\u00e1tor z\u00e1sady. PEAddPrincipal=P\u0159idat objekt Principal PERemovePrincipal=Odstranit objekt Principal PEEditPrincipal=Upravit objekt Principal PEGlobalSettings=V\u0161echny aplety PESaveChanges=Ulo\u017eit zm\u011bny p\u0159ed ukon\u010den\u00edm? PEChangesSaved=Zm\u011bny byly ulo\u017eeny. PECheckboxLabel=Opr\u00e1vn\u011bn\u00ed PEEntriesLabel=Polo\u017eky PEFileMenu=Soubor PENewMenuItem=Nov\u00fd PEOpenMenuItem=Otev\u0159\u00edt... PEOpenDefaultMenuItem=Otev\u0159\u00edt v\u00fdchoz\u00ed soubor se z\u00e1sadami PESaveMenuItem=Ulo\u017eit PESaveAsMenuItem=Ulo\u017eit jako... PEExitMenuItem=Ukon\u010dit PEEntryMenu=Polo\u017eka PEAddEntryItem=P\u0159idat novou... PERemoveEntryItem=Odstranit PEModifySubmenuItem=Upravit PEModifyCodebaseItem=Z\u00e1kladna k\u00f3du (codebase) PEModifySignedByItem=Podepsal PEModifyPrincipalsItem=Objekty Principal PECopyEntryItem=Kop\u00edrovat PEPasteEntryItem=Vlo\u017eit... PEModifyCodebase=Zm\u011bnit z\u00e1kladnu k\u00f3du (codebase) na: PEModifyPrincipals=Upravit objekty Principal: PEModifySignedBy=Pole \u201ePodepsal\u201c zm\u011bn\u011bno na: PEPasteEntry=Zkop\u00edrovan\u00e1 polo\u017eka se z\u00e1kladnou k\u00f3du (codebase): PEViewMenu=Zobrazit PECustomPermissionsItem=Vlastn\u00ed opr\u00e1vn\u011bn\u00ed PECodebaseInputLabel=Adresa URL z\u00e1kladny k\u00f3du (codebase): PESignedByInputLabel=Podepsal: PEPrincipalsInputLabel=Objekty Principal: PEPrincipalClassNameInputLabel=N\u00e1zev t\u0159\u00eddy: PEPrincipalPrincipalNameInputLabel=N\u00e1zev objektu Principal: PEFileModified=Varov\u00e1n\u00ed ohledn\u011b zm\u011bny souboru PEFileModifiedDetail=Soubor se z\u00e1sadami v um\u00edst\u011bn\u00ed {0} byl od posledn\u00edho otev\u0159en\u00ed zm\u011bn\u011bn. Chcete ho p\u0159ed ulo\u017een\u00edm znovu na\u010d\u00edst a upravit? PEFileMissing=Soubor se z\u00e1sadami na disku chyb\u011bl. Byl ulo\u017een nov\u00fd soubor se stejn\u00fdm n\u00e1zvem. PEGAccessUnownedCode=Spou\u0161t\u011bn\u00ed k\u00f3du, kter\u00fd nevlastn\u00edte PEGMediaAccess=P\u0159\u00edstup k m\u00e9di\u00edm PEGRightClick=Polo\u017eky rozbal\u00edte/sbal\u00edte pomoc\u00ed kliknut\u00ed prav\u00fdm tla\u010d\u00edtkem my\u0161i. PEGReadFileSystem=\u010cten\u00ed ze syst\u00e9mu PEGWriteFileSystem=Zapisov\u00e1n\u00ed do syst\u00e9mu PEClipboardError=Zd\u00e1 se, \u017ee schr\u00e1nka neobsahuje pat\u0159i\u010dn\u011b form\u00e1tovan\u00e9 polo\u017eky z\u00e1sad. PEInvalidPolicy=Vlo\u017een\u00ed se nezda\u0159ilo: Ze syst\u00e9mov\u00e9 schr\u00e1nky nebylo mo\u017en\u00e9 p\u0159e\u010d\u00edst z\u00e1sadu pro polo\u017eku {0}. PEInvalidIdentifier=Vypl\u0148te/upravte aspo\u0148 jedno z pol\u00ed. PEIdentifierMatchesAll=Vypl\u0148te/upravte aspo\u0148 jedno z pol\u00ed. PEClipboardAccessError=Nebylo mo\u017en\u00e9 \u010d\u00edst ze schr\u00e1nky. PEDefaultFileFilePathSpecifiedError=M\u016f\u017ee b\u00fdt zad\u00e1n bu\u010f parametr -file (nebo jednodu\u0161e hlavn\u00ed argument), nebo parametr -defaultfile, ale ne oba. PEMainArgAndFileSwitchSpecifiedError=M\u016f\u017ee b\u00fdt zad\u00e1n bu\u010f parametr -file, nebo hlavn\u00ed argument, ale ne oba. PESignedByEmpty=Pole \u201ePodepsal\u201c nem\u016f\u017ee b\u00fdt pr\u00e1zdn\u00e9. PEInvalidUrl=Neplatn\u00e1 adresa URL: {0} PEHelpMenu=N\u00e1pov\u011bda PEAboutPolicyEditorItem=O aplikaci PolicyEditor PEPolicyEditorHelpItem=N\u00e1pov\u011bda aplikace PolicyEditor PEHelpDialogTitle=N\u00e1pov\u011bda aplikace PolicyEditor PEHelpDialogContent=

    N\u00e1pov\u011bda k n\u00e1stroji PolicyEditor

    PolicyEditor v\u00e1m umo\u017e\u0148uje zabezpe\u010dit aplety nebo aplikace Java, kter\u00e9 chcete spustit, pomoc\u00ed definovan\u00fdch opr\u00e1vn\u011bn\u00ed, kter\u00e1 se rozhodnete jim ud\u011blit.

    Hlavn\u00ed vlastnosti

    • P\u0159\u00edstupnost: pou\u017eit\u00edm kl\u00e1vesnice, my\u0161i nebo oboj\u00edho
    • P\u0159izp\u016fsoben\u00ed: definov\u00e1n\u00edm opr\u00e1vn\u011bn\u00ed, kter\u00e1 zvol\u00edte
    • Bezpe\u010dnost: aplety a aplikace pou\u017eij\u00ed pouze ta opr\u00e1vn\u011bn\u00ed, kter\u00e1 jim ud\u011bl\u00edte
    • Mo\u017enosti spr\u00e1vy: spravujte z\u00e1kladny k\u00f3du (codebases) a jejich opr\u00e1vn\u011bn\u00ed
    N\u00e1stroj PolicyEditor pracuje tak, \u017ee vyberete z\u00e1kladnu k\u00f3du (codebase) a za\u0161krtnete opr\u00e1vn\u011bn\u00ed, kter\u00e9 chcete dan\u00e9mu apletu \u010di aplikaci Java ud\u011blit. Chcete-li spustit aplet/aplikaci pouze s p\u0159esn\u011b definovan\u00fdmi opr\u00e1vn\u011bn\u00edmi, pou\u017eijte tla\u010d\u00edtko pro izolovan\u00fd prostor (sandbox) nebo zadejte re\u017eim izolovan\u00e9ho prostoru v manifestu.

    V r\u00e1mci n\u00e1stroje PolicyEditor je dostupn\u00fdch mnoho dal\u0161\u00edch akc\u00ed. Kliknut\u00edm prav\u00fdm tla\u010d\u00edtkem my\u0161i nebo stisknut\u00edm enteru (po najet\u00ed na skupinu) na skupinu opr\u00e1vn\u011bn\u00ed s malou \u0161ipkou rozbal\u00edte nebo sbal\u00edte dal\u0161\u00ed za\u0161krt\u00e1vac\u00ed pol\u00ed\u010dka s opr\u00e1vn\u011bn\u00edmi pro danou skupinu. Dal\u0161\u00ed u\u017eite\u010dnou funkc\u00ed je mo\u017enost kop\u00edrovat a vkl\u00e1dat sady opr\u00e1vn\u011bn\u00ed do nov\u00e9 z\u00e1kladny k\u00f3du (codebase), co\u017e v\u00e1m umo\u017e\u0148uje rychlou pr\u00e1ci se skupinami vlastn\u00edch opr\u00e1vn\u011bn\u00ed. Nav\u00edc nejste omezeni pouze na p\u0159edem definovan\u00e1 opr\u00e1vn\u011bn\u00ed u za\u0161krt\u00e1vac\u00edch pol\u00ed\u010dek. Pou\u017eit\u00edm nab\u00eddky Zobrazit > Vlastn\u00ed opr\u00e1vn\u011bn\u00ed... m\u016f\u017eete p\u0159id\u00e1vat jak\u00e1koliv vlastn\u00ed nastaven\u00ed opr\u00e1vn\u011bn\u00ed. # Policy Editor CustomPolicyViewer PECPTitle=Prohl\u00ed\u017ee\u010d vlastn\u00edch z\u00e1sad PECPListLabel=Jin\u00e9 z\u00e1sady pro {0} PECPAddButton=P\u0159idat PECPRemoveButton=Odstranit PECPCloseButton=Zav\u0159\u00edt PECPType=typ PECPTarget=c\u00edl PECPActions=akce PECPPrompt=Zadejte vlastn\u00ed opr\u00e1vn\u011bn\u00ed. Nezad\u00e1vejte \u201eopr\u00e1vn\u011bn\u00ed\u201c ani interpunk\u010dn\u00ed znam\u00e9nka. # PolicyEditor key mnemonics. See KeyEvent.VK_* PEFileMenuMnemonic=F PEEntryMenuMnemonic=E PEViewMenuMnemonic=V PEHelpMenuMnemonic=H PEAddEntryMnemonic=N PEAddEntryItemMnemonic=N PERemoveEntryMnemonic=R PERemoveEntryItemMnemonic=R PENewMenuItemMnemonic=N PEOpenMenuItemMnemonic=O PEOpenDefaultMenuItemMnemonic=D PESaveMenuItemMnemonic=S PEExitMenuItemMnemonic=X PECustomPermissionsItemMnemonic=U PECopyEntryItemMnemonic=C PEPasteEntryItemMnemonic=P PESaveAsMenuItemMnemonic=A PEModifySubmenuItemMnemonic=M PEModifyEntryCodebaseItemMnemonic=B PEModifyEntryPrincipalsItemMnemonic=I PEModifyEntrySignedByItemMnemonic=G PEAboutPolicyEditorItemMnemonic=A PEPolicyEditorHelpItemMnemonic=H # See javax.swing.KeyStroke.getKeyStroke(String) PEAddEntryItemAccelerator=ctrl shift N PERemoveEntryItemAccelerator=DEL PENewMenuItemAccelerator=ctrl N PEOpenMenuItemAccelerator=ctrl O PEOpenDefaultMenuItemAccelerator=ctrl D PESaveMenuItemAccelerator=ctrl S PESaveAsMenuItemAccelerator=ctrl shift S PEExitMenuItemAccelerator=ctrl Q PECustomPermissionsItemAccelerator=ctrl U PECopyEntryItemAccelerator=ctrl C PEPasteEntryItemAccelerator=ctrl V PEModifyEntryCodebaseItemAccelerator=F2 PEModifyEntryPrincipalsItemAccelerator=shift F2 PEModifyEntrySignedByItemAccelerator=ctrl F2 PEAboutPolicyEditorCloseAccelerator=ctrl Q #conole itself labels CONSOLErungc = Spustit GC (uvol\u0148ov\u00e1n\u00ed pam\u011bti) CONSOLErunFinalizers = Spustit finaliza\u010dn\u00ed metody CONSOLErunningFinalizers = Prob\u00edh\u00e1 finalizace... CONSOLEmemoryInfo = Informace o pam\u011bti CONSOLEsystemProperties = Syst\u00e9mov\u00e9 vlastnosti CONSOLEclassLoaders = Dostupn\u00e9 zavad\u011b\u010de t\u0159\u00edd CONSOLEthreadList = Seznam vl\u00e1ken CONSOLEthread = Vl\u00e1kno CONSOLEnoClassLoaders = V syst\u00e9mu nen\u00ed informace o zavad\u011b\u010di t\u0159\u00edd. CONSOLEmemoryMax = Maxim\u00e1ln\u00ed pam\u011b\u0165 CONSOLEmemoryTotal = Celkov\u00e1 pam\u011b\u0165 CONSOLEmemoryFree = Voln\u00e1 pam\u011b\u0165 CONSOLEClean=Vy\u010distit # console output pane labels COPsortCopyAllDate=\u0159adit \u201eKop\u00edrovat v\u0161e\u201c podle data COPshowHeaders=Zobrazit hlavi\u010dky: COPuser=u\u017eivatel COPorigin=p\u016fvod COPlevel=\u00farove\u0148 COPdate=datum COPthread1=vl\u00e1kno 1 COPthread2=vl\u00e1kno 2 COPShowMessages=Zobrazit zpr\u00e1vy: COPstdOut=std. out COPstdErr=std. err COPjava=java COPplugin=z\u00e1suvn\u00fd modul COPpreInit=p\u0159ed inicializac\u00ed COPpluginOnly=pouze z\u00e1suvn\u00fd modul COPSortBy=\u0158adit podle COPregex=Filtr s regul\u00e1rn\u00edmi v\u00fdrazy COPAsArrived=Po\u0159ad\u00ed p\u0159\u00edchodu (ne\u0159azeno) COPcode=k\u00f3d COPmessage=zpr\u00e1va COPSearch=Vyhled\u00e1v\u00e1n\u00ed COPautoRefresh=Automaticky obnovovat COPrefresh=Obnovit COPApply=Pou\u017e\u00edt COPmark=ozna\u010dit COPCopyAllPlain=Kop\u00edrovat v\u0161e (prost\u00fd text) COPCopyAllRich=Kop\u00edrovat v\u0161e (form\u00e1tovan\u00fd text) COPnext=dal\u0161\u00ed>>> COPprevious=<<VAROV\u00c1N\u00cd: Je vyu\u017e\u00edv\u00e1no v\u00edce m\u00edsta ne\u017e {0} MB dostupn\u00e9 pam\u011bti. TIFPCacheSizeSpinnerLargeValueWarning=K dispozici: {0} MB TIFPCacheSizeSetToNoCaching=Soubory ulo\u017een\u00e9 do vyrovn\u00e1vac\u00ed pam\u011bti budou p\u0159i ukon\u010den\u00ed aplikace IcedTea-Web smaz\u00e1ny. TIFPCacheSizeSpinnerTooltip=Minimum: {0} Maximum: {1} # Control Panel - Cache Viewer CVCPDialogTitle=Prohl\u00ed\u017ee\u010d vyrovn\u00e1vac\u00ed pam\u011bti CVCPButRefresh=Obnovit CVCPButDelete=Vymazat CVCPCleanCache=Vy\u010distit vyrovn\u00e1vac\u00ed pam\u011b\u0165 CVCPCleanCacheTip=N\u011bkter\u00e9 chyby mohou b\u00fdt zp\u016fsobeny star\u00fdmi soubory ve vyrovn\u00e1vac\u00ed pam\u011bti. Ne\u017e zad\u00e1te hl\u00e1\u0161en\u00ed o chyb\u011b, m\u016f\u017eete zkusit vy\u010distit vyrovn\u00e1vac\u00ed pam\u011b\u0165 a spustit aplikaci znovu. \\\n Vyrovn\u00e1vac\u00ed pam\u011b\u0165 m\u016f\u017eete vy\u010distit pomoc\u00ed p\u0159\u00edkazu javaws -Xclearcache nebo pomoc\u00ed programu itw-settings, volby Vyrovn\u00e1vac\u00ed pam\u011b\u0165 -> Zobrazit soubory... -> Vy\u010distit vyrovn\u00e1vac\u00ed pam\u011b\u0165. CVCPColLastModified=Posledn\u00ed zm\u011bna CVCPColSize=Velikost (v bajtech) CVCPColDomain=Dom\u00e9na CVCPColType=Typ CVCPColPath=Cesta CVCPColName=N\u00e1zev # Control Panel - desktop integration manager DIMtitle=Spr\u00e1vce z\u00e1stupc\u016f aplikace IcedTea-Web DIMremoveSelected=Odstranit vybran\u00e9 DIMselectRelativeRecordsFromOtherColumns=Vybrat souvisej\u00edc\u00ed z\u00e1znamy DIMreloadLists=Znovu na\u010d\u00edst DIMselectAll=Vybrat v\u0161e DIMclearSelection=Zru\u0161it v\u00fdb\u011br v\u0161ech polo\u017eek DIMdescription=Spr\u00e1va z\u00e1stupc\u016f a zdroj\u016f (obr\u00e1zky ve vyrovn\u00e1vac\u00ed pam\u011bti atd.), kter\u00e9 aplikace IcedTea-Web vytvo\u0159ila pro integraci s pracovn\u00ed plochou. DIMguessedDesktop=Prob\u011bhl pokus o co nejlep\u0161\u00ed odhadnut\u00ed adres\u00e1\u0159e pracovn\u00ed plochy. DIMselectionPreview=N\u00e1hled v\u00fdb\u011bru DIMaskBeforeDelete=Skute\u010dn\u011b chcete odstranit n\u00e1sleduj\u00edc\u00ed po\u010det soubor\u016f: {0}? DIMgeneratedJnlps=Vygenerovan\u00e9 soubory JNLP DIMgeneratedJnlpsTooltip=V\u0161echny soubory v tomto seznamu by m\u011bly b\u00fdt vygenerovan\u00e9 aplikac\u00ed IcedTea-Web. DIMicons=Ikony DIMiconsTooltip=V\u0161echny soubory v tomto seznamu by m\u011bly b\u00fdt ikony ve vyrovn\u00e1vac\u00ed pam\u011bti ulo\u017een\u00e9 aplikac\u00ed IcedTea-Web. DIMorphans=Sirotci DIMorphansTooltip=Vybere v\u0161echny polo\u017eky, kter\u00e9 nejsou uvedeny v seznamu z\u00e1stupc\u016f. DIMmenuItems=Polo\u017eky nab\u00eddek DIMmenuItemsTooltip=V\u0161ichni z\u00e1stupci v tomto seznamu by m\u011bli b\u00fdt vygenerovan\u00ed aplikac\u00ed IcedTea-Web. DIMdesktopItems=Polo\u017eky pracovn\u00ed plochy DIMdesktopItemsTooltipL1=Ne v\u0161ichni z\u00e1stupci na va\u0161\u00ed pracovn\u00ed plo\u0161e byli vytvo\u0159eni aplikac\u00ed IcedTea-Web! DIMdesktopItemsTooltipL2=Pro va\u0161i informaci: DIMdesktopItemsTooltipL3=\u010derven\u011b ozna\u010den\u00e9 polo\u017eky pravd\u011bpodobn\u011b nebyly vytvo\u0159eny aplikac\u00ed IcedTea-Web, DIMdesktopItemsTooltipL4=tmav\u011b zelen\u011b ozna\u010den\u00e9 polo\u017eky jsou z\u00e1stupci prohl\u00ed\u017ee\u010de, tak\u017ee pravd\u011bpodobn\u011b byly vytvo\u0159eny aplikac\u00ed IcedTea-Web, DIMdesktopItemsTooltipL5=zelen\u011b ozna\u010den\u00e9 polo\u017eky jsou z\u00e1stupci rozhran\u00ed javaws, tak\u017ee velice pravd\u011bpodobn\u011b byly vytvo\u0159eny aplikac\u00ed IcedTea-Web. DIMdesktopItemsTooltipL6=Ka\u017edop\u00e1dn\u011b bu\u010fte p\u0159i maz\u00e1n\u00ed velice opatrn\u00ed a kontrolujte v\u0161echna propojen\u00ed pomoc\u00ed funkce \u201eVybrat souvisej\u00edc\u00ed z\u00e1znamy\u201c. DIMgeneratedButton=Vytvo\u0159en\u00e9 ITW DIMgeneratedButtonTooltip=Vybere pat\u0159i\u010dn\u00e9 polo\u017eky vytvo\u0159en\u00e9 aplikac\u00ed IcedTea-Web. DIMiconsButton=Ikony DIMiconsButtonTooltip=Vybere pat\u0159i\u010dn\u00e9 ikony ulo\u017een\u00e9 ve vyrovn\u00e1vac\u00ed pam\u011bti. # Control Panel - Misc. CPJRESupport=Aplikace IcedTea-Web v sou\u010dasnosti nepodporuje pou\u017eit\u00ed v\u00edce prost\u0159ed\u00ed JRE. CPInvalidPort=Zad\u00e1no neplatn\u00e9 \u010d\u00edslo portu\n[Platn\u00e1 \u010d\u00edsla port\u016f: 1\u201365535] CPInvalidPortTitle=Chyba na vstupu # command line control panel CLNoInfo=Nejsou dostupn\u00e9 \u017e\u00e1dn\u00e9 informace (je pou\u017eit\u00e1 volba platn\u00e1?). CLValue=Hodnota: {0} CLValueSource=Zdroj: {0} CLDescription=Popis: {0} CLUnknownCommand=Nezn\u00e1m\u00fd p\u0159\u00edkaz {0} CLUnknownProperty=Nezn\u00e1m\u00fd n\u00e1zev vlastnosti {0} CLWarningUnknownProperty=VAROV\u00c1N\u00cd: Nezn\u00e1m\u00fd n\u00e1zev vlastnosti {0}. Prob\u00edh\u00e1 vytv\u00e1\u0159en\u00ed nov\u00e9 vlastnosti. CLNoIssuesFound=Nebyly zaznamen\u00e1ny \u017e\u00e1dn\u00e9 pot\u00ed\u017ee. CLIncorrectValue=Vlastnost {0} m\u00e1 nespr\u00e1vnou hodnotu {1}. Mo\u017en\u00e9 hodnoty {2}. CLListDescription=Zobraz\u00ed seznam v\u0161ech n\u00e1zv\u016f vlastnost\u00ed a hodnot, kter\u00e9 jsou vyu\u017e\u00edv\u00e1ny aplikac\u00ed IcedTea-Web. CLGetDescription=Zobraz\u00ed hodnoty pro n\u00e1zev vlastnosti. CLSetDescription=P\u0159i\u0159ad\u00ed hodnotu k n\u00e1zvu vlastnosti (pokud je to mo\u017en\u00e9). Kontrola platnosti hodnoty \u2013 pokud spr\u00e1vce vlastnost uzamkl, tato funkce nebude m\u00edt \u017e\u00e1dn\u00fd efekt. CLResetDescription=Resetuje hodnotu n\u00e1zvu vlastnosti na v\u00fdchoz\u00ed hodnotu.\nVolba \u201ev\u0161echny\u201c (all) resetuje v\u0161echny vlastnosti rozpoznan\u00e9 aplikac\u00ed IcedTea-Web na jejich v\u00fdchoz\u00ed hodnoty. CLInfoDescription=Zobraz\u00ed dal\u0161\u00ed informace o dan\u00e9 vlastnosti. CLCheckDescription=Zobraz\u00ed v\u0161echny vlastnosti, kter\u00e9 byly definov\u00e1ny, av\u0161ak nebyly rozpozn\u00e1ny aplikac\u00ed IcedTea-Web. CLUnexpectedNumberOfCommands=Program itweb-settings m\u016f\u017ee v jednu chv\u00edli spustit pouze jeden p\u0159\u00edkaz. # splash screen related SPLASHerror = Podrobnosti z\u00edsk\u00e1te kliknut\u00edm zde. Do\u0161lo k v\u00fdjimce. SPLASH_ERROR = CHYBA SPLASHtitle = N\u00e1zev SPLASHvendor = Dodavatel SPLASHhomepage = Domovsk\u00e1 str\u00e1nka SPLASHdescription = Popis SPLASHClose= Zav\u0159\u00edt SPLASHclosewAndCopyException = Zav\u0159\u00edt a zkop\u00edrovat v\u00fdpis trasov\u00e1n\u00ed z\u00e1sobn\u00edku do schr\u00e1nky SPLASHexOccured = Do\u0161lo k v\u00fdjimce... SPLASHHome = Dom\u016f SPLASHcantCopyEx = Nelze kop\u00edrovat v\u00fdjimku. SPLASHnoExRecorded = Nebyla zaznamen\u00e1na \u017e\u00e1dn\u00e1 v\u00fdjimka. SPLASHmainL1 = Je\u0161t\u011b v\u00edce informac\u00ed naleznete na webu {0}. Postupujte dle uveden\u00fdch krok\u016f, abyste z\u00edskali informace nebo nahl\u00e1sili chybu. SPLASHmainL3 = Nejsou dostupn\u00e9 \u017e\u00e1dn\u00e9 dal\u0161\u00ed informace. Zkuste spustit prohl\u00ed\u017ee\u010d z p\u0159\u00edkazov\u00e9 \u0159\u00e1dky a analyzovat v\u00fdstup. SPLASHcloseAndCopyShorter = Zav\u0159\u00edt a kop\u00edrovat do schr\u00e1nky SPLASHmainL4 = Do\u0161lo k n\u00e1sleduj\u00edc\u00ed v\u00fdjimce. Chcete-li v\u00edce informac\u00ed, zkuste spustit prohl\u00ed\u017ee\u010d z p\u0159\u00edkazov\u00e9 \u0159\u00e1dky a analyzovat v\u00fdstup. SPLASHmainL2 = Dal\u0161\u00ed informace mohou b\u00fdt dostupn\u00e9 v konzoli nebo protokolech. Je\u0161t\u011b v\u00edce informac\u00ed z\u00edsk\u00e1te zapnut\u00edm lad\u011bn\u00ed. SPLASHexWas = Zaznamenan\u00e1 v\u00fdjimka: SPLASHcfl = Nelze \u010d\u00edst odkaz SPLASHvendorsInfo = Informace od dodavatele va\u0161\u00ed aplikace SPLASHanotherInfo = Dal\u0161\u00ed dostupn\u00e9 informace SPLASHdefaultHomepage = Nen\u00ed definov\u00e1n atribut \u201ehomepage\u201c, rad\u011bji ov\u011b\u0159te zdroj. SPLASHerrorInInformation = Chyba p\u0159i na\u010d\u00edt\u00e1n\u00ed elementu \u201einformation\u201c, rad\u011bji ov\u011b\u0159te zdroj. SPLASHmissingInformation = Chyb\u00ed element \u201einformation\u201c, rad\u011bji ov\u011b\u0159te zdroj. SPLASHchainWas = Toto je seznam v\u00fdjimek, ke kter\u00fdm do\u0161lo p\u0159i spou\u0161t\u011bn\u00ed apletu. Vezm\u011bte na v\u011bdom\u00ed, \u017ee zdroji uveden\u00fdch v\u00fdjimek m\u016f\u017ee b\u00fdt v\u00edce r\u016fzn\u00fdch aplet\u016f. Abyste mohli vytvo\u0159it u\u017eite\u010dn\u00e9 hl\u00e1\u0161en\u00ed o chyb\u011b, ujist\u011bte se, \u017ee b\u011b\u017e\u00ed pouze jeden aplet. CBCheckFile = Aplikace je lok\u00e1ln\u00ed soubor. Ov\u011b\u0159ov\u00e1n\u00ed z\u00e1kladny k\u00f3du (codebase) je vypnuto. Podrobnosti z\u00edsk\u00e1te na adrese http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckNoEntry = Tato aplikace v manifestu neuv\u00e1d\u00ed z\u00e1kladnu k\u00f3du (codebase). Ov\u011b\u0159te ji u dodavatele apletu. Pokra\u010duji. Podrobnosti z\u00edsk\u00e1te na adrese http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckUnsignedPass = Z\u00e1kladna k\u00f3du (codebase) aplikace souhlas\u00ed se z\u00e1kladnou k\u00f3du uvedenou v manifestu a aplikace nen\u00ed podepsan\u00e1. Pokra\u010duji. Podrobnosti z\u00edsk\u00e1te na adrese http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckUnsignedFail= Z\u00e1kladna k\u00f3du (codebase) aplikace NESOUHLAS\u00cd se z\u00e1kladnou k\u00f3du uvedenou v manifestu a aplikace nen\u00ed podepsan\u00e1. Pokra\u010duji. Podrobnosti z\u00edsk\u00e1te na adrese http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckOkSignedOk = Z\u00e1kladna k\u00f3du (codebase) aplikace souhlas\u00ed se z\u00e1kladnou k\u00f3du uvedenou v manifestu a aplikace je podepsan\u00e1. Pokra\u010duji. Podrobnosti z\u00edsk\u00e1te na adrese http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckSignedAppletDontMatchException = Nen\u00ed povoleno spou\u0161t\u011bn\u00ed podepsan\u00fdch aplet\u016f, pokud jejich skute\u010dn\u00e1 z\u00e1kladna k\u00f3du (codebase) nesouhlas\u00ed se z\u00e1kladnou k\u00f3du uvedenou v manifestu. O\u010dek\u00e1v\u00e1no: {0}. Skute\u010dnost: {1}. Podrobnosti z\u00edsk\u00e1te na adrese http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckSignedFail = Z\u00e1kladna k\u00f3du (codebase) aplikace NESOUHLAS\u00cd se z\u00e1kladnou k\u00f3du uvedenou v manifestu aplikace a aplikace je podepsan\u00e1. D\u016frazn\u011b doporu\u010dujeme, abyste tuto aplikaci nespou\u0161t\u011bli. Podrobnosti z\u00edsk\u00e1te na adrese http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. # itweb man base (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. ITWTBbugs=Neevidujeme \u017e\u00e1dn\u00e9 zn\u00e1m\u00e9 chyby. Pokud na n\u011bjakou naraz\u00edte, zadejte pros\u00edm hl\u00e1\u0161en\u00ed o chyb\u011b ITWTBdebug=Spus\u0165te aplikaci v re\u017eimu lad\u011bn\u00ed (s pou\u017eit\u00edm p\u0159ep\u00edna\u010de nebo nastaven\u00ed v itw-settings \u201e-verbose\u201c, nebo nastaven\u00ed prom\u011bnn\u00e9 ICEDTEAPLUGIN_DEBUG na hodnotu \u201etrue\u201c) a p\u0159idejte v\u00fdstup (nejl\u00e9pe z konzole java) s adresou URL souboru JNLP nebo HTML (nebo p\u0159\u00edmo samotn\u00fd soubor JNLP/HTML) do hl\u00e1\u0161en\u00ed o chyb\u011b. ITWTBwritten=Naps\u00e1no a spravov\u00e1no spolupracovn\u00edky projektu IcedTea. ITWTBdirs=Kde parametry $XDG_CONFIG_DIR, $XDG_CACHE_DIR a $XDG_RUNTIME_DIR jsou nastaveny na ~/.config, ~/.cache a /tmp nebo /var/tmp (pokud nejsou u\u017eivatelem nastaveny jinak). # itweb-settings man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. ITWSintro= - zobrazen\u00ed a \u00fapravy nastaven\u00ed pro javaws a z\u00e1suvn\u00fd modul prohl\u00ed\u017ee\u010de ITWSsynops=argumenty p\u0159\u00edkazu IWSdescL1=je program jak pro p\u0159\u00edkazovou \u0159\u00e1dku tak i s grafick\u00fdm rozhran\u00edm slou\u017e\u00edc\u00ed k \u00faprav\u011b nastaven\u00ed pou\u017e\u00edvan\u00fdch implementac\u00ed rozhran\u00ed javaws pou\u017e\u00edvanou aplikac\u00ed IcedTea-Web a z\u00e1suvn\u00fdm modulem prohl\u00ed\u017ee\u010de. IWSdescL2=Pokud je spu\u0161t\u011bn bez dal\u0161\u00edch argument\u016f, spust\u00ed se v grafick\u00e9m rozhran\u00ed. V opa\u010dn\u00e9m p\u0159\u00edpad\u011b se pokus\u00ed vykonat po\u017eadavky zadan\u00e9 pomoc\u00ed argument\u016f. IWSdescL3=P\u0159\u00edkazov\u00e1 \u0159\u00e1dka umo\u017e\u0148uje rychl\u00e9 vyhled\u00e1n\u00ed, kop\u00edrov\u00e1n\u00ed a upravov\u00e1n\u00ed specifick\u00fdch nastaven\u00ed bez nutnosti zdlouhav\u00e9ho proch\u00e1zen\u00ed grafick\u00e9ho u\u017eivatelsk\u00e9ho rozhran\u00ed. IWSexampleL1=Zobraz\u00ed grafick\u00fd editor. IWSexampleL2=Obnov\u00ed hodnotu nastaven\u00ed \u201e{0}\u201c. ITWSdefault=v\u00fdchoz\u00ed IWSexampleL3=Zn\u00e1m\u00e9 vlastnosti IWSexampleL31=(kl\u00ed\u010d, hodnota a v\u00fdchoz\u00ed hodnota \u2013 pokud je odli\u0161n\u00e1 od aktu\u00e1ln\u00ed): IWSexampleL32=(kl\u00ed\u010d a v\u00fdchoz\u00ed hodnota): IWSpossible=Mo\u017enosti: # itweb-plugin man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. ITWPintro= - umo\u017en\u011bn\u00ed spou\u0161t\u011bn\u00ed aplet\u016f Java ve va\u0161em obl\u00edben\u00e9m prohl\u00ed\u017ee\u010di ITWPsynopsL1=funguje ve va\u0161em prohl\u00ed\u017ee\u010di (pokud ho do n\u011bj nainstalujete). ITWPsynopsL2=Soubor {0} mus\u00ed b\u00fdt um\u00edst\u011bn v pat\u0159i\u010dn\u00fdch adres\u00e1\u0159\u00edch (nebo na n\u011bj z t\u011bchto adres\u00e1\u0159\u016f mus\u00ed v\u00e9st odkaz). Viz {1} ITWPsynopsL3= Prohl\u00ed\u017ee\u010de kompatibiln\u00ed s prohl\u00ed\u017ee\u010dem Mozilla, jako nap\u0159\u00edklad Firefox, Midori, Epiphany, Chrome nebo Chromium pou\u017e\u00edvaj\u00ed: ITWPsynopsL4= Prohl\u00ed\u017ee\u010de od firmy Opera, jako nap\u0159\u00edklad Opera pou\u017e\u00edvaj\u00ed: ITWPtrademarks=V\u0161echny ochrann\u00e9 zn\u00e1mky t\u0159et\u00edch stran jsou vlastnictv\u00edm jejich p\u0159\u00edslu\u0161n\u00fdch vlastn\u00edk\u016f. # files descriptions FILEpipe=Obsahuje vstupn\u00ed a v\u00fdstupn\u00ed roury pro komunikaci pomoc\u00ed rozhran\u00ed native2java a rouru pro lad\u011bn\u00ed (pokud zapnuto). FILEmozillauser=Um\u00edst\u011bn\u00ed knihovny z\u00e1suvn\u00e9ho modulu na \u00farovni u\u017eivatele pro pou\u017eit\u00ed s prohl\u00ed\u017ee\u010di zalo\u017een\u00fdmi na projektu Mozilla. FILEmozillaglobal64=Um\u00edst\u011bn\u00ed knihovny z\u00e1suvn\u00e9ho modulu na glob\u00e1ln\u00ed \u00farovni pro pou\u017eit\u00ed s prohl\u00ed\u017ee\u010di zalo\u017een\u00fdmi na projektu Mozilla, 64bitov\u00e9 syst\u00e9my. FILEmozillaglobal32=Um\u00edst\u011bn\u00ed knihovny z\u00e1suvn\u00e9ho modulu na glob\u00e1ln\u00ed \u00farovni pro pou\u017eit\u00ed s prohl\u00ed\u017ee\u010di zalo\u017een\u00fdmi na projektu Mozilla, 32bitov\u00e9 syst\u00e9my. FILEopera64=Um\u00edst\u011bn\u00ed knihovny z\u00e1suvn\u00e9ho modulu na glob\u00e1ln\u00ed \u00farovni pro pou\u017eit\u00ed s prohl\u00ed\u017ee\u010di od firmy Opera, 64bitov\u00e9 syst\u00e9my. FILEopera32=Um\u00edst\u011bn\u00ed knihovny z\u00e1suvn\u00e9ho modulu na glob\u00e1ln\u00ed \u00farovni pro pou\u017eit\u00ed s prohl\u00ed\u017ee\u010di od firmy Opera, 32bitov\u00e9 syst\u00e9my. TAGSOUPtail=Mo\u017en\u00e1 nem\u00e1te nainstalovanou knihovnu TagSoup nebo nebyla pou\u017eita p\u0159i kompilaci ITW. Zkontrolujte instalaci nebo projd\u011bte informace poskytovan\u00e9 k aplikaci autory va\u0161\u00ed linuxov\u00e9 distribuce. TAGSOUPnotUsed=Nepou\u017e\u00edv\u00e1te parser pro zpracov\u00e1n\u00ed nevalidn\u00edch soubor\u016f. Pokud jste pou\u017eili parametr {0}, odstra\u0148te ho. Nebo... TAGSOUPbroken=Parser pro zpracov\u00e1n\u00ed nevalidn\u00edch soubor\u016f nefunguje. TAGSOUPhtmlNotUsed=P\u0159ev\u00e1d\u011bc\u00ed modul html2xml knihovny TagSoup je vypnut\u00fd. Odstra\u0148te parametr {0}. Parsov\u00e1n\u00ed pravd\u011bpodobn\u011b sel\u017ee. TAGSOUPhtmlBroken=P\u0159ev\u00e1d\u011bc\u00ed modul html2xml knihovny TagSoup se nenahr\u00e1l. Nainstalujte knihovnu TagSoup (a zkompilujte ITW s jej\u00edm zahrnut\u00edm). Parsov\u00e1n\u00ed pravd\u011bpodobn\u011b sel\u017ee. FILEcache=Obsahuje polo\u017eky b\u011bhov\u00e9ho prost\u0159ed\u00ed ulo\u017een\u00e9 ve vyrovn\u00e1vac\u00ed pam\u011bti. FILErecentlyUsed=Dal\u0161\u00ed informace o polo\u017ek\u00e1ch ve vyrovn\u00e1vac\u00ed pam\u011bti. FILEappdata=Obsahuje ulo\u017een\u00e1 data aplikac\u00ed. FILElogs=obsahuje soubor s protokoly (pokud je protokolov\u00e1n\u00ed zapnuto) \u2013 soubor tw-cplugin-date_time.log pro nativn\u00ed z\u00e1suvn\u00fd modul a soubor itw-javantx-date_time.log pro v\u0161echno ostatn\u00ed. FILEicons=Um\u00edst\u011bn\u00ed, kde jsou uchov\u00e1v\u00e1ny ikony z\u00e1stupc\u016f na plo\u0161e nebo v m\u00edstn\u00ed nab\u00eddce k aplikac\u00edm javaws. FILEjnlps=Um\u00edst\u011bn\u00ed, kde jsou uchov\u00e1v\u00e1ny soubory jnlp generovan\u00e9 ze str\u00e1nek html pro aplikace javaws v p\u0159\u00edpad\u011b spou\u0161t\u011bn\u00ed pomoc\u00ed z\u00e1stupce na plo\u0161e / v m\u00edstn\u00ed nab\u00eddce. FILEmenus=Podadres\u00e1\u0159 v u\u017eivatelsk\u00e9m prostoru pro nab\u00eddky, kam budou ulo\u017eeni vlastn\u00ed z\u00e1stupci zobrazuj\u00edc\u00ed se v m\u00edstn\u00ed nab\u00eddce. FILEextasuser=Soubor zodpov\u011bdn\u00fd chov\u00e1n\u00ed jednotliv\u00fdch aplet\u016f a aplikac\u00ed na z\u00e1klad\u011b jejich z\u00e1kladny k\u00f3du (codebase) a u\u017eivatelsk\u00fdch akc\u00ed. FILEextasadmin=Soubor zodpov\u011bdn\u00fd chov\u00e1n\u00ed jednotliv\u00fdch aplet\u016f a aplikac\u00ed na z\u00e1klad\u011b jejich z\u00e1kladny k\u00f3du (codebase) a akc\u00ed spr\u00e1vce. FILEglobaldp=Glob\u00e1ln\u00ed soubor s nastaven\u00edmi deployment.properties FILEtmpappdata=Obsahuje do\u010dasn\u00e9 soubory b\u011bhov\u00e9ho prost\u0159ed\u00ed. FILElocksdir=Um\u00edst\u011bn\u00ed z\u00e1mk\u016f jednotliv\u00fdch proces\u016f netx FILEmainlock=Um\u00edst\u011bn\u00ed hlavn\u00edho z\u00e1mku procesu netx FILEpolicy=Obsahuje opr\u00e1vn\u011bn\u00ed ud\u011blen\u00e1 vybran\u00fdm nepodepsan\u00fdm aplikac\u00edm. FILEusercerts=Obsahuje r\u016fzn\u00e9 certifik\u00e1ty ulo\u017een\u00e9 u\u017eivateli. FILEjavacerts=Obsahuje r\u016fzn\u00e9 syst\u00e9mov\u00e9 certifik\u00e1ty ulo\u017een\u00e9 glob\u00e1ln\u011b v r\u00e1mci prost\u0159ed\u00ed Java. FILEjavadp=Glob\u00e1ln\u00ed soubor deployment.properties. M\u016f\u017ee b\u00fdt ovlivn\u011bn {0}. FILEuserdp=Hlavn\u00ed u\u017eivatelsk\u00fd soubor deployment.properties. # extended policy editor EPEexpert=Pokro\u010dil\u00e9 \u00fapravy EPEsave=Ulo\u017eit a zav\u0159\u00edt EPEcancel=Zru\u0161it a zav\u0159\u00edt EPEhelp1=p\u0159idat/odstranit pravidla EPEhelp2=vybrat typ pravidla EPEhelp3=vybrat rozhodnut\u00ed EPEhelp4=upravit pole ru\u010dn\u011b EPEhelp5=Editor pravidel spust\u00edte dvojit\u00fdm kliknut\u00edm na prvn\u00ed dva sloupce. EPEexpertHelp=Zde m\u016f\u017eete upravovat ulo\u017een\u00e9 hodnoty. V\u011bt\u0161ina akc\u00ed m\u00e1 jednoduchou syntaxi, nicm\u00e9n\u011b v n\u011bkter\u00fdch p\u0159\u00edpadech m\u016f\u017eete narazit na opravdu komplikovan\u00e9 p\u0159\u00edkazy. Upravujte je pouze tehdy, pokud v\u00edte, co d\u011bl\u00e1te. N\u011bkdy jsou v\u0161ak i slo\u017eit\u00e9 p\u0159\u00edkazy pom\u011brn\u011b jasn\u00e9 a srozumiteln\u00e9. EPEexpertHint=Ulo\u017een\u00e9 hodnoty pe\u010dliv\u011b upravte. APPEXTSECappletSecurityLevelExtraHighId=Vypnut\u00ed b\u011bhu v\u0161ech aplet\u016f prost\u0159ed\u00ed Java APPEXTSECappletSecurityLevelVeryHighId=Velmi vysok\u00e1 \u00farove\u0148 zabezpe\u010den\u00ed APPEXTSECappletSecurityLevelHighId=Vysok\u00e1 \u00farove\u0148 zabezpe\u010den\u00ed APPEXTSECappletSecurityLevelLowId=N\u00edzk\u00e1 \u00farove\u0148 zabezpe\u010den\u00ed APPEXTSECappletSecurityLevelExtraHighExplanation=Nebude spu\u0161t\u011bn \u017e\u00e1dn\u00fd aplet. APPEXTSECappletSecurityLevelVeryHighExplanation=Nebude spu\u0161t\u011bn \u017e\u00e1dn\u00fd nepodepsan\u00fd aplet. APPEXTSECappletSecurityLevelHighExplanation=U\u017eivatel bude dot\u00e1z\u00e1n na spu\u0161t\u011bn\u00ed ka\u017ed\u00e9ho nepodepsan\u00e9ho apletu. APPEXTSECappletSecurityLevelLowExplanation=Budou spu\u0161t\u011bny v\u0161echny aplety (dokonce i ty nepodepsan\u00e9). APPEXTSECunsignedAppletActionAlways=V\u017edy d\u016fv\u011b\u0159ovat t\u011bmto (odpov\u00eddaj\u00edc\u00edm) aplet\u016fm APPEXTSECunsignedAppletActionNever=Nikdy ned\u016fv\u011b\u0159ovat t\u011bmto (odpov\u00eddaj\u00edc\u00edm) aplet\u016fm APPEXTSECunsignedAppletActionYes=Tento aplet byl zhl\u00e9dnut a povolen. APPEXTSecunsignedAppletActionSandbox=Tento aplet byl zhl\u00e9dnut a byl povolen jeho b\u011bh s omezen\u00fdmi opr\u00e1vn\u011bn\u00edmi. APPEXTSECunsignedAppletActionNo=Tento aplet byl zhl\u00e9dnut a odm\u00edtnut. APPEXTSECControlPanelExtendedAppletSecurityTitle=Roz\u0161\u00ed\u0159en\u00e9 zabezpe\u010den\u00ed aplet\u016f APPEXTSECguiTableModelTableColumnRD=Ulo\u017een\u00e1 rozhodnut\u00ed APPEXTSECguiTableModelTableColumnDateOfAction=Datum akce APPEXTSECguiTableModelTableColumnDocumentBase=Z\u00e1kladna dokumentu (document base) APPEXTSECguiTableModelTableColumnCodeBase=Z\u00e1kladna k\u00f3du (codebase) APPEXTSECguiTableModelTableColumnArchives=Arch\u00edvy APPEXTSECguiPanelAppletInfoHederPart1={0} {1} APPEXTSECguiPanelAppletInfoHederPart2={0} z {1} APPEXTSECguiPanelConfirmDeletionOf=Skute\u010dn\u011b chcete odstranit n\u00e1sleduj\u00edc\u00ed po\u010det polo\u017eek: {0}? APPEXTSECguiPanelHelpButton=N\u00e1pov\u011bda APPEXTSECguiPanelSecurityLevel=\u00darove\u0148 zabezpe\u010den\u00ed APPEXTSECguiPanelGlobalBehaviourCaption=Nastaven\u00ed glob\u00e1ln\u00edho chov\u00e1n\u00ed aplet\u016f APPEXTSECguiPanelDeleteMenuSelected=vybran\u00e9 APPEXTSECguiPanelDeleteMenuAllA=v\u0161echny povolen\u00e9 (A) APPEXTSECguiPanelDeleteMenuAllN=v\u0161echny zak\u00e1zan\u00e9 (N) APPEXTSECguiPanelDeleteMenuAlly=v\u0161echny schv\u00e1len\u00e9 (y) APPEXTSECguiPanelDeleteMenuAlln=v\u0161echny odm\u00edtnut\u00e9 (n) APPEXTSECguiPanelDeleteMenuAllAll=\u00fapln\u011b v\u0161echny APPEXTSECguiPanelDeleteButton=Vymazat APPEXTSECguiPanelDeleteButtonToolTip=V pr\u016fb\u011bhu proch\u00e1zen\u00ed tabulky m\u016f\u017eete stisknout kl\u00e1vesu Delete. T\u00edm provedete akci odstranit vybran\u00e9. APPEXTSECguiPanelTestUrlButton=Otestovat URL APPEXTSECguiPanelAddRowButton=P\u0159idat \u0159\u00e1dek APPEXTSECguiPanelValidateTableButton=Ov\u011b\u0159it tabulku APPEXTSECguiPanelAskeforeActionBox=P\u0159ed akc\u00ed se dot\u00e1zat APPEXTSECguiPanelShowRegExesBox=Zobrazit \u00fapln\u00e9 regul\u00e1rn\u00ed v\u00fdrazy APPEXTSECguiPanelInverSelection=P\u0159evr\u00e1tit v\u00fdb\u011br APPEXTSECguiPanelMoveRowUp=Posunout \u0159\u00e1dek nahoru APPEXTSECguiPanelMoveRowDown=Posunout \u0159\u00e1dek dol\u016f APPEXTSECguiPanelCustomDefs=U\u017eivatelsk\u00e9 definice APPEXTSECguiPanelGlobalDefs=Syst\u00e9mov\u00e9 definice APPEXTSECguiPanelDocTest=Zadejte adresu URL z\u00e1kladny dokumentu (document base) APPEXTSECguiPanelCodeTest=Zadejte adresu URL z\u00e1kladny k\u00f3du (codebase) APPEXTSECguiPanelNoMatch=\u017d\u00e1dn\u00e1 shoda APPEXTSECguiPanelMatchingNote=Vezm\u011bte na v\u011bdom\u00ed, \u017ee jako v\u00fdsledek bude br\u00e1n pouze prvn\u00ed shodn\u00fd v\u00fdskyt. APPEXTSECguiPanelMatched=Shody APPEXTSECguiPanelMatchingError=Chyba p\u0159i hled\u00e1n\u00ed shody: {0} APPEXTSECguiPanelCanNotValidate=Nelze ov\u011b\u0159it, nelze vytvo\u0159it do\u010dasn\u00fd soubor \u2013 {0}. APPEXTSECguiPanelEmptyDoc=V\u0161echny z\u00e1kladny dokumentu (document bases) musej\u00ed b\u00fdt vypln\u011bny. APPEXTSECguiPanelEmptyCode=V\u0161echny z\u00e1kladny k\u00f3du (codebases) musej\u00ed b\u00fdt vypln\u011bny. APPEXTSECguiPanelTableValid=Zd\u00e1 se, \u017ee tabulka je v po\u0159\u00e1dku. APPEXTSECguiPanelTableInvalid=Tabulka je neplatn\u00e1. Chyba: {0} APPEXTSECguiPanelShowOnlyPermanent=Zobrazit pouze trval\u00e9 z\u00e1znamy APPEXTSECguiPanelShowOnlyTemporal=Zobrazit pouze ji\u017e d\u0159\u00edve do\u010dasn\u011b povolen\u00e9 nebo zak\u00e1zan\u00e9 z\u00e1znamy APPEXTSECguiPanelShowAll=Zobrazit v\u0161echny z\u00e1znamy APPEXTSECguiPanelShowOnlyPermanentA=Zobrazit pouze povolen\u00e9 trval\u00e9 z\u00e1znamy APPEXTSECguiPanelShowOnlyPermanentN=Zobrazit pouze zak\u00e1zan\u00e9 trval\u00e9 z\u00e1znamy APPEXTSECguiPanelShowOnlyTemporalY=Zobrazit pouze d\u0159\u00edve povolen\u00e9 z\u00e1znamy aplet\u016f APPEXTSECguiPanelShowOnlyTemporalN=Zobrazit pouze d\u0159\u00edve zak\u00e1zan\u00e9 z\u00e1znamy aplet\u016f APPEXTSEChelpHomeDialogue=Dialogue APPEXTSEChelp=

    Help for Extended applet security - itw-settings, files and structures, dialogue

    Extended Applet Security refers to security features for unsigned applets. Traditionally, only signed applets required user confirmation and unsigned applets ran automatically. This is represented by the ''low security'' setting. Unsigned applets must be allowed or disallowed individually on ''high security'' (the default), and additionally do not run at all on ''very high security''. In theory, unsigned applets can safely run automatically. In practice, however, any vulnerability in the Java security sandbox will prevent this from being true.

    To do so it uses the Security Level main settings switch rules in the tables of Custom definitions and Global definitions
    You can read much more about development of (and help us to improve!) this feature at
    dedicated IcedTea-Web page

    Security Level

    Its a main switch for "extended applet security". Its value is commonly stored in users_home/.icedtea/deployment.properties, but can be enforced via global settings in /etc/.java/deployment/deployment.properties or JAVA_HOME/lib/deployment.properties under the key deployment.security.level

  • Disable running of all Java applets - stored as DENY_ALL - No applet will be run
    No applet will be allowed to run. However the Java virtual machine will always be executed (and an error screen with reason appear instead of applets). To disable Java completely you can uninstall IcedTea-Web or disable it in your browser (if supported). The tables with records are of course ignored.
  • Very High Security - stored as DENY_UNSIGNED - No unsigned applets will be run
    No applet unsigned will be allowed to run (and an error screen with reason will appear instead of such applets). The tables with records are of course again ignored.
  • High Security - stored as ASK_UNSIGNED - User will be prompted for each unsigned applet
    All unsigned applets will be tested against the tables below if they should be allowed or forbidden to run. If they are not matched in the table then the user is prompted and the decision is stored in tables below. If the user denies the applet, an error screen with reason appears and the applet does not run. If the user allows applets to run, the user can choose to save this decision and whether to allow just one applet or a whole group of applets (see Dialogue paragraph below).
    This is default behavior.
  • Low Security - stored as ALLOW_UNSIGNED - All, even unsigned, applets will be run
    All applets even unsigned will be allowed to run. User will not be warned and the tables with records are of course again ignored.
    You need to press ok or apply button to make the changes take effect.

    Table with recorded actions

    Custom x Global table

    After each action in High Security dialogue the record is added to, or updated in, the table or configuration file. Commonly in users file - home/.icedtea/.appletTrustSettings - "Custom definition" panel.
    But superuser can specify default behavior in /etc/.java/deployment/ .appletTrustSettings - "Global definition" panel.

    "Syntax"

  • Action - Desired behavior when applet is matched
  • Always trust this applet - This unsigned applet will always be run in High Security Security Level. It is stored as A in .appletTrustSettings
  • Never trust this applet - This unsigned applet will never be run in High Security Security Level. It is stored as N in .appletTrustSettings
  • Visited and allowed - When the user is asked about this applet again, a note that this applet was already trusted in past will be displayed. It is stored as y in .appletTrustSettings
  • Visited and denied - When user will be asked about this applet again, he will see information that this applet was already denied in past. It is stored as n in .appletTrustSettings
  • Date - date of last action on this item (read only item)
  • Document base - is the page from which the applet was requested. It is actually a regular expression to match a specific URL. See about regular expressions and their usage lower
  • Code base - is the URL where an applets code came from. It is actually a regular expression to match a specific URL. See about regular expressions and their usage lower
  • Archives - coma separated list of archives with applet''s code. Can be empty if source code are just classes or group of applets is allowed

    When you change a value in the table, its effect is immediate.

    Controls of tables

  • Delete - deletes items as specified in combo box on side
  • selected - removes all selected items. Key Del does the same. Default behavior. Multiple selections allowed. Selection can be inverted by button even more on side
  • all allowed (A) - removes all permanently trusted records
  • all forbidden (N) - removes all permanently forbidden records
  • all approved (y) - removes all previously (temporarily) trusted records
  • all rejected (n) - removes all previously (temporarily) denied records
  • all - will clear the table

    Ask me before action - switch to ask before each deletion (in bulk) or not to ask. Asking dialogue can be pretty long, so if you do not see the buttons, just press Esc
  • Show full regular expressions - Disable or Enable filtering of quotation marks QE in code/document base columns. About regular expressions see more lower

  • Filtering in table(s)
  • Show only permanent records - Shows only permanently allowed (A) or denied (N) records. Default behavior
  • Show only temporarily decided records - Shows only once allowed (y) or denied (n) informative records.
  • Show only permanently allowed records - Shows only permanently allowed (A) records
  • Show only permanently denied records - Shows only permanently denied (N) records
  • Show only temporarily allowed records - Shows only once allowed (y) informative records.
  • Show only temporarily denied records - Shows only once denied (n) informative records.
  • Add new row - will add new, exemplary filled, row with current date and empty archives
  • Validate table - will test if table can save, load, and if each value is valid:
  • Action - is one of A,N,y,n
  • Date - is valid date
  • Code base and document base - are valid regular expressions or empty
  • Archives - coma separated list of archives or empty
  • Test url - In two dialogues (in two steps) will let you enter document base and codebase, and then try to match them against all records. All matching items are returned! Last values are remembered>
  • Move row down/up
    Order of rows is important. First matched result is returned (permanent have priority). So you can prioritize your matches using these buttons.
    For example, if you Qhttp://blogs.com/E.* regular expression to allow all applets on http://blogs.com, then it must be AFTER your Qhttp://blogs.com/evilJohnE.* regular expression forbidding all applets from blog of hacker evilJohn.

    Dialogue

    If High Security is set, and a new unsigned applet is hit then the dialogue is shown asking you to allow it or deny it. You can also choose if you want to allow or deny this applet every-time (A or N) you encounter it or for just one run (y,n).
    You can also select to trust or deny (again temporarily or permanently) all the applets from same, exact, codebase. If you are visiting one page, which has various applets on various documents then this is a choice for you.
    If you decide not to allow remembering your decision, then just a temporary record is made. If you revisit a page, a small green or red label will inform you about your last decision.
    Once you select remember your decision, the dialog will never appear again. But you can edit your decision in itw-settings application table (packed with IcedTea-Web). If you change your decision to temporary one (n,y) or delete its row, the dialogue will appear again. Of course you can switch also from Always to Never or vice versa.
    The dialogue always mentions the page on which an applet is displayed, and the URL from which it comes. There is also a hint, if you have ever visited this applet saying if you have allowed or rejected it in the past

    Controls

  • Remember this option - If set, then dialogue will never be shown for this applet or page again.
  • For applet - Exact applet will be allowed or denied
  • For site - All applets from this place will be allowed or denied
  • Proceed - Applets, as selected above will be allowed
  • Cancel - Applets, as selected above will be forbidden
  • Be aware to "proceed" + "Remember this option" + "For site" on pages you do not know! It can make you vulnerable!

    Regular expressions

    IcedTea-Web extended applet security - uses a powerful matching engine to match exact (sets of) applets. Base stone is Quotation of URL QE and wildchars like .* or .? or more.
    This was designed to suits the need to block or allow exact pages. The best is to show some examples:
    N 12.12.2012 .* Qhttp://blogs.com/evilJohnE.*
    N 12.12.2012 Qhttp://blogs.com/goodJohn/evilApplet.htmlE.* Qhttp://blogs.com/goodJohn/E goodJohnsArchive.jar
    A 12.12.2012 Qhttp://blogs.com/E.* Qhttp://blogs.com/E.*
    N 12.12.2012 .* Qhttp://adds.comE.*
    Y 12.12.2012 .* Qhttp://www.walter-fendt.de/ph14_jar/E

    So this table, created 12.12.2012:
  • Forbid all stuff which have some code on http://blogs.com/evilJohn pages
  • Forbidding also one exact applet from http://blogs.com/goodJohn/ with archive goodJohnsArchive.jar
  • Allowing all (other) applets from http://blogs.com/ but only when displayed also on http://blogs.com/
  • Forbidding all applets with code saved on http://adds.com (except on http://blogs.com/ - to have forbidden http://adds.com also on http://blogs.com/, this (http://adds.com) record must be above blogs record)
  • And finally allowing all nice physical applets on walter-fendt''s pages

    Note - the date saved in .appletTrustSettings has a not so nice format, but I left this for now...

    All information about full regular expression syntax can be found on http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

    Conclusion

    Stay tuned to our homepage at {0}!
    If you encounter any bug, feel free to file it in our bugzilla ... According to policy

    Safe browsing from your IcedTea-Web team...

    icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/showDownloadDetails.png0000644000000000000000000000013213441742745026753 xustar0030 mtime=1552401893.033832835 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/showDownloadDetails.png0000644000175000002070000000153413441742745027566 0ustar00jvanekmock00000000000000‰PNG  IHDR‰ bKGDџдATђ pHYs  šœtIMEн 8sкИƒiTXtCommentCreated with GIMPd.eРIDAT8Ы•”MhSY†ŸsяЄк гzm’K% ўPШFЂтЮ›a6У4ƒdt–M‚Ыn ж2Гw'(LAКЉИ+….Іk- HлБЂ2ЬMšIЧVЊнф†з…M‰mc2/Ют^žѓ~ч{Я‡$і[AP2™T&“QП …‚ЧљСВЌAлЖПщшш8лннн[("’,I–‘Фnc|зuƒ‰‰ њњњ(•J‹Х=ћдддрIлЖПУpn_w€fffдЎFFFH’е X*‹mСЖЏІbлvVЭ€‹ mС\зUі)рфффdK рfЕZЅVЋ! +чяd’џђyўМwпЧЉЌЎЎвJA\‹D"ўђђ2хrчњu~ОpЯтq"€0 џYYYi є}Ÿ мl6ћ N;;;ћpп’-ЫhЛЫѕЦ>'Nш#GД™ЫЉ|хŠўнОУ\.—гџбttTїЧЦєЫЃGZZ_збmр™L&ГћgAа:MКœL$lŒu]З)tЧсЉSzкгЃuЯгЛЫ—Е64ЄuРъ/ ј[[[>Pй ­ч№Й{W?NOыЇЙ9MП~­Г .§эœљ’ЈVЋЬЯЯ{бhєЫFЇ iьV №]з§Ј‚њ7‹щUO›Е‡пОЅыќy6ž<С=~œj,F˜NѓлГgŒнОЭЌч™!р…Є;Ц€ЌЄ‡;“ъж-}ѕќ9gz{љ<ŸG–…wьпE"†P.3ŒЧуlE"&ќ*Љд,ьцъU}=>NххKŽnlŠF‰'lXYOЛК><ЧveGK”ЁлuysрkkЄ<Э7XМx‘яяM`ЧЄ;{€ЇO+uю‡R)%ФI_КФ›Ч99<Ь№>г<ймSњ{0@К+ЎdIENDЎB`‚icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/Messages_ru.properties0000644000000000000000000000013213441742745026662 xustar0030 mtime=1552401893.032832837 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/Messages_ru.properties0000644000175000002070000131502113441742745027475 0ustar00jvanekmock00000000000000# Default (English) UI messages for netx # # All messages are formatted using Java's MessageFormat class. # Apostrophe characters ' need to be escaped by using two: '' # Curly brackets need to be escaped by surrounding them with single apostrophes '{' '{hello}' # # L=Launcher, B=Boot, P=Parser, C=cache S=security # # General NullParameter=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 Null ButAllow=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c ButBrowse=\u041e\u0431\u0437\u043e\u0440... ButCancel=\ \u041e\u0442\u043c\u0435\u043d\u0430 ButClose=\u0417\u0430\u043a\u0440\u044b\u0442\u044c ButAdvancedOptions=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 ButLunchFullItwSettings=\u0417\u0430\u043f\u0443\u0441\u043a \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 ButCopy=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 ButMoreInformation=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f... ButOk=\u041e\u041a ButProceed=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c ButRun=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c ButSandbox=\u0418\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 ButApply=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c ButDone=\u0413\u043e\u0442\u043e\u0432\u043e ButShowDetails=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 ButHideDetails=\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 ButYes=\u0414\u0430 ButNo=\u041d\u0435\u0442 BUTControlledBy=\u041f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c {0} BUTmodified=\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e BUTback=\u041d\u0430\u0437\u0430\u0434 BUTforward=\u0412\u043f\u0435\u0440\u0451\u0434 BUTreload=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c ITWdocsMissingAuthors=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0444\u0430\u0439\u043b\u0430 AUTHORS HEADLESS_MISSCONFIGURED=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. IcedTea-Web \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u043e \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0435\u0442. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. CertWarnRunTip=\u0414\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 CertWarnSandboxTip=\u041d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 CertWarnCancelTip=\u041d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f CertWarnPolicyTip=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b CertWarnPolicyEditorItem=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 CertWarnHTTPSAcceptTip=\u041f\u0440\u0438\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c HTTPS-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e CertWarnHTTPSRejectTip=\u041d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c HTTPS-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 AFileOnTheMachine=\u0444\u0430\u0439\u043b \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 AlwaysAllowAction=\u0412\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 AlwaysForbidAction=\u0412\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 Usage=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435: Error=\u041e\u0448\u0438\u0431\u043a\u0430 Warning=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 Continue=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? Field=\u041f\u043e\u043b\u0435 From=\u041e\u0442 Name=\u0418\u043c\u044f Password=\u041f\u0430\u0440\u043e\u043b\u044c: Publisher=\u0418\u0437\u0434\u0430\u0442\u0435\u043b\u044c Unknown=<\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e> Username=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: Value=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Version=\u0412\u0435\u0440\u0441\u0438\u044f # about dialogue AboutDialogueTabAbout=\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 AboutDialogueTabAuthors=\u0410\u0432\u0442\u043e\u0440\u044b AboutDialogueTabChangelog=\u0416\u0443\u0440\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 AboutDialogueTabNews=\u041d\u043e\u0432\u043e\u0441\u0442\u0438 AboutDialogueTabGPLv2=GPLv2 # version check minidialogue JREversionDontMatch=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u0432\u0430\u0448\u0430 \u0441\u0440\u0435\u0434\u0430 JRE - {0} - \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 JRE - {1} JREContinueDialogSentence2=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435? JREContinueDialogSentenceTitle=\u041d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430\u044f \u0441\u0440\u0435\u0434\u0430 JRE # missing permissions dialogue MissingPermissionsMainTitle=\u0423 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f {0} \u0438\u0437 {1} \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f? MissingPermissionsInfo=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f:
    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0444\u0430\u0439\u043b\u0430 JAR
    \u0438
    \u041f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 # missing Application-Library-Allowable-Codebase dialogue ALACAMissingMainTitle=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 {0} \u0438\u0437 {1} \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439: {2} \u0411\u0443\u0434\u044c\u0442\u0435 \u043e\u0447\u0435\u043d\u044c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435? ALACAMissingInfo=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f:
    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0444\u0430\u0439\u043b\u0430 JAR
    \u0438
    \u041f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 # matching Application-Library-Allowable-Codebase dialogue ALACAMatchingMainTitle=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 {0} \u0438\u0437 {1} \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439:
    {2}
    \u0412\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435? ALACAMatchingInfo=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f:
    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0444\u0430\u0439\u043b\u0430 JAR
    \u0438
    \u041f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 MACDisabledMessage=\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b. MACCheckSkipped=\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 {0} \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 deployment.manifest.attributes.check \u043d\u0435 \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ALL \u0438\u043b\u0438 \u043e\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 {1} \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u043e\u043f\u0446\u0438\u0439 # LS - Severity LSMinor=\u041d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f LSFatal=\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f # LC - Category LCSystem=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 LCExternalLaunch=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 LCFileFormat=\u041e\u0448\u0438\u0431\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0444\u0430\u0439\u043b\u0430 LCReadError=\u041e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f LCClient=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f LCLaunching=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 LCNotSupported=\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c LCInit=\u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 LAllThreadGroup=\u0412\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f JNLP LNullUpdatePolicy=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 null. LThreadInterrupted=\u041f\u043e\u0442\u043e\u043a \u0431\u044b\u043b \u043f\u0440\u0435\u0440\u0432\u0430\u043d \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u0430. LThreadInterruptedInfo=\u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0432\u0437\u0430\u0438\u043c\u043e\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438. \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435/\u0431\u0440\u0430\u0443\u0437\u0435\u0440. LCouldNotLaunch=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0444\u0430\u0439\u043b JNLP. LCouldNotLaunchInfo=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 javaws/browser \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043e\u0442\u0447\u0451\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. LCantRead=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b JNLP. LCantReadInfo=\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043e\u0442\u0447\u0451\u0442\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 IcedTea-Web. LNullLocation=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 .jnlp. LNullLocationInfo=\u0411\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 JNLP \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 JVM, \u043d\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u044e\u044e JVM, \u0441\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b .jnlp \u043b\u0438\u0431\u043e \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043b\u0438\u0431\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. LNetxJarMissing=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b javaws.jar. LNetxJarMissingInfo=\u0411\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 JNLP \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 JVM, \u043d\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b javaws.jar. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u044e\u044e JVM, \u0441\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b javaws.jar. LNotToSpec=\u0424\u0430\u0439\u043b JNLP \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u043c. LNotToSpecInfo=\u0424\u0430\u0439\u043b JNLP \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 JNLP. \u0421\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u0444\u0430\u0439\u043b\u0430. LNotApplication=\u041d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. LNotApplicationInfo=\u0411\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430, \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0442 \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. LNotApplet=\u041d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u043c \u0430\u043f\u043b\u0435\u0442\u0430. LNotAppletInfo=\u0411\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430, \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0442 \u0444\u0430\u0439\u043b\u0430 \u0430\u043f\u043b\u0435\u0442\u0430, \u043a\u0430\u043a \u0430\u043f\u043b\u0435\u0442\u0430. LNoInstallers=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f. LNoInstallersInfo=\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 JNLP \u0435\u0449\u0451 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430. LInitApplet=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043f\u043b\u0435\u0442. LInitAppletInfo=\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 "\u043a\u043d\u043e\u043f\u043a\u0443 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439". LInitApplication=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. LInitApplicationInfo=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 javaws. LNotLaunchable=\u041d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u043c JNLP. LNotLaunchableInfo=\u0424\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c JNLP, \u0430\u043f\u043b\u0435\u0442\u043e\u043c \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u043e\u043c. LCantDetermineMainClass=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 Main-Class. LCantDetermineMainClassInfo=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. LUnsignedJarWithSecurity=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c JAR. LUnsignedJarWithSecurityInfo=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0444\u0430\u0439\u043b\u044b JAR \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b. LSignedJNLPAppDifferentCerts=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 JNLP \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u043e\u0434\u043d\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c. LSignedJNLPAppDifferentCertsInfo=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f JNLP \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0434\u0438\u043d\u043e\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435. LUnsignedApplet=\u0410\u043f\u043b\u0435\u0442 \u043d\u0435 \u0431\u044b\u043b \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d. LUnsignedAppletPolicyDenied=\u0410\u043f\u043b\u0435\u0442 \u043d\u0435 \u0431\u044b\u043b \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d. \u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u043b\u0430 \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. LUnsignedAppletUserDenied=\u0410\u043f\u043b\u0435\u0442 \u043d\u0435 \u0431\u044b\u043b \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u0438 \u043d\u0435 \u0441\u0442\u0430\u043b \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c. LPartiallySignedApplet=\u0410\u043f\u043b\u0435\u0442 \u0431\u044b\u043b \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d. LPartiallySignedAppletUserDenied=\u0410\u043f\u043b\u0435\u0442 \u0431\u044b\u043b \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d, \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0435\u043c\u0443. LSignedAppJarUsingUnsignedJar=\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b JAR. LSignedAppJarUsingUnsignedJarInfo=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b JAR \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d, \u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 JAR, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b. LRunInSandboxError=\u0412\u044b\u0437\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u043e\u0437\u0434\u043d\u043e. LRunInSandboxErrorInfo=\u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0430\u043f\u043b\u0435\u0442\u0430 \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b. LSignedJNLPFileDidNotMatch=\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b JNLP \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443 JNLP. LNoSecInstance=\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f {0}. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f LCertFoundIn={0} \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0432 cacerts ({1}) LSingleInstanceExists=\u0423\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430. \u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440. JNotApplet=\u0424\u0430\u0439\u043b \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043f\u043b\u0435\u0442\u043e\u043c. JNotApplication=\u0424\u0430\u0439\u043b \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. JNotComponent=\u0424\u0430\u0439\u043b \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c. JNotInstaller=\u0424\u0430\u0439\u043b \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u043e\u043c. JInvalidExtensionDescriptor=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0443 (name={1}, location={2}). LNotVerified=\u0424\u0430\u0439\u043b\u044b JAR \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u044b. LCancelOnUserRequest=\u041e\u0442\u043c\u0435\u043d\u0435\u043d\u043e \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. LFatalVerification=\u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b JAR \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. LFatalVerificationInfo=\u0412 \u043a\u043b\u0430\u0441\u0441\u0435 JarCertVerifier \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b cacerts \u0438\u043b\u0438 trusted.certs \u043c\u043e\u0433\u043b\u0430 \u0441\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. LNotVerifiedDialog=\u0423\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0435 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b JAR. LAskToContinue=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f? # Parser PInvalidRoot=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c JNLP. PNoResources=\u041d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (resources). PUntrustedNative=\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (nativelib) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b. PExtensionHasJ2SE=\u042d\u043b\u0435\u043c\u0435\u043d\u0442 j2se \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u0432 \u0444\u0430\u0439\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. PInnerJ2SE=\u042d\u043b\u0435\u043c\u0435\u043d\u0442 j2se \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 j2se. PTwoMains=\u0414\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (resources) (\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d) PNativeHasMain=\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (nativelib). PNoInfoElement=\u041d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (information). PMissingTitle=\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 PMissingVendor=\u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a PMissingElement=\u0420\u0430\u0437\u0434\u0435\u043b {0} \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u0438. \u0412 \u0444\u0430\u0439\u043b\u0435 JNLP \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. PMissingMandatoryWarning=\u042d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435: PMissingMandatorySubstitution=\u041f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 {0}. \u041d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e! PTwoDescriptions=\u0414\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f (description) c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c kind {0} \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e. PSharing=\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u043c \u043e\u0431\u0449\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c (sharing-allowed) \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 JNLP PTwoSecurity=\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 JNLP \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (security). PEmptySecurity=\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (security) \u0443\u043a\u0430\u0437\u0430\u043d, \u043d\u043e \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439. PTwoDescriptors=\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 JNLP \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0444\u0430\u0439\u043b JNLP \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (application-desc). PTwoDesktops=\u0420\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 (desktop) PTwoMenus=\u0420\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044e (menu) PTwoTitles=\u0420\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f (title) PTwoIcons=\u0420\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u043d\u0430\u0447\u043a\u0430 (icon) PTwoUpdates=\u0420\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (update) PUnknownApplet=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0430\u043f\u043b\u0435\u0442 PBadWidth=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0430\u043f\u043b\u0435\u0442\u0430. PBadHeight=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u0430\u043f\u043b\u0435\u0442\u0430. PUrlNotInCodebase=\u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 URL-\u0430\u0434\u0440\u0435\u0441 \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430. (\u0443\u0437\u0435\u043b={0}, href={1}, \u0431\u0430\u0437\u0430={2}) PBadRelativeUrl=\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 URL-\u0430\u0434\u0440\u0435\u0441 (\u0443\u0437\u0435\u043b={0}, href={1}, \u0431\u0430\u0437\u0430={2}) PBadNonrelativeUrl=\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043d\u0435\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 URL-\u0430\u0434\u0440\u0435\u0441 (\u0443\u0437\u0435\u043b={0}, href={1}) PNeedsAttribute=\u042d\u043b\u0435\u043c\u0435\u043d\u0442 {0} \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 {1}. PBadXML=\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 XML. PBadHeapSize=\u041d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438 ({0}) # Runtime BLaunchAbout=\u0417\u0430\u043f\u0443\u0441\u043a \u043e\u043a\u043d\u0430 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435... BLaunchAboutFailure=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u043a\u043d\u043e \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 BNeedsFile=\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b .jnlp RNoAboutJnlp=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b about.jnlp BFileLoc=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 JNLP BBadProp=\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 {0} (\u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043a\u043b\u044e\u0447=\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435) BBadParam=\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 {0} (\u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0438\u043c\u044f=\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435) BNoDir=\u041a\u0430\u0442\u0430\u043b\u043e\u0433 {0} \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. BNoCodeOrObjectApplet=\u0422\u0435\u0433 \u0430\u043f\u043b\u0435\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 ''code'' \u0438\u043b\u0438 ''object'', \u0438\u043b\u0438 ''jnlp_href''. RNoResource=\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441: {0} RShutdown=\u042d\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f JVM, \u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u044b\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d. RExitTaken=\u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0443\u0436\u0435 \u0437\u0430\u0434\u0430\u043d, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c. RCantReplaceSM=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 SecurityManager \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e. RCantCreateFile=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b {0} RCantDeleteFile=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u0430\u0439\u043b {0} RCantOpenFile=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b {0} RCantWriteFile=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b {0} RFileReadOnly=\u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f RExpectedFile=\u041e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e {0} \u0431\u0443\u0434\u0435\u0442 \u0444\u0430\u0439\u043b\u043e\u043c, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0444\u0430\u0439\u043b RRemoveRPermFailed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 {0} RRemoveWPermFailed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 {0} RRemoveXPermFailed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 {0} RGetRPermFailed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 {0} RGetWPermFailed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 {0} RGetXPermFailed=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 {0} RCantCreateDir=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 {0} RCantRename=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c {0} \u0432 {1} RDenyStopped=\u0423 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439. RExitNoApp=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 JVM, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. RNoLockDir=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a ({0}) RNestedJarExtration=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b JAR. RUnexpected=\u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e {0} \u0432 {1} RConfigurationError=\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u0443\u0441\u0442\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c RConfigurationFatal=\u041e\u0428\u0418\u0411\u041a\u0410: \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438 \u0435\u0451 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 RFailingToDefault=\u041e\u0448\u0438\u0431\u043a\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. RPRoxyPacNotSupported=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0441\u0438 (Proxy Auto Config, PAC) \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f. RProxyFirefoxNotFound=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u043e\u043a\u0441\u0438 Firefox. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u043a\u0441\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f "DIRECT". RProxyFirefoxOptionNotImplemented=\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0441\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 "{0}" ({1}) \u0435\u0449\u0451 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430. RBrowserLocationPromptTitle=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a (\u0431\u0440\u0430\u0443\u0437\u0435\u0440) \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e URL-\u0430\u0434\u0440\u0435\u0441\u0430: HTMLnoneFound=\u041d\u0430 \u044d\u0442\u043e\u0439 HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0430\u043f\u043b\u0435\u0442\u044b (\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0435\u0433\u0438 object, embed \u0438 applet) HTMLmoreThenOne=\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e ({0}) \u0430\u043f\u043b\u0435\u0442\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439. \u041c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c ''all'' \u0438\u043b\u0438 \u0446\u0438\u0444\u0440\u044b, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c. # icedtea-web man (note, spaces are important due to man pages markup ITWintroL1={0}\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0432\u0435\u0431-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 (\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0430\u043f\u043b\u0435\u0442\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Java, \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e Java Web Start, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 NetX. ITWintroL2=NetX \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e \u0441\u0435\u0442\u0438, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043f\u043b\u0435\u0442\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Java. \u041f\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0445 \u0430\u043f\u043b\u0435\u0442\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b itw-settings. ITWintroL3={0} \u0442\u0430\u043a\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f {1} \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0435\u0431-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432. ITWintroUrlCaption= \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u044b Java BFileInfoAuthors=\u0418\u043c\u0435\u043d\u0430 \u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 AUTHORS \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 IcedTea-Web. BFileInfoCopying=\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 GPLv2 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 COPYING \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 IcedTea-Web. BFileInfoNews=\u041d\u043e\u0432\u043e\u0441\u0442\u0438 \u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 NEWS \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 IcedTea-Web. ITWdescO1title=\u041c\u043e\u0434\u0443\u043b\u0438 ITWdescO1text=\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 JNLP. ITWdescO2title=\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043f\u0430\u043c\u044f\u0442\u044c ITWdescO2text=\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0430 \u043e\u0431\u0449\u0435\u0439 JVM. ITWdescO3title=\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a ITWdescO3text=\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 \u043a\u044d\u0448\u0430. ITWdescO4title=\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c ITWdescO4text=\u0417\u0430\u043f\u0443\u0441\u043a \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. ITWdescO5title=\u0410\u0432\u0442\u043e\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 ITWdescO5text=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. ITWdescO6title=\u0421\u0435\u0442\u0435\u0432\u043e\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 ITWdescO6text=\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u0430 \u043d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u043e\u0432. ITWdescO7title=\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 ITWdescO7text=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f GNU. ITWdescL1=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 {0} \u0438 {1}. ITWdescWikiUrlTitle=\u0412\u0438\u043a\u0438-\u0441\u0430\u0439\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 IcedTea ITWdescItwWikiUrlTitle=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 IcedTea-Web ITWdescL2=\u041f\u043e\u043c\u043e\u0449\u044c \u043f\u043e \u0442\u0438\u043f\u043e\u0432\u044b\u043c \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 IcedTea-Web \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c {0} . ITWdescIssuesUrlTitle=\u0437\u0434\u0435\u0441\u044c ITWdescL3=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 NetX: ITWoptionsL1=\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e {0} \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0443 IcedTea \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0430 \u0412\u0438\u043a\u0438-\u0441\u0430\u0439\u0442\u0435. ITWoptionsQuickStartUrlCaption=\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a ITWoptionsCodeUrlUrlCaption=\u0421\u0442\u0438\u043b\u044c \u043a\u043e\u0434\u0430 ITWoptionsL2=\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e {0} \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 {1} \u043f\u043e IcedTea-Web \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b. \u041f\u0430\u0442\u0447\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 {2} \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 {3} ITWoptionsEclipseUrlCaption=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Eclipse ITWoptionsReproducersUrlCaption=\u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a ITWoptionsDistroUrlCaption=\u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 ITWoptionsL3=\u0423\u0447\u0430\u0441\u0442\u0438\u0435: # policyeditor man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. PEintro= - \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f javaws \u0438 lt;Bgt;\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430lt;/Bgt; PEsynopseP1=policy_file PEsynopseP2=url PEdescL1=\u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 javaws \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 IcedTea-Web. \u041e\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439 JDK (JDK Policy Tool). \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u0438 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439 (Policy Tool), \u0430 \u043d\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor). PEdescL2=\u0415\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0444\u0430\u0439\u043b \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. \u0412 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043a\u0430\u043a \u0444\u0430\u0439\u043b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438. PEexampleL1=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. PEexampleL2=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0431\u0435\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u0430. # javaws man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. JWSintro= - \u043a\u043b\u0438\u0435\u043d\u0442 Java Web Start JWSdescL1=\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 JNLP. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0444\u0430\u0439\u043b JNLP (Java Network Launch Protocol, \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Java) \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Java \u0438\u043b\u0438 \u0430\u043f\u043b\u0435\u0442\u0430 Java. \u042d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f {0}\u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 IcedTea, \u043e\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 NetX. JWSdescL2=\u0424\u0430\u0439\u043b JNLP - \u044d\u0442\u043e \u0444\u0430\u0439\u043b XML, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Java \u0438\u043b\u0438 \u0430\u043f\u043b\u0435\u0442 Java. JWSoptionsL1=\u041f\u0440\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0438 \u043e\u043f\u0446\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 .jnlp \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043e\u043f\u0446\u0438\u0438 -jnlp, \u043e\u043f\u0446\u0438\u0438 \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0441 \u043e\u043f\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u0424\u0430\u0439\u043b .html, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0430\u0439\u043b .jnlp, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0446\u0438\u0438 -html. JWSoptionsL2=\u0424\u0430\u0439\u043b JNLP \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e URL-\u0430\u0434\u0440\u0435\u0441\u043e\u043c, \u043b\u0438\u0431\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c. JWSoptionsL3=\u0424\u0430\u0439\u043b JNLP \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 (\u043a\u0430\u043a \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u0441\u043b\u0435 -jnlp \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0439\u043b .html). JWSoptionsTitle1=\u041e\u043f\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430: JWSoptionsTitle2=\u041e\u043f\u0446\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f: JWSexampleL1=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0441\u043f\u0440\u0430\u0432\u043a\u0443. JWSexampleL2=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0441\u043f\u0440\u0430\u0432\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435. JWSexampleL3=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 {0}, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0437 {1}, \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u0435\u0433\u043e, \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u043d\u0430 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435. # Boot options, message should be shorter than this ----------------> BOUsage=[-run-options] \u0444\u0430\u0439\u043b JNLP BOUsage2=[-control-options] BOJnlp= \u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 JNLP \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 (URL-\u0430\u0434\u0440\u0435\u0441 \u0438\u043b\u0438 \u0444\u0430\u0439\u043b). BOHtml= \u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 HTML \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 (URL-\u0430\u0434\u0440\u0435\u0441 \u0438\u043b\u0438 \u0444\u0430\u0439\u043b). \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 ALL \u0438\u043b\u0438 \u0446\u0438\u0444\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 1 2 5), \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e. BOArg= \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c. BOParam= \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0430\u043f\u043b\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c. BOProperty= \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c. BOUpdate= \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. BOLicense= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e GPL \u0438 \u0432\u044b\u0439\u0442\u0438. BOVerbose= \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434. BOAbout= \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. BOVersion= \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0432\u0435\u0440\u0441\u0438\u044e IcedTea-Web \u0438 \u0432\u044b\u0439\u0442\u0438. BONosecurity= \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c deployment.security.itw.ignorecertissues \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439 BONoupdate= \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439. BOHeadless= \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b. BOStrict= \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0444\u0430\u0439\u043b\u0430 JNLP. BOViewer= \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0449\u0438\u043a \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432. BOXml= \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a XML \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 JNLP. BOredirect= \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 HTTP. BXnofork= \u041d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e JVM. BXclearcache= \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043a\u044d\u0448 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f JNLP. \u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. BXSingleCacheCleared=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043a\u044d\u0448 \u0434\u043b\u044f: {0} BXSingleCacheClearNotFound=\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d ID, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 {0}! BXSingleCacheMoreThenOneId={0} \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e ID! BXSingleCacheFileCount=\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435: {0} \u0444\u0430\u0439\u043b\u043e\u0432 BXcacheids= \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432 \u043a\u044d\u0448\u0435 ID, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. BXignoreheaders= \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 JAR. BXoffline= \u0417\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 ITW. \u0411\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u044d\u0448. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. BOHelp1= \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438. BOHelp2= \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0441\u043f\u0440\u0430\u0432\u043a\u0443 \u043f\u043e \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. BOTrustnone= \u041d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0434\u0430\u0451\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. # Itweb-settings boot commands IBOList=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 IcedTea-Web \u0438 \u0438\u0445 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. IBOGet=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. IBOInfo=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. IBOSet=\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. IBOResetAll= \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a \u0438\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c. IBOReset=\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a \u0438\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c. IBOCheck=\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u0441\u0435\u0445 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. PBOFile=\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c. \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u0438\u043c \u0444\u043b\u0430\u0433\u043e\u043c, \u044d\u0442\u043e\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043a\u0430\u043a \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f (\u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u044b\u043b \u0443\u043a\u0430\u0437\u0430\u043d \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433). \u042d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439 (Policy Tool). PBODefaultFile=\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u042d\u0442\u043e\u0442 \u0442\u043e\u0442 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f IcedTea-Web \u0434\u043b\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u0445 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u0434\u043b\u044f \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438\u043d\u043e\u0435. PBOCodebase=\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 URL-\u0430\u0434\u0440\u0435\u0441 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430 \u0430\u043f\u043b\u0435\u0442\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430; \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u043d. PBOSignedBy=\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0434\u043b\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043b\u044e\u0447\u0435\u0439. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430; \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u043d. PBOPrincipals=\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u044b \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430/\u0438\u043c\u044f \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 (\u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c) \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430; \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u043d. # Option Parser OPUnevenParams=\u0414\u043b\u044f \u043e\u043f\u0446\u0438\u0438 {0} \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c \u0447\u0451\u0442\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. # NumberOfArguments descriptions. NOAnone=\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f NOAone=\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 NOAonemore=\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 NOAnonorone=\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 NOAevennumber=\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0451\u0442\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0433\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 param=value \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 # Allowed man sections manNAME=\u0418\u041c\u042f manSYNOPSIS=\u041e\u0411\u0417\u041e\u0420 manDESCRIPTION=\u041e\u041f\u0418\u0421\u0410\u041d\u0418\u0415 manOPTIONS=\u041e\u041f\u0426\u0418\u0418 manCOMMANDS=\u041a\u041e\u041c\u0410\u041d\u0414\u042b manEXAMPLES=\u041f\u0420\u0418\u041c\u0415\u0420\u042b manFILES=\u0424\u0410\u0419\u041b\u042b manBUGS=\u041e\u0428\u0418\u0411\u041a\u0418 manAUTHOR=\u0410\u0412\u0422\u041e\u0420 manSEE_ALSO=\u0421\u041c\u041e\u0422\u0420\u0418\u0422\u0415 \u0422\u0410\u041a\u0416\u0415 # Cache CAutoGen=\u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 - \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0439\u0442\u0435 CNotCacheable={0} \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u043c\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c CDownloading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 CComplete=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e CChooseCache=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043a\u044d\u0448\u0430... CChooseCacheInfo=NetX \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u044d\u0448\u0430. CChooseCacheDir=\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u043a\u044d\u0448\u0430 CCannotClearCache=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043a\u044d\u0448 \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0437\u0436\u0435. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440(\u044b) \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f JNLP. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Java. \\\n \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043a\u044d\u0448 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e javaws -Xclearcache \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 itw-settings \u041a\u044d\u0448 -> \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b -> \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c CFakeCache=\u041a\u044d\u0448 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435. CFakedCache=\u041f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d\u043d\u044b\u0439 \u043a\u044d\u0448 \u0431\u044b\u043b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d. \u041d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c ''javaws -Xclearcache'' \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u0440\u0435\u0435. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c itw-settings \u041a\u044d\u0448 -> \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b -> \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c # extended access warning pane EXAWdesktopWants=\u042f\u0440\u043b\u044b\u043a \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u0442\u043e\u043b\u0435 (\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c) EXAWdesktopDontWants=\u042f\u0440\u043b\u044b\u043a \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u0442\u043e\u043b\u0435 (\u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c). EXAWsubmenu=\u041f\u0443\u043d\u043a\u0442 \u0432 \u043c\u0435\u043d\u044e (\u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0451\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0432 \u043f\u043e\u0434\u043c\u0435\u043d\u044e - {0}). EXAWmenuWants=\u041f\u0443\u043d\u043a\u0442 \u0432 \u043c\u0435\u043d\u044e (\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c). EXAWmenuDontWants=\u041f\u0443\u043d\u043a\u0442 \u0432 \u043c\u0435\u043d\u044e (\u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c). EXAWsettingsInfo=\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440: {0}. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432 itweb-settings \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 {1}. EXAWsettingsManage=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u043c\u0435\u043d\u044e \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 itweb-settings \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 {0}. EXAWrememberByApp=\u041f\u043e\u043c\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f EXAWrememberByPage=\u041f\u043e\u043c\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 EXAWdontRemember=\u041d\u0435 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c EXAWrememberByAppTooltip=\u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f EXAWrememberByPageTooltip=\u0412\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u0440\u0438\u043c\u0443\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 EXAWdontRememberTooltip=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0445\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 EXAWbrowser=\u0431\u0440\u0430\u0443\u0437\u0435\u0440 (\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430) EXAWgenjnlp=jnlp \u0441\u043e\u0437\u0434\u0430\u043d EXAWjnlphref=jnlp href EXAWhtml=javaws html EXAWfixhref=\u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 jnlp-href EXAWbrowserTolltip=\u042f\u0440\u043b\u044b\u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430
  • \u042d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u044f\u0440\u043b\u044b\u043a \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439
  • \u0415\u0441\u043b\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u044d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043e\u043f\u0446\u0438\u044f
  • EXAWbrowsersTolltip=\u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430 (\u0437\u0430\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 IcedTea-Web)
  • \u0411\u044b\u043b \u0437\u0430\u0434\u0430\u043d \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
  • \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440
  • EXAWgeneratedTolltip=
  • \u0424\u0430\u0439\u043b JNLP \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b
  • \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u044f\u0440\u043b\u044b\u043a \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d, javaws \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b JNLP
  • \u0417\u0430\u0442\u0435\u043c \u044d\u0442\u043e\u0442 \u0430\u043f\u043b\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0431\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430
  • \u042d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e.
  • EXAWhrefTolltip=\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u043f\u043b\u0435\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0444\u0430\u0439\u043b JNLP, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.
  • \u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b JNLP \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432.
  • Javaws \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0438 \u044d\u0442\u043e\u0442 \u0430\u043f\u043b\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u043d\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430
  • \u042d\u0442\u043e \u0437\u0432\u0443\u0447\u0438\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442
  • EXAWhtmlTolltip=\u041f\u0443\u0442\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f -html, javaws \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c html \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0430\u043f\u043b\u0435\u0442, \u0438 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043d\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430
  • \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c
  • \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e
  • EXAWfixTolltip=\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0430\u0439\u043b\u044b JNLP, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0430\u043f\u043b\u0435\u0442, \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 JNLP
  • \u042d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442)
  • # Security SFileReadAccess=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u043a {0}. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435? SFileWriteAccess=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u043a {0}. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435? SDesktopShortcut=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u043a\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u0442\u043e\u043b\u0435 \u0438 \u043f\u0443\u043d\u043a\u0442\u0430 \u0432 \u043c\u0435\u043d\u044e. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435? WinDesktopError=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u043e\u043a \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u0442\u043e\u043b\u0435. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 IcedTea-Web \u0431\u044b\u043b\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u0430 \u0431\u0435\u0437 mslinks.jar \u0438\u043b\u0438 mslinks.jar \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438. \u041f\u043e\u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0441\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 IcedTea-Web. SSigUnverified=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0446\u0438\u0444\u0440\u043e\u0432\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435? \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443. SSigVerified=\u0426\u0438\u0444\u0440\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435? \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443. SSignatureError=\u0412 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435? \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443. SUntrustedSource=\u0414\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0446\u0438\u0444\u0440\u043e\u0432\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0435 \u0435\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443. SWarnFullPermissionsIgnorePolicy=\u0418\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043b\u044e\u0431\u044b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 Java \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b. STrustedSource=\u0426\u0438\u0444\u0440\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c. SClipboardReadAccess=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c\u0443 \u0431\u0443\u0444\u0435\u0440\u0443 \u043e\u0431\u043c\u0435\u043d\u0430. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435? SClipboardWriteAccess=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c\u0443 \u0431\u0443\u0444\u0435\u0440\u0443 \u043e\u0431\u043c\u0435\u043d\u0430. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435? SPrinterAccess=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0443. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435? SNetworkAccess=\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 {0}. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435? SNoAssociatedCertificate=<\u043d\u0435\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430> SUnverified=(\u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e) SAlwaysTrustPublisher=\u0412\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f SHttpsUnverified=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c HTTPS-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430. SRememberOption=\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e? SRememberAppletOnly=\u0414\u043b\u044f \u0430\u043f\u043b\u0435\u0442\u0430 SRememberCodebase=\u0414\u043b\u044f \u0441\u0430\u0439\u0442\u0430 {0} SUnsignedSummary=\u041d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Java \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a SUnsignedDetail=\u041d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a:
      {0}
    \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0437\u0430\u043f\u0440\u043e\u0441:
      {1}

    \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0442\u0435\u0445 \u0441\u0430\u0439\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0435. SUnsignedAllowedBefore=\u0412\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u043b\u0438 \u044d\u0442\u043e\u0442 \u0430\u043f\u043b\u0435\u0442 - ({0}). SUnsignedRejectedBefore=\u0412\u044b \u0443\u0436\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430 \u2014 ({0}). SUnsignedQuestion=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u0430\u043f\u043b\u0435\u0442\u0430? SPartiallySignedSummary=\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. SPartiallySignedDetail=\u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u043a \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u0438 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0443, \u043d\u043e \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u043e\u043c. SPartiallySignedQuestion=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435? SAuthenticationPrompt=\u0421\u0435\u0440\u0432\u0435\u0440 {0} \u043d\u0430 {1} \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e. \u041e\u043d \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 "{2}" SJNLPFileIsNotSigned=\u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0446\u0438\u0444\u0440\u043e\u0432\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0444\u0430\u0439\u043b JNLP. STrustedOnlyAttributeFailure=\u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 Trusted-Only \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 true \u0432 \u0441\u0432\u043e\u0451\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435. {0} \u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439: {1}. \u042d\u0442\u043e \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e. STOAsignedMsgFully= \u0410\u043f\u043b\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d STOAsignedMsgAndSandbox= \u0410\u043f\u043b\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u0438 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d STOAsignedMsgPartiall= \u0410\u043f\u043b\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e STempNetwork=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f STempReadFilesAndProperties=\u0414\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043e \u0432\u0441\u0435\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c STempWriteFilesAndProperties=\u0414\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c STempReflectionAndExternal=Java Reflection (\u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435) \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u043a\u043e\u0434\u0443 STempAllMedia=\u0412\u0441\u044f \u0441\u0440\u0435\u0434\u0430 (\u043f\u0435\u0447\u0430\u0442\u044c, \u0430\u0443\u0434\u0438\u043e, \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430) # Security - used for the More Information dialog SBadKeyUsage=\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 KeyUsage \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430. SBadExtendedKeyUsage=\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 ExtendedKeyUsage \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430. SBadNetscapeCertType=\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 NetscapeCertType \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430. SHasExpiredCert=\u0421\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438\u0441\u0442\u0451\u043a. SHasExpiringCert=\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c, \u0441\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0448\u0435\u0441\u0442\u0438 \u043c\u0435\u0441\u044f\u0446\u0435\u0432. SNotYetValidCert=\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0451 \u043d\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d. SUntrustedCertificate=\u0426\u0438\u0444\u0440\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. STrustedCertificate=\u0426\u0438\u0444\u0440\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. SCNMisMatch=\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430: "{0}"
    \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: "{1}" SRunWithoutRestrictions=\u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u0431\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 Java. SCertificateDetails=\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0435 # Security - certificate information SIssuer=\u0418\u0437\u0434\u0430\u0442\u0435\u043b\u044c SSerial=\u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 SMD5Fingerprint=\u041e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a MD5 SSHA1Fingerprint=\u041e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a SHA1 SSignature=\u041f\u043e\u0434\u043f\u0438\u0441\u044c SSignatureAlgorithm=\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0438 SSubject=\u0421\u0443\u0431\u044a\u0435\u043a\u0442 SValidity=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c # Certificate Viewer CVCertificateViewer=\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b CVCertificateType=\u0422\u0438\u043f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 CVDetails=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 CVExport=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 CVExportPasswordMessage=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u043a\u043b\u044e\u0447\u0430: CVImport=\u0418\u043c\u043f\u043e\u0440\u0442 CVImportPasswordMessage=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0430\u0439\u043b\u0443: CVIssuedBy=\u041a\u0435\u043c \u0432\u044b\u0434\u0430\u043d CVIssuedTo=\u041a\u043e\u043c\u0443 \u0432\u044b\u0434\u0430\u043d CVPasswordTitle=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f CVRemove=\u0423\u0434\u0430\u043b\u0438\u0442\u044c CVRemoveConfirmMessage=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442? CVRemoveConfirmTitle=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 - \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442? CVUser=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c CVSystem=\u0421\u0438\u0441\u0442\u0435\u043c\u0430 # KeyStores: see KeyStores.java KS=\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 KSCerts=\u0414\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b KSJsseCerts=\u0414\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b JSSE KSCaCerts=\u0414\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0426\u0421 KSJsseCaCerts=\u0414\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b JSSE \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 KSClientCerts=\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 # KeyStores: set password KSresultUntilNow=\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e {0} \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u043a\u043b\u044e\u0447\u0435\u0439 {1}. \u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438: {2} KSinvalidPassword=\u041d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c? KSheadlesWarning=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u041e\u041a. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0438, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0443 \u0412\u0412\u041e\u0414 \u0432 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435. KSnwPassHelp=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u041e\u041a. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u0435. HeadlessDialogues=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 `exit`, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 ITW, \u0438\u043b\u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043e\u0434\u043d\u043e \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043b\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u044f\u0442\u044c \u043e\u0442\u0432\u0435\u0442 "R " \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 "RC " \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430. AWPstdoutHint1=\u041c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 YES/NO \u0438\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0439 AccessWarningPaneComplexReturn.readValue. AWPstdoutHint2=\u043f\u0440\u0438\u043c\u0435\u0440: YES,D(not_found_browser,false,null,true,)M(firefox,false,null,false,) AWPstdoutHint3=\u0433\u0434\u0435: global_answer,desktop_shortcut(browser_bin,fixJnlpHref,type:null_or_one_of{0},really_create)same_for_menu... PAPstdinInfo=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0418\u041c\u042f \u043f\u0440\u043e\u0431\u0435\u043b \u041f\u0410\u0420\u041e\u041b\u042c. \u0412 \u0438\u043c\u0435\u043d\u0438 \u043f\u043e \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u043b\u044b: HDwrongValue=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435? # HTTP 511 Headless511line0=*** \u041d\u0430\u0439\u0434\u0435\u043d\u044b URL-\u0430\u0434\u0440\u0435\u0441\u0430 *** Headless511line1=ITW \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 511 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. Headless511line2=\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 URL-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e. \u0417\u0430\u0442\u0435\u043c \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043e\u0442\u0432\u0435\u0442. Headless511line3=\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Xless \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 Lynx \u0438\u043b\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Xfull -browser less \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `javaws {0}` ITW. Exit511=\u0412\u044b\u0439\u0442\u0438 \u0438\u0437 IcedTea-Web Ignore511=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u0435 Header511=

    HTTP 511 \u2014 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f

    \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u043d\u0438\u0436\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435

    \u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 511 \u2014 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f # Browser BrowserGoTo=\u041f\u0435\u0440\u0435\u0439\u0442\u0438: BrowserSource=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a BrowserSocket=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043a\u0435\u0442 BrowserSocketHelp=\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043e, \u0434\u043b\u044f URL \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043a\u0435\u0442. \u041c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.
    \u041d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c\u0441\u044f BrowserOpenExternal=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 BrowserOpeninternal=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 BrowserCopyUrlToClip=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 BrowserClearAll=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 BrowserWarningLine1=\u041f\u0420\u0415\u0414\u0423\u041f\u0420\u0415\u0416\u0414\u0415\u041d\u0418\u0415: \u044d\u0442\u043e\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 HTML 3.2, \u043e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446! BrowserWarningLine2=\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439! BrowserArg=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438! # Deployment Configuration messages DCIncorrectValue=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e "{0}" \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 "{1}". \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f {2}. DCInternal=\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043e\u0448\u0438\u0431\u043a\u0430: {0} DCSourceInternal=<\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439> DCUnknownSettingWithName=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e "{0}". DCmaindircheckNotexists=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 {0}. DCmaindircheckNotdir=\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 {0} \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c. DCmaindircheckRwproblem=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435/\u0437\u0430\u043f\u0438\u0441\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 {0}. # Value Validator messages. Messages should follow "Possible values ..." VVRustCpModifiers=\u0422\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Rust! \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 CP \u0438 XBootCP \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 bootcp/cp \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041f\u0440\u0438\u043c\u0435\u0440 `...cp.add=/usr/java/rhino.jar /usr/java/scary.jar` \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430 JAR \u043a cp. \u041f\u0440\u0438\u043c\u0435\u0440: `...bootcp.remove=rhino.jar tagsoup.jar` \u0443\u0434\u0430\u043b\u0438\u0442 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430 JAR \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043f\u0443\u0442\u0438. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435. VVPossibleValues=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f {0} VVPossibleBooleanValues={0} \u0438\u043b\u0438 {1} VVPossibleFileValues=\u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0438\u043b\u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443 VVPossibleRangedIntegerValues=\u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 {0} \u0434\u043e {1} (\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e) VVPossibleUrlValues=\u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 URL-\u0430\u0434\u0440\u0435\u0441 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, http://icedtea.classpath.org/hg/) VVPossibleBrowserValues=\u0423\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 URL \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0415\u0441\u043b\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d, \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 URL. \u041f\u0440\u0438\u043c\u0435\u0440: firefox \u0438\u043b\u0438 (windows) {0}, microsoft-edge, (mac) safari, \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0438\u043f\u0430 xdg-open (linux). \u0412 \u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c wget, curl \u0438\u043b\u0438 lynx. \u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0440\u0443\u0433\u043e\u0433\u043e JNLP-\u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c javaws. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 {4}. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u044b ${1}. \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e {2}. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0443\u0434\u043e\u0431\u0435\u043d \u0432 \u0440\u0430\u0431\u043e\u0442\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 {3}, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u0432\u043e\u0434\u0438\u043b\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. VVBrowserVerificationPass=\u0412\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e: {0} VVBrowserVerificationFail=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b! VVBrowserSaveNotAllowed={0} \u0437\u0430\u0434\u0430\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f {1}. \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438. VVBrowserSaveAllowed=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e \u043a\u0430\u043a {0} # Control Panel - Main CPMainDescriptionShort=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 IcedTea-Web CPMainDescriptionLong=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 (IcedTeaNPPlugin) \u0438 javaws (NetX) # Control Panel - Tab Descriptions CPAboutDescription=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f IcedTea. CPNetworkSettingsDescription=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f IcedTea-Web \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438. CPTempInternetFilesDescription=Java \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435. CPJRESettingsDescription=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u0441\u0440\u0435\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Java \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 Java. CPCertificatesDescription=\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0441\u043b\u0443\u0436\u0430\u0442 \u0434\u043b\u044f \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0446\u0435\u043d\u0442\u0440\u043e\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. CPSecurityDescription=\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. CPDebuggingDescription=\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 CPDesktopIntegrationDescription=\u0423\u043a\u0430\u0436\u0438\u0442\u0435, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044f\u0440\u043b\u044b\u043a\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u0442\u043e\u043b\u0435. CPDesktopIntegrationShowIntegrations=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u0441\u0442\u043e\u043b\u043e\u043c \u0438 \u043c\u0435\u043d\u044e CPDesktopIntegrationLinuxOnly=\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u0441\u0442\u043e\u043b\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f Linux. \u041f\u0440\u0438\u043d\u043e\u0441\u0438\u043c \u0438\u0437\u0432\u0438\u043d\u0435\u043d\u0438\u044f CPJVMPluginArguments=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b JVM \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f. CPJVMitwExec=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 JVM \u0434\u043b\u044f IcedTea-Web \u2014 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f OpenJDK CPJVMitwExecValidation=\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 JVM \u0434\u043b\u044f IcedTea-Web CPJVMPluginSelectExec=\u041f\u043e\u0438\u0441\u043a JVM \u0434\u043b\u044f IcedTea-Web CPJVMnone=\u041d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043b\u044f CPJVMvalidated=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043b\u044f CPJVMvalueNotSet=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e. \u0411\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f JVM. CPJVMnotLaunched=\u041e\u0448\u0438\u0431\u043a\u0430, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435 \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u0438. CPJVMnoSuccess=\u041e\u0448\u0438\u0431\u043a\u0430, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435 \u0431\u044b\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u0432\u044b\u0432\u043e\u0434\u0435, \u043d\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 Java \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. CPJVMopenJdkFound=\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 OpenJDK CPJVMjdk5=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 JDK5. JDK7 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f. CPJVMjdk6=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 JDK6. JDK7 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f. CPJVMjdk7=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 JDK7. JDK7 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f. CPJVMjdk8=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 JDK8. JDK8 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f. CPJVMjdk9=\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 JDK9 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f. JDK8 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u0412 JDK9 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. CPJVMjdk=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f. \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0435\u0451 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0435 \u0438\u043b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438). CPJVMoracleFound=\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 Java Oracle CPJVMibmFound=\u0425\u043e\u0440\u043e\u0448\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 Java IBM CPJVMgijFound=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d gij CPJVMstrangeProcess=\u041f\u0443\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b, \u043d\u043e \u043e\u043d \u043d\u0435 \u0431\u044b\u043b \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044e Java \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u0438. CPJVMnotDir=\u041e\u0448\u0438\u0431\u043a\u0430. \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c. CPJVMisDir=\u041e\u041a. \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c. CPJVMnoJava=\u041e\u0448\u0438\u0431\u043a\u0430, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 bin/java. CPJVMjava=\u041e\u041a. \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 bin/java. CPJVMnoRtJar=\u041e\u0448\u0438\u0431\u043a\u0430. \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 lib/rt.jar CPJVMrtJar=OK. \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 lib/rt.jar. CPJVMPluginAllowTTValidation=\u041d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c JRE CPJVMNotokMessage1=\u0412\u044b \u0432\u0432\u0435\u043b\u0438 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 JDK:
    • {0}
    \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435: CPJVMNotokMessage2=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:
    * \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435 \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b
    * \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u043e\u0442 OpenJDK
    \u0421 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c JDK, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c IcedTea-Web.
    \u0415\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u0431\u043e\u0439, \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e {0} \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:
    • {1}
    \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b OpenJDK \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0412 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u0441\u0432\u043e\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u0445. CPJVMconfirmInvalidJdkTitle=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 JDK CPJVMconfirmReset=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e? CPPolicyDetail=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 Java \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b. CPPolicyTooltip=\u041e\u0442\u043a\u0440\u044b\u0442\u044c {0} \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 CPPolicyEditorNotFound=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e policytool \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 PATH. # Control Panel - Buttons CPButAbout=\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435... CPButNetworkSettings=\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b... CPButSettings=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b... CPButView=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c... CPButCertificates=\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b... CPButSimpleEditor=\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 CPButAdvancedEditor=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 # Control Panel - Headers CPHead=\u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f IcedTea-Web CPHeadAbout=\u00a0\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435\u00a0IcedTea-Web\u00a0 CPHeadNetworkSettings=\u00a0\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u0435\u0442\u0438\u00a0 CPHeadTempInternetFiles=\u00a0\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430\u00a0 CPHeadJRESettings=\u00a0\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0440\u0435\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Java\u00a0 CPHeadCertificates=\u00a0\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b\u00a0 CPHeadDebugging=\u00a0\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u043b\u0430\u0434\u043a\u0438\u00a0 CPHeadDesktopIntegration=\u00a0\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u0441\u0442\u043e\u043b\u043e\u043c\u00a0 CPHeadSecurity=\u00a0\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\u00a0 CPHeadJVMSettings=\u00a0\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b JVM\u00a0 CPHeadPolicy=\u00a0\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438\u00a0 # Control Panel - Tabs CPTabAbout=\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 IcedTea-Web CPTabCache=\u041a\u044d\u0448 CPTabCertificate=\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b CPTabClassLoader=\u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 CPTabDebugging=\u041e\u0442\u043b\u0430\u0434\u043a\u0430 CPTabDesktopIntegration=\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u0441\u0442\u043e\u043b\u043e\u043c CPTabMenuShortcuts=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044f\u0440\u043b\u044b\u043a\u0430\u043c\u0438, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u043c\u0435\u043d\u044e CPTabNetwork=\u0421\u0435\u0442\u044c CPTabRuntimes=\u0421\u0440\u0435\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f CPTabSecurity=\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c CPTabJVMSettings=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b JVM CPTabPolicy=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 # Control Panel - AboutPanel CPAboutInfo=\u042d\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f deployments.properties.
    \u0427\u0430\u0441\u0442\u044c \u043e\u043f\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f.
    \u0418\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Java \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e OpenJDK.
    # Control Panel - AdvancedProxySettings APSDialogTitle=\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Settings APSServersPanel=\u0421\u0435\u0440\u0432\u0435\u0440\u044b APSProxyTypeLabel=\u0422\u0438\u043f APSProxyAddressLabel=\u0410\u0434\u0440\u0435\u0441 \u043f\u0440\u043e\u043a\u0441\u0438 APSProxyPortLabel=\u041f\u043e\u0440\u0442 \u043f\u0440\u043e\u043a\u0441\u0438 APSLabelHTTP=HTTP APSLabelSecure=\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e APSLabelFTP=FTP APSLabelSocks=Socks APSSameProxyForAllProtocols=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432. APSExceptionsLabel=\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f APSExceptionsDescription=\u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 APSExceptionInstruction=\u041e\u0442\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u043e\u0447\u043a\u043e\u0439 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. # Control Panel - DebugginPanel CPDebuggingPossibilites=\u0416\u0443\u0440\u043d\u0430\u043b \u0432\u044b\u0432\u043e\u0434\u043e\u0432 DPEnableLogging=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043a\u0443 DPEnableLoggingHint=\u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0432\u043a\u043b\u044e\u0447\u0451\u043d, \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0436\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 -verbose \u0438\u043b\u0438 ICEDTEAPLUGIN_DEBUG=true DPEnableHeaders=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 DPEnableHeadersHint=\u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0432\u043a\u043b\u044e\u0447\u0451\u043d, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 DPEnableFile=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 DPEnableLegacyFileLog=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c java.util.logging \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u0430\u0439\u043b DPEnableClientAppFileLogging=\u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u0432\u044b\u0432\u043e\u0434\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 DPEnableLegacyFileLogHint=\u0415\u0441\u043b\u0438 java.util.logging \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0436\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u0440\u0435\u0434\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 DPEnableClientAppFileLoggingHint=\u0416\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 java.util.logging CPFilesLogsDestDir=\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 CPFilesLogsDestDirResert=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e DPEnableFileHint=\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0444\u0430\u0439\u043b \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 {0} DPEnableStds=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b DPEnableStdsHint=\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0432\u044b\u0432\u043e\u0434\u0430\u0445 DPEnableSyslog=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0436\u0443\u0440\u043d\u0430\u043b\u044b DPEnableSyslogHint=\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0445 DPDisable=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c DPHide=\u0421\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 DPShow=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 DPShowPluginOnly=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f DPShowJavawsOnly=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 javaws DPJavaConsole=\u041a\u043e\u043d\u0441\u043e\u043b\u044c Java DPJavaConsoleDisabledHint=\u041a\u043e\u043d\u0441\u043e\u043b\u044c Java \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 itweb-settings \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u0438. # PolicyEditor PETitle=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor) PETitleWithPath=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor) - {0} PETitleWithChangesMade={0} * PEReadProps=\u0427\u0442\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 PEReadPropsDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 PEWriteProps=\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 PEWritePropsDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c (\u043f\u0435\u0440\u0435)\u0437\u0430\u043f\u0438\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 PEReadFiles=\u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PEReadFilesDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 PEWriteFiles=\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b PEWriteFilesDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b\u044b \u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 PEDeleteFiles=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PEDeleteFilesDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 PEReadSystemFiles=\u0427\u0442\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PEReadSystemFilesDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043e \u0432\u0441\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 PEWriteSystemFiles=\u0417\u0430\u043f\u0438\u0441\u044c \u0432\u0441\u0435\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PEWriteSystemFilesDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 PEReadTempFiles=\u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PEReadTempFilesDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PEWriteTempFiles=\u0417\u0430\u043f\u0438\u0441\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b PEWriteTempFilesDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PEDeleteTempFiles=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PEDeleteTempFilesDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PEAWTPermission=\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 PEAWTPermissionDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 AWT PEClipboard=\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u0443\u0444\u0435\u0440\u0443 \u043e\u0431\u043c\u0435\u043d\u0430 PEClipboardDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043d\u0435\u0433\u043e PENetwork=\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0442\u0438 PENetworkDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f PEPrint=\u041f\u0435\u0447\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 PEPrintDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0447\u0430\u0442\u0438 PEPlayAudio=\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u0432\u0443\u043a\u043e\u0432 PEPlayAudioDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u0432\u0443\u043a\u043e\u0432, \u043d\u043e \u043d\u0435 \u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044c PERecordAudio=\u0417\u0430\u043f\u0438\u0441\u044c \u0430\u0443\u0434\u0438\u043e PERecordAudioDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0430\u0443\u0434\u0438\u043e, \u043d\u043e \u043d\u0435 \u0435\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 PEReflection=Java Reflection (\u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435) PEReflectionDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a API Java Reflection (\u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435) PEClassLoader=\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 PEClassLoaderDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441 Reflection) PEClassInPackage=\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u0430\u043c PEClassInPackageDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 (\u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441 Reflection) PEDeclaredMembers=\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 PEDeclaredMembersDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043a\u0440\u044b\u0442\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 Java (\u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441 Reflection) PEAccessThreads=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 PEAccessThreadsDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0437\u0430\u043f\u0443\u0441\u043a, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 PEAccessThreadGroups=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 PEAccessThreadGroupsDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0437\u0430\u043f\u0443\u0441\u043a, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 PEExec=\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 PEExecDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 PEGetEnv=\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u044b PEGetEnvDetail=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u044b PECouldNotOpen=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 PECouldNotSave=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 PEAddEntry=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c... PERemoveEntry=\u0423\u0434\u0430\u043b\u0438\u0442\u044c PEEntryPrompt=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 PEAddPrincipal=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 PERemovePrincipal=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 PEEditPrincipal=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 PEGlobalSettings=\u0412\u0441\u0435 \u0430\u043f\u043b\u0435\u0442\u044b PESaveChanges=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0445\u043e\u0434\u043e\u043c? PEChangesSaved=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b PECheckboxLabel=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f PEEntriesLabel=\u0417\u0430\u043f\u0438\u0441\u0438 PEFileMenu=\u0424\u0430\u0439\u043b PENewMenuItem=\u0421\u043e\u0437\u0434\u0430\u0442\u044c PEOpenMenuItem=\u041e\u0442\u043a\u0440\u044b\u0442\u044c... PEOpenDefaultMenuItem=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e PESaveMenuItem=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c PESaveAsMenuItem=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a... PEExitMenuItem=\u0412\u044b\u0439\u0442\u0438 PEEntryMenu=\u0417\u0430\u043f\u0438\u0441\u044c PEAddEntryItem=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c... PERemoveEntryItem=\u0423\u0434\u0430\u043b\u0438\u0442\u044c PEModifySubmenuItem=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c PEModifyCodebaseItem=\u0411\u0430\u0437\u0430 \u043a\u043e\u0434\u0430 PEModifySignedByItem=\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e PEModifyPrincipalsItem=\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 PECopyEntryItem=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c PEPasteEntryItem=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c... PEModifyCodebase=\u0421\u043c\u0435\u043d\u0438\u0442\u044c \u0431\u0430\u0437\u0443 \u043a\u043e\u0434\u0430 \u043d\u0430: PEModifyPrincipals=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432: PEModifySignedBy=\u0421\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f SignedBy (\u043a\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e) \u043d\u0430: PEPasteEntry=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 \u043a\u043e\u0434\u0430: PEViewMenu=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 PECustomPermissionsItem=\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f... PECodebaseInputLabel=URL-\u0430\u0434\u0440\u0435\u0441 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430: PESignedByInputLabel=SignedBy (\u043a\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e): PEPrincipalsInputLabel=\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438: PEPrincipalClassNameInputLabel=\u0418\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430: PEPrincipalPrincipalNameInputLabel=\u0418\u043c\u044f \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430: PEFileModified=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 PEFileModifiedDetail=\u0424\u0430\u0439\u043b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0432 {0} \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0451\u043d \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f. \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c? PEFileMissing=\u0424\u0430\u0439\u043b \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435. \u0411\u044b\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u0442\u0435\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c. PEGAccessUnownedCode=\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 PEGMediaAccess=\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0440\u0435\u0434\u0435 PEGRightClick=\u0429\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c/\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c PEGReadFileSystem=\u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b PEGWriteFileSystem=\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 PEClipboardError=\u041f\u043e\u0445\u043e\u0436\u0435, \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c PEInvalidPolicy=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0438: \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043b\u044f {0} \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 PEInvalidIdentifier=\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435/\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u043e\u043b\u0435\u0439. PEIdentifierMatchesAll=\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435/\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u043e\u043b\u0435\u0439. PEClipboardAccessError=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 PEDefaultFileFilePathSpecifiedError=\u041c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u0438\u0431\u043e -file (\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442), \u043b\u0438\u0431\u043e -defaultfile PEMainArgAndFileSwitchSpecifiedError=\u041c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u0438\u0431\u043e -file, \u043b\u0438\u0431\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 PESignedByEmpty=\u041f\u043e\u043b\u0435 SignedBy (\u043a\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e) \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c PEInvalidUrl=\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 URL-\u0430\u0434\u0440\u0435\u0441: {0} PEHelpMenu=\u0421\u043f\u0440\u0430\u0432\u043a\u0430 PEAboutPolicyEditorItem=\u041e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor) PEPolicyEditorHelpItem=\u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor) PEHelpDialogTitle=\u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor) PEHelpDialogContent=

    \u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor)

    \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u043c \u0430\u043f\u043b\u0435\u0442\u0430\u043c \u0438\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c Java \u043f\u0443\u0442\u0451\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439.

    \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438

    • \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435: \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b\u0448\u0438 \u0438\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0438 \u043c\u044b\u0448\u0438
    • \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430: \u043f\u0443\u0442\u0451\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439
    • \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c: \u0430\u043f\u043b\u0435\u0442\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f
    • \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435: \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c
    \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor) \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0431\u0430\u0437\u0443 \u043a\u043e\u0434\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0447\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0430\u043f\u043b\u0435\u0442\u0443 \u0438\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e Java. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0430\u043f\u043b\u0435\u0442/\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0438\u043b\u0438 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0440\u0435\u0436\u0438\u043c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435.

    \u0412 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (PolicyEditor) \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u0415\u0441\u043b\u0438 \u0449\u0451\u043b\u043a\u043d\u0443\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0438\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0448\u0443 \u0412\u0412\u041e\u0414 (\u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0433\u0440\u0443\u043f\u043f\u044b) \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0440\u044f\u0434\u043e\u043c \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430 \u0438\u043b\u0438 \u0448\u0435\u0432\u0440\u043e\u043d \u043c\u0435\u043d\u044e, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u043e. \u0422\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 \u043d\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0433\u0440\u0443\u043f\u043f\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f-\u0444\u043b\u0430\u0436\u043a\u0438. \u0427\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f. # Policy Editor CustomPolicyViewer PECPTitle=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0449\u0438\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 PECPListLabel=\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043b\u044f {0} PECPAddButton=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c PECPRemoveButton=\u0423\u0434\u0430\u043b\u0438\u0442\u044c PECPCloseButton=\u0417\u0430\u043a\u0440\u044b\u0442\u044c PECPType=\u0432\u0432\u0435\u0434\u0438\u0442\u0435 PECPTarget=\u0446\u0435\u043b\u044c PECPActions=\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f PECPPrompt=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435 \u0441\u043b\u043e\u0432\u043e "\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435" \u0438\u043b\u0438 \u0437\u043d\u0430\u043a\u0438 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f. # PolicyEditor key mnemonics. See KeyEvent.VK_* PEFileMenuMnemonic=\u0424 PEEntryMenuMnemonic=\u0417 PEViewMenuMnemonic=\u041f PEHelpMenuMnemonic=\u0421 PEAddEntryMnemonic=\u0414 PEAddEntryItemMnemonic=\u0414 PERemoveEntryMnemonic=\u0423 PERemoveEntryItemMnemonic=\u0423 PENewMenuItemMnemonic=\u0414 PEOpenMenuItemMnemonic=\u041e PEOpenDefaultMenuItemMnemonic=\u0423 PESaveMenuItemMnemonic=\u0421 PEExitMenuItemMnemonic=\u0412 PECustomPermissionsItemMnemonic=\u041d PECopyEntryItemMnemonic=\u041a PEPasteEntryItemMnemonic=\u0412 PESaveAsMenuItemMnemonic=\u041a PEModifySubmenuItemMnemonic=\u0418 PEModifyEntryCodebaseItemMnemonic=\u0417 PEModifyEntryPrincipalsItemMnemonic=\u0423 PEModifyEntrySignedByItemMnemonic=\u0415 PEAboutPolicyEditorItemMnemonic=\u041a PEPolicyEditorHelpItemMnemonic=\u0421 # See javax.swing.KeyStroke.getKeyStroke(String) PEAddEntryItemAccelerator=Ctrl+Shift+\u0414 PERemoveEntryItemAccelerator=Delete PENewMenuItemAccelerator=Ctrl+\u0414 PEOpenMenuItemAccelerator=Ctrl+\u041e PEOpenDefaultMenuItemAccelerator=Ctrl+\u0423 PESaveMenuItemAccelerator=Ctrl+\u0421 PESaveAsMenuItemAccelerator=Ctrl+Shift+\u041a PEExitMenuItemAccelerator=Ctrl+\u0412 PECustomPermissionsItemAccelerator=Ctrl+\u041d PECopyEntryItemAccelerator=Ctrl+C PEPasteEntryItemAccelerator=Ctrl+V PEModifyEntryCodebaseItemAccelerator=F2 PEModifyEntryPrincipalsItemAccelerator=Shift+F2 PEModifyEntrySignedByItemAccelerator=Ctrl+F2 PEAboutPolicyEditorCloseAccelerator=Ctrl+\u0412 #conole itself labels CONSOLErungc= \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430 CONSOLErunFinalizers= \u0417\u0430\u043f\u0443\u0441\u043a \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f CONSOLErunningFinalizers= \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435.... CONSOLEmemoryInfo= \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043f\u0430\u043c\u044f\u0442\u0438 CONSOLEsystemProperties= \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b CONSOLEclassLoaders= \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 CONSOLEthreadList= \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0442\u043e\u043a\u043e\u0432 CONSOLEthread= \u041f\u043e\u0442\u043e\u043a CONSOLEnoClassLoaders= \u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 CONSOLEmemoryMax= \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u043f\u0430\u043c\u044f\u0442\u0438 CONSOLEmemoryTotal= \u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u044a\u0451\u043c \u043f\u0430\u043c\u044f\u0442\u0438 CONSOLEmemoryFree= \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u043f\u0430\u043c\u044f\u0442\u0438 CONSOLEClean=\u041e\u0447\u0438\u0441\u0442\u043a\u0430 # console output pane labels COPsortCopyAllDate=\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0434\u0430\u0442\u0435 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 COPshowHeaders=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438: COPuser=\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c COPorigin=\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a COPlevel=\u0443\u0440\u043e\u0432\u0435\u043d\u044c COPdate=\u0434\u0430\u0442\u0430 COPthread1=\u043f\u043e\u0442\u043e\u043a 1 COPthread2=\u043f\u043e\u0442\u043e\u043a 2 COPShowMessages=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f COPstdOut=\u0441\u0442\u0430\u043d\u0434. \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u0432\u043e\u0434\u0430 COPstdErr=\u0441\u0442\u0430\u043d\u0434. \u043f\u043e\u0442\u043e\u043a \u043e\u0448\u0438\u0431\u043e\u043a COPjava=java COPplugin=\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c COPpreInit=\u043f\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f COPpluginOnly=\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c COPSortBy=\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e COPregex=\u0424\u0438\u043b\u044c\u0442\u0440 \u043d\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 COPAsArrived=\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e (\u0431\u0435\u0437 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438) COPcode=\u043a\u043e\u0434 COPmessage=\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 COPSearch=\u041f\u043e\u0438\u0441\u043a COPautoRefresh=\u0430\u0432\u0442\u043e\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 COPrefresh=\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 COPApply=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c COPmark=\u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c COPCopyAllPlain=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 (\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442) COPCopyAllRich=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 (\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442) COPnext=\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439>>> COPprevious=<<<\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 COPcaseSensitive=\u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 COPincomplete=\u043d\u0435\u043f\u043e\u043b\u043d\u044b\u0439 COPhighlight=\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 COPwordWrap=\u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u043b\u043e\u0432 COPdebug=\u043e\u0442\u043b\u0430\u0434\u043a\u0430 COPinfo=\u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f COPpostInit=\u043f\u043e\u0441\u0442\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f COPcomplete=\u043f\u043e\u043b\u043d\u044b\u0439 COPmatch=\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 COPnot=\u043d\u0435 COPrevert=\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f COPitw=IcedTea-Web COPclientApp=\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. # Control Panel - DesktopShortcutPanel DSPNeverCreate=\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c DSPAlwaysAllow=\u0412\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c DSPAskUser=\u0421\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f DSPAskIfHinted=\u0421\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 DSPAlwaysIfHinted=\u0412\u0441\u0435\u0433\u0434\u0430, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 # Control Panel - NetworkSettingsPanel NSDescription-1=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440. NSDescription0=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. NSDescription1=\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u043e\u043a\u0441\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. NSDescription2=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0441\u0438 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438. NSDescription3=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u043e\u043a\u0441\u0438 \u0438\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. NSAddress=\u0410\u0434\u0440\u0435\u0441 NSPort=\u041f\u043e\u0440\u0442 NSAdvanced=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e NSBypassLocal=\u041e\u0431\u0445\u043e\u0434 \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 NSDirectConnection=\u041f\u0440\u044f\u043c\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 NSManualProxy=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e NSAutoProxy=\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0441\u0438 NSBrowserProxy=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 NSScriptLocation=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f # Control Panel - SecurityGeneralPanel SGPAllowUserGrantSigned=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 SGPAllowUserGrantUntrust=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0438\u0437 \u043d\u0435\u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 SGPUseBrowserKeystore=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u043a\u043b\u044e\u0447\u0438 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPUsePersonalCertOneMatch=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPWarnCertHostMismatch=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0430\u0439\u0442\u0430 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043c\u0435\u043d\u0438 \u0445\u043e\u0441\u0442\u0430 SGPShowValid=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0430\u0439\u0442\u0430, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPShowSandboxWarning=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b SGPAllowUserAcceptJNLPSecurityRequests=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 JNLP SGPCheckCertRevocationList=\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u044b \u043b\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u043e\u0442\u0437\u044b\u0432\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 (Certificate Revocation List, CRL) (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPEnableOnlineCertValidate=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043e\u043d\u043b\u0430\u0439\u043d (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPEnableTrustedPublisherList=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439 (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPEnableBlacklistRevocation=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043e\u0442\u0437\u044b\u0432\u0430 \u0447\u0451\u0440\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPEnableCachingPassword=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPUseSSL2=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 ClientHello \u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0441 SSL 2.0 (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPUseSSL3=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SSL 3.0 (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) SGPUseTLS1=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c TLS 1.0 (\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) # Control Panel - TemporaryInternetFilesPanel TIFPEnableCache=\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u043c\u043e\u0451\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 TIFPLocation=\u00a0\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u00a0 TIFPLocationLabel=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 TIFPChange=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c TIFPDiskSpace=\u00a0\u0414\u0438\u0441\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u00a0 TIFPCompressionLevel=\u0412\u044b\u0431\u043e\u0440 \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0436\u0430\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 JAR TIFPNone=\u041d\u0435\u0442 TIFPMax=\u041c\u0430\u043a\u0441. TIFPCacheSize=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043e\u0431\u044a\u0451\u043c \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 (\u041c\u0411) TIFPDeleteFiles=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b TIFPViewFiles=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b TIFPCleanByApp=\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f TIFPFileChooserChooseButton=\u0412\u044b\u0431\u0440\u0430\u0442\u044c TIFPLimitCacheSize=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u044d\u0448\u0430 TIFPCacheSizeSpinnerValueTooLargeWarning=\u041f\u0420\u0415\u0414\u0423\u041f\u0420\u0415\u0416\u0414\u0415\u041d\u0418\u0415: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e (\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e: {0} \u041c\u0411) TIFPCacheSizeSpinnerLargeValueWarning=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e: {0} \u041c\u0411 TIFPCacheSizeSetToNoCaching=\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b IcedTea-Web. TIFPCacheSizeSpinnerTooltip=\u041c\u0438\u043d\u0438\u043c\u0443\u043c: {0} \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c: {1} # Control Panel - Cache Viewer CVCPDialogTitle=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0449\u0438\u043a \u043a\u044d\u0448\u0430 CVCPButRefresh=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c CVCPButDelete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c CVCPCleanCache=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c CVCPCleanCacheTip=\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043e\u0448\u0438\u0431\u043e\u043a \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u0441\u0442\u0430\u0440\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043a\u044d\u0448\u0430. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u0447\u0451\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043a\u044d\u0448 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \\\n \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043a\u044d\u0448 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e javaws -Xclearcache \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 itw-settings \u041a\u044d\u0448 -> \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b -> \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c CVCPColLastModified=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 CVCPColSize=\u0420\u0430\u0437\u043c\u0435\u0440 (\u0432 \u0431\u0430\u0439\u0442\u0430\u0445) CVCPColDomain=\u0414\u043e\u043c\u0435\u043d CVCPColType=\u0422\u0438\u043f CVCPColPath=\u041f\u0443\u0442\u044c CVCPColName=\u0418\u043c\u044f # Control Panel - desktop integration manager DIMtitle=\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u044f\u0440\u043b\u044b\u043a\u043e\u0432 IcedTea-Web DIMremoveSelected=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 DIMselectRelativeRecordsFromOtherColumns=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 DIMreloadLists=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c DIMselectAll=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 DIMclearSelection=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 DIMdescription=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044f\u0440\u043b\u044b\u043a\u0430\u043c\u0438 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 (\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 IcedTea-Web \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u0441\u0442\u043e\u043b\u043e\u043c DIMguessedDesktop=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430. DIMselectionPreview=\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e DIMaskBeforeDelete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b: {0}? DIMgeneratedJnlps=\u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b JNLP DIMgeneratedJnlpsTooltip=\u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u044b IcedTea-Web! DIMicons=\u0417\u043d\u0430\u0447\u043a\u0438 DIMiconsTooltip=\u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u043a\u0430\u043c\u0438, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 IcedTea-Web! DIMorphans=\u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b DIMorphansTooltip=\u0411\u0443\u0434\u0443\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u044f\u0440\u043b\u044b\u043a\u043e\u0432. DIMmenuItems=\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0435\u043d\u044e DIMmenuItemsTooltip=\u0412\u0441\u0435 \u044f\u0440\u043b\u044b\u043a\u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u044b IcedTea-Web! DIMdesktopItems=\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 DIMdesktopItemsTooltipL1=\u041d\u0435 \u0432\u0441\u0435 \u044f\u0440\u043b\u044b\u043a\u0438 \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u0442\u043e\u043b\u0435 \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b IcedTea-Web! DIMdesktopItemsTooltipL2=\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: DIMdesktopItemsTooltipL3=\u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0435 \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b IcedTea-Web DIMdesktopItemsTooltipL4=\u0442\u0451\u043c\u043d\u043e-\u0437\u0435\u043b\u0451\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u2014 \u044d\u0442\u043e \u044f\u0440\u043b\u044b\u043a\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b IcedTea-Web DIMdesktopItemsTooltipL5=\u0437\u0435\u043b\u0451\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u2014 \u044d\u0442\u043e \u044f\u0440\u043b\u044b\u043a\u0438 javaws, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b IcedTea-Web DIMdesktopItemsTooltipL6=\u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0431\u0443\u0434\u044c\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0436\u0438\u043c\u0430 `\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438` DIMgeneratedButton=\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 DIMgeneratedButtonTooltip=\u0411\u0443\u0434\u0443\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. DIMiconsButton=\u0437\u043d\u0430\u0447\u043a\u0438 DIMiconsButtonTooltip=\u0411\u0443\u0434\u0443\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u043a\u0438. # Control Panel - Misc. CPJRESupport=\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 IcedTea-Web \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 JRE. CPInvalidPort=\u0423\u043a\u0430\u0437\u0430\u043d \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0440\u0442\u0430.\n[\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0440\u0442\u043e\u0432: 1-65535] CPInvalidPortTitle=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435. # command line control panel CLNoInfo=\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u044d\u0442\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f \u043e\u043f\u0446\u0438\u044f?). CLValue=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435: {0} CLValueSource=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: {0} CLDescription=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: {0} CLUnknownCommand=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 {0} CLUnknownProperty=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u0438\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 "{0}" CLWarningUnknownProperty=\u041f\u0420\u0415\u0414\u0423\u041f\u0420\u0415\u0416\u0414\u0415\u041d\u0418\u0415: \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u0438\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 "{0}" \u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e CLNoIssuesFound=\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b. CLIncorrectValue=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e "{0}" \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 "{1}". \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f {2}. CLListDescription=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0438\u043c\u0451\u043d \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f IcedTea-Web CLGetDescription=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 CLSetDescription=\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u044d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c CLResetDescription=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.\n\u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0442\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u044e\u0442\u0441\u044f IcedTea-Web, \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. CLInfoDescription=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 CLCheckDescription=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b, \u043d\u043e \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u044b IcedTea-Web CLUnexpectedNumberOfCommands=Itweb-settings \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443. # splash screen related SPLASHerror= \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439. \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. SPLASH_ERROR= \u041e\u0428\u0418\u0411\u041a\u0410 SPLASHtitle= \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 SPLASHvendor= \u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a SPLASHhomepage= \u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 SPLASHdescription= \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 SPLASHClose= \u0417\u0430\u043a\u0440\u044b\u0442\u044c SPLASHclosewAndCopyException= \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0441\u0442\u0435\u043a\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 SPLASHexOccured= \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435... SPLASHHome= \u0414\u043e\u043c\u043e\u0439 SPLASHcantCopyEx= \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 SPLASHnoExRecorded= \u041d\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 SPLASHmainL1= \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 {0} \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0448\u0430\u0433\u0438 \u043f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u0447\u0451\u0442\u0430 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 SPLASHmainL3= \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434. SPLASHcloseAndCopyShorter= \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 SPLASHmainL4= \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434. SPLASHmainL2= \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0438\u043b\u0438 \u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0445. \u0415\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0430. SPLASHexWas= \u0418\u043c\u0435\u043b\u043e\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: SPLASHcfl= \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 SPLASHvendorsInfo= \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f SPLASHanotherInfo= \u0414\u0440\u0443\u0433\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f SPLASHdefaultHomepage= \u041d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a SPLASHerrorInInformation= \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (information), \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a SPLASHmissingInformation= \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (information), \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a SPLASHchainWas= \u042d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0430\u043f\u043b\u0435\u0442\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u044d\u0442\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0430\u043f\u043b\u0435\u0442\u0430\u043c\u0438. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043e\u0442\u0447\u0451\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0430\u043f\u043b\u0435\u0442. CBCheckFile= \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckNoEntry= \u0412 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0431\u0430\u0437\u0430 \u043a\u043e\u0434\u0430. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0443 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u0430\u043f\u043b\u0435\u0442\u0430. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckUnsignedPass= \u0411\u0430\u0437\u0430 \u043a\u043e\u0434\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0443 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430 \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435, \u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckUnsignedFail= \u0411\u0430\u0437\u0430 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u041d\u0415 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0430\u0437\u0435 \u043a\u043e\u0434\u0430, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432 \u0435\u0433\u043e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckOkSignedOk= \u0411\u0430\u0437\u0430 \u043a\u043e\u0434\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0443 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430 \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckSignedAppletDontMatchException= \u0417\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u0438\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0430\u0437\u0430 \u043a\u043e\u0434\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432 \u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435. \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: {0}. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: {1}. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckSignedFail= \u0411\u0430\u0437\u0430 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u041d\u0415 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0430\u0437\u0435 \u043a\u043e\u0434\u0430, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432 \u0435\u0433\u043e \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e. \u041d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. # itweb man base (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. ITWTBbugs=\u041a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043e\u0442\u0447\u0451\u0442 \u043e \u043d\u0435\u0439 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 ITWTBdebug=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u043a \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c -verbose \u0438\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 itw-settings, \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e ICEDTEAPLUGIN_DEBUG) \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0432\u044b\u0432\u043e\u0434 (\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 Java) \u0441 URL-\u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u0444\u0430\u0439\u043b JNLP \u0438\u043b\u0438 HTML (\u0438\u043b\u0438 \u0444\u0430\u0439\u043b JNLP / HTML, \u0438\u043b\u0438 \u0441\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435) \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0442\u0447\u0451\u0442\u0430 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. ITWTBwritten=\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b IcedTea. ITWTBdirs=\u0413\u0434\u0435 $XDG_CONFIG_DIR, $XDG_CACHE_DIR \u0438 $XDG_RUNTIME_DIR \u0443\u043a\u0430\u0437\u0430\u043d\u044b, \u043a\u0430\u043a ~/.config, ~/.cache (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b: /tmp \u0438\u043b\u0438 /var/tmp). # itweb-settings man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. ITWSintro= \u2014 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 javaws \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 ITWSsynops=\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u044b IWSdescL1=\u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0442\u0430\u043a \u0438 \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 javaws \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 IcedTea-Web. IWSdescL2=\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0435. IWSdescL3=\u0412 \u0440\u0435\u0436\u0438\u043c\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0438\u0441\u043a, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043d\u0435 \u0442\u0440\u0430\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. IWSexampleL1=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f IWSexampleL2=\u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 `{0}`. ITWSdefault=\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e IWSexampleL3=\u0418\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 IWSexampleL31=(\u043a\u043b\u044e\u0447, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u0435\u0441\u043b\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f)): IWSexampleL32=(\u043a\u043b\u044e\u0447 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e): IWSpossible=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e: # itweb-plugin man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. ITWPintro= \u2014 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 Java \u0432 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 ITWPsynopsL1=\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0432\u0430\u0448\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431 \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445. ITWPsynopsL2=\u0412 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c {0} (\u0438\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443). \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 {1} ITWPsynopsL3= \u0411\u0440\u0430\u0443\u0437\u0435\u0440\u044b, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0441 Mozilla, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Firefox, Midori, Epiphany, Chrome \u0438\u043b\u0438 Chromium \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442: ITWPsynopsL4= \u0411\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 Opera, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Opera \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442: ITWPtrademarks=\u0412\u0441\u0435 \u0442\u043e\u0432\u0430\u0440\u043d\u044b\u0435 \u0437\u043d\u0430\u043a\u0438 \u0442\u0440\u0435\u0442\u044c\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u0438\u0445 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430\u043c # files descriptions FILEpipe=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u043d\u0430\u043b \u0432\u0432\u043e\u0434\u0430 \u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 native2java \u0438 (\u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e) \u043a\u0430\u043d\u0430\u043b \u043e\u0442\u043b\u0430\u0434\u043a\u0438. FILEmozillauser=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 Mozilla. FILEmozillaglobal64=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 Mozilla, 64-\u0431\u0438\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. FILEmozillaglobal32=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 Mozilla, 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. FILEopera64=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 Opera, 64-\u0431\u0438\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. FILEopera32=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 Opera, 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. TAGSOUPtail=\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 tagsoup \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u043e\u0439 ITW. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0438/\u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0430\u0432\u0442\u043e\u0440\u0430\u043c \u043f\u0430\u043a\u0435\u0442\u0430. TAGSOUPnotUsed=\u0412\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e {0}, \u0443\u0434\u0430\u043b\u0438\u0442\u0435. \u0418\u043b\u0438... TAGSOUPbroken=\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0451\u043d. TAGSOUPhtmlNotUsed=\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 HTML \u0432 XML \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 tagsoup \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e. \u0423\u0434\u0430\u043b\u0438\u0442\u0435 {0}. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443. TAGSOUPhtmlBroken=\u041d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 HTML \u0432 XML \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 tagsoup. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 tagsoup (\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u0431\u043e\u0440\u043a\u0443 ITW \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438). \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443. FILEcache=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0440\u0435\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. FILErecentlyUsed=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u043a\u044d\u0448\u0435 FILEappdata=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. FILElogs=\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0430\u0439\u043b\u044b \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u0432 (\u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e), itw-cplugin-date_time.log \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, itw-javantx-date_time.log \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e. FILEicons=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 javaws \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u0442\u043e\u043b\u0435 \u0438\u043b\u0438 \u0432 \u043c\u0435\u043d\u044e FILEjnlps=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u044b JNLP, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 javaws FILEmenus=\u041f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u043d\u044e, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043c\u0435\u043d\u044e. FILEextasuser=\u0424\u0430\u0439\u043b, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0434 \u0430\u043f\u043b\u0435\u0442\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0445 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. FILEextasadmin=\u0424\u0430\u0439\u043b, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0434 \u0430\u043f\u043b\u0435\u0442\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0445 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430. FILEglobaldp=\u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f. FILEtmpappdata=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u0441\u0440\u0435\u0434\u044b. FILElocksdir=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a netx. FILEmainlock=\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 netx. FILEpolicy=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c. FILEusercerts=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. FILEjavacerts=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b Java. FILEjavadp=\u0424\u0430\u0439\u043b \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 Java. \u041d\u0430 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c {0}. FILEuserdp=\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0444\u0430\u0439\u043b \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f. # extended policy editor EPEexpert=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 EPEsave=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c EPEcancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c EPEhelp1=\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 EPEhelp2=\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0438\u043f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 EPEhelp3=\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 EPEhelp4=\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e EPEhelp5=\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u0440\u0430\u0432\u0438\u043b, \u0434\u0432\u0430\u0436\u0434\u044b \u0449\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u043f\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0432\u0443\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c. EPEexpertHelp=\u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u044d\u0442\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u043e \u0435\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u044b \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u043d\u0438\u0445! \u041d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442... EPEexpertHint=\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: APPEXTSECappletSecurityLevelExtraHighId=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 Java APPEXTSECappletSecurityLevelVeryHighId=\u0421\u0430\u043c\u044b\u0439 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 APPEXTSECappletSecurityLevelHighId=\u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 APPEXTSECappletSecurityLevelLowId=\u041d\u0438\u0437\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 APPEXTSECappletSecurityLevelExtraHighExplanation=\u0417\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 APPEXTSECappletSecurityLevelVeryHighExplanation=\u0417\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 APPEXTSECappletSecurityLevelHighExplanation=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430 APPEXTSECappletSecurityLevelLowExplanation=\u0420\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 APPEXTSECunsignedAppletActionAlways=\u0412\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u0442\u043e\u043c\u0443 (\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c) \u0430\u043f\u043b\u0435\u0442\u0443 (\u0430\u043f\u043b\u0435\u0442\u0430\u043c) APPEXTSECunsignedAppletActionNever=\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u0442\u043e\u043c\u0443 (\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c) \u0430\u043f\u043b\u0435\u0442\u0443 (\u0430\u043f\u043b\u0435\u0442\u0430\u043c) APPEXTSECunsignedAppletActionYes=\u042d\u0442\u043e\u0442 \u0430\u043f\u043b\u0435\u0442 \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f \u0438 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 APPEXTSecunsignedAppletActionSandbox=\u042d\u0442\u043e\u0442 \u0430\u043f\u043b\u0435\u0442 \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f \u0438 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u044f\u043c\u0438 APPEXTSECunsignedAppletActionNo=\u042d\u0442\u043e\u0442 \u0430\u043f\u043b\u0435\u0442 \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f \u0438 \u0431\u044b\u043b \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 APPEXTSECControlPanelExtendedAppletSecurityTitle=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 APPEXTSECguiTableModelTableColumnRD=\u0417\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f APPEXTSECguiTableModelTableColumnDateOfAction=\u0414\u0430\u0442\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f APPEXTSECguiTableModelTableColumnDocumentBase=\u0411\u0430\u0437\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 APPEXTSECguiTableModelTableColumnCodeBase=\u0411\u0430\u0437\u0430 \u043a\u043e\u0434\u0430 APPEXTSECguiTableModelTableColumnArchives=\u0410\u0440\u0445\u0438\u0432\u044b APPEXTSECguiPanelAppletInfoHederPart1={0} {1} APPEXTSECguiPanelAppletInfoHederPart2={0} \u0438\u0437 {1} APPEXTSECguiPanelConfirmDeletionOf=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b {0}? APPEXTSECguiPanelHelpButton=\u0421\u043f\u0440\u0430\u0432\u043a\u0430 APPEXTSECguiPanelSecurityLevel=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 APPEXTSECguiPanelGlobalBehaviourCaption=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0430\u043f\u043b\u0435\u0442\u043e\u0432 APPEXTSECguiPanelDeleteMenuSelected=\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 APPEXTSECguiPanelDeleteMenuAllA=\u0432\u0441\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0435 (A) APPEXTSECguiPanelDeleteMenuAllN=\u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d\u043d\u044b\u0435 (N) APPEXTSECguiPanelDeleteMenuAlly=\u0432\u0441\u0435 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u043d\u044b\u0435 (y) APPEXTSECguiPanelDeleteMenuAlln=\u0432\u0441\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0451\u043d\u043d\u044b\u0435 (n) APPEXTSECguiPanelDeleteMenuAllAll=\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0441\u0435 APPEXTSECguiPanelDeleteButton=\u0423\u0434\u0430\u043b\u0438\u0442\u044c APPEXTSECguiPanelDeleteButtonToolTip=\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0448\u0443 Delete. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b APPEXTSECguiPanelTestUrlButton=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c URL-\u0430\u0434\u0440\u0435\u0441 APPEXTSECguiPanelAddRowButton=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 APPEXTSECguiPanelValidateTableButton=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 APPEXTSECguiPanelAskeforeActionBox=\u0421\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f APPEXTSECguiPanelShowRegExesBox=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f APPEXTSECguiPanelInverSelection=\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 APPEXTSECguiPanelMoveRowUp=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u044b\u0448\u0435 APPEXTSECguiPanelMoveRowDown=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0438\u0436\u0435 APPEXTSECguiPanelCustomDefs=\u041f\u043e\u043b\u044c\u0437\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f APPEXTSECguiPanelGlobalDefs=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f APPEXTSECguiPanelDocTest=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL-\u0430\u0434\u0440\u0435\u0441 \u0431\u0430\u0437\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 APPEXTSECguiPanelCodeTest=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL-\u0430\u0434\u0440\u0435\u0441 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430 APPEXTSECguiPanelNoMatch=\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 \u043d\u0435\u0442 APPEXTSECguiPanelMatchingNote=\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. APPEXTSECguiPanelMatched=\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 APPEXTSECguiPanelMatchingError=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f: {0} APPEXTSECguiPanelCanNotValidate=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u2014 {0} APPEXTSECguiPanelEmptyDoc=\u0412\u0441\u0435 \u0431\u0430\u0437\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b APPEXTSECguiPanelEmptyCode=\u0412\u0441\u0435 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b APPEXTSECguiPanelTableValid=\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0448\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 APPEXTSECguiPanelTableInvalid=\u041d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430. \u041e\u0448\u0438\u0431\u043a\u0430: {0} APPEXTSECguiPanelShowOnlyPermanent=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 APPEXTSECguiPanelShowOnlyTemporal=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 APPEXTSECguiPanelShowAll=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 APPEXTSECguiPanelShowOnlyPermanentA=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 APPEXTSECguiPanelShowOnlyPermanentN=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u043f\u0440\u0435\u0442\u0435 APPEXTSECguiPanelShowOnlyTemporalY=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 APPEXTSECguiPanelShowOnlyTemporalN=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u043f\u0440\u0435\u0442\u0435 APPEXTSEChelpHomeDialogue=\u0414\u0438\u0430\u043b\u043e\u0433 APPEXTSEChelp=

    \u0421\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u2014 itw-settings, \u0444\u0430\u0439\u043b\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0434\u0438\u0430\u043b\u043e\u0433

    \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u2014 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u042d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 ''\u043d\u0438\u0437\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438''. \u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 ''\u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438'' (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a. \u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 ''\u043e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438'' \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d. \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432. \u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438\u043d\u0430\u044f: \u043b\u044e\u0431\u0430\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 Java \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a.

    \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f
    \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 (\u0438 \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u043d\u0435\u0441\u0442\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f!) \u044d\u0442\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430
    \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 IcedTea-Web

    \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438

    \u042d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0434\u043b\u044f "\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432". \u0415\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 users_home/.icedtea/deployment.properties, \u043d\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b\u0435 /etc/.java/deployment/deployment.properties \u0438\u043b\u0438 JAVA_HOME/lib/deployment.properties \u0441 \u043a\u043b\u044e\u0447\u043e\u043c deployment.security.level

  • \u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 Java \u2014 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a DENY_ALL \u2014 \u0430\u043f\u043b\u0435\u0442\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b
    \u041d\u0438 \u043e\u0434\u0438\u043d \u0430\u043f\u043b\u0435\u0442 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 Java (\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u043a\u043d\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435). \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c Java, \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 IcedTea-Web \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0451 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 (\u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f). \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.
  • \u041e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u2014 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a DENY_UNSIGNED \u2014 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0430\u043f\u043b\u0435\u0442\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b
    \u041d\u0438 \u043e\u0434\u0438\u043d \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0430\u043f\u043b\u0435\u0442 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a (\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0430\u043a\u0438\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u043a\u043d\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435). \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.
  • \u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u2014 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a ASK_UNSIGNED \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u043f\u043b\u0435\u0442\u0443
    \u0412\u0441\u0435 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0430\u043f\u043b\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u043c \u0434\u0430\u043b\u0435\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c: \u043f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a. \u0415\u0441\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u043d\u0438\u0436\u0435. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0430\u043f\u043b\u0435\u0442\u0430, \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043a\u043d\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u0430\u043f\u043b\u0435\u0442 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430 \u0438\u043b\u0438 \u0446\u0435\u043b\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0430\u043f\u043b\u0435\u0442\u043e\u0432 (\u0441\u043c. \u0430\u0431\u0437\u0430\u0446 \u0414\u0438\u0430\u043b\u043e\u0433 \u0434\u0430\u043b\u0435\u0435).
    \u042d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.
  • \u041d\u0438\u0437\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u2014 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a ALLOW_UNSIGNED \u2014 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445, \u0434\u0430\u0436\u0435 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432
    \u0420\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435. \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.
    \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u041e\u041a \u0438\u043b\u0438 \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438

    \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f x \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430

    \u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435 \u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043b\u0438 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u2014 home/.icedtea/.appletTrustSettings \u2014 \u043f\u0430\u043d\u0435\u043b\u044c "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f".
    \u041d\u043e \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 /etc/.java/deployment/ .appletTrustSettings \u2014 \u043f\u0430\u043d\u0435\u043b\u044c "\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f".

    "\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441"

  • \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0430\u043f\u043b\u0435\u0442\u0430
  • \u0412\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u0430\u043f\u043b\u0435\u0442\u0443 \u2014 \u044d\u0442\u043e\u0442 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0430\u043f\u043b\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a A \u0432 .appletTrustSettings
  • \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u0430\u043f\u043b\u0435\u0442\u0443 \u2014 \u044d\u0442\u043e\u0442 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0430\u043f\u043b\u0435\u0442 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a N \u0432 .appletTrustSettings
  • \u0412\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u2014 \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u043d\u043e\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u043a \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430 \u0443\u0436\u0435 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a y \u0432 .appletTrustSettings
  • \u0412\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f \u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u2014 \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u043d\u043e\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u043a \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430 \u0443\u0436\u0435 \u0431\u044b\u043b \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a n \u0432 .appletTrustSettings
  • \u0414\u0430\u0442\u0430 \u2014 \u0434\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0434 \u044d\u0442\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c (\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f)
  • \u0411\u0430\u0437\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u2014 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0430\u043f\u043b\u0435\u0442\u0430. \u042d\u0442\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e URL-\u0430\u0434\u0440\u0435\u0441\u0430. \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0438 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u0430\u043b\u0435\u0435
  • \u0411\u0430\u0437\u0430 \u043a\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e URL-\u0430\u0434\u0440\u0435\u0441, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043a\u043e\u0434 \u0430\u043f\u043b\u0435\u0442\u043e\u0432. \u042d\u0442\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e URL-\u0430\u0434\u0440\u0435\u0441\u0430. \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0438 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u0430\u043b\u0435\u0435
  • \u0410\u0440\u0445\u0438\u0432\u044b \u2014 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u0441 \u043a\u043e\u0434\u043e\u043c \u0430\u043f\u043b\u0435\u0442\u043e\u0432. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u0435\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0433\u0440\u0443\u043f\u043f\u044b \u0430\u043f\u043b\u0435\u0442\u043e\u0432

    \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0432 \u0441\u0438\u043b\u0443 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435.

    \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438

  • \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u0443\u043d\u043a\u0442\u043e\u043c, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0432 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c
  • \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u041a\u043b\u044e\u0447 Del \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d. \u0412\u044b\u0431\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u0435\u0449\u0451 \u043f\u0440\u0430\u0432\u0435\u0435
  • \u0432\u0441\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0435 (A) \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438
  • \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d\u043d\u044b\u0435 (N) \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u043f\u0440\u0435\u0442\u0435
  • \u0432\u0441\u0435 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u043d\u044b\u0435 (y) \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e (\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435) \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438
  • \u0432\u0441\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0451\u043d\u043d\u044b\u0435 (n) \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e (\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435) \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u043f\u0440\u0435\u0442\u0435
  • \u0432\u0441\u0435 \u2014 \u043e\u0447\u0438\u0441\u0442\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443

    \u0421\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u2014 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043a\u0430\u0437\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f (\u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e) \u0438\u043b\u0438 \u0435\u0433\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c. \u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043e\u043a \u043d\u0435 \u0432\u0438\u0434\u043d\u043e, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0443 Esc
  • \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u043a\u0430\u0432\u044b\u0447\u0435\u043a \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u0445 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430/\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u0430\u043b\u0435\u0435

  • \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435(\u0430\u0445)
  • \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 (A) \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0435 (N) \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
  • \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0445 (y) \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0451\u043d\u043d\u044b\u0445 (n) \u0430\u043f\u043b\u0435\u0442\u043e\u0432.
  • \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 (A)
  • \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u0435\u0442\u043e\u0432 \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u043f\u0440\u0435\u0442\u0435 (N)
  • \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0445 (y) \u0430\u043f\u043b\u0435\u0442\u043e\u0432.
  • \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u0435\u0442\u043e\u0432 \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043e\u0442\u043a\u043b\u043e\u043d\u0451\u043d\u043d\u044b\u0445 (n) \u0430\u043f\u043b\u0435\u0442\u043e\u0432.
  • \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u2014 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 (\u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f) \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0430\u0442\u043e\u0439 \u0438 \u043f\u0443\u0441\u0442\u044b\u043c\u0438 \u0430\u0440\u0445\u0438\u0432\u0430\u043c\u0438
  • \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u2014 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0437 \u043d\u0435\u0451, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:
  • \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u043e\u0434\u043d\u043e \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445: A,N,y,n
  • \u0414\u0430\u0442\u0430 \u2014 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f \u0434\u0430\u0442\u0430
  • \u0411\u0430\u0437\u0430 \u043a\u043e\u0434\u0430 \u0438 \u0431\u0430\u0437\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u2014 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c)
  • \u0410\u0440\u0445\u0438\u0432\u044b \u2014 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0445\u0438\u0432\u043e\u0432 (\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c)
  • \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c URL-\u0430\u0434\u0440\u0435\u0441 \u2014 \u0432 \u0434\u0432\u0443\u0445 \u0434\u0438\u0430\u043b\u043e\u0433\u0430\u0445 (\u0437\u0430 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430) \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0431\u0430\u0437\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u0431\u0430\u0437\u0443 \u043a\u043e\u0434\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044f\u043c. \u0411\u0443\u0434\u0443\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b! \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442\u0441\u044f>
  • \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u043d\u0438\u0437/\u0432\u0432\u0435\u0440\u0445
    \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u0442\u0440\u043e\u043a \u0432\u0430\u0436\u0435\u043d. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (\u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0443 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445). \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u0438\u0445 \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.
    \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 Qhttp://blogs.com/E.*, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 http://blogs.com \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u041f\u041e\u0421\u041b\u0415 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f Qhttp://blogs.com/evilJohnE.*, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u0438\u0437 \u0431\u043b\u043e\u0433\u0430 \u0445\u0430\u043a\u0435\u0440\u0430 evilJohn.

    \u0414\u0438\u0430\u043b\u043e\u0433

    \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u043e\u0432\u044b\u0439 \u043d\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0430\u043f\u043b\u0435\u0442, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0434\u0438\u0430\u043b\u043e\u0433 \u0441 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c (A \u0438\u043b\u0438 N) \u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u043b\u0438 \u0436\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0443 (y,n).
    \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c (\u0442\u0430\u043a\u0436\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e) \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u0438\u0437 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430. \u042d\u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043f\u043e\u0441\u0435\u0449\u0430\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0430\u043f\u043b\u0435\u0442\u044b \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0445.
    \u0415\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c. \u041f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0437\u0435\u043b\u0451\u043d\u0430\u044f \u0438\u043b\u0438 \u043a\u0440\u0430\u0441\u043d\u0430\u044f \u043c\u0435\u0442\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435.
    \u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u044d\u0442\u043e\u0442 \u0434\u0438\u0430\u043b\u043e\u0433 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f. \u041f\u0440\u0438\u043d\u044f\u0442\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 itw-settings (\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435). \u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 IcedTea-Web. \u0415\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 (n,y) \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0434\u0438\u0430\u043b\u043e\u0433 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u043d\u043e\u0432\u0430. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0412\u0441\u0435\u0433\u0434\u0430 \u043d\u0430 \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.
    \u0412 \u0434\u0438\u0430\u043b\u043e\u0433\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0430\u043f\u043b\u0435\u0442, \u0438 URL-\u0430\u0434\u0440\u0435\u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430. \u0422\u0430\u043a\u0436\u0435, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0430\u043f\u043b\u0435\u0442 \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f, \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0431\u044b\u043b \u043b\u0438 \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0451\u043d

    \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f

  • \u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e \u2014 \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0434\u0438\u0430\u043b\u043e\u0433.
  • \u0414\u043b\u044f \u0430\u043f\u043b\u0435\u0442\u0430 \u2014 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0430\u043f\u043b\u0435\u0442\u0430
  • \u0414\u043b\u044f \u0441\u0430\u0439\u0442\u0430 \u2014 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430
  • \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u2014 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u0430\u043f\u043b\u0435\u0442\u043e\u0432
  • \u041e\u0442\u043c\u0435\u043d\u0430 \u2014 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u0430\u043f\u043b\u0435\u0442\u043e\u0432\n
  • \u0421 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c" + "\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e" + "\u0414\u043b\u044f \u0441\u0430\u0439\u0442\u0430" \u043d\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445! \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438!

    \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f

    \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 IcedTea-Web \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0449\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 (\u043d\u0430\u0431\u043e\u0440\u043e\u0432) \u0430\u043f\u043b\u0435\u0442\u043e\u0432. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0430\u0442 \u0426\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 QE URL-\u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a .* \u0438\u043b\u0438 .? \u0438 \u0434\u0440\u0443\u0433\u0438\u0445.
    \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u044b:
    N 12.12.2012 .* Qhttp://blogs.com/evilJohnE.*
    N 12.12.2012 Qhttp://blogs.com/goodJohn/evilApplet.htmlE.* Qhttp://blogs.com/goodJohn/E goodJohnsArchive.jar
    A 12.12.2012 Qhttp://blogs.com/E.* Qhttp://blogs.com/E.*
    N 12.12.2012 .* Qhttp://adds.comE.*
    Y 12.12.2012 .* Qhttp://www.walter-fendt.de/ph14_jar/E

    \u042d\u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f 12.12.2012:
  • \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0430\u043f\u043b\u0435\u0442\u044b, \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 http://blogs.com/evilJohn
  • \u0438 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0430\u043f\u043b\u0435\u0442 \u0441 \u0441\u0430\u0439\u0442\u0430 http://blogs.com/goodJohn/ \u0441 \u0430\u0440\u0445\u0438\u0432\u043e\u043c goodJohnsArchive.jar
  • \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 (\u043f\u0440\u043e\u0447\u0438\u0435) \u0430\u043f\u043b\u0435\u0442\u044b \u0441 \u0441\u0430\u0439\u0442\u0430 http://blogs.com/ , \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 http://blogs.com/
  • \u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0430\u043f\u043b\u0435\u0442\u044b, \u043a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 http://adds.com (\u043a\u0440\u043e\u043c\u0435 \u0430\u043f\u043b\u0435\u0442\u043e\u0432 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 http://blogs.com/ \u2014 \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c http://adds.com \u0442\u0430\u043a\u0436\u0435 \u0438 \u043d\u0430 http://blogs.com/, \u044d\u0442\u0430 (http://adds.com) \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u0448\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0430\u0439\u0442\u0430 \u0431\u043b\u043e\u0433\u043e\u0432)
  • \u0438 \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u2014 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u0430\u043f\u043b\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044f\u0432\u043b\u0435\u043d\u0438\u044f, \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 walter-fendt

    \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u2014 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 .appletTrustSettings, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f...

    \u0412\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 \u043f\u043e\u043b\u043d\u044b\u0445 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

    \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435

    \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438 \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 {0}!
    \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043e\u0442\u0447\u0451\u0442 \u043e \u043d\u0435\u0439 \u0432 \u043d\u0430\u0448\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 bugzilla ... \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439

    \u041a\u043e\u043c\u0430\u043d\u0434\u0430 IcedTea-Web \u0436\u0435\u043b\u0430\u0435\u0442 \u0432\u0430\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446...

    icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/netx-icon.png0000644000000000000000000000013213441742745024701 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/netx-icon.png0000644000175000002070000000226613441742745025517 0ustar00jvanekmock00000000000000‰PNG  IHDRрw=јsBIT|dˆ pHYs з зB(›xtEXtSoftwarewww.inkscape.org›ю<3IDATH‰Е•mh•eЧї§<Я9gчtіRК‘Џ03ХœHYЅnZвŒЄ‰‘2se/ЈQ™ЁвьУˆ0\;KKЂL(дmI„ЪЬpѓЅЁ+e6Х6uЖГѓМ]}8лмйІГ^pЙяыњџЏћнїuС]65ЌЧW!Iyhr№I шQЊ:† 7‡мн.йи,–’`т;ЊЋ=€н$rŸ'СL€rруџuDеВŠ˜\U›ot›K*%4ЅPТYїJ8ю[жТrЁJZяђІD1Бj@7WG­НkQОnrpС(‰ чЎaFцёšjМюGѕ^ђ‰рі’ЈѕУ” ЎRюЪI`œ=œтхсn {ВanpчЋaує~”яІglzМS%m Яз+`Ю(>5~eœк Ў=РУ€ьQ xЉ3х&бmч@‘Шm_ЂІR&с:YжОu0 sДѓєЛ‚ј}ђєYз5€_r„jйHЕLš@3г8{0ЂКкгD›8EoњИITЧe№НЁТC“ђKgЬ9Yћі§_Ј–fЊdі@‚бњBC€^1,ќq3№f”`јLѕJгg†‰фNЂ№ZПИ~‡ЎЌ*V?Џ˜3ћTнƒhі“M7  КкгфQ€НdkТЊY?X@”‰?r/5YкїА\›1э-TmYРGп”eОЗ‚˜ЌIxД‘™DЉ`3€3kЙЈюNУhЊбxЮ хvc>0‹y'і˜ Iэ‰`њ./кFХЖХ™Р‡l—Црˆ?ўQЏHy.юь2лњiƒећ,ЪуMx’‘ˆпŠКЎ6]O›Š€›dzЫoq^QнšeъŠ7Б№ŒDF €7ѕY”MujЈьœ…LјчДЎŸTdЙfРtЬ@Д‚mйџ№ѓRhsЕН <ЎЇ№uЧhмmbвQ•ЅБmЁАэ<•_ѓLУnBvЫЕ1zjhј;‹ош@Б5 JъєК1‘рєљŽDњš[F4[2rrХ(ћQІЌmЦPTš•’?!mВBђўSo 1Йдћo>‘ %ўшiПњb#Н}PЂyИEoсНwœ’і |Пi&v%’.›aб:"ŸŠтM(оA)ЁNLšŒ†]cб†’Qсq(=џїoyщРчDџtЛ…иf€ЖЌћyqѕAчrЮиzJU_Š`>™„hЫМ~§Џ#Ћrя1oQьx3cІQZЖЯiЯЬmщ?щnнЈ6K Ч'_<9vEЭЦШм“{P"8f„ьWВGQQќ {[м!ЈcиГRншsћ™МK :X„А2Ѓ;>Е ѕЈ—wэ’vLKЕфMvšGg0XЯ2U;Ф№CП?йUђбŒЧ#Фб4SЊтwŒq7ь?Оўlf,IENDЎB`‚icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/Messages_de.properties0000644000000000000000000000013213441742745026624 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/Messages_de.properties0000644000175000002070000021104013441742745027432 0ustar00jvanekmock00000000000000# German UI messages for netx # # All messages are formatted using Java's java.text.MessageFormat class. # Apostrophe characters ' need to be escaped by using two: '' # Curly brackets need to be escaped by surrounding them with single apostrophes '{' '{hello}' # # L=Launcher, B=Boot, P=Parser, C=cache S=security # # General NullParameter=Nullparameter ButAllow=Zulassen ButBrowse=Durchsuchen... ButCancel=\ Abbrechen ButClose=Schlie\u00dfen ButAdvancedOptions=Fortgeschrittene\u00a0Optionen ButCopy=In die Zwischenablage kopieren ButMoreInformation=Weitere\u00a0Informationen... ButOk=OK ButProceed=Fortfahren ButRun=Ausf\u00fchren ButSandbox=Sandkasten ButApply=Anwenden ButDone=Fertig ButShowDetails=Details zeigen ButHideDetails=Details verbergen ButYes=Ja ButNo=Nein BUTControlledBy=Gesteuert durch {0} BUTmodified=modifiziert CertWarnRunTip=Diesem Applet vertrauen und mit vollen Berechtigungen ausf\u00fchren CertWarnSandboxTip=Diesem Applet nicht vertrauen und mit eingeschr\u00e4nkten Berechtigungen ausf\u00fchren CertWarnCancelTip=Dieses Applet nicht ausf\u00fchren CertWarnPolicyTip=Erweiterte Sandkasten-Einstellungen CertWarnPolicyEditorItem=Richtlinieneditor starten CertWarnHTTPSAcceptTip=Dieses Zertifikat akzeptieren und der HTTPS-Verbindung vertrauen CertWarnHTTPSRejectTip=Dieses Zertifikat nicht akzeptieren und keine HTTPS-Verbindung aufbauen AFileOnTheMachine=eine Datei auf dem Rechner AlwaysAllowAction=Diese Aktion immer zulassen AlwaysForbidAction=Diese Aktion immer verbieten Usage=Gebrauch: Error=Fehler Warning=Warnung Continue=Soll fortgefahren werden? Field=Feld From=Von Name=Name Password=Kennwort: Publisher=Herausgeber Unknown= Username=Benutzername: Value=Wert Version=Version # about dialogue AboutDialogueTabAbout=\u00dcber AboutDialogueTabAuthors=Autoren AboutDialogueTabChangelog=\u00c4nderungsprotokoll AboutDialogueTabNews=Neuigkeiten AboutDialogueTabGPLv2=GPLv2 # version check minidialogue JREversionDontMatch=Warnung: Die angeforderte JRE \u201e{1}\u201c stimmt nicht mit der vorhandenen JRE \u201e{0}\u201c \u00fcberein JREContinueDialogSentence2=Soll Ausf\u00fchrung fortgesetzt werden? JREContinueDialogSentenceTitle=Inkompatible JRE # missing permissions dialogue MissingPermissionsMainTitle=Der Anwendung \u201e{0}\u201c \ mit der Codebasis \u201e{1}\u201c fehlt das Attribut \u201epermission\u201c. \ Anwendungen ohne dieses Attribut sollte nicht vertraut werden.
    \ Soll die Ausf\u00fchrung dieser Anwendung zugelassen werden? MissingPermissionsInfo=Um weitere Informationen zu erhalten siehe:
    \ \ JAR File Manifest Attributes
    \ und
    \ \ Preventing the repurposing of Applications # missing Application-Library-Allowable-Codebase dialogue ALACAMissingMainTitle=Die Anwendung \u201e{0}\u201c \ mit der Codebasis \u201e{1}\u201c l\u00e4dt die folgenden Ressourcen von einer fremden Dom\u00e4ne:
    \ {2}
    \ Soll diese Anwendung wirklich ausgef\u00fchrt werden? ALACAMissingInfo=Um weitere Informationen zu erhalten siehe:
    \ \ JAR File Manifest Attributes
    \ und
    \ \ Preventing the Repurposing of an Application # matching Application-Library-Allowable-Codebase dialogue ALACAMatchingMainTitle=Die Anwendung \u201e{0}\u201c \ mit der Codebasis \u201e{1}\u201c l\u00e4dt die folgenden Ressourcen von einer fremden Dom\u00e4ne:
    \ {2}
    \ Es ist richtig. Soll diese Anwendung wirklich ausgef\u00fchrt werden? ALACAMatchingInfo=Um weitere Informationen zu erhalten siehe:
    \ \ JAR File Manifest Attributes
    \ und
    \ \ Preventing the Repurposing of an Application MACDisabledMessage=Die Pr\u00fcfung von Manifestattributen ist deaktiviert. MACCheckSkipped=Die Pr\u00fcfung von \u201e{0}\u201c wurde ausgelassen, da die Eigenschaft \u201edeployment.manifest.attributes.check\u201c weder den Wert \u201eALL\u201c hat, noch ihr Wert aus einer Kombination mit \u201e{1}\u201c besteht. # LS - Severity LSMinor=Gering LSFatal=Fatal # LC - Category LCSystem=Systemfehler LCExternalLaunch=Externer Startfehler LCFileFormat=Dateiformatfehler LCReadError=Lesefehler LCClient=Anwendungsfehler LCLaunching=Startfehler LCNotSupported=Nicht unterst\u00fctztes Feature LCInit=Initialisierungsfehler LAllThreadGroup=Alle JNLP Anwendungen LNullUpdatePolicy=Aktualisierungsrichtlinie darf nicht null sein. LThreadInterrupted=Ausf\u00fchrungsstrang unterbrochen, w\u00e4hrend auf den Start der Datei gewartet wird. LThreadInterruptedInfo=Dies kann zum Einfrieren oder sonstigen Sch\u00e4den w\u00e4hrend der Ausf\u00fchrung f\u00fchren. Bitte die Anwendung oder den Web-Browser neustarten. LCouldNotLaunch=Konnte JNLP-Datei nicht starten. LCouldNotLaunchInfo=Die Anwendung war nicht initialisiert. Um detailierte Informationen zu erhalten k\u00f6nnen javaws oder der Web-Browser von der Befehlszeile aus gestartet werden und die Textausgabe in einem Fehlerbericht gesendet werden. LCantRead=Konnte die JNLP-Datei nicht lesen oder die Syntax analysieren. LCantReadInfo=Die Datei kann m\u00f6glicherweise manuell heruntergeladen und als Fehlerbericht an das IcedTea-Web Team gesendet werden. LNullLocation=Konnte den Ort der .jnlp Datei nicht bestimmen. LNullLocationInfo=Es wurde versucht eine JNLP-Datei in einer anderen JVM zu starten, aber die Datei konnte am Ort nicht ermittelt werden. Um in einer externen JVM zu starten, muss die Laufzeitumgebung in der Lage sein die .jnlp Datei entweder auf dem lokalen Dateisystem oder einem Server zu ermitteln. LNetxJarMissing=Konnte den Ort von javaws.jar nicht bestimmen. LNetxJarMissingInfo=Ein wurde versucht eine JNLP-Datei in einer anderen JVM zu starten, aber das javaws.jar konnte am Ort nicht ermittelt werden. Um in einer externen JVM zu starten, muss die Laufzeitumgebung in der Lage sein das javaws.jar zu ermitteln. LNotToSpec=JNLP-Datei nicht strikt nach Spezifikation. LNotToSpecInfo=Die JNLP-Datei enth\u00e4lt Daten, die nach JNLP Spezifikation verboten sind. Die Laufzeitumgebung kann versuchen die ung\u00fcltigen Information zu ignorieren und die Datei zu starten fortfahren. LNotApplication=Keine Anwendungsdatei. LNotApplicationInfo=Es wurde versucht eine Nichtanwendungsdatei als eine Anwendung zu laden. LNotApplet=Keine Applet-Datei. LNotAppletInfo=Es wurde versucht eine Nichtappletdatei als ein Applet zu laden. LNoInstallers=Installer werden nicht unterst\u00fctzt. LNoInstallersInfo=JNLP Installerdateien werden noch nicht unterst\u00fctzt. LInitApplet=Konnte Applet nicht initialisieren. LInitAppletInfo=Um weitere Information zu erhalten, bitte den Knopf \u201eWeitere Informationen\u201c klicken. LInitApplication=Konnte Anwendung nicht initialisieren. LInitApplicationInfo=Die Anwendung war nicht initialisiert. Um weitere Informationen zu erhalten kann javaws von der Befehlszeile aus ausgef\u00fchrt werden. LNotLaunchable=Keine startbare JNLP-Datei. LNotLaunchableInfo=Datei muss ein JNLP Anwendungs-, Applet- oder Installertyp sein. LCantDetermineMainClass=Unbekannte Hauptklasse. LCantDetermineMainClassInfo=Konnte die Hauptklasse f\u00fcr diese Anwendung nicht bestimmen. LUnsignedJarWithSecurity=Kann nicht signierten JARs keine Berechtigungen gew\u00e4hren. LUnsignedJarWithSecurityInfo=Anwendung hat Sicherheitsberechtigungen angefordert, aber JARs sind nicht signiert. LSignedJNLPAppDifferentCerts=Die JNLP Anwendung ist nicht vollst\u00e4ndig durch ein einzelnes Zertifikat signiert. LSignedJNLPAppDifferentCertsInfo=Der JNLP Anwendung wurden ihre Komponenten individuell signiert, jedoch muss es einen gemeinsamen Unterzeichner zu allen Eintr\u00e4gen geben. LUnsignedApplet=Das Applet war nicht signiert. LUnsignedAppletPolicyDenied=Das Applet war nicht signiert, deshalb wurde es an der Ausf\u00fchrung durch die Sicherheitsrichtlinie gehindert. LUnsignedAppletUserDenied=Das Applet war nicht signiert und nicht vertrauensw\u00fcrdig. LPartiallySignedApplet=Das Applet wurde teilweise signiert. LPartiallySignedAppletUserDenied=Das Applet wurde teilweise signiert und ihm wurde nicht vertraut. LSignedAppJarUsingUnsignedJar=Signierte Anwendung nutzt nicht signierte JARs. LSignedAppJarUsingUnsignedJarInfo=Das Haupt-JAR der Anwendung ist signiert, aber manche JARs, die sie nutzt, nicht. LRunInSandboxError=Ausf\u00fchren im Sandkasten-Aufruf wurde zu sp\u00e4t ausgef\u00fchrt. LRunInSandboxErrorInfo=Der Klassenlader wurde benachrichtigt das Applet im Sandkasten auszuf\u00fchren, aber die Sicherheitseinstellungen waren bereits initialisiert. LSignedJNLPFileDidNotMatch=Die signierte JNLP-Datei stimmt nicht mit der startenden JNLP-Datei \u00fcberein. LNoSecInstance=Fehler: Keine Sicherheitsinstanz f\u00fcr {0}. Die Anwendung k\u00f6nnte Schwierigkeiten haben fortzufahren LCertFoundIn={0} in cacerts gefunden ({1}) LSingleInstanceExists=Eine andere Instanz dieses Applets existiert bereits und nur eine kann zur selben Zeit ausgef\u00fchrt werden. JNotApplet=Datei ist kein Applet. JNotApplication=Datei ist keine Anwendung. JNotComponent=Datei ist keine Komponente. JNotInstaller=Datei ist kein Installer. JInvalidExtensionDescriptor=Erweiterung verweist nicht auf eine Komponente oder einen Installer (Name={1}, Ort={2}). LNotVerified=JARs nicht verifiziert. LCancelOnUserRequest=Abgebrochen auf Anfrage des Benutzers. LFatalVerification=W\u00e4hrend des Versuchs, JARs zu verifizieren, ist ein fataler Fehler aufgetreten. LFatalVerificationInfo=Eine Ausnahme in der Klasse JarCertVerifier wurde abgefangen. Die Unlesbarkeit der Dateien cacerts oder trusted.certs k\u00f6nnte eine Ursache dieser Ausnahmen sein. LNotVerifiedDialog=Nicht alle JARs konnten verifiziert werden. LAskToContinue=Soll die Ausf\u00fchrung dieser Anwendung dennoch fortgesetzt werden? # Parser PInvalidRoot=Der Wurzelknoten ist nicht das Element jnlp PNoResources=Kein Element resources angeben PUntrustedNative=Das Element nativelib kann nicht angegeben werden sofern eine vertrauensw\u00fcrdige Umgebung angefordert wird. PExtensionHasJ2SE=Das Element j2se kann nicht in einer Komponentenerweiterungsdatei angegeben werden. PInnerJ2SE=Das Element j2se kann nicht innerhalb eines j2se-Elements angegeben werden. PTwoMains=Doppeltes main JAR in einem resources-Element definiert (es kann nur eins geben) PNativeHasMain=Das Attribut main darf nicht am Element nativelib angeben werden PNoInfoElement=Kein Element information angegeben PMissingTitle=Titel PMissingVendor=Lieferant PMissingElement=Der Abschnitt {0} wurde f\u00fcr das aktive Gebietsschema nicht definiert, noch existiert ein Standardwert in der JNLP-Datei. PTwoDescriptions=Doppelte Elemente description mit Attribut kind {0} sind nicht erlaubt. PSharing=Das Element \u201esharing-allowed\u201c ist in einer Standard-JNLP-Datei nicht erlaubt PTwoSecurity=Nur ein Element security pro JNLP-Datei zugelassen. PEmptySecurity=Security-Element angegeben, enth\u00e4lt aber das Element permissions nicht. PTwoDescriptors=Nur ein Element application-desc pro JNLP-Datei zugelassen. PTwoDesktops=Nur ein Element desktop zugelassen PTwoMenus=Nur ein Element menu zugelassen PTwoTitles=Nur ein Element title zugelassen PTwoIcons=Nur ein Element icon zugelassen PTwoUpdates=Nur ein Element update ist zugelassen PUnknownApplet=Unbekanntes Applet PBadWidth=Ung\u00fcltige Appletbreite. PBadHeight=Ung\u00fcltige Appleth\u00f6he. PUrlNotInCodebase=Relative URL gibt kein Unterverzeichnis der Codebasis an. (Knoten={0}, href={1}, Basis={2}) PBadRelativeUrl=Ung\u00fcltige relative URL (Knoten={0}, href={1}, Basis={2}) PBadNonrelativeUrl=Ung\u00fcltige nicht-relative URL (Knoten={0}, href={1}) PNeedsAttribute=Das {0} Element muss ein {1} Attribut angeben. PBadXML=Ung\u00fcltige XML Dokumentsyntax. PBadHeapSize=Ung\u00fcltiger Wert f\u00fcr die Gr\u00f6\u00dfe des dynamischen Speichers ({0}) # Runtime BLaunchAbout=Das Fenster \u201e\u00dcber IcedTea-Web\u201c wird ge\u00f6ffnet... BLaunchAboutFailure=Konnte das \u201e\u00dcber\u201c-Fenster nicht starten BNeedsFile=Muss eine .jnlp Datei angeben RNoAboutJnlp=Es ist nicht m\u00f6glich about.jnlp zu finden BFileLoc=JNLP-Dateiort BBadProp=Falsches Eigenschaftformat {0} (sollte Schl\u00fcssel=Wert sein) BBadParam=Falsches Parameterformat {0} (sollte Name=Wert sein) BNoDir=Verzeichnis {0} existiert nicht. BNoCodeOrObjectApplet=Die Auszeichnung applet muss ein Attribut ''code'' oder ''object'' angegeben. RNoResource=Fehlende Ressource: {0} RShutdown=Diese Ausnahme um Herunterfahren der JVM zu verhindern, aber der Prozess wurde terminiert. RExitTaken=Ausstiegsklasse bereits gesetzt und Aufrufender ist keine Ausstiegsklasse. RCantReplaceSM=Wechseln des SecurityManager ist nicht zugelassen. RCantCreateFile=Kann Datei {0} nicht erstellen RCantDeleteFile=Kann Datei {0} nicht l\u00f6schen RCantOpenFile=Konnte die Datei \u201e{0}\u201c nicht \u00f6ffnen RCantWriteFile=Konnte in die Datei \u201e{0}\u201c nicht schreiben RFileReadOnly=\u00d6ffnen der Datei im Schreibschutzmodus RExpectedFile=Erwartete von \u201e{0}\u201c eine Datei zu sein, war es aber nicht RRemoveRPermFailed=Entfernen der Leseberechtigung f\u00fcr Datei {0} schlug fehl RRemoveWPermFailed=Entfernen der Schreibberechtigungen f\u00fcr Datei {0} schlug fehl RRemoveXPermFailed=Entfernen der Ausf\u00fchrberechtigungen f\u00fcr Datei {0} schlug fehl RGetRPermFailed=Erwerben der Leseberechtigungen f\u00fcr Datei {0} schlug fehl RGetWPermFailed=Erwerben der Schreibberechtigungen f\u00fcr Datei {0} schlug fehl RGetXPermFailed=Erwerben der Ausf\u00fchrberechtigungen f\u00fcr Datei {0} schlug fehl RCantCreateDir=Kann Verzeichnis {0} nicht erstellen RCantRename=Kann {0} nicht in {1} umbenennen RDenyStopped=Angehaltene Anwendungen haben keine Berechtigungen. RExitNoApp=Kann die JVM nicht beenden, da die gegenw\u00e4rtige Anwendung nicht bestimmt werden kann. RNoLockDir=Kann Ausschlussverzeichnis nicht erstellen ({0}) RNestedJarExtration=Kann verschachteltes JAR nicht extrahieren. RUnexpected=Unerwartetes {0} bei {1} RConfigurationError=Fataler Fehler beim Lesen der Konfiguration. Fahre fort mit leer. Bitte reparieren RConfigurationFatal=FEHLER: Ein fataler Fehler ist beim Laden der Konfiguration aufgetreten. Vielleicht war eine globale Konfiguration erforderlich, konnte jedoch nicht gefunden werden RFailingToDefault=Versage auf Standardkonfiguration RPRoxyPacNotSupported=Die Verwendung von Autoproxykonfigurationsdateien (PAC) wird nicht unterst\u00fctzt. RProxyFirefoxNotFound=Es ist nicht m\u00f6glich Firefoxs Proxyeinstellungen zu verwenden. Nutze \u201eDIRECT\u201c als Proxytyp. RProxyFirefoxOptionNotImplemented=Browserproxyoption \u201e{0}\u201c ({1}) wird noch nicht unterst\u00fctzt. RBrowserLocationPromptTitle=Browserort HTMLnoneFound=Es wurde kein Applet auf dieser HTML-Seite gefunden (unterst\u00fctzt werden die Elemente \u201eOBJECT\u201c, \u201eEMBED\u201c und \u201eAPPLET\u201c). HTMLmoreThanOne=Mehr als ein ({0}) Applet wurde gefunden. Das erste Applet wird ausgef\u00fchrt. Mit der Angabe von \u201eall\u201c oder Zahlen k\u00f6nnen die gew\u00fcnschten Applets f\u00fcr die Ausf\u00fchrung angegeben werden. # icedtea-web man (note, spaces are important due to man pages markup ITWintroL1=Mit {0} wird ein Browser Plug-in als freie Software angeboten, mit dem in Java geschriebene Applets ausgef\u00fchrt werden k\u00f6nnen, sowie eine Implementierung von \u201eJava Web Start\u201c, urspr\u00fcnglich auf dem NetX-Projekt basierend. ITWintroL2=NetX erm\u00f6glicht das Herunterladen, die Zwischenspeicherung und die Ausf\u00fchrung von Java-Applets und Anwendungen in einer sicheren Sandkastenumgebung (Standardeinstellung). Bei nachfolgenden Starts eines Applets wird die jeweils neueste Version automatisch heruntergeladen. Mit dem Befehl \u201eitw-settings\u201c k\u00f6nnen unter anderem Aktualisierungs- sowie Sicherheitseinstellungen gesetzt werden. ITWintroL3=\u201e{0}\u201c enth\u00e4lt ebenfalls ein Plug-in f\u00fcr \u201e{1}\u201c in Webbrowsern. ITWintroUrlCaption=Java-Applets aktivieren BFileInfoAuthors=Die Namen sowie E-Mail Adressen der an diesem Projekt Mitwirkenden wurden in der im Stammverzeichnis von IcedTea-Web befindenden Datei AUTHORS hinterlegt. BFileInfoCopying=Eine vollst\u00e4ndige Ausfertigung der GPLv2 Lizenz dieses Projekts wurde in der im Stammverzeichnis von IcedTea-Web befindenden Datei COPYING hinterlegt. BFileInfoNews=Neuigkeiten \u00fcber die Ver\u00f6ffentlichungen dieses Projekts k\u00f6nnen der im Stammverzeichnis von IcedTea-Web befindenden Datei NEWS entnommen werden. ITWdescO1title=Modularit\u00e4t ITWdescO1text=Einfaches Hinzuf\u00fcgen von JNLP-Merkmalen zu einer Anwendung. ITWdescO2title=Reduzierter Arbeitsspeicherverbrauch ITWdescO2text=Starten von Programmen in einer gemeinsamen Java-VM ITWdescO3title=Schnellstart ITWdescO3text=Anwendungen aus einem Zwischenspeicher f\u00fcr schnelles Starten ausf\u00fchren ITWdescO4title=Sicherheit ITWdescO4text=Eine beliebige Anwendung in einer Sandkastenumgebung ausf\u00fchren oder deren T\u00e4tigkeit protokollieren ITWdescO5title=Automatische Aktualisierung ITWdescO5text=Anwendungen ohne zus\u00e4tzlichen Code automatisch aktualisieren ITWdescO6title=Bereitstellung im Netzwerk ITWdescO6text=Ohne Installer im Internet bereitstellen ITWdescO7title=Quelloffenheit ITWdescO7text=GNU Lesser General Public License ITWdescL1=Um weitere Informationen einzuholen, k\u00f6nnen das {0} oder insbesondere die {1} besucht werden. ITWdescWikiUrlTitle=IcedTea-Projektwiki ITWdescItwWikiUrlTitle=IcedTea-Web-Hauptseite ITWdescL2=Hilfe zu allgemeinen Problemen mit IcedTea-Web ist {0} zu finden. ITWdescIssuesUrlTitle=hier ITWdescL3=Merkmale von NetX: ITWoptionsL1=Eine {0}anleitung f\u00fcr das IcedTea Projekt ist im Wiki verf\u00fcgbar. ITWoptionsQuickStartUrlCaption=Schnellstart ITWoptionsCodeUrlUrlCaption=Codestil ITWoptionsL2={0}-Richtlinien und Instruktionen zu {1} f\u00fcr IcedTea-Web sind ebenfalls verf\u00fcgbar. Patches sollten Modultests und {2} beiliegen bevor sie an die {3} gesendet werden. ITWoptionsEclipseUrlCaption=Eclipse-Einstellungen ITWoptionsReproducersUrlCaption=Reproduzierer ITWoptionsDistroUrlCaption=Mailingliste ITWoptionsL3=Beitr\u00e4ge: # policyeditor man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. PEintro=\ \u2014 Einstellungen der Sicherheitsrichtlinie f\u00fcr javaws und das Browser Plug-in anzeigen und bearbeiten PEsynopseP1=Richtliniendatei PEsynopseP2=URL PEdescL1=ist eine Anwendung mit grafischer Benutzeroberfl\u00e4che sowie ein wenig Kommandozeilenunterst\u00fctzung. Die Anwendung erm\u00f6glicht die Anzeige und Bearbeitung von Sicherheitsrichtlinieneinstellungen f\u00fcr Applets, die durch die Implementierungen von javaws und des Browser Plug-ins in IcedTea-Web verwendet werden. Sie ist als eine vereinfachte und leichter zu nutzende Alternative zum JDK Policy Tool gedacht. Administratoren und fortgeschrittene Benutzer, die eine fein granulare Kontrolle \u00fcber Richtliniendateien brauchen, sollten das policytool statt des PolicyEditor verwenden. PEdescL2=Werden keine Parameter bei der Ausf\u00fchrung angegeben, so wird keine Datei ge\u00f6ffnet, und eine Aufforderung zur Angabe des Speicherortes erscheint. Wird ansonsten ein Dateipfad als Parameter an der Kommandozeile angegeben, so wird der Dateipfand ge\u00f6ffnet und als eine Richtliniendatei verarbeitet. PEexampleL1=Zeigt den GUI-Editor mit der ge\u00f6ffneten Standardrichtliniendatei an. PEexampleL2=Zeigt den GUI-Editor ohne eine ge\u00f6ffnete Datei an. # javaws man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. JWSintro=\ \u2014 ein Java Web Start Klient JWSdescL1=ist eine Implementierung eines JNLP-Klients. Sie verwendet eine JNLP-Datei (Java Network Launch Protocol) um eine Java-Anwendung oder ein Applet sicher auszuf\u00fchren. \ Diese Implementierung von {0} basiert auf dem NetX Projekt und wird durch das IcedTea Projekt vertrieben. JWSdescL2=Eine JNLP-Datei ist eine XML-Datei mit einer Beschreibung zur sicheren Ausf\u00fchrung einer Java-Anwendung oder eines Applets. JWSoptionsL1=Bei der Angabe von Optionen muss der Name der JNLP-Datei als letzter Parameter an javaws \u00fcbergeben werden. Alle Optionen m\u00fcssen ihm vorausgehen. JWSoptionsL2=Die JNLP-Datei kann entweder eine URL oder ein lokaler Pfad sein. JWSoptionsTitle1=Ausf\u00fchrungsoptionen: JWSoptionsTitle2=Steuerungsoptionen: JWSexampleL1=Zeigt grundlegende Hilfehinweise und Versionsinformationen an. JWSexampleL2=Zeigt grundlegende Hilfehinweise und Versionsinformationen ausschlie\u00dflich im Terminal an. JWSexampleL3=Startet die Anwendung \u201e{0}\u201c, urspr\u00fcnglich aus \u201e{1}\u201c, ohne sie herunterzuladen, ohne die Metadaten von JAR-Dateien zu pr\u00fcfen sowie zwingend in einer einzigen VM. # Boot options, message should be shorter than this ----------------> BOUsage=javaws [-Ausf\u00fchrungsoptionen] BOUsage2=javaws [-Steuerungsoptionen] BOJnlp=Ort der zu startenden JNLP-Datei (URL oder Datei). BOHtml=Ort der zu startenden HTML-Datei (URL oder Datei).\nAn diese Option kann \u201eALL\u201c oder eine Aneinanderreihung von\nZahlen, z.B. "1 2 5", \u00fcbergeben werden, um Applets einer Seite zur\nAusf\u00fchrung auszuw\u00e4hlen. Diese Funktion ist in der Erprobung, jedoch\nsicher. BOArg=F\u00fcgt einen Anwendungsparameter vor dem Start hinzu. BOParam=F\u00fcgt einen Appletparameter vor dem Start hinzu. BOProperty=Setzt eine Systemeigenschaft vor dem Start. BOUpdate=Pr\u00fcfe auf Aktualisierungen. BOLicense=Die GPL Lizenz zeigen und beenden. BOVerbose=Ausf\u00fchrliche Ausgabe aktivieren. BOAbout=Zeigt eine Beispielanwendung. BOVersion=Version von IcedTea-Web ausgeben und beenden. BONosecurity=Deaktiviert die sichere Laufzeitumgebung. BONoupdate=Deaktiviert die Pr\u00fcfung nach Aktualisierungen. BOHeadless=Deaktiviert Herunterladefenster und andere Benutzeroberfl\u00e4chen. BOStrict=Aktiviert die strikte Pr\u00fcfung des JNLP-Dateiformats. BOViewer=Zeigt die Ansicht der vertrauensw\u00fcrdigen Zertifikate. BOXml=Verwendet einen strikten XML-Parser f\u00fcr die JNLP-Datei. BOredirect=Folgt HTTP-Umlenkungen. BXnofork=Keine weitere JVM erstellen. BXclearcache=Den JNLP-Anwendungszwischenspeicher s\u00e4ubern. BXignoreheaders=Die Pr\u00fcfung der Metadaten von JAR-Dateien auslassen. BXoffline=Deaktiviert den Netzwerkzugriff von IcedTea-Web. Ausschlie\u00dflich der Zwischenspeicher wird verwendet. Anwendungen k\u00f6nnen weiterhin auf das Netzwerk zugreifen. BOHelp1=Gibt Informationen \u00fcber unterst\u00fctzte Befehle und grundlegende Verwendung aus. BOHelp2=Gibt Informationen \u00fcber unterst\u00fctzte Befehle und grundlegende Verwendung aus. Wird ein Befehl als Parameter angegeben, dann wird eine detaillierte Beschreibung des Befehls ausgegeben. BOTrustnone=Alle Benutzeraufforderungen werden mit \u201eNein\u201c beantwortet. # Itweb-settings boot commands IBOList=Zeigt eine Liste aller IcedTea-Web Einstellungen und deren aktuelle Werte an. IBOGet=Zeigt den Wert der angegebenen Einstellungen an. IBOInfo=Zeigt zus\u00e4tzliche Informationen \u00fcber die angegebenen Einstellungen an, inklusive einer Beschreibung des aktuellen Werts, der zul\u00e4ssigen Werte sowie des Ursprungs der Einstellung. IBOSet=Setzt die Einstellungen auf den neuen angegebenen Wert, vorausgesetzt der Wert ist zul\u00e4ssig. IBOResetAll=Setzt alle Einstellungen auf ihre urspr\u00fcnglichen Werte zur\u00fcck. IBOReset=Setzt die angegebenen Einstellungen auf ihren urspr\u00fcnglichen Wert zur\u00fcck. IBOCheck=\u00dcberpr\u00fcft alle Einstellungen auf G\u00fcltigkeit der Werte. PBOFile=Gibt den Pfad der zu \u00f6ffnenden Richtliniendatei an. Falls genau ein \ Parameter \u00fcbergeben wird, der nicht diese Option ist, wird er als ein zu \ \u00f6ffnender Dateipfad interpretiert, so als ob diese Option als erste angegeben \ werden w\u00e4re. Diese Option ist haupts\u00e4chlich aus Kompatibilit\u00e4tsgr\u00fcnden zum \ Richtlinieneditor policytool verf\u00fcgbar, wird aber auch zum \u00d6ffnen \ einer Richtliniendatei sowie mit der Option \u201e-codebase\u201c verwendet. PBOCodebase=Gibt die Codebasis-URL eines Applets an. Falls die angegebene \ Codebasis in der Richtliniendatei bereits existiert, wird diese im \ ge\u00f6ffneten Editor markiert. Falls die Codebasis neu ist, wird diese zur \ Richtliniendatei hinzugef\u00fcgt und im ge\u00f6ffneten Editor markiert. An die Option \ \u201e-codebase\u201c k\u00f6nnen auch mehrere, durch Leerzeichen getrennte URLs \ \u00fcbergeben werden. In diesem Fall werden alle Codebasen zur Richtliniendatei \ hinzugef\u00fcgt und die letzte im ge\u00f6ffneten Editor markiert. Ausschlie\u00dflich die \ erste in der Kommandozeile vorkommende Option \u201e-codebase\u201c wird \ verarbeitet. # Option Parser OPUnevenParams=F\u00fcr die Option \u201e{0}\u201c wurde eine gerade Anzahl von Parametern erwartet. # NumberOfArguments descriptions. NOAnone=Kein Parameter erwartet NOAone=Genau ein Parameter erwartet NOAonemore=Ein oder mehrere Parameter erwartet NOAevennumber=Eine gerade Anzahl von Parametern mit \u201eParameter=Wert\u201c als g\u00fcltigen Parameter erwartet # Allowed man sections manNAME=NAME manSYNOPSIS=\u00dcBERSICHT manDESCRIPTION=BESCHREIBUNG manOPTIONS=OPTIONEN manCOMMANDS=BEFEHLE manEXAMPLES=BEISPIELE manFILES=DATEIEN manBUGS=FEHLER manAUTHOR=AUTOR manSEE_ALSO=SIEHE AUCH # Cache CAutoGen=Automatisch generiert - Nicht bearbeiten! CNotCacheable={0} ist keine zwischenspeicherbare Ressource CDownloading=Herunterladen CComplete=Vollst\u00e4ndig CChooseCache=Ein Zwischenspeicherverzeichnis w\u00e4hlen... CChooseCacheInfo=Netx ben\u00f6tigt einen Ort zur Ablage von Zwischenspeicherdateien. CChooseCacheDir=Zwischenspeicherverzeichnis CCannotClearCache=Der Zwischenspeicher kann zur Zeit nicht geleert werden, vielleicht sp\u00e4ter. Wenn das Problem bestehen bleibt, kann versucht werden den Browser und die JNLP-Anwendeungen zu schlie\u00dfen. Am Ende kann man versuchen alle Java-Anwendungen zu terminieren. \\\n Der Zwischenspeicher kann mit javaws -Xclearcache oder \u00fcber itw-settings Zwischenspeicher/Dateien anzeigen.../Leeren geleert werden. CFakeCache=Der Zwischenspeicher ist durcheinander; wird geordnet. CFakedCache=Der Zwischenspeicher war durcheinander und wurde geordnet. Es wird strengstens empfohlen, dass \u201ejavaws -Xclearcache\u201c und anschlie\u00dfend die Anwendung ausgef\u00fchrt wird. Es kann ebenso \u00fcber itw-settings Zwischenspeicher/Dateien anzeigen.../Leeren verwendet werden. # extended access warning pane EXAWdesktopWants=Symbolverkn\u00fcpfung auf dem Desktop (durch die Anwendung vorgesehen). EXAWdesktopDontWants=Symbolverkn\u00fcpfung auf dem Desktop (durch die Anwendung nicht vorgesehen, aber auf Benutzeranforderung m\u00f6glich). EXAWsubmenu=Symbolverkn\u00fcpfung im Men\u00fc (Anwendung wird versuchen im Untermen\u00fc \u201e{0}\u201c anzulegen). EXAWmenuWants=Symbolverkn\u00fcpfung im Men\u00fc (durch die Anwendung vorgesehen). EXAWmenuDontWants=Symbolverkn\u00fcpfung im Men\u00fc (durch die Anwendung nicht vorgesehen, aber auf Benutzeranforderung m\u00f6glich). EXAWsettingsInfo=\u201e{0}\u201c ist eingestellt. Es kann \u00fcber das Panel \u201e{1}\u201c in itweb-settings ge\u00e4ndert werden. EXAWsettingsManage=Bestehende Men\u00fceintr\u00e4ge k\u00f6nnen \u00fcber das Panel \u201e{0}\u201c in itweb-settings verwaltet werden. EXAWrememberByApp=Per Anwendung merken EXAWrememberByPage=Per Dom\u00e4ne merken EXAWdontRemember=Nicht merken EXAWrememberByAppTooltip=Diese Anwendung wird nie nach weiteren Berechtigungen fragen EXAWrememberByPageTooltip=Alle Anwendungen in dieser Dom\u00e4ne werden nicht mehr nach Berechtigungen fragen, sondern die bestehenden Berechtigungen verwenden EXAWdontRememberTooltip=Die Entscheidung wird ausschlie\u00dflich f\u00fcr diese Berechtigung und die Dauer dieser Ausf\u00fchrung verwendet EXAWbrowser=Browserdesktopelement EXAWgenjnlp=JNLP-Generiert EXAWjnlphref=jnlp href EXAWhtml=javaws html EXAWfixhref=Probleme in jnlp-href beheben EXAWbrowserTolltip=Browser-Verkn\u00fcpfung
    \
  • Diese Option erstellt eine Verkn\u00fcpfung, die den Browser mit der aktuell geladenen Seite \u00f6ffnet
  • \
  • Falls der Browser den Offlinebetrieb unterst\u00fctzt, ist dies die sicherste Option
  • EXAWbrowsersTolltip=Ein Browser, der zum Start dieses Applets (im IcedTea-Web Plug-in ausgef\u00fchrt) verwendet wird
    \
  • Der Standardbrowser war voreingestellt
  • \
  • Das Einf\u00fcgen eines beliebigen bevorzugten Browsers steht frei
  • EXAWgeneratedTolltip=
  • Eine JNLP-Datei wird aus der aktuellen HTML-Seite erzeugt
  • \
  • Die Symbolverkn\u00fcpfung startet javaws mit dieser JNLP-Datei
  • \
  • Das Applet wird au\u00dferhalb des Browsers ausgef\u00fchrt

  • \ Diese Funktion ist in der Erprobung, funktioniert aber erstaunlich gut. EXAWhrefTolltip=Manche Applets verweisen lediglich auf eine JNLP-Datei, welche die eigentlichen Informationen \u00fcber die Ressourcen dieser Anwendung enth\u00e4lt.
    \
  • Diese Option speichert diese JNLP-Datei f\u00fcr sp\u00e4tere Starts
  • \
  • Die JNLP-Datei wird mit javaws gestartet und das Applet au\u00dferhalb des Browsers ausgef\u00fchrt

  • \ Diese Funktion ist in der Erprobung und funktioniert nicht richtig. EXAWhtmlTolltip=Unter Verwendung des Schalters \u201e-html\u201c kann versucht werden die HTML-Seite zu analysieren, das Applet zu extrahieren und es au\u00dferhalb des Browsers zu starten.
    \ Diese Funktion ist in der Erprobung. EXAWfixTolltip=Manche von einem Applet verwiesene JNLP-Dateien wurden nicht als JNLP-Anwendungen erstellt oder vorgesehen
    \
  • Dies f\u00fcgt dieser JNLP-Datei bekannte, oft fehlende Elemente hinzu (wenn sie fehlen)
  • # Security SFileReadAccess=Die Anwendung hat Lesezugriff auf {0} angefordert. Soll diese Aktion zugelassen werden? SFileWriteAccess=Die Anwendung hat Schreibzugriff auf {0} angefordert. Soll diese Aktion zugelassen werden? SDesktopShortcut=Die Anwendung hat die Berechtigung eine Verkn\u00fcpfung auf dem Desktop zu erstellen angefordert. Soll diese Aktion zugelassen werden? SSigUnverified=Die digitale Signatur der Anwendung kann nicht verifiziert werden. Soll die Anwendung zur Ausf\u00fchrung gebracht werden? Sie erh\u00e4lt unbeschr\u00e4nkten Zugriff auf den Computer. SSigVerified=Die digitale Signatur der Anwendung wurde verifiziert. Soll die Anwendung zur Ausf\u00fchrung gebracht werden? Sie erh\u00e4lt unbeschr\u00e4nkten Zugriff auf den Computer. SSignatureError=Die digitale Signatur der Anwendung hat einen Fehler. Soll die Anwendung zur Ausf\u00fchrung gebracht werden? Sie erh\u00e4lt unbeschr\u00e4nkten Zugriff auf den Computer. SUntrustedSource=Die digitale Signatur konnte nicht durch eine vertrauensw\u00fcrdige Quelle verifiziert werden. Die Anwendung sollte nur zur Ausgef\u00fchrung gebracht werden, wenn der Ursprung der Anwendung vertrauensw\u00fcrdig ist. SWarnFullPermissionsIgnorePolicy=Dem ausgef\u00fchrten Code werden volle Berechtigungen erteilt, wobei jedwede Java-Richtlinien, die eingerichtet sein k\u00f6nnten, ignoriert werden. STrustedSource=Die digitale Signatur wurde durch eine vertrauensw\u00fcrdige Quelle best\u00e4tigt. SClipboardReadAccess=Die Anwendung hat den ausschlie\u00dflichen Lesezugriff auf die Systemzwischenablage angefordert. Soll diese Aktion zugelassen werden? SClipboardWriteAccess=Die Anwendung hat den ausschlie\u00dflichen Schreibzugriff auf die Systemzwischenablage angefordert. Soll diese Aktion zugelassen werden? SPrinterAccess=Die Anwendung hat den Druckerzugriff angefordert. Soll diese Aktion zugelassen werden? SNetworkAccess=Die Anwendung hat die Berechtigung Verbindungen zu {0} herzustellen angefordert. Soll diese Aktion zugelassen werden? SNoAssociatedCertificate= SUnverified=(nicht verifiziert) SAlwaysTrustPublisher=Dem Inhalt von diesem Herausgeber immer vertrauen SHttpsUnverified=Das HTTPS Zertifikat dieser Website kann nicht verifiziert werden. SRememberOption=Soll diese Option gespeichert werden? SRememberAppletOnly=F\u00fcr Applet SRememberCodebase=F\u00fcr Website {0} SUnsignedSummary=Eine nicht signierte Java Anwendung m\u00f6chte zur Ausf\u00fchrung gebracht werden. SUnsignedDetail=Eine nicht signierte Anwendung am folgenden Ort m\u00f6chte zur Ausf\u00fchrung gebracht werden:
      {0}
    Seite, welche die Anforderung gestellt hat:
      {1}

    Es wird empfohlen, ausschlie\u00dflich Anwendungen zur Ausf\u00fchrung zu bringen, die von vertrauensw\u00fcrdigen Websites stammen. SUnsignedAllowedBefore=Dieses Applet wurde bereits akzeptiert ({0}). SUnsignedRejectedBefore=Dieses Applet wurde bereits abgelehnt ({0}). SUnsignedQuestion=Soll dem Applet die Ausf\u00fchrung erlaubt werden? SPartiallySignedSummary=Nur Teile des Anwendungscodes sind signiert. SPartiallySignedDetail=Diese Anwendung enth\u00e4lt sowohl signierten als auch nicht signierten Code. W\u00e4hrend signierter Code sicher ist, wenn Sie dem Anbieter vertrauen, kann nicht signierter Code sich \u00fcber Code erstrecken, der sich der Kontrolle des Anbieters entzieht. SPartiallySignedQuestion=Soll fortgefahren und diese Anwendung dennoch zur Ausf\u00fchrung gebracht werden? SAuthenticationPrompt=Der Server {0} von {1} fordert Authentifizierung an. Er sagt: \u201e{2}\u201c SJNLPFileIsNotSigned=Die Anwendung enth\u00e4lt eine digitale Signatur in der, die startende JNLP-Datei nicht signiert ist. STrustedOnlyAttributeFailure=Diese Anwendung gibt true f\u00fcr Trusted-only in ihrem Manifest an. {0} und fordert Berechtigungsstufe: {1}. Dies ist nicht erlaubt. STOAsignedMsgFully=Das Applet ist vollst\u00e4ndig signiert STOAsignedMsgAndSandbox=Das Applet ist vollst\u00e4ndig signiert und im Sandkasten STOAsignedMsgPartiall=Das Applet ist nicht vollst\u00e4ndig signiert STempNetwork=Ein- und ausgehende Netzwerkverbindungen zulassen STempReadFilesAndProperties=Ausschlie\u00dflich Lesezugriff auf alle Dateien und Eigenschaften STempWriteFilesAndProperties=Ausschlie\u00dflich Schreibzugriff auf alle Dateien und Eigenschaften STempReflectionAndExternal=Java-Introspektion und externer Codezugriff STempAllMedia=Alle Medien (Drucken, Audio, Zwischenablage) # Security - used for the More Information dialog SBadKeyUsage=Ressourcen enthalten Eintr\u00e4ge, deren Signaturzertifikaterweiterung KeyUsage die Codesignatur nicht zul\u00e4sst. SBadExtendedKeyUsage=Ressourcen enthalten Eintr\u00e4ge, deren Signaturzertifikaterweiterung ExtendedKeyUsage die Codesignatur nicht zul\u00e4sst. SBadNetscapeCertType=Ressourcen enthalten Eintr\u00e4ge, deren Signaturzertifikaterweiterung NetscapeCertType die Codesignatur nicht zul\u00e4sst. SHasExpiredCert=Die digitale Signatur ist abgelaufen. SHasExpiringCert=Ressourcen enthalten Eintr\u00e4ge, deren Signaturzertifikat innerhalb von 6 Monaten ablaufen wird. SNotYetValidCert=Ressourcen enthalten Eintr\u00e4ge, deren Signaturzertifikat noch nicht g\u00fcltig ist. SUntrustedCertificate=Die digitale Signatur wurde mit einem nicht vertrauensw\u00fcrdigen Zertifikat generiert. STrustedCertificate=Die digitale Signatur wurde mit einem vertrauensw\u00fcrdigen Zertifikat generiert. SCNMisMatch=Der erwartete Hostname f\u00fcr dieses Zertifikat ist: \u201e{0}\u201c
    Die Adresse zu der verbunden wird ist: \u201e{1}\u201c SRunWithoutRestrictions=Diese Anwendung wird ohne die von Java normalerweise gebotenen Sicherheitsbeschr\u00e4nkungen ausgef\u00fchrt werden. SCertificateDetails=Zertifikatdetails # Security - certificate information SIssuer=Aussteller SSerial=Seriennummer SMD5Fingerprint=MD5 Fingerabdruck SSHA1Fingerprint=SHA1 Fingerabdruck SSignature=Signatur SSignatureAlgorithm=Signaturalgorithmus SSubject=Inhaber SValidity=G\u00fcltigkeit # Certificate Viewer CVCertificateViewer=Zertifikate CVCertificateType=Zertifikattyp CVDetails=Details CVExport=Exportieren CVExportPasswordMessage=Kennwort eingeben, um Schl\u00fcsseldatei zu sch\u00fctzen: CVImport=Importieren CVImportPasswordMessage=Kennwort eingeben, um auf Datei zuzugreifen: CVIssuedBy=Ausgestellt von CVIssuedTo=Ausgestellt f\u00fcr CVPasswordTitle=Authentifizierung erforderlich CVRemove=Entfernen CVRemoveConfirmMessage=Soll das markierte Zertifikat wirklich entfernt werden? CVRemoveConfirmTitle=Zertifikat entfernen CVUser=Benutzer CVSystem=System # KeyStores: see KeyStores.java KS=Schl\u00fcsselspeicher KSCerts=Vertrauensw\u00fcrdige Zertifikate KSJsseCerts=Vertrauensw\u00fcrdige JSSE Zertifikate KSCaCerts=Vertrauensw\u00fcrdige Stammzertifizierungsstellenzertifikate KSJsseCaCerts=Vertrauensw\u00fcrdige JSSE Stammzertifizierungsstellenzertifikate KSClientCerts=Clientauthentifizierungszertifikate # Deployment Configuration messages DCIncorrectValue=Die Eigenschaft \u201e{0}\u201c hat den falschen Wert \u201e{1}\u201c. M\u00f6gliche Werte {2}. DCInternal=Interner Fehler: {0} DCSourceInternal= DCUnknownSettingWithName=Die Eigenschaft \u201e{0}\u201c ist unbekannt. DCmaindircheckNotexists=Nach allen Versuchen, das Benutzerkonfigurationsverzeichnis \u201e{0}\u201c existiert nicht. DCmaindircheckNotdir=Das Benutzerkonfigurationsverzeichnis \u201e{0}\u201c ist kein Verzeichnis. DCmaindircheckRwproblem=Schreib- oder Lesefehler beim Zugriff auf das Benutzerkonfigurationsverzeichnis \u201e{0}\u201c. # Value Validator messages. Messages should follow "Possible values ..." VVPossibleValues=M\u00f6gliche Werte {0} VVPossibleBooleanValues=sind {0} oder {1} VVPossibleFileValues=sind ein absoluter Pfad zu einer Datei oder einem Verzeichnis VVPossibleRangedIntegerValues=liegen im Bereich von {0} bis {1} (inklusive) VVPossibleUrlValues=sind jede g\u00fcltige URL (z.B. http://icedtea.classpath.org/hg/) # Control Panel - Main CPMainDescriptionShort=IcedTea-Web Konfigurieren CPMainDescriptionLong=Konfiguriert, wie das Browser-Plugin (IcedTeaNPPlugin) und javaws (NetX) arbeiten # Control Panel - Tab Descriptions CPAboutDescription=Versionsinformationen \u00fcber die IcedTea Systemsteuerung anzeigen. CPNetworkSettingsDescription=Netzwerkeinstellungen konfigurieren, inklusive wie IcedTea-Web sich mit dem Internet verbindet und ob Proxys verwendet werden. CPTempInternetFilesDescription=Java h\u00e4lt Anwendungsdaten f\u00fcr eine schnellere Ausf\u00fchrung beim n\u00e4chsten Start vor. CPJRESettingsDescription=Java Runtime Environment Versionen und Einstellungen zu Java Anwendungen sowie Applets anzeigen und verwalten. CPCertificatesDescription=Nutzen Sie Zertifikate um sich erfolgreich auszuweisen sowie die Identit\u00e4t von Zertifikatinhabern, Zertifizierungsstellen und Herausgebern festzustellen. CPSecurityDescription=Dies zur Konfiguration von Sicherheitseinstellungen nutzen. CPDebuggingDescription=Hier Optionen aktivieren um bei der Fehlerbeseitigung zu helfen CPDesktopIntegrationDescription=Die Erstellung von Desktopverkn\u00fcpfungen zulassen oder verhindern. CPJVMPluginArguments=JVM-Parameter f\u00fcr das Plug-in setzen. CPJVMitwExec=Eine JVM f\u00fcr IcedTea-Web einstellen, welche am besten mit OpenJDK funktioniert CPJVMitwExecValidation=JVM f\u00fcr IcedTea-Web pr\u00fcfen CPJVMPluginSelectExec=Nach JVM f\u00fcr IcedTea-Web durchsuchen CPJVMnone=Kein Pr\u00fcfergebnis f\u00fcr CPJVMvalidated=Pr\u00fcfergebnis f\u00fcr CPJVMvalueNotSet=Kein Wert angegeben. Die fest eincodierte JVM wird verwendet. CPJVMnotLaunched=Fehler: Der Prozess wurde nicht gestartet. F\u00fcr weitere Informationen, bitte die Konsolenausgabe beachten. CPJVMnoSuccess=Der Prozess wurde mit einem Fehler beendet. Bitte die Ausgabe f\u00fcr weitere Details beachten. Die Java-Laufzeitumgebung ist nicht korrekt eingestellt. CPJVMopenJdkFound=Exzellent, OpenJDK wurde erkannt CPJVMoracleFound=Gro\u00dfartig, Oracle Java wurde erkannt CPJVMibmFound=Gut, IBM Java wurde erkannt CPJVMgijFound=Warnung, gij wurde erkannt CPJVMstrangeProcess=Der Pfad hatte einen ausf\u00fchrbaren Prozess, aber dies wurde nicht erkannt. Bitte die Java-Version anhand der Konsolenausgabe \u00fcberpr\u00fcfen. CPJVMnotDir=Fehler: Der gew\u00e4hlte Pfad ist kein Verzeichnis. CPJVMisDir=Der gew\u00e4hlte Pfad ist ein Verzeichnis. CPJVMnoJava=Fehler: Das gew\u00e4hlte Verzeichnis enth\u00e4lt bin/java nicht. CPJVMjava=Das gew\u00e4hlte Verzeichnis enth\u00e4lt bin/java. CPJVMnoRtJar=Fehler: Das gew\u00e4hlte Verzeichnis enth\u00e4lt lib/rt.jar nicht. CPJVMrtJar=Das Verzeichnis enth\u00e4lt lib/rt.jar. CPJVMPluginAllowTTValidation=JRE sofort pr\u00fcfen CPJVMNotokMessage1=Es wurde der ung\u00fcltige JDK-Wert
    • {0}
    mit folgender Fehlermeldung eingegeben: CPJVMNotokMessage2=M\u00f6gliche Gr\u00fcnde f\u00fcr diese Meldung sind:
    * Einige Pr\u00fcftests wurden nicht bestanden
    * Es wurde kein OpenJDK erkannt
    Wegen eines ungeeigneten JDKs wird IcedTea-Web wahrscheinlich nicht starten k\u00f6nnen.
    Die Eigenschaft {0} in der Konfigurationsdatei
    • {1}
    m\u00fcsste angepasst oder entfernt werden.
    Es wird empfohlen nach OpenJDK auf diesem System zu suchen. CPJVMconfirmInvalidJdkTitle=Ungeeignetes JDK CPJVMconfirmReset=Auf Standard zur\u00fccksetzen? CPPolicyDetail=Die Java-Richtliniendatei des aktuellen Benutzers anschauen und bearbeiten.
    Dies erlaubt Laufzeitberechtigungen an Applets zu gew\u00e4hren oder abzulehnen, unabh\u00e4ngig von den Sandbox-Standardsicherheitsregeln. CPPolicyTooltip=\u00d6ffnet \u201e{0}\u201c im Richtlinieneditor (policytool) CPPolicyEditorNotFound=Konnte keinen Richtlinieneditor finden. Es sollte gepr\u00fcft werden, dass policytool \u00fcber die Umgebungsvariable PATH aufgel\u00f6st werden kann. # Control Panel - Buttons CPButAbout=\u00dcber... CPButNetworkSettings=Netzwerkeinstellungen... CPButSettings=Einstellungen... CPButView=Anzeigen... CPButCertificates=Zertifikate... CPButSimpleEditor=Einfacher Editor... CPButAdvancedEditor=Erweiterter Editor... # Control Panel - Headers CPHead=IcedTea-Web Systemsteuerung CPHeadAbout=\u00a0\u00dcber\u00a0IcedTea-Web\u00a0 CPHeadNetworkSettings=\u00a0Netzwerkproxyeinstellungen\u00a0 CPHeadTempInternetFiles=\u00a0Tempor\u00e4re\u00a0Internetdateien\u00a0 CPHeadJRESettings=\u00a0Java\u00a0Runtime\u00a0Environment\u00a0Einstellungen\u00a0 CPHeadCertificates=\u00a0Zertifikate\u00a0 CPHeadDebugging=\u00a0Fehlerbeseitigungseinstellungen\u00a0 CPHeadDesktopIntegration=\u00a0Desktopintegration\u00a0 CPHeadSecurity=\u00a0Sicherheitseinstellungen\u00a0 CPHeadJVMSettings=\u00a0JVM\u00a0Einstellungen\u00a0 CPHeadPolicy=\u00a0Benutzerdefinierte\u00a0Richtlinieneinstellungen\u00a0 # Control Panel - Tabs CPTabAbout=\u00dcber IcedTea-Web CPTabCache=Zwischenspeicher CPTabCertificate=Zertifikate CPTabClassLoader=Klassenlader CPTabDebugging=Fehlerbeseitigung CPTabDesktopIntegration=Desktopintegration CPTabMenuShortcuts=Installierte Men\u00fcverkn\u00fcpfungen CPTabNetwork=Netzwerk CPTabRuntimes=Laufzeitumgebungen CPTabSecurity=Sicherheit CPTabJVMSettings=JVM Einstellungen CPTabPolicy=Richtlinieneinstellungen # Control Panel - AboutPanel CPAboutInfo=Diese Systemsteuerung dient der Einstellung von deployment.properties.
    Nicht alle Optionen haben eine Wirkung, bis Sie implementiert wurden.
    Die Verwendung mehrerer JREs ist derzeit auf OpenJDK beschr\u00e4nkt.
    # Control Panel - AdvancedProxySettings APSDialogTitle=Netzwerkeinstellungen APSServersPanel=Server APSProxyTypeLabel=Typ APSProxyAddressLabel=Proxyadresse APSProxyPortLabel=Proxyanschluss APSLabelHTTP=HTTP APSLabelSecure=Gesichert APSLabelFTP=FTP APSLabelSocks=Socks APSSameProxyForAllProtocols=Denselben Proxyserver f\u00fcr alle Protokolle verwenden. APSExceptionsLabel=Ausnahmen APSExceptionsDescription=Keinen Proxyserver f\u00fcr Adressen verwenden, die damit beginnen APSExceptionInstruction=Trennen Sie jeden Eintrag mit einem Semikolon (;). # Control Panel - DebugginPanel CPDebuggingPossibilites=Protokollausgabe DPEnableLogging=Protokollierung aktivieren DPEnableLoggingHint=Wenn dieser Schalter gesetzt ist, dann werden ebenfalls Meldungen zur Fehlerbeseitigung protokolliert. Dies ist gleichbedeutend zu -verbose oder ICEDTEAPLUGIN_DEBUG=true. DPEnableHeaders=Tabellen\u00fcberschriften aktivieren DPEnableHeadersHint=Wenn dieser Schalter gesetzt ist, wird jede protokollierte Meldung mit zus\u00e4tzlichen \u00dcberschriften, wie Benutzer, Quellcodezeile und Zeit versehen. DPEnableFile=Protokollierung in Datei aktivieren CPFilesLogsDestDir=Protokolldateiverzeichnis CPFilesLogsDestDirResert=Standard DPEnableFileHint=Ausgabemeldungen werden in eine Datei im Verzeichnis \u201e{0}\u201c gespeichert DPEnableStds=Protokollierung auf Standardausgabe aktivieren DPEnableStdsHint=Meldungen werden auf der Standardausgabe ausgegeben DPEnableSyslog=Protokollierung in das Systemprotokoll aktivieren DPEnableSyslogHint=Ausgabemeldungen werden im Systemprotokoll gespeichert DPDisable=Deaktivieren DPHide=Beim Start verbergen DPShow=Beim Start anzeigen DPShowPluginOnly=Beim Start des Plug-ins anzeigen DPShowJavawsOnly=Beim Start von javaws anzeigen DPJavaConsole=Javakonsole DPJavaConsoleDisabledHint=Die Javakonsole ist deaktiviert. Mit itweb-settings kann sie von \u201eDeaktiviert\u201c auf einen beliebigen Anzeige- oder Verborgenheitswert konfiguriert werden. # PolicyEditor PETitle=PolicyEditor PETitleWithPath=PolicyEditor \u2014 {0} PETitleWithChangesMade={0} * PEReadProps=Systemeigenschaften lesen PEReadPropsDetail=Applets das Lesen von Systemeigenschaften, wie den aktuellen Benutzernamen und den Ort des Benutzerverzeichnisses erlauben PEWriteProps=Systemeigenschaften schreiben PEWritePropsDetail=Applets das (\u00dcber)schreiben von Systemeigenschaften erlauben PEReadFiles=Aus lokalen Dateien lesen PEReadFilesDetail=Applets das Lesen aus Dateien im aktuellen Benutzerverzeichnis erlauben PEWriteFiles=In lokale Dateien schreiben PEWriteFilesDetail=Applets das Schreiben in Dateien im Benutzerverzeichnis des aktuellen Benutzers erlauben PEDeleteFiles=Lokale Dateien l\u00f6schen PEDeleteFilesDetail=Applets das L\u00f6schen von Dateien im Benutzerverzeichnis des aktuellen Benutzers erlauben PEReadSystemFiles=Alle Systemdateien lesen PEReadSystemFilesDetail=Applets ausschlie\u00dflichen Lesezugriff auf alle Orte im Computer erlauben PEWriteSystemFiles=Alle Systemdateien schreiben PEWriteSystemFilesDetail=Applets ausschlie\u00dflichen Schreibzugriff auf alle Orte im Computer erlauben PEReadTempFiles=Aus tempor\u00e4ren Dateien lesen PEReadTempFilesDetail=Applets das Lesen aus dem Verzeichnis tempor\u00e4rer Dateien des aktuellen Benutzers erlauben PEWriteTempFiles=In tempor\u00e4re Dateien schreiben PEWriteTempFilesDetail=Applets das Schreiben in das Verzeichnis tempor\u00e4rer Dateien des aktuellen Benutzers erlauben PEDeleteTempFiles=Tempor\u00e4re Dateien l\u00f6schen PEDeleteTempFilesDetail=Applets das L\u00f6schen von Dateien im Verzeichnis tempor\u00e4rer Dateien des aktuellen Benutzers erlauben PEAWTPermission=Fenstersystemzugriff PEAWTPermissionDetail=Applets den vollen Zugriff auf das AWT Fenstersystem erlauben PEClipboard=Zugriff auf die Zwischenablage PEClipboardDetail=Applets das Lesen und Schreiben der Zwischenablage des aktuellen Benutzers erlauben PENetwork=Netzwerkzugriff PENetworkDetail=Applets die Herstellung von beliebigen Netzwerkverbindungen erlauben PEPrint=Dokumente drucken PEPrintDetail=Applets das Einreihen von Druckauftr\u00e4gen erlauben PEPlayAudio=Kl\u00e4nge abspielen PEPlayAudioDetail=Applets das Abspielen von Kl\u00e4ngen, ohne Aufnahme erlauben PERecordAudio=Ton aufnehmen PERecordAudioDetail=Applets die Tonaufnahme, ohne Abspielen erlauben PEReflection=Java-Introspektion PEReflectionDetail=Applets den Zugriff auf die Java Reflection API erlauben PEClassLoader=Klassenlader abrufen PEClassLoaderDetail=Applets den Zugriff auf den Systemklasslader (oft bei Introspektion verwendet) erlauben PEClassInPackage=Zugriff auf fremde Pakete PEClassInPackageDetail=Applets den Zugriff auf Klassen in fremden Applet-Paketen (oft bei Introspektion verwendet) erlauben PEDeclaredMembers=Zugriff auf private Daten einer Klasse PEDeclaredMembersDetail=Applets den Zugriff auf gekapselte Daten (oft bei Introspektion verwendet) erlauben PEAccessThreads=Ausf\u00fchrungsstr\u00e4nge \u00e4ndern PEAccessThreadsDetail=Applets den Start, Stopp sowie anderweitige Verwaltung von Ausf\u00fchrungsstr\u00e4ngen erlauben PEAccessThreadGroups=Ausf\u00fchrungsstranggruppen \u00e4ndern PEAccessThreadGroupsDetail=Applets den Start, Stopp sowie anderweitige Verwaltung von Ausf\u00fchrungsstranggruppen erlauben PEExec=Befehle ausf\u00fchren PEExecDetail=Applets die Ausf\u00fchrung von Systembefehlen erlauben PEGetEnv=Umgebungsvariablen abrufen PEGetEnvDetail=Applets das Lesen von Systemumgebungsvariablen erlauben PECouldNotOpen=Kann die Richtliniendatei nicht \u00f6ffnen PECouldNotSave=Kann die Richtliniendatei nicht speichern PEAddEntry=Neue Codebasis hinzuf\u00fcgen PERemoveEntry=Entfernen PEEntryPrompt=Eine neue Codebasis eingeben: PEGlobalSettings=Alle Applets PESaveChanges=Sollen die \u00c4nderungen vor dem Beenden gespeichert werden? PEChangesSaved=\u00c4nderungen gespeichert PECheckboxLabel=Berechtigungen PEEntriesLabel=Codebasen PEFileMenu=Datei PENewMenuItem=Neu PEOpenMenuItem=\u00d6ffnen... PEOpenDefaultMenuItem=Standardrichtliniendatei \u00f6ffnen PESaveMenuItem=Speichern PESaveAsMenuItem=Speichern unter... PEExitMenuItem=Beenden PECodebaseMenu=Codebasis PEAddCodebaseItem=Hinzuf\u00fcgen... PERemoveCodebaseItem=Entfernen PERenameCodebaseItem=Umbenennen PECopyCodebaseItem=Kopieren PEPasteCodebaseItem=Einf\u00fcgen... PERenameCodebase=Codebasis umbenennen in: PEPasteCodebase=Kopierte Codebasis einf\u00fcgen als: PEViewMenu=Ansicht PECustomPermissionsItem=Benutzerdefinierte Berechtigungen... PEFileModified=Datei\u00e4nderungswarnung PEFileModifiedDetail=Die Richtliniendatei \u201e{0}\u201c wurde ge\u00e4ndert seit sie ge\u00f6ffnet wurde.\nNeu laden und bearbeiten vor dem Speichern? PEFileMissing=Die Richtliniendatei war nicht gespeichert. Eine neue Datei mit demselben Namen wurde gespeichert. PEGAccessUnownedCode=Fremden Code ausf\u00fchren PEGMediaAccess=Medienzugriff PEGRightClick=Rechtsklick zum auf-/zuklappen PEGReadFileSystem=Vom System lesen PEGWriteFileSystem=Zum System schreiben PEClipboardError=Die Zwischenablage scheint keine g\u00fcltig formatierten Richtlinieneintr\u00e4ge zu enthalten PEInvalidPolicy=Einf\u00fcgen gescheitert: Ein Richtlinieneintrag f\u00fcr die Codebasis \u201e{0}\u201c konnte nicht aus der Zwischenablage gelesen werden. PEClipboardAccessError=Konnte nicht aus der Zwischenablage lesen PEHelpMenu=Hilfe PEAboutPolicyEditorItem=\u00dcber PolicyEditor... PEPolicyEditorHelpItem=PolicyEditor-Hilfe... PEHelpDialogTitle=PolicyEditor-Hilfe # Policy Editor CustomPolicyViewer PECPTitle=Ansicht benutzerdefinierter Richtlinien PECPListLabel=Weitere Richtlinien f\u00fcr \u201e{0}\u201c PECPAddButton=Hinzuf\u00fcgen PECPRemoveButton=Entfernen PECPCloseButton=Schlie\u00dfen PECPType=Typ PECPTarget=Ziel PECPActions=Aktionen PECPPrompt=Eingabe einer benutzerdefinierten Berechtigung\n\u201epermission\u201c oder Satzzeichen d\u00fcrfen nicht enthalten sein: # PolicyEditor mnemonics. See javax.swing.KeyStroke.getKeyStroke(String) PEFileMenuMnemonic=D PECodebaseMenuMnemonic=C PEViewMenuMnemonic=S PEHelpMenuMnemonic=H PEHelpMenuMnemonic=H PEAddEntryMnemonic=N PEAddCodebaseItemMnemonic=H PERemoveEntryMnemonic=E PERemoveCodebaseItemMnemonic=E PENewMenuItemMnemonic=N PEOpenMenuItemMnemonic=\u00d6 PEOpenDefaultMenuItemMnemonic=D PESaveMenuItemMnemonic=S PEExitMenuItemMnemonic=B PECustomPermissionsItemMnemonic=B PECopyCodebaseItemMnemonic=K PEPasteCodebaseItemMnemonic=E PECopyCodebaseToClipboardItemMnemonic=U PESaveAsMenuItemMnemonic=U PERenameCodebaseItemMnemonic=U PEAboutPolicyEditorItemMnemonic=\u00dc PEPolicyEditorHelpItemMnemonic=H # PolicyEditor accelerators. See javax.swing.KeyStroke.getKeyStroke(String) PEAddCodebaseItemAccelerator=control shift N PERemoveCodebaseItemAccelerator=DELETE PENewMenuItemAccelerator=control N PEOpenMenuItemAccelerator=control O PEOpenDefaultMenuItemAccelerator=control D PESaveMenuItemAccelerator=control S PESaveAsMenuItemAccelerator=control shift S PEExitMenuItemAccelerator=control Q PECustomPermissionsItemAccelerator=control B PECopyCodebaseItemAccelerator=control C PEPasteCodebaseItemAccelerator=control V PERenameCodebaseItemAccelerator=F2 PECopyCodebaseToClipboardItemAccelerator=control shift C PEAboutPolicyEditorCloseAccelerator=control Q # conole itself labels CONSOLErungc=Speicher bereinigen CONSOLErunFinalizers=Finalisieren CONSOLErunningFinalizers=Finalisierer werden ausgef\u00fchrt... CONSOLEmemoryInfo=Speicher\u00fcbersicht CONSOLEsystemProperties=Systemeigenschaften CONSOLEclassLoaders=Verf\u00fcgbare Klassenlader CONSOLEthreadList=Liste der Ausf\u00fchrungsstr\u00e4nge CONSOLEthread=Ausf\u00fchrungsstrang CONSOLEnoClassLoaders=Keine Informationen \u00fcber Klassenlader im System CONSOLEmemoryMax=Maximal verf\u00fcgbarer Speicher CONSOLEmemoryTotal=Gesamtspeicher CONSOLEmemoryFree=Freier Speicher CONSOLEClean=Konsole bereinigen # console output pane labels COPsortCopyAllDate=\u201eAlles kopieren\u201c nach Datum sortieren COPshowHeaders=\u00dcberschriften anzeigen: COPuser=Benutzer COPorigin=Herkunft COPlevel=Stufe COPdate=Datum COPthread1=Ausf\u00fchrungsstrang 1 COPthread2=Ausf\u00fchrungsstrang 2 COPShowMessages=Meldungen anzeigen COPstdOut=Standardausgabe COPstdErr=Standardfehlerausgabe COPjava=Java COPplugin=Plug-in COPpreInit=Pr\u00e4-Initialisierung COPpluginOnly=Nur Plug-in COPSortBy=Sortieren nach COPregex=Filter regul\u00e4rer Ausdr\u00fccke COPAsArrived=Nach Ankunft (keine Sortierung) COPcode=Code COPmessage=Meldung COPSearch=Suchen COPautoRefresh=Auto-Aktualisieren COPrefresh=Aktualisieren COPApply=Anwenden COPmark=markieren COPCopyAllPlain=Alles kopieren (einfach) COPCopyAllRich=Alles kopieren (angereichert) COPnext=Weiter>>> COPprevious=<<WARNUNG: Verwendet mehr Speicher als die verf\u00fcgbaren {0} MB TIFPCacheSizeSpinnerLargeValueWarning={0} MB verf\u00fcgbar TIFPCacheSizeSetToNoCaching=Zwischengespeicherte Dateien werden nach dem Beenden von IcedTea-Web gel\u00f6scht. TIFPCacheSizeSpinnerTooltip=Minimum: {0} Maximum: {1} # Control Panel - Cache Viewer CVCPDialogTitle=Zwischenspeicheranzeige CVCPButRefresh=Aktualisieren CVCPButDelete=Entfernen CVCPCleanCache=Leeren CVCPCleanCacheTip=Manche Fehler k\u00f6nnen durch veraltete Dateien im Zwischenspeicher verursacht werden. Vor der Einsendung von Fehlerberichten sollte der Zwischenspeicher geleert und eine betreffende Anwendung neu gestartet werden. \\\n Der Zwischenspeicher kann mit javaws -Xclearcache oder \u00fcber itw-settings Zwischenspeicher/Dateien anzeigen.../Leeren geleert werden. CVCPColLastModified=Zuletzt ge\u00e4ndert CVCPColSize=Gr\u00f6\u00dfe (Bytes) CVCPColDomain=Dom\u00e4ne CVCPColType=Typ CVCPColPath=Pfad CVCPColName=Name # Control Panel - Misc. CPJRESupport=IcedTea-Web unterst\u00fctzt die Verwendung mehrerer JREs derzeit nicht. CPInvalidPort=Ung\u00fcltige Anschlussnummer eingegeben.\n[G\u00fcltige Anschlussnummern sind 1-65535] CPInvalidPortTitle=Eingabefehler # command line control panel CLNoInfo=Keine Informationen verf\u00fcgbar (ist dies eine g\u00fcltige Option?). CLValue=Wert: {0} CLValueSource=Herkunft: {0} CLDescription=Beschreibung: {0} CLUnknownCommand=Unbekannter Befehl {0} CLUnknownProperty=Unbekannter Eigenschaftenname \u201e{0}\u201c CLWarningUnknownProperty=WARNUNG: Unbekannter Eigenschaftenname \u201e{0}\u201c - erstelle neue Eigenschaft CLNoIssuesFound=Keine Probleme gefunden. CLIncorrectValue=Die Eigenschaft \u201e{0}\u201c hat den falschen Wert \u201e{1}\u201c. M\u00f6gliche Werte {2}. CLListDescription=Zeigt eine Liste aller Eigenschaftennamen und Werte an, die durch IcedTea-Web\nverwendet werden CLGetDescription=Zeigt den Wert der Eigenschaft property-name an CLSetDescription=Wenn m\u00f6glich, setzt die Eigenschaft property-name auf den Wert value. Der Wert\nwird auf G\u00fcltigkeit gepr\u00fcft. Falls der Administrator die Eigenschaft gesperrt\nhat, wird dies keine Wirkung haben. CLResetDescription=Setzt den Wert der Eigenschaft property-name auf seinen Standardwert zur\u00fcck.\nall setzt alle durch IcedTea-Web verwendeten Eigenschaften auf ihren Standardwert zur\u00fcck. CLInfoDescription=Zeigt weitere Informationen \u00fcber die gegebene Eigenschaft an. CLCheckDescription=Zeigt alle Eigenschaften an, die definiert wurden, aber durch IcedTea-Web nicht\nerkannt werden. CLUnexpectedNumberOfCommands=itweb-settings kann nur einen Befehl pro Aufruf verarbeiten. # splash screen related SPLASHerror=Um Details zu erhalten, hier klicken. Eine Ausnahme ist aufgetreten. SPLASH_ERROR=FEHLER SPLASHtitle=Titel SPLASHvendor=Lieferant SPLASHhomepage=Homepage SPLASHdescription=Beschreibung SPLASHClose=Schlie\u00dfen SPLASHclosewAndCopyException=Schlie\u00dfen und den Stapelverlauf in die Zwischenablage kopieren SPLASHexOccured=Eine schwerwiegende Ausnahme ist aufgetreten... SPLASHHome=Seitenanfang SPLASHcantCopyEx=Kann Ausnahme nicht kopieren SPLASHnoExRecorded=Keine Ausnahme aufgezeichnet SPLASHmainL1=Um noch mehr Informationen zu erhalten, kann {0} besucht und die dort beschriebenen Schritte befolgt werden, um notwendige Informationen zu erhalten einen Fehler zu melden SPLASHmainL3=Keine weiteren Informationen verf\u00fcgbar. Es kann versucht werden den Web-Browser von der Befehlszeile aus zu starten und die Ausgabe zu untersuchen. SPLASHcloseAndCopyShorter=Schlie\u00dfen und in die Zwischenablage kopieren SPLASHmainL4=Die folgende Ausnahme ist aufgetreten. Um weitere Informationen zu erhalten, kann der Web-Browser von der Befehlszeile aus gestartet und die Ausgabe untersucht werden. SPLASHmainL2=Die Konsole oder Protokolle k\u00f6nnen weitere Informationen bereithalten. Mit der Aktivierung der Fehlerbeseitigung k\u00f6nnen noch mehr Informationen bereitgestellt werden. SPLASHexWas=Die Ausnahme war: SPLASHcfl=Kann der Verkn\u00fcpfung zu nicht folgen SPLASHvendorsInfo=Informationen vom Lieferanten der Anwendung SPLASHanotherInfo=Eine weitere verf\u00fcgbare Info SPLASHdefaultHomepage=Homepage nicht angegeben, verifiziere eher Quelle SPLASHerrorInInformation=Fehler w\u00e4hrend des Ladens des Elements information, verifiziere eher Quelle SPLASHmissingInformation=Das Element information fehlt, verifiziere eher Quelle SPLASHchainWas=Dies ist die Liste der Ausnahmen, die w\u00e4hrend des Starts des Applets aufgetreten sind. Hinweis: Diese Ausnahmen k\u00f6nnen von mehreren Applets stammen. Um einen hilfreichen Fehlerbericht zu erstellen, sollte sichergestellt sein, dass nur ein Applet ausgef\u00fchrt wird. CBCheckFile=Die Anwendung ist eine lokale Datei. Die Pr\u00fcfung der Codebasis ist deaktiviert. Um Einzelheiten zu erfahren siehe: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckNoEntry=Die Anwendung gibt keine Codebasis in ihrem Manifest an. Dies bedarf einer R\u00fcckfrage an den Lieferanten des Applets. Fahre fort. Um Einzelheiten zu erfahren siehe: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckUnsignedPass=Die Codebasis stimmt mit der Codebasis im Manifest \u00fcberein. Fahre fort. Um Einzelheiten zu erfahren siehe: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckUnsignedFail=Die Codebasis der Anwendung stimmt NICHT mit der in ihrem Manifest angegebenen Codebasis \u00fcberein, aber die Anwendung ist nicht signiert. Fahre fort. Um Einzelheiten zu erfahren siehe: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckOkSignedOk=Die Codebasis stimmt mit der Codebasis im Manifest \u00fcberein und die Anwendung ist signiert. Fahre fort. Um Einzelheiten zu erfahren siehe: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckSignedAppletDontMatchException=Die Ausf\u00fchrung von signierten Applets ist nicht zugelassen, w\u00e4hrend ihre tats\u00e4chliche Codebasis nicht mit der in ihrem Manifest angegebenen Codebasis \u00fcbereinstimmt. Erwartet: {0}. Tats\u00e4chlich: {1}. Um Einzelheiten zu erfahren siehe: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. CBCheckSignedFail=Die Codebasis der Anwendung stimmt NICHT mit der im Manifest der Anwendung angegebenen Codebasis \u00fcberein und die Anwendung ist signiert. Es wird strengstens von der Ausf\u00fchrung dieser Anwendung abgeraten. Um Einzelheiten zu erfahren siehe: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html. # itweb-settings man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. # itweb-plugin man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. # files descriptions APPEXTSECappletSecurityLevelExtraHighId=Die Ausf\u00fchrung aller Java-Applets deaktivieren APPEXTSECappletSecurityLevelVeryHighId=Sehr hohe Sicherheit APPEXTSECappletSecurityLevelHighId=Hohe Sicherheit APPEXTSECappletSecurityLevelLowId=Niedrige Sicherheit APPEXTSECappletSecurityLevelExtraHighExplanation=Kein Applet wird ausgef\u00fchrt werden APPEXTSECappletSecurityLevelVeryHighExplanation=Keine nicht signierten Applets werden ausgef\u00fchrt werden APPEXTSECappletSecurityLevelHighExplanation=Benutzer wird bei jedem nicht signierten Applet gefragt werden APPEXTSECappletSecurityLevelLowExplanation=Alle, sogar nicht signierte Applets werden ausgef\u00fchrt werden APPEXTSECunsignedAppletActionAlways=Diesem/n (\u00fcbereinstimmenden) Applet/s immer vertrauen APPEXTSECunsignedAppletActionNever=Diesem/n (\u00fcbereinstimmenden) Applet/s nie vertrauen APPEXTSECunsignedAppletActionYes=Dieses Applet wurde besucht und zugelassen APPEXTSecunsignedAppletActionSandbox=Dieses Applet wurde besucht und zur Ausf\u00fchrung mit eingeschr\u00e4nkten Berechtigungen zugelassen APPEXTSECunsignedAppletActionNo=Dieses Applet wurde besucht und verweigert APPEXTSECControlPanelExtendedAppletSecurityTitle=Erweiterte Applet-Sicherheit APPEXTSECguiTableModelTableColumnDateOfAction=Aktionsdatum APPEXTSECguiTableModelTableColumnDocumentBase=Dokumentbasis APPEXTSECguiTableModelTableColumnCodeBase=Codebasis APPEXTSECguiTableModelTableColumnArchives=Archive APPEXTSECguiPanelAppletInfoHederPart1={0} {1} APPEXTSECguiPanelAppletInfoHederPart2={0} von {1} APPEXTSECguiPanelConfirmDeletionOf=Sollen die folgenden {0} Inhalte wirklich gel\u00f6scht werden? APPEXTSECguiPanelHelpButton=Hilfe APPEXTSECguiPanelSecurityLevel=Sicherheitsstufe APPEXTSECguiPanelGlobalBehaviourCaption=Einstellungen der globalen Verhaltensweise von Applets APPEXTSECguiPanelDeleteMenuSelected=markiert APPEXTSECguiPanelDeleteMenuAllA=alle zugelassenen (A) APPEXTSECguiPanelDeleteMenuAllN=alle verbotenen (N) APPEXTSECguiPanelDeleteMenuAlly=alle genehmigten (y) APPEXTSECguiPanelDeleteMenuAlln=alle abgelehnten (n) APPEXTSECguiPanelDeleteMenuAllAll=absolut alle APPEXTSECguiPanelDeleteButton=L\u00f6schen APPEXTSECguiPanelDeleteButtonToolTip=Durch dr\u00fccken der Entf-Taste w\u00e4hrend der Durchsicht der Tabelle wird der markierte Inhalt gel\u00f6scht APPEXTSECguiPanelTestUrlButton=Teste URL APPEXTSECguiPanelAddRowButton=Neue\u00a0Zeile\u00a0hinzuf\u00fcgen APPEXTSECguiPanelValidateTableButton=Tabelle\u00a0\u00fcberpr\u00fcfen APPEXTSECguiPanelAskeforeActionBox=Vor\u00a0Aktion\u00a0fragen APPEXTSECguiPanelShowRegExesBox=Regul\u00e4re\u00a0Ausdr\u00fccke\u00a0vollst\u00e4ndig\u00a0zeigen APPEXTSECguiPanelInverSelection=Markierung umkehren APPEXTSECguiPanelMoveRowUp=Zeile auf APPEXTSECguiPanelMoveRowDown=Zeile ab APPEXTSECguiPanelCustomDefs=Benutzerdefinitionen APPEXTSECguiPanelGlobalDefs=Systemdefinitionen APPEXTSECguiPanelDocTest=URL der Dokumentbasis eingeben APPEXTSECguiPanelCodeTest=URL der Codebasis eingeben APPEXTSECguiPanelNoMatch=Keine \u00dcbereinstimmung APPEXTSECguiPanelMatchingNote=HINWEIS: Nur die erste \u00dcbereinstimmung wird als Ergebnis gewertet. APPEXTSECguiPanelMatched=\u00dcbereinstimmung APPEXTSECguiPanelMatchingError=Fehler bei der Suche nach \u00dcbereinstimmungen: {0} APPEXTSECguiPanelCanNotValidate=Keine \u00dcberpr\u00fcfung m\u00f6glich; Die tempor\u00e4re Datei \u201e{0}\u201c kann nicht erstellt werden APPEXTSECguiPanelEmptyDoc=Alle Dokumentbasen m\u00fcssen ausgef\u00fcllt sein APPEXTSECguiPanelEmptyCode=Alle Codebasen m\u00fcssen ausgef\u00fcllt sein APPEXTSECguiPanelTableValid=Tabelle sieht g\u00fcltig aus APPEXTSECguiPanelTableInvalid=Ung\u00fcltig durch folgenden Fehler: {0} APPEXTSECguiPanelShowOnlyPermanent=Nur dauerhafte Eintr\u00e4ge zeigen APPEXTSECguiPanelShowOnlyTemporal=Nur vorher vorr\u00fcbergehend entschiedene Eintr\u00e4ge zeigen APPEXTSECguiPanelShowAll=Alle Eintr\u00e4ge zeigen APPEXTSECguiPanelShowOnlyPermanentA=Nur zugelassene dauerhafte Eintr\u00e4ge zeigen APPEXTSECguiPanelShowOnlyPermanentN=Nur verbotene dauerhafte Eintr\u00e4ge zeigen APPEXTSECguiPanelShowOnlyTemporalY=Nur vorher zugelassene Applet-Eintr\u00e4ge zeigen APPEXTSECguiPanelShowOnlyTemporalN=Nur vorher verweigerte Applet-Eintr\u00e4ge zeigen APPEXTSEChelpHomeDialogue=Dialog icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/itw_logo.png0000644000000000000000000000013213441742745024620 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/itw_logo.png0000644000175000002070000004125413441742745025436 0ustar00jvanekmock00000000000000‰PNG  IHDR,МЋPsBIT|dˆ pHYs з зB(›xtEXtSoftwarewww.inkscape.org›ю< IDATxœэнy|\eйџёЯ=“u&IЗPКQhiKK[Ж–­P*‹€,"ВŠˆ "** јЈ( BхёЧт†Ј€ ‚Вo-;”Жi)PшBї&9“4™sџўИ’L&™dfЮ$ѓ}П^ѓ‚œ9Ы•4™s{ЙnI› :‘, 4ЈІЙЙyШ'ТсjkmIл—жї§%%% сpИeгІMѕ@kСŠ %"в/TWWkmm …ЦћО?" ё}лЖџ7Цдƒ€h//БXзўВжЎ>4Ц,>0Ц|‡—oоМy}vО#‘ТЂ„@D JUUеpkэnРюОяO3ЦL&C­нrcЬ_­ЕзzžЗ2ш`DВE ˆ)RUUЕ—яћћћЛЃŽ)]ы1ŸkllќwаˆdƒЩЇЪh4zp˜Еv\PpL}бЬђ<яе щ+%"’Sеее;ЕЖЖeŒ98Ј :І,{нѓМ@<ш@DњB ˆd]UUеTkэ1жкc§‚Ž'.є<я– ƒщ %"’;„BЁ31Ї[k'Ož­---ДiгІ A"в[JDЄ/ЂбhєDпїЯ2Ц„‚((֘ыПt"НЅ„@D2V^^>! kŒ9Т™Д&`GЯѓVˆHo„ƒ@Dњ ‰DŽ.--Н1 §Т3›7@А/JŒ1%---ˆHoЈ…@DR GЃбSЌЕпІL‹дJ §‘ZDЄ'e‘Hфœввв?чУƒЈ(ЕжЖДЖЖ>t "™R ˆ$ EЃбг­Е?ЦL?ДоѓМБ@cаˆdB-"ђ‰H$2ЇДДєр`HЊ§%ЉЪвввZZZцˆH&дB "DЃб]­ЕЫ@`­]‹ХІ6шXDвUДs†Ejjj†F"‘›ЌЕ/+ШcЬNUUU‡H&дe RœL$9лї§E]P(W|п/immН7ш8DвЅ.‘"гVTшVcЬСAЧ2РХЪЪЪFmмИqcаˆЄCO"ХЃ$^‡пP2•[Жl95ш DвЅ‘"PQQ1> нЬ :–bbŒyКББQc3Є_PB 2РEЃб/Xkoj‚ŽЅљжкББXьЃ IE]"даЁCkЂбшнжклQ2”№й ƒI‡‘ЈККzrSSгѓжк“ƒŽЅиcєo §‚К D˜h4z†Еі t,€oŒнииИ*ш@DЖF-"G8ўвZ{J I82ш DRQa"‘ ЖЖЖј;pFаБHR----ї„ШжЈЫ@ЄŸЋЈЈи> =L:щбfЯѓj– щ‰К DњБh4Кk(z%…ЎІЊЊjџ ƒй%"§Teeхўжк'€AЧ"ЉљОPа1ˆl‘~(‰mŒyt,’cЬЇ‚ŽAdk”ˆє3•••Ÿю"AЧ"щГжю…ўЭЄ€)!щG*++O0Цќ( :ЩXy4н7ш DzЂ„@ЄŸˆD"ЧcўŒ’~ЫZ;;шDzЂ„@ЄˆD"GwЃd Пл+шDzЂ„@ЄРUVVю м”‹єйžA в%"ЌККzВ1цATŠx Ј­ЈЈt"Щ(!)P‘HdT<Ј :ЩcŒК Є )!)LИЉ…лˆdнюA ’Œ‘TYYy€6 cІƒH2JD L4§Ж1цє уœQB IЋŠЊЊЊƒ|пџ7Zš| ГƒзЏ_П9ш@D:S HˆD"Ѓ|пџ3J:‹ХІ„H"%"…ЁЄ­$ё№ ‘м …B“ƒŽA$‘‘‰DЎВжt’жZе"‚Ѓ„@$`•••ћп :Щ%Rˆ”ˆ+ …ю@уŠŠ1F %"ŠD"?БжN :Щ;%Rp4эP$ •••ћcžF‡щjЪƒ"[<ЯЋƒŽCЄZD‚QjŒљ Jвб\l:l*//t ")! @4Н˜t…ЮГиГ/0P7аP(4 Ощџ”ˆфYeeхXkэ•AЧQшЌЕw566ЮЖОt<9 „@ Š‘ќћ1 :ˆжdŒ9;‹Y[[kЌЕs€]+Ц%RPJ‚@Є˜D"‘РЉAЧQР–'466Ю№<яЇРи`CЪ%RPдB ’Gжкkбп]R֘ЇBЁаLЯѓцTUU} јRАQхд щL-"y‰DŽ :Žu[ccу—–ЖЏ#ОяпЦь*hg­­ :‘ЮєЄ"’?п :€dxžwЩбhє`ЧРЂЪcŒ)(j!Щƒh4z„ЕvVаq˜fkэcБиŸ:oЌЌЌмлZ{qPAх‹ЕvPа1ˆtІ„@$ЌЕjшjЃЕіиX,іLТіrcЬџQk;c”HAQB ’cћGYmŒ9ТѓМзпˆD"пІSоc4ѕT Š‘ …B_:†ђ~<?ЌЙЙyqтбhtkэЗƒ*жкп "§‹‘ЊЈЈи86ш8 ФkэСЭЭЭЫ“МWb­§Pšя TLпЋєše ’C֘/S§сЉcъЌЕХbБdЩбhєРŒ<‡4=IAАs|E @y$Y : cћОp,ћ(йћеее;Хуёз€Š<‡ДеžчЉZЁ ЕˆфHeeхБy2,лZ2пїчR|ЩЈ…@ Œ~!ErФ3WшЫФ пї?ндддS2@$9зZ{@>ƒ* ­A в™ZDr n tZ …kjjzЗЇЂбшрЇyŒЉаl :‘Ю”ˆф€яћ'SМ-pжкЃоNБп/)ю~”HAQB ’Ч@@ZSbБиK[л)‰m­=9O1*%RPŠѕ F$gЊЋЋ‡ХуёйAЧ‹<ЯћgŠ}Њ€›ђLЫ8!X ЛЇ˜f!da)№o O†њь‡(ХD H–љО4ХљЗѕcЯѓцІк)ўЕvћ|TрМtwЌƒrрзЮŒmло6oќЫЖдС3СП&Р[YV<е!ЩВh4њGkэЉAЧ‘gѓ<я$мrЦ=ŠD"3PБ&€‡<Я;:еNЬbИзРg28їrћpп xє Эh4h H–Yk‹bqžNо№<я,R$ИV“Й(РZЛ!§Уч3LЖГpžŽ‚хupнBиЅaJQB ’}ХTЃ~яћŸRэXYYљ`їм‡д?cвJ |­Oз. Сы‹сЕEpщ2P…DщF Hі- :€<‰‡BЁ“›ššоKЕc$iŒљAbъOR& Ёšь&QЛИЎ–/†—РV]ЧвF Hі=tyђƒ†††'вйбsP“лpњ—4Л jЩЭ Л8к‡-зСо†В\Gњ%"Yцyо]@њkэуžч]“ЮОUUUс ЫtЌJЕCifЋX˜nріRј`\§Жжп(ZJDВЏ јА9ш@rdU(:№гиЗЬї§_ч: ўШZћaЊ}ZђћН­ЋJсНEp§R›ЧkKPB ’žчЭ3ЦЬ^:–,ѓ1g466ЎNgчh4z)0%Ч1ѕWЫSэfFFЕKтАd1мК†ƒ@ƒIDrЫDЃбC}п?, BжкM@‹ЕvГ1ІЩГжжЗmлhŒйbŒiє}ПбГ%o …B-eeeѕ›6mŠсZ : 4hа–-[ЂЁPhЈ1fX<пжГ30˜ ŒЩвїѓCЯѓЎJgЧЪЪЪБ֘@4KзH|Яѓ*IQ­АІкр‹ m4№“ Иq;ˆ‹ф‘ЯD"‘Р РYРШоœФZћD,ћ4OgџH$ђwŠwM‡TVyž—ђпaьoрщ|”†+'Т&Эпщ_дe 2№YЯѓц{žw…чyуŒ1_оЬ№cN#§dрH” lMЪюлц: Œ~WЏ-†”ЅџQB R\šoї0#!eƒмXп•СвЮR8 5!ЈЂїS•€Ц,ЦRЄN ГЫАa%я§э^fљ=ї.еБyгаДhЩc€R`ЊЊЊvі}џuђP]ЏŸkёЏ1JA‰D"‡G?№Ічy)—"Ўƒmџ](Ы~Н.›Љ…~Ѓ3љ+г€QН<О:‹БЋXђ+™‚я­A$ЩвЇК|LsУ 6­ъ:Ї52J“LsmЊ‡цNу7@<^lЬiЄп“4o~’зярУзљ0 Ј(>v№”яNdIx72я™iЕАА™hмящ0’yYg3ьЃLq>ЩРаЁCkšššЎ :Ž~$цy^Ъ*‘uPnћЯь‚tрВбАї8egHЗШ•фQ!%ЋOѓ—Џ§Ь!]о9ћ.˜|Hї#žМџeЧз­ЭрЗмŒX(йq>n|РёРM}8Я{!8віbˆ“ ќЫ@eт{Ю1i6Сv2xˆFHКbБи™Ц˜ЁAЧбМF Ќ{™Yьgv Ь[ЧMvS*Ѕ€RBрЋйДъЛРмzђNKsђ#šъaSЗDГи“‹гКЖџіѕgкZ+wэEB№2 Ж=З,Ќ™сгЦk0Д5dƒ1&IІ.=Бж>™Ю~Яu,‚ЇлЦќ1ш`ЄC!%э^nтЦ\Ржk,ўмщыЇršˆ$шэl Ђ …OsзОxP№ћХ0~"\czб•(йWˆ РmЏбРЄN~ћD$‰ЭAа4566І,жГЖѓaз|0ќЯ˜8ЮUН‚рiq#щ‹LЧo-kэГ@,е~Оk(š- gжР_—'#$љЅ„@Dz-пŽжБHK(z,Э]OШi …iNќћ}t ХL ˆєZsssЕіњ ушЌЕІкgЋњypТ)8іk†џжбStЩЕBC Ч#Цѕ3Џm-AрУЧРкърЛЉ`вKБXьŠH$В+*]М5я{žїjЊJс с|”m–Ќєsьjс?Kр юяTђH A‡НH?3]DійЈMcПЕYКfЛ)РјоkФ-kмЇЊb3сQмЋ`ьсІЕ^“‹sПS[aъї„Їƒ=§l‚Ю щМ9>ШђeZЫЫЫOnnn~и9ЫчŒ1ї’ояТщЙŽ%WВ8шašO,ƒƒЧСЊьVRQBрКMjŸ`BPU Ц@Slщ6uў_тњN{U}ї0 јp€ЛnЊ†ѕtн“qХtВЕДѓрbрBBaˆЖ_ЗЖxK#puъГtЭe!TЗ$,MЛ.ЮС‚ypФ›ZEu0еТЬ|ФгLiqнLt МфЦИyдгy!‘СЃр’ЧсЛЏР~g';ц"ррA\юо›ZЙї'[†Œ†o<сЎЛя™‰ћп tлиЗŸ`шіpйSюКћ|О§§эq5^љd?щЂОе Џt~Y8Ѕээ‰!xЁѓ{%№чПфЈ98 W$ЦвьўэОпy?›dПRјl6bhnn^jŒЙ4ч`V755=—j'Оœ`њ‘Щг@Уќ)ц‚3€“ˆАЯ‰йnŸr"m-їeиv"””УТ”Ow=r]] џ]Уы ЦUкjС=uЅГšз™Р‰T ‹Аї иnпR"У:Ў;|„KсS_ЉGtЕb~- ўѓ?{Ў2п7ШМЕ`р›œtУОl3О €ђ(l3о]ї ‹aкQр~7FrпwaХ[M^k@šc-м€ћљLЇчТ<Ѕ‰яљP5ючZ”nйўел8цСЁРWкП6Ў[ "Aƒл^ŸС7цСgCАt†kсш5Яѓn‹D"Ч1№ ыdт>RЬФXеЦ}&IWЛ4У?п†УІBCаС tХšœœ_1b‡й5ГN`Э”АУЇAE’‡§‘SмЋГЭСЖ“`л]"Мѓє‘Ќ~ЖдЇ|Р=iŸЧШїgж`Ъ0|g(ЏщОчЈнЋн˜ЩPй™–иЮ,{e ™џл œŽšГЭьуYПлlЉœфКSнЋ]уzxzюTо}>УЫ <ЏРЎО[лс3&љ“ўm>ьМС‡s Œ0ЎђцБmo…чAщž№^†3жl}Yщпј(й>ьбљX Л7˜kхЫАЩТмLЫAw9Пя_ …AkEрћ~ЪђМa8УКпщnпИЧТ1FS\sЊи‚ `6pIљЖлЯЈоћ3T~1†эАэŸя›VТћ/w?ВЌ&Ь†’2Ј SGУјa№н№Фѕ№ёТЩРИfкD`jF_ЪбЛБЧёpих]їиИ>H8tаHиОmСГa“`зу]?ks„u‡пђ8щїIЦ QŸ эr•GƒpйXJйB9žKНЁЁJJеЃ hœuq‡–&hЮIїwС{ f…`ˆ…C€/' žZМ`сч3н€гOЬ‡j`'`;КVŸ;к@йKАq/xšь >ќx зюuЩvšяfДwюOG‹СH W[и4ўолС‡MMMяG"‘ы+zsќ@bŒYмддєєжіБЊsуyЄŽЈs­WзЫ@Vl С6Р)‹д™}х‡^ФћьаёnS=МѓXџяЬФх“Ы2v—= CЦ@ИэЧVY‡œoо/< ЈТ тJД-№'ЦЮЪAТДƒКОлT qЧ7uйОћ œ~Ы`7а0Е;СЇ@Yщ(ўёГЛ‰mў,[b“Кы`UУЃьz,-ЇпТВNoDZ70Ђљ-ъZујK—Т’:ˆF)йЖо+п…и>g`ЪЪсЁЋŠЈ~Zу>„f%оБ-l6юЦљѕžŽ —ЬƒЯј]—]>4Ѓ_ƒУZсу,”n}t&œ—jЇЮ3?цУУИ$љ“С‘Цu‰„_€пюгЫвФ‘Hф'žч ŒшЭёШџ‘"й[ьZœІlmрђЗс—S dњђ@Tl ГпчјxЇу0Ў%ЗУ7СуПќpnТЧрmœЫƒзУa_Q“zwн§OƒіэО§?П‚џўъ1мBN–ЬT,Л•ьзЮшO№GrЃ˜ZFRQs(\уіы@шm„ЇчТлџže/Юц'9v%qяоИ р+  уі€Ё;Іu]п”~клљ3ФЃZO[›aэ;№ёт;Yіќo$XСІ•ї№цƒCЈнў|fž:ž ћAИ эГ/юи™ЅЯЭшскQр(ЦLЌaXТєХЯУkџ€7њx Чш?|ghSyељTŒšХ!sŠjiЛЈn…c€ВФї <Г;М—ЩљJau ќаТљI>иЮ}т{$џ§KЩТ{Зeш…-Œ6ГЅ—Є\хѓіЗЅкСРзђШ@a4г ЇŠЅ…`'†ŒžЩ„НсШяИЉ}эМ№ШЯ`й‹ПЧUцKхХŠж†КШ†wгЙюd*†ЬˆWeЕХЪ;оiЎ‡y€кmюdыM`€Ÿђп›оeiћn%Риї|иqП”ADЧŽЅlшаЎ?ыW. u3ѕ,їЫ‚hЭЮ 0ІЄћЈ‰ЭђнПKFvuуў'q&B›s§ žЬј`ћ+яgOЛ™№ЯPђЄpь|7шАзТс№M@s_ЮбO-№:QМХЕ,”tJ,ТЅPRYAkЌ–ЎU+ tJJЬЖcЦБyШАЎmЗ­Э0xТяј№Хtњxы …7вLI…›щ0Р•ИІм›З[јРРqAЏнž’аЦUЊєд•R}}§кh4њwkэЉй‹Ќ№cЎ%Х`ТfЂѓS‚ЄАy"]ЦDK–K Ar џ7Л‚–ІC€Д'к/јћ5|јbЪJЄNu5L˜сNгж?Zмф’L|ќ|”Аќќ№i0zЯУqХO:—Œ=ŒђŠћиiNє§шLж“аB№СгА0Эя~СјщпeщЃрїii)B֘пCž}дии˜Ві@YђБвoН6Ш@W< Aеpис@uzR/ЕЛФйfяUdаЌйъm"оœ^‘РhM5cwм‘PЈSBак­­Ћ(‹œJ§ОУт[и6žfИ B%•ИЉн+‰ о–#.Х‡УOЌЃгк­i—ЏпЬ3иPњФ-Œ‹/ЂЂoeяЅg_š?чЃ744щ_Є? ћNп–=лМ!ЁыКК†єPъЛЄ Ж›•Z›`хЋP5є ъŠЮђ7}Д€AўJњЖbС{й5•—Ћѓ[ИЭТМ$oэbaЗ\]7@жZћЇ ƒШ“ЭeeeЗІЛГq3Ÿ$=[-№$}W cЮ }5СDБАВWƒхўУтЇšXќTч•ююўкщыНžЇ!ј-о8щЏGА~ƒ-]Esз‚ŠсУ1ЃFKул(e хБh˜џ{Јні2ш&)&Ž$‡ Сž№ѓ]UЫЌN7KВдqк|и%—#CТс№ŸуёјU9МDЁИ~У† i ŠТЕ nA,&к:[т[“*†„ WžcыгД~HO#ˆC! >‚pшn*г/_Њє1ЃGw)ц=Ќve#ЖMiSE’9фU40Ъ{Ž5k IDATwЛП)[Ћ(%>ŒxГевš–Mю‹ЗaЈЅ‰Kg"зУDыыыF"‘З€i9ОTжD"‘ы=/§ЁЃРЋƒУЌ›х1[‡Вeб8Xt‚ дTУЎ3aчid2Ffјиq”NљЏсVC”ьлБmYуОъэВйнФмJ›Л“Х$#GўЪNЌЕ?\Лvm}ІЧM„п†НKсlр4мЯЈhj+нєиъ` ЬКš#ƒ€J џї 7ўtХ 8‚НN‡CЈџБЯ™4tяГ=~чсеЃ`Jц5`6VT*ЉJgзЊF aььЎc&$К-k”a\Ўf‘|Эј›+•œ’‡ш^л:‹ЌЕcЎЮх5Д,‹ЭээСmѕљoi{ѕк" œ‚ ,єВЦzсБЎо†фXq$#&УT9…–fu›А^QbHYЗтwiˆ›дщaС'Ф†dї‚вЈ[•Qk Hѓ`wгЖ3Zќ­kVН5фšžœ‘Мf7/Уˆ\ЯчŠХbѓ"‘Шм"cŠЕі;ДшЮBи) Ч[87.Х АЙy e№Ÿ ƒ(Х‘Є‚&B4тэВНdуr"<”•kЌc?P­Ž<љdЉу\1iœL3p№Ѕ„З>0pп јAЮзі1 Р"EЯХbБn3ŒrХ‚Y3:%S ё;‹m‘о(Ž„ ЙМ щaz^Ž nZN…З˜#гhЅ„іЙ†%Џб№лKZщZYАЏжt9—пъІJ6=>Оt.Оœф­Ggxm|kэуР@JZBЁаф8Г^†рИ:8.л №$рю:†bQ С“7CУZ83хZ#Yѕёяfp§Fvќќ5,aBзес#м|ї joUшаДљCXђФЏ„"YP _8~6ЇоБŸАж^заа№V.Ю]хNЈƒ9!–‹ы8%yS AS=xыѓ~YПЉплHiђВїqм2ЧйJ:Л7ДЦОйycUЌ<ƒЮ§ ЦпТв›5!CЯ‡ысвƒІ:г|ИW'!бЭqшѕ Ж|ЉЏЏ_4€ЦМ‹Х~”Э.ƒŠV8䇓,Ь!‹ГQњЉћ'RT‹ЌЊ8‚žT†‘{@ƒѕ ѓxн!0r†ылж˜ЏLНC’Сd-”БЉ|4eгOФu_(!ШаX Uч~к~,``\’э}Yў8Ÿ,Ў жœ Щ‚‹HПАX–Ce|ꇓZ\AЌъП|Xz,мt ХЄ‚q'v{'\‘m дк›„`]W[,MИюx`‰*†РЈЖC_Ю8!‰Ћrзй вЌѓЇ„UŒ„G~ЖnЩмДжq.&о6№*“+ѓшџ Сžч§ГЗПCšрX'Ц\Г %нЌ^џ:ˆbR Се@ј^ЗwМЕ№СSа’ёb=UD†MIiЧ пП††5?6ЖmЙ(Е„ОнšНsp Ё№\ЂУ:–!Жі>ъ?>L)О§№qгЄzUйn лцЮw‹]нžЫы<чV™шRЊВbћ ќ&в7‚ /Œ1‹П’щq‹ зpb3l 7s‹ЩAuЭЋbHzV= Іœ[ТА№ЮLŽМˆI^ЮЉПюиђяŸ_Ьc7l\аyЧЭTгШт‰Ћ іЮз€KВ\ќTЖu/Оѕасмuо}РQ ќ›Щ€Qsš]aЁO”РŸр}9ОяП ѕлњ-ОяŸ 4Є{@ŒБ№3\iщ‚§ЬЕижяУo‚ЂиєлПЪŒ5Ќ†їž„xЇк!Ё&р§с,ЙћїИвЏщИ8›Ph(ƒGёЩ+\V MмйЎZFыS†–NХnЋЊ`д№myыvЭрЛЈ†–„|Ц ŠQ9x0ДжУЦЅЩ–?†–=оК .‘дY ћ–Бёnh"1ЭZшГ—сОЋz8 eс!W†x@kjjzŸ~šИZk/Хb/ІЛьa]їгЉp2• <4™Ф%Z$зŠ'!Xѓ.<{Дtš›?x L=2BИф`xšgк—Q“'1~fЧ–ю‚%Я$п{§{№ъ_ЁЕ#!ЈЈЉaјИБQуF‹зfє}Œм{№з№J‡КV‡?€ kпnЄkёŽЗhmО‘ЇnkfУt{ 6 FЬ MSЉнa†Пя™lз&NŸBюCќfK—ЕЄ0юїфћЏУ˜ОœпКеЛŒQ0№Ц§c``_Y`qаAєТ?cБи/гнy ЖpХ9]АOBpSа1ЃbIБqе|оxжϞ٘’!cЈžv ІЄ<ГГэИ7L;Муыю‚ЅЯ&йПІ/ГъUиј^Чu+ЋЉГ fњ‘АЫ1щ^uoЊЊvdТžФО”еЅ;А…r—Ќќ№-рWИ~яvoгАўF^}Ј™ЅOСц•]Я6lдŒ˜Bъ–‘}€ё  ㆹРOі€зKмZ‰“ц‡пУvYОф3ж ђм*Яя%ykњ Н\њxLѓ{ylocњл`жeсpј,2(@дп%ћП'Х`бŽ№HаAЃbI~ќ˜-,Иън*š >“ЌRюРжрІ‘юc“ŒŠЗ№;'їцМхnіТI} /™уB№'›Awp мeрФФВU֘ўв?мjŒ9ЅЁЁaA&…сGИ%Œ%3…T{ 0…иў{%ѓћ+H]ЉkoК–Жќ=pO’§žЧкsˆmО—nЎЁьјOгЊ€A#aЯЯ У]ШЂg>є*ЅЅЦŒ™Шž–1э3nлм MЏўжC|MДФVгГпћ Zm€=NЦ•1€QGŸ]л<ИьЫыžНџАŽ˜9Їtи^GP2z,Ћ[м`a:Аї€KТА(ƒаnС§л^œА=j`ЏWрОрВ} .ЩБЬƒёЎГА/[oЁЪ•U\Г7Ооии˜Qѓѕ˜сЌѕђщЛv}JRBP \РžAѕ№ЎE„†wЏ)РNCЈd$эENжзСŠ…UМїŠW[ќFн3чГ%>ѕы`ц)юнЩ‡Aй )L^УЪЈ Fu…eэфуБУЇБЅy9сeZјƒтgБІДЃл"\5˜mŽ<›ѕ­UћЕ;Јyхк5OоГбпвt+№AŠи>1І8!qЛл(эсАГ_†nIœџк^Jїк[3ž™7hСЭ#o7нТ_Ц­?†лvskT|bœj€шЛ™ ŸЁ­eЮТЋцЮ€ћ3i" oЮƒз{hdaN Ќ~nM\ўx>m`Ія \Е/ќ kри$чљ2\•АmХ јmКё&c­]cLkO`ŒЙБББ1ЃСmLќœbk}ЭŽ >мtХЌ‚р›L?f8гJяˆЩЛWЛК‡рё›ц=6в=!7ещZжЌ‰ВцЇБ~ЭDЊjaТl6бН6Џ†њЁЉmfдŽћС‘пщ8ЫЦUАі=XWчOЉњ7тц!WГ№ЅЯбZ6ш˜8›ѕсa ›rхƒЧУчм“Ппі4?a8тлŸœЄ>ЖжЌƒ kYЕъjwПž^NЇШЫЬћS MѕT йƒ ЛAxP•C ŸMхјq„ TRB=•ЌЧѕV„Ј_М–МAВЁ—ЁЊЁDŽќTRЩzjW§ЗvЭSНx˜ ЛX7­3qћжŽ9;йдРzВ”ь џz Жb`6mјvГmГZЁ~~ї'§Ы,LNrЪ7 м>г=эgЬИю лОмœАЫy>l™поеЦКrЛGvњ™>m\ВГэ!!Hќ7Б0Ÿ>&ОяЏ ‡ГR›#'ЌЕє<явL[ чјTB*7LюМ@›ф]!%NМт-ющ0+ЎšxїљЫЙ§Ќ!|ѕиfG(mЛхеl чў1љ‘ысѕСsw6ёоoŸЃЃ:a*пb,yц›мёХС|эQЈн %C0#їcїOrˆЅ„Vт„БЋо€wžˆБ|Хln<™%Шd.їяxѓСuЌ~§З|ѕЦa ™ЂФ?kЁŒeŒџdЧЊi Кућ}уQxуписciЅ„0qJкlВ>РЕ”аBШoЁЅЕu@ к ŸчКCЕPf\ЋVчціTU[€um`Ў›щіЪLxїbьeмZЩЦЙєŠ3qнa™XX3­[+яъыы u|ЩНgа‹’ЙaИю-5’зЈu x…д‰Wؘ)?"ВЭL*zБъgуЧаАцїЌ~ї—ИfЭTF{0хгWSZЙб*9Ђы^ АЊm дЧя^ХЊЗ_Х-]œЮ5’EћРЩћaE‰н-„W:ЦŒіІд†BЋVPEZ6мЮЛ/ќš$+f Р”У~Biљ.UUU 1‚хtzЈЏЏ‡еЋнџЏЎћ.ЋО Р бЃй~ыЃ4V–є№yйвВЏЁсCV,ўё-сšюгђŒŽw_ИЉWZс­Нs\щlL %YyА'qиМ—›Й‘ѕі“`—R73$-6эсb`>Œ5щWЭм8Уu•ѕEi$щ63`џђ<яxz1Јm1|ј]іC* ЫKaвИ~>y (Є„ нi$[™0}џЁwVЇЈЊšBuѕ)]оiiYРкЕэOƒw‘н?[q*с№IджB{ї-[оfнКЮO’џвlЪHщL`\UUеДЪъъЯЎЅг]jЫ–7YЗЎ}жФэtЬŠ[Ћ!еЂ,kЙ@KЧЄˆE"‘8…гJyПчyЇа‹dр˜vK:1[Ѓп3pюDјП уТL‚Ж/pEТЖgщ^t(ліО•АэрЇ9Оюlрђ„mOтFJ‹фJI$)”„ёfЯѓОJ†cР•'nqЫ9w_ц\вёкD˜™Є"Ј@ ˆф]mmmЕчyA/pdzžwu/еЙ(iз—nœдЉыJ‚UxГ DdРkjj zЩЬfkэcБиŸz{‚:7[IЩ@янЃd А(!‘МГжnрхз‡BЁžшэ У—pгˆЅwbёю]•0%"’wжк>-нѓ}п?йѓМ^Я@Љƒ“­–чэ?™’|еN PЁŒ№‘тВCžЏg17xž7ЋЉЉЉзЩРB8иТшГГ/‘ћСвв j!‘ ЬHНKжlЖжžыy^ŸŠAеСaўIЋxKzќœ=A $%"„Œжёюƒ}п?Е/­u№ FKї‰…[&dЏ–Šd™šНD$ЏЪЫЫ'гr|™˜1цлžчэ—…dры–7W2а7†р;Љw“ Ј…@DђЊЄЄфDksКње#ОяЉЉЉщНОœЄm)уяZј!ЊйвWжР9нŠГR ”HЁкW*9 ШёК’=жкrtъЕ֘Kяъы‰^‡hќ?рЄ,ФUє м4БmuN)\JЄP]ь“Аm(ЩзQј:№ЫœG$йВM–Яз ќ. }ЏЁЁaM_OVc€{-Ьь{h,Œv/Ы.H Њsщ~ѓПи+€X$Лв^3 ї†Ус+ъыыfуd‹р(ыєЪvвRЌZ,œ9 М ‘д”HЁZ—d[Ё-—+НѓpxЯёŒЕіђX,і|6Z-№3р+hМ@6§`'Зј“єše "ye­§НOю^>уyоьl%яРєЖ /FЩ@жXxx"ќoаqHњ”HБ ніp,E)‹}hŒљ^‡XрacЬЁžчэюyо?ВЧ|(­ƒo…]2ыiХцCрѓќ ‘єЉЫ Лr`pŽуšЛгW5„ŽОђО›Ž&`Sћ' УH§•щї‘Ka ЖгзЧПjћџcщоœЙhЩC\E­ББёкH$2И‚žŸš?†BЁыоЪцѕТ~!˜kaчlžw АєЉЉЄеТЉ;СкЌ$yЁ„ ЛƒлњpќћРQРЦ4їџ 0ЛгБGў\н[§2ˆэ~рЫьŸh{рa šbП%Р‘Ц@ЂёИ˜л‹Ъt^vїwtПљЯ^ЮC\EЯѓМяUVV>lŒЙ8ˆДНЕИјЕчy+ГyЭ:7X№ы­Њ{ }љСXјжN№Lж‚‘МQBа]0ЊЧ7‘опгЖР ИЄ}Dѓ \yдяЏЇqŽadkošШLoћџ(0ŽдП7еР_p-OрОз|љ_:žќЊq‰L8Щ~ЩF’п€\і`nB“ЮbБи3И›Gi$йІЂЂЂa§њѕY/^Г*›рkж§mеdћќђ‰?LЪяпКd‘‚юоЎNиЖ3prТЖИ›^Ђ @,ыDpOбЛ'ЂmлЎK'PррЉ$лХЕЌЧЕ"Д/$’NГыЁРЌN_ŸNї•щnЇчЅKЇ'тњшлэ@зсG€вˆ%]Gаѕчx06Щ~џ^Lиv$]ыъЯp Ф§YŒQЖЎХѓМž—нF% Ё%pZ Ў!љя„dЯ‹ЅpЎ)ŒЎBщ%н-~АэDК'€Їл^™і9ФЕ єєѓпWyянчЙГ‡cлŸшзуž–ыгŒkрKР л$Фr='вu5И]к^эЦрZR^K3ЎTŽh{%њ0сsіY ЌСЕ$ьKŽJщј7ж\?cС,cъмпђюAЧSVX8qœћЛ–~J}hщ9WЦt]gf,Ун,гFUœŠЛ9mЭџрnМщl№ї7м-†Л†{тMчи{щк:.Љј.pKšq$КјнjўИЬ=ћоRY‡KвюОšцЙwТ5EЧ@Э…ИŸп*4аА_hk8бТ•hц@ОxfO„W‚DњF Az*pOИгЕОїtљ9’7н'ѓр2Rзщп ќ їФžŽ€‡pƒшЪqЭнчЗХ—ъ w|лБ;а}­їЯтОяЦ4уHTœIЧШўv0W &нЇŠt‚у€—pIQКƒ;Kpc ўAGЩкмЯO мrЈŒЙпГKpЩфG8yќ=ш@ЄяT‡ =MР›ИОщW;m/С5џ'оDЗІ†ЎЩРїqOЫЩіЫd`ИS,ЗуVhћ˜дЩРўИжŠіD"бZzŸ €KlюХЭnш<Ж" '{Iщp7ю9ИФa%щ'р’Л•ИJ{ЗB)ЎХрмЬ)0K`ј"И:цfшм‚’|ЛHЩРРЁ1щ‹сž”/IђочqOМЯІ8ЧчщxТн€№їрyм;qeЕЉИъisщ˜ЬT\k@ћдКЄп|77хЋ'gŸJѓ\[SKї‘ўЕИюˆЙР}8їУИŸeтј€оxз­ЧЕ4€hxwЮ-YВfјpОяŠпTІ>Brрћ“мп J2ї"nънФNл>ЛФH~#ŽрKн€И&њсžО—сnјУp7ŸвЖуІпVуž€“ѕЗOЦ5•Жї•?›Ч-geё\‰к‚Gш{Bp_V"ъ8пЖt$Rо†Ё%pЊ/љД_MrŸ_2€(!Шм•И'н+ЖŸ…ЛС}‘юUњЖХhя*x8/сјgpХR^ЁыМQИЇгO'‰ч‹ИЅ‚[лЎћMRЗTЄЃ§|љaЏE‹$ЉePб Чјp†qГ?2ЉЬ)ЙёЧ‰nЩq`”dз!ИAi™T*Ь–хmзM5U1]эгВиЩV6”"e!Дf8ЉХлЉешч‚qЯG№…IZЃ`@RBа;wсd~;a{%Ў5 ѓчз,м\шЊЖЏя ћˆћvЋqSџзЕайq яэДэшЈЧ ŠЫжгv{%Хo‘^AЃ Е—Ё§E–ЮwnJdЛЫfщмвƒ%0ЭТiupКQЁ‚cрюсŒƒ\ыЁ @Jzg!Ў(Pp]5 СнDчтЦœkюЇэ˜пвѓ6з§$яЭТнЄТИЎƒѓqUЧсnиsЩnQ*\ СЯВxNp]+лЗ§џZм ЄО~РLk;я ЖЏ‡k1щГsшZЬцzЎЬ(}PS}8ЩРЩ>L :щб_• |Jzямщ™$OpЕ :ЯИ“єњї_РншwLи~(.  |wг~ЇэМ=Е:ЄВј/nаci’їїХн\ћв1šŽoрnртж “™]л^рЋmзHgMшЈTx7ІЭИd`CтрПP2>eсxЧYЅю€ТІ–тЁПХОпУн.]œш7сbгБP™ `*Lд7+qkЄZЈчЃЖ§жйš_тZђс}р\хРdОŽ[І7.ЅћєЄыq OЎ›Ебўњ\’}Ойіо_шšд=€[ПBЩ@,ƒuЎ‹ыQыZг” фX“+'С—• ЕdЧ>ИЇљЯ&yяYр*\iуLo.'‘|EХ•Иm#Ўi<[ufсj!Hїq вЛZхSщкѕёмї”Њ тЧmЧvЖ_[|‰nУЭюиз’бгдД7q5:›†k!щl.№ВЗјRQЊƒы’e ш_т.мЩw’"Ђ1йёАЄ‡їV’М~@:оnЄkBp‰РПш]ўж<зіпeИ›ъљt<5i{ѕжZміЄW„h?\ЋE:оТ=бзтЦptўНо7№ГЗ фєnG;ЗХзŠћй*ш#ыZ†” є/žг&iщяЂЄ„ {тЩ%ъЫЂ8 €ŸрІF;m_InјМещК‘NлЃИJŠЉ~op§§›?ФM“Lw&ФsИБщhъ_KїЎэpk<Є*hѓ>njЇКВрuїЛrnаqHF>0pМV-,^ъ2LŒЧ ЂŒІиЏ8‚юјЄHдЙ™џ :Iлг!јьзR&EJ-’‰їqЃќS%’­t]йPŠŒM>жC г­-№еЉ*!^є”H&тРЊ ƒТgaЕš ^№u­X(эє7+"YЗ *Z\)юš c‘ЄоŽУЉSмЬ@uD$ЦЙЇЯоVЯ”мњM%ьЉd@Љ…@DrЂЪлю›ыeЙBп@ДЮР95ЅPz Щ‰‰аьУс~Ÿы)иЊПЕТt%В5њ‘œ[ћј™qе0%>2p‘I‡Щ›Хp‚џЕ0)шX8пИђлWLLПР—9%"’WѓЁtœgнУƒŽgzбР%сљ ‘ўE ˆb!T‡мj“—’КњЅЄЖдРруЦXŠdD ˆj) ŠУYРхРЈ€Ущжј№‹‰аt0в)!‘‚А*c№мвл‚ŽЇXgсзe№‹qА1ш`ЄџSB "ХBh mс;фЉ†Ab]љ№[Kр†ГПК1%"RАУЮ5шђžќIDATpg№Ж…kыс3ЕLЗф€)xЫЁВ ŽБp&p$:Іќi2дŒ%"в/Y0K`7Ž0Ўе`_њя’ю­Р3Р?CpпXt@R|”ˆШ€№:D#pА…cp ТvAЧ”B#nёЇJрўёnЙh‘Р(!‘Ї­ѕ` 0УТ мk7 * тР;^^№сХЩАРИэ"A ˆ с%А.IиХТXуZЖFе_cРЛРR Kw-,цi,€:%"RєцCiF‡`ЛŒ№!b Ј4P”[ˆирCа‚FыŠећА|2Ќђћ ШџўeјЬeЮIENDЎB`‚icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/Messages.properties0000644000000000000000000000013213441742745026154 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/Messages.properties0000644000175000002070000025040013441742745026765 0ustar00jvanekmock00000000000000# Default (English) UI messages for netx # # All messages are formatted using Java's MessageFormat class. # Apostrophe characters ' need to be escaped by using two: '' # Curly brackets need to be escaped by surrounding them with single apostrophes '{' '{hello}' # # L=Launcher, B=Boot, P=Parser, C=cache S=security # # General NullParameter=Null parameter ButAllow=Allow ButBrowse=Browse... ButCancel=\ Cancel\ ButClose=Close ButAdvancedOptions=Advanced Options ButLunchFullItwSettings=Launch full settings ButCopy=Copy to Clipboard ButMoreInformation=More Information... ButOk=OK ButProceed=Proceed ButRun=Run ButSandbox=Sandbox ButApply=Apply ButDone=Done ButShowDetails=Show Details ButHideDetails=Hide Details ButYes=Yes ButNo=No BUTControlledBy=Controlled by {0} BUTmodified=modified BUTback=Back BUTforward=Forward BUTreload=Reload ITWdocsMissingAuthors=See authors file HEADLESS_MISSCONFIGURED=Headless check failed. You are forced to run without any graphics. IcedTea-Web can run like this, but your app probably not. This is likely bug in your system. CertWarnRunTip=Trust this applet and run with full permissions CertWarnSandboxTip=Do not trust this applet and run with restricted permissions CertWarnCancelTip=Do not run this applet CertWarnPolicyTip=Advanced sandbox settings CertWarnPolicyEditorItem=Launch PolicyEditor CertWarnHTTPSAcceptTip=Accept this certificate and trust the HTTPS connection CertWarnHTTPSRejectTip=Do not accept this certificate and do not establish the HTTPS connection AFileOnTheMachine=a file on the machine AlwaysAllowAction=Always allow this action AlwaysForbidAction=Always forbid this action Usage=Usage: Error=Error Warning=Warning Continue=Do you want to continue? Field=Field From=From Name=Name Password=Password: Publisher=Publisher Unknown= Username=Username: Value=Value Version=Version # about dialogue AboutDialogueTabAbout=About AboutDialogueTabAuthors=Authors AboutDialogueTabChangelog=Changelog AboutDialogueTabNews=News AboutDialogueTabGPLv2=GPLv2 # version check minidialogue JREversionDontMatch=Warning - your JRE - {0} - does not match requested JRE - {1} JREContinueDialogSentence2=Do you want to continue running? JREContinueDialogSentenceTitle=Incompatible JRE # missing permissions dialogue MissingPermissionsMainTitle=Application {0} \ from {1} is missing the permissions attribute. \ Applications without this attribute should not be trusted. Do you wish to allow this application to run? MissingPermissionsInfo=For more information you can visit:
    \ \ JAR File Manifest Attributes
    \ and
    \ Preventing the repurposing of Applications # missing Application-Library-Allowable-Codebase dialogue ALACAMissingMainTitle=The application {0} \ from {1} uses resources from the following remote locations: \ {2} \ Be very careful when application is loading from different space then you expect. Are you sure you want to run this application? ALACAMissingInfo=For more information see:
    \ \ JAR File Manifest Attributes
    \ and
    \ Preventing the Repurposing of an Application # matching Application-Library-Allowable-Codebase dialogue ALACAMatchingMainTitle=The application {0} \ from {1} uses resources from the following remote locations:
    {2}
    \ They look ok. Are you sure you want to run this application? ALACAMatchingInfo=For more information you can visit:
    \ \ JAR File Manifest Attributes
    \ and
    \ Preventing the Repurposing of an Application MACDisabledMessage=Manifest attribute checks are disabled. MACCheckSkipped=check on {0} skipped because property of deployment.manifest.attributes.check \ was not set to ALL or includes {1} in the combination of options # LS - Severity LSMinor=Minor LSFatal=Fatal # LC - Category LCSystem=System Error LCExternalLaunch=External Launch Error LCFileFormat=File Format Error LCReadError=Read Error LCClient=Application Error LCLaunching=Launch Error LCNotSupported=Unsupported Feature LCInit=Initialization Error LAllThreadGroup=All JNLP applications LNullUpdatePolicy=Update policy cannot be null. LThreadInterrupted=Thread interrupted while waiting for file to launch. LThreadInterruptedInfo=This can lead to deadlock or yield other damage during execution. Please restart your application/browser. LCouldNotLaunch=Could not launch JNLP file. LCouldNotLaunchInfo=The application has not been initialized, for more information execute javaws/browser from the command line and send a bug report. LCantRead=Could not read or parse the JNLP file. LCantReadInfo=You can try to download this file manually and send it as bug report to IcedTea-Web team. LNullLocation=Could not determine .jnlp file location. LNullLocationInfo=An attempt was made to launch a JNLP file in another JVM, but the file could not be located. In order to launch in an external JVM, the runtime must be able to locate the .jnlp file either in the local file system or on a server. LNetxJarMissing=Could not determine location of javaws.jar. LNetxJarMissingInfo=An attempt was made to launch a JNLP file in another JVM, but the javaws.jar could not be located. In order to launch in an external JVM, the runtime must be able to locate the javaws.jar file. LNotToSpec=JNLP file not strictly to specifications. LNotToSpecInfo=The JNLP file contains data that is prohibited by the JNLP specification. The runtime can attempt to ignore the invalid information and continue launching the file. LNotApplication=Not an application file. LNotApplicationInfo=An attempt was made to load a non-application file as an application. LNotApplet=Not an applet file. LNotAppletInfo=An attempt was made to load a non-applet file as an applet. LNoInstallers=Installers not supported. LNoInstallersInfo=JNLP installer files are not yet supported. LInitApplet=Could not initialize applet. LInitAppletInfo=For more information click "more information button". LInitApplication=Could not initialize application. LInitApplicationInfo=The application has not been initialized, for more information execute javaws from the command line. LNotLaunchable=Not a launchable JNLP file. LNotLaunchableInfo=File must be a JNLP application, applet, or installer type. LCantDetermineMainClass=Unknown Main-Class. LCantDetermineMainClassInfo=Could not determine the main class for this application. LUnsignedJarWithSecurity=Cannot grant permissions to unsigned jars. LUnsignedJarWithSecurityInfo=Application requested security permissions, but jars are not signed. LSignedJNLPAppDifferentCerts=The JNLP application is not fully signed by a single cert. LSignedJNLPAppDifferentCertsInfo=The JNLP application has its components individually signed, however there must be a common signer to all entries. LUnsignedApplet=The applet was unsigned. LUnsignedAppletPolicyDenied=The applet was unsigned, and the security policy prevented it from running. LUnsignedAppletUserDenied=The applet was unsigned, and was not trusted. LPartiallySignedApplet=The applet was partially signed. LPartiallySignedAppletUserDenied=The applet was partially signed, and the user did not trust it. LSignedAppJarUsingUnsignedJar=Signed application using unsigned jars. LSignedAppJarUsingUnsignedJarInfo=The main application jar is signed, but some of the jars it is using aren''t. LRunInSandboxError=Run in Sandbox call performed too late. LRunInSandboxErrorInfo=The classloader was notified to run the applet sandboxed, but security settings were already initialized. LSignedJNLPFileDidNotMatch=The signed JNLP file did not match the launching JNLP file. LNoSecInstance=Error: No security instance for {0}. The application may have trouble continuing LCertFoundIn={0} found in cacerts ({1}) LSingleInstanceExists=Another instance of this applet already exists and only one may be run at the same time. JNotApplet=File is not an applet. JNotApplication=File is not an application. JNotComponent=File is not a component. JNotInstaller=File is not an installer. JInvalidExtensionDescriptor=Extension does not refer to a component or installer (name={1}, location={2}). LNotVerified=Jars not verified. LCancelOnUserRequest=Cancelled on user request. LFatalVerification=A fatal error occurred while trying to verify jars. LFatalVerificationInfo=An exception has been thrown in class JarCertVerifier. Being unable to read the cacerts or trusted.certs files could be a possible cause for this exception. LNotVerifiedDialog=Not all jars could be verified. LAskToContinue=Would you still like to continue running this application? # Parser PInvalidRoot=Root element is not a jnlp element. PNoResources=No resources element specified. PUntrustedNative=nativelib element cannot be specified unless a trusted environment is requested. PExtensionHasJ2SE=j2se element cannot be specified in a component extension file. PInnerJ2SE=j2se element cannot be specified within a j2se element. PTwoMains=Duplicate main attribute specified on a resources element (there can be only one) PNativeHasMain=main attribute cannot be specified on a nativelib element. PNoInfoElement=No information element specified. PMissingTitle=title PMissingVendor=vendor PMissingElement=The {0} section has not been specified for your locale nor does a default value exist in the JNLP file. PMissingMandatoryWarning=However there is to many applications known to suffer this issue, so providing fake: PMissingMandatorySubstitution=Corrupted or missing {0}. Do not trust this application! PTwoDescriptions=Duplicate description elements of kind {0} are illegal. PSharing=sharing-allowed element is illegal in a standard JNLP file PTwoSecurity=Only one security element allowed per JNLP file. PEmptySecurity=security element specified but does not contain a permissions element. PTwoDescriptors=Only one application-desc element allowed per JNLP file. PTwoDesktops=Only one desktop element allowed PTwoMenus=Only one menu element allowed PTwoTitles=Only one title element allowed PTwoIcons=Only one icon element allowed PTwoUpdates=Only one update element is allowed PUnknownApplet=Unknown Applet PBadWidth=Invalid applet width. PBadHeight=Invalid applet height. PUrlNotInCodebase=Relative URL does not specify a subdirectory of the codebase. (node={0}, href={1}, base={2}) PBadRelativeUrl=Invalid relative URL (node={0}, href={1}, base={2}) PBadNonrelativeUrl=Invalid non-relative URL (node={0}, href={1}) PNeedsAttribute=The {0} element must specify a {1} attribute. PBadXML=Invalid XML document syntax. PBadHeapSize=Invalid value for heap size ({0}) # Runtime BLaunchAbout=Launching about window... BLaunchAboutFailure=Was not able to launch About window BNeedsFile=Must specify a .jnlp file RNoAboutJnlp=Unable to find about.jnlp BFileLoc=JNLP file location BBadProp=Incorrect property format {0} (should be key=value) BBadParam=Incorrect parameter format {0} (should be name=value) BNoDir=Directory {0} does not exist. BNoCodeOrObjectApplet=Applet tag must specify a ''code'' or ''object'' or ''jnlp_href'' attribute. RNoResource=Missing Resource: {0} RShutdown=This exception to prevent shutdown of JVM, but the process has been terminated. RExitTaken=Exit class already set and caller is not exit class. RCantReplaceSM=Changing the SecurityManager is not allowed. RCantCreateFile=Cant create file {0} RCantDeleteFile=Cant delete file {0} RCantOpenFile=Could not open file {0} RCantWriteFile=Could not write to file {0} RFileReadOnly=Opening file in read-only mode RExpectedFile=Expected {0} to be a file but it was not RRemoveRPermFailed=Removing read permission on file {0} failed RRemoveWPermFailed=Removing write permissions on file {0} failed RRemoveXPermFailed=Removing execute permissions on file {0} failed RGetRPermFailed=Acquiring read permissions on file {0} failed RGetWPermFailed=Acquiring write permissions on file {0} failed RGetXPermFailed=Acquiring execute permissions on file {0} failed RCantCreateDir=Cant create directory {0} RCantRename=Cant rename {0} to {1} RDenyStopped=Stopped applications have no permissions. RExitNoApp=Cannot exit the JVM because the current application cannot be determined. RNoLockDir=Unable to create locks directory ({0}) RNestedJarExtration=Unable to extract nested jar. RUnexpected=Unexpected {0} at {1} RConfigurationError=Fatal error while reading the configuration, continuing with empty. Please fix RConfigurationFatal=ERROR: a fatal error has occurred while loading configuration. Perhaps a global configuration was required but could not be found RFailingToDefault=Failing to default configuration RPRoxyPacNotSupported=Using Proxy Auto Config (PAC) files is not supported. RProxyFirefoxNotFound=Unable to use Firefox''s proxy settings. Using "DIRECT" as proxy type. RProxyFirefoxOptionNotImplemented=Browser proxy option "{0}" ({1}) not supported yet. RBrowserLocationPromptTitle=Please select handler (browser) for this url: HTMLnoneFound=No applet found on this html page (supported are object, embed and applet tags) HTMLmoreThenOne=More then one ({0}) applets found. Using first. You can specify ''all'' or numbers to specify applets you want to run. # icedtea-web man (note, spaces are important due to man pages markup ITWintroL1={0}provides a Free Software web browser plugin running applets written in the Java programming language and an implementation of Java Web Start, originally based on the NetX project. ITWintroL2=NetX allows Java applets and applications to be downloaded over the network, cached, and (by default) run in a secure sandbox environment. Subsequent runs of the applet download the latest version automatically. Update and security settings, among others, can be set using the itw-settings command. ITWintroL3={0} also includes a plugin to {1} within web browsers. ITWintroUrlCaption = enable Java applets BFileInfoAuthors=Names and email addresses of contributors to this project can be found in the file AUTHORS in the IcedTea-Web root directory. BFileInfoCopying=The full GPLv2 license of this project can be found in the file COPYING in the IcedTea-Web root directory. BFileInfoNews=News about releases of this project can be found in the file NEWS in the IcedTea-Web root directory. ITWdescO1title=Modular ITWdescO1text=Easily add JNLP capabilities to an application. ITWdescO2title=Saves Memory ITWdescO2text=Launch programs in a shared JVM. ITWdescO3title=Fast startup ITWdescO3text=Runs applications from a cache for fast starting. ITWdescO4title=Security ITWdescO4text=Run any application in a sandbox or log its activities. ITWdescO5title=Auto-Update ITWdescO5text=Applications can auto-update without special code. ITWdescO6title=Network Deployment ITWdescO6text=Deploy to the internet, not with installers. ITWdescO7title=Open Source ITWdescO7text=GNU Lesser General Public License. ITWdescL1=Visit the {0} or specifically the {1} pages for more information. ITWdescWikiUrlTitle=IcedTea project wiki ITWdescItwWikiUrlTitle=IcedTea-Web home ITWdescL2=Help with common issues with IcedTea-Web can be found {0} . ITWdescIssuesUrlTitle=here ITWdescL3=NetX features: ITWoptionsL1=A {0} guide for the IcedTea project is available on the wiki. ITWoptionsQuickStartUrlCaption=QuickStart ITWoptionsCodeUrlUrlCaption=Code style ITWoptionsL2={0} guidelines and {1} instructions for IcedTea-Web are available as well. Patches should be accompanied by unit tests and {2} before being sent to {3} ITWoptionsEclipseUrlCaption=Eclipse setup ITWoptionsReproducersUrlCaption=reproducers ITWoptionsDistroUrlCaption=the mailing list ITWoptionsL3=Contributing: # policyeditor man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. PEintro= - view and modify security policy settings for javaws and the browser plugin PEsynopseP1=policy_file PEsynopseP2=url PEdescL1=is a GUI application with small command line support to view and edit applet security policy settings used by the IcedTea-Web implementation \ of javaws and the browser plugin. It is intended as a simpler, easier to use, and more accessible alternative \ to the standard JDK Policy Tool. Administrators and power users who need fine grained control over policy files should probably use \ Policy Tool instead of PolicyEditor. PEdescL2=If executed without any arguments, no file is opened, and saving the file will result in a prompt on where to save it. Otherwise, if a file path is given as \ a command line argument, then that file path will be opened and parsed as policy file. PEexampleL1=Show GUI and opens the default policy file. PEexampleL2=Show the GUI editor with no file opened. # javaws man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. JWSintro= - a Java Web Start client JWSdescL1=is an implementation of a JNLP client. It uses a JNLP (Java Network Launch Protocol) file to securely run a remote Java application or a Java applet. \ This implementation of {0}is from the IcedTea project and is based on the NetX project. JWSdescL2=A JNLP file is an xml file that describes how to securely run a remote Java application or a Java applet. JWSoptionsL1=When specifying options, the name of the jnlp file can be after the command, the -jnlp option, an option with no arguments, or after an argument with an option that takes one argument. A html file that launches a jnlp can be specified after the -html option. JWSoptionsL2=The jnlp-file can either be a url or a local path. JWSoptionsL3=The JNLP file should only be specified once, whether as a main argument, after -jnlp or through an html file. JWSoptionsTitle1=Run options: JWSoptionsTitle2=Control options: JWSexampleL1=Shows basic help and about informations. JWSexampleL2=Shows basic help and about informations in terminal only. JWSexampleL3=Will start {0} application, originally from {1}, without downloading it, without headers check and in forced single VM. # Boot options, message should be shorter than this ----------------> BOUsage=[-run-options] jnlp file BOUsage2=[-control-options] BOJnlp = Location of JNLP file to launch (url or file). BOHtml = Location of HTML file to launch (url or file). You can use parameter ALL or numbers (like 1 2 5) to select applets on page. However experimental, this switch should keep you still in safety. BOArg = Adds an application argument before launching. BOParam = Adds an applet parameter before launching. BOProperty = Sets a system property before launching. BOUpdate = Check for updates. BOLicense = Display the GPL license and exit. BOVerbose = Enable verbose output. BOAbout = Shows a sample application. BOVersion = Print the IcedTea-Web version and exit. BONosecurity= Disables the secure runtime environment. You need also deployment.security.itw.ignorecertissues to workaround corrupted signatures BONoupdate = Disables checking for updates. BOHeadless = Disables download window, other UIs. BOStrict = Enables strict checking of JNLP file format. BOViewer = Shows the trusted certificate viewer. BOXml = Uses a strict XML parser to parse the JNLP file. BOredirect = Follows HTTP redirects. BXnofork = Do not create another JVM. BXclearcache= Clean the JNLP application cache. If you pass argument, only specified application is deleted. BXSingleCacheCleared=Clearing cache for: {0} BXSingleCacheClearNotFound=No ID matching {0} found! BXSingleCacheMoreThenOneId=More then one ID is matching {0}! BXSingleCacheFileCount=Alerting: {0} of files BXcacheids = List available IDs in cache, which you can use to delete individual applications. BXignoreheaders= Skip jar header verification. BXoffline = Prevent ITW network connection. Only cache will be used. Application can still connect. BOHelp1 = Prints out information about supported command and basic usage. BOHelp2 = Prints out information about supported command and basic usage. Can also take an parameter, and then it prints detailed help for this command. BOTrustnone = Instead of asking user, will foretold all answers as no. # Itweb-settings boot commands IBOList=Shows a list of all the IcedTea-Web settings and their current values. IBOGet=Shows the value of the specified settings. IBOInfo=Shows additional information about the named settings. Includes a description, the current value, the possible values, and the source of the setting. IBOSet=Sets the settings to the new value specified, if it is an appropriate value. IBOResetAll= Resets all settings to their original values. IBOReset=Resets the specified settings to their original value. IBOCheck=Checks that all the current settings have valid values. PBOFile=Specifies a policy file path to open. If exactly one argument is given, and it is not this flag, it is interpreted as a file path to open, as if this flag was given first. This flag exists \ mostly for compatibility with Policy Tool. PBODefaultFile=Specifies that the default user-level policy file should be opened. This is the file which is normally used by IcedTea-Web to make decisions about custom policies and permissions \ for applets at runtime, unless configured otherwise. PBOCodebase=Specifies an applet codebase URL. This can be used with the other selector options to select a policy entry upon opening the editor; \ if no such identifier exists then it will be created and then selected. PBOSignedBy=Specifies a certificate alias for a certificate stored in the keystore. This can be used with the other selector options to select a policy entry upon opening the editor; \ if no such identifier exists then it will be created and then selected. PBOPrincipals=Specifies class name/principal name pairs (space-separated) for the policy entry identifier. This can be used with the other selector options to select a policy entry upon opening the editor; \ if no such identifier exists then it will be created and then selected. # Option Parser OPUnevenParams=For option {0} expected an even number of params. # NumberOfArguments descriptions. NOAnone=No argument expected NOAone=Exactly one argument expected NOAonemore=Expected one or more arguments NOAnonorone=Expected none or one argument NOAevennumber=Expected even number of arguments with param=value as valid argument # Allowed man sections manNAME=NAME manSYNOPSIS=SYNOPSIS manDESCRIPTION=DESCRIPTION manOPTIONS=OPTIONS manCOMMANDS=COMMANDS manEXAMPLES=EXAMPLES manFILES=FILES manBUGS=BUGS manAUTHOR=AUTHOR manSEE_ALSO=SEE ALSO # Cache CAutoGen=automatically generated - do not edit CNotCacheable={0} is not a cacheable resource CDownloading=Downloading CComplete=Complete CChooseCache=Choose a cache directory... CChooseCacheInfo=NetX needs a location for storing cache files. CChooseCacheDir=Cache directory CCannotClearCache=Cannot clear the cache at this time. Try later. If the problem persists, try closing your browser(s) & JNLP applications. At the end you can try to kill all java applications. \\\n You can clear cache by javaws -Xclearcache or via itw-settings Cache -> View files -> Purge CFakeCache=Cache is corrupt. Fixing. CFakedCache=Cache was corrupt and has been fixed. It is strongly recommended that you run ''javaws -Xclearcache'' and rerun your application as soon as possible. You can also use via itw-settings Cache -> View files -> Purge # extended access warning pane EXAWdesktopWants=Desktop shortcut (Application has requested) EXAWdesktopDontWants=Desktop shortcut (Application didn't request). EXAWsubmenu=Menu shortcut (Application will try to include in Submenu - {0}). EXAWmenuWants=Menu shortcut (Application has requested). EXAWmenuDontWants=Menu shortcut (Application didn't request). EXAWsettingsInfo=Your current setting is: {0}. You can change it in itweb-settings in {1} panel. EXAWsettingsManage=You can manage existing menu entries in itweb-settings in {0} panel. EXAWrememberByApp=Remember by Application EXAWrememberByPage=Remember by Domain EXAWdontRemember=Don''t remember EXAWrememberByAppTooltip=This application will never ask for more permissions EXAWrememberByPageTooltip=All applications from this domain will stop asking, and will follow your current decision on all permissions EXAWdontRememberTooltip=Your decision will be used only for this single permission for this single run EXAWbrowser=browser desktop item EXAWgenjnlp=jnlp generated EXAWjnlphref=jnlp href EXAWhtml=javaws html EXAWfixhref=fix issues in jnlp-href EXAWbrowserTolltip=Browser shortcut
    \
  • This option will create shortcut to open your browser with current page loaded
  • \
  • If your browser support offline run, this is the safest option
  • EXAWbrowsersTolltip=browser used for launching this applet (will launch IcedTea-web later)
    \
  • The default browser was preset
  • \
  • Feel free to include a browser of your choice
  • EXAWgeneratedTolltip=
  • The jnlp file will be generated from your current html page
  • \
  • Once you launch your shortcut, javaws will launch this jnlp file
  • \
  • This applet will then run without the browser
  • \
  • However experimental, this is working surprisingly well.
  • EXAWhrefTolltip=Some applets are just pointing to jnlp file, which is containing actual informations about the resources of this app.
    \
  • By selecting this option, this jnlp file will be saved and used for later launches.
  • \
  • Javaws will be the launcher, and this applet will run out of browser
  • \
  • However good this sounds, this is surprisingly not working
  • EXAWhtmlTolltip=BY using -html switch, javaws can try to parse html and try to extract applet, and to launch it out of browser
    \
  • highly experimental
  • \
  • really cool
  • EXAWfixTolltip=Some jnlp files pointed from applet are not designed to be used as jnlp apps
    \
  • This will add the known often missing elements to this file (if missing)
  • # Security SFileReadAccess=The application has requested read access to {0}. Do you want to allow this action? SFileWriteAccess=The application has requested write access to {0}. Do you want to allow this action? SDesktopShortcut=The Application has requested permission to create Desktop and Menu shortcuts. Do you want to allow this action? WinDesktopError=Failed to create windows desktop icons. Most likely, your icedtea-web was built without mslinks.jar or mslinks.jar is not to be found. \ Try to fix it. If it do not help, maybe the application itself is to be blamed. At the end, study the exceptions above carefully and contact icedtea-web team. SSigUnverified=The application''s digital signature cannot be verified. Do you want to run the application? It will be granted unrestricted access to your computer. SSigVerified=The application''s digital signature has been verified. Do you want to run the application? It will be granted unrestricted access to your computer. SSignatureError=The application''s digital signature has an error. Do you want to run the application? It will be granted unrestricted access to your computer. SUntrustedSource=The digital signature could not be verified by a trusted source. Only run if you trust the origin of the application. SWarnFullPermissionsIgnorePolicy=The code executed will be given full permissions, ignoring any Java policies you may have. STrustedSource=The digital signature has been validated by a trusted source. SClipboardReadAccess=The application has requested read-only access to the system clipboard. Do you want to allow this action? SClipboardWriteAccess=The application has requested write-only access to the system clipboard. Do you want to allow this action? SPrinterAccess=The application has requested printer access. Do you want to allow this action? SNetworkAccess=The application has requested permission to establish connections to {0}. Do you want to allow this action? SNoAssociatedCertificate= SUnverified=(unverified) SAlwaysTrustPublisher=Always trust content from this publisher SHttpsUnverified=The website''s HTTPS certificate cannot be verified. SRememberOption=Remember this option? SRememberAppletOnly=For applet SRememberCodebase=For site {0} SUnsignedSummary=An unsigned Java application wants to run SUnsignedDetail=An unsigned application from the following location wants to run:
      {0}
    The page which made the request was:
      {1}

    It is recommended you only run applications from sites you trust. SUnsignedAllowedBefore=You have accepted this applet previously - ({0}). SUnsignedRejectedBefore=You have rejected this applet previously - ({0}). SUnsignedQuestion=Allow the applet to run? SPartiallySignedSummary=Only parts of this application code are signed. SPartiallySignedDetail=This application contains both signed and unsigned code. While signed code is safe if you trust the provider, unsigned code may imply code outside of the trusted provider''s control. SPartiallySignedQuestion=Do you wish to proceed and run this application anyway? SAuthenticationPrompt=The {0} server at {1} is requesting authentication. It says "{2}" SJNLPFileIsNotSigned=This application contains a digital signature in which the launching JNLP file is not signed. STrustedOnlyAttributeFailure=This application specifies Trusted-only as True in its Manifest. {0} and requests permission level: {1}. This is not allowed. STOAsignedMsgFully = The applet is fully signed STOAsignedMsgAndSandbox = The applet is fully signed and sandboxed STOAsignedMsgPartiall = The applet is not fully signed STempNetwork=Allow incoming and outgoing network connections STempReadFilesAndProperties=Read-only access to all files and properties STempWriteFilesAndProperties=Write-only access to all files and properties STempReflectionAndExternal=Java Reflection and external code access STempAllMedia=All media (printing, audio, clipboard access) # Security - used for the More Information dialog SBadKeyUsage=Resources contain entries whose signer certificate''s KeyUsage extension doesn''t allow code signing. SBadExtendedKeyUsage=Resources contain entries whose signer certificate''s ExtendedKeyUsage extension doesn''t allow code signing. SBadNetscapeCertType=Resources contain entries whose signer certificate''s NetscapeCertType extension doesn''t allow code signing. SHasExpiredCert=The digital signature has expired. SHasExpiringCert=Resources contain entries whose signer certificate will expire within six months. SNotYetValidCert=Resources contain entries whose signer certificate is not yet valid. SUntrustedCertificate=The digital signature was generated with an untrusted certificate. STrustedCertificate=The digital signature was generated with a trusted certificate. SCNMisMatch=The expected hostname for this certificate is: "{0}"
    The address being connected to is: "{1}" SRunWithoutRestrictions=This application will be run without the security restrictions normally provided by Java. SCertificateDetails=Certificate Details # Security - certificate information SIssuer=Issuer SSerial=Serial SMD5Fingerprint=MD5 Fingerprint SSHA1Fingerprint=SHA1 Fingerprint SSignature=Signature SSignatureAlgorithm=Signature Algorithm SSubject=Subject SValidity=Validity # Certificate Viewer CVCertificateViewer=Certificates CVCertificateType=Certificate Type CVDetails=Details CVExport=Export CVExportPasswordMessage=Enter password to protect key file: CVImport=Import CVImportPasswordMessage=Enter password to access file: CVIssuedBy=Issued By CVIssuedTo=Issued To CVPasswordTitle=Authentication Required CVRemove=Remove CVRemoveConfirmMessage=Are you sure you want to remove the selected certificate? CVRemoveConfirmTitle=Confirmation - Remove Certificate? CVUser=User CVSystem=System # KeyStores: see KeyStores.java KS=KeyStore KSCerts=Trusted Certificates KSJsseCerts=Trusted JSSE Certificates KSCaCerts=Trusted Root CA Certificates KSJsseCaCerts=Trusted JSSE Root CA Certificates KSClientCerts=Client Authentication Certificates # KeyStores: set password KSresultUntilNow=Got {0} during keystore operation {1}. Attempts to unlock: {2} KSinvalidPassword=Invalid password? KSheadlesWarning=Type new password and press ok. Give up by pressing return on empty line. KSnwPassHelp=Type new password and press ok. Give up by pressing anything else. HeadlessDialogues=Type `exit` to terminate ITW, or type one of the below values. Prefix answer by "R " to remember decision and by "RC " to do so for whole codebase. AWPstdoutHint1=You can type YES/NO or complex answer parseable by AccessWarningPaneComplexReturn.readValue. AWPstdoutHint2=eg: YES,D(not_found_browser,false,null,true,)M(firefox,false,null,false,) AWPstdoutHint3=where: global_answer,desktop_shortcut(browser_bin,fixJnlpHref,type:null_or_one_of{0},really_create)same_for_menu... PAPstdinInfo=Type NAME space PASSWORD. Sorry, no spaces in name, no security, keep your screen safe: HDwrongValue=Probably wrong value? # HTTP 511 Headless511line0=*** Found urls *** Headless511line1=Unluckily ITW do not support 511 in headless mode directly. Headless511line2=One of above urls when visited externally, will solve the authentication for you. Then Type answer. Headless511line3=If you are desperate, In Xless mode try lynx terminal browser, in Xfull - browser less mode try ITW''s `javaws {0}`. Exit511=Exit IcedTea-Web Ignore511=Ignore in this session Header511=

    HTTP 511 - Network Authentication Required

    You can fill the form in below panel, or try links second tab to proceed via browser

    What is 511 Network Authentication Required # Browser BrowserGoTo=Go to: BrowserSource=Source BrowserSocket=Use direct socket conenction BrowserSocketHelp=When selected, direct socket connection is opened to url. You may see headers and other strange stuff.
    However, some conenctions may fail unexpectedly BrowserOpenExternal=Open in external browser BrowserOpeninternal=Open in integrated browse BrowserCopyUrlToClip=Copy to clipboard BrowserClearAll=Clear all BrowserWarningLine1=WARNING this is html 3.2 comatible browser, not intended for casual web browsing! BrowserWarningLine2=Provided without any warranty! BrowserArg=Launch embeded browser. Use in great need only! # Deployment Configuration messages DCIncorrectValue=Property "{0}" has incorrect value "{1}". Possible values {2}. DCInternal=Internal error: {0} DCSourceInternal= DCUnknownSettingWithName=Property "{0}" is unknown. DCmaindircheckNotexists=After all attempts, your configuration directory {0} do not exists. DCmaindircheckNotdir=Your configuration directory {0} is not directory. DCmaindircheckRwproblem=Your configuration directory {0} cannot be read/written properly. # Value Validator messages. Messages should follow "Possible values ..." VVRustCpModifiers=Rust native launchers only! CP and XBootCP properties are space separated members of bootcp/cp to be removed or added. eg `...cp.add=/usr/java/rhino.jar /usr/java/scary.jar` will add those two jars to cp. Eg: `...bootcp.remove=rhino.jar tagsoup.jar` will remove those two jars no meter of path. Removal is done first. VVPossibleValues=Possible values {0} VVPossibleBooleanValues=are {0} or {1} VVPossibleFileValues=include an absolute path to a file or directory VVPossibleRangedIntegerValues=are in range {0} to {1} (inclusive) VVPossibleUrlValues=include any valid url (eg. http://icedtea.classpath.org/hg/) VVPossibleBrowserValues=Set path to browser or any command launching url. If not set, default browser is used. If default browser is not available, you will be be prompted to provide URL consumer. \ Eg: firefox, or (windows) {0}, microsoft-edge, (mac) safari, xdg-open (linux) like commands. \ In headless mode you can use wget, curl or lynx. It can be also javaws itself to launch other jnlp. \ You can set yor custom browser via {4} property. ${1} environment variable is serving same purpose. \ You can use keyword {2} to launch internal browser. But be warned, it is terrible. Use {3} to enforce prompt each time instead of using defaults. VVBrowserVerificationPass=Verification Ok: {0} VVBrowserVerificationFail=Verification failed. See examples! VVBrowserSaveNotAllowed=You have set {0} as value for {1}. Can't overwrite. VVBrowserSaveAllowed=Will save your selection as {0} # Control Panel - Main CPMainDescriptionShort=Configure IcedTea-Web CPMainDescriptionLong=Configure how the browser plugin (IcedTeaNPPlugin) and javaws (NetX) work # Control Panel - Tab Descriptions CPAboutDescription=View version information about IcedTea Control Panel. CPNetworkSettingsDescription=Configure network settings, including how IcedTea-Web connects to the internet and whether to use any proxies. CPTempInternetFilesDescription=Java stores application data for faster execution the next time you run it. CPJRESettingsDescription=View and manage Java Runtime Environment versions and settings for Java applications and applets. CPCertificatesDescription=Use certificates to positively identify yourself, certifications, authorities, and publishers. CPSecurityDescription=Use this to configure security settings. CPDebuggingDescription=Enable options here to help with debugging CPDesktopIntegrationDescription=Set whether or not to allow creation of desktop shortcut. CPDesktopIntegrationShowIntegrations=Show desktop and menu integrations window CPDesktopIntegrationLinuxOnly=Desktop integration manager available only for Linux. Sorry CPJVMPluginArguments=Set JVM arguments for plugin. CPJVMitwExec=Set JVM for IcedTea-Web \u2014 working best with OpenJDK CPJVMitwExecValidation=Validate JVM for IcedTea-Web CPJVMPluginSelectExec=Browse for JVM for IcedTea-Web CPJVMnone=No validation result for CPJVMvalidated=Validation result for CPJVMvalueNotSet=Value is not set. Hardcoded JVM will be used. CPJVMnotLaunched=Error, process was not launched, see console output for more info. CPJVMnoSuccess=Error, process have not ended successfully, see output for details, but your java is not set correctly. CPJVMopenJdkFound=Excellent, OpenJDK detected CPJVMjdk5=JDK5 recognized. JDK7 and older are longer supported. CPJVMjdk6=JDK6 recognized. JDK7 and older are longer supported. CPJVMjdk7=JDK7 recognized. JDK7 and older are longer supported. CPJVMjdk8=JDK8 recognized. Jdk8 and higher are supported CPJVMjdk9=JDK9 or higher recognized. Jdk8 and higher are supported. Jdk9 and up can have modularity issues. CPJVMjdk=Unknown version. Hard to judge support. See tooltip or console/standard output (depends on verbosity)for real version. CPJVMoracleFound=Great, Oracle java detected CPJVMibmFound=Good, IBM java detected CPJVMgijFound=Warning, gij detected CPJVMstrangeProcess=Your path had an executable process, but it was not recognized. Verify the Java version in the console output. CPJVMnotDir=Error, The path you chose is not a directory. CPJVMisDir=Ok, the path you chose is a directory. CPJVMnoJava=Error, the directory you chose does not contain bin/java. CPJVMjava=Ok, the directory you chose contains bin/java. CPJVMnoRtJar=Error, the directory you chose does not contain lib/rt.jar CPJVMrtJar=Ok, the directory you chose contains lib/rt.jar. CPJVMPluginAllowTTValidation=Validate JRE immediately CPJVMNotokMessage1=You have entered invalid JDK value:
    • {0}
    with following error message: CPJVMNotokMessage2=You might be seeing this message because:
    * Some validity tests have not been passed
    * Non-OpenJDK is detected
    With invalid JDK IcedTea-Web will probably not be able to start.
    If it will break, you have to modify or remove {0} property in your configuration file:
    • {1}
    You should trust yours admin or at least try to search for OpenJDK in your system or be sure you know what you are doing. CPJVMconfirmInvalidJdkTitle=Confirm invalid JDK CPJVMconfirmReset=Reset to default? CPPolicyDetail=View or edit your user-level Java Policy File. This allows you to grant or deny runtime permissions to applets regardless of the standard security sandboxing rules. CPPolicyTooltip=Open {0} in policy editor CPPolicyEditorNotFound=Could not find a system policy file editor. Check that policytool is on your PATH. # Control Panel - Buttons CPButAbout=About... CPButNetworkSettings=Network Settings... CPButSettings=Settings... CPButView=View... CPButCertificates=Certificates... CPButSimpleEditor=Simple editor CPButAdvancedEditor=Advanced editor # Control Panel - Headers CPHead=IcedTea-Web Control Panel CPHeadAbout=\u00a0About\u00a0IcedTea-Web\u00a0 CPHeadNetworkSettings=\u00a0Network\u00a0Proxy\u00a0Settings\u00a0 CPHeadTempInternetFiles=\u00a0Temporary\u00a0Internet\u00a0Files\u00a0 CPHeadJRESettings=\u00a0Java\u00a0Runtime\u00a0Environment\u00a0Settings\u00a0 CPHeadCertificates=\u00a0Certificates\u00a0 CPHeadDebugging=\u00a0Debugging\u00a0Settings\u00a0 CPHeadDesktopIntegration=\u00a0Desktop\u00a0Integrations\u00a0 CPHeadSecurity=\u00a0Security\u00a0Settings\u00a0 CPHeadJVMSettings=\u00a0JVM\u00a0Settings\u00a0 CPHeadPolicy=\u00a0Custom\u00a0Policy\u00a0Settings\u00a0 # Control Panel - Tabs CPTabAbout=About IcedTea-Web CPTabCache=Cache CPTabCertificate=Certificates CPTabClassLoader=Class Loaders CPTabDebugging=Debugging CPTabDesktopIntegration=Desktop Integration CPTabMenuShortcuts=Manage installed menu shortcuts CPTabNetwork=Network CPTabRuntimes=Runtimes CPTabSecurity=Security CPTabJVMSettings=JVM Settings CPTabPolicy=Policy Settings # Control Panel - AboutPanel CPAboutInfo=This is the control panel for setting deployments.properties.
    Not all options will take effect until implemented.
    The use of multiple JREs is currently limited to OpenJDK.
    # Control Panel - AdvancedProxySettings APSDialogTitle=Network Settings APSServersPanel=Servers APSProxyTypeLabel=Type APSProxyAddressLabel=Proxy Address APSProxyPortLabel=Proxy Port APSLabelHTTP=HTTP APSLabelSecure=Secure APSLabelFTP=FTP APSLabelSocks=Socks APSSameProxyForAllProtocols=Use the same proxy server for all protocols. APSExceptionsLabel=Exceptions APSExceptionsDescription=Do not use proxy server for addresses beginning with APSExceptionInstruction=Separate each entry with a semicolon. # Control Panel - DebugginPanel CPDebuggingPossibilites=Logging outputs DPEnableLogging=Enable debugging DPEnableLoggingHint=When this switch is on, then also debug messages are logged. Same as -verbose or ICEDTEAPLUGIN_DEBUG=true DPEnableHeaders=Enable headers DPEnableHeadersHint=When this switch is on, each logged message have header with additional information like user, place in code and time DPEnableFile=Enable logging to file DPEnableLegacyFileLog=Use java.util.logging instead of direct file writing DPEnableClientAppFileLogging=Fork client applications outputs also to file DPEnableLegacyFileLogHint=java.util.logging is know to deadlock rarely when used on applications with custom logging extensions DPEnableClientAppFileLoggingHint=Logging of client apps is known to sometimes not work with java.util.logging on CPFilesLogsDestDir=File logs directory CPFilesLogsDestDirResert=Reset to default DPEnableFileHint=output messages will be saved to file in your {0} directory DPEnableStds=Enable logging to standard outputs DPEnableStdsHint=messages will be printed to standard outputs DPEnableSyslog=Enable logging to system logs DPEnableSyslogHint=output messages will be saved to system logs DPDisable=Disable DPHide=Hide on startup DPShow=Show on startup DPShowPluginOnly=Show on plugin startup DPShowJavawsOnly=Show on javaws startup DPJavaConsole=Java Console DPJavaConsoleDisabledHint=Java console is disabled. Use itweb-settings to configure it out of disabled to any show or hide value. # PolicyEditor PETitle=PolicyEditor PETitleWithPath=PolicyEditor - {0} PETitleWithChangesMade={0} * PEReadProps=Read system properties PEReadPropsDetail=Allow applets to read system properties such as your username and home directory location PEWriteProps=Write system properties PEWritePropsDetail=Allow applets to (over)write system properties PEReadFiles=Read from local files PEReadFilesDetail=Allow applets to read from files in your home directory PEWriteFiles=Write to local files PEWriteFilesDetail=Allow applets to write to files in your home directory PEDeleteFiles=Delete local files PEDeleteFilesDetail=Allow applets to delete files in your home directory PEReadSystemFiles=Read all system files PEReadSystemFilesDetail=Allow applets read-only access to all locations on your computer PEWriteSystemFiles=Write all system files PEWriteSystemFilesDetail=Allow applets write-only access to all locations on your computer PEReadTempFiles=Read from temp files PEReadTempFilesDetail=Allow applets to read from your temporary files directory PEWriteTempFiles=Write to temp files PEWriteTempFilesDetail=Allow applets to write to your temporary files directory PEDeleteTempFiles=Delete temp files PEDeleteTempFilesDetail=Allow applets to delete files in your temporary files directory PEAWTPermission=Window System Access PEAWTPermissionDetail=Allow applets all AWT windowing system access PEClipboard=Access clipboard PEClipboardDetail=Allow applets to read from and write to your clipboard PENetwork=Access the network PENetworkDetail=Allow applets to establish any network connections PEPrint=Print documents PEPrintDetail=Allow applets to queue print jobs PEPlayAudio=Play sounds PEPlayAudioDetail=Allow applets to play sounds, but not record PERecordAudio=Record audio PERecordAudioDetail=Allow applets to record audio, but not play back PEReflection=Java reflection PEReflectionDetail=Allow applets to access the Java Reflection API PEClassLoader=Get ClassLoader PEClassLoaderDetail=Allow applets to access the system classloader (often used with Reflection) PEClassInPackage=Access other packages PEClassInPackageDetail=Allow applets to access classes from other applet packages (often used with Reflection) PEDeclaredMembers=Access private class data PEDeclaredMembersDetail=Allow applets to access normally hidden data from other Java classes (often used with Reflection) PEAccessThreads=Modify threads PEAccessThreadsDetail=Allow applets to start, stop, and otherwise manage threads PEAccessThreadGroups=Modify threadgroups PEAccessThreadGroupsDetail=Allow applets to start, stop, and otherwise manage thread groups PEExec=Execute commands PEExecDetail=Allow applets to execute system commands PEGetEnv=Get environment variables PEGetEnvDetail=Allow applets to read system environment variables PECouldNotOpen=Unable to open policy file PECouldNotSave=Unable to save policy file PEAddEntry=Add New... PERemoveEntry=Remove PEEntryPrompt=Enter a new policy entry identifier PEAddPrincipal=Add Principal PERemovePrincipal=Remove Principal PEEditPrincipal=Edit Principal PEGlobalSettings=All Applets PESaveChanges=Save changes before exiting? PEChangesSaved=Changes saved PECheckboxLabel=Permissions PEEntriesLabel=Entries PEFileMenu=File PENewMenuItem=New PEOpenMenuItem=Open... PEOpenDefaultMenuItem=Open default policy file PESaveMenuItem=Save PESaveAsMenuItem=Save As... PEExitMenuItem=Exit PEEntryMenu=Entry PEAddEntryItem=Add New... PERemoveEntryItem=Remove PEModifySubmenuItem=Modify PEModifyCodebaseItem=Codebase PEModifySignedByItem=Signed By PEModifyPrincipalsItem=Principals PECopyEntryItem=Copy PEPasteEntryItem=Paste... PEModifyCodebase=Change Codebase to: PEModifyPrincipals=Modify Principals: PEModifySignedBy=Changed SignedBy to: PEPasteEntry=Paste copied entry with codebase: PEViewMenu=View PECustomPermissionsItem=Custom Permissions... PECodebaseInputLabel=Codebase URL: PESignedByInputLabel=SignedBy: PEPrincipalsInputLabel=Principals: PEPrincipalClassNameInputLabel=Class Name: PEPrincipalPrincipalNameInputLabel=Principal Name: PEFileModified=File Modification Warning PEFileModifiedDetail=The policy file at {0} has been modified since it was opened. Reload and re-edit before saving? PEFileMissing=The policy file was missing from disk. A new file has been saved with the same name. PEGAccessUnownedCode=Execute unowned code PEGMediaAccess=Media access PEGRightClick=Right click to fold/unfold PEGReadFileSystem=Read from system PEGWriteFileSystem=Write to system PEClipboardError=Clipboard does not appear to contain properly formatted policy entries PEInvalidPolicy=Paste Failed: Could not read policy entry for entry {0} from system clipboard PEInvalidIdentifier=Please fill in/modify at least one of the fields. PEIdentifierMatchesAll=Please fill in/modify at least one of the fields. PEClipboardAccessError=Could not read from clipboard PEDefaultFileFilePathSpecifiedError=Either -file (or simply a main argument) or -defaultfile may be specified, but not both PEMainArgAndFileSwitchSpecifiedError=Either -file may be specified or a main argument may be specified, but not both PESignedByEmpty=SignedBy cannot be empty PEInvalidUrl=Invalid URL: {0} PEHelpMenu=Help PEAboutPolicyEditorItem=About PolicyEditor PEPolicyEditorHelpItem=PolicyEditor Help PEHelpDialogTitle=PolicyEditor Help PEHelpDialogContent=

    PolicyEditor Help

    \ PolicyEditor allows you to secure java applets or applications you want to run \ with the specified permissions you decide to give it. \

    Features

    \
      \
    • Accessible: through use of keyboard only, mouse only, or both\
    • Customize: by specifying any permissions you decide to choose\
    • Secure: your applets and applications to use only the permissions you specify\
    • Manage: codebases and their respective permissions you set\
    \ PolicyEditor works by specifying a codebase and checking the permissions you wish to grant to \ the current Java applet or application. To run the applet/application with only the specified permissions, \ use the sandbox button or specify sandbox mode in the manifest.\

    \ Within PolicyEditor there are many additional actions. Right-clicking or pressing \ enter (after tabbing to the group) on a permission group with a small arrow or chevron \ beside it will expand or collapse the given permission checkbox group. Other notable features are \ the ability to copy and paste a set of permissions into a new codebase, allowing for \ quick access to a user specified default permissions group. \ Also, you''re not limited to the predefined checkbox permissions. By accessing \ Custom Permissions through the view menu, you can add any customized permissions. \ # Policy Editor CustomPolicyViewer PECPTitle=Custom Policy Viewer PECPListLabel=Other policies for {0} PECPAddButton=Add PECPRemoveButton=Remove PECPCloseButton=Close PECPType=type PECPTarget=target PECPActions=actions PECPPrompt=Enter a custom permission. Do not include \"permission\" or punctuation marks. # PolicyEditor key mnemonics. See KeyEvent.VK_* PEFileMenuMnemonic=F PEEntryMenuMnemonic=E PEViewMenuMnemonic=V PEHelpMenuMnemonic=H PEAddEntryMnemonic=N PEAddEntryItemMnemonic=N PERemoveEntryMnemonic=R PERemoveEntryItemMnemonic=R PENewMenuItemMnemonic=N PEOpenMenuItemMnemonic=O PEOpenDefaultMenuItemMnemonic=D PESaveMenuItemMnemonic=S PEExitMenuItemMnemonic=X PECustomPermissionsItemMnemonic=U PECopyEntryItemMnemonic=C PEPasteEntryItemMnemonic=P PESaveAsMenuItemMnemonic=A PEModifySubmenuItemMnemonic=M PEModifyEntryCodebaseItemMnemonic=B PEModifyEntryPrincipalsItemMnemonic=I PEModifyEntrySignedByItemMnemonic=G PEAboutPolicyEditorItemMnemonic=A PEPolicyEditorHelpItemMnemonic=H # See javax.swing.KeyStroke.getKeyStroke(String) PEAddEntryItemAccelerator=control shift N PERemoveEntryItemAccelerator=DELETE PENewMenuItemAccelerator=control N PEOpenMenuItemAccelerator=control O PEOpenDefaultMenuItemAccelerator=control D PESaveMenuItemAccelerator=control S PESaveAsMenuItemAccelerator=control shift S PEExitMenuItemAccelerator=control Q PECustomPermissionsItemAccelerator=control U PECopyEntryItemAccelerator=control C PEPasteEntryItemAccelerator=control V PEModifyEntryCodebaseItemAccelerator=F2 PEModifyEntryPrincipalsItemAccelerator=shift F2 PEModifyEntrySignedByItemAccelerator=control F2 PEAboutPolicyEditorCloseAccelerator=control Q #conole itself labels CONSOLErungc = Run GC CONSOLErunFinalizers = Run Finalizers CONSOLErunningFinalizers = Running finalization.... CONSOLEmemoryInfo = Memory Info CONSOLEsystemProperties = System Properties CONSOLEclassLoaders = Available Classloaders CONSOLEthreadList = Thread List CONSOLEthread = Thread CONSOLEnoClassLoaders = No Classloader info exists in system CONSOLEmemoryMax = Max Memory CONSOLEmemoryTotal = Total Memory CONSOLEmemoryFree = Free Memory CONSOLEClean=Clear # console output pane labels COPsortCopyAllDate=sort copy all by date COPshowHeaders=Show headers: COPuser=user COPorigin=origin COPlevel=level COPdate=date COPthread1=thread 1 COPthread2=thread 2 COPShowMessages=Show messages COPstdOut=std. Out COPstdErr=std. Err COPjava=java COPplugin=plugin COPpreInit=pre-init COPpluginOnly=plugin only COPSortBy=Sort by COPregex=Regular expression filter COPAsArrived=As arrived (no sort) COPcode=code COPmessage=message COPSearch=Search COPautoRefresh=auto refresh COPrefresh=refresh COPApply=Apply COPmark=mark COPCopyAllPlain=Copy all (plain) COPCopyAllRich=Copy all (rich) COPnext=next>>> COPprevious=<<WARNING: Uses more space than {0} MB available TIFPCacheSizeSpinnerLargeValueWarning=Available: {0} MB TIFPCacheSizeSetToNoCaching=Cached files will be deleted when IcedTea-Web terminates. TIFPCacheSizeSpinnerTooltip=Minimum: {0} Maximum: {1} # Control Panel - Cache Viewer CVCPDialogTitle=Cache Viewer CVCPButRefresh=Refresh CVCPButDelete=Delete CVCPCleanCache=Purge CVCPCleanCacheTip=Some errors may be caused by old files in your cache. Before submitting the bug, you may clear cache and try to run application again. \\\n You can clear cache by javaws -Xclearcache or via itw-settings Cache -> View files -> Purge CVCPColLastModified=Last Modified CVCPColSize=Size (Bytes) CVCPColDomain=Domain CVCPColType=Type CVCPColPath=Path CVCPColName=Name # Control Panel - desktop integration manager DIMtitle=IcedTea-Web Shortcut Manager DIMremoveSelected=Remove selected DIMselectRelativeRecordsFromOtherColumns=Select related records DIMreloadLists=Reload DIMselectAll=Select all DIMclearSelection=Deselect all DIMdescription=Manage the shorctuts and resources (cached images, etc) IcedTea-Web created for desktop integration DIMguessedDesktop=Desktop folder as well guessed as possible. DIMselectionPreview=Selection preview DIMaskBeforeDelete=Are you sure you want to delete {0} files? DIMgeneratedJnlps=Generated JNLPs DIMgeneratedJnlpsTooltip=All files in this list should be generated by IcedTea-Web! DIMicons=Icons DIMiconsTooltip=All files in this list should be icons cached by IcedTea-Web! DIMorphans=orphans DIMorphansTooltip=Will select all items which are not listed in any shortcut. DIMmenuItems=Menu Items DIMmenuItemsTooltip=All shortcuts in this list should be generated by IcedTea-Web! DIMdesktopItems=Desktop Items DIMdesktopItemsTooltipL1=Not all your shortcuts on your Desktop were generated by IcedTea-Web! DIMdesktopItemsTooltipL2=For your convenience: DIMdesktopItemsTooltipL3=red items were probably not generated by IcedTea-Web DIMdesktopItemsTooltipL4=dark green items are browser shortcuts, so they were probably generated by IcedTea-Web DIMdesktopItemsTooltipL5=green items are javaws shortcuts, so they were very likely generated by IcedTea-Web DIMdesktopItemsTooltipL6=In all cases, be careful what you delete, and verify connections with `select related records` mode DIMgeneratedButton=generated DIMgeneratedButtonTooltip=Will select related generated stuff. DIMiconsButton=icons DIMiconsButtonTooltip=Will select related cached icons. # Control Panel - Misc. CPJRESupport=IcedTea-Web currently does not support the use of multiple JREs. CPInvalidPort=Invalid port number given.\n[Valid port numbers are 1-65535] CPInvalidPortTitle=Error on input. # command line control panel CLNoInfo=No information available (is this a valid option?). CLValue=Value: {0} CLValueSource=Source: {0} CLDescription=Description: {0} CLUnknownCommand=Unknown command {0} CLUnknownProperty=Unknown property-name "{0}" CLWarningUnknownProperty=WARNING: Unknown property name "{0}" - creating new property CLNoIssuesFound=No issues found. CLIncorrectValue=Property "{0}" has incorrect value "{1}". Possible values {2}. CLListDescription=Shows a list of all property names and values that are in use by IcedTea-Web CLGetDescription=Shows the value for property-name CLSetDescription=Sets the property-name to value if possible. The value is checked for being valid. If the administrator has locked the property, this will have no effect CLResetDescription=Resets the value for property-name to it\''s default value.\nall resets all properties recognized by IcedTea-Web to their default value. CLInfoDescription=Shows more information about the given property CLCheckDescription=Shows any properties that have been defined but are not recognized by IcedTea-Web CLUnexpectedNumberOfCommands=Itweb-settings can only run one command at a time. # splash screen related SPLASHerror = Click here for details. An exception has occurred. SPLASH_ERROR = ERROR SPLASHtitle = Title SPLASHvendor = Vendor SPLASHhomepage = Homepage SPLASHdescription = Description SPLASHClose= Close SPLASHclosewAndCopyException = Close and copy the stack trace to clipboard SPLASHexOccured = An exception has occurred... SPLASHHome = Home SPLASHcantCopyEx = Cannot copy exception SPLASHnoExRecorded = No exception recorded SPLASHmainL1 = For even more information you can visit {0} and follow the steps described there on how to obtain necessary information to file bug SPLASHmainL3 = No further information available, try to launch the browser from the command line and examine the output. SPLASHcloseAndCopyShorter = Close and copy to clipboard SPLASHmainL4 = The following exception has occurred. For more information, try to launch the browser from the command line and examine the output. SPLASHmainL2 = Additional information may be available in the console or logs. Even more information is available if debugging is enabled. SPLASHexWas = Exception was: SPLASHcfl = Can''t follow link to SPLASHvendorsInfo = Information from vendor of your application SPLASHanotherInfo = Another available info SPLASHdefaultHomepage = Unspecified homepage, verify source rather SPLASHerrorInInformation = Error during loading of information element, verify source rather SPLASHmissingInformation = Information element is missing, verify source rather SPLASHchainWas = This is the list of exceptions that occurred launching your applet. Please note, those exceptions can originate from multiple applets. For a helpful bug report, be sure to run only one applet. CBCheckFile = The application is a local file. Codebase validation is disabled. See: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html for details. CBCheckNoEntry = This application does not specify a Codebase in its manifest. Please verify with the applet''s vendor. Continuing. See: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html for details. CBCheckUnsignedPass = Codebase matches codebase manifest attribute, but application is unsigned. Continuing. See: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html for details. CBCheckUnsignedFail= The application''s codebase does NOT match the codebase specified in its manifest, but the application is unsigned. Continuing. See: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html for details. CBCheckOkSignedOk = Codebase matches codebase manifest attribute, and application is signed. Continuing. See: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html for details. CBCheckSignedAppletDontMatchException = Signed applets are not allowed to run when their actual Codebase does not match the Codebase specified in their manifest. Expected: {0}. Actual: {1}. See: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html for details. CBCheckSignedFail = Application Codebase does NOT match the Codebase specified in the application''s manifest, and this application is signed. You are strongly discouraged from running this application. See: http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/no_redeploy.html for details. # itweb man base (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. ITWTBbugs=There aren''t any known bugs. If you come across one, please file it at ITWTBdebug=Please run in debug (-verbose switch or itw-settings setting or ICEDTEAPLUGIN_DEBUG variable set to true) \ mode and include that output (best is from java console) with URL to jnlp or html file (or the jnlp/html file or \ application itself) when filing out the bug report. ITWTBwritten=Written and maintained by the IcedTea contributors. ITWTBdirs=Where $XDG_CONFIG_DIR, $XDG_CACHE_DIR and $XDG_RUNTIME_DIR are set as ~/.config, ~/.cache and /tmp or /var/tmp if not set. # itweb-settings man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. ITWSintro= - view and modify settings for javaws and the browser plugin ITWSsynops=command arguments IWSdescL1=is a command line and a GUI program to modify and edit settings used by the IcedTea-Web implementation \ of javaws and the browser plugin. IWSdescL2=If executed without any arguments, it starts up a GUI. Otherwise, it tries to do what is specified in the argument. IWSdescL3=The command-line allows quickly searching, making a copy of and modifying specific settings without having to hunt through a UI. IWSexampleL1=Show the GUI editor IWSexampleL2=Resets the value of `{0}` setting. ITWSdefault=default IWSexampleL3=Known properties IWSexampleL31=(key, value and default value (if different)): IWSexampleL32=(key and default value): IWSpossible=Possible: # itweb-plugin man (note, spaces (especially the one around markup) are important due to man pages markup). Only bold tag is now recognized by ReplacingTextFormatter. ITWPintro= - allow to run java applets in your favorite browser ITWPsynopsL1=is working in your browser, once your browser knows about this files. ITWPsynopsL2=The {0} must be placed, or linked inside specific directories. See {1} ITWPsynopsL3= Mozilla compatible browsers like Firefox, Midori, Epiphany, Chrome or Chromium use: ITWPsynopsL4= Opera family browsers like Opera use: ITWPtrademarks=All third-party trademarks are the property of their respective owners # files descriptions FILEpipe=Contains in and out pipe for native2java communication and (if enabled) debugging pipe. FILEmozillauser=Location of plugin library for user''s purposes on Mozilla compliant browser. FILEmozillaglobal64=Location of plugin library for global purposes on Mozilla compliant browser, 64-bit systems. FILEmozillaglobal32=Location of plugin library for global purposes on Mozilla compliant browser, 32-bit systems. FILEopera64=Location of plugin library for global purposes on opera compliant browser, 64-bit systems. FILEopera32=Location of plugin library for global purposes on opera compliant browser, 32-bit systems. TAGSOUPtail=You may have missing tagsoup installation or your ITW was not built against it. Check your installation and/or consult distribution. TAGSOUPnotUsed=You are not using Malformed parser. If you have set {0}, remove it. Or... TAGSOUPbroken=Broken Malformed parser. TAGSOUPhtmlNotUsed=Tagsoup''s html2xml cleaning is Disabled. Remove {0}. Parsing will probably fail. TAGSOUPhtmlBroken=Tagsoup''s html2xml cleaning not loaded. Install tagsoup (and build ITW against). Parsing will probably fail. FILEcache=Contains cached runtime entries. FILErecentlyUsed=Additional information about items in cache FILEappdata=Contains saved application data. FILElogs=contains file-log files (if enabled), itw-cplugin-date_time.log for native part of plugin, itw-javantx-date_time.log for everything else. FILEicons=Location where icons of javaws applications desktop/menu launchers icons are stored FILEjnlps=Location where jnlp files generated from html pages for javaws applications desktop/menu launchers icons are stored FILEmenus=Subdirectory in users menus space, for placing custom menu shortcuts. FILEextasuser=File responsible for various actions on applets and apps based on their codebase based on users actions. FILEextasadmin=File responsible for various actions on applets and apps based on their codebase based on admins actions. FILEglobaldp=Global deployment config file. FILEtmpappdata=Contains temporary runtime files. FILElocksdir=Location of netx locks. FILEmainlock=Location of netx main lock. FILEpolicy=Contains granted permissions for selected unsigned apps. FILEusercerts=Contains various users stored certificates. FILEjavacerts=Contains various system java-wide stored certificates. FILEjavadp=java-global deployment properties file. May be affected by {0}. FILEuserdp=Users main deployment properties file. # extended policy editor EPEexpert=Expert edit EPEsave=Save and close EPEcancel=Cancel and close EPEhelp1=add/remove rules EPEhelp2=select rule type EPEhelp3=select decision EPEhelp4=modify field manually EPEhelp5=Double click first two columns to launch rule editor. EPEexpertHelp=Here you can edit saved value. For most actions this do not meter, however others have really complicated statements. Edit only if you know what you are doing! But sometimes it is a bit obvious... EPEexpertHint=Carefully edit saved values: APPEXTSECappletSecurityLevelExtraHighId=Disable running of all Java applets APPEXTSECappletSecurityLevelVeryHighId=Very High Security APPEXTSECappletSecurityLevelHighId=High Security APPEXTSECappletSecurityLevelLowId=Low Security APPEXTSECappletSecurityLevelExtraHighExplanation=No applet will be run APPEXTSECappletSecurityLevelVeryHighExplanation=No unsigned applets will be run APPEXTSECappletSecurityLevelHighExplanation=User will be prompted for each unsigned applet APPEXTSECappletSecurityLevelLowExplanation=All, even unsigned, applets will be run APPEXTSECunsignedAppletActionAlways=Always trust this (matching) applet(s) APPEXTSECunsignedAppletActionNever=Never trust this (matching) applet(s) APPEXTSECunsignedAppletActionYes=This applet was visited and allowed APPEXTSecunsignedAppletActionSandbox=This applet was visited and allowed to run with restricted privileges APPEXTSECunsignedAppletActionNo=This applet was visited and denied APPEXTSECControlPanelExtendedAppletSecurityTitle=Extended applet security APPEXTSECguiTableModelTableColumnRD=Remembered decisions APPEXTSECguiTableModelTableColumnDateOfAction=Date of action APPEXTSECguiTableModelTableColumnDocumentBase=Document-base APPEXTSECguiTableModelTableColumnCodeBase=Code-base APPEXTSECguiTableModelTableColumnArchives=Archives APPEXTSECguiPanelAppletInfoHederPart1={0} {1} APPEXTSECguiPanelAppletInfoHederPart2={0} from {1} APPEXTSECguiPanelConfirmDeletionOf=Are you sure you want to delete following {0} items APPEXTSECguiPanelHelpButton=Help APPEXTSECguiPanelSecurityLevel=Security Level APPEXTSECguiPanelGlobalBehaviourCaption=Settings of global behavior for applets APPEXTSECguiPanelDeleteMenuSelected=selected APPEXTSECguiPanelDeleteMenuAllA=all allowed (A) APPEXTSECguiPanelDeleteMenuAllN=all forbidden (N) APPEXTSECguiPanelDeleteMenuAlly=all approved (y) APPEXTSECguiPanelDeleteMenuAlln=all rejected (n) APPEXTSECguiPanelDeleteMenuAllAll=absolute all APPEXTSECguiPanelDeleteButton=Delete APPEXTSECguiPanelDeleteButtonToolTip=You can press delete key during browsing the table. It will act as delete selected APPEXTSECguiPanelTestUrlButton=Test url APPEXTSECguiPanelAddRowButton=Add new row APPEXTSECguiPanelValidateTableButton=Validate table APPEXTSECguiPanelAskeforeActionBox=Ask me before action APPEXTSECguiPanelShowRegExesBox=Show full regular expressions APPEXTSECguiPanelInverSelection=Invert selection APPEXTSECguiPanelMoveRowUp=Move row up APPEXTSECguiPanelMoveRowDown=Move row down APPEXTSECguiPanelCustomDefs=User definitions APPEXTSECguiPanelGlobalDefs=System definitions APPEXTSECguiPanelDocTest=Type document base URL APPEXTSECguiPanelCodeTest=Type code base URL APPEXTSECguiPanelNoMatch=Nothing matched APPEXTSECguiPanelMatchingNote=Please note, that only first matched result will be considered as result. APPEXTSECguiPanelMatched=Matched APPEXTSECguiPanelMatchingError=Error during matching: {0} APPEXTSECguiPanelCanNotValidate=Cannot validate, cannot create tmp file - {0} APPEXTSECguiPanelEmptyDoc=All document-bases must be full APPEXTSECguiPanelEmptyCode=All code-bases must be full APPEXTSECguiPanelTableValid=Table looks valid APPEXTSECguiPanelTableInvalid=Invalid with following error: {0} APPEXTSECguiPanelShowOnlyPermanent=Show only permanent records APPEXTSECguiPanelShowOnlyTemporal=Show only previously temporarily decided records APPEXTSECguiPanelShowAll=Show all records APPEXTSECguiPanelShowOnlyPermanentA=Show only allowed permanent records APPEXTSECguiPanelShowOnlyPermanentN=Show only forbidden permanent records APPEXTSECguiPanelShowOnlyTemporalY=Show previously allowed applets records APPEXTSECguiPanelShowOnlyTemporalN=Show previously denied applets records APPEXTSEChelpHomeDialogue=Dialogue APPEXTSEChelp= \

    Help for Extended applet security - itw-settings, files and structures, dialogue

    \

    \ Extended Applet Security refers to security features for unsigned applets. Traditionally, only signed applets required user confirmation and unsigned applets ran automatically. This is represented by the ''low security'' setting. Unsigned applets must be allowed or disallowed individually on ''high security'' (the default), and additionally do not run at all on ''very high security''. In theory, unsigned applets can safely run automatically. In practice, however, any vulnerability in the Java security sandbox will prevent this from being true. \

    \

    \ To do so it uses the Security Level main settings switch rules in the tables of Custom definitions and Global definitions
    \ You can read much more about development of (and help us to improve!) this feature at
    dedicated IcedTea-Web page \

    \

    Security Level

    \

    \ Its a main switch for "extended applet security". Its value is commonly stored in users_home/.icedtea/deployment.properties, but can be enforced via global settings in /etc/.java/deployment/deployment.properties or JAVA_HOME/lib/deployment.properties under the key deployment.security.level
    \

  • Disable running of all Java applets - stored as DENY_ALL - No applet will be run
    \
    \ No applet will be allowed to run. However the Java virtual machine will always be executed (and an error screen with reason appear instead of applets). To disable Java completely you can uninstall IcedTea-Web or disable it in your browser (if supported). The tables with records are of course ignored. \
    \
  • Very High Security - stored as DENY_UNSIGNED - No unsigned applets will be run
    \
    \ No applet unsigned will be allowed to run (and an error screen with reason will appear instead of such applets). The tables with records are of course again ignored. \
    \
  • High Security - stored as ASK_UNSIGNED - User will be prompted for each unsigned applet
    \
    \ All unsigned applets will be tested against the tables below if they should be allowed or forbidden to run. If they are not matched in the table then the user is prompted and the decision is stored in tables below. If the user denies the applet, an error screen with reason appears and the applet does not run. If the user allows applets to run, the user can choose to save this decision and whether to allow just one applet or a whole group of applets (see Dialogue paragraph below). \
    This is default behavior. \
    \
  • Low Security - stored as ALLOW_UNSIGNED - All, even unsigned, applets will be run
    \
    \ All applets even unsigned will be allowed to run. User will not be warned and the tables with records are of course again ignored. \
    \ You need to press ok or apply button to make the changes take effect. \

    \ \ \

    Table with recorded actions

    \

    \

    Custom x Global table

    \ After each action in High Security dialogue the record is added to, or updated in, the table or configuration file. Commonly in users file - home/.icedtea/.appletTrustSettings - "Custom definition" panel.
    \ But superuser can specify default behavior in /etc/.java/deployment/ .appletTrustSettings - "Global definition" panel.
    \

    "Syntax"

    \
  • Action - Desired behavior when applet is matched
    \
    \
  • Always trust this applet - This unsigned applet will always be run in High Security Security Level. It is stored as A in .appletTrustSettings
    \
  • Never trust this applet - This unsigned applet will never be run in High Security Security Level. It is stored as N in .appletTrustSettings
    \
  • Visited and allowed - When the user is asked about this applet again, a note that this applet was already trusted in past will be displayed. It is stored as y in .appletTrustSettings
    \
  • Visited and denied - When user will be asked about this applet again, he will see information that this applet was already denied in past. It is stored as n in .appletTrustSettings
    \
  • \
  • Date - date of last action on this item (read only item)
    \
  • Document base - is the page from which the applet was requested. It is actually a regular expression to match a specific URL. See about regular expressions and their usage lower
    \
  • Code base - is the URL where an applets code came from. It is actually a regular expression to match a specific URL. See about regular expressions and their usage lower
    \
  • Archives - coma separated list of archives with applet''s code. Can be empty if source code are just classes or group of applets is allowed
    \
    \ When you change a value in the table, its effect is immediate. \

    Controls of tables

    \

    \

  • Delete - deletes items as specified in combo box on side
    \
    \
  • selected - removes all selected items. Key Del does the same. Default behavior. Multiple selections allowed. Selection can be inverted by button even more on side
    \
  • all allowed (A) - removes all permanently trusted records
    \
  • all forbidden (N) - removes all permanently forbidden records
    \
  • all approved (y) - removes all previously (temporarily) trusted records
    \
  • all rejected (n) - removes all previously (temporarily) denied records
    \
  • all - will clear the table
    \
    \ Ask me before action - switch to ask before each deletion (in bulk) or not to ask. Asking dialogue can be pretty long, so if you do not see the buttons, just press Esc \
  • \
  • Show full regular expressions - Disable or Enable filtering of quotation marks \Q\E in code/document base columns. About regular expressions see more lower
    \
    \
  • Filtering in table(s)
    \
    \
  • Show only permanent records - Shows only permanently allowed (A) or denied (N) records. Default behavior
    \
  • Show only temporarily decided records - Shows only once allowed (y) or denied (n) informative records.
    \
  • Show only permanently allowed records - Shows only permanently allowed (A) records
    \
  • Show only permanently denied records - Shows only permanently denied (N) records
    \
  • Show only temporarily allowed records - Shows only once allowed (y) informative records.
    \
  • Show only temporarily denied records - Shows only once denied (n) informative records.
    \
  • \

    \
  • Add new row - will add new, exemplary filled, row with current date and empty archives
    \
  • Validate table - will test if table can save, load, and if each value is valid:
    \
    \
  • Action - is one of A,N,y,n
    \
  • Date - is valid date
    \
  • Code base and document base - are valid regular expressions or empty
    \
  • Archives - coma separated list of archives or empty
    \
  • \
  • Test url - In two dialogues (in two steps) will let you enter document base and codebase, and then try to match them against all records. All matching items are returned! Last values are remembered> \
  • Move row down/up
    \
    \ Order of rows is important. First matched result is returned (permanent have priority). So you can prioritize your matches using these buttons.
    \ For example, if you \Qhttp://blogs.com/\E.* regular expression to allow all applets on http://blogs.com, then it must be AFTER your \Qhttp://blogs.com/evilJohn\E.* regular expression forbidding all applets from blog of hacker evilJohn. \
    \

    \

    \

    Dialogue

    \ If High Security is set, and a new unsigned applet is hit then the dialogue is shown asking you to allow it or deny it. You can also choose if you want to allow or deny this applet every-time (A or N) you encounter it or for just one run (y,n).
    \ You can also select to trust or deny (again temporarily or permanently) all the applets from same, exact, codebase. If you are visiting one page, which has various applets on various documents then this is a choice for you.
    \ If you decide not to allow remembering your decision, then just a temporary record is made. If you revisit a page, a small green or red label will inform you about your last decision.
    \ Once you select remember your decision, the dialog will never appear again. But you can edit your decision in itw-settings application table (packed with IcedTea-Web). If you change your decision to temporary one (n,y) or delete its row, the dialogue will appear again. Of course you can switch also from Always to Never or vice versa. \
    \ The dialogue always mentions the page on which an applet is displayed, and the URL from which it comes. There is also a hint, if you have ever visited this applet saying if you have allowed or rejected it in the past
    \
    \

    Controls

    \
    \
  • Remember this option - If set, then dialogue will never be shown for this applet or page again. \
    \
  • For applet - Exact applet will be allowed or denied \
  • For site - All applets from this place will be allowed or denied \
  • \
  • Proceed - Applets, as selected above will be allowed \
  • Cancel - Applets, as selected above will be forbidden \
  • \ Be aware to "proceed" + "Remember this option" + "For site" on pages you do not know! It can make you vulnerable! \
    \

    \

    \

    Regular expressions

    \ IcedTea-Web extended applet security - uses a powerful matching engine to match exact (sets of) applets. Base stone is Quotation of URL \Q\E and wildchars like .* or .? or more.
    \ This was designed to suits the need to block or allow exact pages. The best is to show some examples:
    \ N 12.12.2012 .* \Qhttp://blogs.com/evilJohn\E.*
    \ N 12.12.2012 \Qhttp://blogs.com/goodJohn/evilApplet.html\E.* \Qhttp://blogs.com/goodJohn/\E goodJohnsArchive.jar
    \ A 12.12.2012 \Qhttp://blogs.com/\E.* \Qhttp://blogs.com/\E.*
    \ N 12.12.2012 .* \Qhttp://adds.com\E.*
    \ Y 12.12.2012 .* \Qhttp://www.walter-fendt.de/ph14_jar/\E
    \
    \ So this table, created 12.12.2012:
    \
  • Forbid all stuff which have some code on http://blogs.com/evilJohn pages
    \
  • Forbidding also one exact applet from http://blogs.com/goodJohn/ with archive goodJohnsArchive.jar
    \
  • Allowing all (other) applets from http://blogs.com/ but only when displayed also on http://blogs.com/
    \
  • Forbidding all applets with code saved on http://adds.com (except on http://blogs.com/ - to have forbidden http://adds.com also on http://blogs.com/, this (http://adds.com) record must be above blogs record)
    \
  • And finally allowing all nice physical applets on walter-fendt''s pages
    \
    \ Note - the date saved in .appletTrustSettings has a not so nice format, but I left this for now...
    \
    \ All information about full regular expression syntax can be found on http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html \

    \

    Conclusion

    \

    \ Stay tuned to our homepage at {0}!
    \ If you encounter any bug, feel free to file it in our bugzilla ... According to policy
    \
    \ Safe browsing from your IcedTea-Web team... \

    \ \ icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/question.png0000644000000000000000000000013213441742745024644 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.228253501 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/question.png0000644000175000002070000000474013441742745025461 0ustar00jvanekmock00000000000000‰PNG  IHDR77ЈлвFsRGBЎЮщbKGDџџџ НЇ“ pHYs  šœtIMEл:‡k,tEXtCommentCreated with GIMPW ;IDAThоэZmlхџ=wінљ5Бз…&щк”z}hc+Є ‚ŠHtKY5СІЁћ0iDlh*]'„ДнŠФŠЈвmlR"Єn“&Qi !CэвЄ/iЛЬ-mв&nlчтЗГяйпял9'vДN{ЄГяўїмsЯяџўžўпnЭF–ц5ЋјыОbOЪS>‹пяћѓдRМ•]‚wxз>і§gэСцG–…:КyЮ§Хlr&‘Мљљ€м-+9Ј3иВyчЯЪ/oc­v'kхљ\:‘HDЧ/пэп?ќЮЯШмr’ѓ‡:ƒЫ7uэ ЌпњЈрє,V^ ca8оЦЛš‚Гi У;œ7/}:P/ ж œwеƒЯюmэјі“Ќ•ЗЉ:B@aa!œЫуk\БaуфЙўёtьњ?o pўPg0дѕТKСwБXЉF 'иoЛЋЋcъ\џTВ5ЗБЏюмуmйЮймоy-œЌUАпіЅЎŽЉѓ§7RБыgjЉЂь’Ѓe&aхэўіћB6џŠЬф™‡j]`&чhєёпj›oEfђlmВџ Р ЕШ.иц{ќkM#еЌ&ѕЊћќ_•Ў[з€нYЈ2КўМœч4Ю„ “ˆE>ўЭŽчЂ—‡–Зж:HЎ"0Гь#eЮ Ќ1L,Ш‹ВuƘF–уэў5ї…lо…й [SчAjŸ­rіљmpбрД\qУжGMKŒ”8Ъб+œгуklйАqъ\џx5™ŒY>{7ьxy_[чSпвьЂ\`жбИ ЋэhёY`чD9œШрНSГИ4))9Їђ-SЮ(NfяŽчЂ—‡ўdІš`ЭH,дѕТKСMJЎh’6Пxм‡mыœИ-Ќ X†РС3hёYёPШХ№е ВВ жS€Е(™ŒЩ8Шж\А №ђMXщчЪЋ !XЕŒУJП&Mы–™8h\Ёl)ЮючБЅGж9№рv­Л”ЃKсТ 6ŽРЩ3кНц ЦcY„#йвуЃД zZђхRЅ0С.Њl)г~АЅ^G~шlŽтљwІpфє,ЦRјл№,.­MV­П“g№Сљdu1Ь„ŠВЕЮ<гб–ЩГ§“БŽœž-˜.NJxlЃSЃ98‡OŠ5ЯE-41™јшњќфpaqk:1WcЌE,Е,"Уu,kmo^ПѕG0rxїz/Њ ыlОЛЉ­уЩнu|s1™ЅРtBжŽЄDч№с™ŽДњ jyўzGЯ% аbw{­vO›аˆO €jйЌ?tяCž–ЛЖXЌЮ†zeTјс§шlЗшo}VНJъН(!6пђVїђЕ]-_{z•Q-СйаjБЛ=„!ŒщЏЯцiхдРХќt›Ёfо@?p<†SWвхЧGAнiё;еЊ„X­‚Ую]ў…Ыoкчиœl2™]!РЗz РЄХoFёб…dщчˆ‘q”–Ш] @‰B*tШKщњP*#FУR"Ѕ2•ЌweВ—Юv6н!hз‰ŒŒŸНAп…d~‚Ъ$Љ™БЉюPЅ")вёHTpљfŠ%—›щџ{уэЋяќСjŠЦ@ZP…‘ ”ЂcЕ1TіžˆсьxFG~ц4Wƒ.дЦг$Ї{FЯlZŒŽо§ЧTlттo™'9)ё™•wOАБђ6u,Bєо*ZЎ{ъ&Aђ§еk…УOon€+˜ђЋGЃHІѓї‰6бТdЉL;QhВ‚XVJzJ œ”L"9БяЯЧЏ9 WnCœ›<г7`— `™ыЈ&Žќ€T™8UаB œ$ъа”€*рр rrёYY[w ЊhфМнPхY€*в,aзКљH‰xфупuїФЏŽєї$хвЏ;юQ‚Йрђъ_Plѓšєhб=#O 7ѕ•Іъuб8ЂрЅ†ђHJЦ#ЏwїФЏї–rm%sƒФdXЬNЯ ZЮ рnncXоFe#Ђ^+џToшВЮN(№ФнNЌmцДуьЕ ˆfЇziЬЁQ’7ѕ\[JФ#ŸОонПVиЕ4ЈhИobЅ€ЏНs;Ч)щ˜NJДB(а“Пїuc^№і'ЂцД)`4^eЉL%)Šš—Њ"V) ОQXEpР>ьB6а*ИНzНвЋŠUЊ‚_WЙO‹uе 2Ђѕ)ŒI Ѕу‘єvїФЧ+›œ pиЕJќэл­| Ѕsc/еO’ђхbЧ €žU1ЅŸ”ŠGпн3c˜)pїM\v@гЪЮэVСхUНЁaйC/IZˆ[яў\ЧŒ"н.šcŸV ї7џ5zmшаfЦ‡п4ЛHkКиbaqfFlЎ я Ж1 oг;Њ„*œ -у`Šizq˜Нqсш+c}Пм‡*Ж™ЋЊЄЄXXœ™yОP?iэ_79bP?b TTдIѕ^™ ›š‰ Н§'N:ˆ*їЯЋ.ЅXXт ЯЙ‚М3шИЌe*-—Ke€ъЯe%œф ЯЉtѕ<НrВwџфљ#Џa,Ј–baQLŠƒч ђŽ`ax[ЅxW|P”Ъ‰щБбЉБЃЏќћи\U4ЛЫГр_Š…E1%rМ+(иƒmЄh!‰”)ёш<хЁиЅŒЫZхnиЂїчЄXXœM‹ƒч кœС6FHЊмшбžXнеrРL я ЖБ–|5af_„дXMРщђ:€ХЊFцЉmk ЌfрŠ :5ГУU`5ЇœМ№—уМћі5юрЦѕЅVЦU”*-›ŽG†о§ю‹зGЊcK NiЩШићя[ў`ё–7Q~ВщxффЁ=тс^дсћЏz}ћ•JцВЧ‰”^aoliжT”Rš_Ж $1=6zхдС§“ЃG^У-іaЄXXLц2Ч8ЮД№*чd€œ4;“Œ]О8юлW*@зВе§KYЧВ{ўіžтнЫW3 з˜KЧ'вёЋ'ТП>\O`Kйx‹рiРв|ЁћПнўkŠЗ \WcIENDЎB`‚icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/Messages_pl.properties0000644000000000000000000000013213441742745026647 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.227253503 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/Messages_pl.properties0000644000175000002070000015373713441742745027477 0ustar00jvanekmock00000000000000# Polish UI messages for netx # L=Launcher, B=Boot, P=Parser, C=cache S=security # # General NullParameter=Parametr zerowy ButAllow=Pozw\u00f3l ButBrowse=Przegl\u0105daj... ButCancel=\u00a0Anuluj\u00a0 ButClose=Zamknij ButCopy=Kopiuj do schowka ButMoreInformation=Wi\u0119cej\u00a0informacji... ButOk=OK ButProceed=Kontynuuj ButRun=Uruchom ButSandbox=Do piaskownicy ButApply=Zastosuj ButDone=Gotowe ButShowDetails=Poka\u017c szczeg\u00f3\u0142y ButHideDetails=Chowaj szczeg\u00f3\u0142y ButYes=Tak ButNo=Nie CertWarnRunTip=Ufaj temu applet-owi i uruchom CertWarnSandboxTip=Nie ufaj temu applet-owi i uruchom go z ograniczonymi uprawnieniami CertWarnCancelTip=Nie uruchamiaj tego applet-u. CertWarnPolicyTip=Zaawansowane ustawienia piaskownicy CertWarnPolicyEditorItem=Startuj edytor wytycznej AFileOnTheMachine=plik na komputerze AlwaysAllowAction=Zawsze zezwalaj na t\u0105 akcj\u0119 Usage=Stosowanie: Error=B\u0142\u0105d Warning=Ostrze\u017cenie Continue=Czy chcesz kontynuowa\u0107? Field=Pole From=Od Name=Nazwa Password=Has\u0142o: Publisher=Wydawca Unknown= Username=U\u017cytkownik: Value=Warto\u015b\u0107 Version=Wersja # about dialogue AboutDialogueTabAbout=O AboutDialogueTabAuthors=Autorzy AboutDialogueTabChangelog=Dziennik zmian AboutDialogueTabNews=Nowo\u015bci AboutDialogueTabGPLv2=GPLv2 # missing permissions dialogue MissingPermissionsMainTitle=Aplikacji \u201e{0}\u201d \ z \u201e{1}\u201d brakuje atrybut \u201epermissions\u201d. Aplikacjom bez tego atrybutu nie powinno si\u0119 ufa\u0107.
    \ Czy chcesz zezwoli\u0107 na uruchomienie tej aplikacji? MissingPermissionsInfo=Wi\u0119cej informacji uzyskasz na:
    \ \ JAR File Manifest Attributes
    \ i
    \ \ Preventing the repurposing of Applications # missing Application-Library-Allowable-Codebase dialogue ALACAMissingMainTitle=Aplikacja \u201e{0}\u201d \ z \u201e{1}\u201d pobiera zasoby z nast\u0119puj\u0105cych obcych lokalizacji:
    \ {2}
    \ Czy na pewno chcesz uruchomi\u0107 t\u0105 aplikacj\u0119? ALACAMissingInfo=Wi\u0119cej informacji uzyskasz na:
    \ \ JAR File Manifest Attributes
    \ i
    \ \ Preventing the Repurposing of an Application # matching Application-Library-Allowable-Codebase dialogue ALACAMatchingMainTitle=Aplikacja \u201e{0}\u201d \ z \u201e{1}\u201d pobiera zasoby z nast\u0119puj\u0105cych obcych lokalizacji:
    \ {2}
    \ Czy na pewno chcesz uruchomi\u0107 t\u0105 aplikacj\u0119? ALACAMatchingInfo=Wi\u0119cej informacji uzyskasz na:
    \ \ JAR File Manifest Attributes
    \ i
    \ \ Preventing the Repurposing of an Application # LS - Severity LSMinor=Mniejszy LSFatal=Fatalny # LC - Category LCSystem=B\u0142\u0105d systemowy LCExternalLaunch=Zewn\u0119trzny b\u0142\u0105d startowy LCFileFormat=B\u0142\u0119dny format pliku LCReadError=B\u0142\u0105d odczytu LCClient=B\u0142\u0105d aplikacji LCLaunching=B\u0142\u0105d startowy LCNotSupported=Nieobs\u0142ugiwana cecha LCInit=B\u0142\u0105d inicjalizacyjny LAllThreadGroup=Wszystkie aplikacje JNLP LNullUpdatePolicy=Wytyczna aktualizacji nie mo\u017ce by\u0107 null. LThreadInterrupted=W\u0105tek przerwany podczas czekania na wystartowanie pliku. LThreadInterruptedInfo=To mo\u017ce doprowadzi\u0107 do zablokowania lub innego uszkodzenia w trakcie wykonywania. Prosz\u0119 uruchomi\u0107 ponownie aplikacj\u0119 lub przegl\u0105dark\u0119. LCouldNotLaunch=Nie mo\u017cna wystartowa\u0107 pliku JNLP. LCouldNotLaunchInfo=Nie zainicjalizowano aplikacji. Aby uzyska\u0107 wi\u0119cej informacji, uruchom javaws lub przegl\u0105dark\u0119 z wiersza polece\u0144 i wy\u015blij raport o b\u0142\u0119dzie. LCantRead=Nie mo\u017cna odczyta\u0107 lub przeprowadzi\u0107 analizy sk\u0142adni pliku JNLP. LCantReadInfo=Mo\u017cesz spr\u00f3bowa\u0107 r\u0119cznie pobra\u0107 ten plik i wys\u0142a\u0107 go razem ze zg\u0142oszeniem b\u0142\u0119du do zespo\u0142u IcedTea-Web. LNullLocation=Nie mo\u017cna ustali\u0107 lokalizacj\u0119 pliku .jnlp. LNullLocationInfo=Podj\u0119to pr\u00f3b\u0119 wystartowania pliku JNLP w innej JVM, lecz nie mo\u017cna by\u0142o zlokalizowa\u0107 plik. Aby wystartowa\u0107 w zewn\u0119trznej JVM, uruchomienie programowe musi by\u0107 w stanie zlokalizowa\u0107 plik .jnlp albo w lokalnym systemie plik\u00f3w czy na serwerze. LNetxJarMissing=Nie mo\u017cna ustali\u0107 lokalizacj\u0119 javaws.jar. LNetxJarMissingInfo=Podj\u0119to pr\u00f3b\u0119 wystartowania pliku JNLP w innej JVM, lecz nie mo\u017cna by\u0142o zlokalizowa\u0107 javaws.jar. Aby wystartowa\u0107 w zewn\u0119trznej JVM, uruchomienie programowe musi by\u0107 w stanie zlokalizowa\u0107 plik javaws.jar. LNotToSpec=Plik JNLP nie spe\u0142nia \u015bci\u015ble specyfikacji. LNotToSpecInfo=Plik JNLP zawiera dane, kt\u00f3re s\u0105 zabronione wed\u0142ug specyfikacji JNLP. Uruchomienie programowe mo\u017ce pr\u00f3bowa\u0107 ignorowa\u0107 niepoprawne informacje i kontynuowa\u0107 startowanie pliku. LNotApplication=Brak pliku applet-owego. LNotApplicationInfo=Podj\u0119to pr\u00f3b\u0119 za\u0142adowania innego pliku ni\u017c applet-owego jako aplikacj\u0119. LNotApplet=Brak pliku applet-owego. LNotAppletInfo=Podj\u0119to pr\u00f3b\u0119 za\u0142adowania innego pliku ni\u017c applet-owy jako applet. LNoInstallers=Brak obs\u0142ugi instalator\u00f3w. LNoInstallersInfo=Pliki instalacyjne JNLP nie s\u0105 jeszcze obs\u0142ugiwane. LInitApplet=Nie mo\u017cna zainicjalizowa\u0107 applet-u. LInitAppletInfo=Aby uzyska\u0107 wi\u0119cej informacji kliknij na przycisk \u201eWi\u0119cej\u00a0informacji\u201d. LInitApplication=Nie mo\u017cna zainicjalizowa\u0107 aplikacj\u0119. LInitApplicationInfo=Nie zainicjalizowano aplikacji. Aby uzyska\u0107 wi\u0119cej informacji, uruchom javaws z wiersza polece\u0144. LNotLaunchable=Plik JNLP nie do uruchomienia. LNotLaunchableInfo=Plik musi by\u0107 typu aplikacja, applet lub instalator JNLP. LCantDetermineMainClass=Klasa g\u0142\u00f3wna nieznana. LCantDetermineMainClassInfo=Nie da\u0142o si\u0119 ustali\u0107 klasy g\u0142\u00f3wnej tej aplikacji. LUnsignedJarWithSecurity=Nie mo\u017cna nada\u0107 uprawnie\u0144 niepodpisanym plikom jar. LUnsignedJarWithSecurityInfo=Aplikacja za\u017c\u0105da\u0142a uprawnie\u0144 bezpiecze\u0144stwa, lecz pliki jar nie s\u0105 podpisane. LUnsignedApplet=Applet by\u0142 niepodpisany. LUnsignedAppletPolicyDenied=Applet by\u0142 niepodpisany, a wytyczna bezpiecze\u0144stwa wstrzyma\u0142a jego uruchomienie. LUnsignedAppletUserDenied=Applet by\u0142 niepodpisany i nie zaufano mu. LPartiallySignedApplet=Applet by\u0142 cz\u0119\u015bciowo podpisany. LPartiallySignedAppletUserDenied=Applet by\u0142 cz\u0119\u015bciowo podpisany, a u\u017cytkownik mu nie zaufa\u0142. LSignedJNLPAppDifferentCerts=Aplikacja JNLP nie jest w pe\u0142ni podpisana jednym certyfikatem. LSignedJNLPAppDifferentCertsInfo=Komponenty tej aplikacji JNLP podpisano indywidualnie, jednak musi by\u0107 wsp\u00f3lny podpisuj\u0105cy dla wszystkich wpis\u00f3w. LSignedAppJarUsingUnsignedJar=Podpisana aplikacja u\u017cywa niepodpisane pliki jar. LSignedAppJarUsingUnsignedJarInfo=G\u0142\u00f3wny jar aplikacji jest podpisany, lecz niekt\u00f3re pliki jar kt\u00f3re u\u017cywa nie s\u0105. LRunInSandboxError=Wywo\u0142anie do uruchomienia w piaskownicy wykonano za p\u00f3\u017ano. LRunInSandboxErrorInfo=Polecono \u0142adowarce klas uruchomi\u0107 applet w piaskownicy, lecz ustawienia bezpiecze\u0144stwa zosta\u0142y ju\u017c zainicjalizowane. LSignedJNLPFileDidNotMatch=Podpisany plik JNLP nie pasuje do starowanego pliku JNLP. LNoSecInstance=B\u0142\u0105d: Brak instancji bezpiecze\u0144stwa dla {0}. Aplikacja mo\u017ce dozna\u0107 problem\u00f3w w kontynuowaniu LCertFoundIn=Znalezino {0} w cacerts ({1}) LSingleInstanceExists=Inna instancja tego applet-u ju\u017c istnieje, a wy\u0142\u0105cznie jedna mo\u017ce by\u0107 wykonywana r\u00f3wnocze\u015bnie. JNotApplet=Plik nie jest applet-em. JNotApplication=Plik nie jest aplikacj\u0105. JNotComponent=Plik nie jest komponentem. JNotInstaller=Plik nie jest instalatorem. JInvalidExtensionDescriptor=Rozszerzenie nie odnosi si\u0119 do komponentu lub instalatora (nazwa={1}, lokalizacja={2}). LNotVerified=Nie zweryfikowano plik\u00f3w jar. LCancelOnUserRequest=Anulowano na \u017c\u0105danie u\u017cytkownika. LFatalVerification=Wyst\u0105pi\u0142 b\u0142\u0105d krytyczny podczas pr\u00f3bowania zweryfikowa\u0107 pliki jar. LFatalVerificationInfo=Wyrzucono wyj\u0105tek w klasie JarCertVerifier. Brak mo\u017cliwo\u015bci odczytu plik\u00f3w cacerts lub trusted.certs jest jedn\u0105 mo\u017cliw\u0105 przyczyn\u0105 tego wyj\u0105tku. LNotVerifiedDialog=Nie wszystkie pliki jar zweryfikowano. LAskToContinue=Czy mimo to chcesz kontynuowa\u0107 wykonywanie tej aplikacji? # Parser PInvalidRoot=Element bazowy nie jest elementem \u201ejnlp\u201d. PNoResources=Brak elementu \u201eresources\u201d. PUntrustedNative=Element \u201enativelib\u201d nie mo\u017ce wyst\u0119powa\u0107 bez za\u017c\u0105dania bezpiecznego \u015brodowiska. PExtensionHasJ2SE=Element \u201ej2se\u201d nie mo\u017ce wyst\u0119powa\u0107 w pliku rozszerzenia komponentu. PInnerJ2SE=Element \u201ej2se\u201d nie mo\u017ce wyst\u0119powa\u0107 wewn\u0105trz elementu \u201ej2se\u201d. PTwoMains=Atrybut \u201emain\u201d wyst\u0119puje podw\u00f3jnie na elemencie \u201eresources\u201d (mo\u017ce wyst\u0119powa\u0107 wy\u0142\u0105cznie jeden raz) PNativeHasMain=Atrybut \u201emain\u201d nie mo\u017ce wyst\u0119powa\u0107 na elemencie \u201enativelib\u201d. PNoInfoElement=Brak elementu \u201einformation\u201d. PMissingTitle=Tytu\u0142 PMissingVendor=Dostawca PMissingElement=Brak sekcji \u201e{0}\u201d dla aktywnych ustawie\u0144 regionalnych, jak i warto\u015bci domy\u015blnej w pliku JNLP. PTwoDescriptions=Podw\u00f3jne elementy \u201edescription\u201d rodzaju \u201e{0}\u201d s\u0105 niedozwolone. PSharing=Element \u201esharing-allowed\u201d jest niedozwolony w powszechnym pliku JNLP. PTwoSecurity=Wy\u0142\u0105cznie jeden element \u201esecurity\u201d jest dozwolony w pliku JNLP. PEmptySecurity=Element \u201esecurity\u201d wyst\u0119puje bez zawierania elementu \u201epermissions\u201d. PTwoDescriptors=Wy\u0142\u0105cznie jeden element \u201eapplication-desc\u201d jest dozwolony w pliku JNLP. PTwoDesktops=Wy\u0142\u0105cznie jeden element \u201edesktop\u201d jest dozwolony. PTwoMenus=Wy\u0142\u0105cznie jeden element \u201emenu\u201d jest dozwolony. PTwoTitles=Wy\u0142\u0105cznie jeden element \u201etitle\u201d jest dozwolony. PTwoIcons=Wy\u0142\u0105cznie jeden element \u201eicon\u201d jest dozwolony. PTwoUpdates=Wy\u0142\u0105cznie jeden element \u201eupdate\u201d jest dozwolony. PUnknownApplet=Nieznany applet PBadWidth=Nieprawid\u0142owa szeroko\u015b\u0107 applet-u PBadHeight=Nieprawid\u0142owa wysoko\u015b\u0107 applet-u PUrlNotInCodebase=Po\u015bredni URL nie wskazuje na podkatalog bazy kodu. (w\u0119ze\u0142={0}, href={1}, baza={2}) PBadRelativeUrl=Nieprawid\u0142owy po\u015bredni URL (w\u0119ze\u0142={0}, href={1}, baza={2}) PBadNonrelativeUrl=Nieprawid\u0142owy bezpo\u015bredni URL (w\u0119ze\u0142={0}, href={1}) PNeedsAttribute=Na elemencie \u201e{0}\u201d musi wyst\u0119powa\u0107 atrybut \u201e{1}\u201d. PBadXML=Nieprawid\u0142owa sk\u0142adnia dokumentu XML. PBadHeapSize=Nieprawid\u0142owa warto\u015b\u0107 wielko\u015bci sterty ({0}) # Runtime BLaunchAbout=Startowanie okna O... BLaunchAboutFailure=Nie mo\u017cna otworzy\u0107 okna O... BNeedsFile=Potrzebny plik .jnlp RNoAboutJnlp=Nie znaleziono pliku about.jnlp BFileLoc=Lokalizacja pliku JNLP BBadProp=B\u0142\u0119dny format w\u0142a\u015bciwo\u015bci \u201e{0}\u201d (powinien by\u0107 klucz=warto\u015b\u0107) BBadParam=B\u0142\u0119dny format parametru \u201e{0}\u201d (powinien by\u0107 nazwa=warto\u015b\u0107) BNoDir=Katalog \u201e{0}\u201d nie istnieje. BNoCodeOrObjectApplet=Na znaczniku applet musi wyst\u0119powa\u0107 atrybut \u201ecode\u201d lub \u201eobject\u201d. RNoResource=Brak zasobu: {0} RShutdown=Ten wyj\u0105tek aby zapobiec zamkni\u0119ciu JVM, lecz proces ten zako\u0144czono. RExitTaken=Klasa zako\u0144czenia ju\u017c nastawiona i wywo\u0142uj\u0105cy nie jest klas\u0105 zako\u0144czenia. RCantReplaceSM=Wymiana SecurityManager jest niedozwolona. RCantCreateFile=Nie mo\u017cna utworzy\u0107 pliku \u201e{0}\u201d RCantDeleteFile=Nie mo\u017cna usun\u0105\u0107 pliku \u201e{0}\u201d RCantOpenFile=Nie mo\u017cna otworzy\u0107 pliku \u201e{0}\u201d RCantWriteFile=Nie mo\u017cna zapisa\u0107 pliku \u201e{0}\u201d RFileReadOnly=Otwieranie pliku w trybie wy\u0142\u0105cznie do odczytu RExpectedFile=Oczekiwano \u201e{0}\u201d bycie plikiem, lecz nie by\u0142o RRemoveRPermFailed=Brak powodzenia przy usuwaniu praw odczytu z pliku \u201e{0}\u201d RRemoveWPermFailed=Brak powodzenia przy usuwaniu praw zapisu z pliku \u201e{0}\u201d RRemoveXPermFailed=Brak powodzenia przy usuwaniu praw wykonawczych z pliku \u201e{0}\u201d RGetRPermFailed=Brak powodzenia przy pozyskiwaniu praw odczytu dla pliku \u201e{0}\u201d RGetWPermFailed=Brak powodzenia przy pozyskiwaniu praw zapisu dla pliku \u201e{0}\u201d RGetXPermFailed=Brak powodzenia przy pozyskiwaniu praw wykonawczych dla pliku \u201e{0}\u201d RCantCreateDir=Nie mo\u017cna utworzy\u0107 katalogu \u201e{0}\u201d RCantRename=Nie mo\u017cna przemianowa\u0107 \u201e{0}\u201d w \u201e{1}\u201d RDenyStopped=Zatrzymane aplikacje nie posiadaj\u0105 praw dost\u0119pu. RExitNoApp=Nie mo\u017cna zako\u0144czy\u0107 maszyny wirtualnej Java (JVM) poniewa\u017c nie mo\u017cna ustali\u0107 bie\u017c\u0105cej aplikacji. RNoLockDir=Nie mo\u017cna utworzy\u0107 katalogu blokuj\u0105cego ({0}) RNestedJarExtration=Nie mo\u017cna wyodr\u0119bni\u0107 zagnie\u017cd\u017conego jar-a. RUnexpected=Nie oczekiwano {0} w {1} RConfigurationError=B\u0142\u0105d fatalny podczas wczytywania konfiguracji, kontynuacja z pust\u0105. Prosz\u0119 naprawi\u0107 RConfigurationFatal=B\u0141\u0104D: Wyst\u0105pi\u0142 b\u0142\u0105d fatalny podczas \u0142adowania konfiguracji. By\u0107 mo\u017ce wymagano konfiguracj\u0119 globaln\u0105, ale nie znaleziono jej. RFailingToDefault=Zawodzenie na konfiguracj\u0119 domy\u015bln\u0105 RPRoxyPacNotSupported=U\u017cycie plik\u00f3w automatycznej konfiguracji proxy (PAC) nie jest obs\u0142ugiwane. RProxyFirefoxNotFound=Nie mo\u017cna u\u017cy\u0107 ustawie\u0144 proxy Firefox-a. Zastosowano \u201eDIRECT\u201d jako typ proxy. RProxyFirefoxOptionNotImplemented=Opcja proxy \u201e{0}\u201d ({1}) przegl\u0105darki jeszcze nie jest obs\u0142ugiwana. RBrowserLocationPromptTitle=Lokalizacja przegl\u0105darki BFileInfoAuthors=Nazwiska i adresy poczty elektronicznej zas\u0142u\u017conych dla tego projektu umieszczono w pliku AUTHORS, znajduj\u0105cym si\u0119 w katalogu g\u0142\u00f3wnym IcedTea-Web. BFileInfoCopying=Kompletny egzemplarz licencji GPLv2 tego projektu umieszczono w pliku COPYING, znajduj\u0105cym si\u0119 w katalogu g\u0142\u00f3wnym IcedTea-Web. BFileInfoNews=Nowo\u015bci o wydaniach tego projektu umieszczono w pliku NEWS, znajduj\u0105cym si\u0119 w katalogu g\u0142\u00f3wnym IcedTea-Web. # Boot options, message should be shorter than this ----------------> BOUsage=javaws [-opcje-uruchomienia] BOUsage2=javaws [-opcje-sterowania] BOJnlp=Lokalizacja pliku JNLP do wystartowania (URL lub plik) BOArg=Do wiesza argument aplikacji przed wystartowaniem BOParam=Do wiesza parametr applet-u przed wystartowaniem BOProperty=Ustawia w\u0142a\u015bciwo\u015b\u0107 systemow\u0105 przed wystartowaniem BOUpdate=Sprawd\u017a dost\u0119pno\u015b\u0107 aktualizacji BOLicense=Wy\u015bwietl licencj\u0119 GPL i zako\u0144cz BOVerbose=W\u0142\u0105cz rozmowne komunikaty BOAbout=Pokazuje aplikacj\u0119 przyk\u0142adow\u0105 BOVersion=Wy\u015bwietl wersj\u0119 IcedTea-Web i zako\u0144cz BONosecurity=Wy\u0142\u0105cza bezpieczne \u015brodowisko uruchomieniowe BONoupdate=Wy\u0142\u0105cza sprawdzanie dost\u0119pno\u015bci aktualizacji BOHeadless=Wy\u0142\u0105cza okno pobierania i inne interfejsy graficzne BOStrict=W\u0142\u0105cza \u015bcis\u0142e sprawdzanie format pliku JNLP BOViewer=Pokazuje podgl\u0105d zaufanych certyfikat\u00f3w BOXml=Stosuje \u015bcis\u0142y analizator sk\u0142adniowy XML do analizy pliku JNLP BOredirect=Idzie za przekierowaniami HTTP BXnofork=Nie tw\u00f3rz nast\u0119pnej JVM BXclearcache=Wyczy\u015b\u0107 pami\u0119\u0107 podr\u0119czn\u0105 aplikacji JNLP BXignoreheaders=Pomijaj weryfikacj\u0119 nag\u0142\u00f3wk\u00f3w plik\u00f3w jar BOHelp1=Wy\u015bwietl ten komunikat i zako\u0144cz # Cache CAutoGen=Wygenerowano automatycznie - nie edytowa\u0107 CNotCacheable=Zas\u00f3b \u201e{0}\u201d jest nie do przechowania w pami\u0119ci podr\u0119cznej. CDownloading=Pobieranie CComplete=Uko\u0144czono CChooseCache=Wybierz katalog pami\u0119ci podr\u0119cznej... CChooseCacheInfo=NetX wymaga lokalizacj\u0119 do sk\u0142adowania plik\u00f3w pami\u0119ci podr\u0119cznej. CChooseCacheDir=Katalog pami\u0119ci podr\u0119cznej CCannotClearCache=Obecnie, nie mo\u017cna wyczy\u015bci\u0107 pami\u0119ci podr\u0119cznej. Spr\u00f3buj p\u00f3\u017aniej. Je\u015bli problem nadal istnieje, zamknij przegl\u0105dark\u0119/i i aplikacje JNLP. Ostatecznie, spr\u00f3buj unicestwi\u0107 wszystkie aplikacje Java. \\\n Pami\u0119\u0107 podr\u0119czn\u0105 mo\u017cesz wyczy\u015bci\u0107 za pomoc\u0105 polecenia \u201ejavaws -Xclearcache\u201d lub Pami\u0119\u0107\u00a0podr\u0119czna/Przegl\u0105daj\u00a0pliki/Wyczy\u015b\u0107 w panelu IcedTea-Web. CFakeCache=Pami\u0119\u0107 podr\u0119czna jest uszkodzona. Naprawianie. CFakedCache=Naprawiono uszkodzon\u0105 pami\u0119\u0107 podr\u0119czn\u0105. Stanowczo si\u0119 zaleca uruchomi\u0107 polecenie \u201ejavaws -Xclearcache\u201d wraz z nast\u0119puj\u0105cym ponownym uruchomieniem aplikacji.\nPami\u0119\u0107 podr\u0119czn\u0105 mo\u017cesz zar\u00f3wno wyczy\u015bci\u0107 w panelu IcedTea-Web poprzez Pami\u0119\u0107\u00a0podr\u0119czna/Przegl\u0105daj\u00a0pliki/Wyczy\u015b\u0107. # Security SFileReadAccess=Aplikacja za\u017c\u0105da\u0142a uprawnienie do odczytu \u201e{0}\u201d. Czy chcesz zezwoli\u0107 na t\u0105 akcj\u0119? SFileWriteAccess=Aplikacja za\u017c\u0105da\u0142a uprawnienie do zapisu \u201e{0}\u201d. Czy chcesz zezwoli\u0107 na t\u0105 akcj\u0119? SDesktopShortcut=Aplikacja za\u017c\u0105da\u0142a uprawnienie do utworzenia aktywatora na pulpicie. Czy chcesz zezwoli\u0107 na t\u0105 akcj\u0119? SSigUnverified=Nie mo\u017cna zweryfikowa\u0107 podpisu cyfrowego aplikacji. Aplikacja otrzyma nieograniczony dost\u0119p do komputera.\nCzy chcesz uruchomi\u0107 aplikacj\u0119? SSigVerified=Zweryfikowano podpis cyfrowy aplikacji. Aplikacja otrzyma nieograniczony dost\u0119p do komputera.\nCzy chcesz uruchomi\u0107 aplikacj\u0119? SSignatureError=Podpis cyfrowy aplikacji zawiera b\u0142\u0105d. Aplikacja otrzyma nieograniczony dost\u0119p do komputera.\nCzy chcesz uruchomi\u0107 aplikacj\u0119? SUntrustedSource=Nie zweryfikowano podpisu cyfrowego przez zaufanego wydawc\u0119. Uruchamiaj wy\u0142\u0105cznie je\u015bli ufasz pochodzeniu aplikacji. SWarnFullPermissionsIgnorePolicy=Kodowi wykonywalnemu zostan\u0105 wydane pe\u0142ne uprawnienia, ignoruj\u0105c wszelkie wytyczne Java. STrustedSource=Potwierdzono podpis cyfrowy przez zaufanego wydawc\u0119. SClipboardReadAccess=Aplikacja za\u017c\u0105da\u0142a wy\u0142\u0105czne uprawnienie do odczytu do schowka. Czy chcesz zezwoli\u0107 na t\u0105 akcj\u0119? SClipboardWriteAccess=Aplikacja za\u017c\u0105da\u0142a wy\u0142\u0105czne uprawnienie do zapisu do schowka. Czy chcesz zezwoli\u0107 na t\u0105 akcj\u0119? SPrinterAccess=Aplikacja za\u017c\u0105da\u0142a dost\u0119p do drukarki. Czy chcesz zezwoli\u0107 na t\u0105 akcj\u0119? SNetworkAccess=Aplikacja za\u017c\u0105da\u0142a zezwolenie na nawi\u0105zywanie po\u0142\u0105cze\u0144 do \u201e{0}\u201d. Czy chcesz zezwoli\u0107 na t\u0105 akcj\u0119? SNoAssociatedCertificate= SUnverified=(niezweryfikowany) SAlwaysTrustPublisher=Zawsze ufaj materia\u0142om od tego wydawcy. SHttpsUnverified=Nie zweryfikowano certyfikat HTTPS witryny internetowej. SRememberOption=Czy chcesz zapami\u0119ta\u0107 t\u0105 opcj\u0119? SRememberAppletOnly=Dla applet-u SRememberCodebase=Dla witryny {0} SUnsignedSummary=Niepodpisana aplikacja Java domaga si\u0119 uruchomienia. SUnsignedDetail=Niepodpisana aplikacja z nast\u0119puj\u0105cej lokalizacji domaga si\u0119 uruchomienia:
      {0}
    Strona, kt\u00f3ra postawi\u0142a \u017c\u0105danie:
      {1}

    Zaleca si\u0119 uruchamia\u0107 wy\u0142\u0105cznie aplikacje z zaufanych witryn. SUnsignedAllowedBefore=Zaakceptowa\u0142e\u015b ten applet poprzednio. SUnsignedRejectedBefore=Odrzuci\u0142e\u015b ten applet poprzednio. SUnsignedQuestion=Czy chcesz zezwoli\u0107 temu applet-owi na uruchomienie? SPartiallySignedSummary=Zaledwie cz\u0119\u015bci kodu tej aplikacji s\u0105 podpisane. SPartiallySignedDetail=Ta aplikacja zawiera zar\u00f3wno podpisany jak i niepodpisany kod. Cho\u0107 kod, kt\u00f3ry jest podpisany przez zaufanego dostawc\u0119 jest bezpieczny, niepodpisany kod mo\u017ce poci\u0105ga\u0107 za sob\u0105 kod, kt\u00f3ry jest poza kontrolnym zasi\u0119giem zaufanego dostawcy. SPartiallySignedQuestion=Czy chcesz kontynuowa\u0107 i mimo to uruchomi\u0107 t\u0105 aplikacj\u0119? SAuthenticationPrompt=Serwer {0} w \u201e{1}\u201d \u017c\u0105da uwierzytelnienia. Podaje komunikat: \u201e{2}\u201d SJNLPFileIsNotSigned=Ta aplikacja zawiera podpis cyfrowy, jednak startowany plik JNLP jest bez podpisu. SAppletTitle=Tytu\u0142 applet-u: {0} STrustedOnlyAttributeFailure=Aplikacja podaje \u201etrue\u201d dla Trusted-only w swoim manife\u015bcie. {0} i \u017c\u0105da poziom uprawnienia: {1}. To jest niedozwolone. STOAsignedMsgFully=Aplet zosta\u0142 podpisany ca\u0142kowicie STOAsignedMsgAndSandbox=Aplet zosta\u0142 podpisany ca\u0142kowicie i umieszczony w piaskownicy STOAsignedMsgPartiall=Aplet zosta\u0142 podpisany cz\u0119\u015bciowo STempPermNoFile=Zakaz dost\u0119pu do plik\u00f3w STempPermNoNetwork=Zakaz dost\u0119pu do sieci STempPermNoExec=Zakaz uruchamiania polece\u0144 STempNoFileOrNetwork=Zakaz dost\u0119pu do plik\u00f3w lub sieci STempNoExecOrNetwork=Zakaz uruchamiania polece\u0144 lub dost\u0119pu do sieci STempNoFileOrExec=Zakaz dost\u0119pu do plik\u00f3w lub uruchamiania polece\u0144 STempNoFileOrNetworkOrExec=Zakaz dost\u0119pu do plik\u00f3w, sieci lub uruchamiania polece\u0144 STempAllMedia=Wszystkie media STempSoundOnly=Odtwarzanie d\u017awi\u0119ku STempClipboardOnly=Dost\u0119p do schowka STempPrintOnly=Druk dokument\u00f3w STempAllFileAndPropertyAccess=Dost\u0119p do wszystkich plik\u00f3w i w\u0142a\u015bciwo\u015bci STempReadLocalFilesAndProperties=Wy\u0142\u0105cznie odczyt lokalnych plik\u00f3w i w\u0142a\u015bciwo\u015bci STempReflectionOnly=Wy\u0142\u0105cznie introspekcja Java # Security - used for the More Information dialog SBadKeyUsage=Zasoby zawieraj\u0105 wpisy dla kt\u00f3rych rozszerzenie KeyUsage certyfikatu podpisuj\u0105cego nie zezwala na podpisywanie kodu. SBadExtendedKeyUsage=Zasoby zawieraj\u0105 wpisy dla kt\u00f3rych rozszerzenie ExtendedKeyUsage certyfikatu podpisuj\u0105cego nie zezwala na podpisywanie kodu. SBadNetscapeCertType=Zasoby zawieraj\u0105 wpisy dla kt\u00f3rych rozszerzenie NetscapeCertType certyfikatu podpisuj\u0105cego nie zezwala na podpisywanie kodu. SHasExpiredCert=Podpis cyfrowy wygas\u0142. SHasExpiringCert=Zasoby zawieraj\u0105 wpisy kt\u00f3rych certyfikat podpisuj\u0105cego wyga\u015bnie za sze\u015b\u0107 miesi\u0119cy. SNotYetValidCert=Zasoby zawieraj\u0105 wpisy kt\u00f3rych certyfikat podpisuj\u0105cego nie jest jeszcze wa\u017cny. SUntrustedCertificate=Ten podpis cyfrowy wygenerowano za pomoc\u0105 niezaufanego certyfikatu. STrustedCertificate=Ten podpis cyfrowy wygenerowano za pomoc\u0105 zaufanego certyfikatu. SCNMisMatch=Oczekiwana nazwa komputera w tym certyfikacie to: \u201e{0}\u201d
    Adres pod kt\u00f3rym nawi\u0105zywane jesz po\u0142\u0105czenie: \u201e{1}\u201d SRunWithoutRestrictions=Aplikacja zostanie uruchomiona bez restrykcji bezpiecze\u0144stwa zwykle oferowanych przez Java. SCertificateDetails=Szczeg\u00f3\u0142y certyfikatu # Security - certificate information SIssuer=Wystawca SSerial=Numer seryjny SMD5Fingerprint=Odcisk MD5 SSHA1Fingerprint=Odcisk SHA1 SSignature=Podpis SSignatureAlgorithm=Algorytm podpisu SSubject=Podmiot SValidity=Wa\u017cno\u015b\u0107 # Certificate Viewer CVCertificateViewer=Certyfikaty CVCertificateType=Typ certyfikatu CVDetails=Szczeg\u00f3\u0142y CVExport=Eksportuj CVExportPasswordMessage=Wprowad\u017a has\u0142o zabezpieczaj\u0105ce plik z kluczami: CVImport=Importuj CVImportPasswordMessage=Wprowad\u017a has\u0142o dost\u0119pu do pliku: CVIssuedBy=Wystawiono przez CVIssuedTo=Wystawiono dla CVPasswordTitle=Uwierzytelnianie CVRemove=Usu\u0144 CVRemoveConfirmMessage=Czy na pewno chcesz usun\u0105\u0107 zaznaczony certyfikat? CVRemoveConfirmTitle=Zatwierdzanie usuni\u0119cia certyfikatu CVUser=U\u017cytkownik CVSystem=System # KeyStores: see KeyStores.java KS=Baza kluczy KSCerts=Zaufane certyfikaty KSJsseCerts=Zaufane certyfikaty JSSE KSCaCerts=Zaufane certyfikaty bazowe organ\u00f3w certyfikacji KSJsseCaCerts=Zaufane certyfikaty bazowe JSSE organ\u00f3w certyfikacji KSClientCerts=Certyfikaty uwierzytelnienia klient\u00f3w # Deployment Configuration messages DCIncorrectValue=W\u0142a\u015bciwo\u015b\u0107 \u201e{0}\u201d zawiera b\u0142\u0119dn\u0105 warto\u015b\u0107 \u201e{1}\u201d. Mo\u017cliwe warto\u015bci s\u0105 {2}. DCInternal=B\u0142\u0105d wewn\u0119trzny: {0} DCSourceInternal= DCUnknownSettingWithName=W\u0142a\u015bciwo\u015b\u0107 \u201e{0}\u201d jest nieznana. DCmaindircheckNotexists=Po wszystkich pr\u00f3bach, Tw\u00f3j katalog konfiguracyjny \u201e{0}\u201d nie istnieje. DCmaindircheckNotdir=Tw\u00f3j katalog konfiguracyjny \u201e{0}\u201d nie jest katalogiem. DCmaindircheckRwproblem=Nie mo\u017cna odpowiednio odczyta\u0107/zapisa\u0107 Tw\u00f3j katalog konfiguracyjny \u201e{0}\u201d. # Value Validator messages. Messages should follow "Possible values ..." VVPossibleValues=Mo\u017cliwe warto\u015bci {0} VVPossibleBooleanValues=s\u0105 \u201e{0}\u201d lub \u201e{1}\u201d. VVPossibleFileValues=to bezpo\u015brednie \u015bcie\u017cki do pliku lub katalogu. VVPossibleRangedIntegerValues=le\u017c\u0105 \u0142\u0105cznie w przedziale mi\u0119dzy {0} do {1}. VVPossibleUrlValues=to ka\u017cdy prawid\u0142owy URL, np. http://icedtea.classpath.org/hg/ # Control Panel - Main CPMainDescriptionShort=Konfiguracja IcedTea-Web CPMainDescriptionLong=Konfiguruje funkcjonowanie wtyczki do przegl\u0105darki (IcedTeaNPPlugin) i javaws (NetX) # Control Panel - Tab Descriptions CPAboutDescription=Przegl\u0105daj informacje o wersji panela sterowania IcedTea. CPNetworkSettingsDescription=Konfiguruj ustawienia sieciowe, razem ze sposobem \u0142\u0105czenia si\u0119 IcedTea-Web z internetem, czy te\u017c za po\u015brednictwem serwera proxy. CPTempInternetFilesDescription=Java sk\u0142aduje dane aplikacji dla szybszego wykonywania podczas nast\u0119pnego uruchomienia. CPJRESettingsDescription=Zarz\u0105dzaj wersjami Java Runtime Environment, jak i ustawieniami aplikacji i applet-\u00f3w Java. CPCertificatesDescription=Stosuj certyfikaty aby legitymowa\u0107 si\u0119, jak i sprawdza\u0107 to\u017csamo\u015b\u0107 certyfikat\u00f3w, organ\u00f3w certyfikacji i wydawc\u00f3w. CPSecurityDescription=Konfiguruj t\u0105 mask\u0105 ustawienia bezpiecze\u0144stwa. CPDebuggingDescription=W\u0142\u0105czaj opcje aby pom\u00f3c w usuwaniu b\u0142\u0119d\u00f3w w programie. CPDesktopIntegrationDescription=Ustaw czy zezwala\u0107 na tworzenie skr\u00f3tu na pulpicie. CPJVMPluginArguments=Ustaw argumenty maszyny wirtualnej Java (JVM) dla wtyczki. CPJVMitwExec=Ustaw maszyn\u0119 wirtualn\u0105 Java (JVM) dla IcedTea-Web \u2014 dzia\u0142aj\u0105c\u0105 najlepiej z OpenJDK CPJVMitwExecValidation=Sprawd\u017a JVM dla IcedTea-Web CPJVMPluginSelectExec=Przegl\u0105daj za JVM dla IcedTea-Web CPJVMnone=Brak wyniku sprawdzianu dla CPJVMvalidated=Wynik sprawdzianu dla CPJVMvalueNotSet=Nie ustawiono warto\u015bci. Stosowana b\u0119dzie JVM zakodowana na sztywno. CPJVMnotLaunched=B\u0142\u0105d: Nie wystartowano procesu. Zobacz komunikaty konsoli, aby uzyska\u0107 wi\u0119cej informacji. CPJVMnoSuccess=B\u0142\u0105d: Nie zako\u0144czono procesu pomy\u015blnie. Zobacz komunikaty aby uzyska\u0107 szczeg\u00f3\u0142y, przyczym Java jest \u017ale ustawiona. CPJVMopenJdkFound=Znakomicie, wykryto OpenJDK CPJVMoracleFound=Wspaniale, wykryto Oracle Java CPJVMibmFound=Dobrze, wykryto IBM Java CPJVMgijFound=Ostrze\u017cenie, wykryto gij CPJVMstrangeProcess=\u015acie\u017cka mia\u0142a proces wykonywalny, lecz go nie rozpoznano. Sprawd\u017a wersj\u0119 Java w komunikatach konsoli. CPJVMnotDir=B\u0142\u0105d: Wybrana \u015bcie\u017cka nie jest katalogiem. CPJVMisDir=Wybrana \u015bcie\u017cka jest katalogiem. CPJVMnoJava=B\u0142\u0105d: Wybrana \u015bcie\u017cka nie zawiera bin/java. CPJVMjava=Wybrana \u015bcie\u017cka zawiera bin/java. CPJVMnoRtJar=B\u0142\u0105d: Wybrana \u015bcie\u017cka nie zawiera lib/rt.jar. CPJVMrtJar=Wybrana \u015bcie\u017cka zawiera lib/rt.jar. CPJVMPluginAllowTTValidation=Sprawd\u017a JRE bezzw\u0142ocznie CPJVMNotokMessage1=Wprowadzono nieprawid\u0142ow\u0105 warto\u015b\u0107 JDK
    • {0}
    z nast\u0119puj\u0105cym komunikatem o b\u0142\u0119dzie: CPJVMNotokMessage2=Przyczyn\u0105 tego komunikatu mog\u0105 by\u0107:
    * Nie zaliczono niekt\u00f3rych sprawdzian\u00f3w
    * Wykryto inny ni\u017c OpenJDK
    Ze wzgl\u0119du na nieprawid\u0142owy JDK IcedTea-Web prawdopodobnie nie b\u0119dzie w stanie wystartowa\u0107.
    Trzeba b\u0119dzie dostosowa\u0107 lub usun\u0105\u0107 w\u0142a\u015bciwo\u015b\u0107 \u201e{0}\u201d w pliku konfiguracyjnym
    • {1}

    Przeszukaj system za OpenJDK. CPJVMconfirmInvalidJdkTitle=Nieprawid\u0142owy JDK CPJVMconfirmReset=Przywr\u00f3ci\u0107 stan domy\u015blny? CPPolicyDetail=Przegl\u0105daj i edytuj plik u\u017cytkownika wytycznej Java. Pozwala na udzielanie lub odmawianie praw applet-om, niezale\u017cnie od standardowych regu\u0142 bezpiecze\u0144stwa piaskownicy. CPPolicyTooltip=Otwiera \u201e{0}\u201d w edytorze wytycznej (policytool) CPPolicyEditorNotFound=Nie znaleziono systemowego edytora plik\u00f3w wytycznej. Sprawd\u017a, czy zmienna \u015brodowiskowa \u201ePATH\u201d rozwi\u0105zuje lokalizacj\u0119 \u201epolicytool\u201d. # Control Panel - Buttons CPButAbout=O... CPButNetworkSettings=Ustawienia sieciowe... CPButSettings=Ustawienia... CPButView=Przegl\u0105daj... CPButCertificates=Certyfikaty... CPButSimpleEditor=Edytor uproszczony... CPButAdvancedEditor=Edytor zaawansowany... # Control Panel - Headers CPHead=Panel sterowania IcedTea-Web CPHeadAbout=\u00a0O\u00a0IcedTea-Web\u00a0 CPHeadNetworkSettings=\u00a0Ustawienia\u00a0proxy\u00a0sieciowego\u00a0 CPHeadTempInternetFiles=\u00a0Internetowe\u00a0pliki\u00a0tymczasowe\u00a0 CPHeadJRESettings=\u00a0Ustawienia\u00a0\u015brodowiska\u00a0uruchomieniowego\u00a0Java\u00a0 CPHeadCertificates=\u00a0Certyfikaty\u00a0 CPHeadDebugging=\u00a0Ustawienia\u00a0analizy\u00a0i\u00a0usuwania\u00a0b\u0142\u0119d\u00f3w\u00a0 CPHeadDesktopIntegration=\u00a0Integracja\u00a0z\u00a0pulpitem\u00a0 CPHeadSecurity=\u00a0Ustawienia\u00a0bezpiecze\u0144stwa\u00a0 CPHeadJVMSettings=\u00a0Ustawienia\u00a0maszyny\u00a0wirtualnej\u00a0Java\u00a0(JVM)\u00a0 CPHeadPolicy=\u00a0Dostosowania\u00a0wytycznej\u00a0 # Control Panel - Tabs CPTabAbout=O IcedTea-Web CPTabCache=Pami\u0119\u0107 podr\u0119czna CPTabCertificate=Certyfikaty CPTabClassLoader=\u0141adowarki klas CPTabDebugging=Usuwanie b\u0142\u0119d\u00f3w CPTabDesktopIntegration=Integracja z pulpitem CPTabNetwork=Sie\u0107 CPTabRuntimes=\u015arodowiska uruchomieniowe CPTabSecurity=Bezpiecze\u0144stwo CPTabJVMSettings=Ustawienia JVM CPTabPolicy=Ustawienia wytycznej # Control Panel - AboutPanel CPAboutInfo=Ten panel sterowania s\u0142u\u017cy do ustawiania pliku deployments.properties.
    Nie wszystkie opcje maj\u0105 efekt, dop\u00f3ki nie zostan\u0105 obj\u0119te implementacj\u0105.
    Stosowanie wielu \u015brodowisk uruchomieniowych Java (JRE) jest obecnie ograniczone do OpenJDK.
    # Control Panel - AdvancedProxySettings APSDialogTitle=Ustawienia sieciowe APSServersPanel=Serwery APSProxyTypeLabel=Typ APSProxyAddressLabel=Adres proxy APSProxyPortLabel=Port proxy APSLabelHTTP=HTTP APSLabelSecure=Bezpieczny APSLabelFTP=FTP APSLabelSocks=Socks APSSameProxyForAllProtocols=Stosuj ten sam serwer proxy dla wszystkich protoko\u0142\u00f3w. APSExceptionsLabel=Wyj\u0105tki APSExceptionsDescription=Nie stosuj serwera proxy dla adres\u00f3w zaczynaj\u0105cych si\u0119 na: APSExceptionInstruction=Odgradzaj ka\u017cd\u0105 pozycj\u0119 \u015brednikiem (;). # Control Panel - DebugginPanel CPDebuggingPossibilites=Zapis dziennika DPEnableLogging=W\u0142\u0105cz usuwanie b\u0142\u0119d\u00f3w DPEnableLoggingHint=Powoduje zapis wydarze\u0144 usuwania b\u0142\u0119d\u00f3w. R\u00f3wnoznaczne z prze\u0142\u0105cznikami \u201e-verbose\u201d lub \u201eICEDTEAPLUGIN_DEBUG=true\u201d. DPEnableHeaders=W\u0142\u0105cz nag\u0142\u00f3wki DPEnableHeadersHint=Wypisuje nag\u0142\u00f3wki, takie jak u\u017cytkownik, pozycja w kodzie i czas, z ka\u017cdym wydarzeniem. DPEnableFile=Zapisuj dziennik w plik CPFilesLogsDestDir=Katalog dziennik\u00f3w CPFilesLogsDestDirResert=Domy\u015blny DPEnableFileHint=Dziennik b\u0119dzie zapisany w katalogu \u201e{0}\u201d. DPEnableStds=Zapisuj dziennik w standardowy strumie\u0144 wyj\u015bcia DPEnableStdsHint=Wydarzenia b\u0119d\u0105 wy\u015bwietlane na wyj\u015bciu standardowym. DPEnableSyslog=Zapisuj do dziennika systemowego DPEnableSyslogHint=Wydarzenia b\u0119d\u0105 zapisywane w dzienniku systemowym. DPDisable=Wy\u0142\u0105cz DPHide=Ukrywaj podczas startu DPShow=Pokazuj podczas startu DPShowPluginOnly=Pokazuj podczas startu wtyczki DPShowJavawsOnly=Pokazuj podczas startu javaws DPJavaConsole=Konsola Java DPJavaConsoleDisabledHint=Konsola Java jest wy\u0142\u0105czona. U\u017cyj itweb-settings do skonfigurowania widoczno\u015bci konsoli Java. # PolicyEditor PEUsage=policyeditor [-file plik_wytycznej] PEHelpFlag=Wy\u015bwietl ten komunikat i zako\u0144cz PEFileFlag=Okre\u015bla \u015bcie\u017ck\u0119 plika wytycznej do otwarcia PECodebaseFlag=Specify (a) codebase URL(s) to add and/or focus in the editor PETitle=Edytor wytycznej PEReadProps=Odczyt w\u0142a\u015bciwo\u015bci systemowych PEReadPropsDetail=Zezwala aplet-om na odczyt w\u0142a\u015bciwo\u015bci systemowych, np. Twoj\u0105 nazw\u0119 u\u017cytkownika lub lokalizacja Twojego katalogu domowego PEWriteProps=Zapis w\u0142a\u015bciwo\u015bci systemowych PEWritePropsDetail=Zezwala aplet-om na zapis w\u0142a\u015bciwo\u015bci systemowych PEReadFiles=Odczyt z plik\u00f3w lokalnych PEReadFilesDetail=Zezwala aplet-om na odczyt plik\u00f3w w Twoim katalogu domowym PEWriteFiles=Zapis w pliki lokalne PEWriteFilesDetail=Zezwala aplet-om na zapis plik\u00f3w w Twoim katalogu domowym PEDeleteFiles=Usuni\u0119cie plik\u00f3w lokalnych PEDeleteFilesDetail=Zezwala aplet-om na usuwanie plik\u00f3w w Twoim katalogu domowym PEReadSystemFiles=Odczyt wszystkich plik\u00f3w systemu PEReadSystemFilesDetail=Zezwala aplet-om na odczyt z wszystkich lokalizacji na komputerze PEWriteSystemFiles=Zapis wszystkich plik\u00f3w systemu PEWriteSystemFilesDetail=Zezwala aplet-om na zapis do wszystkich lokalizacji na komputerze PEReadTempFiles=Odczyt z plik\u00f3w tymczasowych PEReadTempFilesDetail=Zezwala aplet-om na odczyt z Twojego katalogu plik\u00f3w tymczasowych PEWriteTempFiles=Zapis w pliki tymczasowe PEWriteTempFilesDetail=Zezwala aplet-om na zapis do Twojego katalogu plik\u00f3w tymczasowych PEDeleteTempFiles=Usuni\u0119cie plik\u00f3w tymczasowych PEDeleteTempFilesDetail=Zezwala aplet-om na usuwanie plik\u00f3w z Twojego katalogu plik\u00f3w tymczasowych PEAWTPermission=Dost\u0119p do systemu okien PEAWTPermissionDetail=Zezwala aplet-om na ca\u0142kowity dost\u0119p do systemu okien AWT PEClipboard=Dost\u0119p do schowka PEClipboardDetail=Zezwala aplet-om na odczyt z i zapis do schowka PENetwork=Dost\u0119p do sieci PENetworkDetail=Zezwala aplet-om na tworzenie po\u0142\u0105cze\u0144 sieciowych PEPrint=Druk dokument\u00f3w PEPrintDetail=Zezwala aplet-om na wstawianie zada\u0144 drukowania do kolejki PEPlayAudio=Odtworzenie d\u017awi\u0119k\u00f3w PEPlayAudioDetail=Zezwala aplet-om na odtwarzanie d\u017awi\u0119k\u00f3w, lecz nie na nagrywanie PERecordAudio=Nagrywanie d\u017awi\u0119ku PERecordAudioDetail=Zezwala aplet-om na nagrywanie d\u017awi\u0119ku, lecz nie na odtwarzanie PEReflection=Introspekcja Java PEReflectionDetail=Zezwala aplet-om na dost\u0119p do Java Reflection API PEClassLoader=Pozyskanie \u0142adowarki klas PEClassLoaderDetail=Zezwala aplet-om na dost\u0119p do systemowej \u0142adowarki klas (cz\u0119sto u\u017cywane z introspekcj\u0105) PEClassInPackage=Dost\u0119p do innych pakiet\u00f3w PEClassInPackageDetail=Zezwala aplet-om na dost\u0119p do klas z obcych pakiet\u00f3w (cz\u0119sto u\u017cywane z introspekcj\u0105) PEDeclaredMembers=Dost\u0119p do prywatnych danych klasy PEDeclaredMembersDetail=Zezwala na dost\u0119p do danych zwyczajnie ukrytych przed obcymi klasami Java (cz\u0119sto u\u017cywane z introspekcj\u0105) PEExec=Wykonanie polece\u0144 PEExecDetail=Zezwala aplet-om na wykonanie polece\u0144 systemowych PEGetEnv=Pozyskanie zmiennych \u015brodowiskowych PEGetEnvDetail=Zezwala aplet-om na odczyt zmiennych \u015brodowiskowych PECouldNotOpen=Nie mo\u017cna otworzy\u0107 pliku wytycznej PECouldNotSave=Nie mo\u017cna zapisa\u0107 pliku wytycznej PEAddEntry=Dodaj baz\u0119 kodu PERemoveEntry=Usu\u0144 PEEntryPrompt=Podaj now\u0105 baz\u0119 kodu PEGlobalSettings=Wszystkie Applet-y PESaveChanges=Zapisa\u0107 zmiany przed zako\u0144czeniem? PEChangesSaved=Zapisano zmiany PECheckboxLabel=Uprawniena PEEntriesLabel=Bazy kodu PEFileMenu=Plik PEOpenMenuItem=Otw\u00f3rz... PESaveMenuItem=Zapisz PESaveAsMenuItem=Zapisz\u00a0jako... PEExitMenuItem=Zako\u0144cz PEEditMenu=Edycja PEModifyCodebaseItem=Przemianuj baz\u0119 kodu PECopyEntryItem=Kopiuj baz\u0119 kodu PEPasteEntryItem=Wklej baz\u0119 kodu PECopyCodebaseToClipboardItem=Kopiuj URL bazy kodu do schowka PEModifyCodebase=Przemianowana baza kodu: PEPasteEntry=Skopiowana baza kodu: PEViewMenu=Widok PECustomPermissionsItem=Uprawnienia\u00a0dostosowane... PEFileModified=Ostrze\u017cenie o modyfikacji pliku PEFileModifiedDetail=Plik wytycznej \u201e{0}\u201d zosta\u0142 zmodyfikowany od jego otwarcia. Czy chcesz go za\u0142adowa\u0107 ponownie? PEGAccessUnownedCode=Wykonanie obcego kodu PEGMediaAccess=Dost\u0119p do medi\u00f3w PEGRightClick=Kliknij prawym klawiszem myszy, aby ro/zwin\u0105\u0107 PEGReadFileSystem=Odczyt w system PEGWriteFileSystem=Zapis w system # Policy Editor CustomPolicyViewer PECPTitle=Podgl\u0105d dostosowanych wytycznych PECPListLabel=Dalsze wytyczne dla \u201e{0}\u201d PECPAddButton=Dodaj PECPRemoveButton=Usu\u0144 PECPCloseButton=Zamknij PECPType=typ PECPTarget=cel PECPActions=akcja PECPPrompt=Podaj dostosowane uprawnienie. Pomi\u0144 \u201epermission\u201d lub znaki interpunkcji. # PolicyEditor key mnemonics. See KeyEvent.VK_* # N # R # A # C # F # I # O # S # A # X # U # conole itself labels CONSOLErungc=Uruchom od\u015bmiecanie CONSOLErunFinalizers=Uruchom finalizatory CONSOLErunningFinalizers=Wykonywanie finalizator\u00f3w.... CONSOLEmemoryInfo=Informacja o pami\u0119ci CONSOLEsystemProperties=W\u0142a\u015bciwo\u015bci systemowe CONSOLEclassLoaders=Dost\u0119pne \u0142adowarki klas CONSOLEthreadList=Lista w\u0105tk\u00f3w CONSOLEthread=W\u0105tek CONSOLEnoClassLoaders=Brak informacji o \u0142adowarkach klas CONSOLEmemoryMax=Pami\u0119\u0107 maksymalnie CONSOLEmemoryTotal=Pami\u0119\u0107 ca\u0142kowicie CONSOLEmemoryFree=Pami\u0119\u0107 dost\u0119pna CONSOLEClean=Wyczy\u015b\u0107 # console output pane labels COPsortCopyAllDate=Sortuj \u201eSkopiuj wszytko\u201d wed\u0142ug daty COPshowHeaders=Pokazuj nag\u0142\u00f3wki: COPuser=U\u017cytkownik COPorigin=Pochodzenie COPlevel=Poziom COPdate=Data COPthread1=W\u0105tek 1 COPthread2=W\u0105tek 2 COPShowMessages=Pokazuj komunikaty: COPstdOut=Standardowy strumie\u0144 wyj\u015bcia COPstdErr=Standardowy strumie\u0144 b\u0142\u0119d\u00f3w COPjava=Java COPplugin=Wtyczka COPpreInit=Przed\u00a0inicjalizacj\u0105 COPpluginOnly=Wy\u0142\u0105cznie wtyczka COPSortBy=Sortuj wed\u0142ug COPregex=Filtr wyra\u017cenia regularnego COPAsArrived=Wed\u0142ug pojawienia (bez sortowania) COPcode=Kod COPmessage=Komunikat COPSearch=Szukaj COPautoRefresh=Auto-od\u015bwie\u017canie COPrefresh=Od\u015bwie\u017c COPApply=Zastosuj COPmark=Zaznacz COPCopyAllPlain=Skopiuj wszystko (nago) COPCopyAllRich=Skopiuj wszystko (wzbogacono) COPnext=Dalej\u00a0>>> COPprevious=<<<\u00a0Wr\u00f3\u0107 COPcaseSensitive=Rozr\u00f3\u017cniaj\u00a0wielko\u015b\u0107\u00a0liter COPincomplete=Niezupe\u0142ne COPhighlight=Wyr\u00f3\u017cniaj COPwordWrap=Dziel\u00a0s\u0142owa COPdebug=Debug COPinfo=Info COPpostInit=Po\u00a0inicjalizacji COPcomplete=Zupe\u0142ne COPmatch=R\u00f3wne COPnot=Nie COPrevert=Odwrotnie COPclientApp=Aplikacja # Control Panel - DesktopShortcutPanel DSPNeverCreate=Nigdy nie tw\u00f3rz DSPAlwaysAllow=Zawsze zezwalaj DSPAskUser=Pytaj u\u017cytkownika DSPAskIfHinted=Pytaj je\u015bli sugerowane DSPAlwaysIfHinted=Zawsze je\u015bli sugerowane # Control Panel - NetworkSettingsPanel NSDescription-1=Brak ustawienia NSDescription0=Stosuj po\u0142\u0105czenia bezpo\u015bredniego. NSDescription1=Zast\u0105p ustawienia proxy przegl\u0105darki. NSDescription2=Stosuj skrypt automatycznej konfiguracji proxy z danej lokalizacji. NSDescription3=Stosuj ustawienia proxy domy\u015blnej przegl\u0105darki do \u0142\u0105czenia si\u0119 z internetem. NSAddress=Adres NSPort=Port NSAdvanced=Zaawansowane NSBypassLocal=Pomijaj serwer proxy dla adres\u00f3w lokalnych NSDirectConnection=Bezpo\u015brednie po\u0142\u0105czenie NSManualProxy=R\u0119czny serwer proxy NSAutoProxy=Skrypt automatycznej konfiguracji proxy NSBrowserProxy=Stosuj ustawienia przegl\u0105darki NSScriptLocation=Lokalizacja skryptu # Control Panel - SecurityGeneralPanel SGPAllowUserGrantSigned=Zezw\u00f3l u\u017cytkownikom udziela\u0107 uprawnienia podpisanemu materia\u0142owi SGPAllowUserGrantUntrust=Zezw\u00f3l u\u017cytkownikom udziela\u0107 uprawnienia materia\u0142owi od niezaufanego organu SGPUseBrowserKeystore=U\u017cywaj certyfikaty i klucze z bazy kluczy przegl\u0105darki (nieobs\u0142ugiwane) SGPUsePersonalCertOneMatch=Automatycznie u\u017cywaj certyfikat osobisty gdy wy\u0142\u0105cznie jeden pasuje do \u017c\u0105dania serwera (nieobs\u0142ugiwane) SGPWarnCertHostMismatch=Ostrzegaj gdy certyfikat witryny nie odpowiada nazwie komputera SGPShowValid=Pokazuj certyfikat witryny, nawet gdy jest wa\u017cny (nieobs\u0142ugiwane) SGPShowSandboxWarning=Pokazuj ostrzegawczy nag\u0142\u00f3wek piaskownicy SGPAllowUserAcceptJNLPSecurityRequests=Zezw\u00f3l u\u017cytkownikom akceptowa\u0107 \u017c\u0105dania bezpiecze\u0144stwa JNLP SGPCheckCertRevocationList=Sprawdzaj odwo\u0142anie certyfikat\u00f3w stosuj\u0105c listy odwo\u0142ania certyfikat\u00f3w (CRL) (nieobs\u0142ugiwane) SGPEnableOnlineCertValidate=W\u0142\u0105cz internetowe potwierdzanie certyfikat\u00f3w (nieobs\u0142ugiwane) SGPEnableTrustedPublisherList=W\u0142\u0105cz list\u0119 zaufanych wydawc\u00f3w (nieobs\u0142ugiwane) SGPEnableBlacklistRevocation=W\u0142\u0105cz sprawdzanie odwo\u0142ania czarnej listy (nieobs\u0142ugiwane) SGPEnableCachingPassword=W\u0142\u0105cz przechowywanie has\u0142a do uwierzytelniania (nieobs\u0142ugiwane) SGPUseSSL2=U\u017cywaj format ClientHello kompatybilny do SSL 2.0 (nieobs\u0142ugiwane) SGPUseSSL3=U\u017cywaj SSL 3.0 (nieobs\u0142ugiwane) SGPUseTLS1=U\u017cywaj TLS 1.0 (nieobs\u0142ugiwane) # Control Panel - TemporaryInternetFilesPanel TIFPEnableCache=Pozostawiaj pliki tymczasowe na moim komputerze. TIFPLocation=\u00a0Lokalizacja\u00a0 TIFPLocationLabel=Wybierz lokalizacj\u0119 sk\u0142adowania plik\u00f3w tymczasowych TIFPChange=Zmie\u0144 TIFPDiskSpace=\u00a0Miejsce\u00a0na\u00a0dysku\u00a0 TIFPCompressionLevel=Wybierz poziom kompresji plik\u00f3w JAR TIFPNone=Brak TIFPMax=Maksymalny TIFPCacheSize=Nastaw wielko\u015b\u0107 miejsca na dysku do sk\u0142adowania plik\u00f3w tymczasowych TIFPDeleteFiles=Usu\u0144 pliki TIFPViewFiles=Przegl\u0105daj pliki... TIFPFileChooserChooseButton=Wybierz # Control Panel - Cache Viewer CVCPDialogTitle=Podgl\u0105d pami\u0119ci podr\u0119cznej CVCPButRefresh=Od\u015bwie\u017c CVCPButDelete=Usu\u0144 CVCPCleanCache=Wyczy\u015b\u0107 CVCPCleanCacheTip=Niekt\u00f3re b\u0142\u0119dy mog\u0105 wyst\u0119powa\u0107 z powodu przestarza\u0142ych plik\u00f3w w pami\u0119ci podr\u0119cznej. Przed zg\u0142oszeniem b\u0142\u0119du, prosz\u0119 wyczy\u015bci\u0107 pami\u0119\u0107 podr\u0119czn\u0105 i spr\u00f3bowa\u0107 ponownie uruchomi\u0107 aplikacj\u0119.\\nPami\u0119\u0107 podr\u0119czn\u0105 mo\u017cna wyczy\u015bci\u0107 za pomoc\u0105 polecenia \u201ejavaws -Xclearcache\u201d lub w panelu IcedTea-Web poprzez \u201ePami\u0119\u0107 podr\u0119czna\u201d -> \u201ePrzegl\u0105daj pliki...\u201d -> \u201eWyczy\u015b\u0107\u201d CVCPColLastModified=Data modyfikacji CVCPColSize=Wielko\u015b\u0107 (w bajtach) CVCPColDomain=Domena CVCPColType=Typ CVCPColPath=\u015acie\u017cka CVCPColName=Nazwa # Control Panel - Misc. CPJRESupport=IcedTea-Web obecnie nie obs\u0142uguje stosowania wielu \u015brodowisk uruchomieniowych Java (JRE). CPInvalidPort=Podano nieprawid\u0142owy numer portu.\n[Prawid\u0142owe numery portu s\u0105 1-65535] CPInvalidPortTitle=B\u0142\u0105d przy wczytywaniu. # command line control panel CLNoInfo=Brak informacji (czy ta opcja jest prawid\u0142owa?). CLValue=Warto\u015b\u0107: {0} CLValueSource=Pochodzi z: {0} CLDescription=Opis: {0} CLUnknownCommand=Nie rozpoznano rozkazu \u201e{0}\u201d. CLUnknownProperty=Nieznana nazwa w\u0142a\u015bciwo\u015bci \u201e{0}\u201d CLWarningUnknownProperty=UWAGA: W\u0142a\u015bciwo\u015b\u0107 \u201e{0}\u201d jest nieznana, utworzono now\u0105 w\u0142a\u015bciwo\u015b\u0107 CLNoIssuesFound=Nie znaleziono \u017cadnych problem\u00f3w. CLIncorrectValue=W\u0142a\u015bciwo\u015b\u0107 \u201e{0}\u201d zawiera nieprawid\u0142ow\u0105 warto\u015b\u0107 \u201e{1}\u201d. Mo\u017cliwe warto\u015bci {2} CLListDescription=Pokazuje list\u0119 z wszystkimi nazwami i warto\u015bciami w\u0142a\u015bciwo\u015bci, kt\u00f3re s\u0105\nprzestrzegane przez IcedTea-Web. CLGetDescription=Pokazuje warto\u015b\u0107 property-name CLSetDescription=Ustawia warto\u015b\u0107 w\u0142a\u015bciwo\u015bci property-name, je\u015bli to mo\u017cliwe.\nWarto\u015b\u0107 podlega analizie prawid\u0142owo\u015bci. Je\u015bli administrator zablokowa\u0142 t\u0119\nw\u0142a\u015bciwo\u015b\u0107, ustawianie nie b\u0119dzie mia\u0142o efektu. CLResetDescription=Przywraca warto\u015b\u0107 domy\u015bln\u0105 dla w\u0142a\u015bciwo\u015bci property-name.\nall przywraca warto\u015bci domy\u015blne dla wszystkich w\u0142a\u015bciwo\u015bci przestrzeganych\nprzez IcedTea-Web. CLInfoDescription=Pokazuje wi\u0119cej informacji o podanej w\u0142a\u015bciwo\u015bci CLCheckDescription=Pokazuje w\u0142a\u015bciwo\u015bci kt\u00f3re zdefiniowano, lecz nie s\u0105 przestrzegane przez\nIcedTea-Web. CLHelpDescription=Za pomoc\u0105 narz\u0119dzia itweb-settings u\u017cytkownik mo\u017ce modyfikowa\u0107, przegl\u0105da\u0107 i\nsprawdza\u0107 konfiguracj\u0119. Aby u\u017cy\u0107 interfejsu graficznego, nie podawaj \u017cadnych\nargument\u00f3w. Aby u\u017cy\u0107 trybu wiersza polece\u0144, podaj w\u0142a\u015bciwy rozkaz i parametry.\n\u201e{0} rozkaz help\u201d udziela pomocy dla szczeg\u00f3lnego rozkazu. # splash screen related SPLASHerror=Kliknij tu aby uzyska\u0107 szczeg\u00f3\u0142y. Wyst\u0105pi\u0142 powa\u017cny wyj\u0105tek. SPLASH_ERROR=B\u0141\u0104D SPLASHtitle=Tytu\u0142 SPLASHvendor=Dostawca SPLASHhomepage=Witryna SPLASHdescription=Opis SPLASHClose=Zamknij SPLASHclosewAndCopyException=Zamknij i kopiuj \u015blad stosu do schowka SPLASHexOccured=Wyst\u0105pi\u0142 powa\u017cny wyj\u0105tek... SPLASHHome=Pocz\u0105tek SPLASHcantCopyEx=Nie mo\u017cna skopiowa\u0107 wyj\u0105tku SPLASHnoExRecorded=Nie odnotowano wyj\u0105tku SPLASHmainL1=Aby uzyska\u0107 wi\u0119cej informacji wejd\u017a na stron\u0119 {0} i zastosuj tam opisane kroki aby pozyska\u0107 informacje niezb\u0119dne do z\u0142o\u017cenia raportu o b\u0142\u0119dzie w programie. SPLASHmainL3=Brak dodatkowych informacji, spr\u00f3buj uruchomi\u0107 przegl\u0105dark\u0119 z wiersza polece\u0144 i przeanalizowa\u0107 dane wyj\u015bciowe. SPLASHcloseAndCopyShorter=Zamknij i kopiuj do schowka SPLASHmainL4=Wyst\u0105pi\u0142 nast\u0119puj\u0105cy wyj\u0105tek. Aby uzyska\u0107 wi\u0119cej informacji, spr\u00f3buj uruchomi\u0107 przegl\u0105dark\u0119 z wiersza polece\u0144 i przeanalizowa\u0107 dane wyj\u015bciowe. SPLASHexWas=Wyj\u0105tek: SPLASHcfl=Brak dost\u0119pu za pomoc\u0105 odno\u015bnika do SPLASHvendorsInfo=Informacje od dostawcy twojej aplikacji SPLASHanotherInfo=Inna dost\u0119pna informacja SPLASHdefaultHomepage=Brak witryny, sprawd\u017a raczej \u017ar\u00f3d\u0142o SPLASHerrorInInformation=Wyst\u0105pi\u0142 b\u0142\u0105d w trakcie \u0142adowania elementu \u201einformation\u201d, sprawd\u017a raczej \u017ar\u00f3d\u0142o SPLASHmissingInformation=Brak elementu \u201einformation\u201d, sprawd\u017a raczej \u017ar\u00f3d\u0142o SPLASHchainWas=To jest lista wyj\u0105tk\u00f3w kt\u00f3re wyst\u0105pi\u0142y w trakcie startowania applet-u. Prosz\u0119 zauwa\u017cy\u0107, \u017ce wyj\u0105tki te mog\u0105 pochodzi\u0107 z r\u00f3\u017cnych applet-\u00f3w. Aby uzyska\u0107 po\u017cyteczny raport o b\u0142\u0119dzie w programie, upewnij si\u0119 aby wykonywano wy\u0142\u0105cznie jeden applet. APPEXTSECappletSecurityLevelExtraHighId=Wy\u0142\u0105cz uruchamianie wszystkich applet-\u00f3w Java APPEXTSECappletSecurityLevelVeryHighId=Bardzo wysokie bezpiecze\u0144stwo APPEXTSECappletSecurityLevelHighId=Wysokie bezpiecze\u0144stwo APPEXTSECappletSecurityLevelLowId=Niskie bezpiecze\u0144stwo APPEXTSECappletSecurityLevelExtraHighExplanation=\u017baden applet nie b\u0119dzie uruchamiany APPEXTSECappletSecurityLevelVeryHighExplanation=Wy\u0142\u0105cznie podpisane applet-y b\u0119d\u0105 uruchamianie APPEXTSECappletSecurityLevelHighExplanation=U\u017cytkownik b\u0119dzie pytany dla ka\u017cdego applet-u APPEXTSECappletSecurityLevelLowExplanation=Wszystkie applet-y b\u0119d\u0105 uruchamianie, nawet niepodpisane APPEXTSECunsignedAppletActionAlways=Zawsze ufaj tym (zaznaczonym) applet-om APPEXTSECunsignedAppletActionNever=Nigdy nie ufaj tym (zaznaczonym) applet-om APPEXTSECunsignedAppletActionYes=Wizytowano i zezwolono temu applet-owi APPEXTSECunsignedAppletActionNo=Wizytowano i odm\u00f3wiono zezwolenia temu applet-owi APPEXTSECControlPanelExtendedAppletSecurityTitle=Rozszerzone bezpiecze\u0144stwo applet-\u00f3w APPEXTSECguiTableModelTableColumnAction=Akcja APPEXTSECguiTableModelTableColumnDateOfAction=Data akcji APPEXTSECguiTableModelTableColumnDocumentBase=Baza dokumentu APPEXTSECguiTableModelTableColumnCodeBase=Baza kodu APPEXTSECguiTableModelTableColumnArchives=Archiwa APPEXTSECguiPanelAppletInfoHederPart1={0} {1} APPEXTSECguiPanelAppletInfoHederPart2={0} od {1} APPEXTSECguiPanelConfirmDeletionOf=Czy na pewno chcesz usun\u0105\u0107 nast\u0119puj\u0105ce pozycje: {0}? APPEXTSECguiPanelHelpButton=Pomoc APPEXTSECguiPanelSecurityLevel=Poziom bezpiecze\u0144stwa APPEXTSECguiPanelGlobalBehaviourCaption=Ustawienia systemowe post\u0119powania przy obs\u0142udze applet-\u00f3w APPEXTSECguiPanelDeleteMenuSelected=Zaznaczone APPEXTSECguiPanelDeleteMenuAllA=Wszystkie dozwolone (A) APPEXTSECguiPanelDeleteMenuAllN=Wszystkie zabronione (N) APPEXTSECguiPanelDeleteMenuAlly=Wszystkie zatwierdzone (y) APPEXTSECguiPanelDeleteMenuAlln=Wszystkie odrzucone (n) APPEXTSECguiPanelDeleteMenuAllAll=Bezwzgl\u0119dnie wszystkie APPEXTSECguiPanelDeleteButton=Usu\u0144 APPEXTSECguiPanelDeleteButtonToolTip=Naciskaj\u0105c klawisz DEL, podczas przegl\u0105dania tabeli, mo\u017cesz usun\u0105\u0107 zaznaczone wpisy APPEXTSECguiPanelTestUrlButton=Testuj URL APPEXTSECguiPanelAddRowButton=Dodaj now\u0105 linijk\u0119 APPEXTSECguiPanelValidateTableButton=Sprawd\u017a tabel\u0119 APPEXTSECguiPanelAskeforeActionBox=Pytaj przed akcj\u0105 APPEXTSECguiPanelShowRegExesBox=W pe\u0142ni pokazuj wyra\u017cenia regularne APPEXTSECguiPanelInverSelection=Odwr\u00f3\u0107 zaznaczenia APPEXTSECguiPanelMoveRowUp=Przesu\u0144 linijk\u0119 w g\u00f3r\u0119 APPEXTSECguiPanelMoveRowDown=Przesu\u0144 linijk\u0119 w d\u00f3\u0142 APPEXTSECguiPanelCustomDefs=Definicje u\u017cytkownika APPEXTSECguiPanelGlobalDefs=Definicje systemowe APPEXTSECguiPanelDocTest=Wpisz URL bazy dokumentowej APPEXTSECguiPanelCodeTest=Wpisz URL bazy kodu APPEXTSECguiPanelNoMatch=Nie znaleziono hase\u0142 APPEXTSECguiPanelMatchingNote=Tylko pierwsze znalezione has\u0142o b\u0119dzie uwzgl\u0119dniane w rezultacie. APPEXTSECguiPanelMatched=Znaleziono APPEXTSECguiPanelMatchingError=B\u0142\u0105d podczas wyszukiwania: {0} APPEXTSECguiPanelCanNotValidate=Nie mo\u017cna potwierdzi\u0107, poniewa\u017c nie mo\u017cna utworzy\u0107 pliku tymczasowego \u201e{0}\u201d. APPEXTSECguiPanelEmptyDoc=Wszystkie bazy dokumentowe musz\u0105 by\u0107 wype\u0142nione APPEXTSECguiPanelEmptyCode=Wszystkie bazy kodu musz\u0105 by\u0107 wype\u0142nione APPEXTSECguiPanelTableValid=Tabela wygl\u0105da w porz\u0105dku APPEXTSECguiPanelTableInvalid=Tabela niepoprawna z powodu nast\u0119puj\u0105cego b\u0142\u0119du: {0} APPEXTSECguiPanelShowOnlyPermanent=Pokazuj wy\u0142\u0105cznie wpisy sta\u0142e APPEXTSECguiPanelShowOnlyTemporal=Pokazuj wy\u0142\u0105cznie wpisy tymczasowo zadecydowane APPEXTSECguiPanelShowAll=Pokazuj wszystkie wpisy APPEXTSECguiPanelShowOnlyPermanentA=Pokazuj wy\u0142\u0105cznie zezwolone wpisy sta\u0142e APPEXTSECguiPanelShowOnlyPermanentN=Pokazuj wy\u0142\u0105cznie zabronione wpisy sta\u0142e APPEXTSECguiPanelShowOnlyTemporalY=Pokazuj poprzednio zezwolone wpisy applet-\u00f3w APPEXTSECguiPanelShowOnlyTemporalN=Pokazuj poprzednio odm\u00f3wione wpisy applet-\u00f3w APPEXTSEChelpHomeDialogue=Dialog icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/warning.png0000644000000000000000000000013213441742745024442 xustar0030 mtime=1552401893.038832825 30 atime=1552402157.227253503 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/warning.png0000644000175000002070000000250213441742745025251 0ustar00jvanekmock00000000000000‰PNG  IHDR77ЈлвFsRGBЎЮщbKGDџЭ3Y(Z pHYs  šœtIMEи  ;ќ•Я.tEXtCommentCreated with GIMPWIDAThоэZЯ‹Eў^ЯЌЛЂ ;йгK„……%Cn= є"‚Goўžџ _~ѕЌИџёЛkxїЭ’A{žуЫ$Ы@LjёG•ЧуGQžœЕяrХOŽB‹ Е№э+НЪуэž;сt{^Їr$ЁХ"РVеПяЏйT}ЩЈ€0Ї-Шd`мА_Эš˜Oэѓ:aъЗРУн*8пя[ёцќ_рЪšfВ`HЮїKpƒ-ы^Еіa>‹з™Љ,ї§5;SР G‹WЪ‘ьbЪmO“Ѕoь{бЮХЛЅ­ У’мњК‡С–Ї˜ыЫбwTћЮХ?? ‘&@ЂЎ4’HS€Е+Mf€ў^ПЧl!Q’Њ}оЙф˜D@QФБКЂђŠђ+.ю§НЌpяяzхїЃИœ'Ÿ+ЩчKд}’9sЮНe&Ч'зBDq5 iLк ўЎ’хeРЌѓэFœcіОsІЦ™^ ‘ФFŠЫ:Z|ИM g,хЋЖj$‰%‚џМ’џЧh€§™фGp•\{фяЈlЙЯCr{BFRŽрёеоx<ъœ9ўmwЪЦp7`ˆс_Qр Гћ`…(K8ц{hіmQП=kqщI& 5K[бp+ХkЏ› %Yъ`JЦJѕјїAHЯG]0—%‘_6BФџ .4Єу$мx“ёХ'ЏhЩФ`…ЩЙЋШФ@3ГзєWž€OzЁЙ-БVAFьшIСЃ3Z,иLB ’%н˜цьŸ‡ЙРэ ­%Љt#ъyЪѕнЗp7з'-~Ав[бшЊaR:$Уљ-СЕ‡ЉзЩВВOПNq6Э~>п|Ыї€ ї&ŽэQ {ž(ЧћНАБkС"УŸUП5љЧ1Œq ZЬё‰ŒqсLdK•€п/­ѕоЃж[kS+М[ш,е$ТТЄT“Tи-'fЦн{Рщ˜ёі-Тсuj=ж™YЭfшfb•† ИBŽІЎ]ЧЎ,йєLU7ОІ[гЇ›В DщЙb€ZЙœ„ЈE­уцИ}+тUb­MC /т†ŒЪŽXЂVЩQ Й>Гр Эr НsєЄ“-Ўa‹Ю!смNгbЮP–м^šџJZйЪVЖВ•ubџЊ#!дŸ“'ЕIENDЎB`‚icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/PaxHeaders.7406/info-small.png0000644000000000000000000000013213441742745025036 xustar0030 mtime=1552401893.037832827 30 atime=1552402157.227253503 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/resources/info-small.png0000644000175000002070000000220513441742745025645 0ustar00jvanekmock00000000000000‰PNG  IHDR;0ЎЂsRGBЎЮщbKGDJtеNA@ pHYs  šœtIMEи /“їЕJtEXtCommentCreated with GIMPWрIDATHЧэVMkW=їЭŒFВ>ёGдqL,ЛЅ1M]HB(&а,-4Y4tпнvйM—…юBћ К)1…zбаR‚)И]И1^Tv\l„-'–тШвHЃЙYЬз›б(ЉквUž3вЬ{чоsЯyї/Чџ4h˜—Йe/ЅQx%‰TNƒHєК6кѕ.ћmдЖšЈn,в<{ў—Ю"9Ђ‚НIђLnлM Wcѓзwщg'юђќЂМ‘Йы“ŒE1РюC‚sO дЋ-Ќ-WqT{Ÿ†;ѕ=—ЏNAM(‡_>=Т'з ьvёХ7;0Ль'юйыєАzgўКв‡#eњіSP5ЬNоbотз.Žav2‰ gВ8ћzЦgƒ(W ЪWЇИЫ јЭEš›)Eщ!‡ЮЕJаlѕPйm‡ъЭ.хL€Ђ)˜Пl̘ъйѓїxют‰ EЉЖ!* 8‘Wбlл8nл}ЋВ4‰lќМ\_ЦЅђЈ1KдR"IрЕ†…cгіƒѓП.y0SLЕ1ЗЬzZuд*qAdРT•0]дБ№Vз/CˆHPаэ ЇUsЫ~­UxЂ”qиariхP†ЬРˆ.№љЧЇ№ъЩ$tЭAќюЇGАmюїuЄTуЅ4Њ1ч tаЁљWwUбъ|њѕОКГ'Q"Р$ˆКœРDО>ђХ$b3N2€`o;9ЛE#OВŽM!сjRQйc9Р)ˆx`%ЉЛQ{…ѕ&rФ СTHм’юъжKшvЎUB~Œ!8d/ЙюDŽЂйU8‘AИŠWЁ Vy\}А@Ї&\AњqИы jir ,щŠ˜OMT, о27WЖCЛ–OYdЯ&ЂXPŠto}ИВ§ќюДyПL‡ЛѕXЊхF‘IJm4I}ЯCкй­ЃrПL/l‹,­У2­ОІ“c„/oЄpѓŠюПћж>ћ(лњ,гТквњ'™љм‡gЁъъs3ў'/и5-ќіэя8иКDУЙŠ?№ќ{o pВ0Pэƒ‚8м­cmiG{—‡;s…яЌђЬ…iшiнЧ*ЪQяжЪ66#5§WчъЩ3П№ФkуШ9Єђ)Ј НNЧе'Ј§yВЬЫ!gш$|Ј р.НIENDЎB`‚icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/event0000644000000000000000000000013113441742745021320 xustar0030 mtime=1552401893.032832837 29 atime=1552410887.11418344 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/event/0000755000175000002070000000000013441742745022206 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/event/PaxHeaders.7406/ApplicationEvent.java0000644000000000000000000000013213441742745025506 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.227253503 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/event/ApplicationEvent.java0000644000175000002070000000315713441742745026324 0ustar00jvanekmock00000000000000// Copyright (C) 2002 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.event; import java.util.*; import net.sourceforge.jnlp.runtime.*; /** * This event is sent when an application is terminated. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.5 $ */ public class ApplicationEvent extends EventObject { /** the application instance */ final transient private ApplicationInstance application; /** * Creates a launch event for the specified application * instance. * * @param source the application instance */ public ApplicationEvent(ApplicationInstance source) { super(source); this.application = source; } /** * @return the application instance. */ public ApplicationInstance getApplication() { return application; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/event/PaxHeaders.7406/DownloadListener.java0000644000000000000000000000013213441742745025516 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.227253503 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/event/DownloadListener.java0000644000175000002070000000360313441742745026330 0ustar00jvanekmock00000000000000// Copyright (C) 2002 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.event; import java.util.*; /** * The listener that is notified of the state of resources being * downloaded by a ResourceTracker. Events may be delivered on a * background thread, and the event methods should complete * quickly so that they do not slow down other downloading in * progress by tying up a thread. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.3 $ */ public interface DownloadListener extends EventListener { /** * Called when a resource is checked for being up-to-date. * @param downloadEvent information about started update */ public void updateStarted(DownloadEvent downloadEvent); /** * Called when a download starts. * @param downloadEvent information about started download */ public void downloadStarted(DownloadEvent downloadEvent); /** * Called when a download completed or there was an error. * @param downloadEvent information about finished download */ public void downloadCompleted(DownloadEvent downloadEvent); } icedtea-web-1.8/netx/net/sourceforge/jnlp/event/PaxHeaders.7406/ApplicationListener.java0000644000000000000000000000013213441742745026212 xustar0030 mtime=1552401893.032832837 30 atime=1552402157.227253503 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/event/ApplicationListener.java0000644000175000002070000000246113441742745027025 0ustar00jvanekmock00000000000000// Copyright (C) 2002 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.event; import java.util.*; /** * The listener that is notified when an application instance is * terminated. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.5 $ */ public interface ApplicationListener extends EventListener { /** * Invoked when the application is destroyed. * @param applicationEvent information about destruction */ public void applicationDestroyed(ApplicationEvent applicationEvent); } icedtea-web-1.8/netx/net/sourceforge/jnlp/event/PaxHeaders.7406/DownloadEvent.java0000644000000000000000000000013213441742745025012 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.227253503 30 ctime=1552410887.032183632 icedtea-web-1.8/netx/net/sourceforge/jnlp/event/DownloadEvent.java0000644000175000002070000000363713441742745025633 0ustar00jvanekmock00000000000000// Copyright (C) 2002 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.event; import java.net.*; import java.util.*; import net.sourceforge.jnlp.cache.*; /** * This event is sent during the launch of an * application. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.3 $ */ public class DownloadEvent extends EventObject { /** the tracker */ final transient private ResourceTracker tracker; /** the resource */ final transient private Resource resource; /** * Creates a launch event for the specified application * instance. * * @param source the resource tracker * @param resource the resource */ public DownloadEvent(ResourceTracker source, Resource resource) { super(source); this.tracker = source; this.resource = resource; } /** * @return the tracker that owns the resource. */ public ResourceTracker getTracker() { return tracker; } /** * @return the location of the resource being downloaded. */ public URL getResourceLocation() { return resource.getLocation(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/controlpanel0000644000000000000000000000013113441742745022677 xustar0030 mtime=1552401893.053832793 29 atime=1552410887.11418344 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/0000755000175000002070000000000013441742745023565 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/RemmeberableDialogueEditor.ja0000644000000000000000000000013213441742745030474 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/RemmeberableDialogueEditor.java0000644000175000002070000002212013441742745031630 0ustar00jvanekmock00000000000000/* Copyright (C) 2016 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel; import java.awt.Button; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import javax.swing.ComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.event.ListDataListener; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.dialogs.remember.AppletSecurityActions; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.security.dialogs.remember.RememberableDialog; import net.sourceforge.jnlp.security.dialogs.remember.SavedRememberAction; /** * This dialog provides way to manage rememberable dialogues * * */ public class RemmeberableDialogueEditor extends JDialog { private final List> allClasses; private final AppletSecurityActions actions; private AppletSecurityActions result; private final RemmeberableDialogueEditor self; private final JFrame frame; RemmeberableDialogueEditor(JFrame jFrame, boolean modal, Object dialogs) { super(jFrame, modal); frame=jFrame; this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); self = this; actions = (AppletSecurityActions) dialogs; allClasses = ClassFinder.findAllMatchingTypes(RememberableDialog.class); recreateGui(); this.setLocationRelativeTo(jFrame); } private void recreateGui() { final Collection> entries = actions.getEntries(); final JDialog d = this; getContentPane().removeAll(); d.setLayout(new GridLayout(0, 4)); final List> addedableClasses = new ArrayList<>(allClasses); for (final Map.Entry entry : entries) { final String dialog = entry.getKey(); for (int i = 0; i < addedableClasses.size(); i++) { final Class get = addedableClasses.get(i); String s = get.getSimpleName(); if (s.equals(dialog)) { JButton bb = new JButton("-"); bb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { actions.removeAction(get); recreateGui(); } }); d.add(bb); d.add(new JLabel(entry.getKey())); final JComboBox cbb = new JComboBox(ExecuteAppletAction.values()); cbb.setSelectedItem(entry.getValue().getAction()); cbb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { actions.setAction(entry.getKey(), createRember((ExecuteAppletAction) cbb.getSelectedItem(), entry)); } private SavedRememberAction createRember(ExecuteAppletAction nwValue, Map.Entry entry) { return new SavedRememberAction(nwValue, entry.getValue().getSavedValue()); } }); d.add(cbb); JButton expertButton = new JButton(Translator.R("EPEexpert")); expertButton.setToolTipText(Translator.R("EPEexpertHelp")); expertButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Object result = JOptionPane.showInputDialog(self.frame, entry.getValue().getSavedValue(), Translator.R("EPEexpertHint"), JOptionPane.YES_NO_OPTION, null, null, entry.getValue().getSavedValue()); if (result != null) { String s = result.toString(); if (!s.trim().isEmpty()){ actions.setAction(entry.getKey(), createRember(entry.getValue().getAction(), s)); } } } private SavedRememberAction createRember(ExecuteAppletAction action, String newValue) { return new SavedRememberAction(action, newValue); } }); d.add(expertButton); addedableClasses.remove(i); i--; } } } ComboBoxModel model = new ComboBoxModel() { Object selected = null; @Override public void setSelectedItem(Object anItem) { for (int i = 0; i < addedableClasses.size(); i++) { Class get = addedableClasses.get(i); if (get.getSimpleName().equals(anItem)) { selected = get.getSimpleName(); } } } @Override public Object getSelectedItem() { return selected; } @Override public int getSize() { return addedableClasses.size(); } @Override public String getElementAt(int index) { return addedableClasses.get(index).getSimpleName(); } @Override public void addListDataListener(ListDataListener l) { } @Override public void removeListDataListener(ListDataListener l) { } }; for (int x = 0; x < 4; x++) { Button b = new Button(Translator.R("EPEhelp" + (x + 1))); b.setEnabled(false); d.add(b); } final JComboBox cb = new JComboBox<>(model); JButton b = new JButton("+"); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (cb.getSelectedIndex() < 0) { return; } actions.setAction(addedableClasses.get(cb.getSelectedIndex()), new SavedRememberAction(ExecuteAppletAction.NEVER, ExecuteAppletAction.NEVER.toChar())); recreateGui(); } }); d.add(b); d.add(cb); JButton save = new JButton(Translator.R("EPEsave")); save.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { result = actions; self.setVisible(false); } }); d.add(save); JButton cancel = new JButton(Translator.R("EPEcancel")); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { result = null; self.setVisible(false); } }); d.add(cancel); d.pack(); } public AppletSecurityActions getResult() { return result; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/DebuggingPanel.java0000644000000000000000000000013213441742745026473 xustar0030 mtime=1552401893.053832793 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java0000644000175000002070000002311113441742745027301 0ustar00jvanekmock00000000000000/* DebuggingPanel.java -- Displays and sets options for debugging. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.LogConfig; /** * This displays the options related to debugging. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ public class DebuggingPanel extends NamedBorderPanel implements ItemListener { /** List of properties used by checkboxes in this panel */ public static String[] properties = { DeploymentConfiguration.KEY_ENABLE_LOGGING, DeploymentConfiguration.KEY_ENABLE_LOGGING_HEADERS, DeploymentConfiguration.KEY_ENABLE_LOGGING_TOFILE, DeploymentConfiguration.KEY_ENABLE_LEGACY_LOGBASEDFILELOG, DeploymentConfiguration.KEY_ENABLE_APPLICATION_LOGGING_TOFILE, DeploymentConfiguration.KEY_ENABLE_LOGGING_TOSTREAMS, DeploymentConfiguration.KEY_ENABLE_LOGGING_TOSYSTEMLOG }; private final DeploymentConfiguration config; /** * Create a new instance of the debugging panel. * * @param config * loaded DeploymentConfiguration file. */ public DebuggingPanel(DeploymentConfiguration config) { super(Translator.R("CPHeadDebugging"), new GridBagLayout()); this.config = config; addComponents(); } private void fileLoggingAct(JCheckBox source, JCheckBox... targets) { if (source.isSelected()) { for (JCheckBox target : targets) { target.setEnabled(true); } } else { for (JCheckBox target : targets) { target.setEnabled(false); } } } /** * Add components to panel. */ private void addComponents() { GridBagConstraints c = new GridBagConstraints(); final JLabel debuggingDescription = new JLabel("" + Translator.R("CPDebuggingDescription") + "

    "); final JLabel logsDestinationTitle = new JLabel(Translator.R("CPFilesLogsDestDir")+": "); final JTextField logsDestination = new JTextField(PathsAndFiles.LOG_DIR.getFullPath(config)); logsDestination.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { save(); } @Override public void removeUpdate(DocumentEvent e) { save(); } @Override public void changedUpdate(DocumentEvent e) { save(); } private void save() { PathsAndFiles.LOG_DIR.setValue(logsDestination.getText(), config); } }); final JButton logsDestinationReset = new JButton(Translator.R("CPFilesLogsDestDirResert")); logsDestinationReset.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { logsDestination.setText(PathsAndFiles.LOG_DIR.getDefaultFullPath()); } }); final JCheckBox[] debuggingOptions = { new JCheckBox(Translator.R("DPEnableLogging")), new JCheckBox(Translator.R("DPEnableHeaders")), new JCheckBox(Translator.R("DPEnableFile")), new JCheckBox(Translator.R("DPEnableLegacyFileLog")), new JCheckBox(Translator.R("DPEnableClientAppFileLogging")), new JCheckBox(Translator.R("DPEnableStds")), new JCheckBox(Translator.R("DPEnableSyslog")) }; debuggingOptions[2].addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { fileLoggingAct(debuggingOptions[2], debuggingOptions[3], debuggingOptions[4]); } }); final String[] hints = { (Translator.R("DPEnableLoggingHint")), (Translator.R("DPEnableHeadersHint")), (Translator.R("DPEnableFileHint", LogConfig.getLogConfig().getIcedteaLogDir())), (Translator.R("DPEnableLegacyFileLogHint")), (Translator.R("DPEnableClientAppFileLoggingHint")), (Translator.R("DPEnableStdsHint")), (Translator.R("DPEnableSyslogHint")) }; final ComboItem[] javaConsoleItems = { new ComboItem(Translator.R("DPDisable"), DeploymentConfiguration.CONSOLE_DISABLE), new ComboItem(Translator.R("DPHide"), DeploymentConfiguration.CONSOLE_HIDE), new ComboItem(Translator.R("DPShow"), DeploymentConfiguration.CONSOLE_SHOW), new ComboItem(Translator.R("DPShowPluginOnly"), DeploymentConfiguration.CONSOLE_SHOW_PLUGIN), new ComboItem(Translator.R("DPShowJavawsOnly"), DeploymentConfiguration.CONSOLE_SHOW_JAVAWS) }; JLabel consoleLabel = new JLabel(Translator.R("DPJavaConsole")); JComboBox consoleComboBox = new JComboBox<>(); consoleComboBox.setActionCommand(DeploymentConfiguration.KEY_CONSOLE_STARTUP_MODE); // The property this comboBox affects. JPanel consolePanel = new JPanel(); consolePanel.setLayout(new FlowLayout(FlowLayout.LEADING)); consolePanel.add(consoleLabel); consolePanel.add(consoleComboBox); c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.gridx = 0; c.gridy = 0; add(debuggingDescription, c); /* * Add the items to the panel unless we can not get the values for them. */ for (int i = 0; i < properties.length; i++) { String s = config.getProperty(properties[i]); c.gridy++; if (i == 2) { JLabel space = new JLabel("" + Translator.R("CPDebuggingPossibilites") + ":"); add(space, c); c.gridy++; } //move 5th and 6th checkbox below logsDestination if (i == 3 || i == 4) { c.gridx += 1; if (i == 4) { c.gridy--; } } else { c.gridx = 0; } debuggingOptions[i].setSelected(Boolean.parseBoolean(s)); debuggingOptions[i].setActionCommand(properties[i]); debuggingOptions[i].setToolTipText(hints[i]); debuggingOptions[i].addItemListener(this); add(debuggingOptions[i], c); if (i == 2) { c.gridx++; JPanel resetTitlePanel = new JPanel(new BorderLayout(10, 0)); resetTitlePanel.add(logsDestinationReset, BorderLayout.LINE_START); resetTitlePanel.add(logsDestinationTitle, BorderLayout.LINE_END); add(resetTitlePanel, c); c.gridx++; add(logsDestination, c); c.gridx -= 2; } } for (int j = 0; j < javaConsoleItems.length; j++) { consoleComboBox.addItem(javaConsoleItems[j]); if (config.getProperty(DeploymentConfiguration.KEY_CONSOLE_STARTUP_MODE).equals(javaConsoleItems[j].getValue())) { consoleComboBox.setSelectedIndex(j); } } c.gridy++; consoleComboBox.addItemListener(this); add(consolePanel, c); // pack the bottom so that it doesn't change size if resized. Component filler = Box.createRigidArea(new Dimension(1, 1)); c.gridy++; c.weighty = 1; add(filler, c); fileLoggingAct(debuggingOptions[2], debuggingOptions[3], debuggingOptions[4]); } @Override public void itemStateChanged(ItemEvent e) { Object o = e.getSource(); if (o instanceof JCheckBox) { JCheckBox jcb = (JCheckBox) o; config.setProperty(jcb.getActionCommand(), String.valueOf(jcb.isSelected())); } else if (o instanceof JComboBox) { @SuppressWarnings("unchecked") JComboBox jcb = (JComboBox) o; ComboItem c = (ComboItem) e.getItem(); config.setProperty(jcb.getActionCommand(), c.getValue()); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/AdvancedProxySettingsPane.jav0000644000000000000000000000013213441742745030553 xustar0030 mtime=1552401893.052832796 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsPane.java0000644000175000002070000002531213441742745031527 0ustar00jvanekmock00000000000000/* AdvancedProxySettingsPane.java -- Provides the panel which can modify proxy settings. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.Translator; /** * This is the pane that modifies the proxy settings in more detail. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ public class AdvancedProxySettingsPane extends JPanel { private JDialog parent; private final DeploymentConfiguration config; /** List of properties used by this panel */ public static String[] properties = { "deployment.proxy.http.host", "deployment.proxy.http.port", "deployment.proxy.https.host", "deployment.proxy.https.port", "deployment.proxy.ftp.host", "deployment.proxy.ftp.port", "deployment.proxy.socks.host", "deployment.proxy.socks.port", "deployment.proxy.same", "deployment.proxy.override.hosts" }; private String[] fields = new String[properties.length]; private JComponent defaultFocusComponent = null; /** * Creates a new instance of the proxy settings panel. * * @param parent * JDialog this is associated with. * @param config * Loaded DeploymentConfiguration file. */ public AdvancedProxySettingsPane(JDialog parent, DeploymentConfiguration config) { super(new BorderLayout()); this.parent = parent; this.config = config; getProperties(); addComponents(); } /** * Place properties into an array, this is so when cancel is hit. We don't * overwrite the original values. */ private void getProperties() { for (int i = 0; i < fields.length; i++) { fields[i] = this.config.getProperty(properties[i]); } } /** * Add the components to the panel. */ private void addComponents() { JPanel topPanel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); JPanel servers = new NamedBorderPanel(Translator.R("APSServersPanel")); servers.setLayout(new GridBagLayout()); JLabel type = new JLabel(Translator.R("APSProxyTypeLabel")); JLabel proxyAddress = new JLabel(Translator.R("APSProxyAddressLabel")); JLabel port = new JLabel(Translator.R("APSProxyPortLabel")); // This addresses the HTTP proxy settings. JLabel http = new JLabel(Translator.R("APSLabelHTTP") + ":"); final JTextField httpAddressField = new JTextField(fields[0]); final JTextField httpPortField = new JTextField(); httpPortField.setDocument(NetworkSettingsPanel.getPortNumberDocument()); httpAddressField.getDocument().addDocumentListener(new DocumentAdapter(fields, 0)); httpPortField.getDocument().addDocumentListener(new DocumentAdapter(fields, 1)); httpPortField.setText(fields[1]); // This addresses the HTTPS proxy settings. JLabel secure = new JLabel(Translator.R("APSLabelSecure") + ":"); final JTextField secureAddressField = new JTextField(fields[2]); final JTextField securePortField = new JTextField(); securePortField.setDocument(NetworkSettingsPanel.getPortNumberDocument()); secureAddressField.getDocument().addDocumentListener(new DocumentAdapter(fields, 2)); securePortField.getDocument().addDocumentListener(new DocumentAdapter(fields, 3)); securePortField.setText(fields[3]); // This addresses the FTP proxy settings. JLabel ftp = new JLabel(Translator.R("APSLabelFTP") + ":"); final JTextField ftpAddressField = new JTextField(fields[4]); final JTextField ftpPortField = new JTextField(); ftpPortField.setDocument(NetworkSettingsPanel.getPortNumberDocument()); ftpAddressField.getDocument().addDocumentListener(new DocumentAdapter(fields, 4)); ftpPortField.getDocument().addDocumentListener(new DocumentAdapter(fields, 5)); ftpPortField.setText(fields[5]); // This addresses the Socks proxy settings. JLabel socks = new JLabel(Translator.R("APSLabelSocks") + ":"); final JTextField socksAddressField = new JTextField(fields[6]); final JTextField socksPortField = new JTextField(); socksPortField.setDocument(NetworkSettingsPanel.getPortNumberDocument()); socksAddressField.getDocument().addDocumentListener(new DocumentAdapter(fields, 6)); socksPortField.getDocument().addDocumentListener(new DocumentAdapter(fields, 7)); socksPortField.setText(fields[7]); JCheckBox sameProxyForAll = new JCheckBox(Translator.R("APSSameProxyForAllProtocols"), Boolean.parseBoolean(fields[8])); sameProxyForAll.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { fields[8] = String.valueOf(e.getStateChange() == ItemEvent.SELECTED); } }); JPanel p = new JPanel(); BoxLayout bl = new BoxLayout(p, BoxLayout.Y_AXIS); p.setLayout(bl); p.add(sameProxyForAll); c.fill = GridBagConstraints.BOTH; c.gridheight = 1; c.gridy = 0; c.gridwidth = 1; c.weightx = 0; c.gridx = 0; servers.add(type, c); c.gridwidth = 2; c.weightx = 1; c.gridx = 1; servers.add(proxyAddress, c); c.gridwidth = 1; c.weightx = 1; c.gridx = 4; servers.add(port, c); plant(1, http, httpAddressField, httpPortField, servers, c); plant(2, secure, secureAddressField, securePortField, servers, c); plant(3, ftp, ftpAddressField, ftpPortField, servers, c); plant(4, socks, socksAddressField, socksPortField, servers, c); c.gridwidth = 5; c.gridx = 0; c.gridy = 5; servers.add(p, c); JPanel exceptions = new NamedBorderPanel(Translator.R("APSExceptionsLabel")); exceptions.setLayout(new BorderLayout()); JLabel exceptionDescription = new JLabel(Translator.R("APSExceptionsDescription")); final JTextArea exceptionListArea = new JTextArea(); exceptionListArea.setLineWrap(true); exceptionListArea.setText(fields[9]); exceptionListArea.getDocument().addDocumentListener(new DocumentAdapter(fields, 9)); JLabel exceptionFormat = new JLabel(Translator.R("APSExceptionInstruction")); JScrollPane exceptionScroll = new JScrollPane(exceptionListArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); exceptions.add(exceptionDescription, BorderLayout.NORTH); exceptions.add(exceptionScroll, BorderLayout.CENTER); exceptions.add(exceptionFormat, BorderLayout.SOUTH); c.gridx = 0; c.weightx = 1; c.weighty = 0; c.gridy = 0; topPanel.add(servers, c); c.weighty = 1; c.gridy = 1; topPanel.add(exceptions, c); this.add(topPanel); this.add(createButtonPanel(), BorderLayout.SOUTH); } /** * Helper method to help make adding component shorter. */ private void plant(int y, JLabel label, JTextField addr, JTextField port, JPanel addTo, GridBagConstraints c) { c.gridy = y; c.gridwidth = 1; c.weightx = 0; c.gridx = 0; addTo.add(label, c); c.gridwidth = 2; c.weightx = 1; c.gridx = 1; addTo.add(addr, c); c.gridwidth = 1; c.weightx = 0; c.gridx = 3; addTo.add(new JLabel(":"), c); c.gridwidth = 1; c.weightx = 0.3; c.gridx = 4; addTo.add(port, c); } /** * Make the button panel. * * @return the button panel created * @see JPanel */ private JPanel createButtonPanel() { JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING)); List buttons = new ArrayList(); JButton okButton = new JButton(Translator.R("ButOk")); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (int i = 0; i < fields.length; i++) config.setProperty(properties[i], fields[i]); parent.dispose(); } }); buttons.add(okButton); JButton cancelButton = new JButton(Translator.R("ButCancel")); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { parent.dispose(); } }); buttons.add(cancelButton); int maxWidth = 0; int maxHeight = 0; for (JButton button : buttons) { maxWidth = Math.max(button.getMinimumSize().width, maxWidth); maxHeight = Math.max(button.getMinimumSize().height, maxHeight); } int wantedWidth = maxWidth + 10; int wantedHeight = maxHeight; for (JButton button : buttons) { button.setPreferredSize(new Dimension(wantedWidth, wantedHeight)); buttonPanel.add(button); } return buttonPanel; } /** * Put focus onto default button. */ public void focusOnDefaultButton() { if (defaultFocusComponent != null) { defaultFocusComponent.requestFocusInWindow(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/NetworkSettingsPanel.java0000644000000000000000000000013213441742745027752 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java0000644000175000002070000003020713441742745030564 0ustar00jvanekmock00000000000000/* NetworkSettingsPanel.java -- Sets proxy settings for network. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import javax.swing.Box; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.Translator; /** * This is the pane used with creating a JDialog version. This allows changing * the network configuration: Proxy * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ @SuppressWarnings("serial") public class NetworkSettingsPanel extends JPanel implements ActionListener { private final DeploymentConfiguration config; private JPanel description; private final ArrayList proxyPanels = new ArrayList<>(); // The stuff with editable fields /** List of properties used by this panel */ public static String[] properties = { DeploymentConfiguration.KEY_PROXY_TYPE, DeploymentConfiguration.KEY_PROXY_HTTP_HOST, DeploymentConfiguration.KEY_PROXY_HTTP_PORT, DeploymentConfiguration.KEY_PROXY_BYPASS_LOCAL, DeploymentConfiguration.KEY_PROXY_AUTO_CONFIG_URL }; /** * Creates a new instance of the network settings panel. * * @param config * Loaded DeploymentConfiguration file. */ public NetworkSettingsPanel(DeploymentConfiguration config) { super(); this.config = config; setLayout(new BorderLayout()); addComponents(); } /** * This adds the components to the panel. */ protected void addComponents() { JPanel settingPanel = new NamedBorderPanel(Translator.R("CPHeadNetworkSettings")); settingPanel.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.weighty = 1; c.gridx = 0; JLabel networkDesc = new JLabel("" + Translator.R("CPNetworkSettingsDescription") + "
    "); JLabel[] description = { new JLabel("" + Translator.R("NSDescription-1") + ""), new JLabel("" + Translator.R("NSDescription0") + ""), new JLabel("" + Translator.R("NSDescription1") + ""), new JLabel("" + Translator.R("NSDescription2") + ""), new JLabel("" + Translator.R("NSDescription3") + "") }; this.description = new JPanel(new CardLayout()); for (int i = 0; i < description.length; i++) this.description.add(description[i], String.valueOf(i - 1)); // Settings for selecting Proxy Server JPanel proxyServerPanel = new JPanel(new GridLayout(0, 1)); JPanel proxyLocationPanel = new JPanel(new GridBagLayout()); JPanel proxyBypassPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); JLabel addressLabel = new JLabel(Translator.R("NSAddress") + ":"); JLabel portLabel = new JLabel(Translator.R("NSPort") + ":"); final JTextField addressField = new JTextField(config.getProperty(properties[1]), 10); addressField.getDocument().addDocumentListener(new DocumentAdapter(config, properties[1])); final JTextField portField = new JTextField(5); portField.setDocument(NetworkSettingsPanel.getPortNumberDocument()); portField.getDocument().addDocumentListener(new DocumentAdapter(config, properties[2])); portField.setText(config.getProperty(properties[2])); // Create the button which allows setting of other types of proxy. JButton advancedProxyButton = new JButton(Translator.R("NSAdvanced") + "..."); advancedProxyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { AdvancedProxySettingsDialog.showAdvancedProxySettingsDialog(config); addressField.setText(config.getProperty(properties[1])); portField.setText(config.getProperty(properties[2])); } }); JCheckBox bypassCheckBox = new JCheckBox(Translator.R("NSBypassLocal"), Boolean.parseBoolean(config.getProperty(properties[3]))); bypassCheckBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { config.setProperty(properties[3], String.valueOf(e.getStateChange() == ItemEvent.SELECTED)); } }); c.gridy = 0; c.gridx = GridBagConstraints.RELATIVE; c.weightx = 0; proxyLocationPanel.add(Box.createHorizontalStrut(20), c); proxyLocationPanel.add(addressLabel, c); c.weightx = 1; proxyLocationPanel.add(addressField, c); c.weightx = 0; proxyLocationPanel.add(portLabel, c); c.weightx = 1; proxyLocationPanel.add(portField, c); c.weightx = 0; proxyLocationPanel.add(advancedProxyButton, c); proxyBypassPanel.add(Box.createHorizontalStrut(5)); proxyBypassPanel.add(bypassCheckBox); proxyServerPanel.add(proxyLocationPanel); proxyServerPanel.add(proxyBypassPanel); JRadioButton directConnection = new JRadioButton(Translator.R("NSDirectConnection"), config.getProperty(properties[0]).equals("0")); directConnection.setActionCommand("0"); directConnection.addActionListener(this); JRadioButton useProxyServer = new JRadioButton(Translator.R("NSManualProxy"), config.getProperty(properties[0]).equals("1")); useProxyServer.setActionCommand("1"); useProxyServer.addActionListener(this); JRadioButton useAutoProxyConfigScript = new JRadioButton(Translator.R("NSAutoProxy"), config.getProperty(properties[0]).equals("2")); useAutoProxyConfigScript.setActionCommand("2"); useAutoProxyConfigScript.addActionListener(this); JRadioButton useBrowserSettings = new JRadioButton(Translator.R("NSBrowserProxy"), config.getProperty(properties[0]).equals("3")); useBrowserSettings.setActionCommand("3"); useBrowserSettings.addActionListener(this); ButtonGroup modeSelect = new ButtonGroup(); modeSelect.add(useBrowserSettings); modeSelect.add(useProxyServer); modeSelect.add(useAutoProxyConfigScript); modeSelect.add(directConnection); // Settings for Automatic Proxy Configuration Script JPanel proxyAutoPanel = new JPanel(new GridBagLayout()); JLabel locationLabel = new JLabel(Translator.R("NSScriptLocation") + ":"); final JTextField locationField = new JTextField(config.getProperty(properties[4]), 20); locationField.getDocument().addDocumentListener(new DocumentAdapter(config, properties[4])); c.gridx = 0; proxyAutoPanel.add(Box.createHorizontalStrut(20), c); c.gridx = GridBagConstraints.RELATIVE; proxyAutoPanel.add(locationLabel, c); c.weightx = 1; proxyAutoPanel.add(locationField, c); c.weighty = 0; c.gridx = 0; c.gridy = 0; settingPanel.add(networkDesc, c); c.gridy = 1; settingPanel.add(this.description, c); c.gridy = 2; settingPanel.add(directConnection, c); c.gridy = 3; settingPanel.add(useBrowserSettings, c); c.gridy = 4; settingPanel.add(useProxyServer, c); c.gridy = 5; settingPanel.add(proxyServerPanel, c); proxyPanels.add(proxyServerPanel); c.gridy = 6; settingPanel.add(useAutoProxyConfigScript, c); c.gridy = 7; settingPanel.add(proxyAutoPanel, c); proxyPanels.add(proxyAutoPanel); // Filler to pack the bottom of the panel. Component filler = Box.createRigidArea(new Dimension(1, 1)); c.gridy++; c.weighty = 1; settingPanel.add(filler, c); setState(); // depending on default setting we will enable or disable add(settingPanel, BorderLayout.CENTER); } /** * Enable/Disable the panel and all its children recursively. * * @param panel * JPanel which needs to be enabled or disabled. * @param enable * true if the panel and its children are to be enabled, false * otherwise. */ private void enablePanel(JPanel panel, boolean enable) { // This will be used to enable all components in this panel recursively. // Ridiculously slow if lots of nested panels. for (Component c : panel.getComponents()) { if (c instanceof JPanel) { enablePanel((JPanel) c, enable); } c.setEnabled(enable); } } @Override public void actionPerformed(ActionEvent e) { config.setProperty(properties[0], e.getActionCommand()); setState(); } /** * This enables and disables the appropriate panels. */ private void setState() { ((CardLayout) this.description.getLayout()).show(this.description, config.getProperty(properties[0])); switch (config.getProperty(properties[0])) { case "0": for (JPanel panel : proxyPanels) enablePanel(panel, false); break; case "1": enablePanel(proxyPanels.get(1), false); enablePanel(proxyPanels.get(0), true); break; case "2": enablePanel(proxyPanels.get(0), false); enablePanel(proxyPanels.get(1), true); break; case "3": for (JPanel panel : proxyPanels) enablePanel(panel, false); break; } } /** * Creates a PlainDocument that only take numbers if it will create a valid port number. * @return PlainDocument which will ensure numeric values only and is a valid port number. */ public static PlainDocument getPortNumberDocument(){ return new PlainDocument(){ @Override public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if (str != null) { try { Integer.valueOf(str); int val = Integer.valueOf(this.getText(0, this.getLength()) + str); if (val < 1 || val > 65535) { // Invalid port number if true throw new NumberFormatException("Invalid port number"); } super.insertString(offs, str, a); } catch (Exception e) { JOptionPane.showMessageDialog(null, Translator.R("CPInvalidPort"), Translator.R("CPInvalidPortTitle") , JOptionPane.WARNING_MESSAGE); } } } }; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/CommandLine.java0000644000000000000000000000013213441742745026006 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/CommandLine.java0000644000175000002070000004547613441742745026636 0ustar00jvanekmock00000000000000/* CommandLine.java -- command line interface to icedtea-web's deployment settings. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.IOException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.naming.ConfigurationException; import net.sourceforge.jnlp.config.ConfiguratonValidator; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.config.Setting; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.docprovider.ItwebSettingsTextsProvider; import net.sourceforge.jnlp.util.docprovider.TextsProvider; import net.sourceforge.jnlp.util.docprovider.formatters.formatters.PlainTextFormatter; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.optionparser.OptionParser; import net.sourceforge.swing.SwingUtils; /** * Encapsulates a command line interface to the deployment configuration. *

    * The central method is {@link #handle()}, which calls one of the * various 'handle' methods. The commands listed in OptionsDefinitions.getItwsettingsCommands * are supported. For each supported command, a method handleCOMMANDCommand exists. * This method actually takes action based on the command. Generally, a * printCOMMANDHelp method also exists, and prints out the help message for * that specific command. For example, see {@link #handleListCommand()} * and {@link #printListHelp()}. *

    * Sample usage: *
    
     * CommandLine cli = new CommandLine();
     * // the string array represents input using the command line
     * int retVal = cli.handle(new String[] { "help" });
     * if (retVal == CommandLine.SUCCESS) {
     *    // good!
     * } else {
     *    // bad!
     * }
     * 
    * * @author Omair Majid */ public class CommandLine { public static final int ERROR = 1; public static final int SUCCESS = 0; public final String PROGRAM_NAME; private OptionParser optionParser; DeploymentConfiguration config = null; /** * Creates a new instance * @param optionParser used to parse applications arguments */ public CommandLine(OptionParser optionParser) { this.optionParser = optionParser; PROGRAM_NAME = System.getProperty("icedtea-web.bin.name"); config = new DeploymentConfiguration(); try { config.load(false); } catch (ConfigurationException | MalformedURLException e) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("RConfigurationFatal")); OutputController.getLogger().log(e); } } /** * Handle the 'help' command * * @return the result of handling the help command. SUCCESS if no errors occurred. */ public int handleHelpCommand() { final TextsProvider helpMessagesProvider = new ItwebSettingsTextsProvider("utf-8", new PlainTextFormatter(), true, true); String helpMessage = "\n"; if (JNLPRuntime.isDebug()) { helpMessage = helpMessage + helpMessagesProvider.writeToString(); } else { helpMessage = helpMessage + helpMessagesProvider.prepare().getSynopsis() + helpMessagesProvider.getFormatter().getNewLine() + helpMessagesProvider.prepare().getDescription() + helpMessagesProvider.getFormatter().getNewLine() + helpMessagesProvider.prepare().getCommands() + helpMessagesProvider.getFormatter().getNewLine(); } OutputController.getLogger().printOut(helpMessage); return SUCCESS; } /** * Prints help message for the list command */ public void printListHelp() { OutputController.getLogger().printOutLn(R("Usage")); OutputController.getLogger().printOutLn(" " + PROGRAM_NAME + " list [--details]"); OutputController.getLogger().printOutLn(R("CLListDescription")); } /** * Handles the 'list' command * * @return result of handling the command. SUCCESS if no errors occurred. */ public int handleListCommand() { if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP2)) { printListHelp(); return SUCCESS; } if (optionParser.getMainArgs().contains("details") || optionParser.getMainArgs().contains("verbose")) { JNLPRuntime.setDebug(true); } Map> all = config.getRaw(); for (String key : all.keySet()) { Setting value = all.get(key); OutputController.getLogger().printOutLn(key + ": " + value.getValue()); if (JNLPRuntime.isDebug()) { OutputController.getLogger().printOutLn("\t" + R("CLDescription", value.getDescription())); } } return SUCCESS; } /** * Prints help message for the get command */ public void printGetHelp() { OutputController.getLogger().printOutLn(R("Usage")); OutputController.getLogger().printOutLn(" " + PROGRAM_NAME + " get property-name"); OutputController.getLogger().printOutLn(R("CLGetDescription")); } /** * Handles the 'get' command. * * @return an integer representing success (SUCCESS) or error handling the * get command. */ public int handleGetCommand() { if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP2)) { printGetHelp(); return SUCCESS; } List args = optionParser.getParams(OptionsDefinitions.OPTIONS.GET); Map> all = config.getRaw(); List unknownProperties = new ArrayList<>(args); unknownProperties.removeAll(all.keySet()); if (unknownProperties.size() > 0) { for (String property : unknownProperties) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CLUnknownProperty", property)); } return ERROR; } for (String key : args) { String value = all.get(key).getValue(); OutputController.getLogger().printOutLn(key+": "+value); } return SUCCESS; } /** * Prints the help message for the 'set' command */ public void printSetHelp() { OutputController.getLogger().printOutLn(R("Usage")); OutputController.getLogger().printOutLn(" " + PROGRAM_NAME + " set property-name value"); OutputController.getLogger().printOutLn(R("CLSetDescription")); } /** * Handles the 'set' command * * @return an integer indicating success (SUCCESS) or error in handling * the command */ public int handleSetCommand() { if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP2)) { printSetHelp(); return SUCCESS; } List args = optionParser.getParams(OptionsDefinitions.OPTIONS.SET); String key = null; String value; boolean isArgKey = false; for (String arg : args) { isArgKey = !isArgKey; if (isArgKey) { key = arg; continue; } value = arg; if (configContains(key)) { if (validateValue(key, value) == ERROR) { return ERROR; } config.setProperty(key, value); } else { OutputController.getLogger().printOutLn(R("CLWarningUnknownProperty", key)); config.setProperty(key, value); } } try { config.save(); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); return ERROR; } return SUCCESS; } private boolean configContains(final String arg) { return config.getRaw().containsKey(arg); } private int validateValue(final String key, final String value) { Setting old = config.getRaw().get(key); if (old.getValidator() != null) { try { old.getValidator().validate(value); } catch (IllegalArgumentException e) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("CLIncorrectValue", old.getName(), value, old.getValidator().getPossibleValues())); OutputController.getLogger().log(e); return ERROR; } } return SUCCESS; } /** * Prints a help message for the reset command */ public void printResetHelp() { OutputController.getLogger().printOutLn(R("Usage")); OutputController.getLogger().printOutLn(" " + PROGRAM_NAME + " reset [all|property-name]"); OutputController.getLogger().printOutLn(R("CLResetDescription")); } /** * Handles the 'reset' command * * @return an integer indicating success (SUCCESS) or error in handling * the command */ public int handleResetCommand() { if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP2)) { printResetHelp(); return SUCCESS; } List args = optionParser.getParams(OptionsDefinitions.OPTIONS.RESET); boolean resetAll = false; if (args.contains("all")) { resetAll = true; if (args.size() > 1) { for (String arg : args) { if (!arg.equals("all")) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CLUnknownCommand", arg)); } } } } Map> all = config.getRaw(); if (resetAll) { for (String aKey: all.keySet()) { Setting setting = all.get(aKey); setting.setValue(setting.getDefaultValue()); } } else { for (String key : args) { if (!all.containsKey(key)) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CLUnknownProperty", key)); return ERROR; } else { Setting setting = all.get(key); setting.setValue(setting.getDefaultValue()); } } } try { config.save(); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); return ERROR; } return SUCCESS; } /** * Print a help message for the 'info' command */ public void printInfoHelp() { OutputController.getLogger().printOutLn(R("Usage")); OutputController.getLogger().printOutLn(" " + PROGRAM_NAME + " info property-name"); OutputController.getLogger().printOutLn(R("CLInfoDescription")); } /** * Handles the 'info' command * * @return an integer indicating success (SUCCESS) or error in handling * the command */ public int handleInfoCommand() { if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP2)) { printInfoHelp(); return SUCCESS; } List args = optionParser.getParams(OptionsDefinitions.OPTIONS.INFO); Map> all = config.getRaw(); for (String key : args) { Setting value = all.get(key); if (value == null) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CLNoInfo")); } else { OutputController.getLogger().printOutLn(R("CLDescription", value.getDescription())); OutputController.getLogger().printOutLn(R("CLValue", value.getValue())); if (value.getValidator() != null) { OutputController.getLogger().printOutLn("\t" + R("VVPossibleValues", value.getValidator().getPossibleValues())); } OutputController.getLogger().printOutLn(R("CLValueSource", value.getSource())); } } return SUCCESS; } /** * Prints a help message for the 'check' command */ public void printCheckHelp() { OutputController.getLogger().printOutLn(R("Usage")); OutputController.getLogger().printOutLn(" " + PROGRAM_NAME + " check"); OutputController.getLogger().printOutLn(R("CLCheckDescription")); } /** * Handles the 'check' command * * @return an integer indicating success (SUCCESS) or error in handling * the command */ public int handleCheckCommand() { if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP2)) { printCheckHelp(); return SUCCESS; } List args = optionParser.getParams(OptionsDefinitions.OPTIONS.CHECK); if (!args.isEmpty()) { printCheckHelp(); return ERROR; } Map> all = config.getRaw(); ConfiguratonValidator validator = new ConfiguratonValidator(all); validator.validate(); boolean allValid = true; for (Setting setting : validator.getIncorrectSetting()) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CLIncorrectValue", setting.getName(), setting.getValue(), setting.getValidator().getPossibleValues())); allValid = false; } for (Setting setting : validator.getUnrecognizedSetting()) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CLUnknownProperty", setting.getName())); allValid = false; } if (allValid) { OutputController.getLogger().printOutLn(R("CLNoIssuesFound")); return SUCCESS; } else { return ERROR; } } /** * Handles overall command line arguments. The argument array is split * into two pieces: the first element is assumend to be the command, and * everything after is taken to be the argument to the command. * * @return an integer representing an error code or SUCCESS if no problems * occurred. */ public int handle() { int val; if (hasUnrecognizedCommands()) { for (String unknown : optionParser.getMainArgs()) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CLUnknownCommand", unknown)); } handleHelpCommand(); val = ERROR; } else if (getNumberOfOptions() > 1) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CLUnexpectedNumberOfCommands")); val = handleHelpCommand(); } else if (optionParser.hasOption(OptionsDefinitions.OPTIONS.LIST)) { val = handleListCommand(); } else if (optionParser.hasOption(OptionsDefinitions.OPTIONS.SET)) { val = handleSetCommand(); } else if (optionParser.hasOption(OptionsDefinitions.OPTIONS.RESET)) { val = handleResetCommand(); } else if (optionParser.hasOption(OptionsDefinitions.OPTIONS.GET)) { val = handleGetCommand(); } else if (optionParser.hasOption(OptionsDefinitions.OPTIONS.INFO)) { val = handleInfoCommand(); } else if (optionParser.hasOption(OptionsDefinitions.OPTIONS.CHECK)) { val = handleCheckCommand(); } else if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP2)) { val = handleHelpCommand(); } else { handleHelpCommand(); val = ERROR; } return val; } private boolean hasUnrecognizedCommands() { int size = optionParser.getMainArgs().size(); return !(isDetailsValid()) && size > 0; } private boolean isDetailsValid() { int size = optionParser.getMainArgs().size(); return (optionParser.getMainArgs().contains("details") && size == 1 && optionParser.hasOption(OptionsDefinitions.OPTIONS.LIST) && getNumberOfOptions() == 1); } private int getNumberOfOptions() { int number = optionParser.getNumberOfOptions(); if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HELP2)) { number--; } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.VERBOSE)) { number--; } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS)) { number--; } return number; } /** * The starting point of the program * @param args the command line arguments to this program * @throws java.lang.Exception when it goes wrong */ public static void main(String[] args) throws Exception { // setup Swing EDT tracing: SwingUtils.setup(); try { OptionParser optionParser = new OptionParser(args, OptionsDefinitions.getItwsettingsCommands()); if (optionParser.hasOption(OptionsDefinitions.OPTIONS.DETAILS) || optionParser.hasOption(OptionsDefinitions.OPTIONS.VERBOSE)){ JNLPRuntime.setDebug(true); } if (optionParser.hasOption(OptionsDefinitions.OPTIONS.HEADLESS)) { JNLPRuntime.setHeadless(true); } DeploymentConfiguration.move14AndOlderFilesTo15StructureCatched(); if (args.length == 0) { ControlPanel.main(new String[] {}); } else { CommandLine cli = new CommandLine(optionParser); int result = cli.handle(); // instead of returning, use JNLPRuntime.exit() so we can pass back // error codes indicating success or failure. Otherwise using // this program for scripting will become much more challenging JNLPRuntime.exit(result); } } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, e); JNLPRuntime.exit(1); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/AboutPanel.java0000644000000000000000000000013213441742745025652 xustar0030 mtime=1552401893.028832846 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/AboutPanel.java0000644000175000002070000000527013441742745026466 0ustar00jvanekmock00000000000000/* AboutPanel.java -- Display information about the control panel and icedtea-web. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JLabel; import net.sourceforge.jnlp.about.AboutDialog; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.docprovider.TextsProvider; /** * This class provides a GUI interface which shows some basic information on * this project. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ public class AboutPanel extends NamedBorderPanel { public AboutPanel() { super(Translator.R("CPHeadAbout"), new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); JLabel logo = new JLabel(); JLabel aboutLabel = new JLabel("" + Translator.R("CPAboutInfo") + ""); JButton aboutButton = new JButton(Translator.R("AboutDialogueTabAbout")); aboutButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { AboutDialog.display(TextsProvider.ITWEB_SETTINGS); } }); c.fill = GridBagConstraints.BOTH; c.gridy = 0; c.gridx = 0; c.weighty = 0; c.weightx = 0; add(logo, c); c.gridx = 1; c.weightx = 1; add(aboutLabel, c); c.fill = GridBagConstraints.NONE; c.weighty = 0; c.weightx = 0; c.gridy++; c.gridx=1; add(aboutButton, c); /* Keep all the elements at the top of the panel (Extra padding) */ c.fill = GridBagConstraints.BOTH; Component filler = Box.createRigidArea(new Dimension(1, 1)); c.weighty = 1; c.gridy++; add(filler, c); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/TemporaryInternetFilesPanel.j0000644000000000000000000000013113441742745030565 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java0000644000175000002070000004312213441742745032070 0ustar00jvanekmock00000000000000/* TemporaryInternetFilesPanel.java -- Display and sets cache settings. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.Translator; /** * The actual panel that contains the fields that the user can edit accordingly. * This is provided as a pane for inside the Panel itself, can also be used to * display as a dialog. * TODO: Add functionality: * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ @SuppressWarnings("serial") public class TemporaryInternetFilesPanel extends NamedBorderPanel { private static final Long CACHE_UNLIMITED_SIZE = -1l; private static final Long CACHE_MIN_SIZE = 0l; private static final Long CACHE_MAX_SIZE = (long) Integer.MAX_VALUE; private static final Long SPINNER_STEP_SIZE = 10l; private final JSpinner cacheSizeSpinner; private static final long BYTES_TO_MEGABYTES = 1024l * 1024l; private final JCheckBox limitCacheSizeCheckBox; private final JLabel cacheSizeWarningLabel; private final DeploymentConfiguration config; private final JComboBox cbCompression; private final JButton bLocation; private final JButton resetLocation; private final JTextField location; private final JLabel locationDescription; private final JLabel lCompression; private final JLabel lCacheSize; private final JButton bViewFiles; private final JButton bCleanByApp; private final JPanel diskSpacePanel; public TemporaryInternetFilesPanel(final DeploymentConfiguration config) { super(Translator.R("CPHeadTempInternetFiles")); this.config = config; setLayout(new BorderLayout()); cacheSizeSpinner = new JSpinner(); limitCacheSizeCheckBox = new JCheckBox(Translator.R("TIFPLimitCacheSize")); cacheSizeWarningLabel = new JLabel(); lCacheSize = new JLabel(Translator.R("TIFPCacheSize") + ":"); ComboItem[] compressionOptions = {new ComboItem(Translator.R("TIFPNone"), "0"), new ComboItem("1", "1"), new ComboItem("2", "2"), new ComboItem("3", "3"), new ComboItem("4", "4"), new ComboItem("5", "5"), new ComboItem("6", "6"), new ComboItem("7", "7"), new ComboItem("8", "8"), new ComboItem(Translator.R("TIFPMax"), "9"),}; cbCompression = new JComboBox<>(compressionOptions); lCompression = new JLabel(Translator.R("TIFPCompressionLevel") + ":"); // Sets compression level for jar files. bLocation = new JButton(Translator.R("TIFPChange") + "..."); resetLocation = new JButton(Translator.R("CPFilesLogsDestDirResert")); location = new JTextField(PathsAndFiles.CACHE_DIR.getFullPath(config)); locationDescription = new JLabel(Translator.R("TIFPLocationLabel") + ":"); bViewFiles = new JButton(Translator.R("TIFPViewFiles")); bCleanByApp = new JButton(Translator.R("TIFPCleanByApp")); diskSpacePanel = new JPanel(); diskSpacePanel.setLayout(new GridBagLayout()); addComponents(); if (limitCacheSizeCheckBox.isSelected()) { showCacheSizeSpinnerGUIElements(true); if (parseLong(cacheSizeSpinner.getValue().toString()) == 0) { showCompressionAndLocationGUIElements(false); } else { showCompressionAndLocationGUIElements(true); } } else { showCacheSizeSpinnerGUIElements(false); showCompressionAndLocationGUIElements(true); } } /** * Add components to panel. */ private void addComponents() { GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; JLabel description = new JLabel(Translator.R("CPTempInternetFilesDescription")); // This section deals with how to use the disk space. cbCompression.setSelectedIndex(parseInt(this.config.getProperty(DeploymentConfiguration.KEY_CACHE_COMPRESSION_ENABLED))); cbCompression.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { config.setProperty(DeploymentConfiguration.KEY_CACHE_COMPRESSION_ENABLED, ((ComboItem) e.getItem()).getValue()); } }); //Override getNextValue and getPreviousValue to make it jump to the closest increment/decrement of step size final Long configCacheSize = parseLong(this.config.getProperty(DeploymentConfiguration.KEY_CACHE_MAX_SIZE)); final Long initialCacheSize = configCacheSize < CACHE_MIN_SIZE ? CACHE_MIN_SIZE : configCacheSize; final SpinnerNumberModel snmCacheSize = new PowerOfSpinnerNumberModel(initialCacheSize, TemporaryInternetFilesPanel.CACHE_MIN_SIZE, TemporaryInternetFilesPanel.CACHE_MAX_SIZE, TemporaryInternetFilesPanel.SPINNER_STEP_SIZE); cacheSizeSpinner.setModel(snmCacheSize); final SpinnerChangeListener listener = new SpinnerChangeListener(); cacheSizeSpinner.addChangeListener(listener); cacheSizeSpinner.setToolTipText(Translator.R("TIFPCacheSizeSpinnerTooltip", CACHE_MIN_SIZE, CACHE_MAX_SIZE)); limitCacheSizeCheckBox.setSelected(configCacheSize >= CACHE_MIN_SIZE); limitCacheSizeCheckBox.addItemListener(new CheckboxItemListener()); c.gridx = 0; c.weightx = 1; c.gridy = 0; diskSpacePanel.add(limitCacheSizeCheckBox, c); c.gridy = 1; diskSpacePanel.add(lCacheSize, c); c.gridx = 1; c.weightx = 1; c.gridwidth = 2; diskSpacePanel.add(cacheSizeSpinner, c); c.gridwidth = 1; c.gridy = 2; c.gridx = 0; diskSpacePanel.add(cacheSizeWarningLabel, c); c.gridx = 0; c.gridy = 3; diskSpacePanel.add(lCompression, c); c.gridx = 1; c.gridwidth = 2; diskSpacePanel.add(cbCompression, c); resetLocation.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { location.setText(PathsAndFiles.CACHE_DIR.getDefaultFullPath()); //background engine is clever. Will reset for us if it will see default path here PathsAndFiles.CACHE_DIR.setValue(PathsAndFiles.CACHE_DIR.getDefaultFullPath(), config); showCacheSizeSpinnerGUIElements(limitCacheSizeCheckBox.isSelected()); } }); // This displays the option for changing location of cache // User can NOT edit the text field must do it through dialog. location.setEditable(false); // Can not c&p into the location field. bLocation.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = new JFileChooser(location.getText()); fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); fileChooser.setFileHidingEnabled(false); fileChooser.setAcceptAllFileFilterUsed(false); fileChooser.setDialogTitle(Translator.R("TIFPLocationLabel")); if (fileChooser.showDialog(null, Translator.R("TIFPFileChooserChooseButton")) == JFileChooser.APPROVE_OPTION) { // Check if we have permission to write to that location. String result = fileChooser.getSelectedFile().getAbsolutePath(); File dirLocation = new File(result); boolean canWrite = dirLocation.canWrite(); while (!canWrite && dirLocation != null) { // File does not exist, or no permission. if (dirLocation.exists()) { JOptionPane.showMessageDialog(null, "No permission to write to this location."); return; } dirLocation = dirLocation.getParentFile(); canWrite = dirLocation.canWrite(); } if (canWrite) { location.setText(result); PathsAndFiles.CACHE_DIR.setValue(result, config); showCacheSizeSpinnerGUIElements(limitCacheSizeCheckBox.isSelected()); } } } }); bViewFiles.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { CacheViewer.showCacheDialog(config); } }); bCleanByApp.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { CacheAppViewer psd = new CacheAppViewer(config); psd.setResizable(true); psd.centerDialog(); psd.setVisible(true); psd.dispose(); } }); c.gridy = 4; c.gridx = 0; c.weightx = 1; c.gridwidth = 1; diskSpacePanel.add(locationDescription, c); c.gridy = 5; c.gridwidth = 1; diskSpacePanel.add(location, c); c.gridx = 1; c.weightx = 0.5; diskSpacePanel.add(resetLocation, c); c.gridx = 2; c.weightx = 0.5; diskSpacePanel.add(bLocation, c); c.gridy = 6; c.gridx = 1; diskSpacePanel.add(bViewFiles, c); c.gridx = 2; diskSpacePanel.add(bCleanByApp, c); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(description, BorderLayout.NORTH); panel.add(diskSpacePanel, BorderLayout.CENTER); add(panel, BorderLayout.CENTER); this.addComponentListener(new ComponentAdapter() { @Override public void componentShown(final ComponentEvent componentEvent) { listener.stateChanged(null); } }); } private long getCurrentUsableSpace() { long usableDiskSpace = new File(PathsAndFiles.CACHE_DIR.getFullPath(config)).getUsableSpace() / BYTES_TO_MEGABYTES; // getUsableSpace returns bytes return usableDiskSpace; } private static class PowerOfSpinnerNumberModel extends SpinnerNumberModel { private final List powersOf; public PowerOfSpinnerNumberModel(final Long initialCacheSize, final Long cacheMinSize, final Long cacheMaxSize, final Long spinnerStepSize) { super(initialCacheSize, cacheMinSize, cacheMaxSize, spinnerStepSize); powersOf = new ArrayList<>(); final int powersListSize = (int) Math.floor(Math.log(cacheMaxSize) / Math.log(spinnerStepSize) + 1); for (int i = 0; i < powersListSize; i++) { final long powerOfTen = (long) Math.pow(spinnerStepSize, i); powersOf.add(powerOfTen); } } @Override public Long getNextValue() { final Number raw = (Number) super.getValue(); if (super.getNextValue() == null) { return (Long) getMaximum(); } final Long original = raw.longValue(); final Long result = original - (original % powersOf.get(String.valueOf(original).length() - 1)) + powersOf.get(String.valueOf(original).length() - 1); if (result < (Long) getMaximum()) { return result; } return (Long) getMaximum(); } @Override public Long getPreviousValue() { final Number raw = (Number) super.getValue(); final Long original = raw.longValue(); if (super.getPreviousValue() == null) { if (original > 0) { return original - 1; } return (Long) getMinimum(); } final Long result; if (powersOf.contains(original)) { result = original - powersOf.get(String.valueOf(original).length() - 2); return result; } else { if (original % powersOf.get(String.valueOf(original).length() - 1) == 0) { result = original - powersOf.get(String.valueOf(original).length() - 1); } else { result = original - original % powersOf.get(String.valueOf(original).length() - 1); } if (result > Long.valueOf(0)) { return result; } } return Long.valueOf(0); } } private class SpinnerChangeListener implements ChangeListener { @Override public void stateChanged(final ChangeEvent e) { final long usableDiskSpace = getCurrentUsableSpace(); final long cacheSizeSpinnerValue = (long) cacheSizeSpinner.getValue(); if (limitCacheSizeCheckBox.isSelected()) { showCompressionAndLocationGUIElements(true); if (cacheSizeSpinnerValue > usableDiskSpace) { cacheSizeWarningLabel.setText(Translator.R("TIFPCacheSizeSpinnerValueTooLargeWarning", usableDiskSpace)); } else if (cacheSizeSpinnerValue == 0) { cacheSizeWarningLabel.setText(Translator.R("TIFPCacheSizeSetToNoCaching")); showCompressionAndLocationGUIElements(false); } else { cacheSizeWarningLabel.setText(Translator.R("TIFPCacheSizeSpinnerLargeValueWarning", usableDiskSpace)); } config.setProperty(DeploymentConfiguration.KEY_CACHE_MAX_SIZE, Long.valueOf(cacheSizeSpinnerValue).toString()); } else { showCacheSizeSpinnerGUIElements(false); showCompressionAndLocationGUIElements(true); } } } private class CheckboxItemListener implements ItemListener { @Override public void itemStateChanged(final ItemEvent e) { final boolean selected = e.getStateChange() == ItemEvent.SELECTED; showCacheSizeSpinnerGUIElements(selected); if (parseLong(cacheSizeSpinner.getValue().toString()) == 0 && selected) { showCompressionAndLocationGUIElements(false); } else { showCompressionAndLocationGUIElements(true); } if (selected) { config.setProperty(DeploymentConfiguration.KEY_CACHE_MAX_SIZE, cacheSizeSpinner.getValue().toString()); } else { config.setProperty(DeploymentConfiguration.KEY_CACHE_MAX_SIZE, Long.toString(CACHE_UNLIMITED_SIZE)); } config.setProperty(DeploymentConfiguration.KEY_CACHE_ENABLED, String.valueOf(!selected)); } } private void showCompressionAndLocationGUIElements(boolean bool) { cbCompression.setEnabled(bool); lCompression.setEnabled(bool); resetLocation.setEnabled(bool); bLocation.setEnabled(bool); location.setEnabled(bool); locationDescription.setEnabled(bool); bViewFiles.setEnabled(bool); } private void showCacheSizeSpinnerGUIElements(boolean bool){ lCacheSize.setEnabled(bool); cacheSizeSpinner.setEnabled(bool); cacheSizeWarningLabel.setEnabled(bool); long usableDiskSpace = getCurrentUsableSpace(); if(bool == false) { cacheSizeSpinner.setToolTipText(null); cacheSizeWarningLabel.setText(Translator.R("TIFPCacheSizeSpinnerLargeValueWarning", usableDiskSpace)); } else { cacheSizeSpinner.setToolTipText(Translator.R("TIFPCacheSizeSpinnerTooltip", CACHE_MIN_SIZE, CACHE_MAX_SIZE)); final long cacheSizeSpinnerValue = (long) cacheSizeSpinner.getValue(); if(cacheSizeSpinnerValue > usableDiskSpace) { cacheSizeWarningLabel.setText(Translator.R("TIFPCacheSizeSpinnerValueTooLargeWarning", usableDiskSpace)); } else if (cacheSizeSpinnerValue == 0) { cacheSizeWarningLabel.setText(Translator.R("TIFPCacheSizeSetToNoCaching")); } } } }icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/DocumentAdapter.java0000644000000000000000000000013213441742745026677 xustar0030 mtime=1552401893.025832852 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/DocumentAdapter.java0000644000175000002070000000567713441742745027526 0ustar00jvanekmock00000000000000/* DocumentAdapter.java -- Updates properties. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.util.logging.OutputController; /** * Updates the property as it happens. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ public class DocumentAdapter implements DocumentListener { String[] fields; int index; String property; DeploymentConfiguration config; int mode; /** * This creates a new instance of DocumentAdapter. * * @param fields The list of property. * @param index Location of property to modify. */ public DocumentAdapter(String[] fields, int index) { this.fields = fields; this.index = index; mode = 1; } /** * This creates a new instance of DocumentAdapter. This allows modifying * the configuration directly. * * @param config ConfigurationFile containing the properties. * @param property Name of property to modify. */ public DocumentAdapter(DeploymentConfiguration config, String property) { this.property = property; this.config = config; mode = 2; } @Override public void insertUpdate(DocumentEvent e) { update(e); } @Override public void removeUpdate(DocumentEvent e) { update(e); } @Override public void changedUpdate(DocumentEvent e) { } /** * Update the property as on the appropriate items. * * @param e The event that caused the call. */ private void update(DocumentEvent e) { Document d = e.getDocument(); try { String value = d.getText(0, d.getLength()).trim(); value = (value.length() == 0) ? null : value; if (mode == 1) { fields[index] = value; } else if (mode == 2) { config.setProperty(property, value); } } catch (BadLocationException e1) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e1); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/CachePane.java0000644000000000000000000000013213441742745025427 xustar0030 mtime=1552401893.025832852 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/CachePane.java0000644000175000002070000005254213441742745026247 0ustar00jvanekmock00000000000000/* CachePane.java -- Displays the specified folder and allows modification to its content. Copyright (C) 2013 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.SystemColor; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.channels.FileLock; import java.text.DateFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.Enumeration; import java.util.List; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; import net.sourceforge.jnlp.cache.CacheDirectory; import net.sourceforge.jnlp.cache.CacheEntry; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.cache.DirectoryNode; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.PropertiesFile; import net.sourceforge.jnlp.util.StreamUtils; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.ui.NonEditableTableModel; import net.sourceforge.swing.SwingUtils; public class CachePane extends JPanel { final JDialog parent; final DeploymentConfiguration config; private JComponent defaultFocusComponent; String[] columns = { Translator.R("CVCPColName"), Translator.R("CVCPColPath"), Translator.R("CVCPColType"), Translator.R("CVCPColDomain"), Translator.R("CVCPColSize"), Translator.R("CVCPColLastModified"), CacheEntry.KEY_JNLP_PATH }; JTable cacheTable; private JButton deleteButton, refreshButton, doneButton, cleanAll, infoButton; /** * Creates a new instance of the CachePane. * * @param parent The parent dialog that uses this pane. * @param config configuration tobe worked on */ public CachePane(JDialog parent, DeploymentConfiguration config) { super(new BorderLayout()); this.parent = parent; this.config = config; addComponents(); } /** * Add components to the pane. */ private void addComponents() { JPanel topPanel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; TableModel model = new NonEditableTableModel(columns, 0); cacheTable = new JTable(model); cacheTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); cacheTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override final public void valueChanged(ListSelectionEvent listSelectionEvent) { // If no row has been selected, disable the delete button, else enable it if (cacheTable.getSelectionModel().isSelectionEmpty()) { deleteButton.setEnabled(false); infoButton.setEnabled(false); } else { deleteButton.setEnabled(true); infoButton.setEnabled(true); } } }); cacheTable.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN); cacheTable.setPreferredScrollableViewportSize(new Dimension(600, 200)); cacheTable.setFillsViewportHeight(true); JScrollPane scrollPane = new JScrollPane(cacheTable); TableRowSorter tableSorter = new TableRowSorter<>(model); final Comparator> comparator = new Comparator>() { // General purpose Comparator @Override @SuppressWarnings("unchecked") public final int compare(final Comparable a, final Comparable b) { return a.compareTo(b); } }; tableSorter.setComparator(1, comparator); // Comparator for path column. tableSorter.setComparator(4, comparator); // Comparator for size column. tableSorter.setComparator(5, comparator); // Comparator for modified column. cacheTable.setRowSorter(tableSorter); final DefaultTableCellRenderer tableCellRenderer = new DefaultTableCellRenderer() { @Override public final Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); switch (column) { case 1: // Path column // Render absolute path super.setText(((File)value).getAbsolutePath()); break; case 4: // Size column // Render size formatted to default locale's number format super.setText(NumberFormat.getInstance().format(value)); break; case 5: // last modified column // Render modify date formatted to default locale's date format super.setText(DateFormat.getDateInstance().format(value)); } return this; } }; // TableCellRenderer for path column cacheTable.getColumn(this.columns[1]).setCellRenderer(tableCellRenderer); // TableCellRenderer for size column cacheTable.getColumn(this.columns[4]).setCellRenderer(tableCellRenderer); // TableCellRenderer for last modified column cacheTable.getColumn(this.columns[5]).setCellRenderer(tableCellRenderer); c.weightx = 1; c.weighty = 1; c.gridx = 0; c.gridy = 0; topPanel.add(scrollPane, c); this.add(topPanel, BorderLayout.CENTER); this.add(createButtonPanel(), BorderLayout.SOUTH); } /** * Create the buttons panel. * * @return JPanel containing the buttons. */ private Component createButtonPanel() { JPanel buttonPanel = new JPanel(new GridLayout(1, 0)); JPanel leftPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); JPanel rightPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING)); List buttons = new ArrayList<>(); this.infoButton = new JButton(Translator.R("ButMoreInformation")); infoButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JDialog jd = new JDialog(parent, true); JTextArea t = new JTextArea(); t.setEditable(false); int row = cacheTable.getSelectedRow(); try { int modelRow = cacheTable.convertRowIndexToModel(row); DirectoryNode fileNode = ((DirectoryNode) cacheTable.getModel().getValueAt(modelRow, 0)); File selectedFile = fileNode.getFile(); File infoFile = new File(selectedFile + CacheDirectory.INFO_SUFFIX); String info = StreamUtils.readStreamAsString(new FileInputStream(infoFile), true); t.setText(info); } catch (Exception ex) { t.setText(ex.toString()); } jd.add(t); jd.setSize(300, 300); jd.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); jd.setVisible(true); } }); infoButton.setEnabled(false); buttons.add(infoButton); this.deleteButton = new JButton(Translator.R("CVCPButDelete")); deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { disableButtons(); // Delete on AWT thread after this action has been performed // in order to allow the cache viewer to update itself invokeLaterDelete(); } }); deleteButton.setEnabled(false); buttons.add(deleteButton); this.cleanAll = new JButton(Translator.R("CVCPCleanCache")); cleanAll.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { disableButtons(); // Delete on AWT thread after this action has been performed // in order to allow the cache viewer to update itself invokeLaterDeleteAll(); } }); buttons.add(cleanAll); this.refreshButton = new JButton(Translator.R("CVCPButRefresh")); refreshButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { disableButtons(); // Populate cacheTable on AWT thread after this action event has been performed invokeLaterPopulateTable(); } }); refreshButton.setEnabled(false); buttons.add(refreshButton); this.doneButton = new JButton(Translator.R("ButDone")); doneButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent( new WindowEvent(parent, WindowEvent.WINDOW_CLOSING)); } }); int maxWidth = 0; int maxHeight = 0; for (JButton button : buttons) { maxWidth = Math.max(button.getMinimumSize().width, maxWidth); maxHeight = Math.max(button.getMinimumSize().height, maxHeight); } int wantedWidth = maxWidth + 10; int wantedHeight = maxHeight; for (JButton button : buttons) { button.setPreferredSize(new Dimension(wantedWidth, wantedHeight)); leftPanel.add(button); } doneButton.setPreferredSize(new Dimension(wantedWidth, wantedHeight)); doneButton.setEnabled(false); rightPanel.add(doneButton); buttonPanel.add(leftPanel); buttonPanel.add(rightPanel); return buttonPanel; } /** * Posts an event to the event queue to delete the currently selected * resource in {@link CachePane#cacheTable} after the {@code CachePane} and * {@link CacheViewer} have been instantiated and painted. * @see CachePane#cacheTable */ private void invokeLaterDelete() { SwingUtils.invokeLater(new Runnable() { @Override public void run() { try { FileLock fl = null; File netxRunningFile = new File(PathsAndFiles.MAIN_LOCK.getFullPath(config)); if (!netxRunningFile.exists()) { try { FileUtils.createParentDir(netxRunningFile); FileUtils.createRestrictedFile(netxRunningFile, true); } catch (IOException e1) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e1); } } try { fl = FileUtils.getFileLock(netxRunningFile.getPath(), false, false); } catch (FileNotFoundException e1) { } int row = cacheTable.getSelectedRow(); try { if (fl == null) { JOptionPane.showMessageDialog(parent, Translator.R("CCannotClearCache")); return; } int modelRow = cacheTable.convertRowIndexToModel(row); DirectoryNode fileNode = ((DirectoryNode) cacheTable.getModel().getValueAt(modelRow, 0)); if (fileNode.getFile().delete()) { updateRecentlyUsed(fileNode.getFile()); fileNode.getParent().removeChild(fileNode); FileUtils.deleteWithErrMesg(fileNode.getInfoFile()); ((NonEditableTableModel) cacheTable.getModel()).removeRow(modelRow); cacheTable.getSelectionModel().clearSelection(); CacheDirectory.cleanParent(fileNode); } } catch (Exception exception) { // ignore } if (fl != null) { try { fl.release(); fl.channel().close(); } catch (IOException e1) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e1); } } } catch (Exception exception) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, exception); } finally { restoreDisabled(); } } private void updateRecentlyUsed(File f) { File recentlyUsedFile = new File(PathsAndFiles.getRecentlyUsedFile().getFullPath(config)); PropertiesFile pf = new PropertiesFile(recentlyUsedFile); pf.load(); Enumeration en = pf.keys(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); if (pf.get(key).equals(f.getAbsolutePath())) { pf.remove(key); } } pf.store(); } }); } private void invokeLaterDeleteAll() { SwingUtils.invokeLater(new Runnable() { @Override public void run() { try { visualCleanCache(parent); populateTable(); } catch (Exception exception) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, exception); } finally { restoreDisabled(); } } }); } /** * Posts an event to the event queue to populate the * {@link CachePane#cacheTable} after the {@code CachePane} and * {@link CacheViewer} have been instantiated and painted. * @see CachePane#populateTable */ final void invokeLaterPopulateTable() { SwingUtils.invokeLater(new Runnable() { @Override public void run() { try { populateTable(); // Disable cacheTable when no data to display, so no events are generated if (cacheTable.getModel().getRowCount() == 0) { cacheTable.setEnabled(false); cacheTable.setBackground(SystemColor.control); // No data in cacheTable, so nothing to delete deleteButton.setEnabled(false); infoButton.setEnabled(false); } else { cacheTable.setEnabled(true); cacheTable.setBackground(SystemColor.text); } } catch (Exception exception) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, exception); } finally { refreshButton.setEnabled(true); doneButton.setEnabled(true); cleanAll.setEnabled(true); } } }); } /** * Populate the table with fresh data. Any manual updates to the cache * directory will be updated in the table. */ private void populateTable() { try { // Populating the cacheTable may take a while, so indicate busy by cursor parent.getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); NonEditableTableModel tableModel; (tableModel = (NonEditableTableModel)cacheTable.getModel()).setRowCount(0); //Clears the table for (Object[] v : generateData()) { tableModel.addRow(v); } } catch (Exception exception) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, exception); } finally { // Reset cursor parent.getContentPane().setCursor(Cursor.getDefaultCursor()); } } /** * This creates the data for the table. * * @return ArrayList containing an Object array of data for each row in the * table. */ public static ArrayList generateData() { DirectoryNode root = new DirectoryNode("Root", PathsAndFiles.CACHE_DIR.getFile(), null); CacheDirectory.getDirStructure(root); ArrayList data = new ArrayList<>(); for (DirectoryNode identifier : root.getChildren()) { for (DirectoryNode type : identifier.getChildren()) { for (DirectoryNode domain : type.getChildren()) { //after domain, there is optional port dir. It is skipped here (as is skipped path on domain) for (DirectoryNode leaf : CacheDirectory.getLeafData(domain)) { final File f = leaf.getFile(); PropertiesFile pf = new PropertiesFile(new File(f.toString() + CacheDirectory.INFO_SUFFIX)); // if jnlp-path in .info equals path of app to delete mark to delete String jnlpPath = pf.getProperty(CacheEntry.KEY_JNLP_PATH); Object[] o = { leaf, f.getParentFile(), type, domain, f.length(), new Date(f.lastModified()), jnlpPath }; data.add(o); } } } } return data; } /** * Put focus onto default button. */ public void focusOnDefaultButton() { if (defaultFocusComponent != null) { defaultFocusComponent.requestFocusInWindow(); } } public void disableButtons() { // may take a while, so indicate busy by cursor parent.getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); // Disable dialog and buttons while operating deleteButton.setEnabled(false); infoButton.setEnabled(false); refreshButton.setEnabled(false); doneButton.setEnabled(false); cleanAll.setEnabled(false); } public void restoreDisabled() { cleanAll.setEnabled(true); // If nothing selected then keep deleteButton disabled if (!cacheTable.getSelectionModel().isSelectionEmpty()) { deleteButton.setEnabled(true); infoButton.setEnabled(true); } // Enable buttons refreshButton.setEnabled(true); doneButton.setEnabled(true); // If cacheTable is empty disable it and set background // color to indicate being disabled if (cacheTable.getModel().getRowCount() == 0) { cacheTable.setEnabled(false); cacheTable.setBackground(SystemColor.control); } // Reset cursor parent.getContentPane().setCursor(Cursor.getDefaultCursor()); } public static void visualCleanCache(Component parent) { try { boolean success = CacheUtil.clearCache(); if (!success) { JOptionPane.showMessageDialog(parent, Translator.R("CCannotClearCache")); } } catch (Exception ex) { JOptionPane.showMessageDialog(parent, Translator.R("CCannotClearCache")); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/desktopintegrationeditor0000644000000000000000000000013113441742745030023 xustar0030 mtime=1552401893.054832792 29 atime=1552410887.11418344 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/0000755000175000002070000000000013441742745030711 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/PaxHeaders.7406/Pane0000644000000000000000000000013213441742745030707 xustar0030 mtime=1552401893.054832792 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/Panels.java0000644000175000002070000001654713441742745033013 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel.desktopintegrationeditor; import java.awt.BorderLayout; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import net.sourceforge.jnlp.security.dialogs.SecurityDialogPanel; import static net.sourceforge.jnlp.runtime.Translator.R; public class Panels { public static JPanel createGeneratedPanel(JList list, ActionListener findOrphans) { return createIconsOrGeneratedPanel(list, findOrphans, R("DIMgeneratedJnlps"), bold(R("DIMgeneratedJnlpsTooltip"))); } public static JPanel createIconsPanel(JList list, ActionListener findOrphans) { return createIconsOrGeneratedPanel(list, findOrphans, R("DIMicons"), bold(R("DIMiconsTooltip"))); } private static JPanel createIconsOrGeneratedPanel(JList list, ActionListener findOrphans, String title, String tooltip) { JPanel iconsPanel = new JPanel(new BorderLayout()); JLabel l = new JLabel(title); l.setToolTipText(createToolTip(tooltip, list)); iconsPanel.add(l, BorderLayout.PAGE_START); JScrollPane scrollIcons = new JScrollPane(); scrollIcons.setViewportView(list); iconsPanel.add(scrollIcons, BorderLayout.CENTER); JPanel iconsToolPanel = new JPanel(new BorderLayout()); JButton findOrphansButton = new JButton(R("DIMorphans")); findOrphansButton.addActionListener(findOrphans); findOrphansButton.setToolTipText(R("DIMorphansTooltip")); iconsToolPanel.add(findOrphansButton, BorderLayout.CENTER); iconsPanel.add(iconsToolPanel, BorderLayout.PAGE_END); return iconsPanel; } public static JPanel createMenuPanel(JList list, ActionListener findIcons, ActionListener findGenerated) { return createDesktopOrMenuPanel(list, findIcons, findGenerated, R("DIMmenuItems"), bold(R("DIMmenuItemsTooltip"))); } public static JPanel createDesktopPanel(JList list, ActionListener findIcons, ActionListener findGenerated) { StringBuilder sb = new StringBuilder(); sb.append(R("DIMdesktopItemsTooltipL1")).append("
    ") .append(R("DIMdesktopItemsTooltipL2")).append(":" + "
      " + "
    • ") .append(R("DIMdesktopItemsTooltipL3")).append("
    • " + "
    • ") .append(R("DIMdesktopItemsTooltipL4")).append("
    • " + "
    • ") .append(R("DIMdesktopItemsTooltipL5")).append("
    • " + "
    ") .append(bold(R("DIMdesktopItemsTooltipL6"))); return createDesktopOrMenuPanel(list, findIcons, findGenerated, R("DIMdesktopItems"), sb.toString()); } private static JPanel createDesktopOrMenuPanel(JList list, ActionListener findIcons, ActionListener findGenerated, String title, String tooltip) { JPanel desktopPanel = new JPanel(new BorderLayout()); JLabel l = new JLabel(title); l.setToolTipText(createToolTip(tooltip, list)); desktopPanel.add(l, BorderLayout.PAGE_START); JScrollPane scrollDesktop = new JScrollPane(); scrollDesktop.setViewportView(list); desktopPanel.add(scrollDesktop, BorderLayout.CENTER); JPanel desktopToolPanel = createDesktopOrMenuToolBox(findIcons, findGenerated); desktopPanel.add(desktopToolPanel, BorderLayout.PAGE_END); return desktopPanel; } private static String createToolTip(String tooltip, JList list) { if (tooltip != null) { JListUtils.FileListBasedJListModel model = (JListUtils.FileListBasedJListModel) (list.getModel()); StringBuilder sb = new StringBuilder(); sb.append("
    • ") .append(model.getFile()).append("

    • " + "
    • ") .append(model.toString()).append("

    • " + "
    • ") .append(tooltip).append("
    "); String tt = SecurityDialogPanel.htmlWrap(sb.toString()); return tt; } return null; } private static JPanel createDesktopOrMenuToolBox(ActionListener findIcons, ActionListener findGenerated) { JPanel desktopToolPanel = new JPanel(new BorderLayout()); JButton desktopFindGeneratedButton = new JButton(R("DIMgeneratedButton")); desktopFindGeneratedButton.setToolTipText(R("DIMgeneratedButtonTooltip")); desktopFindGeneratedButton.addActionListener(findGenerated); JButton desktopFindIconsButton = new JButton(R("DIMiconsButton")); desktopFindIconsButton.setToolTipText(R("DIMiconsButtonTooltip")); desktopFindIconsButton.addActionListener(findIcons); desktopToolPanel.add(desktopFindGeneratedButton, BorderLayout.LINE_END); desktopToolPanel.add(desktopFindIconsButton, BorderLayout.LINE_START); return desktopToolPanel; } static JSplitPane createQuadroSplit(int width, JPanel menusPanel, JPanel desktopsPanel, JPanel iconsPanel, JPanel generatedsPanel) { JSplitPane splitAllAndGenerated = new JSplitPane(); JSplitPane splitIconsAndLists = new JSplitPane(); JSplitPane splitLists = new JSplitPane(); splitLists.setLeftComponent(menusPanel); splitLists.setRightComponent(desktopsPanel); splitIconsAndLists.setRightComponent(splitLists); splitIconsAndLists.setLeftComponent(iconsPanel); splitAllAndGenerated.setLeftComponent(splitIconsAndLists); splitAllAndGenerated.setRightComponent(generatedsPanel); splitAllAndGenerated.setDividerLocation(width / 5 * 4); splitIconsAndLists.setDividerLocation(width / 4); splitLists.setDividerLocation(width / 4); return splitAllAndGenerated; } private static String bold(String s) { return "" + s + ""; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/PaxHeaders.7406/Free0000644000000000000000000000033213441742745030707 xustar00128 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/FreeDesktopIntegrationEditorFrame.java 30 mtime=1552401893.030832841 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/FreeDesktopIntegrati0000644000175000002070000004407513441742745034730 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel.desktopintegrationeditor; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextPane; import javax.swing.ListModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.security.dialogs.SecurityDialogPanel; import net.sourceforge.jnlp.util.XDesktopEntry; import net.sourceforge.jnlp.util.logging.ConsoleOutputPaneModel; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.swing.SwingUtils; public class FreeDesktopIntegrationEditorFrame extends JFrame { //gui private final javax.swing.JLabel title = new JLabel(); private final javax.swing.JCheckBox selectRelativeRecordsFromOtherColumns = new JCheckBox(); private final javax.swing.JButton removeSelectedButton = new JButton(); private final javax.swing.JButton cleanAll = new JButton(); private final javax.swing.JButton closeButton = new JButton(); private final javax.swing.JButton reloadsListButton = new JButton(); private final javax.swing.JButton selectAll = new JButton(); //important ones private final javax.swing.JList menuList = new JListUtils.CustomRendererJList(); private final javax.swing.JList desktopList = new JListUtils.CustomValidatingRendererJList(); private final javax.swing.JList generatedList = new JListUtils.CustomRendererJList(); private final javax.swing.JList iconsList = new JListUtils.CustomRendererWithIconJList(); PreviewSelectionJTextPane previewPane = new PreviewSelectionJTextPane(iconsList, menuList, desktopList, generatedList); //gui end private final Blinker blinker; private void setListeners() { removeSelectedButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { FreeDesktopIntegrationEditorFrame.this.removeSelected(); } }); closeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { dispose(); } }); reloadsListButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { populateLists(); } }); selectAll.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { selectAll(); } }); cleanAll.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { cleanAll(); } }); } private void setTexts() { this.setTitle(R("DIMtitle")); closeButton.setText(R("ButClose")); removeSelectedButton.setText(R("DIMremoveSelected")); selectRelativeRecordsFromOtherColumns.setText(R("DIMselectRelativeRecordsFromOtherColumns")); reloadsListButton.setText(R("DIMreloadLists")); selectAll.setText(R("DIMselectAll")); cleanAll.setText(R("DIMclearSelection")); title.setText(SecurityDialogPanel.htmlWrap("

    " + R("DIMdescription") + "

    ")); } private JPanel createMainControls() { JPanel mainControls = new JPanel(new GridLayout(1, 2)); mainControls.add(closeButton); mainControls.add(removeSelectedButton); return mainControls; } private JPanel createMiddleToolBox() { JPanel middleToolBox = new JPanel(new GridLayout(1, 2)); middleToolBox.add(selectRelativeRecordsFromOtherColumns); middleToolBox.add(reloadsListButton); middleToolBox.add(selectAll); middleToolBox.add(cleanAll); return middleToolBox; } private JPanel createPreviewPanel(JTextPane previewPane) { JPanel previewPanel = new JPanel(new BorderLayout()); JScrollPane jScrollPane2 = new JScrollPane(); jScrollPane2.setViewportView(previewPane); previewPanel.add(jScrollPane2, BorderLayout.CENTER); createMiddleToolBox(); previewPanel.add(createMiddleToolBox(), BorderLayout.PAGE_START); return previewPanel; } private JSplitPane createListsLayout() { JPanel menusPanel = Panels.createMenuPanel(menuList, new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { selectSomeRelatives(menuList.getSelectedValuesList(), iconsList); } }, new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { selectSomeRelatives(menuList.getSelectedValuesList(), generatedList); } } ); JPanel desktopsPanel = Panels.createDesktopPanel(desktopList, new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { selectSomeRelatives(desktopList.getSelectedValuesList(), iconsList); } }, new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { selectSomeRelatives(desktopList.getSelectedValuesList(), generatedList); } } ); JPanel iconsPanel = Panels.createIconsPanel(iconsList, new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { findOrphans(iconsList, allItemsAsFiles(menuList), allItemsAsFiles(desktopList)); } }); JPanel generatedsPanel = Panels.createGeneratedPanel(generatedList, new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { findOrphans(generatedList, allItemsAsFiles(menuList), allItemsAsFiles(desktopList)); } }); return Panels.createQuadroSplit(expectedWidth, menusPanel, desktopsPanel, iconsPanel, generatedsPanel); } private void setLayout() { createMainControls(); getContentPane().add(createMainControls(), BorderLayout.PAGE_END); JSplitPane splitListsAndPreview = new JSplitPane(JSplitPane.VERTICAL_SPLIT); splitListsAndPreview.setLeftComponent(createListsLayout()); splitListsAndPreview.setRightComponent(createPreviewPanel(previewPane)); getContentPane().add(splitListsAndPreview, BorderLayout.CENTER); getContentPane().add(title, BorderLayout.PAGE_START); splitListsAndPreview.setDividerLocation(expectedHeight / 2); } public static void main(String args[]) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { new FreeDesktopIntegrationEditorFrame().setVisible(true); } }); } private boolean selecting = false; private final int expectedWidth = 800; private final int expectedHeight = 600; public FreeDesktopIntegrationEditorFrame() { setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); this.setSize(expectedWidth, expectedHeight); populateLists(); setTexts(); setListeners(); setLayout(); selectRelativeRecordsFromOtherColumns.setSelected(true); ListSelectionListener generatePreviewListener = new GeneratePreviewListener(); iconsList.addListSelectionListener(generatePreviewListener); desktopList.addListSelectionListener(generatePreviewListener); menuList.addListSelectionListener(generatePreviewListener); generatedList.addListSelectionListener(generatePreviewListener); blinker = new Blinker(selectRelativeRecordsFromOtherColumns); } private void populateLists() { menuList.setModel(new JListUtils.InfrastructureFileDescriptorListingBasedJListModel(PathsAndFiles.MENUS_DIR)); desktopList.setModel(new JListUtils.FileListBasedJListModel(new File(XDesktopEntry.findFreedesktopOrgDesktopPathCatch()), "(?i)^.*\\.desktop$") { @Override public String toString() { return R("DIMguessedDesktop"); } }); iconsList.setModel(new JListUtils.InfrastructureFileDescriptorListingBasedJListModel(PathsAndFiles.ICONS_DIR)); generatedList.setModel(new JListUtils.InfrastructureFileDescriptorListingBasedJListModel(PathsAndFiles.GEN_JNLPS_DIR)); } private void cleanAll() { selecting = true; try { clearAll(); } finally { selecting = false; } } private void clearAll() { desktopList.clearSelection(); menuList.clearSelection(); generatedList.clearSelection(); iconsList.clearSelection(); previewPane.setText(R("DIMselectionPreview")); } private void removeSelected() { int a = getTotal( objectListToFileList(iconsList.getSelectedValuesList()), objectListToFileList(menuList.getSelectedValuesList()), objectListToFileList(desktopList.getSelectedValuesList()), objectListToFileList(generatedList.getSelectedValuesList()) ); if (a <= 0) { return; } int x = JOptionPane.showConfirmDialog(this, R("DIMaskBeforeDelete", a)); if (x == JOptionPane.OK_OPTION || x == JOptionPane.YES_OPTION) { removeSelected( objectListToFileList(iconsList.getSelectedValuesList()), objectListToFileList(menuList.getSelectedValuesList()), objectListToFileList(desktopList.getSelectedValuesList()), objectListToFileList(generatedList.getSelectedValuesList()) ); populateLists(); } } private void selectAll() { selecting = true; try { selectAll(menuList); selectAll(desktopList); selectAll(iconsList); selectAll(generatedList); } finally { selecting = false; } previewPane.generatePreview(); } public List allItemsAsFiles(JList l) { return allItemsAsFiles(l.getModel()); } public List allItemsAsFiles(ListModel l) { List r = new ArrayList<>(l.getSize()); for (int i = 0; i < l.getSize(); i++) { r.add((File) l.getElementAt(i)); } return r; } private List objectListToFileList(List l) { List r = new ArrayList(l.size()); for (Object l1 : l) { r.add((File) l1); } return r; } private void removeSelected(List... a) { for (List list : a) { for (File file : list) { file.delete(); } } } private int getTotal(List... a) { int i = 0; for (List list : a) { i+=list.size(); } return i; } private void findOrphans(JList possibleOrphans, List... whereItCanBe) { selecting = true; if (selectRelativeRecordsFromOtherColumns.isSelected()) { clearAll(); blinker.blink(); } try { possibleOrphans.clearSelection(); List l = allItemsAsFiles(possibleOrphans); for (int i = 0; i < l.size(); i++) { File file = l.get(i); boolean found = false; for (List lf : whereItCanBe) { if (found) { break; } for (File f : lf) { String s = fileToString(f, false); if (s.contains(file.getAbsolutePath())) { found = true; break; } } } if (!found) { possibleOrphans.addSelectionInterval(i, i); } } } finally { selecting = false; } previewPane.generatePreview(); } private void selectSomeRelatives(List selected, JList target) { selecting = true; try { selectFileFromShortcuts(selected, target); } finally { selecting = false; } previewPane.generatePreview(); } private void selectAll(JList list) { int start = 0; int end = list.getModel().getSize() - 1; if (end >= 0) { list.setSelectionInterval(start, end); } } private class GeneratePreviewListener implements ListSelectionListener { public GeneratePreviewListener() { } @Override public void valueChanged(ListSelectionEvent e) { if (selecting) { return; } try { selecting = true; if (selectRelativeRecordsFromOtherColumns.isSelected()) { blinker.blink(); selectRelatives(e.getSource()); } } finally { selecting = false; } previewPane.generatePreview(); } } private void selectRelatives(Object source) { if (source instanceof JList) { int[] indexes = ((JList) (source)).getSelectedIndices(); clearAll(); ((JList) (source)).setSelectedIndices(indexes); } for (int x = 1; x <= 3; x++) { //we dont wont recurse, so sending copies in selectShortcutsByFiles( objectListToFileList(iconsList.getSelectedValuesList()), objectListToFileList(generatedList.getSelectedValuesList()) ); selectFilesByShortcuts( objectListToFileList(menuList.getSelectedValuesList()), objectListToFileList(desktopList.getSelectedValuesList()) ); } } static String fileToString(File f, boolean escape) { try (BufferedReader bufferedReader = new BufferedReader(new FileReader(f))) { StringBuilder sb = new StringBuilder(); while (true) { String line = bufferedReader.readLine(); if (line == null) { return sb.toString(); } if (escape) { line = ConsoleOutputPaneModel.escapeHtmlForJTextPane(line); } sb.append(line).append("\n"); } } catch (Exception ex) { return ex.toString(); } } private void selectShortcutsByFiles(List icons, List jnlps) { selectShortcutsWithFiles(icons, desktopList); selectShortcutsWithFiles(icons, menuList); selectShortcutsWithFiles(jnlps, desktopList); selectShortcutsWithFiles(jnlps, menuList); } private void selectFilesByShortcuts(List menu, List desktop) { selectFileFromShortcuts(desktop, iconsList); selectFileFromShortcuts(desktop, generatedList); selectFileFromShortcuts(menu, iconsList); selectFileFromShortcuts(menu, generatedList); } private void selectShortcutsWithFiles(List icons, JList list) { for (int i = 0; i < list.getModel().getSize(); i++) { File item = (File) list.getModel().getElementAt(i); String s = fileToString(item, false); for (File icon : icons) { if (s.contains(icon.getAbsolutePath())) { list.addSelectionInterval(i, i); } } } } private void selectFileFromShortcuts(List shortcuts, JList files) { for (File shortcut : shortcuts) { String s = fileToString(shortcut, false); for (int i = 0; i < files.getModel().getSize(); i++) { File item = (File) files.getModel().getElementAt(i); if (s.contains(item.getAbsolutePath())) { files.addSelectionInterval(i, i); } } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/PaxHeaders.7406/Blin0000644000000000000000000000013213441742745030710 xustar0030 mtime=1552401893.028832846 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/Blinker.java0000644000175000002070000000672513441742745033154 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel.desktopintegrationeditor; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JComponent; import javax.swing.Timer; import net.sourceforge.swing.SwingUtils; public class Blinker { private boolean blinking; private final JComponent compToBlink; public Blinker(JComponent compToBlink) { this.compToBlink = compToBlink; } public void blink() { if (blinking) { return; } blinking = true; Timer t = new Timer(100, new BlinkBody()); t.setInitialDelay(0); t.start(); } class BlinkBody implements ActionListener { int counter = 0; Color base; Color invert; @Override public void actionPerformed(ActionEvent e) { counter++; if (counter == 1) { base = compToBlink.getBackground(); invert = new Color(Math.min(255, base.getRed() * 2), Math.max(0, base.getGreen() / 2), 255 - base.getBlue()); } if (counter == 5) { ((Timer) e.getSource()).stop(); SwingUtils.invokeLater(new Runnable() { @Override public void run() { compToBlink.setBackground(base); blinking = false; } }); return; } SwingUtils.invokeLater(new Runnable() { @Override public void run() { if (compToBlink.getBackground().equals(base)) { compToBlink.setBackground(invert); } else { compToBlink.setBackground(base); } } }); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/PaxHeaders.7406/Prev0000644000000000000000000000032213441742745030741 xustar00120 path=icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/PreviewSelectionJTextPane.java 30 mtime=1552401893.034832833 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/PreviewSelectionJTex0000644000175000002070000001316313441742745034722 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel.desktopintegrationeditor; import java.io.File; import java.util.List; import javax.swing.JList; import javax.swing.JTextPane; import javax.swing.text.html.HTMLEditorKit; import net.sourceforge.jnlp.util.logging.OutputController; import static net.sourceforge.jnlp.runtime.Translator.R; public class PreviewSelectionJTextPane extends JTextPane { private final JList iconsList; private final JList menuList; private final JList desktopList; private final JList generatedList; public PreviewSelectionJTextPane(JList iconsList, JList menuList, JList desktopList, JList generatedList) { this.iconsList = iconsList; this.menuList = menuList; this.desktopList = desktopList; this.generatedList = generatedList; this.setEditorKit(new HTMLEditorKit()); this.setEditable(false); } private StringBuilder getMenus() { return getTextFiles(menuList.getSelectedValuesList()); } private StringBuilder getDesktops() { return getTextFiles(desktopList.getSelectedValuesList()); } private StringBuilder getGenerated() { return getTextFiles(generatedList.getSelectedValuesList()); } private StringBuilder getHeader(boolean i, boolean d, boolean m, boolean g) { StringBuilder sb = new StringBuilder(); if (i || d || m || g) { sb.append("
  • "); } if (i) { sb.append(""); } if (d) { sb.append(""); } if (m) { sb.append(""); } if (g) { sb.append(""); } if (i || d || m || g) { sb.append(""); } return sb; } public void generatePreview() { try { StringBuilder sb = new StringBuilder("
    Total tests run Passed Failed Errors
    " + (passed+failed+errored) + " " + passed + " " + failed + " " + errored + "
    ").append(R("DIMicons")).append(":").append(R("DIMdesktopItems")).append(":").append(R("DIMmenuItems")).append(":").append(R("DIMgeneratedJnlps")).append(":
    "); sb.append(getHeader(iconsList.getSelectedIndices().length > 0, menuList.getSelectedIndices().length > 0, desktopList.getSelectedIndices().length > 0, generatedList.getSelectedIndices().length > 0)).append(""); if (iconsList.getSelectedIndices().length > 0) { sb.append(""); } if (menuList.getSelectedIndices().length > 0) { sb.append(""); } if (desktopList.getSelectedIndices().length > 0) { sb.append(""); } if (generatedList.getSelectedIndices().length > 0) { sb.append(""); } sb.append("
    ").append(getIcons()).append("").append(getMenus()).append("").append(getDesktops()).append("").append(getGenerated()).append("
    "); this.setText(sb.toString()); } catch (Exception ex) { OutputController.getLogger().log(ex); } } private StringBuilder getIcons() { StringBuilder s = new StringBuilder(); try { List l = iconsList.getSelectedValuesList(); for (Object l1 : l) { File f = (File) l1; s.append("").append(f.getAbsolutePath()).append("
    "); s.append("
    "); } } catch (Exception ex) { OutputController.getLogger().log(ex); } return s; } private StringBuilder getTextFiles(List selectedValuesList) { StringBuilder s = new StringBuilder(); for (Object i : selectedValuesList) { File f = (File) i; s.append("").append(f.getAbsolutePath()).append("
    "); s.append("
    ").append(FreeDesktopIntegrationEditorFrame.fileToString(f, true)).append("

    "); } return s; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/PaxHeaders.7406/JLis0000644000000000000000000000013213441742745030665 xustar0030 mtime=1552401893.036832829 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/JListUtils.java0000644000175000002070000002735113441742745033632 0ustar00jvanekmock00000000000000/* Copyright (C) 2015 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel.desktopintegrationeditor; import java.awt.Color; import java.awt.Component; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FilenameFilter; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import javax.imageio.ImageIO; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListModel; import javax.swing.event.ListDataListener; import net.sourceforge.jnlp.config.InfrastructureFileDescriptor; import net.sourceforge.jnlp.util.XDesktopEntry; public class JListUtils { private static Map iconCache = new HashMap<>(); private static Map textFilesCache = new HashMap<>(); private static Map stamps = new HashMap<>(); public static class InfrastructureFileDescriptorListingBasedJListModel extends FileListBasedJListModel { private final InfrastructureFileDescriptor source; public InfrastructureFileDescriptorListingBasedJListModel(InfrastructureFileDescriptor source, String mask) { super(source.getFile(), mask); this.source = source; } public InfrastructureFileDescriptorListingBasedJListModel(InfrastructureFileDescriptor source) { super(source.getFile()); this.source = source; } public InfrastructureFileDescriptor getSource() { return source; } @Override protected File getFile() { return source.getFile(); } @Override public String toString() { return source.toString(); } } public static class FileListBasedJListModel implements ListModel { private final File directory; private File[] list; private final Pattern mask; /** * Construct list containing all files from given directory * * @param dir */ public FileListBasedJListModel(File dir) { //calling constructor with regex matching every file this(dir, ".*"); } /** * Construct list containing files from given directory matching regex of given mask, * * @param dir directory to list * @param mask regex to match files to display */ public FileListBasedJListModel(File dir, final String mask) { directory = dir; this.mask = Pattern.compile(mask); } protected File getFile() { return directory; } @Override public String toString() { return getFile().getAbsolutePath(); } private File[] populateList() { list = getFile().listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return mask.matcher(name).matches(); } }); if (list == null) { list = new File[0]; } return list; } @Override public int getSize() { if (list == null) { populateList(); } return list.length; } @Override public Object getElementAt(int index) { if (list == null) { populateList(); } if (list.length == 0) { return "??"; } return list[index]; } @Override public void addListDataListener(ListDataListener l) { } @Override public void removeListDataListener(ListDataListener l) { } } public static class CustomRendererJList extends JList { public CustomRendererJList() { this.setCellRenderer(new FileCellRenderer()); } } public static class CustomValidatingRendererJList extends JList { public CustomValidatingRendererJList() { this.setCellRenderer(new ValidatingFileCellRenderer()); } } public static class CustomRendererWithIconJList extends JList { public CustomRendererWithIconJList() { setCellRenderer(new IconisedCellRenderer()); } } private static class FileCellRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { File f = (File) value; JLabel label = (JLabel) super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); label.setText(f.getName()); return label; } } private static class ValidatingFileCellRenderer extends FileCellRenderer { @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel l = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); File f = (File) value; String s = processTextFilesCache(f); if (!isSelected) { if (isJavaws(s)) { l.setBackground(new Color(0, 200, 0)); } else if (isBrowser(s)) { l.setBackground(new Color(100, 150, 0)); } else { l.setBackground(new Color(255, 200, 200)); } } else { if (isJavaws(s)) { l.setForeground(new Color(0, 200, 0)); } else if (isBrowser(s)) { l.setForeground(new Color(100, 150, 0)); } else { l.setForeground(new Color(255, 200, 200)); } } return l; } private boolean isJavaws(String s) { return haveString(s, "javaws"); } private boolean isBrowser(String s) { String[] browsers = XDesktopEntry.BROWSERS; for (String browser : browsers) { if (haveString(s, browser)) { return true; } } return false; } private boolean haveString(String s, String i) { return s.matches("(?sm).*^.*Exec.*=.*" + i + ".*$.*"); } } private static class IconisedCellRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { File f = (File) value; JLabel label = (JLabel) super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); label.setIcon(processIconCache(f)); label.setText(f.getName()); label.setHorizontalTextPosition(JLabel.RIGHT); return label; } } /** * This method looks to cache whether file F was already read as image. * If not, file is loaded, put to cache and returned * If so, it also check whether it was modified. If so, it is reloaded, replaced in cache and returned. * * @param f * @return */ private static Icon processIconCache(File f) { Icon i = iconCache.get(f); if (i == null) { i = updateIconCache(f, i); } else { if (f.lastModified() != stamps.get(f)) { i = updateIconCache(f, i); } } return i; } /** * This method load Icon from file. * Once file is loaded, it is stored also to cache * Also the time stamp of last modification is stored to cache to allow reloading when changed. * * @param f file to load, and to provide timestamp of last modification * @return loaded icon or null */ private static Icon updateIconCache(File f, Icon i) { i = createImageIcon(f, f.getAbsolutePath()); if (i != null) { iconCache.put(f, i); stamps.put(f, f.lastModified()); } return i; } /** * This method looks to cache whether file F was already read as text file. * If not, file is loaded, and its content is put to cache and returned as String * If so, it also check whether it was modified. If so, it is reloaded, replaced in cache and returned. * * @param f * @return */ private static String processTextFilesCache(File f) { String s = textFilesCache.get(f); if (s == null) { s = updateTextCache(f, s); } else { if (f.lastModified() != stamps.get(f)) { s = updateTextCache(f, s); } } return s; } /** * This method load Text from file. * Once file is loaded, it is stored also to cache * Also the time stamp of last modification is stored to cache to allow reloading when changed. * * @param f file to load, and to provide timestamp of last modification * @return loaded Text, error message or null */ private static String updateTextCache(File f, String s) { s = FreeDesktopIntegrationEditorFrame.fileToString(f, false); if (s != null) { textFilesCache.put(f, s); stamps.put(f, f.lastModified()); } return s; } /** * Load BufferedImage form file, scale it and converts to icon. * * @param f file to be loaded * @param description description to be provided * @return icon from file or null if something went wrong */ private static ImageIcon createImageIcon(File f, String description) { try { BufferedImage i = ImageIO.read(f); return new ImageIcon(i.getScaledInstance(50, 50, Image.SCALE_SMOOTH)); } catch (Exception ex) { //not worthy to log it. No image is there and so be it. return null; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/NamedBorderPanel.java0000644000000000000000000000013213441742745026762 xustar0030 mtime=1552401893.028832846 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/NamedBorderPanel.java0000644000175000002070000000350413441742745027574 0ustar00jvanekmock00000000000000/* NamedBorderPanel.java -- Makes a border which has a name. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.LayoutManager; import javax.swing.BorderFactory; import javax.swing.JPanel; /** * This class provides the a panel that has a border with the name specified. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ public class NamedBorderPanel extends JPanel { /** * Creates a new instance of JPanel with a named border and specified * layout. * * @param title * Name to be displayed. * @param layout * Layout to use with this panel. */ public NamedBorderPanel(String title, LayoutManager layout) { this(title); setLayout(layout); } /** * Creates a new instance of JPanel with a named border. * * @param title * Name to be displayed. */ public NamedBorderPanel(String title) { super(); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(title), BorderFactory.createEmptyBorder(5, 5, 5, 5))); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/ComboItem.java0000644000000000000000000000013213441742745025476 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/ComboItem.java0000644000175000002070000000320713441742745026310 0ustar00jvanekmock00000000000000/* ComboItem.java -- Allow storage of an item whose name differs from its value. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; /** * This is to be used with combobox items. Allows storing a value which differs * from the key. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ public class ComboItem { String text = null; private String value; // Value to be compared with. /** * Create a new instance of combobox items. * * @param text * Text to be displayed by JComboBox * @param value * Value associated with this item. */ public ComboItem(String text, String value) { this.text = text; this.value = value; } public String toString() { return this.text; } /** * Get the value associated with this item. * * @return Associated value. */ public String getValue() { return this.value; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/UnsignedAppletActionTableMode0000644000000000000000000000013213441742745030535 xustar0030 mtime=1552401893.032832837 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java0000644000175000002070000001505413441742745032446 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel; import java.util.Date; import javax.swing.event.TableModelEvent; import javax.swing.table.AbstractTableModel; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import net.sourceforge.jnlp.security.appletextendedsecurity.UrlRegEx; import net.sourceforge.jnlp.security.appletextendedsecurity.impl.UnsignedAppletActionStorageExtendedImpl; import net.sourceforge.jnlp.security.dialogs.remember.AppletSecurityActions; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; public class UnsignedAppletActionTableModel extends AbstractTableModel { final UnsignedAppletActionStorageExtendedImpl back; private final String[] columns = new String[]{Translator.R("APPEXTSECguiTableModelTableColumnRD"), Translator.R("APPEXTSECguiTableModelTableColumnDateOfAction"), Translator.R("APPEXTSECguiTableModelTableColumnDocumentBase"), Translator.R("APPEXTSECguiTableModelTableColumnCodeBase"), Translator.R("APPEXTSECguiTableModelTableColumnArchives")}; public UnsignedAppletActionTableModel(UnsignedAppletActionStorageExtendedImpl back) { this.back = back; } @Override public int getRowCount() { return back.toArray().length; } @Override public int getColumnCount() { return columns.length; } @Override public String getColumnName(int columnIndex) { return columns[columnIndex]; } @Override public Class getColumnClass(int columnIndex) { if (columnIndex == 0) { return AppletSecurityActions.class; } if (columnIndex == 1) { return Date.class; } if (columnIndex == 2) { return UrlRegEx.class; } if (columnIndex == 3) { return UrlRegEx.class; } if (columnIndex == 4) { return String.class; } return Object.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (back.isReadOnly()) { return false; } if (columnIndex == 1) { return false; } //FIXME add editor if (columnIndex == 0) { return false; } if (getValueAt(rowIndex, columnIndex - 1) == null || getValueAt(rowIndex, columnIndex - 1).toString().trim().isEmpty()) { return false; } return true; } @Override public Object getValueAt(int rowIndex, int columnIndex) { //tis returns copy, so we can save/cancel UnsignedAppletActionEntry source = back.toArray()[rowIndex]; if (columnIndex == 0) { return source.getAppletSecurityActions(); } if (columnIndex == 1) { return source.getTimeStamp(); } if (columnIndex == 2) { return source.getDocumentBase(); } if (columnIndex == 3) { return source.getCodeBase(); } if (columnIndex == 4) { return UnsignedAppletActionEntry.createArchivesString(source.getArchives()); } return null; } @Override public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) { final UnsignedAppletActionEntry source = back.toArray()[rowIndex]; back.modify(source, columnIndex, aValue.toString()); } public void addRow() { int i = getRowCount()-1; String s = "http://localhost:80/"; back.add(new UnsignedAppletActionEntry( new AppletSecurityActions(), new Date(), UrlRegEx.quoteAndStar(s), UrlRegEx.quoteAndStar(s), null)); fireTableRowsInserted(i+1, i+1); } public void removeRow(int i) { int ii = getRowCount()-1; if (ii<0){ return; } if (i<0){ return; } back.remove(i); fireTableRowsDeleted(i, i); } public void clear() { int i = getRowCount()-1; if (i<0){ return; } back.clear(); fireTableRowsDeleted(0, i); } void removeByBehaviour(ExecuteAppletAction unsignedAppletAction) { int i = getRowCount()-1; if (i<0){ return; } back.removeByBehaviour(unsignedAppletAction); fireTableRowsDeleted(0, i); } int moveUp(int selectedRow) { int i = getRowCount()-1; if (i<0){ return selectedRow; } int x = back.moveUp(selectedRow); fireTableChanged(new TableModelEvent(this, 0, i)); return x; } int moveDown(int selectedRow) { int i = getRowCount()-1; if (i<0){ return selectedRow; } int x = back.moveDown(selectedRow); fireTableChanged(new TableModelEvent(this, 0, i)); return x; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/JREPanel.java0000644000000000000000000000013213441742745025220 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/JREPanel.java0000644000175000002070000000275213441742745026036 0ustar00jvanekmock00000000000000/* JREPanel.java - Displays option for changing to another Java Runtime. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.BorderLayout; import javax.swing.JLabel; import net.sourceforge.jnlp.runtime.Translator; /** * This panel is to allow access to setting the JRE but we currently do not * support this. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ public class JREPanel extends NamedBorderPanel { /** * Creates a new instance of the JRE settings panel. (Currently not * supported). */ public JREPanel() { super(Translator.R("CPHeadJRESettings")); setLayout(new BorderLayout()); JLabel jreLabel = new JLabel("" + Translator.R("CPJRESupport") + ""); add(jreLabel, BorderLayout.NORTH); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/CacheViewer.java0000644000000000000000000000013213441742745026005 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java0000644000175000002070000001274413441742745026625 0ustar00jvanekmock00000000000000/* CacheViewer.java -- Display the GUI for viewing and deleting cache files. Copyright (C) 2013 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.Container; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.KeyEventDispatcher; import java.awt.KeyboardFocusManager; import java.awt.Toolkit; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JDialog; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.ScreenFinder; import net.sourceforge.swing.SwingUtils; /** * This class will provide a visual way of viewing cache. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ public class CacheViewer extends JDialog { private boolean initialized = false; private static final String dialogTitle = Translator.R("CVCPDialogTitle"); private final DeploymentConfiguration config; // Configuration file which contains all the settings. CachePane topPanel; /** * Creates a new instance of the cache viewer. * * @param config Deployment configuration file. */ public CacheViewer(DeploymentConfiguration config) { super((Frame) null, dialogTitle, true); // Don't need a parent. this.setName("CacheViewer"); SwingUtils.info(this); this.config = config; if (config == null) { throw new IllegalArgumentException("config: " + config); } setIconImages(ImageResources.INSTANCE.getApplicationImages()); /* Prepare for adding components to dialog box */ Container contentPane = getContentPane(); contentPane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.weighty = 1; c.gridx = 0; c.gridy = 0; topPanel = new CachePane(this, this.config); contentPane.add(topPanel, c); pack(); this.topPanel.invokeLaterPopulateTable(); /* Set focus to default button when first activated */ WindowAdapter adapter = new WindowAdapter() { private boolean gotFocus = false; @Override public void windowGainedFocus(WindowEvent we) { // Once window gets focus, set initial focus if (!gotFocus) { topPanel.focusOnDefaultButton(); gotFocus = true; } } }; addWindowFocusListener(adapter); // Add a KeyEventDispatcher to dispatch events when this CacheViewer has focus final CacheViewer cacheViewer = this; KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() { /** * Dispatches mainly the {@code KeyEvent.VK_ESCAPE} key event to * close the {@code CacheViewer} dialog. * @return {@code true} after an {@link KeyEvent#VK_ESCAPE * VK_ESCAPE} has been processed, otherwise {@code false} * @see KeyEventDispatcher */ public boolean dispatchKeyEvent(final KeyEvent keyEvent) { // Check if Esc key has been pressed if (keyEvent.getKeyCode() == KeyEvent.VK_ESCAPE && keyEvent.getID() == KeyEvent.KEY_PRESSED) { // Exclude this key event from further processing keyEvent.consume(); // Remove this low-level KeyEventDispatcher KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this); // Post close event to CacheViewer dialog Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent( new WindowEvent(cacheViewer, WindowEvent.WINDOW_CLOSING)); return true; } return false; } }); initialized = true; } /** * Display the cache viewer. * * @param config Configuration file. */ public static void showCacheDialog(final DeploymentConfiguration config) { CacheViewer psd = new CacheViewer(config); psd.setResizable(true); psd.centerDialog(); psd.setVisible(true); psd.dispose(); } /** * Check whether the dialog has finished being created. * * @return True if dialog is ready to be displayed. */ public boolean isInitialized() { return initialized; } /** * Center the dialog box. */ private void centerDialog() { ScreenFinder.centerWindowsToCurrentScreen(this); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/SecuritySettingsPanel.java0000644000000000000000000000013213441742745030130 xustar0030 mtime=1552401893.033832835 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/SecuritySettingsPanel.java0000644000175000002070000001341513441742745030744 0ustar00jvanekmock00000000000000/* SecuritySettingsPanel.java -- Display possible security settings. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.Translator; /** * This provides a way for the user to modify the security settings through a * GUI. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ @SuppressWarnings("serial") public class SecuritySettingsPanel extends NamedBorderPanel implements ActionListener { private final DeploymentConfiguration config; // NOTE: All the ones listed with "Default" are in Oracle's implementation. // Not shown on deployments.properties webpage. Add support for these later! /** List of properties used by this panel */ public static String[] properties = { "deployment.security.askgrantdialog.show", "deployment.security.askgrantdialog.notinca", "deployment.security.browser.keystore.use", // default TRUE "deployment.security.clientauth.keystore.auto", // Default FALSE "deployment.security.jsse.hostmismatch.warning", "deployment.security.https.warning.show", // Default FALSE "deployment.security.sandbox.awtwarningwindow", "deployment.security.sandbox.jnlp.enhanced", "deployment.security.validation.crl", // Default TRUE "deployment.security.validation.ocsp", // Default FALSE "deployment.security.pretrust.list", // Default TRUE "deployment.security.blacklist.check", // Default TRUE "deployment.security.password.cache", // Default TRUE "deployment.security.SSLv2Hello", // Default FALSE "deployment.security.SSLv3", // Default TRUE "deployment.security.TLSv1", // Default TRUE // "deployment.security.mixcode", // Default TRUE }; /** * This creates a new instance of the security settings panel. * * @param config * Loaded DeploymentConfiguration file. */ public SecuritySettingsPanel(DeploymentConfiguration config) { super(Translator.R("CPHeadSecurity"), new BorderLayout()); this.config = config; addComponents(); } /** * Add the components to the panel. */ private void addComponents() { JPanel topPanel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); JLabel description = new JLabel("" + Translator.R("CPSecurityDescription") + "
    "); JCheckBox[] securityGeneralOptions = { new JCheckBox(Translator.R("SGPAllowUserGrantSigned")), new JCheckBox(Translator.R("SGPAllowUserGrantUntrust")), new JCheckBox(Translator.R("SGPUseBrowserKeystore")), new JCheckBox(Translator.R("SGPUsePersonalCertOneMatch")), new JCheckBox(Translator.R("SGPWarnCertHostMismatch")), new JCheckBox(Translator.R("SGPShowValid")), new JCheckBox(Translator.R("SGPShowSandboxWarning")), new JCheckBox(Translator.R("SGPAllowUserAcceptJNLPSecurityRequests")), new JCheckBox(Translator.R("SGPCheckCertRevocationList")), new JCheckBox(Translator.R("SGPEnableOnlineCertValidate")), new JCheckBox(Translator.R("SGPEnableTrustedPublisherList")), new JCheckBox(Translator.R("SGPEnableBlacklistRevocation")), new JCheckBox(Translator.R("SGPEnableCachingPassword")), new JCheckBox(Translator.R("SGPUseSSL2")), new JCheckBox(Translator.R("SGPUseSSL3")), new JCheckBox(Translator.R("SGPUseTLS1")), }; c.fill = GridBagConstraints.BOTH; c.gridx = 0; c.weightx = 1; topPanel.add(description, c); // Only display the ones with properties that are valid or existent. for (int i = 0; i < properties.length; i++) { String s = config.getProperty(properties[i]); if (s == null) { securityGeneralOptions[i] = null; continue; } securityGeneralOptions[i].setSelected(Boolean.parseBoolean(s)); securityGeneralOptions[i].setActionCommand(properties[i]); securityGeneralOptions[i].addActionListener(this); c.gridy = i + 1; topPanel.add(securityGeneralOptions[i], c); } Component filler = Box.createRigidArea(new Dimension(1, 1)); c.weighty = 1; c.gridy++; topPanel.add(filler, c); add(topPanel, BorderLayout.CENTER); } @Override public void actionPerformed(ActionEvent e) { config.setProperty(e.getActionCommand(), String.valueOf(((JCheckBox) e.getSource()).isSelected())); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/DesktopShortcutPanel.java0000644000000000000000000000013213441742745027745 xustar0030 mtime=1552401893.033832835 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java0000644000175000002070000001223713441742745030562 0ustar00jvanekmock00000000000000/* DesktopShortcutPanel.java -- Display option for adding desktop shortcut. Copyright (C) 2015 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import net.sourceforge.jnlp.ShortcutDesc; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.controlpanel.desktopintegrationeditor.FreeDesktopIntegrationEditorFrame; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.swing.SwingUtils; /** * This class provides the panel that allows the user to set whether they want * to create a desktop shortcut for javaws. */ public class DesktopShortcutPanel extends NamedBorderPanel implements ItemListener { private final DeploymentConfiguration config; private FreeDesktopIntegrationEditorFrame integrationManagment; /** * Create a new instance of the desktop shortcut settings panel. * * @param config Loaded DeploymentConfiguration file. */ public DesktopShortcutPanel(DeploymentConfiguration config) { super(Translator.R("CPHeadDesktopIntegration"), new GridBagLayout()); this.config = config; addComponents(); } public static ComboItem deploymentJavawsShortcutToComboItem(String i) { return new ComboItem(ShortcutDesc.deploymentJavawsShortcutToString(i), i); } /** * Add components to panel. */ private void addComponents() { GridBagConstraints c = new GridBagConstraints(); JLabel description = new JLabel("" + Translator.R("CPDesktopIntegrationDescription") + "
    "); JComboBox shortcutComboOptions = new JComboBox<>(); JButton manageIntegrationsButton = new JButton(Translator.R("CPDesktopIntegrationShowIntegrations")); if (JNLPRuntime.isWindows()) { manageIntegrationsButton.setToolTipText(Translator.R("CPDesktopIntegrationLinuxOnly")); manageIntegrationsButton.setEnabled(false); } manageIntegrationsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { if (integrationManagment == null) { integrationManagment = new FreeDesktopIntegrationEditorFrame(); } integrationManagment.setVisible(true); } }); } }); ComboItem[] items = {deploymentJavawsShortcutToComboItem(ShortcutDesc.CREATE_NEVER), deploymentJavawsShortcutToComboItem(ShortcutDesc.CREATE_ALWAYS), deploymentJavawsShortcutToComboItem(ShortcutDesc.CREATE_ASK_USER), deploymentJavawsShortcutToComboItem(ShortcutDesc.CREATE_ASK_USER_IF_HINTED), deploymentJavawsShortcutToComboItem(ShortcutDesc.CREATE_ALWAYS_IF_HINTED)}; shortcutComboOptions.setActionCommand(DeploymentConfiguration.KEY_CREATE_DESKTOP_SHORTCUT); // The configuration property this combobox affects. for (int j = 0; j < items.length; j++) { shortcutComboOptions.addItem(items[j]); if (config.getProperty(DeploymentConfiguration.KEY_CREATE_DESKTOP_SHORTCUT).equals(items[j].getValue())) { shortcutComboOptions.setSelectedIndex(j); } } shortcutComboOptions.addItemListener(this); c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.gridx = 0; c.gridy = 0; add(description, c); c.gridy = 1; add(shortcutComboOptions, c); c.gridy = 2; add(manageIntegrationsButton, c); // This is to keep it from expanding vertically if resized. Component filler = Box.createRigidArea(new Dimension(1, 1)); c.gridy++; c.weighty = 1; add(filler, c); } @SuppressWarnings("unchecked") public void itemStateChanged(ItemEvent e) { ComboItem c = (ComboItem) e.getItem(); config.setProperty(((JComboBox) e.getSource()).getActionCommand(), c.getValue()); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/CacheAppViewer.java0000644000000000000000000000013213441742745026446 xustar0030 mtime=1552401893.032832837 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/CacheAppViewer.java0000644000175000002070000002025013441742745027255 0ustar00jvanekmock00000000000000/* CacheViewer.java -- Display the GUI for viewing and deleting cache files. Copyright (C) 2013 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.ListModel; import javax.swing.ListSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.ScreenFinder; import net.sourceforge.swing.SwingUtils; /** * This class will provide a visual way of viewing cache ids. * * */ public class CacheAppViewer extends JDialog { private boolean initialized = false; private static final String dialogTitle = Translator.R("CVCPDialogTitle"); private final DeploymentConfiguration config; // Configuration file which contains all the settings. /** * Creates a new instance of the cache viewer. * * @param config Deployment configuration file. */ public CacheAppViewer(DeploymentConfiguration config) { super((Frame) null, dialogTitle, true); // Don't need a parent. this.setName("CacheViewer"); SwingUtils.info(this); this.config = config; if (config == null) { throw new IllegalArgumentException("config: " + config); } setIconImages(ImageResources.INSTANCE.getApplicationImages()); /* Prepare for adding components to dialog box */ create(); } private void create() { Container parentPane = getContentPane(); Container mainPane = new JPanel(); parentPane.setLayout(new BorderLayout()); mainPane.setLayout(new GridLayout(2, 1)); parentPane.add(mainPane); final JTextArea info = new JTextArea(); info.setEditable(false); final JTabbedPane idTabs = new JTabbedPane(); final JPanel jnlpPaths = new JPanel(new BorderLayout()); jnlpPaths.setName("jnlp-path"); final JPanel domains = new JPanel(new BorderLayout()); domains.setName("domain"); idTabs.add(jnlpPaths); idTabs.add(domains); final JButton delete = new JButton(Translator.R("TIFPDeleteFiles")); DummyCacheIdListModel jnlpPathsIds = new DummyCacheIdListModel(CacheUtil.getCacheIds(".*", true, false)); DummyCacheIdListModel domainIds = new DummyCacheIdListModel(CacheUtil.getCacheIds(".*", false, true)); final JList appsByJnlpPath = new JList<>(); final JList appsByDomain = new JList<>(); appsByJnlpPath.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); appsByDomain.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); delete.setEnabled(false); delete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final Dimension d = CacheAppViewer.this.getSize(); SwingUtils.invokeLater(new Runnable() { @Override public void run() { if (idTabs.getSelectedComponent()==jnlpPaths){ CacheUtil.clearCache(appsByJnlpPath.getSelectedValue().getId(), true, false); } if (idTabs.getSelectedComponent()==domains){ CacheUtil.clearCache(appsByDomain.getSelectedValue().getId(), false, true); } CacheAppViewer.this.getContentPane().removeAll(); CacheAppViewer.this.pack(); create(); CacheAppViewer.this.setSize(d); } }); } }); appsByJnlpPath.setModel(jnlpPathsIds); appsByDomain.setModel(domainIds); appsByJnlpPath.addListSelectionListener(new DummyListSelectionListenerWithModel(info, appsByJnlpPath, delete)); appsByDomain.addListSelectionListener(new DummyListSelectionListenerWithModel(info, appsByDomain, delete)); jnlpPaths.add(mainPane.add(new JScrollPane(appsByJnlpPath))); domains.add(mainPane.add(new JScrollPane(appsByDomain))); mainPane.add(idTabs); idTabs.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { appsByDomain.clearSelection(); appsByJnlpPath.clearSelection(); } }); mainPane.add(new JScrollPane(info)); parentPane.add(delete, BorderLayout.SOUTH); pack(); } public void centerDialog() { ScreenFinder.centerWindowsToCurrentScreen(this); } private static class DummyListSelectionListenerWithModel implements ListSelectionListener { private final JTextArea info; private final JList apps; private final JButton delete; public DummyListSelectionListenerWithModel(JTextArea info, JList apps, JButton delete) { this.info = info; this.apps = apps; this.delete = delete; } @Override public void valueChanged(ListSelectionEvent e) { info.setText(""); if (apps.getSelectedValue() != null) { for (Object[] o : apps.getSelectedValue().getFiles()) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < o.length; i++) { Object object = o[i]; if (object == null) { object = "??"; } sb.append(object.toString()).append(" ; "); } info.setText(info.getText() + sb.toString() + "\n"); } delete.setEnabled(true); delete.setText(Translator.R("TIFPDeleteFiles") + " - " + apps.getSelectedValue().getFiles().size()); } else { delete.setEnabled(false); delete.setText(Translator.R("TIFPDeleteFiles")); } } } private static class DummyCacheIdListModel implements ListModel { List content; public DummyCacheIdListModel(List content){ this.content = content; } @Override public int getSize() { return content.size(); } @Override public CacheUtil.CacheId getElementAt(int index) { return content.get(index); } @Override public void addListDataListener(ListDataListener l) { } @Override public void removeListDataListener(ListDataListener l) { } }; } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/UnsignedAppletsTrustingListPa0000644000000000000000000000013213441742745030662 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java0000644000175000002070000014164113441742745033120 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.text.DateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.regex.Pattern; import javax.swing.DefaultCellEditor; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.LayoutStyle; import javax.swing.ListCellRenderer; import javax.swing.RowFilter; import javax.swing.RowSorter.SortKey; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; import net.sourceforge.jnlp.security.appletextendedsecurity.ExtendedAppletSecurityHelp; import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry; import net.sourceforge.jnlp.security.appletextendedsecurity.UrlRegEx; import net.sourceforge.jnlp.security.appletextendedsecurity.impl.UnsignedAppletActionStorageExtendedImpl; import net.sourceforge.jnlp.security.dialogs.remember.AppletSecurityActions; import net.sourceforge.jnlp.security.dialogs.remember.ExecuteAppletAction; import net.sourceforge.jnlp.util.ScreenFinder; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.swing.SwingUtils; public class UnsignedAppletsTrustingListPanel extends JPanel { private JButton helpButton; private JButton deleteButton; private JButton addRowButton; private JButton validateTableButton; private JButton testUrlButton; private JButton invertSelectionButton; private JButton moveRowUpButton; private JButton moveRowDownButton; private JCheckBox askBeforeActionCheckBox; private JCheckBox filterRegexesCheckBox; private JComboBox mainPolicyComboBox; private JComboBox deleteTypeComboBox; private JComboBox viewFilter; private JLabel globalBehaviourLabel; private JLabel securityLevelLabel; private JScrollPane userTableScrollPane; private JTabbedPane mainTabPanel; private JTable userTable; private JScrollPane globalTableScrollPane; private JTable globalTable; private final UnsignedAppletActionStorageExtendedImpl customBackEnd; private final UnsignedAppletActionStorageExtendedImpl globalBackEnd; private final UnsignedAppletActionTableModel customModel; private final UnsignedAppletActionTableModel globalModel; private final ByPermanencyFilter customFilter; private final ByPermanencyFilter globalFilter; private final DeploymentConfiguration conf; private JTable currentTable; private UnsignedAppletActionTableModel currentModel; private String lastDoc; private String lastCode; /* * for testing and playing */ public static void main(String args[]) { final String defaultDir = System.getProperty("user.home") + "/Desktop/"; final String defaultFileName1 = "terrorList1"; final String defaultFileName2 = "terrorList2"; final String defaultFile1 = defaultDir + defaultFileName1; final String defaultFile2 = defaultDir + defaultFileName2; SwingUtils.invokeLater(new Runnable() { @Override public void run() { try { JFrame f = new JFrame(); f.setLayout(new BorderLayout()); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DeploymentConfiguration cc = new DeploymentConfiguration(); cc.load(); File ff1 = new File(defaultFile1); File ff2 = new File(defaultFile2); f.add(new UnsignedAppletsTrustingListPanel(ff2, ff1, cc)); f.pack(); f.setVisible(true); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } } }); } private final UnsignedAppletsTrustingListPanel self; public UnsignedAppletsTrustingListPanel(File globalSettings, File customSettings, DeploymentConfiguration conf) { customBackEnd = new UnsignedAppletActionStorageExtendedImpl(customSettings); globalBackEnd = new UnsignedAppletActionStorageExtendedImpl(globalSettings); customModel = new UnsignedAppletActionTableModel(customBackEnd); globalModel = new UnsignedAppletActionTableModel(globalBackEnd); customFilter = new ByPermanencyFilter(customModel); globalFilter = new ByPermanencyFilter(globalModel); self=this; this.conf = conf; reloadGui(); } public static String appletItemsToCaption(List ii, String caption) { StringBuilder sb = new StringBuilder(); for (UnsignedAppletActionEntry i : ii) { sb.append(appletItemToCaption(i, caption)).append("\n"); } return sb.toString(); } public static String appletItemToCaption(UnsignedAppletActionEntry i, String caption) { return Translator.R("APPEXTSECguiPanelAppletInfoHederPart1", caption, i.getDocumentBase().getFilteredRegEx()) + "\n (" + Translator.R("APPEXTSECguiPanelAppletInfoHederPart2", i.getAppletSecurityActions().toString(), DateFormat.getInstance().format(i.getTimeStamp())) + "\n " + Translator.R("APPEXTSECguiTableModelTableColumnDocumentBase") + ": " + i.getDocumentBase().getFilteredRegEx() + "\n " + Translator.R("APPEXTSECguiTableModelTableColumnCodeBase") + ": " + i.getCodeBase().getFilteredRegEx() + "\n " + Translator.R("APPEXTSECguiTableModelTableColumnArchives") + ": " + UnsignedAppletActionEntry.createArchivesString(i.getArchives()); } public void removeSelectedFromTable(JTable table) { removeSelectedFromTable(table, askBeforeActionCheckBox.isSelected(), currentModel, this); } public static void removeSelectedFromTable(JTable table, boolean ask, UnsignedAppletActionTableModel data, Component forDialog) { int[] originalIndexes = table.getSelectedRows(); List newIndexes = new ArrayList<>(originalIndexes.length); for (int i = 0; i < originalIndexes.length; i++) { //we need to remap values first int modelRow = table.convertRowIndexToModel(originalIndexes[i]); newIndexes.add(modelRow); } //now to sort so we can incrementaly dec safely Collections.sort(newIndexes); if (ask) { String s = Translator.R("APPEXTSECguiPanelConfirmDeletionOf", newIndexes.size()) + ": \n"; UnsignedAppletActionEntry[] items = data.back.toArray(); for (int i = 0; i < newIndexes.size(); i++) { Integer integer = newIndexes.get(i); s += appletItemToCaption(items[integer], " ") + "\n"; } int a = JOptionPane.showConfirmDialog(forDialog, s); if (a != JOptionPane.OK_OPTION) { return; } } int sub = 0; for (int i = 0; i < newIndexes.size(); i++) { Integer integer = newIndexes.get(i); data.removeRow(integer.intValue() + sub); sub--; } } public void removeAllItemsFromTable(JTable table, UnsignedAppletActionTableModel model) { table.clearSelection(); if (askBeforeActionCheckBox.isSelected()) { UnsignedAppletActionEntry[] items = model.back.toArray(); String s = Translator.R("APPEXTSECguiPanelConfirmDeletionOf", items.length) + ": \n"; for (UnsignedAppletActionEntry item : items) { s += appletItemToCaption(item, " ") + "\n"; } int a = JOptionPane.showConfirmDialog(this, s); if (a != JOptionPane.OK_OPTION) { return; } } model.clear(); } ListCellRenderer comboRendererWithToolTips = new DefaultListCellRenderer() { @Override public final Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) { if (value != null) { setToolTipText(value.toString()); } return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } }; private void initComponents() { userTableScrollPane = new JScrollPane(); globalTableScrollPane = new JScrollPane(); userTable = createTable(customModel); globalTable = createTable(globalModel); helpButton = new JButton(); mainPolicyComboBox = new JComboBox<>(new AppletSecurityLevel[]{ AppletSecurityLevel.DENY_ALL, AppletSecurityLevel.DENY_UNSIGNED, AppletSecurityLevel.ASK_UNSIGNED, AppletSecurityLevel.ALLOW_UNSIGNED }); mainPolicyComboBox.setSelectedItem(AppletSecurityLevel.getDefault()); mainPolicyComboBox.setRenderer(comboRendererWithToolTips); securityLevelLabel = new JLabel(); globalBehaviourLabel = new JLabel(); deleteTypeComboBox = new JComboBox<>(); viewFilter = new JComboBox<>(); deleteButton = new JButton(); testUrlButton = new JButton(); addRowButton = new JButton(); validateTableButton = new JButton(); askBeforeActionCheckBox = new JCheckBox(); filterRegexesCheckBox = new JCheckBox(); invertSelectionButton = new JButton(); moveRowUpButton = new JButton(); moveRowDownButton = new JButton(); mainTabPanel = new JTabbedPane(); userTableScrollPane.setViewportView(userTable); globalTableScrollPane.setViewportView(globalTable); helpButton.setText(Translator.R("APPEXTSECguiPanelHelpButton")); helpButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { helpButtonActionPerformed(evt); } }); mainPolicyComboBox.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { mainPolicyComboBoxActionPerformed(evt); } }); viewFilter.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { userTable.getRowSorter().setSortKeys(null); userTable.getRowSorter().setSortKeys(null); int i = viewFilter.getSelectedIndex(); switch (i) { case 0: customFilter.setRowFilter(ByPermanencyFilter.showPermanents); globalFilter.setRowFilter(ByPermanencyFilter.showPermanents); break; case 1: customFilter.setRowFilter(ByPermanencyFilter.showTemporarilyDecisions); globalFilter.setRowFilter(ByPermanencyFilter.showTemporarilyDecisions); break; case 2: customFilter.setRowFilter(ByPermanencyFilter.showAll); globalFilter.setRowFilter(ByPermanencyFilter.showAll); break; case 3: customFilter.setRowFilter(ByPermanencyFilter.showPermanentA); globalFilter.setRowFilter(ByPermanencyFilter.showPermanentA); break; case 4: customFilter.setRowFilter(ByPermanencyFilter.showPermanentN); globalFilter.setRowFilter(ByPermanencyFilter.showPermanentN); break; case 5: customFilter.setRowFilter(ByPermanencyFilter.showHasChosenYes); globalFilter.setRowFilter(ByPermanencyFilter.showHasChosenYes); break; case 6: customFilter.setRowFilter(ByPermanencyFilter.showHasChosenNo); globalFilter.setRowFilter(ByPermanencyFilter.showHasChosenNo); break; } } }); securityLevelLabel.setText(Translator.R("APPEXTSECguiPanelSecurityLevel")); globalBehaviourLabel.setText(Translator.R("APPEXTSECguiPanelGlobalBehaviourCaption")); deleteTypeComboBox.setModel(new DefaultComboBoxModel<>(new String[]{ Translator.R("APPEXTSECguiPanelDeleteMenuSelected"), Translator.R("APPEXTSECguiPanelDeleteMenuAllA"), Translator.R("APPEXTSECguiPanelDeleteMenuAllN"), Translator.R("APPEXTSECguiPanelDeleteMenuAlly"), Translator.R("APPEXTSECguiPanelDeleteMenuAlln"), Translator.R("APPEXTSECguiPanelDeleteMenuAllAll")})); deleteTypeComboBox.setRenderer(comboRendererWithToolTips); viewFilter.setModel(new DefaultComboBoxModel<>(new String[]{ Translator.R("APPEXTSECguiPanelShowOnlyPermanent"), Translator.R("APPEXTSECguiPanelShowOnlyTemporal"), Translator.R("APPEXTSECguiPanelShowAll"), Translator.R("APPEXTSECguiPanelShowOnlyPermanentA"), Translator.R("APPEXTSECguiPanelShowOnlyPermanentN"), Translator.R("APPEXTSECguiPanelShowOnlyTemporalY"), Translator.R("APPEXTSECguiPanelShowOnlyTemporalN")})); viewFilter.setRenderer(comboRendererWithToolTips); deleteButton.setText(Translator.R("APPEXTSECguiPanelDeleteButton")); deleteButton.setToolTipText(Translator.R("APPEXTSECguiPanelDeleteButtonToolTip")); deleteButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { deleteButtonActionPerformed(evt); } }); testUrlButton.setText(Translator.R("APPEXTSECguiPanelTestUrlButton")); testUrlButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { testUrlButtonActionPerformed(evt); } }); addRowButton.setText(Translator.R("APPEXTSECguiPanelAddRowButton")); addRowButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { addRowButtonActionPerformed(evt); } }); validateTableButton.setText(Translator.R("APPEXTSECguiPanelValidateTableButton")); validateTableButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { validateTableButtonActionPerformed(evt); } }); askBeforeActionCheckBox.setSelected(true); askBeforeActionCheckBox.setText(Translator.R("APPEXTSECguiPanelAskeforeActionBox")); filterRegexesCheckBox.setText(Translator.R("APPEXTSECguiPanelShowRegExesBox")); filterRegexesCheckBox.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { filterRegexesCheckBoxActionPerformed(evt); } }); invertSelectionButton.setText(Translator.R("APPEXTSECguiPanelInverSelection")); invertSelectionButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { invertSelectionButtonActionPerformed(evt); } }); moveRowUpButton.setText(Translator.R("APPEXTSECguiPanelMoveRowUp")); moveRowUpButton.setEnabled(false); moveRowUpButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { moveRowUpButtonActionPerformed(evt); } }); moveRowDownButton.setText(Translator.R("APPEXTSECguiPanelMoveRowDown")); moveRowDownButton.setEnabled(false); moveRowDownButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { moveRowDownButtonActionPerformed(evt); } }); GroupLayout layout = new GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addContainerGap() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(mainTabPanel, GroupLayout.Alignment.LEADING, 0, 583, Short.MAX_VALUE) .addComponent(globalBehaviourLabel, GroupLayout.Alignment.LEADING, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(securityLevelLabel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(mainPolicyComboBox, 0, 474, Short.MAX_VALUE)) .addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(addRowButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(validateTableButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(testUrlButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 94, Short.MAX_VALUE) .addComponent(moveRowDownButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(moveRowUpButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(deleteButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(deleteTypeComboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(invertSelectionButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(askBeforeActionCheckBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(filterRegexesCheckBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 93, Short.MAX_VALUE) .addComponent(viewFilter, 0, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE))).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(helpButton, GroupLayout.PREFERRED_SIZE, 108, GroupLayout.PREFERRED_SIZE))).addContainerGap())); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup().addContainerGap() .addComponent(globalBehaviourLabel).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(securityLevelLabel) .addComponent(mainPolicyComboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(deleteButton) .addComponent(deleteTypeComboBox) .addComponent(invertSelectionButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(askBeforeActionCheckBox) .addComponent(filterRegexesCheckBox) .addComponent(viewFilter))) .addComponent(helpButton, GroupLayout.PREFERRED_SIZE, 53, GroupLayout.PREFERRED_SIZE)).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(mainTabPanel, GroupLayout.DEFAULT_SIZE, 161, Short.MAX_VALUE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(addRowButton) .addComponent(validateTableButton) .addComponent(testUrlButton) .addComponent(moveRowUpButton) .addComponent(moveRowDownButton)).addContainerGap())); JPanel userPanel = new JPanel(new BorderLayout()); JPanel globalPanel = new JPanel(new BorderLayout()); userPanel.add(userTableScrollPane); globalPanel.add(globalTableScrollPane); mainTabPanel.add(userPanel); mainTabPanel.add(globalPanel); mainTabPanel.setTitleAt(0, Translator.R("APPEXTSECguiPanelCustomDefs")); mainTabPanel.setTitleAt(1, Translator.R("APPEXTSECguiPanelGlobalDefs")); mainTabPanel.setToolTipTextAt(0, PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile().getAbsolutePath()); mainTabPanel.setToolTipTextAt(1, PathsAndFiles.APPLET_TRUST_SETTINGS_SYS.getFile().getAbsolutePath()); mainTabPanel.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { selectCurrentTable(); } }); } private void selectCurrentTable() { switch (mainTabPanel.getSelectedIndex()) { case 0: currentModel = customModel; currentTable = userTable; break; case 1: currentModel = globalModel; currentTable = globalTable; break; } setButtons((!currentModel.back.isReadOnly())); } private void mainPolicyComboBoxActionPerformed(java.awt.event.ActionEvent evt) { try { conf.setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, ((AppletSecurityLevel) mainPolicyComboBox.getSelectedItem()).toChars()); conf.save(); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); JOptionPane.showMessageDialog(this, ex); } } private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) { if (deleteTypeComboBox.getSelectedIndex() == 0) { removeSelectedFromTable(currentTable); } if (deleteTypeComboBox.getSelectedIndex() == 1) { removeByBehaviour(ExecuteAppletAction.ALWAYS); } if (deleteTypeComboBox.getSelectedIndex() == 2) { removeByBehaviour(ExecuteAppletAction.NEVER); } if (deleteTypeComboBox.getSelectedIndex() == 3) { removeByBehaviour(ExecuteAppletAction.YES); } if (deleteTypeComboBox.getSelectedIndex() == 4) { removeByBehaviour(ExecuteAppletAction.NO); } if (deleteTypeComboBox.getSelectedIndex() == 5) { removeAllItemsFromTable(currentTable, customModel); } } private void testUrlButtonActionPerformed(java.awt.event.ActionEvent evt) { String s1 = JOptionPane.showInputDialog(Translator.R("APPEXTSECguiPanelDocTest"), lastDoc); String s2 = JOptionPane.showInputDialog(Translator.R("APPEXTSECguiPanelCodeTest"), lastCode); lastDoc = s1; lastCode = s2; try { List i = currentModel.back.getMatchingItems(s1, s2, null); if (i == null || i.isEmpty()) { JOptionPane.showMessageDialog(this, Translator.R("APPEXTSECguiPanelNoMatch")); } else { JOptionPane.showMessageDialog(this, Translator.R("APPEXTSECguiPanelMatchingNote") + "\n" + appletItemsToCaption(i, Translator.R("APPEXTSECguiPanelMatched") + ": ")); } } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); JOptionPane.showMessageDialog(this, Translator.R("APPEXTSECguiPanelMatchingError", ex)); } } private void addRowButtonActionPerformed(java.awt.event.ActionEvent evt) { currentModel.addRow(); } private void validateTableButtonActionPerformed(java.awt.event.ActionEvent evt) { File f = null; try { f = File.createTempFile("appletTable", "validation"); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); JOptionPane.showMessageDialog(this, Translator.R("APPEXTSECguiPanelCanNOtValidate", ex.toString())); return; } try { currentModel.back.writeContentsLocked(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "UTF-8")); currentModel.back.writeContent(bw); bw.flush(); bw.close(); UnsignedAppletActionStorageExtendedImpl copy = new UnsignedAppletActionStorageExtendedImpl(f); UnsignedAppletActionEntry[] items = copy.toArray(); for (UnsignedAppletActionEntry unsignedAppletActionEntry : items) { if (unsignedAppletActionEntry.getDocumentBase() != null && !unsignedAppletActionEntry.getDocumentBase().getRegEx().trim().isEmpty()) { Pattern p = Pattern.compile(unsignedAppletActionEntry.getDocumentBase().getRegEx()); p.matcher("someInput").find(); } else { throw new RuntimeException(Translator.R("APPEXTSECguiPanelEmptyDoc")); } if (unsignedAppletActionEntry.getCodeBase() != null && !unsignedAppletActionEntry.getCodeBase().getRegEx().trim().isEmpty()) { Pattern p = Pattern.compile(unsignedAppletActionEntry.getCodeBase().getRegEx()); p.matcher("someInput").find(); } else { throw new RuntimeException(Translator.R("APPEXTSECguiPanelEmptyCode")); } UnsignedAppletActionEntry.createArchivesString(UnsignedAppletActionEntry.createArchivesList(UnsignedAppletActionEntry.createArchivesString(unsignedAppletActionEntry.getArchives()))); } JOptionPane.showMessageDialog(this, Translator.R("APPEXTSECguiPanelTableValid")); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); JOptionPane.showMessageDialog(this, Translator.R("APPEXTSECguiPanelTableInvalid", ex.toString())); } finally { f.delete(); } } private void filterRegexesCheckBoxActionPerformed(java.awt.event.ActionEvent evt) { reloadTable(); } private void invertSelectionButtonActionPerformed(java.awt.event.ActionEvent evt) { int[] selectedIndexs = currentTable.getSelectedRows(); currentTable.selectAll(); for (int i = 0; i < currentTable.getRowCount(); i++) { for (int selectedIndex : selectedIndexs) { if (selectedIndex == i) { currentTable.removeRowSelectionInterval(i, i); break; } } } } private void moveRowUpButtonActionPerformed(java.awt.event.ActionEvent evt) { int orig = currentTable.getSelectedRow(); if (orig < 0 || orig >= currentTable.getRowCount()) { return; } int nw = 0; while (true) { int i = currentTable.convertRowIndexToModel(orig); int nwx = currentModel.moveUp(i); reloadTable(); nw = currentTable.convertRowIndexToView(nwx); if (i == nwx) { break; } if (nw != orig) { break; } } //ItwLogger.getLogger().log(OutputController.Level.ERROR_ALL, orig+" "+i+" "+nwx+" "+nw+" "); if (nw != orig) { if (orig >= 1) { currentTable.getSelectionModel().setSelectionInterval(orig - 1, orig - 1); } } else { currentTable.getSelectionModel().setSelectionInterval(orig, orig); } } private void moveRowDownButtonActionPerformed(java.awt.event.ActionEvent evt) { int orig = currentTable.getSelectedRow(); if (orig < 0 || orig >= currentTable.getRowCount()) { return; } int nw = 0; while (true) { int i = currentTable.convertRowIndexToModel(orig); int nwx = currentModel.moveDown(i); reloadTable(); nw = currentTable.convertRowIndexToView(nwx); if (i == nwx) { break; } if (nw != orig) { break; } } // OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, orig+" "+i+" "+nwx+" "+nw+" "); if (nw != orig) { if (orig < currentModel.getRowCount()) { currentTable.getSelectionModel().setSelectionInterval(orig + 1, orig + 1); } } else { currentTable.getSelectionModel().setSelectionInterval(orig, orig); } } private static void helpButtonActionPerformed(java.awt.event.ActionEvent evt) { JDialog d = new ExtendedAppletSecurityHelp(null, false); ScreenFinder.centerWindowsToCurrentScreen(d); d.setVisible(true); } private void setButtons(boolean b) { deleteButton.setEnabled(b); addRowButton.setEnabled(b); invertSelectionButton.setEnabled(b); moveRowUpButton.setEnabled(b); moveRowDownButton.setEnabled(b); } private JTable createTable(final TableModel model) { final JTable jt = new JTable() { @Override public TableCellEditor getCellEditor(int row, int column) { int columnx = convertColumnIndexToModel(column); if (columnx == 0) { //FIXME add proper editor her egoes jbutton, popupr dialog return new DefaultCellEditor(new JTextField()); } if (columnx == 2) { column = convertColumnIndexToModel(column); row = convertRowIndexToModel(row); return new DefaultCellEditor(new MyTextField((UrlRegEx) (model.getValueAt(row, column)))); } if (columnx == 3) { column = convertColumnIndexToModel(column); row = convertRowIndexToModel(row); return new DefaultCellEditor(new MyTextField((UrlRegEx) (model.getValueAt(row, column)))); } return super.getCellEditor(row, column); } @Override public TableCellRenderer getCellRenderer(int row, int column) { int columnx = convertColumnIndexToModel(column); if (columnx == 1) { column = convertColumnIndexToModel(column); row = convertRowIndexToModel(row); return new UrlRegexCellRenderer.MyDateCellRenderer((Date) (model.getValueAt(row, column))); } if (columnx == 2) { if (!filterRegexesCheckBox.isSelected()) { column = convertColumnIndexToModel(column); row = convertRowIndexToModel(row); return new UrlRegexCellRenderer((UrlRegEx) (model.getValueAt(row, column))); } } if (columnx == 3) { if (!filterRegexesCheckBox.isSelected()) { column = convertColumnIndexToModel(column); row = convertRowIndexToModel(row); return new UrlRegexCellRenderer((UrlRegEx) (model.getValueAt(row, column))); } } return super.getCellRenderer(row, column); } }; jt.setRowHeight(jt.getRowHeight() + jt.getRowHeight() / 2); jt.setModel(model); jt.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1 & jt.getSelectedRowCount() == 1) { RemmeberableDialogueEditor d = new RemmeberableDialogueEditor(grabParentFrame(self), true, jt.getModel().getValueAt(jt.convertRowIndexToModel(jt.getSelectedRow()), 0)); d.setVisible(true); AppletSecurityActions result = d.getResult(); d.dispose(); if (result != null) { ((UnsignedAppletActionTableModel) (jt.getModel())).setValueAt( result, jt.convertRowIndexToModel(jt.getSelectedRow()), 0); userTableScrollPane.repaint(); globalTableScrollPane.repaint(); } } } private JFrame grabParentFrame(Component self) { Container parent = self.getParent(); while (parent!=null){ if (parent instanceof JFrame){ return (JFrame) parent; } parent=parent.getParent(); } return null; } }); jt.setToolTipText(Translator.R("EPEhelp5")); return jt; } private void reloadTable() { List l = currentTable.getRowSorter().getSortKeys(); currentTable.setModel(new DefaultTableModel()); currentTable.setModel(currentModel); { currentTable.getRowSorter().setSortKeys(l); } } private void removeByBehaviour(ExecuteAppletAction unsignedAppletAction) { UnsignedAppletActionEntry[] items = currentModel.back.toArray(); if (askBeforeActionCheckBox.isSelected()) { List toBeDeleted = new ArrayList<>(); for (UnsignedAppletActionEntry unsignedAppletActionEntry : items) { AppletSecurityActions actions = unsignedAppletActionEntry.getAppletSecurityActions(); for (int j = 0; j < actions.getRealCount(); j++) { // ExecuteAppletAction action = actions.getAction(j); // if (action == unsignedAppletAction) { // toBeDeleted.add(unsignedAppletActionEntry); // } } } String s = Translator.R("APPEXTSECguiPanelConfirmDeletionOf", toBeDeleted.size()) + ": \n"; for (UnsignedAppletActionEntry toBeDeleted1 : toBeDeleted) { s += appletItemToCaption(toBeDeleted1, " ") + "\n"; } int a = JOptionPane.showConfirmDialog(this, s); if (a != JOptionPane.OK_OPTION) { return; } } currentModel.removeByBehaviour(unsignedAppletAction); } private void reloadGui() { this.removeAll(); initComponents(); userTable.setRowSorter(customFilter); globalTable.setRowSorter(globalFilter); AppletSecurityLevel gs = AppletSecurityLevel.getDefault(); String s = this.conf.getProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL); if (s != null) { gs = AppletSecurityLevel.fromString(s); } mainPolicyComboBox.setSelectedItem(gs); userTable.getSelectionModel().addListSelectionListener(new SingleSelectionListenerImpl(userTable)); globalTable.getSelectionModel().addListSelectionListener(new SingleSelectionListenerImpl(globalTable)); userTable.addKeyListener(new DeleteAdapter(userTable)); globalTable.addKeyListener(new DeleteAdapter(globalTable)); currentTable = userTable; currentModel = customModel; setButtons((!currentModel.back.isReadOnly())); } public static final class MyTextField extends JTextField { private final UrlRegEx keeper; private MyTextField(UrlRegEx urlRegEx) { if (urlRegEx == null) { keeper = UrlRegEx.exact(""); } else { this.keeper = urlRegEx; } setText(keeper.getFilteredRegEx()); } @Override public void setText(String t) { super.setText(keeper.getRegEx()); } } public static final class UrlRegexCellRenderer extends DefaultTableCellRenderer { private final UrlRegEx keeper; private UrlRegexCellRenderer(UrlRegEx urlRegEx) { if (urlRegEx == null) { keeper = UrlRegEx.exact(""); } else { this.keeper = urlRegEx; } setText(keeper.getFilteredRegEx()); } @Override public void setText(String t) { if (keeper == null) { super.setText(""); } else { super.setText(keeper.getFilteredRegEx()); } } public static final class MyDateCellRenderer extends DefaultTableCellRenderer { private final Date keeper; private MyDateCellRenderer(Date d) { this.keeper = d; setText(DateFormat.getInstance().format(d)); } @Override public void setText(String t) { if (keeper == null) { super.setText(""); } else { super.setText(DateFormat.getInstance().format(keeper)); } } } } private final class SingleSelectionListenerImpl implements ListSelectionListener { private final JTable table; public SingleSelectionListenerImpl(JTable table) { this.table = table; } @Override public void valueChanged(ListSelectionEvent e) { if (table.getSelectedRows().length == 1 && !currentModel.back.isReadOnly()) { moveRowUpButton.setEnabled(true); moveRowDownButton.setEnabled(true); } else { moveRowUpButton.setEnabled(false); moveRowDownButton.setEnabled(false); } } } private final class DeleteAdapter implements KeyListener { private final JTable table; public DeleteAdapter(JTable table) { this.table = table; } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_DELETE && !currentModel.back.isReadOnly()) { removeSelectedFromTable(table, askBeforeActionCheckBox.isSelected(), (UnsignedAppletActionTableModel) table.getModel(), UnsignedAppletsTrustingListPanel.this); } } @Override public void keyReleased(KeyEvent e) { } } private abstract static class MyCommonSorter extends RowFilter { } private static final class ByPermanencyFilter extends TableRowSorter { private static final class ShowAll extends MyCommonSorter { @Override public boolean include(Entry entry) { return true; } } private static final class ShowPermanents extends MyCommonSorter { @Override public boolean include(Entry entry) { AppletSecurityActions as = (AppletSecurityActions) entry.getModel().getValueAt(entry.getIdentifier(), 0); Collection l = as.getActions(); for (ExecuteAppletAction o : l) { if (o.equals(ExecuteAppletAction.ALWAYS) || o.equals(ExecuteAppletAction.NEVER)) { return true; } } return false; } } private static final class ShowPermanentA extends MyCommonSorter { @Override public boolean include(Entry entry) { AppletSecurityActions as = (AppletSecurityActions) entry.getModel().getValueAt(entry.getIdentifier(), 0); Collection l = as.getActions(); for (ExecuteAppletAction o : l) { if (o.equals(ExecuteAppletAction.ALWAYS)) { return true; } } return false; } } private static final class ShowPermanentN extends MyCommonSorter { @Override public boolean include(Entry entry) { AppletSecurityActions as = (AppletSecurityActions) entry.getModel().getValueAt(entry.getIdentifier(), 0); Collection l = as.getActions(); for (ExecuteAppletAction o : l) { if (o.equals(ExecuteAppletAction.NEVER)) { return true; } } return false; } } private static final class ShowTemporarilyDecisions extends MyCommonSorter { @Override public boolean include(Entry entry) { AppletSecurityActions as = (AppletSecurityActions) entry.getModel().getValueAt(entry.getIdentifier(), 0); Collection l = as.getActions(); for (ExecuteAppletAction o : l) { if (o.equals(ExecuteAppletAction.YES) || o.equals(ExecuteAppletAction.NO)) { return true; } } return false; } } private static final class ShowHasChosenYes extends MyCommonSorter { @Override public boolean include(Entry entry) { AppletSecurityActions as = (AppletSecurityActions) entry.getModel().getValueAt(entry.getIdentifier(), 0); Collection l = as.getActions(); for (ExecuteAppletAction o : l) { if (o.equals(ExecuteAppletAction.YES)) { return true; } } return false; } } private static final class ShowHasChosenNo extends MyCommonSorter { @Override public boolean include(Entry entry) { AppletSecurityActions as = (AppletSecurityActions) entry.getModel().getValueAt(entry.getIdentifier(), 0); Collection l = as.getActions(); for (ExecuteAppletAction o : l) { if (o.equals(ExecuteAppletAction.NO)) { return true; } } return false; } } public static final ShowAll showAll = new ShowAll(); public static final ShowPermanents showPermanents = new ShowPermanents(); public static final ShowPermanentA showPermanentA = new ShowPermanentA(); public static final ShowPermanentN showPermanentN = new ShowPermanentN(); public static final ShowTemporarilyDecisions showTemporarilyDecisions = new ShowTemporarilyDecisions(); public static final ShowHasChosenYes showHasChosenYes = new ShowHasChosenYes(); public static final ShowHasChosenNo showHasChosenNo = new ShowHasChosenNo(); public ByPermanencyFilter(UnsignedAppletActionTableModel model) { super(model); setRowFilter(showPermanents); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/JVMPanel.java0000644000000000000000000000013213441742745025234 xustar0030 mtime=1552401893.028832846 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java0000644000175000002070000004136213441742745026052 0ustar00jvanekmock00000000000000/* PluginPanel.java Copyright (C) 2012, Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.StreamUtils; @SuppressWarnings("serial") public class JVMPanel extends NamedBorderPanel { public static class JvmValidationResult { public static enum STATE { EMPTY, NOT_DIR, NOT_VALID_DIR, NOT_VALID_JDK, VALID_JDK; } public final String formattedText; public final STATE id; private final String stds; public JvmValidationResult(String formattedText, STATE id, String stdouts) { this.id = id; this.formattedText = formattedText; this.stds = stdouts; } } private final DeploymentConfiguration config; private File lastPath = new File("/usr/lib/jvm/java/jre/"); JTextField testFieldArgumentsExec; JVMPanel(DeploymentConfiguration config) { super(Translator.R("CPHeadJVMSettings"), new GridBagLayout()); this.config = config; addComponents(); } void resetTestFieldArgumentsExec() { testFieldArgumentsExec.setText(""); } private void addComponents() { final JLabel description = new JLabel("" + Translator.R("CPJVMPluginArguments") + "
    "); final JTextField testFieldArguments = new JTextField(25); testFieldArguments.getDocument().addDocumentListener(new DocumentAdapter(config, DeploymentConfiguration.KEY_PLUGIN_JVM_ARGUMENTS)); testFieldArguments.setText(config.getProperty(DeploymentConfiguration.KEY_PLUGIN_JVM_ARGUMENTS)); final JLabel descriptionExec = new JLabel("" + Translator.R("CPJVMitwExec") + "
    "); testFieldArgumentsExec = new JTextField(100); final JLabel validationResult = new JLabel(resetValidationResult(testFieldArgumentsExec.getText(), "", "CPJVMnone")); validationResult.setToolTipText(""); final JCheckBox allowTypoTimeValidation = new JCheckBox(Translator.R("CPJVMPluginAllowTTValidation"), true); allowTypoTimeValidation.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), "", "CPJVMnone")); validationResult.setToolTipText(""); } }); testFieldArgumentsExec.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { if (allowTypoTimeValidation.isSelected()) { JvmValidationResult s = validateJvm(testFieldArgumentsExec.getText()); validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), s.formattedText, "CPJVMvalidated")); validationResult.setToolTipText(s.stds); } } @Override public void removeUpdate(DocumentEvent e) { if (allowTypoTimeValidation.isSelected()) { JvmValidationResult s = validateJvm(testFieldArgumentsExec.getText()); validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), s.formattedText, "CPJVMvalidated")); validationResult.setToolTipText(s.stds); } } @Override public void changedUpdate(DocumentEvent e) { if (allowTypoTimeValidation.isSelected()) { JvmValidationResult s = validateJvm(testFieldArgumentsExec.getText()); validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), s.formattedText, "CPJVMvalidated")); validationResult.setToolTipText(s.stds); } } }); testFieldArgumentsExec.getDocument().addDocumentListener(new DocumentAdapter(config, DeploymentConfiguration.KEY_JRE_DIR)); testFieldArgumentsExec.setText(config.getProperty(DeploymentConfiguration.KEY_JRE_DIR)); final JButton selectJvm = new JButton(Translator.R("CPJVMPluginSelectExec")); selectJvm.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser jfch; if (lastPath != null && lastPath.exists()) { jfch = new JFileChooser(lastPath); } else { jfch = new JFileChooser(); } jfch.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int i = jfch.showOpenDialog(JVMPanel.this); if (i == JFileChooser.APPROVE_OPTION && jfch.getSelectedFile() != null) { lastPath = jfch.getSelectedFile().getParentFile(); String nws = jfch.getSelectedFile().getAbsolutePath(); String olds = testFieldArgumentsExec.getText(); if (!nws.equals(olds)) { validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), "", "CPJVMnone")); validationResult.setToolTipText(""); } testFieldArgumentsExec.setText(nws); } } }); final JButton validateJvm = new JButton(Translator.R("CPJVMitwExecValidation")); validateJvm.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JvmValidationResult s = validateJvm(testFieldArgumentsExec.getText()); validationResult.setText(resetValidationResult(testFieldArgumentsExec.getText(), s.formattedText, "CPJVMvalidated")); validationResult.setToolTipText(s.stds); } }); // Filler to pack the bottom of the panel. GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.gridwidth = 4; c.gridx = 0; c.gridy = 0; c.insets = new Insets(2, 2, 4, 4); this.add(description, c); c.gridy++; this.add(testFieldArguments, c); c.gridy++; this.add(descriptionExec, c); c.gridy++; this.add(testFieldArgumentsExec, c); c.gridy++; GridBagConstraints cb1 = (GridBagConstraints) c.clone(); cb1.fill = GridBagConstraints.NONE; cb1.gridwidth = 1; this.add(selectJvm, cb1); GridBagConstraints cb3 = (GridBagConstraints) c.clone(); cb3.fill = GridBagConstraints.NONE; cb3.gridx = 2; cb3.gridwidth = 1; this.add(allowTypoTimeValidation, cb3); GridBagConstraints cb2 = (GridBagConstraints) c.clone(); cb2.fill = GridBagConstraints.NONE; cb2.gridx = 3; cb2.gridwidth = 1; this.add(validateJvm, cb2); c.gridy++; this.add(validationResult, c); // This is to keep it from expanding vertically if resized. Component filler = Box.createRigidArea(new Dimension(1, 1)); c.gridy++; c.weighty++; this.add(filler, c); } public static JvmValidationResult validateJvm(String cmd) { if (cmd == null || cmd.trim().equals("")) { return new JvmValidationResult("" + Translator.R("CPJVMvalueNotSet") + "", JvmValidationResult.STATE.EMPTY, ""); } String validationResult = ""; File jreDirFile = new File(cmd); JvmValidationResult.STATE latestOne = JvmValidationResult.STATE.EMPTY; if (jreDirFile.isDirectory()) { validationResult += "" + Translator.R("CPJVMisDir") + "
    "; } else { validationResult += "" + Translator.R("CPJVMnotDir") + "
    "; latestOne = JvmValidationResult.STATE.NOT_DIR; } File javaFile = new File(cmd + File.separator + "bin" + File.separator + "java"); if (javaFile.isFile()) { validationResult += "" + Translator.R("CPJVMjava") + "
    "; } else { validationResult += "" + Translator.R("CPJVMnoJava") + "
    "; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; } } ProcessBuilder sb = new ProcessBuilder(javaFile.getAbsolutePath(), "-version"); Process p = null; String processErrorStream = ""; String processStdOutStream = ""; Integer r = null; try { p = sb.start(); StreamUtils.waitForSafely(p); processErrorStream = StreamUtils.readStreamAsString(p.getErrorStream()); processStdOutStream = StreamUtils.readStreamAsString(p.getInputStream()); r = p.exitValue(); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, processErrorStream); OutputController.getLogger().log(processStdOutStream); processErrorStream = processErrorStream.toLowerCase(); processStdOutStream = processStdOutStream.toLowerCase(); } catch (Exception ex) {; OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } if (r == null) { validationResult += "" + Translator.R("CPJVMnotLaunched") + ""; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; } return new JvmValidationResult(validationResult, latestOne, ""); } String reportableOutputs = processErrorStream + "\n" + processStdOutStream; if (r != 0) { validationResult += "" + Translator.R("CPJVMnoSuccess") + ""; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; } return new JvmValidationResult(validationResult, latestOne, reportableOutputs); } boolean findRT = false; boolean jdk9up = false; for (int i = 9; i <= 99; i++) { if (processErrorStream.contains("\"" + i) || processStdOutStream.contains("\"" + i)) { jdk9up = true; } } if (jdk9up) { validationResult += "" + Translator.R("CPJVMjdk9") + "
    "; findRT = false; } else if (processErrorStream.contains("1.8.0") || processStdOutStream.contains("1.8.0")) { validationResult += "" + Translator.R("CPJVMjdk8") + "
    "; findRT = true; } else if (processErrorStream.contains("1.7.0") || processStdOutStream.contains("1.7.0")) { validationResult += "" + Translator.R("CPJVMjdk7") + "
    "; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; findRT = true; } } else if (processErrorStream.contains("1.6.0") || processStdOutStream.contains("1.6.0")) { validationResult += "" + Translator.R("CPJVMjdk6") + "
    "; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; findRT = true; } } else { validationResult += "" + Translator.R("CPJVMjdk") + "
    "; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; findRT = false; } } if (findRT) { File rtFile = new File(cmd + File.separator + "lib" + File.separator + "rt.jar"); if (rtFile.isFile()) { validationResult += "" + Translator.R("CPJVMrtJar") + "
    "; } else { validationResult += "" + Translator.R("CPJVMnoRtJar") + "
    "; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; } } } if (processErrorStream.contains("openjdk") || processStdOutStream.contains("openjdk")) { validationResult += "" + Translator.R("CPJVMopenJdkFound") + ""; return new JvmValidationResult(validationResult, JvmValidationResult.STATE.VALID_JDK, reportableOutputs); } if (processErrorStream.contains("ibm") || processStdOutStream.contains("ibm")) { validationResult += "" + Translator.R("CPJVMibmFound") + ""; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; } return new JvmValidationResult(validationResult, latestOne, reportableOutputs); } if (processErrorStream.contains("gij") || processStdOutStream.contains("gij")) { validationResult += "" + Translator.R("CPJVMgijFound") + ""; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; } return new JvmValidationResult(validationResult, latestOne, reportableOutputs); } if (processErrorStream.contains("oracle") || processStdOutStream.contains("oracle") || processErrorStream.contains("java(tm)") || processStdOutStream.contains("java(tm)")) { validationResult += "" + Translator.R("CPJVMoracleFound") + ""; if (latestOne != JvmValidationResult.STATE.NOT_DIR) { latestOne = JvmValidationResult.STATE.NOT_VALID_JDK; } return new JvmValidationResult(validationResult, latestOne, reportableOutputs); } validationResult += "" + Translator.R("CPJVMstrangeProcess") + ""; return new JvmValidationResult(validationResult, JvmValidationResult.STATE.NOT_VALID_JDK, reportableOutputs); } private String resetValidationResult(final String value, String result, String headerKey) { return "" + Translator.R(headerKey) + ":
    " + value + "
    " + result + "
    "; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/ClassFinder.java0000644000000000000000000000013213441742745026015 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/ClassFinder.java0000644000175000002070000001446713441742745026641 0ustar00jvanekmock00000000000000/* Copyright (C) 2016 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; import javax.swing.JDialog; import net.sourceforge.jnlp.util.logging.OutputController; /** * utility class to find any Interface implementing classes in netx/icedtea-web */ public class ClassFinder extends JDialog { public static final String JAVA_CLASS_PATH_PROPERTY = "java.class.path"; public static final String CUSTOM_CLASS_PATH_PROPERTY = "custom.class.path"; public static final String BOOT_CLASS_PATH_PROPERTY = "sun.boot.class.path"; static public List> findAllMatchingTypes(Class toFind) { List> returnedClasses = new ArrayList<>(); Set foundClasses = walkClassPath(toFind); for (Class clazz : foundClasses) { if (!clazz.isInterface()) { returnedClasses.add((Class) clazz); } } return returnedClasses; } static private Set walkClassPath(Class toFind) { Set results = new HashSet<>(); Set classPathRoots = getClassPathRoots(); for (String classpathEntry : classPathRoots) { //need to avoid base jdk jars/modules if (classpathEntry.toLowerCase().contains("icedtea-web") || classpathEntry.toLowerCase().contains("javaws") || classpathEntry.toLowerCase().contains("plugin")) { File f = new File(classpathEntry); if (!f.exists()) { continue; } if (f.isDirectory()) { traverse(f.getAbsolutePath(), f, toFind, results); } else { File jar = new File(classpathEntry); try { JarInputStream is = new JarInputStream(new FileInputStream(jar)); JarEntry entry; while ((entry = is.getNextJarEntry()) != null) { Class c = determine(entry.getName(), toFind); if (c != null) { results.add(c); } } } catch (IOException ex) { OutputController.getLogger().log(ex); } } } } return results; } static private Set getClassPathRoots() { String classapth1 = System.getProperty(CUSTOM_CLASS_PATH_PROPERTY); String classapth2 = System.getProperty(JAVA_CLASS_PATH_PROPERTY); String classapth3 = System.getProperty(BOOT_CLASS_PATH_PROPERTY); String classpath = ""; if (classapth1 != null) { classpath = classpath + classapth1 + File.pathSeparator; } if (classapth2 != null) { classpath = classpath + classapth2 + File.pathSeparator; } if (classapth3 != null) { classpath = classpath + classapth3 + File.pathSeparator; } String[] pathElements = classpath.split(File.pathSeparator); Set s = new HashSet<>(Arrays.asList(pathElements)); return s; } static private Class determine(String name, Class toFind) { if (name.contains("$")) { return null; } try { if (name.endsWith(".class")) { name = name.replace(".class", ""); name = name.replace("/", "."); name = name.replace("\\", "."); Class clazz = Class.forName(name); if (toFind.isAssignableFrom(clazz)) { return clazz; } } } catch (Throwable ex) { //blacklisted classes //System.out.println(name); } return null; } static private void traverse(String root, File current, Class toFind, Set result) { File[] fs = current.listFiles(); for (File f : fs) { if (f.isDirectory()) { traverse(root, f, toFind, result); } else { String ff = f.getAbsolutePath(); String name = ff.substring(root.length()); while (name.startsWith(File.separator)) { name = name.substring(1); } Class c = determine(name, toFind); if (c != null) { result.add(c); } } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/PolicyPanel.java0000644000000000000000000000013213441742745026037 xustar0030 mtime=1552401893.036832829 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java0000644000175000002070000003161013441742745026650 0ustar00jvanekmock00000000000000/* Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.controlpanel; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.security.policyeditor.PolicyEditor; import net.sourceforge.jnlp.security.policyeditor.PolicyEditor.PolicyEditorWindow; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.FileUtils.OpenFileResult; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.swing.SwingUtils; /** * Implements a Policy Settings panel for the itweb-settings control panel. * This gives the user information about custom user-level JNLP Policy files, * as well as offering a way to launch a policy file editor with the correct * file path to the user's personal policy file location presupplied. */ public class PolicyPanel extends NamedBorderPanel { private PolicyEditorWindow policyEditor = null; private final DeploymentConfiguration config; public PolicyPanel(final JFrame frame, final DeploymentConfiguration config) { super(R("CPHeadPolicy"), new GridBagLayout()); this.config = config; addComponents(frame); } private void addComponents(final JFrame frame) { JLabel aboutLabel = new JLabel("" + R("CPPolicyDetail") + ""); final String fileUrlString = PathsAndFiles.JAVA_POLICY.getFullPath(config); final JButton simpleEditorButton = new JButton(R("CPButSimpleEditor")); simpleEditorButton.addActionListener(new LaunchSimplePolicyEditorAction(frame, fileUrlString)); final JButton advancedEditorButton = new JButton(R("CPButAdvancedEditor")); advancedEditorButton.addActionListener(new LaunchPolicyToolAction(frame, fileUrlString)); final String pathPart = localFilePathFromUrlString(fileUrlString); simpleEditorButton.setToolTipText(R("CPPolicyTooltip", FileUtils.displayablePath(pathPart, 60))); final JTextField locationField = new JTextField(pathPart); locationField.setEditable(false); final GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.gridx = 1; c.gridy = 0; c.weightx = 1; add(aboutLabel, c); c.weighty = 0; c.weightx = 0; c.gridy++; add(locationField, c); c.fill = GridBagConstraints.NONE; c.gridx++; add(simpleEditorButton, c); c.gridx++; add(advancedEditorButton, c); c.gridx--; /* Keep all the elements at the top of the panel (Extra padding) * Keep View/Edit button next to location field, with padding between * the right edge of the frame and the button */ c.fill = GridBagConstraints.BOTH; final Component filler1 = Box.createRigidArea(new Dimension(240, 1)); final Component filler2 = Box.createRigidArea(new Dimension(1, 1)); c.gridx++; add(filler1, c); c.gridx--; c.weighty = 1; c.gridy++; add(filler2, c); } /** * Launch the policytool for a specified file path * @param frame a {@link JFrame} to act as parent to warning dialogs which may appear * @param filePath a {@link String} representing the path to the file to be opened */ private static void launchPolicyTool(final JFrame frame, final String filePath) { try { final File policyFile = new File(filePath).getCanonicalFile(); final OpenFileResult result = FileUtils.testFilePermissions(policyFile); if (result == OpenFileResult.SUCCESS) { policyToolLaunchHelper(frame, filePath); } else if (result == OpenFileResult.CANT_WRITE) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "Opening user JNLP policy read-only"); FileUtils.showReadOnlyDialog(frame); policyToolLaunchHelper(frame, filePath); } else { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Could not open user JNLP policy"); FileUtils.showCouldNotOpenFileDialog(frame, policyFile.getPath(), result); } } catch (IOException e) { OutputController.getLogger().log(e); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Could not open user JNLP policy"); FileUtils.showCouldNotOpenFilepathDialog(frame, filePath); } } /** * Launch the simplified PolicyEditor for a specified file path * @param frame a {@link JFrame} to act as parent to warning dialogs which may appear * @param filePath a {@link String} representing the path to the file to be opened */ private void launchSimplePolicyEditor(final String filePath) { if (policyEditor == null || policyEditor.getPolicyEditor().isClosed()) { policyEditor = PolicyEditor.getPolicyEditorFrame(filePath); policyEditor.getPolicyEditor().openAndParsePolicyFile(); policyEditor.asWindow().setVisible(true); } else { policyEditor.asWindow().toFront(); policyEditor.asWindow().repaint(); } } /** * This executes a new process for policytool using ProcessBuilder, with the new process' * working directory set to the user's home directory. policytool then attempts to * open the provided policy file path, if policytool can be run. ProcessBuilder does * some verification to ensure that the built command can be executed - if not, it * throws an IOException. In this event, we try our reflective fallback launch. * We do this in a new {@link Thread} to ensure that the fallback launch does not * block the AWT thread, and neither does ProcessBuilder#start() in case it happens * to be synchronous on the current system. * @param frame a {@link JFrame} to act as parent to warning dialogs which may appear * @param filePath a {@link String} representing the path to the file to be opened */ private static void policyToolLaunchHelper(final JFrame frame, final String filePath) { new Thread(new Runnable() { @Override public void run() { final ProcessBuilder pb = new ProcessBuilder("policytool", "-file", filePath) .directory(new File(System.getProperty("user.home"))); try { pb.start(); } catch (IOException ioe) { OutputController.getLogger().log(ioe); try { reflectivePolicyToolLaunch(filePath); } catch (Exception e) { OutputController.getLogger().log(e); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Could not open user JNLP policy"); FileUtils.showCouldNotOpenDialog(frame, R("CPPolicyEditorNotFound")); } } } }).start(); } /** * This is used as a fallback in case launching the policytool by executing a new process * fails. This probably happens because we are running on a system where the policytool * executable is not on the PATH, or because we are running on a non-POSIX compliant system. * We do this reflectively to avoid needing to add PolicyTool as build dependency simply for * this small edge case. * @param filePath a {@link String} representing the path of the file to attempt to open * @throws Exception if any sort of exception occurs during reflective launch of policytool */ private static void reflectivePolicyToolLaunch(final String filePath) throws Exception { Class policyTool; try { // Java 7 location policyTool = Class.forName("sun.security.tools.policytool.PolicyTool"); } catch (ClassNotFoundException cnfe) { // Java 6 location policyTool = Class.forName("sun.security.tools.PolicyTool"); } final Class[] signature = new Class[] { String[].class }; final Method main = policyTool.getMethod("main", signature); final String[] args = new String[] { "-file", filePath }; main.invoke(null, (Object) args); } /** * Loosely attempt to get the path part of a file URL string. If this fails, * simply return back the input. This is only intended to be used for displaying * GUI elements such as the CPPolicyTooltip. * @param url the {@link String} representing the URL whose path is desired * @return a {@link String} representing the local filepath of the given file:/ URL */ private static String localFilePathFromUrlString(final String url) { try { final URL u = new URL(url); return u.getPath(); } catch (MalformedURLException e) { return url; } } /** * Implements the action to be performed when the "Advanced" button is clicked */ private class LaunchPolicyToolAction implements ActionListener { private final JFrame frame; private final String fileUrlString; public LaunchPolicyToolAction(final JFrame frame, final String fileUrlString) { this.fileUrlString = fileUrlString; this.frame = frame; } @Override public void actionPerformed(final ActionEvent event) { try { final URL fileUrl = new URL(fileUrlString); SwingUtils.invokeLater(new Runnable() { @Override public void run() { launchPolicyTool(frame, fileUrl.getPath()); } }); } catch (MalformedURLException ex) { OutputController.getLogger().log(ex); FileUtils.showCouldNotOpenFilepathDialog(frame, fileUrlString); } } } private class LaunchSimplePolicyEditorAction implements ActionListener { private final JFrame frame; private final String fileUrlString; public LaunchSimplePolicyEditorAction(final JFrame frame, final String fileUrlString) { this.fileUrlString = fileUrlString; this.frame = frame; } @Override public void actionPerformed(final ActionEvent event) { try { final URL fileUrl = new URL(fileUrlString); SwingUtils.invokeLater(new Runnable() { @Override public void run() { launchSimplePolicyEditor(fileUrl.getPath()); } }); } catch (MalformedURLException ex) { OutputController.getLogger().log(ex); FileUtils.showCouldNotOpenFilepathDialog(frame, fileUrlString); } } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/ControlPanel.java0000644000000000000000000000013213441742745026220 xustar0030 mtime=1552401893.035832831 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java0000644000175000002070000003746413441742745027046 0ustar00jvanekmock00000000000000/* ControlPanel.java -- Display the control panel for modifying deployment settings. Copyright (C) 2011 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import javax.naming.ConfigurationException; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.controlpanel.JVMPanel.JvmValidationResult; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.security.viewer.CertificatePane; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.swing.SwingUtils; /** * This is the control panel for Java. It provides a GUI for modifying the * deployments.properties file. * * @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ public class ControlPanel extends JFrame { private JVMPanel jvmPanel; /** * Class for keeping track of the panels and their associated text. * * @author @author Andrew Su (asu@redhat.com, andrew.su@utoronto.ca) * */ private static class SettingsPanel { final String value; final JPanel panel; public SettingsPanel(String value, JPanel panel) { this.value = value; this.panel = panel; } public JPanel getPanel() { return panel; } @Override public String toString() { return value; } } private DeploymentConfiguration config = null; /** * Creates a new instance of the ControlPanel. * * @param config * Loaded DeploymentsConfiguration file. * */ public ControlPanel(DeploymentConfiguration config) { super(); setTitle(Translator.R("CPHead")); setIconImages(ImageResources.INSTANCE.getApplicationImages()); this.config = config; JPanel topPanel = createTopPanel(); JPanel mainPanel = createMainSettingsPanel(); JPanel buttonPanel = createButtonPanel(); add(topPanel, BorderLayout.PAGE_START); add(mainPanel, BorderLayout.CENTER); add(buttonPanel, BorderLayout.PAGE_END); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); pack(); } private JPanel createTopPanel() { Font currentFont; JLabel about = new JLabel(R("CPMainDescriptionShort")); currentFont = about.getFont(); about.setFont(currentFont.deriveFont(currentFont.getSize2D() + 2)); currentFont = about.getFont(); about.setFont(currentFont.deriveFont(Font.BOLD)); JLabel description = new JLabel(R("CPMainDescriptionLong")); description.setBorder(new EmptyBorder(2, 0, 2, 0)); JPanel descriptionPanel = new JPanel(new GridLayout(0, 1)); descriptionPanel.setBackground(UIManager.getColor("TextPane.background")); descriptionPanel.add(about); descriptionPanel.add(description); JLabel image = new JLabel(); image.setIcon(new ImageIcon(ImageResources.INSTANCE.getApplicationImages().get(0))); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.setBackground(UIManager.getColor("TextPane.background")); topPanel.add(descriptionPanel, BorderLayout.LINE_START); topPanel.add(image, BorderLayout.LINE_END); topPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); return topPanel; } private int validateJdk() { String s = ControlPanel.this.config.getProperty(DeploymentConfiguration.KEY_JRE_DIR); JvmValidationResult validationResult = JVMPanel.validateJvm(s); if (validationResult.id == JvmValidationResult.STATE.NOT_DIR || validationResult.id == JvmValidationResult.STATE.NOT_VALID_DIR || validationResult.id == JvmValidationResult.STATE.NOT_VALID_JDK) { return JOptionPane.showConfirmDialog(ControlPanel.this, ""+Translator.R("CPJVMNotokMessage1", s)+"
    " + validationResult.formattedText+"
    " + Translator.R("CPJVMNotokMessage2", DeploymentConfiguration.KEY_JRE_DIR, PathsAndFiles.USER_DEPLOYMENT_FILE.getFullPath(config))+"", Translator.R("CPJVMconfirmInvalidJdkTitle"),JOptionPane.OK_CANCEL_OPTION); } return JOptionPane.OK_OPTION; } /** * Creates the "ok" "apply" and "cancel" buttons. * * @return A panel with the "ok" "apply" and "cancel" button. */ private JPanel createButtonPanel() { JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING)); List buttons = new ArrayList(); JButton okButton = new JButton(Translator.R("ButOk")); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ControlPanel.this.saveConfiguration(); int validationResult = validateJdk(); if (validationResult!= JOptionPane.OK_OPTION){ return; } JNLPRuntime.exit(0); } }); buttons.add(okButton); JButton applyButton = new JButton(Translator.R("ButApply")); applyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ControlPanel.this.saveConfiguration(); int validationResult = validateJdk(); if (validationResult != JOptionPane.OK_OPTION) { int i = JOptionPane.showConfirmDialog(ControlPanel.this, Translator.R("CPJVMconfirmReset"), Translator.R("CPJVMconfirmReset"), JOptionPane.OK_CANCEL_OPTION); if (i == JOptionPane.OK_OPTION) { jvmPanel.resetTestFieldArgumentsExec(); } } } }); buttons.add(applyButton); JButton cancelButton = new JButton(Translator.R("ButCancel")); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JNLPRuntime.exit(0); } }); buttons.add(cancelButton); int maxWidth = 0; int maxHeight = 0; for (JButton button : buttons) { maxWidth = Math.max(button.getMinimumSize().width, maxWidth); maxHeight = Math.max(button.getMinimumSize().height, maxHeight); } int wantedWidth = maxWidth + 10; int wantedHeight = maxHeight + 2; for (JButton button : buttons) { button.setPreferredSize(new Dimension(wantedWidth, wantedHeight)); buttonPanel.add(button); } return buttonPanel; } /** * Add the different settings panels to the GUI. * * @return A panel with all the components in place. */ private JPanel createMainSettingsPanel() { jvmPanel = (JVMPanel) createJVMSettingsPanel(); SettingsPanel[] panels = new SettingsPanel[] { new SettingsPanel(Translator.R("CPTabAbout"), createAboutPanel()), new SettingsPanel(Translator.R("CPTabCache"), createCacheSettingsPanel()), new SettingsPanel(Translator.R("CPTabCertificate"), createCertificatesSettingsPanel()), // TODO: This is commented out since this is not implemented yet // new SettingsPanel(Translator.R("CPTabClassLoader"), createClassLoaderSettingsPanel()), new SettingsPanel(Translator.R("CPTabDebugging"), createDebugSettingsPanel()), new SettingsPanel(Translator.R("CPTabDesktopIntegration"), createDesktopSettingsPanel()), new SettingsPanel(Translator.R("CPTabJVMSettings"),jvmPanel), new SettingsPanel(Translator.R("CPTabNetwork"), createNetworkSettingsPanel()), // TODO: This is commented out since this is not implemented yet // new SettingsPanel(Translator.R("CPTabRuntimes"), createRuntimesSettingsPanel()), new SettingsPanel(Translator.R("CPTabSecurity"), createSecuritySettingsPanel()), //todo refactor to work with tmp file and apply as asu designed it new SettingsPanel(Translator.R("CPTabPolicy"), createPolicySettingsPanel()), new SettingsPanel(Translator.R("APPEXTSECControlPanelExtendedAppletSecurityTitle"), new UnsignedAppletsTrustingListPanel(PathsAndFiles.APPLET_TRUST_SETTINGS_SYS.getFile(), PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getFile(), this.config)) }; // Add panels. final JPanel settingsPanel = new JPanel(new CardLayout()); // Calculate largest minimum size we should use. int height = 0; int width = 0; for (SettingsPanel panel : panels) { JPanel p = panel.getPanel(); Dimension d = p.getMinimumSize(); if (d.height > height) { height = d.height; } if (d.width > width) { width = d.width; } } Dimension dim = new Dimension(width, height); for (SettingsPanel panel : panels) { JPanel p = panel.getPanel(); p.setPreferredSize(dim); settingsPanel.add(p, panel.toString()); } final JList settingsList = new JList<>(panels); settingsList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { @SuppressWarnings("unchecked") JList list = (JList) e.getSource(); SettingsPanel panel = list.getSelectedValue(); CardLayout cl = (CardLayout) settingsPanel.getLayout(); cl.show(settingsPanel, panel.toString()); } }); JScrollPane settingsListScrollPane = new JScrollPane(settingsList); settingsListScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); final JPanel settingsDetailPanel = new JPanel(); settingsDetailPanel.setLayout(new BorderLayout()); settingsDetailPanel.add(settingsPanel, BorderLayout.CENTER); settingsDetailPanel.setBorder(new EmptyBorder(0, 5, -3, 0)); JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.add(settingsListScrollPane, BorderLayout.LINE_START); mainPanel.add(settingsDetailPanel, BorderLayout.CENTER); mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); settingsList.setSelectedIndex(0); return mainPanel; } private JPanel createAboutPanel() { return new AboutPanel(); } private JPanel createCacheSettingsPanel() { return new TemporaryInternetFilesPanel(this.config); } private JPanel createCertificatesSettingsPanel() { JPanel p = new NamedBorderPanel(Translator.R("CPHeadCertificates"), new BorderLayout()); p.add(new CertificatePane(null), BorderLayout.CENTER); return p; } private JPanel createClassLoaderSettingsPanel() { return createNotImplementedPanel(); } private JPanel createDebugSettingsPanel() { return new DebuggingPanel(this.config); } private JPanel createDesktopSettingsPanel() { return new DesktopShortcutPanel(this.config); } private JPanel createNetworkSettingsPanel() { return new NetworkSettingsPanel(this.config); } private JPanel createRuntimesSettingsPanel() { return new JREPanel(); } private JPanel createSecuritySettingsPanel() { return new SecuritySettingsPanel(this.config); } private JPanel createPolicySettingsPanel() { return new PolicyPanel(this, this.config); } private JPanel createJVMSettingsPanel() { return new JVMPanel(this.config); } /** * This is a placeholder panel. * * @return a placeholder panel * @see JPanel */ private JPanel createNotImplementedPanel() { JPanel notImplementedPanel = new NamedBorderPanel("Unimplemented"); notImplementedPanel.setLayout(new BorderLayout()); ClassLoader cl = getClass().getClassLoader(); if (cl == null) { cl = ClassLoader.getSystemClassLoader(); } URL imgUrl = cl.getResource("net/sourceforge/jnlp/resources/warning.png"); Image img; try { img = ImageIO.read(imgUrl); ImageIcon icon = new ImageIcon(img); JLabel label = new JLabel("Not Implemented", icon, SwingConstants.CENTER); notImplementedPanel.add(label); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } return notImplementedPanel; } /** * Save the configuration changes. */ private void saveConfiguration() { try { config.save(); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); JOptionPane.showMessageDialog(this, e); } } public static void main(String[] args) throws Exception { DeploymentConfiguration.move14AndOlderFilesTo15StructureCatched(); final DeploymentConfiguration config = new DeploymentConfiguration(); try { config.load(); } catch (ConfigurationException e) { // FIXME inform user about this and exit properly // the only known condition under which this can happen is when a // required system configuration file is not found // if configuration is not loaded, we will get NullPointerExceptions // everywhere OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { // ignore; not a big deal } SwingUtils.invokeLater(new Runnable() { @Override public void run() { final ControlPanel editor = new ControlPanel(config); editor.setVisible(true); } }); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/PaxHeaders.7406/AdvancedProxySettingsDialog.j0000644000000000000000000000013213441742745030540 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java0000644000175000002070000001020713441742745032040 0ustar00jvanekmock00000000000000/* AdvancedProxySettingsDialog.java -- Display the dialog for modifying proxy settings. Copyright (C) 2010 Red Hat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.jnlp.controlpanel; import java.awt.Container; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JDialog; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.ScreenFinder; import net.sourceforge.swing.SwingUtils; /** * This dialog provides a means for user to edit more of the proxy settings. * * @author Andrew Su <asu@redhat.com, andrew.su@utoronto.ca> * */ public class AdvancedProxySettingsDialog extends JDialog { private boolean initialized = false; private static final String dialogTitle = Translator.R("APSDialogTitle"); private final DeploymentConfiguration config; // Configuration file which contains all the settings. AdvancedProxySettingsPane topPanel; /** * Creates a new instance of the proxy settings dialog. * * @param config * Loaded DeploymentConfiguration file. */ public AdvancedProxySettingsDialog(DeploymentConfiguration config) { super((Frame) null, dialogTitle, true); // Don't need a parent. this.setName("AdvancedProxySettingsDialog"); SwingUtils.info(this); setIconImages(ImageResources.INSTANCE.getApplicationImages()); this.config = config; /* Prepare for adding components to dialog box */ Container contentPane = getContentPane(); contentPane.setLayout(new GridBagLayout()); setMinimumSize(new Dimension(456, 404)); setPreferredSize(new Dimension(456, 404)); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.weightx = 1; c.weighty = 1; c.gridx = 0; c.gridy = 0; topPanel = new AdvancedProxySettingsPane(this, this.config); contentPane.add(topPanel, c); pack(); /* Set focus to default button when first activated */ WindowAdapter adapter = new WindowAdapter() { private boolean gotFocus = false; @Override public void windowGainedFocus(WindowEvent we) { // Once window gets focus, set initial focus if (!gotFocus) { topPanel.focusOnDefaultButton(); gotFocus = true; } } }; addWindowFocusListener(adapter); initialized = true; } /** * Check whether the dialog has finished being created. * * @return True if dialog is ready to be displayed. */ public boolean isInitialized() { return initialized; } /** * Center the dialog box. */ private void centerDialog() { ScreenFinder.centerWindowsToCurrentScreen(this); } /** * Display the Proxy Settings Dialog. * * @param config * A loaded DeploymentConfiguration file. */ public static void showAdvancedProxySettingsDialog(final DeploymentConfiguration config) { AdvancedProxySettingsDialog psd = new AdvancedProxySettingsDialog(config); psd.setResizable(false); psd.centerDialog(); psd.setVisible(true); psd.dispose(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/config0000644000000000000000000000013113441742745021444 xustar0030 mtime=1552401893.052832796 29 atime=1552410887.11418344 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/0000755000175000002070000000000013441742745022332 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/DirectoryValidator.java0000644000000000000000000000013213441742745026177 xustar0030 mtime=1552401893.052832796 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/DirectoryValidator.java0000644000175000002070000003212013441742745027005 0ustar00jvanekmock00000000000000/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package net.sourceforge.jnlp.config; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.File; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.OutputController; public class DirectoryValidator { /** * This class is holding results of directory validation. * Various errors like can not read, write create dir can apeear * For sumaries of results are here getPasses, getFailures methods *

    * Individual results can be read from results field, or converted to string *

    */ public static class DirectoryCheckResults { public final List results; /** * Wraps results so we can make some statistics or convert to message * @param results results to be checked */ public DirectoryCheckResults(List results) { this.results = results; } /** * @return sum of passed checks, 0-3 per result */ public int getPasses() { int passes = 0; for (DirectoryCheckResult directoryCheckResult : results) { passes += directoryCheckResult.getPasses(); } return passes; } /** * @return sum of failed checks, 0-3 per results */ public int getFailures() { int failures = 0; for (DirectoryCheckResult directoryCheckResult : results) { failures += directoryCheckResult.getFailures(); } return failures; } /** * The result have one reuslt per line, separated by \n * as is inherited from result.getMessage() method. * * @return all results connected. */ public String getMessage() { return resultsToString(results); } /** * using getMessage * @return a text representation of a {@code DirectoryValidator} object */ @Override public String toString() { return getMessage(); } public static String resultsToString(List results) { StringBuilder sb = new StringBuilder(); for (DirectoryCheckResult r : results) { if (r.getFailures() > 0) { sb.append(r.getMessage()); } } return sb.toString(); } } /** * Is storing result of directory validation. * * validated are existence of directory * whether it is directory * if it have read/write permissions */ public static class DirectoryCheckResult { //do exist? public boolean exists = true; //is dir? public boolean isDir = true; //can be read, written to? public boolean correctPermissions = true; //have correct subdir? - this implies soe rules, when subdirecotry of some //particular directory have weeker permissions public DirectoryCheckResult subDir = null; //actual tested directory private final File testedDir; public DirectoryCheckResult(File testedDir) { this.testedDir = testedDir; } public static String notExistsMessage(File f) { return R("DCmaindircheckNotexists", f.getAbsolutePath()); } public static String notDirMessage(File f) { return R("DCmaindircheckNotdir", f.getAbsolutePath()); } public static String wrongPermissionsMessage(File f) { return R("DCmaindircheckRwproblem", f.getAbsolutePath()); } private static int booleanToInt(boolean b) { if (b) { return 1; } else { return 0; } } /** * count passes of this result (0-3, both inclusive). * @return how many times it passed */ public int getPasses() { int subdirs = 0; if (subDir != null) { subdirs = subDir.getPasses(); } return booleanToInt(exists) + booleanToInt(isDir) + booleanToInt(correctPermissions) + subdirs; } /** * count failures of this result (0-3, both inclusive). * @return how many failures appeared */ public int getFailures() { int max = 3; if (subDir != null) { max = 2 * max; } return max - getPasses(); } /** * Convert results to string. * Each failure by line. PAsses are not mentioned * The subdirectory (and it subdirectories are included to ) * * @return string with \n, or/and ended by \n */ public String getMessage() { StringBuilder sb = new StringBuilder(); if (!exists) { sb.append(notExistsMessage(testedDir)).append("\n"); } if (!isDir) { sb.append(notDirMessage(testedDir)).append("\n"); } if (!correctPermissions) { sb.append(wrongPermissionsMessage(testedDir)).append("\n"); } if (subDir != null) { String s = subDir.getMessage(); if (!s.isEmpty()) { sb.append(s); } } return sb.toString(); } @Override public String toString() { return getMessage(); } } private final List dirsToCheck; /** * Creates DirectoryValidator to ensure given directories * * @param dirsToCheck dirs to check */ public DirectoryValidator(List dirsToCheck) { this.dirsToCheck = dirsToCheck; } /** * Creates DirectoryValidator to ensure directories read from * user (if any - default otherwise) settings via keys: *
      *
    • {@link DeploymentConfiguration#KEY_USER_CACHE_DIR}
    • *
    • {@link DeploymentConfiguration#KEY_USER_PERSISTENCE_CACHE_DIR}
    • *
    • {@link DeploymentConfiguration#KEY_SYSTEM_CACHE_DIR}
    • *
    • {@link DeploymentConfiguration#KEY_USER_LOG_DIR}
    • *
    • {@link DeploymentConfiguration#KEY_USER_TMP_DIR}
    • *
    • {@link DeploymentConfiguration#KEY_USER_LOCKS_DIR}
    • *
    */ public DirectoryValidator() { dirsToCheck = new ArrayList<>(6); DeploymentConfiguration dc = JNLPRuntime.getConfiguration(); String[] keys = new String[]{ DeploymentConfiguration.KEY_USER_CACHE_DIR, DeploymentConfiguration.KEY_USER_PERSISTENCE_CACHE_DIR, DeploymentConfiguration.KEY_SYSTEM_CACHE_DIR, DeploymentConfiguration.KEY_USER_LOG_DIR, DeploymentConfiguration.KEY_USER_TMP_DIR, DeploymentConfiguration.KEY_USER_LOCKS_DIR}; for (String key : keys) { String value = dc.getProperty(key); if (value == null) { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "WARNING: key " + key + " has no value, setting to default value"); value = Defaults.getDefaults().get(key).getValue(); } if (value == null) { if (JNLPRuntime.isDebug()) { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "WARNING: key " + key + " has no value, skipping"); } continue; } File f = new File(value); dirsToCheck.add(f); } } /** * This method is ensuring, that specified directories will exists after * call and will have enough permissions. *

    * This methods is trying to create the directories if they are not present * and is testing if can be written inside. All checks are done in bulk. If * one or more defect is found, user is warned via dialogue in gui mode * (again in bulk). In headless mode stdout/stderr is enough, as application * (both gui and headless) should not stop to work, but continue to run with * hope that corrupted dirs will not be necessary *

    * @return result of directory checks */ public DirectoryCheckResults ensureDirs() { return ensureDirs(dirsToCheck); } static DirectoryCheckResults ensureDirs(List dirs) { List result = new ArrayList<>(dirs.size()); for (File f : dirs) { if (f.exists()) { DirectoryCheckResult r = testDir(f, true, true); result.add(r); continue; } if (!f.mkdirs()) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "ERROR: Directory " + f.getAbsolutePath() + " does not exist and has not been created"); } else { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "OK: Directory " + f.getAbsolutePath() + " did not exist but has been created"); } DirectoryCheckResult r = testDir(f, true, true); result.add(r); } return new DirectoryCheckResults(result); } /** * This method is package private for testing purposes only. *

    * This method verify that directory exists, is directory, file and * directory can be created, file can be written into, and subdirectory can * be written into. *

    *

    * Some steps may looks like redundant, but some permission settings really * alow to create file but not directory and vice versa. Also some settings * can allow to create file or directory which can not be written into. (eg * ACL or network disks) *

    */ static DirectoryCheckResult testDir(File f, boolean verbose, boolean testSubdir) { DirectoryCheckResult result = new DirectoryCheckResult(f); if (!f.exists()) { if (verbose) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, DirectoryCheckResult.notExistsMessage(f)); } result.exists = false; } if (!f.isDirectory()) { if (verbose) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, DirectoryCheckResult.notDirMessage(f)); } result.isDir = false; } File testFile = null; boolean correctPermissions = true; try { testFile = File.createTempFile("maindir", "check", f); if (!testFile.exists()) { correctPermissions = false; } try { FileUtils.saveFile("ww", testFile); String s = FileUtils.loadFileAsString(testFile); if (!s.trim().equals("ww")) { correctPermissions = false; } } catch (Exception ex) { if (JNLPRuntime.isDebug()) { ex.printStackTrace(); } correctPermissions = false; } File[] canList = f.listFiles(); if (canList == null || canList.length == 0) { correctPermissions = false; } testFile.delete(); if (testFile.exists()) { correctPermissions = false; } else { boolean created = testFile.mkdir(); if (!created) { correctPermissions = false; } if (testFile.exists()) { if (testSubdir) { DirectoryCheckResult subdirResult = testDir(testFile, verbose, false); if (subdirResult.getFailures() != 0) { result.subDir = subdirResult; correctPermissions = false; } testFile.delete(); if (testFile.exists()) { correctPermissions = false; } } } else { correctPermissions = false; } } } catch (Exception ex) { if (JNLPRuntime.isDebug()) { ex.printStackTrace(); } correctPermissions = false; } finally { if (testFile != null && testFile.exists()) { testFile.delete(); } } if (!correctPermissions) { if (verbose) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, DirectoryCheckResult.wrongPermissionsMessage(f)); } result.correctPermissions = false; } return result; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/Defaults.java0000644000000000000000000000013213441742745024134 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/Defaults.java0000644000175000002070000005271413441742745024755 0ustar00jvanekmock00000000000000/* Defaults.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; import java.util.HashMap; import java.util.Map; import net.sourceforge.jnlp.ShortcutDesc; import static net.sourceforge.jnlp.config.PathsAndFiles.*; import net.sourceforge.jnlp.runtime.JNLPProxySelector; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import static net.sourceforge.jnlp.runtime.Translator.R; /** * This class stores the default configuration */ public class Defaults { /** * Get the default settings for deployment * @return the default settings for deployment */ public static Map> getDefaults() { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkRead(USER_DEPLOYMENT_FILE.getDefaultFullPath()); sm.checkRead(USER_DEPLOYMENT_FILE.getFullPath()); } /* * This is more or less a straight copy from the deployment * configuration page, with occasional replacements of "" or no-defaults * with null * * The format of this is: * name * checker (can be null or a ValueChecker) * value (can be null or a String) */ Object[][] defaults = new Object[][] { /* infrastructure */ { DeploymentConfiguration.KEY_USER_CACHE_DIR, BasicValueValidators.getFilePathValidator(), CACHE_DIR.getDefaultFullPath() }, { DeploymentConfiguration.KEY_USER_PERSISTENCE_CACHE_DIR, BasicValueValidators.getFilePathValidator(), PCACHE_DIR.getDefaultFullPath() }, { DeploymentConfiguration.KEY_SYSTEM_CACHE_DIR, BasicValueValidators.getFilePathValidator(), null }, { DeploymentConfiguration.KEY_USER_LOG_DIR, BasicValueValidators.getFilePathValidator(), LOG_DIR.getDefaultFullPath() }, { DeploymentConfiguration.KEY_USER_TMP_DIR, BasicValueValidators.getFilePathValidator(), TMP_DIR.getDefaultFullPath() }, { DeploymentConfiguration.KEY_USER_LOCKS_DIR, BasicValueValidators.getFilePathValidator(), LOCKS_DIR.getDefaultFullPath() }, { DeploymentConfiguration.KEY_USER_NETX_RUNNING_FILE, BasicValueValidators.getFilePathValidator(), MAIN_LOCK.getDefaultFullPath() }, /* certificates and policy files */ { DeploymentConfiguration.KEY_USER_SECURITY_POLICY, BasicValueValidators.getUrlValidator(), "file://" + JAVA_POLICY.getDefaultFullPath() }, { DeploymentConfiguration.KEY_USER_TRUSTED_CA_CERTS, BasicValueValidators.getFilePathValidator(), USER_CACERTS.getDefaultFullPath() }, { DeploymentConfiguration.KEY_USER_TRUSTED_JSSE_CA_CERTS, BasicValueValidators.getFilePathValidator(), USER_JSSECAC.getDefaultFullPath() }, { DeploymentConfiguration.KEY_USER_TRUSTED_CERTS, BasicValueValidators.getFilePathValidator(), USER_CERTS.getDefaultFullPath() }, { DeploymentConfiguration.KEY_USER_TRUSTED_JSSE_CERTS, BasicValueValidators.getFilePathValidator(), USER_JSSECER.getDefaultFullPath() }, { DeploymentConfiguration.KEY_USER_TRUSTED_CLIENT_CERTS, BasicValueValidators.getFilePathValidator(), USER_CLIENTCERT.getDefaultFullPath() }, { DeploymentConfiguration.KEY_SYSTEM_SECURITY_POLICY, BasicValueValidators.getUrlValidator(), null }, { DeploymentConfiguration.KEY_SYSTEM_TRUSTED_CA_CERTS, BasicValueValidators.getFilePathValidator(), SYS_CACERT.getDefaultFullPath() }, { DeploymentConfiguration.KEY_SYSTEM_TRUSTED_JSSE_CA_CERTS, BasicValueValidators.getFilePathValidator(), SYS_JSSECAC.getDefaultFullPath() }, { DeploymentConfiguration.KEY_SYSTEM_TRUSTED_CERTS, BasicValueValidators.getFilePathValidator(), SYS_CERT.getDefaultFullPath() }, { DeploymentConfiguration.KEY_SYSTEM_TRUSTED_JSSE_CERTS, BasicValueValidators.getFilePathValidator(), SYS_JSSECERT.getDefaultFullPath() }, { DeploymentConfiguration.KEY_SYSTEM_TRUSTED_CLIENT_CERTS, BasicValueValidators.getFilePathValidator(), SYS_CLIENTCERT.getDefaultFullPath() }, /* security access and control */ { DeploymentConfiguration.KEY_SECURITY_PROMPT_USER, BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { "deployment.security.askgrantdialog.notinca", BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { "deployment.security.notinca.warning", BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { "deployment.security.expired.warning", BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { "deployment.security.jsse.hostmismatch.warning", BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { DeploymentConfiguration.KEY_SECURITY_TRUSTED_POLICY, BasicValueValidators.getFilePathValidator(), null }, { DeploymentConfiguration.KEY_SECURITY_ALLOW_HIDE_WINDOW_WARNING, BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { DeploymentConfiguration.KEY_SECURITY_PROMPT_USER_FOR_JNLP, BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { DeploymentConfiguration.KEY_STRICT_JNLP_CLASSLOADER, BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { DeploymentConfiguration.KEY_HTTPS_DONT_ENFORCE, BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, { DeploymentConfiguration.KEY_SECURITY_ITW_IGNORECERTISSUES, BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, { DeploymentConfiguration.KEY_SECURITY_PROMPT_USER_FOR_JNLP, BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, /* networking */ { DeploymentConfiguration.KEY_PROXY_TYPE, BasicValueValidators.getRangedIntegerValidator(JNLPProxySelector.PROXY_TYPE_UNKNOWN, JNLPProxySelector.PROXY_TYPE_BROWSER), String.valueOf(JNLPProxySelector.PROXY_TYPE_BROWSER) }, { DeploymentConfiguration.KEY_PROXY_SAME, BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, { DeploymentConfiguration.KEY_PROXY_AUTO_CONFIG_URL, BasicValueValidators.getUrlValidator(), null }, { DeploymentConfiguration.KEY_PROXY_BYPASS_LIST, null, null }, { DeploymentConfiguration.KEY_PROXY_BYPASS_LOCAL, null, null }, { DeploymentConfiguration.KEY_PROXY_HTTP_HOST, null, null }, { DeploymentConfiguration.KEY_PROXY_HTTP_PORT, null, null }, { DeploymentConfiguration.KEY_PROXY_HTTPS_HOST, null, null }, { DeploymentConfiguration.KEY_PROXY_HTTPS_PORT, null, null }, { DeploymentConfiguration.KEY_PROXY_FTP_HOST, null, null }, { DeploymentConfiguration.KEY_PROXY_FTP_PORT, null, null }, { DeploymentConfiguration.KEY_PROXY_SOCKS4_HOST, null, null }, { DeploymentConfiguration.KEY_PROXY_SOCKS4_PORT, null, null }, { DeploymentConfiguration.KEY_PROXY_OVERRIDE_HOSTS, null, null }, /* cache and optional package repository */ { "deployment.cache.max.size", BasicValueValidators.getRangedIntegerValidator(-1, Integer.MAX_VALUE), String.valueOf("-1") }, { "deployment.cache.jarcompression", BasicValueValidators.getRangedIntegerValidator(0, 10), String.valueOf(0) }, { "deployment.javapi.cache.enabled", BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, /* java console */ { DeploymentConfiguration.KEY_CONSOLE_STARTUP_MODE, BasicValueValidators.getStringValidator(new String[] { DeploymentConfiguration.CONSOLE_DISABLE, DeploymentConfiguration.CONSOLE_HIDE, DeploymentConfiguration.CONSOLE_SHOW, DeploymentConfiguration.CONSOLE_SHOW_PLUGIN, DeploymentConfiguration.CONSOLE_SHOW_JAVAWS }), DeploymentConfiguration.CONSOLE_HIDE }, { DeploymentConfiguration.KEY_ENABLE_LOGGING, BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, { DeploymentConfiguration.KEY_ENABLE_LOGGING_HEADERS, BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, { DeploymentConfiguration.KEY_ENABLE_LOGGING_TOFILE, BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, { DeploymentConfiguration.KEY_ENABLE_APPLICATION_LOGGING_TOFILE, BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { DeploymentConfiguration.KEY_ENABLE_LEGACY_LOGBASEDFILELOG, BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, { DeploymentConfiguration.KEY_ENABLE_LOGGING_TOSTREAMS, BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, { DeploymentConfiguration.KEY_ENABLE_LOGGING_TOSYSTEMLOG, BasicValueValidators.getBooleanValidator(), String.valueOf(true) }, /* JNLP association */ { DeploymentConfiguration.KEY_JNLP_ASSOCIATIONS, BasicValueValidators.getRangedIntegerValidator(DeploymentConfiguration.JNLP_ASSOCIATION_NEVER, DeploymentConfiguration.JNLP_ASSOCIATION_REPLACE_ASK), String.valueOf(DeploymentConfiguration.JNLP_ASSOCIATION_ASK_USER) }, /* desktop integration */ { DeploymentConfiguration.KEY_CREATE_DESKTOP_SHORTCUT, BasicValueValidators.getStringValidator(new String[] { ShortcutDesc.CREATE_ALWAYS, ShortcutDesc.CREATE_ALWAYS_IF_HINTED, ShortcutDesc.CREATE_ASK_USER, ShortcutDesc.CREATE_ASK_USER_IF_HINTED, ShortcutDesc.CREATE_NEVER }), ShortcutDesc.CREATE_ASK_USER_IF_HINTED }, /* jre selection */ { DeploymentConfiguration.KEY_JRE_INTSTALL_URL, BasicValueValidators.getUrlValidator(), null }, /* jre management */ { DeploymentConfiguration.KEY_AUTO_DOWNLOAD_JRE, BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, /* browser selection */ { DeploymentConfiguration.KEY_BROWSER_PATH, BasicValueValidators.getBrowserPathValidator(), null }, /* check for update timeout */ { DeploymentConfiguration.KEY_UPDATE_TIMEOUT, BasicValueValidators.getRangedIntegerValidator(0, 10000), String.valueOf(500) }, { DeploymentConfiguration.IGNORE_HEADLESS_CHECK, BasicValueValidators.getBooleanValidator(), String.valueOf(false) }, //JVM arguments for plugin { DeploymentConfiguration.KEY_PLUGIN_JVM_ARGUMENTS, null, null }, //unsigned applet security level { DeploymentConfiguration.KEY_SECURITY_LEVEL, new SecurityValueValidator(), null }, //JVM executable for itw { DeploymentConfiguration.KEY_JRE_DIR, null, null }, //enable manifest-attributes checks { DeploymentConfiguration.KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK, BasicValueValidators.getManifestAttributeCheckValidator(), String.valueOf(ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ALL) }, { DeploymentConfiguration.KEY_SYSTEM_CONFIG, BasicValueValidators.getUrlValidator(), null }, { DeploymentConfiguration.KEY_SYSTEM_CONFIG_MANDATORY, BasicValueValidators.getBooleanValidator(), String.valueOf(false) } , { DeploymentConfiguration.KEY_SMALL_SIZE_OVERRIDE_WIDTH, BasicValueValidators.getRangedIntegerValidator(-9999, +9999), String.valueOf(800)//0 is disabling it; negative is enforcing it }, { DeploymentConfiguration.KEY_SMALL_SIZE_OVERRIDE_HEIGHT, BasicValueValidators.getRangedIntegerValidator(-9999, +9999), String.valueOf(600)//0 is disabling it; negative is enforcing it }, { DeploymentConfiguration.KEY_SMALL_SIZE_OVERRIDE_TRESHOLD, BasicValueValidators.getRangedIntegerValidator(0, 1000), String.valueOf(10)// treshold when applet is considered as too small }, //************** //* Native (rust) only - beggin //************** { "deployment.launcher.rust.cp.add", new BasicValueValidators.RustCpValidator(), "" }, { "deployment.launcher.rust.cp.remove", new BasicValueValidators.RustCpValidator(), "" }, { "deployment.launcher.rust.bootcp.add", new BasicValueValidators.RustCpValidator(), null }, { "deployment.launcher.rust.bootcp.remove", new BasicValueValidators.RustCpValidator(), "" } //************** //* Native (rust) only - end //************** }; HashMap> result = new HashMap<>(); for (Object[] default1 : defaults) { String name = (String) default1[0]; ValueValidator checker = (ValueValidator) default1[1]; String actualValue = (String) default1[2]; boolean locked = false; Setting value = new Setting<>(name, R("Unknown"), locked, checker, actualValue, actualValue, R("DCSourceInternal")); result.put(name, value); } return result; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/PathsAndFiles.java0000644000000000000000000000013213441742745025052 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PathsAndFiles.java0000644000175000002070000005441413441742745025672 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; import java.io.File; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import net.sourceforge.jnlp.util.logging.OutputController; import static net.sourceforge.jnlp.config.DeploymentConfiguration.APPLET_TRUST_SETTINGS; import static net.sourceforge.jnlp.config.DeploymentConfiguration.DEPLOYMENT_CONFIG_FILE; import static net.sourceforge.jnlp.config.DeploymentConfiguration.DEPLOYMENT_PROPERTIES; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; public class PathsAndFiles { public static final String DEPLOYMENT_SUBDIR_DIR = "icedtea-web"; private static final String CONFIG_HOME; private static final String CACHE_HOME; private static final String DATA_HOME; private static final String RUNTIME_HOME; public static final String USER_CONFIG_HOME; public static final String USER_CACHE_HOME; public static final String USER_DEFAULT_SECURITY_DIR; public static final String XDG_CONFIG_HOME_VAR = "XDG_CONFIG_HOME"; public static final String XDG_CACHE_HOME_VAR = "XDG_CACHE_HOME"; public static final String XDG_RUNTIME_DIR_VAR = "XDG_RUNTIME_DIR"; private static final String XDG_DATA_HOME = "XDG_DATA_HOME"; private static final String WINDIR = "WINDIR"; private static final String TMP_PROP = "java.io.tmpdir"; private static final String HOME_PROP = "user.home"; private static final String JAVA_PROP = "java.home"; private static final String USER_PROP = "user.name"; private static final String VARIABLE = JNLPRuntime.isWindows() ? "%" : "$"; private static final String securityWord = "security"; public static final String ICEDTEA_SO = "IcedTeaPlugin.so"; public static final String CACHE_INDEX_FILE_NAME = "recently_used"; static { String configHome = System.getProperty(HOME_PROP) + File.separator + ".config"; String cacheHome = System.getProperty(HOME_PROP) + File.separator + ".cache"; String dataHome = System.getProperty(HOME_PROP) + File.separator + ".local" + File.separator + "share"; String runtimeHome = System.getProperty(TMP_PROP); String xdg_config_home = System.getenv(XDG_CONFIG_HOME_VAR); String xdg_cache_home = System.getenv(XDG_CACHE_HOME_VAR); String xdg_runtime_home = System.getenv(XDG_RUNTIME_DIR_VAR); String xdg_data_home = System.getenv(XDG_DATA_HOME); if (xdg_config_home != null) { CONFIG_HOME = xdg_config_home; } else { CONFIG_HOME = configHome; } if (xdg_cache_home != null) { CACHE_HOME = xdg_cache_home; } else { CACHE_HOME = cacheHome; } if (xdg_runtime_home != null) { RUNTIME_HOME = xdg_runtime_home; } else { RUNTIME_HOME = runtimeHome; } if (xdg_data_home != null) { DATA_HOME = xdg_data_home; } else { DATA_HOME = dataHome; } USER_CONFIG_HOME = CONFIG_HOME + File.separator + DEPLOYMENT_SUBDIR_DIR; USER_CACHE_HOME = CACHE_HOME + File.separator + DEPLOYMENT_SUBDIR_DIR; USER_DEFAULT_SECURITY_DIR = USER_CONFIG_HOME + File.separator + securityWord; } /** * PIPES_DIR and both Plugin Dirs are not instatiated to be used. Do exists only for documentation purposes. * Maintained by native part of ITW. Or outside ITW. */ public static final InfrastructureFileDescriptor PIPES_DIR = new RuntimeFileDescriptor("icedteaplugin-user-*", "FILEpipe", Target.PLUGIN); public static final InfrastructureFileDescriptor MOZILA_USER = new HomeFileDescriptor(ICEDTEA_SO, ".mozilla/plugins", "FILEmozillauser", Target.PLUGIN); public static final InfrastructureFileDescriptor MOZILA_GLOBAL_64 = new InfrastructureFileDescriptor(ICEDTEA_SO, "/usr/lib64/mozilla/plugins/", "", "FILEmozillaglobal64", Target.PLUGIN); public static final InfrastructureFileDescriptor MOZILA_GLOBAL_32 = new InfrastructureFileDescriptor(ICEDTEA_SO, "/usr/lib/mozilla/plugins/", "", "FILEmozillaglobal32", Target.PLUGIN); public static final InfrastructureFileDescriptor OPERA_64 = new InfrastructureFileDescriptor(ICEDTEA_SO, "/usr/lib64/opera/plugins/", "", "FILEopera64", Target.PLUGIN); public static final InfrastructureFileDescriptor OPERA_32 = new InfrastructureFileDescriptor(ICEDTEA_SO, "/usr/lib/opera/plugins/", "", "FILEopera32", Target.PLUGIN); public static final InfrastructureFileDescriptor CACHE_DIR = new ItwCacheFileDescriptor("cache", "FILEcache", Target.JAVAWS, Target.ITWEB_SETTINGS) { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_CACHE_DIR; } }; // this one is depnding on CACHE_DIR, so initialize it lazily public static InfrastructureFileDescriptor getRecentlyUsedFile() { return RECENTLY_USED_FILE_HOLDER.RECENTLY_USED_FILE; } private static class RECENTLY_USED_FILE_HOLDER { static final InfrastructureFileDescriptor RECENTLY_USED_FILE = new ItwCacheFileDescriptor(CACHE_INDEX_FILE_NAME, CACHE_DIR.getFile().getName(), "FILErecentlyUsed", Target.JAVAWS, Target.ITWEB_SETTINGS){ @Override public String getFullPath() { return clean(CACHE_DIR.getFullPath()+File.separator+this.getFileName()); } }; } public static final InfrastructureFileDescriptor PCACHE_DIR = new ItwCacheFileDescriptor("pcache", "FILEappdata", Target.JAVAWS, Target.ITWEB_SETTINGS){ @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_PERSISTENCE_CACHE_DIR; } }; public static final InfrastructureFileDescriptor LOG_DIR = new ItwConfigFileDescriptor("log", "FILElogs", Target.JAVAWS, Target.ITWEB_SETTINGS){ @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_LOG_DIR; } }; //javaws is saving here, itweb-settings may modify them public static final InfrastructureFileDescriptor ICONS_DIR = new ItwConfigFileDescriptor("icons", "FILEicons", Target.JAVAWS, Target.ITWEB_SETTINGS); public static final InfrastructureFileDescriptor GEN_JNLPS_DIR = new ItwConfigFileDescriptor("generated_jnlps", "FILEjnlps", Target.PLUGIN, Target.ITWEB_SETTINGS); //javaws is saving here, itweb-settings may modify them public static final InfrastructureFileDescriptor MENUS_DIR = new MenuFileDescriptor("javaws", "FILEmenus", Target.JAVAWS, Target.ITWEB_SETTINGS); public static final InfrastructureFileDescriptor APPLET_TRUST_SETTINGS_USER = new ItwConfigFileDescriptor(APPLET_TRUST_SETTINGS, "FILEextasuser", Target.JAVAWS, Target.ITWEB_SETTINGS); public static final InfrastructureFileDescriptor APPLET_TRUST_SETTINGS_SYS = new SystemDeploymentCofigFileDescriptor(APPLET_TRUST_SETTINGS, "FILEextasadmin", Target.JAVAWS, Target.ITWEB_SETTINGS); public static final InfrastructureFileDescriptor ETC_DEPLOYMENT_CFG = new SystemDeploymentCofigFileDescriptor(DEPLOYMENT_CONFIG_FILE, "FILEglobaldp", Target.JAVAWS, Target.ITWEB_SETTINGS); public static final InfrastructureFileDescriptor TMP_DIR = new ItwCacheFileDescriptor("tmp", "FILEtmpappdata", Target.JAVAWS, Target.ITWEB_SETTINGS){ @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_TMP_DIR; } }; public static final InfrastructureFileDescriptor LOCKS_DIR = new TmpUsrFileDescriptor("locks", "netx", "FILElocksdir", Target.JAVAWS) { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_LOCKS_DIR; } }; public static final InfrastructureFileDescriptor MAIN_LOCK = new TmpUsrFileDescriptor("netx_running", "netx" + File.separator + "locks", "FILEmainlock", Target.JAVAWS) { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_NETX_RUNNING_FILE; } }; public static final InfrastructureFileDescriptor JAVA_POLICY = new UserSecurityConfigFileDescriptor("java.policy", "FILEpolicy", Target.JAVAWS, Target.POLICY_EDITOR){ @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_SECURITY_POLICY; } @Override public File getFile() { throw new IllegalStateException("Only getFullPath should be used. This is returning URL String."); } @Override public File getDefaultFile() { throw new IllegalStateException("Only getDefaultFullPath should be used. This is returning URL String."); } }; public static final InfrastructureFileDescriptor USER_CACERTS = new UserCacertsFileDescriptor("trusted.cacerts") { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_TRUSTED_CA_CERTS; } }; public static final InfrastructureFileDescriptor USER_JSSECAC = new UserCacertsFileDescriptor("trusted.jssecacerts") { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_TRUSTED_JSSE_CA_CERTS; } }; public static final InfrastructureFileDescriptor USER_CERTS = new UserCacertsFileDescriptor("trusted.certs") { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_TRUSTED_CERTS; } }; public static final InfrastructureFileDescriptor USER_JSSECER = new UserCacertsFileDescriptor("trusted.jssecerts") { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_TRUSTED_JSSE_CERTS; } }; public static final InfrastructureFileDescriptor USER_CLIENTCERT = new UserCacertsFileDescriptor("trusted.clientcerts") { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_USER_TRUSTED_CLIENT_CERTS; } }; public static final InfrastructureFileDescriptor SYS_CACERT = new SystemJavaSecurityFileDescriptor("cacerts") { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_SYSTEM_TRUSTED_CA_CERTS; } }; public static final InfrastructureFileDescriptor SYS_JSSECAC = new SystemJavaSecurityFileDescriptor("jssecacerts") { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_SYSTEM_TRUSTED_JSSE_CA_CERTS; } }; public static final InfrastructureFileDescriptor SYS_CERT = new SystemJavaSecurityFileDescriptor("trusted.certs"){ @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_SYSTEM_TRUSTED_CERTS; } }; public static final InfrastructureFileDescriptor SYS_JSSECERT = new SystemJavaSecurityFileDescriptor("trusted.jssecerts") { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_SYSTEM_TRUSTED_JSSE_CERTS; } }; public static final InfrastructureFileDescriptor SYS_CLIENTCERT = new SystemJavaSecurityFileDescriptor("trusted.clientcerts") { @Override public String getPropertiesKey() { return DeploymentConfiguration.KEY_SYSTEM_TRUSTED_CLIENT_CERTS; } }; public static final InfrastructureFileDescriptor JAVA_DEPLOYMENT_PROP_FILE = new SystemJavaLibFileDescriptor(DEPLOYMENT_CONFIG_FILE, "FILEjavadp", Target.JAVAWS, Target.ITWEB_SETTINGS) { @Override public String getDescription() { return Translator.R(getDescriptionKey(), DeploymentConfiguration.KEY_JRE_DIR); } }; public static final InfrastructureFileDescriptor USER_DEPLOYMENT_FILE = new ItwConfigFileDescriptor(DEPLOYMENT_PROPERTIES, "FILEuserdp", Target.JAVAWS, Target.ITWEB_SETTINGS); static enum Target { JAVAWS, PLUGIN, ITWEB_SETTINGS, POLICY_EDITOR; } public static List getAllFiles() { return getAllFiles(null); } public static List getAllSecurityFiles() { return getAllFiles(null, UserSecurityConfigFileDescriptor.class); } private static List getAllFiles(Target desired) { return getAllFiles(desired, InfrastructureFileDescriptor.class); } private static List getAllFiles(Target desired, Class c) { List r = new ArrayList<>(); Field[] all = PathsAndFiles.class.getDeclaredFields(); for (Field field : all) { try { Object o = field.get(null); if (c.isInstance(o)) { InfrastructureFileDescriptor i = (InfrastructureFileDescriptor) o; for (Target targe : i.target) { if (desired == null || targe == desired) { r.add(i); break; } } } } catch (IllegalArgumentException | IllegalAccessException ex) { OutputController.getLogger().log(ex); } } r.add(getRecentlyUsedFile()); return r; } public static List getAllJavaWsFiles() { return getAllFiles(Target.JAVAWS); } public static List getAllItWebSettingsFiles() { return getAllFiles(Target.ITWEB_SETTINGS); } public static List getAllPEFiles() { return getAllFiles(Target.POLICY_EDITOR); } public static List getAllPluginFiles() { return getAllFiles(Target.PLUGIN); } private static class HomeFileDescriptor extends InfrastructureFileDescriptor { private HomeFileDescriptor(String fileName, String pathSub, String description, Target... target) { super(fileName, pathSub, System.getProperty(HOME_PROP), description, target); } @Override public String getSystemPathStubAcronym() { return VARIABLE + "HOME"; } } private static class SystemCofigFileDescriptor extends InfrastructureFileDescriptor { private static final String windowsPathSuffix = File.separator + "Sun" + File.separator + "Java"; private static final String unixPathSuffix = File.separator + "etc" + File.separator + ".java"; private static String getSystemConfigDir() { if (JNLPRuntime.isWindows()) { return System.getenv(WINDIR) + windowsPathSuffix; } else { return unixPathSuffix; } } @Override public String getSystemPathStubAcronym() { //note the hardcoded % instead of VARIABLE (actuall leading to idea, that docs, when generated on windows may not make sense) return "{" + "%" + WINDIR + windowsPathSuffix + " or " + unixPathSuffix + "}"; } private SystemCofigFileDescriptor(String fileName, String pathSub, String description, Target... target) { super(fileName, pathSub, getSystemConfigDir(), description, target); } } private static class SystemDeploymentCofigFileDescriptor extends SystemCofigFileDescriptor { private SystemDeploymentCofigFileDescriptor(String fileName, String description, Target... target) { super(fileName, "deployment", description, target); } } private static class SystemJavaFileDescriptor extends InfrastructureFileDescriptor { private SystemJavaFileDescriptor(String fileName, String pathSub, String description, Target... target) { super(fileName, pathSub, System.getProperty(JAVA_PROP), description, target); } @Override public String getSystemPathStubAcronym() { return VARIABLE + "JAVA_HOME"; } } private static class SystemJavaLibFileDescriptor extends SystemJavaFileDescriptor { private SystemJavaLibFileDescriptor(String fileName, String desc, Target... target) { super(fileName, "lib", desc, target); } private SystemJavaLibFileDescriptor(String fileName, String subpath, String description, Target... target) { super(fileName, "lib" + File.separator + subpath, description, target); } } private static class SystemJavaSecurityFileDescriptor extends SystemJavaLibFileDescriptor { private SystemJavaSecurityFileDescriptor(String fileName) { super(fileName, securityWord, "FILEjavacerts", Target.JAVAWS); } } private static class DataFileDescriptor extends InfrastructureFileDescriptor { private DataFileDescriptor(String fileName, String sp, String description, Target... target) { super(fileName, sp, DATA_HOME, description, target); } @Override public String getSystemPathStubAcronym() { return VARIABLE + "" + XDG_DATA_HOME; } } /** * http://standards.freedesktop.org/menu-spec/menu-spec-1.0.html#paths */ private static class MenuFileDescriptor extends DataFileDescriptor { private MenuFileDescriptor(String fileName, String description, Target... target) { super(fileName, "applications", description, target); } } private static class RuntimeFileDescriptor extends InfrastructureFileDescriptor { private RuntimeFileDescriptor(String fileName, String description, Target... target) { super(fileName, RUNTIME_HOME, "", description, target); } @Override public String getSystemPathStubAcronym() { return VARIABLE + "" + XDG_RUNTIME_DIR_VAR; } } private static class ConfigFileDescriptor extends InfrastructureFileDescriptor { private ConfigFileDescriptor(String fileName, String pathStub, String description, Target... target) { super(fileName, pathStub, CONFIG_HOME, description, target); } @Override public String getSystemPathStubAcronym() { return VARIABLE + "" + XDG_CONFIG_HOME_VAR; } } private static class CacheFileDescriptor extends InfrastructureFileDescriptor { private CacheFileDescriptor(String fileName, String pathStub, String description, Target... target) { super(fileName, pathStub, CACHE_HOME, description, target); } @Override public String getSystemPathStubAcronym() { return VARIABLE + "" + XDG_CACHE_HOME_VAR; } } private static class ItwConfigFileDescriptor extends ConfigFileDescriptor { private ItwConfigFileDescriptor(String fileName, String description, Target... target) { super(fileName, DEPLOYMENT_SUBDIR_DIR, description, target); } private ItwConfigFileDescriptor(String fileName, String folowingPath, String description, Target... target) { super(fileName, DEPLOYMENT_SUBDIR_DIR + File.separator + folowingPath, description, target); } } private static class UserSecurityConfigFileDescriptor extends ItwConfigFileDescriptor { private UserSecurityConfigFileDescriptor(String fileName, String description, Target... target) { super(fileName, securityWord, description, target); } } private static class UserCacertsFileDescriptor extends UserSecurityConfigFileDescriptor { private UserCacertsFileDescriptor(String fileName) { super(fileName, "FILEusercerts", Target.JAVAWS); } } private static class ItwCacheFileDescriptor extends CacheFileDescriptor { private ItwCacheFileDescriptor(String fileName, String description, Target... target) { super(fileName, DEPLOYMENT_SUBDIR_DIR, description, target); } private ItwCacheFileDescriptor(String fileName, String folowingPath, String description, Target... target) { super(fileName, DEPLOYMENT_SUBDIR_DIR + File.separator + folowingPath, description, target); } } private static class TmpUsrFileDescriptor extends InfrastructureFileDescriptor { private TmpUsrFileDescriptor(String fileName, String pathStub, String description, Target... target) { super(fileName, pathStub, System.getProperty(TMP_PROP) + File.separator + System.getProperty(USER_PROP), description, target); } @Override public String getSystemPathStubAcronym() { return VARIABLE + "TMP" + File.separator + VARIABLE + "USER"; } }; } icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/ValueValidator.java0000644000000000000000000000013213441742745025307 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/ValueValidator.java0000644000175000002070000000475013441742745026125 0ustar00jvanekmock00000000000000/* ValueChecker.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; /** * A class implements the ValueValidator interface to indicate that it can validate * values. * * @see BasicValueValidators */ public interface ValueValidator { /** * This method checks if the given object is a valid value for this * specific {@link ValueValidator}. Any arbitrary operation can be * performed to ensure that the value is valid. * * @param value The object to validate * @throws IllegalArgumentException if the value is invalid */ public void validate(Object value) throws IllegalArgumentException; /** * Returns a string describing possible values in human-readable form that * this {@link ValueValidator} accepts * * @return a string describing possible values that this * {@link ValueValidator} accepts */ public String getPossibleValues(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/ConfiguratonValidator.java0000644000000000000000000000013113441742745026670 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/ConfiguratonValidator.java0000644000175000002070000001037013441742745027502 0ustar00jvanekmock00000000000000/* Validator.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Validates a DeploymentConfiguration by identifying settings with * unrecognized names or incorrect values. */ public class ConfiguratonValidator { private List> incorrectEntries; private List> unrecognizedEntries; private Map> toValidate = null; private boolean validated = false; /** * @param toValidate the settings to validate */ public ConfiguratonValidator(Map> toValidate) { this.toValidate = toValidate; } /** * Validates the settings used in the constructor. Use * {@link #getIncorrectSetting()} and {@link #getUnrecognizedSetting()} to * get the list of incorrect or unrecognized settings. */ public void validate() { incorrectEntries = new ArrayList>(); unrecognizedEntries = new ArrayList>(); Map> knownGood = Defaults.getDefaults(); for (String key : toValidate.keySet()) { // check for known incorrect settings if (knownGood.containsKey(key)) { Setting good = knownGood.get(key); Setting unknown = toValidate.get(key); ValueValidator checker = good.getValidator(); if (checker != null) { try { checker.validate(unknown.getValue()); } catch (IllegalArgumentException e) { Setting strange = new Setting(unknown); strange.setValue(unknown.getValue()); incorrectEntries.add(strange); } } } else { // check for unknown settings Setting strange = new Setting(toValidate.get(key)); unrecognizedEntries.add(strange); } } validated = true; } /** * @return a list of settings which have incorrect values */ public List> getIncorrectSetting() { if (!validated) { throw new IllegalStateException(); } return new ArrayList>(incorrectEntries); } /** * @return a list of settings which are not recognized */ public List> getUnrecognizedSetting() { if (!validated) { throw new IllegalStateException(); } return new ArrayList>(unrecognizedEntries); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/SecurityValueValidator.java0000644000000000000000000000013213441742745027037 xustar0030 mtime=1552401893.030832841 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/SecurityValueValidator.java0000644000175000002070000000557513441742745027663 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel; class SecurityValueValidator implements ValueValidator { public SecurityValueValidator() { } @Override public void validate(Object value) throws IllegalArgumentException { if (value == null) { // null is correct, it means it is not user set // and so default shoudl be used whatever it is // returning to prevent NPE in fromString return; } if (value instanceof AppletSecurityLevel) { //?? return; } if (!(value instanceof String)) { throw new IllegalArgumentException("Expected was String, was " + value.getClass()); } try { AppletSecurityLevel validated = AppletSecurityLevel.fromString((String) value); if (validated == null) { throw new IllegalArgumentException("Result can't be null, was"); } //thrown by fromString } catch (RuntimeException ex) { throw new IllegalArgumentException(ex); } } @Override public String getPossibleValues() { return AppletSecurityLevel.allToString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/InfrastructureFileDescriptor.java0000644000000000000000000000013213441742745030244 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/InfrastructureFileDescriptor.java0000644000175000002070000001477113441742745031066 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; public class InfrastructureFileDescriptor { private final String fileName; private final String pathStub; private final String systemPathStub; private final String descriptionKey; final PathsAndFiles.Target[] target; //simple constructor to allow testing instances based on overrides protected InfrastructureFileDescriptor() { this("undef", "undef", "undef", "undef"); } InfrastructureFileDescriptor(String fileName, String pathStub, String systemPathStub, String descriptionKey, PathsAndFiles.Target... target) { this.fileName = fileName; this.pathStub = pathStub; this.systemPathStub = systemPathStub; this.descriptionKey = descriptionKey; this.target = target; } /** setup-able files have to override this * if they don't, they are read only, and set value will fail * if it is desired to write value of property, then override and use known key. * @return null by default. Should return key to configuration if overriden. */ protected String getPropertiesKey() { return null; } public File getFile() { return new File(getFullPath()); } public URL getUrl() throws MalformedURLException { return getFile().toURI().toURL(); } public void setValue(String value) { setValue(value, JNLPRuntime.getConfiguration()); } public String getFullPath() { return getFullPath(JNLPRuntime.getConfiguration()); } /** * overload version for control panel, which is saving to internal copy. * @param value new path of file * @param config config where t write this value (note, usually JNLPRuntime.getConfiguration() * so you don't need it, but our config gui tool is using two sets to allow undo. */ public void setValue(String value, DeploymentConfiguration config) { String key = getPropertiesKey(); if (key == null) { throw new IllegalStateException("This file is read only"); } else { config.setProperty(key, value); } } /** * overload version for control panel, which is saving to internal copy. * @param config config from where to readthis value (note, usually JNLPRuntime.getConfiguration() * so you don't need it, but our config gui tool is using two sets to allow undo. * @return configured property or default */ public String getFullPath(DeploymentConfiguration config) { String key = getPropertiesKey(); if (key == null) { return getDefaultFullPath(); } else { return config.getProperty(key); } } public File getDefaultFile() { return new File(getDefaultFullPath()); } public String getDefaultDir() { return clean(systemPathStub + File.separator + pathStub); } public String getDefaultFullPath() { return clean(systemPathStub + File.separator + pathStub + File.separator + fileName); } //returns path acronym for default location protected String getSystemPathStubAcronym() { return systemPathStub; } protected String getFileName() { return fileName; } protected String getDescriptionKey() { return descriptionKey; } /** * This remaining part of file declaration, when acronym is removed. * See getDirViaAcronym. * * @return */ private String getStub() { return clean(pathStub + File.separator + fileName); } @Override public String toString() { return clean(getSystemPathStubAcronym() + File.separator + getStub()); } /** * For documentation purposes, the descriptor may be created as VARIABLE/custom/path. * * This is whole part, which is considered as setup-able. * @return directory acronym for nice docs */ public String getDirViaAcronym() { return clean(getSystemPathStubAcronym() + File.separator + pathStub); } /** * Remove garbage from paths. * * Currently this methods unify all multiple occurrences of separators * to single one. Eg /path/to//file will become /path/to/file. * * Those artifacts maybe spread during various s=path+deparator+subdir+separator * file=s+separator+filename * * @param s string to be cleaned * @return cleaned string */ protected String clean(String s) { while (s.contains(File.separator + File.separator)) { s = s.replace(File.separator + File.separator, File.separator); } return s; } /** * @return the translated description */ public String getDescription() { return Translator.R(descriptionKey); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/Setting.java0000644000000000000000000000013213441742745024002 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/Setting.java0000644000175000002070000001323013441742745024611 0ustar00jvanekmock00000000000000/* Setting.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; /** * Represents a value for a configuration. Provides methods to get the value * as well as marking the value as locked. * * Each instance of this class has an associated ValueChecker. This checker * can be used to check if the current value is valid. The default value * _must_ be valid. Null values can not originate externally so are (mostly) * considered valid. */ public class Setting { private String name = null; private String description = null; private boolean locked = false; private ValueValidator validator = null; private T defaultValue = null; private T value = null; private String source = null; /** * Creates a new Settings object * * @param name the name of this setting * @param description a human readable description of this setting * @param locked whether this setting is currently locked * @param validator the {@link ValueValidator} that can be used to validate * the value * @param defaultValue the default value of this setting. If this is not a * recognized setting, use null. * @param value the initial value of this setting * @param source the origin of the value (a file, or perhaps "{@code }") */ public Setting(String name, String description, boolean locked, ValueValidator validator, T defaultValue, T value, String source) { this.name = name; this.description = description; this.locked = locked; this.validator = validator; this.source = source; this.defaultValue = defaultValue; this.value = value; } /** * Creates a new Settings object by cloning the values from another * Settings object * @param other a Settings object to initialize settings from */ public Setting(Setting other) { this(other.name, other.description, other.locked, other.validator, other.defaultValue, other.value, other.source); } /** * @return the {@link ValueValidator} that can be used to check if * the current value is valid */ public ValueValidator getValidator() { return validator; } /** * @return the default value for this setting. May be null if this is not * one of the supported settings */ public T getDefaultValue() { return defaultValue; } /** * @return a human readable description of this setting */ public String getDescription() { return description; } /** * @return the name (like foo.bar.baz) of this setting */ public String getName() { return name; } /** * @return the source of the current value of this setting. May be a string * like "internal" or it may be the location of the properties file */ public String getSource() { return source; } /** * @return the current value of this setting */ public T getValue() { return value; } /** * @return true if this setting is locked */ public boolean isLocked() { return locked; } /** * Marks this setting as locked or unlocked. Setting the value is not * enforced by this class. * * @param locked whether to mark this setting as locked or not locked. */ public void setLocked(boolean locked) { this.locked = locked; } /** * Sets the source of the current value of this Setting. Maybe a string * like "internal" or the location of the properties file * * @param source the source of the value */ public void setSource(String source) { this.source = source; } /** * Note that setting the value is not enforced - it is the caller's * responsibility to check if a value is locked or not before setting a * new value * * @param value the new value */ public void setValue(T value) { this.value = value; } @Override public String toString() { return value.toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/BasicValueValidators.java0000644000000000000000000000013113441742745026433 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/BasicValueValidators.java0000644000175000002070000003577413441742745027264 0ustar00jvanekmock00000000000000/* BasicValueCheckers.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.config; import net.sourceforge.jnlp.runtime.ManifestAttributesChecker; import java.io.File; import static net.sourceforge.jnlp.runtime.Translator.R; import java.net.URL; import java.util.Arrays; import java.util.Locale; import net.sourceforge.jnlp.runtime.Translator; /** * Provides {@link ValueValidator} implementations for some common value types * * @see #getBooleanValidator() * @see #getFilePathValidator() * @see #getRangedIntegerValidator(int, int) * @see #getStringValidator(String[]) * @see #getUrlValidator() */ public class BasicValueValidators { /** * Checks if a value is a valid boolean */ private static class BooleanValidator implements ValueValidator { @Override public void validate(Object value) throws IllegalArgumentException { Object possibleValue = value; if (possibleValue instanceof String) { String lower = ((String) possibleValue).toLowerCase(Locale.ENGLISH); if (lower.equals(Boolean.TRUE.toString()) || (lower.equals(Boolean.FALSE.toString()))) { possibleValue = Boolean.valueOf(lower); } } if (!(possibleValue instanceof Boolean)) { throw new IllegalArgumentException(); } } @Override public String getPossibleValues() { return R("VVPossibleBooleanValues", Boolean.TRUE.toString(), Boolean.FALSE.toString()); } }; /** * Checks if a value is a valid file path (not a valid file!). The actual * file may or may not exist */ //package private for testing purposes static class FilePathValidator implements ValueValidator { @Override public void validate(Object value) throws IllegalArgumentException { if (value == null) { return; } Object possibleValue = value; if (!(possibleValue instanceof String)) { throw new IllegalArgumentException("Value should be string!"); } String possibleFile = (String) possibleValue; boolean absolute = new File(possibleFile).isAbsolute(); if (!absolute) { throw new IllegalArgumentException("File must be absolute"); } } @Override public String getPossibleValues() { return R("VVPossibleFileValues"); } } /** * Checks that the value is an Integer or Long (or a String representation * of one) that is within a desired range). */ private static class RangedIntegerValidator implements ValueValidator { private int low = 0; private int high = 0; public RangedIntegerValidator(int low, int high) { this.low = low; this.high = high; } @Override public void validate(Object value) throws IllegalArgumentException { Object possibleValue = value; long actualValue = 0; try { if (possibleValue instanceof String) { actualValue = Long.valueOf((String) possibleValue); } else if (possibleValue instanceof Integer) { actualValue = (Integer) possibleValue; } else if (possibleValue instanceof Long) { actualValue = (Long) possibleValue; } else { throw new IllegalArgumentException("Must be an integer"); } } catch (NumberFormatException e) { throw new IllegalArgumentException("Must be an integer"); } if (actualValue < low || actualValue > high) { throw new IllegalArgumentException("Not in range from " + low + " to " + high); } } @Override public String getPossibleValues() { return R("VVPossibleRangedIntegerValues", low, high); } }; /** * Checks that the value is one of the acceptable String values */ private static class StringValueValidator implements ValueValidator { String[] options = null; public StringValueValidator(String[] acceptableOptions) { options = acceptableOptions; } @Override public void validate(Object value) throws IllegalArgumentException { Object possibleValue = value; if (!(possibleValue instanceof String)) { throw new IllegalArgumentException("Must be a string"); } String stringVal = (String) possibleValue; boolean found = false; for (String knownVal : options) { if (knownVal.equals(stringVal)) { found = true; break; } } if (!found) { throw new IllegalArgumentException(); } } @Override public String getPossibleValues() { return Arrays.toString(options); } } /** * Checks that the value is one of the acceptable single String values * or an acceptable combination of String values */ private static class MultipleStringValueValidator implements ValueValidator { private final String[] singleOptions; private final String[] comboOptions; public MultipleStringValueValidator(String[] singleOptions, String[] comboOptions) { this.singleOptions = singleOptions; this.comboOptions = comboOptions; } @Override public void validate(Object value) throws IllegalArgumentException { Object possibleValue = value; if (!(possibleValue instanceof String)) { throw new IllegalArgumentException("Must be a string"); } String stringVal = (String) possibleValue; boolean found = false; for (String knownVal : singleOptions) { if (knownVal.equals(stringVal)) { found = true; break; } } if (!found) { String[] possibleCombo = splitCombination(stringVal); for (String val : possibleCombo) { if (comboOptionsContains(val)) { found = true; } else { throw new IllegalArgumentException(); } } } if (!found) { throw new IllegalArgumentException(); } } private boolean comboOptionsContains(String possibleVal) { for (String value : comboOptions) { if (value.equals(possibleVal)) { return true; } } return false; } @Override public String getPossibleValues() { String message = "(Values that can be used alone only): " + Arrays.toString(singleOptions) + " (Values that can be used in combination separated by the delimiter \"" + DELIMITER + "\" with no space expected ): " + Arrays.toString(comboOptions); return message; } } public static class RustCpValidator implements ValueValidator { @Override public void validate(Object value) throws IllegalArgumentException { //cant be wrong... //but we need that getPossibleValues description } @Override public String getPossibleValues() { return R("VVRustCpModifiers"); } } private final static String DELIMITER = ","; public static String[] splitCombination(String val) { return val.split(DELIMITER); } private static class ManifestAttributeCheckValidator extends MultipleStringValueValidator { public ManifestAttributeCheckValidator() { super(new String[] { ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ALL.toString(), ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.NONE.toString() }, new String[] { ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ALAC.toString(), ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.CODEBASE.toString(), ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.ENTRYPOINT.toString(), ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.PERMISSIONS.toString(), ManifestAttributesChecker.MANIFEST_ATTRIBUTES_CHECK.TRUSTED.toString() }); } } /** * Checks that the value is a URL */ private static class UrlValidator implements ValueValidator { @Override public void validate(Object value) throws IllegalArgumentException { if (value == null) { return; } try { new URL((String) value); } catch (Exception e) { throw new IllegalArgumentException(); } } @Override public String getPossibleValues() { return R("VVPossibleUrlValues"); } } /** * @return a {@link ValueValidator} that can be used to check if an object is * a valid Boolean */ public static ValueValidator getBooleanValidator() { return new BooleanValidator(); } /** * @return a {@link ValueValidator} that can be used to check if an object is * a String containing a valid file path or not */ public static ValueValidator getFilePathValidator() { return new FilePathValidator(); } public static ValueValidator getBrowserPathValidator() { return new ValueValidator() { @Override public void validate(Object value) throws IllegalArgumentException { if (value == null) { return; } if (!(value instanceof String)) { throw new IllegalArgumentException("Value should be string!"); } if (verifyFileOrCommand((String)value) == null){ //jsut warn? throw new IllegalArgumentException("Value should be file, or on PATH, or known keyword. See possible values."); } } @Override public String getPossibleValues() { return Translator.VVPossibleBrowserValues(); } }; } public static String verifyFileOrCommand(String cmd) { cmd = cmd.split("\\s+")[0]; if (cmd.equals(DeploymentConfiguration.ALWAYS_ASK) || cmd.equals(DeploymentConfiguration.INTERNAL_HTML)) { return "keyword"; } File fileCandidate = new File(cmd); if (fileCandidate.exists() && !fileCandidate.isDirectory()) { return cmd; } String path = System.getenv("PATH"); if (path != null) { String[] pathMembers = path.split(File.pathSeparator); for (String s : pathMembers) { File pathCandidate = new File(s, cmd); if (pathCandidate.exists() && !pathCandidate.isDirectory()) { return pathCandidate.toString(); } } } return null; } /** * Returns a {@link ValueValidator} that checks if an object represents a * valid integer (it is a Integer or Long or a String representation of * one), within the given range. The values are inclusive. * @param low the lowest valid value * @param high the highest valid value * @return value validator for given range */ public static ValueValidator getRangedIntegerValidator(int low, int high) { return new RangedIntegerValidator(low, high); } /** * Returns a {@link ValueValidator} that checks if an object is a string from * one of the provided Strings. * @param validValues an array of Strings which are considered valid * @return validator for given strings */ public static ValueValidator getStringValidator(String[] validValues) { return new StringValueValidator(validValues); } /** * Returns a {@link ValueValidator} that checks if an object is a string from * one of the provided single option Strings or a combination from * the provided combination Strings. * @param singleValues an array of Strings which are considered valid only by themselves * @param comboValues an array of Strings which are considered valid in any combination * with themselves * @return validator forgiven strings */ public static ValueValidator getMultipleStringValidator(String[] singleValues, String[] comboValues) { return new MultipleStringValueValidator(singleValues, comboValues); } /** * @return a {@link ValueValidator} that checks if an object is a string * from the possible single or combination ManifestAttributeCheck values */ public static ValueValidator getManifestAttributeCheckValidator() { return new ManifestAttributeCheckValidator(); } /** * @return a {@link ValueValidator} that checks if an object represents a * valid url */ public static ValueValidator getUrlValidator() { return new UrlValidator(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/config/PaxHeaders.7406/DeploymentConfiguration.java0000644000000000000000000000013213441742745027235 xustar0030 mtime=1552401893.034832833 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java0000644000175000002070000012410013441742745030043 0ustar00jvanekmock00000000000000// Copyright (C) 2010 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.config; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.Reader; import java.net.MalformedURLException; import java.net.URL; import java.nio.channels.FileLock; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.Set; import javax.imageio.spi.IIORegistry; import javax.naming.ConfigurationException; import javax.swing.JOptionPane; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.tools.ico.IcoSpi; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.OutputController; /** * Manages the various properties and configuration related to deployment. * * See: * http://download.oracle.com/javase/1.5.0/docs/guide/deployment/deployment-guide/properties.html */ public final class DeploymentConfiguration { public static final String DEPLOYMENT_CONFIG_FILE = "deployment.config"; public static final String DEPLOYMENT_PROPERTIES = "deployment.properties"; public static final String APPLET_TRUST_SETTINGS = ".appletTrustSettings"; public static final String DEPLOYMENT_COMMENT = "Netx deployment configuration"; public String userComments; public String systemComments; public static final int JNLP_ASSOCIATION_NEVER = 0; public static final int JNLP_ASSOCIATION_NEW_ONLY = 1; public static final int JNLP_ASSOCIATION_ASK_USER = 2; public static final int JNLP_ASSOCIATION_REPLACE_ASK = 3; /** * when set to as value of KEY_CONSOLE_STARTUP_MODE = "deployment.console.startup.mode", * then console is not visible by default, but may be shown */ public static final String CONSOLE_HIDE = "HIDE"; /** * when set to as value of KEY_CONSOLE_STARTUP_MODE = "deployment.console.startup.mode", * then console show for both javaws and plugin */ public static final String CONSOLE_SHOW = "SHOW"; /** * when set to as value of KEY_CONSOLE_STARTUP_MODE = "deployment.console.startup.mode", * then console is not visible by default, nop data are passed to it (save memory and cpu) but can not be shown */ public static final String CONSOLE_DISABLE = "DISABLE"; /** * when set to as value of KEY_CONSOLE_STARTUP_MODE = "deployment.console.startup.mode", * then console show for plugin */ public static final String CONSOLE_SHOW_PLUGIN = "SHOW_PLUGIN_ONLY"; /** * when set to as value of KEY_CONSOLE_STARTUP_MODE = "deployment.console.startup.mode", * then console show for javaws */ public static final String CONSOLE_SHOW_JAVAWS = "SHOW_JAVAWS_ONLY"; public static final String KEY_USER_CACHE_DIR = "deployment.user.cachedir"; public static final String KEY_USER_PERSISTENCE_CACHE_DIR = "deployment.user.pcachedir"; public static final String KEY_SYSTEM_CACHE_DIR = "deployment.system.cachedir"; public static final String KEY_CACHE_MAX_SIZE = "deployment.cache.max.size"; public static final String KEY_CACHE_ENABLED = "deployment.javapi.cache.enabled"; public static final String KEY_CACHE_COMPRESSION_ENABLED = "deployment.cache.jarcompression"; public static final String KEY_USER_LOG_DIR = "deployment.user.logdir"; public static final String KEY_USER_TMP_DIR = "deployment.user.tmp"; /** the directory containing locks for single instance applications */ public static final String KEY_USER_LOCKS_DIR = "deployment.user.locksdir"; /** * The netx_running file is used to indicate if any instances of netx are * running (this file may exist even if no instances are running). All netx * instances acquire a shared lock on this file. If this file can be locked * (using a {@link FileLock}) in exclusive mode, then other netx instances * are not running */ public static final String KEY_USER_NETX_RUNNING_FILE = "deployment.user.runningfile"; public static final String KEY_USER_SECURITY_POLICY = "deployment.user.security.policy"; public static final String KEY_USER_TRUSTED_CA_CERTS = "deployment.user.security.trusted.cacerts"; public static final String KEY_USER_TRUSTED_JSSE_CA_CERTS = "deployment.user.security.trusted.jssecacerts"; public static final String KEY_USER_TRUSTED_CERTS = "deployment.user.security.trusted.certs"; public static final String KEY_USER_TRUSTED_JSSE_CERTS = "deployment.user.security.trusted.jssecerts"; public static final String KEY_USER_TRUSTED_CLIENT_CERTS = "deployment.user.security.trusted.clientauthcerts"; public static final String KEY_SYSTEM_SECURITY_POLICY = "deployment.system.security.policy"; public static final String KEY_SYSTEM_TRUSTED_CA_CERTS = "deployment.system.security.cacerts"; public static final String KEY_SYSTEM_TRUSTED_JSSE_CA_CERTS = "deployment.system.security.jssecacerts"; public static final String KEY_SYSTEM_TRUSTED_CERTS = "deployment.system.security.trusted.certs"; public static final String KEY_SYSTEM_TRUSTED_JSSE_CERTS = "deployment.system.security.trusted.jssecerts"; public static final String KEY_SYSTEM_TRUSTED_CLIENT_CERTS = "deployment.system.security.trusted.clientautcerts"; /* * Security and access control */ /** Boolean. Only show security prompts to user if true */ public static final String KEY_SECURITY_PROMPT_USER = "deployment.security.askgrantdialog.show"; //enum of AppletSecurityLevel in result public static final String KEY_SECURITY_LEVEL = "deployment.security.level"; public static final String KEY_SECURITY_TRUSTED_POLICY = "deployment.security.trusted.policy"; /** Boolean. Only give AWTPermission("showWindowWithoutWarningBanner") if true */ public static final String KEY_SECURITY_ALLOW_HIDE_WINDOW_WARNING = "deployment.security.sandbox.awtwarningwindow"; /** Boolean. Only prompt user for granting any JNLP permissions if true */ public static final String KEY_SECURITY_PROMPT_USER_FOR_JNLP = "deployment.security.sandbox.jnlp.enhanced"; /** Boolean. Only install the custom authenticator if true */ public static final String KEY_SECURITY_INSTALL_AUTHENTICATOR = "deployment.security.authenticator"; /** Boolean. Only install the custom authenticator if true */ public static final String KEY_SECURITY_ITW_IGNORECERTISSUES = "deployment.security.itw.ignorecertissues"; public static final String KEY_STRICT_JNLP_CLASSLOADER = "deployment.jnlpclassloader.strict"; /** Boolean. Do not prefere https over http */ public static final String KEY_HTTPS_DONT_ENFORCE = "deployment.https.noenforce"; /* * Networking */ /** the proxy type. possible values are {@code JNLPProxySelector.PROXY_TYPE_*} */ public static final String KEY_PROXY_TYPE = "deployment.proxy.type"; /** Boolean. If true, the http host/port should be used for https and ftp as well */ public static final String KEY_PROXY_SAME = "deployment.proxy.same"; public static final String KEY_PROXY_AUTO_CONFIG_URL = "deployment.proxy.auto.config.url"; public static final String KEY_PROXY_BYPASS_LIST = "deployment.proxy.bypass.list"; public static final String KEY_PROXY_BYPASS_LOCAL = "deployment.proxy.bypass.local"; public static final String KEY_PROXY_HTTP_HOST = "deployment.proxy.http.host"; public static final String KEY_PROXY_HTTP_PORT = "deployment.proxy.http.port"; public static final String KEY_PROXY_HTTPS_HOST = "deployment.proxy.https.host"; public static final String KEY_PROXY_HTTPS_PORT = "deployment.proxy.https.port"; public static final String KEY_PROXY_FTP_HOST = "deployment.proxy.ftp.host"; public static final String KEY_PROXY_FTP_PORT = "deployment.proxy.ftp.port"; public static final String KEY_PROXY_SOCKS4_HOST = "deployment.proxy.socks.host"; public static final String KEY_PROXY_SOCKS4_PORT = "deployment.proxy.socks.port"; public static final String KEY_PROXY_OVERRIDE_HOSTS = "deployment.proxy.override.hosts"; /* * Logging */ public static final String KEY_ENABLE_LOGGING = "deployment.log"; //same as verbose or ICEDTEAPLUGIN_DEBUG=true public static final String KEY_ENABLE_LOGGING_HEADERS = "deployment.log.headers"; //will add header OutputContorll.getHeader To all messages public static final String KEY_ENABLE_LOGGING_TOFILE = "deployment.log.file"; public static final String KEY_ENABLE_APPLICATION_LOGGING_TOFILE ="deployment.log.file.clientapp"; //also client app will log to its separate file public static final String KEY_ENABLE_LEGACY_LOGBASEDFILELOG = "deployment.log.file.legacylog"; public static final String KEY_ENABLE_LOGGING_TOSTREAMS = "deployment.log.stdstreams"; public static final String KEY_ENABLE_LOGGING_TOSYSTEMLOG = "deployment.log.system"; /* * manifest check */ public static final String KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK = "deployment.manifest.attributes.check"; /** * Console initial status. * One of CONSOLE_* values * See declaration above: * CONSOLE_HIDE = "HIDE"; * CONSOLE_SHOW = "SHOW"; * CONSOLE_DISABLE = "DISABLE"; * CONSOLE_SHOW_PLUGIN = "SHOW_PLUGIN_ONLY"; * CONSOLE_SHOW_JAVAWS = "SHOW_JAVAWS_ONLY"; */ public static final String KEY_CONSOLE_STARTUP_MODE = "deployment.console.startup.mode"; /* * Desktop Integration */ public static final String KEY_JNLP_ASSOCIATIONS = "deployment.javaws.associations"; public static final String KEY_CREATE_DESKTOP_SHORTCUT = "deployment.javaws.shortcut"; public static final String KEY_JRE_INTSTALL_URL = "deployment.javaws.installURL"; public static final String KEY_AUTO_DOWNLOAD_JRE = "deployment.javaws.autodownload"; public static final String KEY_BROWSER_PATH = "deployment.browser.path"; //for legacy reasons, also $BROWSER variable is supported public static final String BROWSER_ENV_VAR = "BROWSER"; // both browser.path and BROWSER can ave those for-fun keys: public static final String ALWAYS_ASK="ALWAYS-ASK"; public static final String INTERNAL_HTML="INTERNAL-HTML"; public static final String LEGACY_WIN32_URL__HANDLER="rundll32 url.dll,FileProtocolHandler "; public static final String KEY_UPDATE_TIMEOUT = "deployment.javaws.update.timeout"; public static final String IGNORE_HEADLESS_CHECK = "deployment.headless.ignore"; /* * JVM arguments for plugin */ public static final String KEY_PLUGIN_JVM_ARGUMENTS= "deployment.plugin.jvm.arguments"; public static final String KEY_JRE_DIR= "deployment.jre.dir"; /** * remote configuration properties */ public static final String KEY_SYSTEM_CONFIG = "deployment.system.config"; public static final String KEY_SYSTEM_CONFIG_MANDATORY = "deployment.system.config.mandatory"; /** * Possibility to control hack which resizes very small applets */ public static final String KEY_SMALL_SIZE_OVERRIDE_TRESHOLD = "deployment.small.size.treshold"; public static final String KEY_SMALL_SIZE_OVERRIDE_WIDTH = "deployment.small.size.override.width"; public static final String KEY_SMALL_SIZE_OVERRIDE_HEIGHT = "deployment.small.size.override.height"; public static final String TRANSFER_TITLE = "Legacy configuration and cache found. Those will be now transported to new locations"; private ConfigurationException loadingException = null; public void setLoadingException(ConfigurationException ex) { loadingException = ex; } public ConfigurationException getLoadingException() { return loadingException; } public void resetToDefaults() { currentConfiguration = Defaults.getDefaults(); } static boolean checkUrl(URL file) { try (InputStream s = file.openStream()) { return true; } catch (Throwable ex) { // this should be logged, however, logging botle neck may not be initialised here return false; } } public enum ConfigType { System, User } /** is it mandatory to load the system properties? */ private boolean systemPropertiesMandatory = false; /** The system's subdirResult deployment.config file */ private URL systemPropertiesFile = null; /** Source of always right and only path to file (even if underlying path changes) */ private final InfrastructureFileDescriptor userDeploymentFileDescriptor; /** The user's subdirResult deployment.config file */ private File userPropertiesFile = null; /** the current deployment properties */ private Map> currentConfiguration; /** the deployment properties that cannot be changed */ private Map> unchangeableConfiguration; public DeploymentConfiguration() { this(PathsAndFiles.USER_DEPLOYMENT_FILE); } public DeploymentConfiguration(InfrastructureFileDescriptor configFile) { userDeploymentFileDescriptor = configFile; currentConfiguration = new HashMap<>(); unchangeableConfiguration = new HashMap<>(); try { IcoSpi spi = new IcoSpi(); IIORegistry.getDefaultInstance().registerServiceProvider(spi); OutputController.getLogger().log("Ico provider registered correctly."); } catch (Exception ex) { OutputController.getLogger().log("Exception registering ico provider."); OutputController.getLogger().log(ex); } } /** * Initialize this deployment configuration by reading configuration files. * Generally, it will try to continue and ignore errors it finds (such as file not found). * * @throws ConfigurationException if it encounters a fatal error. */ public void load() throws ConfigurationException { try { load(true); } catch (MalformedURLException ex) { throw new ConfigurationException(ex.toString()); } } /** * Initialize this deployment configuration by reading configuration files. * Generally, it will try to continue and ignore errors it finds (such as file not found). * * @param fixIssues If true, fix issues that are discovered when reading configuration by * resorting to the default values * @throws ConfigurationException if it encounters a fatal error. */ public void load(boolean fixIssues) throws ConfigurationException, MalformedURLException { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkRead(userDeploymentFileDescriptor.getFullPath()); } URL systemConfigFile = findSystemConfigFile(); load(systemConfigFile, userDeploymentFileDescriptor.getFile(), fixIssues); } void load(URL systemConfigFile, File userFile, boolean fixIssues) throws ConfigurationException, MalformedURLException { Map> initialProperties = Defaults.getDefaults(); Map> systemProperties = null; /* * First, try to read the system's subdirResult deployment.config file to find if * there is a system-level deployment.poperties file */ if (systemConfigFile != null) { if (loadSystemConfiguration(systemConfigFile)) { OutputController.getLogger().log("System level " + DEPLOYMENT_CONFIG_FILE + " is mandatory: " + systemPropertiesMandatory); /* Second, read the System level deployment.properties file */ systemProperties = loadProperties(ConfigType.System, systemPropertiesFile, systemPropertiesMandatory); systemComments=loadComments(systemPropertiesFile); } if (systemProperties != null) { mergeMaps(initialProperties, systemProperties); } } /* need a copy of the original when we have to save */ unchangeableConfiguration = new HashMap<>(); Set keys = initialProperties.keySet(); for (String key : keys) { unchangeableConfiguration.put(key, new Setting<>(initialProperties.get(key))); } /* * Third, read the user's subdirResult deployment.properties file */ userPropertiesFile = userFile; Map> userProperties = loadProperties(ConfigType.User, userPropertiesFile.toURI().toURL(), false); userComments = loadComments(userPropertiesFile.toURI().toURL()); if (userProperties != null) { mergeMaps(initialProperties, userProperties); } if (fixIssues) { checkAndFixConfiguration(initialProperties); } currentConfiguration = initialProperties; } /** * Copies the current configuration into the target * @param target properties where to copy actual ones */ public void copyTo(Properties target) { Set names = getAllPropertyNames(); for (String name : names) { String value = getProperty(name); // for Properties, missing and null are identical if (value != null) { target.setProperty(name, value); } } } /** * Get the value for the given key * * @param key the property key * @return the value for the key, or null if it can not be found */ public String getProperty(String key) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { if (userPropertiesFile != null) { sm.checkRead(userPropertiesFile.toString()); } } String value = null; if (currentConfiguration.get(key) != null) { value = currentConfiguration.get(key).getValue(); } return value; } /** * @return a Set containing all the property names */ public Set getAllPropertyNames() { SecurityManager sm = System.getSecurityManager(); if (sm != null) { if (userPropertiesFile != null) { sm.checkRead(userPropertiesFile.toString()); } } return currentConfiguration.keySet(); } /** * @return a map containing property names and the corresponding settings */ public Map> getRaw() { SecurityManager sm = System.getSecurityManager(); if (sm != null) { if (userPropertiesFile != null) { sm.checkRead(userPropertiesFile.toString()); } } return currentConfiguration; } /** * Sets the value of corresponding to the key. If the value has been marked * as locked, it is not changed * * @param key the key * @param value the value to be associated with the key */ public void setProperty(String key, String value) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { if (userPropertiesFile != null) { sm.checkWrite(userPropertiesFile.toString()); } } Setting currentValue = currentConfiguration.get(key); if (currentValue != null) { if (!currentValue.isLocked()) { currentValue.setValue(value); } } else { currentValue = new Setting<>(key, R("Unknown"), false, null, null, value, R("Unknown")); currentConfiguration.put(key, currentValue); } } /** * Check that the configuration is valid. If there are invalid values,set * those values to the default values. This is done by using check() * method of the ValueCheker for each setting on the actual value. Fixes * are made in-place. * * @param initial a map representing the initial configuration */ public void checkAndFixConfiguration(Map> initial) { Map> defaults = Defaults.getDefaults(); for (String key : initial.keySet()) { Setting s = initial.get(key); if (!(s.getName().equals(key))) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("DCInternal", "key " + key + " does not match setting name " + s.getName())); } else if (!defaults.containsKey(key)) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("DCUnknownSettingWithName", key)); } else { ValueValidator checker = defaults.get(key).getValidator(); if (checker == null) { continue; } try { checker.validate(s.getValue()); } catch (IllegalArgumentException e) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("DCIncorrectValue", key, s.getValue(), checker.getPossibleValues())); s.setValue(s.getDefaultValue()); OutputController.getLogger().log(e); } } } } /** * @return the location of system-level deployment.config file, or null if none can be found */ private URL findSystemConfigFile() throws MalformedURLException { if (PathsAndFiles.ETC_DEPLOYMENT_CFG.getFile().isFile()) { return PathsAndFiles.ETC_DEPLOYMENT_CFG.getUrl(); } String jrePath = null; try { Map> tmpProperties = parsePropertiesFile(userDeploymentFileDescriptor.getUrl()); Setting jreSetting = tmpProperties.get(KEY_JRE_DIR); if (jreSetting != null) { jrePath = jreSetting.getValue(); } } catch (Exception ex) { OutputController.getLogger().log(ex); } File jreFile; if (jrePath != null) { //based on property KEY_JRE_DIR jreFile = new File(jrePath + File.separator + "lib" + File.separator + DEPLOYMENT_CONFIG_FILE); } else { jreFile = PathsAndFiles.JAVA_DEPLOYMENT_PROP_FILE.getFile(); } if (jreFile.isFile()) { return jreFile.toURI().toURL(); } return null; } /** * Reads the system configuration file and sets the relevant * system-properties related variables */ private boolean loadSystemConfiguration(URL configFile) throws ConfigurationException { OutputController.getLogger().log("Loading system configuation from: " + configFile); Map> systemConfiguration = new HashMap<>(); try { systemConfiguration = parsePropertiesFile(configFile); } catch (IOException e) { OutputController.getLogger().log("No System level " + DEPLOYMENT_CONFIG_FILE + " found."); OutputController.getLogger().log(e); return false; } /* * at this point, we have read the system deployment.config file * completely */ String urlString = null; try { Setting urlSettings = systemConfiguration.get(KEY_SYSTEM_CONFIG); if (urlSettings == null || urlSettings.getValue() == null) { OutputController.getLogger().log("No System level " + DEPLOYMENT_PROPERTIES + " found in "+configFile.toExternalForm()); return false; } urlString = urlSettings.getValue(); Setting mandatory = systemConfiguration.get(KEY_SYSTEM_CONFIG_MANDATORY); systemPropertiesMandatory = Boolean.valueOf(mandatory == null ? null : mandatory.getValue()); //never null OutputController.getLogger().log("System level settings " + DEPLOYMENT_PROPERTIES + " are mandatory:" + systemPropertiesMandatory); URL url = new URL(urlString); systemPropertiesFile = url; OutputController.getLogger().log("Using System level" + DEPLOYMENT_PROPERTIES + ": " + systemPropertiesFile); return true; } catch (MalformedURLException e) { OutputController.getLogger().log("Invalid url for " + DEPLOYMENT_PROPERTIES+ ": " + urlString + "in " + configFile.toExternalForm()); OutputController.getLogger().log(e); if (systemPropertiesMandatory){ ConfigurationException ce = new ConfigurationException("Invalid url to system properties, which are mandatory"); ce.initCause(e); throw ce; } else { return false; } } } /** * Loads the properties file, if one exists * * @param type the ConfigType to load * @param file the File to load Properties from * @param mandatory indicates if reading this file is mandatory * * @throws ConfigurationException if the file is mandatory but cannot be read */ private Map> loadProperties(ConfigType type, URL file, boolean mandatory) throws ConfigurationException { if (file == null || !checkUrl(file)) { OutputController.getLogger().log("No " + type.toString() + " level " + DEPLOYMENT_PROPERTIES + " found."); if (!mandatory) { return null; } else { throw new ConfigurationException(); } } OutputController.getLogger().log("Loading " + type.toString() + " level properties from: " + file); try { return parsePropertiesFile(file); } catch (IOException e) { if (mandatory){ ConfigurationException ce = new ConfigurationException("Exception during loading of " + file + " which is mandatory to read"); ce.initCause(e); throw ce; } OutputController.getLogger().log(e); return null; } } /** * Saves all properties that are not part of default or system properties * * @throws IOException if unable to save the file * @throws IllegalStateException if save() is called before load() */ public void save() throws IOException { if (userPropertiesFile == null) { throw new IllegalStateException("must load() before save()"); } SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkWrite(userPropertiesFile.toString()); } OutputController.getLogger().log("Saving properties into " + userPropertiesFile.toString()); Properties toSave = new Properties(); for (String key : currentConfiguration.keySet()) { String oldValue = unchangeableConfiguration.get(key) == null ? null : unchangeableConfiguration.get(key).getValue(); String newValue = currentConfiguration.get(key) == null ? null : currentConfiguration .get(key).getValue(); if (oldValue == null && newValue == null) { continue; } else if (oldValue == null && newValue != null) { toSave.setProperty(key, newValue); } else if (oldValue != null && newValue == null) { toSave.setProperty(key, newValue); } else { // oldValue != null && newValue != null if (!oldValue.equals(newValue)) { toSave.setProperty(key, newValue); } } } File backupPropertiesFile = new File(userPropertiesFile.toString() + ".old"); if (userPropertiesFile.isFile()) { if (backupPropertiesFile.exists()){ boolean result = backupPropertiesFile.delete(); if(!result){ OutputController.getLogger().log("Failed to delete backup properties file " + backupPropertiesFile+ " silently continuing."); } } if (!userPropertiesFile.renameTo(backupPropertiesFile)) { throw new IOException("Error saving backup copy of " + userPropertiesFile); } } FileUtils.createParentDir(userPropertiesFile); try (OutputStream out = new BufferedOutputStream(new FileOutputStream(userPropertiesFile))) { String comments = DEPLOYMENT_COMMENT; if (userComments.length() > 0) { comments = comments + System.lineSeparator() + userComments; } toSave.store(out, comments); ; } } /** * Reads a properties file and returns a map representing the properties * * @param propertiesFile the file to read Properties from * @throws IOException if an IO problem occurs */ private Map> parsePropertiesFile(URL propertiesFile) throws IOException { Map> result = new HashMap<>(); Properties properties = new Properties(); try (Reader reader = new BufferedReader(new InputStreamReader(propertiesFile.openStream(), "UTF-8"))) { properties.load(reader); } Set keys = properties.stringPropertyNames(); for (String key : keys) { if (key.endsWith(".locked")) { String realKey = key.substring(0, key.length() - ".locked".length()); Setting configValue = result.get(realKey); if (configValue == null) { configValue = new Setting<>(realKey, R("Unknown"), true, null, null, null, propertiesFile.toString()); result.put(realKey, configValue); } else { configValue.setLocked(true); } } else { /* when parsing a properties we set value without checking if it is locked or not */ String newValue = properties.getProperty(key); Setting configValue = result.get(key); if (configValue == null) { configValue = new Setting<>(key, R("Unknown"), false, null, null, newValue, propertiesFile.toString()); result.put(key, configValue); } else { configValue.setValue(newValue); configValue.setSource(propertiesFile.toString()); } } } return result; } /** * Merges two maps while respecting whether the values have been locked or * not. All values from srcMap are put into finalMap, replacing values in * finalMap if necessary, unless the value is present and marked as locked * in finalMap * * @param finalMap the destination for putting values * @param srcMap the source for reading key value pairs */ private void mergeMaps(Map> finalMap, Map> srcMap) { for (String key : srcMap.keySet()) { Setting destValue = finalMap.get(key); Setting srcValue = srcMap.get(key); if (destValue == null) { finalMap.put(key, srcValue); } else { if (!destValue.isLocked()) { destValue.setSource(srcValue.getSource()); destValue.setValue(srcValue.getValue()); } } } } /** * Dumps the configuration to the PrintStream * * @param config a map of key,value pairs representing the configuration to * dump * @param out the PrintStream to write data to */ @SuppressWarnings("unused") private static void dumpConfiguration(Map> config, PrintStream out) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "KEY: VALUE [Locked]"); for (String key : config.keySet()) { Setting value = config.get(key); out.println("'" + key + "': '" + value.getValue() + "'" + (value.isLocked() ? " [LOCKED]" : "")); } } public static void move14AndOlderFilesTo15StructureCatched() { try { move14AndOlderFilesTo15Structure(); } catch (Throwable t) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Critical error during converting old files to new. Continuing"); OutputController.getLogger().log(t); } } private static void move14AndOlderFilesTo15Structure() { int errors = 0; String PRE_15_DEPLOYMENT_DIR = ".icedtea"; String LEGACY_USER_HOME = System.getProperty("user.home") + File.separator + PRE_15_DEPLOYMENT_DIR; String legacyProperties = LEGACY_USER_HOME + File.separator + DEPLOYMENT_PROPERTIES; File configDir = new File(PathsAndFiles.USER_CONFIG_HOME); File cacheDir = new File(PathsAndFiles.USER_CACHE_HOME); File legacyUserDir = new File(LEGACY_USER_HOME); if (legacyUserDir.exists()) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, TRANSFER_TITLE); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, PathsAndFiles.USER_CONFIG_HOME + " and " + PathsAndFiles.USER_CACHE_HOME); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "You should not see this message next time you run icedtea-web!"); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Your custom dirs will not be touched and will work"); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "-----------------------------------------------"); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Preparing new directories:"); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " " + PathsAndFiles.USER_CONFIG_HOME); errors += resultToStd(configDir.mkdirs()); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " " + PathsAndFiles.USER_CACHE_HOME); errors += resultToStd(cacheDir.mkdirs()); //move this first, the creation of config singleton may happen anytime... //but must not before USER_DEPLOYMENT_FILE is moved and should not in this block String currentProperties = PathsAndFiles.USER_DEPLOYMENT_FILE.getDefaultFullPath(); errors += moveLegacyToCurrent(legacyProperties, currentProperties); String legacyPropertiesOld = LEGACY_USER_HOME + File.separator + DEPLOYMENT_PROPERTIES + ".old"; String currentPropertiesOld = currentProperties + ".old"; errors += moveLegacyToCurrent(legacyPropertiesOld, currentPropertiesOld); String legacySecurity = LEGACY_USER_HOME + File.separator + "security"; String currentSecurity = PathsAndFiles.USER_DEFAULT_SECURITY_DIR; errors += moveLegacyToCurrent(legacySecurity, currentSecurity); String legacyAppletTrust = LEGACY_USER_HOME + File.separator + APPLET_TRUST_SETTINGS; String currentAppletTrust = PathsAndFiles.APPLET_TRUST_SETTINGS_USER.getDefaultFullPath(); errors += moveLegacyToCurrent(legacyAppletTrust, currentAppletTrust); //note - all here use default path. Any call to getFullPAth will invoke creation of config singleton // but: we DO copy only defaults. There is no need to copy nondefaults! // nond-efault will be used thanks to config singleton read from copied deployment.properties String legacyCache = LEGACY_USER_HOME + File.separator + "cache"; String currentCache = PathsAndFiles.CACHE_DIR.getDefaultFullPath(); errors += moveLegacyToCurrent(legacyCache, currentCache); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Adapting " + PathsAndFiles.CACHE_INDEX_FILE_NAME + " to new destination"); //replace all legacyCache by currentCache in new recently_used try { File f = PathsAndFiles.getRecentlyUsedFile().getDefaultFile(); String s = FileUtils.loadFileAsString(f); s = s.replace(legacyCache, currentCache); FileUtils.saveFile(s, f); } catch (IOException ex) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, ex); errors++; } String legacyPcahceDir = LEGACY_USER_HOME + File.separator + "pcache"; String currentPcacheDir = PathsAndFiles.PCACHE_DIR.getDefaultFullPath(); errors += moveLegacyToCurrent(legacyPcahceDir, currentPcacheDir); String legacyLogDir = LEGACY_USER_HOME + File.separator + "log"; String currentLogDir = PathsAndFiles.LOG_DIR.getDefaultFullPath(); errors += moveLegacyToCurrent(legacyLogDir, currentLogDir); String legacyTmp = LEGACY_USER_HOME + File.separator + "tmp"; String currentTmp = PathsAndFiles.TMP_DIR.getDefaultFullPath(); errors += moveLegacyToCurrent(legacyTmp, currentTmp); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Removing now empty " + LEGACY_USER_HOME); errors += resultToStd(legacyUserDir.delete()); if (errors != 0) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "There occureed " + errors + " errors"); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Please double check content of old data in " + LEGACY_USER_HOME + " with "); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "new " + PathsAndFiles.USER_CONFIG_HOME + " and " + PathsAndFiles.USER_CACHE_HOME); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "To disable this check again, please remove " + LEGACY_USER_HOME); } } else { OutputController.getLogger().log("System is already following XDG .cache and .config specifications"); try { OutputController.getLogger().log("config: " + PathsAndFiles.USER_CONFIG_HOME + " file exists: " + configDir.exists()); } catch (Exception ex) { OutputController.getLogger().log(ex); } try { OutputController.getLogger().log("cache: " + PathsAndFiles.USER_CACHE_HOME + " file exists:" + cacheDir.exists()); } catch (Exception ex) { OutputController.getLogger().log(ex); } } //this call should endure even if (ever) will migration code be removed DirectoryValidator.DirectoryCheckResults r = new DirectoryValidator().ensureDirs(); if (r.getFailures() > 0) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, r.getMessage()); if (!JNLPRuntime.isHeadless()) { JOptionPane.showMessageDialog(null, r.getMessage()); } } } private static int moveLegacyToCurrent(String legacy, String current) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Moving " + legacy + " to " + current); File cf = new File(current); File old = new File(legacy); if (cf.exists()) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Warning! Destination " + current + " exists!"); } if (old.exists()) { boolean moved = old.renameTo(cf); return resultToStd(moved); } else { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Source " + legacy + " do not exists, nothing to do"); return 0; } } private static int resultToStd(boolean securityMove) { if (securityMove) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "OK"); return 0; } else { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "ERROR"); return 1; } } //standard date.toString format public static final SimpleDateFormat pattern = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); private static String loadComments(URL path) { StringBuilder r = new StringBuilder(); try (BufferedReader br = new BufferedReader(new InputStreamReader(path.openStream(), "UTF-8"))) { while (true) { String s = br.readLine(); if (s == null) { break; } s = s.trim(); if (s.startsWith("#")) { String decommented = s.substring(1); if (decommented.isEmpty()){ continue; } if (decommented.equals(DEPLOYMENT_COMMENT)){ continue; } //there is always also date Date dd = null; try { dd = pattern.parse(decommented); } catch (Exception ex) { //we really dont care, failure is our decision point } if (dd == null){ r.append(decommented).append("\n"); } } } } catch (Exception ex) { OutputController.getLogger().log(ex); } return r.toString().trim(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/cache0000644000000000000000000000013113441742745021242 xustar0030 mtime=1552401893.051832798 29 atime=1552410887.11418344 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/0000755000175000002070000000000013441742745022130 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/ResourceTracker.java0000644000000000000000000000013213441742745025266 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.227253503 30 ctime=1552410887.031183634 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/ResourceTracker.java0000644000175000002070000005603513441742745026107 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.cache; import static net.sourceforge.jnlp.cache.Resource.Status.CONNECTED; import static net.sourceforge.jnlp.cache.Resource.Status.CONNECTING; import static net.sourceforge.jnlp.cache.Resource.Status.DOWNLOADED; import static net.sourceforge.jnlp.cache.Resource.Status.DOWNLOADING; import static net.sourceforge.jnlp.cache.Resource.Status.ERROR; import static net.sourceforge.jnlp.cache.Resource.Status.PRECONNECT; import static net.sourceforge.jnlp.cache.Resource.Status.PREDOWNLOAD; import static net.sourceforge.jnlp.cache.Resource.Status.PROCESSING; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; import java.util.List; import net.sourceforge.jnlp.DownloadOptions; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.event.DownloadEvent; import net.sourceforge.jnlp.event.DownloadListener; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; /** * This class tracks the downloading of various resources of a * JNLP file to local files in the cache. It can be used to * download icons, jnlp and extension files, jars, and jardiff * files using the version based protocol or any file using the * basic download protocol (jardiff and version not implemented * yet). *

    * The resource tracker can be configured to prefetch resources, * which are downloaded in the order added to the media * tracker. *

    *

    * Multiple threads are used to download and cache resources that * are actively being waited for (blocking a caller) or those that * have been started downloading by calling the startDownload * method. Resources that are prefetched are downloaded one at a * time and only if no other trackers have requested downloads. * This allows the tracker to start downloading many items without * using many system resources, but still quickly download items * as needed. *

    * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.22 $ */ public class ResourceTracker { // todo: use event listener arrays instead of lists // todo: see if there is a way to set the socket options just // for use by the tracker so checks for updates don't hang for // a long time. // todo: ability to restart/retry a hung download // todo: move resource downloading/processing code into Resource // class, threading stays in ResourceTracker // todo: get status method? and some way to convey error status // to the caller. // todo: might make a tracker be able to download more than one // version of a resource, but probably not very useful. // defines // ResourceTracker.Downloader (download threads) // separately locks on (in order of aquire order, ie, sync on prefetch never syncs on lock): // lock, prefetch, this.resources, each resource, listeners public static enum RequestMethods{ HEAD, GET, TESTING_UNDEF; private static final RequestMethods[] requestMethods = {RequestMethods.HEAD, RequestMethods.GET}; public static RequestMethods[] getValidRequestMethods() { return requestMethods; } } /** notified on initialization or download of a resource */ private static final Object lock = new Object(); // used to lock static structures /** the resources known about by this resource tracker */ private final List resources = new ArrayList<>(); /** download listeners for this tracker */ private final List listeners = new ArrayList<>(); /** whether to download parts before requested */ private final boolean prefetch; /** * Creates a resource tracker that does not prefetch resources. */ public ResourceTracker() { this(false); } /** * Creates a resource tracker. * * @param prefetch whether to download resources before requested. */ public ResourceTracker(boolean prefetch) { this.prefetch = prefetch; } /** * Add a resource identified by the specified location and * version. The tracker only downloads one version of a given * resource per instance (ie cannot download both versions 1 and * 2 of a resource in the same tracker). * * @param location the location of the resource * @param version the resource version * @param options options to control download * @param updatePolicy whether to check for updates if already in cache */ public void addResource(URL location, Version version, DownloadOptions options, UpdatePolicy updatePolicy) { if (location == null) throw new IllegalResourceDescriptorException("location==null"); try { location = UrlUtils.normalizeUrl(location); } catch (Exception ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Normalization of " + location.toString() + " have failed"); OutputController.getLogger().log(ex); } Resource resource = Resource.getResource(location, version, updatePolicy); synchronized (resources) { if (resources.contains(resource)) return; resource.addTracker(this); resources.add(resource); } if (options == null) { options = new DownloadOptions(false, false); } resource.setDownloadOptions(options); // checkCache may take a while (loads properties file). this // should really be synchronized on resources, but the worst // case should be that the resource will be updated once even // if unnecessary. boolean downloaded = checkCache(resource, updatePolicy); if (!downloaded) { if (prefetch) { startResource(resource); } } } /** * Removes a resource from the tracker. This method is useful * to allow memory to be reclaimed, but calling this method is * not required as resources are reclaimed when the tracker is * collected. * * @param location location of resource to be removed * @throws IllegalResourceDescriptorException if the resource is not being tracked */ public void removeResource(URL location) { synchronized (resources) { Resource resource = getResource(location); if (resource != null) { resources.remove(resource); resource.removeTracker(this); } // should remove from queue? probably doesn't matter } } /** * Check the cache for a resource, and initialize the resource * as already downloaded if found. * * @param updatePolicy whether to check for updates if already in cache * @return whether the resource are already downloaded */ private boolean checkCache(Resource resource, UpdatePolicy updatePolicy) { if (!CacheUtil.isCacheable(resource.getLocation(), resource.getDownloadVersion())) { // pretend that they are already downloaded; essentially // they will just 'pass through' the tracker as if they were // never added (for example, not affecting the total download size). synchronized (resource) { resource.changeStatus(EnumSet.noneOf(Resource.Status.class), EnumSet.of(DOWNLOADED, CONNECTED, PROCESSING)); } fireDownloadEvent(resource); return true; } if (updatePolicy != UpdatePolicy.ALWAYS && updatePolicy != UpdatePolicy.FORCE) { // save loading entry props file CacheEntry entry = new CacheEntry(resource.getLocation(), resource.getDownloadVersion()); if (entry.isCached() && !updatePolicy.shouldUpdate(entry)) { OutputController.getLogger().log("not updating: " + resource.getLocation()); synchronized (resource) { resource.setLocalFile(CacheUtil.getCacheFile(resource.getLocation(), resource.getDownloadVersion())); resource.setSize(resource.getLocalFile().length()); resource.setTransferred(resource.getLocalFile().length()); resource.changeStatus(EnumSet.noneOf(Resource.Status.class), EnumSet.of(DOWNLOADED, CONNECTED, PROCESSING)); } fireDownloadEvent(resource); return true; } } if (updatePolicy == UpdatePolicy.FORCE) { // ALWAYS update // When we are "always" updating, we update for each instance. Reset resource status. resource.resetStatus(); } // may or may not be cached, but check update when connection // is open to possibly save network communication time if it // has to be downloaded, and allow this call to return quickly return false; } /** * Adds the listener to the list of objects interested in * receivind DownloadEvents. * * @param listener the listener to add. */ public void addDownloadListener(DownloadListener listener) { synchronized (listeners) { if (!listeners.contains(listener)) listeners.add(listener); } } /** * Removes a download listener. * * @param listener the listener to remove. */ public void removeDownloadListener(DownloadListener listener) { synchronized (listeners) { listeners.remove(listener); } } /** * Fires the download event corresponding to the resource's * state. This method is typicall called by the Resource itself * on each tracker that is monitoring the resource. Do not call * this method with any locks because the listeners may call * back to this ResourceTracker. * @param resource resource on which event is fired */ protected void fireDownloadEvent(Resource resource) { DownloadListener l[]; synchronized (listeners) { l = listeners.toArray(new DownloadListener[0]); } Collection status; synchronized (resource) { status = resource.getCopyOfStatus(); } DownloadEvent event = new DownloadEvent(this, resource); for (DownloadListener dl : l) { if (status.contains(ERROR) || status.contains(DOWNLOADED)) dl.downloadCompleted(event); else if (status.contains(DOWNLOADING)) dl.downloadStarted(event); else if (status.contains(CONNECTING)) dl.updateStarted(event); } } /** * Returns a URL pointing to the cached location of the * resource, or the resource itself if it is a non-cacheable * resource. *

    * If the resource has not downloaded yet, the method will block * until it has been transferred to the cache. *

    * * @param location the resource location * @return the resource, or null if it could not be downloaded * @throws IllegalResourceDescriptorException if the resource is not being tracked * @see CacheUtil#isCacheable */ public URL getCacheURL(URL location) { try { File f = getCacheFile(location); if (f != null) // TODO: Should be toURI().toURL() return f.toURL(); } catch (MalformedURLException ex) { OutputController.getLogger().log(ex); } return location; } /** * Returns a file containing the downloaded resource. If the * resource is non-cacheable then null is returned unless the * resource is a local file (the original file is returned). *

    * If the resource has not downloaded yet, the method will block * until it has been transferred to the cache. *

    * * @param location the resource location * @return a local file containing the resource, or null * @throws IllegalResourceDescriptorException if the resource is not being tracked * @see CacheUtil#isCacheable */ public File getCacheFile(URL location) { try { Resource resource = getResource(location); if (!(resource.isSet(DOWNLOADED) || resource.isSet(ERROR))) waitForResource(location, 0); if (resource.isSet(ERROR)) return null; if (resource.getLocalFile() != null) return resource.getLocalFile(); if (location.getProtocol().equalsIgnoreCase("file")) { File file = UrlUtils.decodeUrlAsFile(location); if (file.exists()) { return file; } // try plain, not decoded file now // sometimes the jnlp app developers are encoding for us // so we end up encoding already encoded file. See RH1154177 file = new File(location.getPath()); if (file.exists()) { return file; } // have it sense to try also filename with whole query here? // => location.getFile() ? } return null; } catch (InterruptedException ex) { OutputController.getLogger().log(ex); return null; // need an error exception to throw } } /** * Wait for a group of resources to be downloaded and made * available locally. * * @param urls the resources to wait for * @param timeout the time in ms to wait before returning, 0 for no timeout * @return whether the resources downloaded before the timeout * @throws java.lang.InterruptedException if thread is interrupted * @throws IllegalResourceDescriptorException if the resource is not being tracked */ public boolean waitForResources(URL urls[], long timeout) throws InterruptedException { Resource lresources[] = new Resource[urls.length]; synchronized (lresources) { // keep the lock so getResource doesn't have to aquire it each time for (int i = 0; i < urls.length; i++) { lresources[i] = getResource(urls[i]); } } if (lresources.length > 0) return wait(lresources, timeout); return true; } /** * Wait for a particular resource to be downloaded and made * available. * * @param location the resource to wait for * @param timeout the timeout, or 0 to wait until completed * @return whether the resource downloaded before the timeout * @throws InterruptedException if another thread interrupted the wait * @throws IllegalResourceDescriptorException if the resource is not being tracked */ public boolean waitForResource(URL location, long timeout) throws InterruptedException { return wait(new Resource[]{getResource(location)}, timeout); } /** * Returns the number of bytes downloaded for a resource. * * @param location the resource location * @return the number of bytes transferred * @throws IllegalResourceDescriptorException if the resource is not being tracked */ public long getAmountRead(URL location) { // not atomic b/c transferred is a long, but so what (each // byte atomic? so probably won't affect anything...) return getResource(location).getTransferred(); } /** * Returns whether a resource is available for use (ie, can be * accessed with the getCacheFile method). * * @param location the resource location * @return resource availability * @throws IllegalResourceDescriptorException if the resource is not being tracked */ public boolean checkResource(URL location) { Resource resource = getResource(location); return resource.isSet(DOWNLOADED) || resource.isSet(ERROR); } /** * Starts loading the resource if it is not already being * downloaded or already cached. Resources started downloading * using this method may download faster than those prefetched * by the tracker because the tracker will only prefetch one * resource at a time to conserve system resources. * * @param location the resource location * @return true if the resource is already downloaded (or an error occurred) * @throws IllegalResourceDescriptorException if the resource is not being tracked */ public boolean startResource(URL location) { Resource resource = getResource(location); return startResource(resource); } /** * Sets the resource status to connect and download, and * enqueues the resource if not already started. * * @return true if the resource is already downloaded (or an error occurred) * @throws IllegalResourceDescriptorException if the resource is not being tracked */ private boolean startResource(Resource resource) { boolean enqueue; synchronized (resource) { if (resource.isSet(ERROR)) return true; enqueue = !resource.isSet(PROCESSING); if (!(resource.isSet(CONNECTED) || resource.isSet(CONNECTING))) resource.changeStatus(EnumSet.noneOf(Resource.Status.class), EnumSet.of(PRECONNECT, PROCESSING)); if (!(resource.isSet(DOWNLOADED) || resource.isSet(DOWNLOADING))) resource.changeStatus(EnumSet.noneOf(Resource.Status.class), EnumSet.of(PREDOWNLOAD, PROCESSING)); if (!(resource.isSet(PREDOWNLOAD) || resource.isSet(PRECONNECT))) enqueue = false; } if (enqueue) startDownloadThread(resource); return !enqueue; } /** * Returns the number of total size in bytes of a resource, or * -1 it the size is not known. * * @param location the resource location * @return the number of bytes, or -1 * @throws IllegalResourceDescriptorException if the resource is not being tracked */ public long getTotalSize(URL location) { return getResource(location).getSize(); // atomic } /** * Start a new download thread. *

    * Calls to this method should be synchronized on lock. *

    * @param resource resource to be download */ protected void startDownloadThread(Resource resource) { CachedDaemonThreadPoolProvider.DAEMON_THREAD_POOL.execute(new ResourceDownloader(resource, lock)); } static Resource selectByFilter(Collection source, Filter filter) { Resource result = null; for (Resource resource : source) { boolean selectable; synchronized (resource) { selectable = filter.test(resource); } if (selectable) { result = resource; } } return result; } static Resource selectByStatus(Collection source, Resource.Status include, Resource.Status exclude) { return selectByStatus(source, EnumSet.of(include), EnumSet.of(exclude)); } /** * Selects a resource from the source list that has the * specified flag set. *

    * Calls to this method should be synchronized on lock and * source list. *

    */ static Resource selectByStatus(Collection source, final Collection included, final Collection excluded) { return selectByFilter(source, new Filter() { @Override public boolean test(Resource t) { boolean hasIncluded = false; for (Resource.Status flag : included) { if (t.isSet(flag)) { hasIncluded = true; } } boolean hasExcluded = false; for (Resource.Status flag : excluded) { if (t.isSet(flag)) { hasExcluded = true; } } return hasIncluded && !hasExcluded; } }); } /** * Return the resource matching the specified URL. * * @throws IllegalResourceDescriptorException if the resource is not being tracked */ private Resource getResource(URL location) { synchronized (resources) { for (Resource resource : resources) { if (UrlUtils.urlEquals(resource.getLocation(), location)) return resource; } } throw new IllegalResourceDescriptorException("Location does not specify a resource being tracked."); } /** * Wait for some resources. * * @param resources the resources to wait for * @param timeout the timeout, or {@code 0} to wait until completed * @return {@code true} if the resources were downloaded or had errors, * {@code false} if the timeout was reached * @throws InterruptedException if another thread interrupted the wait */ private boolean wait(Resource[] resources, long timeout) throws InterruptedException { long startTime = System.currentTimeMillis(); // start them downloading / connecting in background for (Resource resource : resources) { startResource(resource); } // wait for completion while (true) { boolean finished = true; synchronized (lock) { // check for completion for (Resource resource : resources) { //NetX Deadlocking may be solved by removing this //synch block. synchronized (resource) { if (!(resource.isSet(DOWNLOADED) || resource.isSet(ERROR))) { finished = false; break; } } } if (finished) return true; // wait long waitTime = 0; if (timeout > 0) { waitTime = timeout - (System.currentTimeMillis() - startTime); if (waitTime <= 0) return false; } lock.wait(waitTime); } } } interface Filter { public boolean test(T t); } }icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/DefaultDownloadIndicator.java0000644000000000000000000000013013441742745027072 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java0000644000175000002070000004325413441742745027714 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.cache; import static net.sourceforge.jnlp.runtime.Translator.R; import java.awt.*; import java.awt.event.*; import java.net.*; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.Timer; import javax.jnlp.*; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.runtime.*; import net.sourceforge.jnlp.util.ImageResources; import net.sourceforge.jnlp.util.ScreenFinder; import net.sourceforge.jnlp.util.logging.OutputController; /** * Show the progress of downloads. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.3 $ */ public class DefaultDownloadIndicator implements DownloadIndicator { // todo: rewrite this to cut down on size/complexity; smarter // panels (JList, renderer) understand resources instead of // nested panels and grid-bag mess. // todo: fix bug where user closes download box and it // never(?) reappears. // todo: UI for user to cancel/restart download // todo: this should be synchronized at some point but conflicts // aren't very likely. private static String downloading = R("CDownloading"); private static String complete = R("CComplete"); /** time to wait after completing but before window closes */ private static final int CLOSE_DELAY = 750; /** the display window */ private static JDialog dialog; private static final Object dialogMutex = new Object(); /** shared constraint */ static GridBagConstraints vertical; static GridBagConstraints verticalNoClean; static GridBagConstraints verticalIndent; static { vertical = new GridBagConstraints(); vertical.gridwidth = GridBagConstraints.REMAINDER; vertical.weightx = 1.0; vertical.fill = GridBagConstraints.HORIZONTAL; vertical.anchor = GridBagConstraints.WEST; verticalNoClean = new GridBagConstraints(); verticalNoClean.weightx = 1.0; verticalIndent = (GridBagConstraints) vertical.clone(); verticalIndent.insets = new Insets(0, 10, 3, 0); } /** * @return the update rate. */ @Override public int getUpdateRate() { return 150; //ms } /** * @return the initial delay before obtaining a listener. */ @Override public int getInitialDelay() { return 300; //ms } /** * Return a download service listener that displays the progress * in a shared download info window. * * @param app the downloading application, or null if N/A * @param downloadName name identifying the download to the user * @param resources initial urls to display (not required) * @return donload service listener attached to this app. instance */ @Override public DownloadServiceListener getListener(ApplicationInstance app, final String downloadName, final URL resources[]) { final FutureResult result = new FutureResult() { @Override public void run() { DownloadPanel result = new DownloadPanel(downloadName); synchronized (dialogMutex) { if (dialog == null) { dialog = createDownloadIndicatorWindow(true); } if (resources != null) { for (URL url : resources) { result.addProgressPanel(url, null); } } dialog.getContentPane().add(result, vertical); dialog.pack(); placeFrameToLowerRight(); result.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { placeFrameToLowerRight(); } }); dialog.setVisible(true); setRef(result); } } }; SwingUtils.invokeAndWait(result); return result.getRef(); } public static JDialog createDownloadIndicatorWindow(boolean undecorated) throws HeadlessException { JDialog f = new JDialog((JFrame)null, downloading + "..."); f.setName("DownloadIndicatorDialog"); SwingUtils.info(f); f.setUndecorated(undecorated); f.setIconImages(ImageResources.INSTANCE.getApplicationImages()); f.getContentPane().setLayout(new GridBagLayout()); return f; } /** * This places indicator to lower right corner of active monitor. */ private static void placeFrameToLowerRight() throws HeadlessException { Rectangle bounds = ScreenFinder.getCurrentScreenSizeWithoutBounds(); dialog.setLocation(bounds.width+bounds.x - dialog.getWidth(), bounds.height+bounds.y - dialog.getHeight()); } /** * Remove a download service listener that was obtained by * calling the getDownloadListener method from the shared * download info window. */ @Override public void disposeListener(final DownloadServiceListener listener) { if (!(listener instanceof DownloadPanel)) return; ActionListener hider = new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { synchronized(dialogMutex) { dialog.getContentPane().remove((DownloadPanel) listener); dialog.pack(); if (dialog.getContentPane().getComponentCount() == 0) { dialog.setVisible(false); dialog.dispose(); dialog = null; } } } }; Timer timer = new Timer(CLOSE_DELAY, hider); timer.setRepeats(false); timer.start(); } /** * Groups the url progress in a panel. */ static class DownloadPanel extends JPanel implements DownloadServiceListener { private final DownloadPanel self; private static enum States{ ONE_JAR, COLLAPSED, DETAILED; } private static final String DETAILS=R("ButShowDetails"); private static final String HIDE_DETAILS=R("ButHideDetails"); /** the download name */ private String downloadName; /** Downloading part: */ private JLabel header = new JLabel(); /** Show/hide detailsButton button: */ private final JButton detailsButton; private static final URL magnifyGlassUrl = ClassLoader.getSystemResource("net/sourceforge/jnlp/resources/showDownloadDetails.png"); private static final URL redCrossUrl = ClassLoader.getSystemResource("net/sourceforge/jnlp/resources/hideDownloadDetails.png"); private static final Icon magnifyGlassIcon = new ImageIcon(magnifyGlassUrl); private static final Icon redCrossIcon = new ImageIcon(redCrossUrl); /** used instead of detailsButton button in case of one jar*/ private JLabel delimiter = new JLabel(""); /** all already created progress bars*/ private List progressPanels = new ArrayList<>(); private States state=States.ONE_JAR; private ProgressPanel mainProgressPanel; /** list of URLs being downloaded */ private List urls = new ArrayList<>(); /** list of ProgressPanels */ private List panels = new ArrayList<>(); /** * Create a new download panel for with the specified download * name. */ protected DownloadPanel(String downloadName) { self = this; setLayout(new GridBagLayout()); this.downloadName = downloadName; this.add(header, verticalNoClean); header.setFont(header.getFont().deriveFont(Font.BOLD)); this.add(delimiter, vertical); detailsButton = new JButton(magnifyGlassIcon); int w = magnifyGlassIcon.getIconWidth(); int h = magnifyGlassIcon.getIconHeight(); detailsButton.setPreferredSize(new Dimension(w + 2, h + 2)); detailsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (state == States.DETAILED) { state = States.COLLAPSED; detailsButton.setToolTipText(DETAILS); detailsButton.setIcon(magnifyGlassIcon); for (ProgressPanel progressPanel : progressPanels) { remove(progressPanel); } add(mainProgressPanel, verticalIndent); recreateFrame(true); } else { state = States.DETAILED; detailsButton.setToolTipText(HIDE_DETAILS); detailsButton.setIcon(redCrossIcon); remove(mainProgressPanel); for (ProgressPanel progressPanel : progressPanels) { add(progressPanel, verticalIndent); } recreateFrame(false); } } public void recreateFrame(boolean undecorated) throws HeadlessException { JDialog oldFrame = dialog; dialog = createDownloadIndicatorWindow(undecorated); dialog.getContentPane().add(self, vertical); synchronized (dialogMutex) { dialog.pack(); placeFrameToLowerRight(); } dialog.setVisible(true); oldFrame.dispose(); } }); setOverallPercent(0); } /** * Add a ProgressPanel for a URL. */ protected void addProgressPanel(URL url, String version) { if (!urls.contains(url)) { ProgressPanel panel = new ProgressPanel(url, version); if (state != States.COLLAPSED) { add(panel, verticalIndent); } progressPanels.add(panel); urls.add(url); panels.add(panel); //download indicator does not know about added jars //When only one jar is added to downlaod queue then its progress is //shown, and there is no show detail button. //When second one is added, then it already knows that there will //be two or more jars, so it swap to collapsed state in count of two. //no later, no sooner if (panels.size() == 2){ remove(panels.get(0)); remove(panels.get(1)); remove(delimiter); add(detailsButton,vertical); mainProgressPanel=new ProgressPanel(); add(mainProgressPanel, verticalIndent); state=States.COLLAPSED; } synchronized (dialogMutex) { dialog.pack(); placeFrameToLowerRight(); } } } /** * Update the download progress of a url. */ protected void update(final URL url, final String version, final long readSoFar, final long total, final int overallPercent) { Runnable r = new Runnable() { @Override public void run() { if (!urls.contains(url)) addProgressPanel(url, version); setOverallPercent(overallPercent); ProgressPanel panel = panels.get(urls.indexOf(url)); panel.setProgress(readSoFar, total); panel.repaint(); } }; SwingUtils.invokeLater(r); } /** * Sets the overall percent completed. * should be called via invokeLater */ public void setOverallPercent(int percent) { // don't get whole string from resource and sub in // values because it'll be doing a MessageFormat for // each update. String s = downloading + " " + downloadName + ": " + percent + "% " + complete + "."; if (JNLPRuntime.isHeadless()){ OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, s); } header.setText(s); Container c = header.getParent(); //we need to adapt both panels and also dialog to new length of header text while (c != null) { c.invalidate(); c.validate(); if (c instanceof Window){ ((Window) c).pack(); } c=c.getParent(); } if (mainProgressPanel != null) { mainProgressPanel.setProgress(percent, 100); mainProgressPanel.repaint(); } } /** * Called when a download failed. */ @Override public void downloadFailed(URL url, String version) { update(url, version, -1, -1, -1); } /** * Called when a download has progressed. */ @Override public void progress(URL url, String version, long readSoFar, long total, int overallPercent) { update(url, version, readSoFar, total, overallPercent); } /** * Called when an archive is patched. */ @Override public void upgradingArchive(URL url, String version, int patchPercent, int overallPercent) { update(url, version, patchPercent, 100, overallPercent); } /** * Called when a download is being validated. */ @Override public void validating(URL url, String version, long entry, long total, int overallPercent) { update(url, version, entry, total, overallPercent); } }; /** * A progress bar with the URL next to it. */ static class ProgressPanel extends JPanel { final private JPanel bar = new JPanel(); private long total; private long readSoFar; final private Dimension size = new Dimension(80, 15); ProgressPanel() { bar.setMinimumSize(size); bar.setPreferredSize(size); bar.setOpaque(false); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); styleGridBagConstraints(gbc); add(bar, gbc); } ProgressPanel(URL url, String version) { this(" " + url.getHost() + "/" + url.getFile(),version); } ProgressPanel(String caption, String version) { JLabel location = new JLabel(caption); bar.setMinimumSize(size); bar.setPreferredSize(size); bar.setOpaque(false); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.weightx = 0.0; gbc.fill = GridBagConstraints.NONE; gbc.gridwidth = GridBagConstraints.RELATIVE; add(bar, gbc); styleGridBagConstraints(gbc); add(location, gbc); } public void setProgress(long readSoFar, long total) { this.readSoFar = readSoFar; this.total = total; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); int x = bar.getX(); int y = bar.getY(); int h = bar.getHeight(); int w = bar.getWidth(); if (readSoFar <= 0 || total <= 0) { // make barber pole } else { double progress = (double) readSoFar / (double) total; int divide = (int) (w * progress); g.setColor(Color.white); g.fillRect(x, y, w, h); g.setColor(Color.blue); g.fillRect(x + 1, y + 1, divide - 1, h - 1); } } private void styleGridBagConstraints(GridBagConstraints gbc) { gbc.insets = new Insets(0, 3, 0, 0); gbc.weightx = 1.0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.anchor = GridBagConstraints.WEST; } }; static abstract class FutureResult implements Runnable { private V ref = null; public V getRef() { return ref; } public void setRef(V ref) { this.ref = ref; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/Resource.java0000644000000000000000000000013113441742745023751 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/Resource.java0000644000175000002070000003175313441742745024573 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.cache; import java.io.File; import java.net.URL; import java.util.Collection; import java.util.EnumSet; import java.util.List; import java.util.Set; import net.sourceforge.jnlp.DownloadOptions; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.WeakList; /** *

    * Information about a single resource to download. * This class tracks the downloading of various resources of a * JNLP file to local files. It can be used to download icons, * jnlp and extension files, jars, and jardiff files using the * version based protocol or any file using the basic download * protocol. *

    *

    * Resources can be put into download groups by specifying a part * name for the resource. The resource tracker can also be * configured to prefetch resources, which are downloaded in the * order added to the media tracker. *

    * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.9 $ */ public class Resource { // todo: fix resources to handle different versions // todo: IIRC, any resource is checked for being up-to-date // only once, regardless of UpdatePolicy. verify and fix. public enum Status { PRECONNECT, CONNECTING, CONNECTED, PREDOWNLOAD, DOWNLOADING, DOWNLOADED, ERROR, PROCESSING // in queue or being worked on } /** list of weak references of resources currently in use */ private static final WeakList resources = new WeakList<>(); /** weak list of trackers monitoring this resource */ private final WeakList trackers = new WeakList<>(); /** the remote location of the resource */ private final URL location; /** the location to use when downloading */ private URL downloadLocation; /** the local file downloaded to */ private File localFile; /** the requested version */ private final Version requestVersion; /** the version downloaded from server */ private Version downloadVersion; /** amount in bytes transferred */ private volatile long transferred = 0; /** total size of the resource, or -1 if unknown */ private volatile long size = -1; /** the status of the resource */ private final EnumSet status = EnumSet.noneOf(Status.class); /** Update policy for this resource */ private final UpdatePolicy updatePolicy; /** Download options for this resource */ private DownloadOptions downloadOptions; /** * Create a resource. */ private Resource(URL location, Version requestVersion, UpdatePolicy updatePolicy) { this.location = location; this.downloadLocation = location; this.requestVersion = requestVersion; this.updatePolicy = updatePolicy; } /** * Return a shared Resource object representing the given * location and version. * @param location final location of resource * @param requestVersion final version of resource * @param updatePolicy final policy for updating * @return new resource, which is already added in resources list */ public static Resource getResource(URL location, Version requestVersion, UpdatePolicy updatePolicy) { //TODO -rename to create resource? synchronized (resources) { Resource resource = new Resource(location, requestVersion, updatePolicy); //FIXME - url ignores port during its comparison //this may affect test-suites int index = resources.indexOf(resource); if (index >= 0) { // return existing object Resource result = resources.get(index); if (result != null) { return result; } } resources.add(resource); resources.trimToSize(); return resource; } } /** * Returns the remote location of the resource. * @return the same location as the one with which this resource was created */ public URL getLocation() { return location; } /** * Returns the URL to use for downloading the resource. This can be * different from the original location since it may use a different * file name to support versioning and compression * @return the url to use when downloading */ public URL getDownloadLocation() { return downloadLocation; } /** * Set the url to use for downloading the resource * @param downloadLocation url to be donloaded */ public void setDownloadLocation(URL downloadLocation) { this.downloadLocation = downloadLocation; } /** * Returns the tracker that first created or monitored the * resource, or null if no trackers are monitoring the resource. */ ResourceTracker getTracker() { synchronized (trackers) { List t = trackers.hardList(); if (t.size() > 0) { return t.get(0); } return null; } } /** * @return the local file currently being downloaded */ public File getLocalFile() { return localFile; } /** * Sets the local file to be downloaded * @param localFile location of stored resource */ public void setLocalFile(File localFile) { this.localFile = localFile; } /** * @return the requested version */ public Version getRequestVersion() { return requestVersion; } /** * @return the version downloaded from server */ public Version getDownloadVersion() { return downloadVersion; } /** * Sets the version downloaded from server * @param downloadVersion version of downloaded resource */ public void setDownloadVersion(Version downloadVersion) { this.downloadVersion = downloadVersion; } /** * @return the amount in bytes transferred */ public long getTransferred() { return transferred; } /** * Sets the amount transferred * @param transferred set the whole transfered amount to this value */ public void setTransferred(long transferred) { this.transferred = transferred; } /** * Increments the amount transferred (in bytes) * @param incTrans transfered amount in last transfer */ public void incrementTransferred(long incTrans) { transferred += incTrans; } /** * Returns the size of the resource * @return size of resource (-1 if unknown) */ public long getSize() { return size; } /** * Sets the size of the resource * @param size desired size of resource */ public void setSize(long size) { this.size = size; } /** * @return the status of the resource */ public Set getCopyOfStatus() { return EnumSet.copyOf(status); } /** * Check if the specified flag is set. * @param flag a status flag * @return true iff the flag is set */ public boolean isSet(Status flag) { synchronized (status) { return status.contains(flag); } } /** * Check if all the specified flags are set. * @param flags a collection of flags * @return true iff all the flags are set */ public boolean hasFlags(Collection flags) { synchronized (status) { return status.containsAll(flags); } } /** * @return the update policy for this resource */ public UpdatePolicy getUpdatePolicy() { return this.updatePolicy; } /** * Returns a human-readable status string. */ private String getStatusString() { StringBuilder result = new StringBuilder(); synchronized (status) { if (status.isEmpty()) { return "<>"; } for (Status stat : status) { result.append(stat.toString()).append(" "); } } return result.toString().trim(); } /** * Changes the status by clearing the flags in the first * parameter and setting the flags in the second. This method * is synchronized on this resource. * @param clear a collection of status flags to unset * @param add a collection of status flags to set */ public void changeStatus(Collection clear, Collection add) { synchronized (status) { if (clear != null) { status.removeAll(clear); } if (add != null) { status.addAll(add); } } } /** * Set status flag * @param flag a flag to set */ public void setStatusFlag(Status flag) { synchronized (status) { status.add(flag); } } /** * Set flags * @param flags a collection of flags to set */ public void setStatusFlags(Collection flags) { synchronized (status) { status.addAll(flags); } } /** * Unset flags * @param flags a collection of flags to unset */ public void unsetStatusFlag(Collection flags) { synchronized (status) { status.removeAll(flags); } } /** * Clear all flags */ public void resetStatus() { synchronized (status) { status.clear(); } } /** * Check if this resource has been initialized * @return true iff any flags have been set */ public boolean isInitialized() { synchronized (status) { return !status.isEmpty(); } } /** * Removes the tracker to the list of trackers monitoring this * resource. * * @param tracker tracker to be removed */ public void removeTracker(ResourceTracker tracker) { synchronized (trackers) { trackers.remove(tracker); trackers.trimToSize(); } } /** * Adds the tracker to the list of trackers monitoring this * resource. * @param tracker to observing resource */ public void addTracker(ResourceTracker tracker) { synchronized (trackers) { // prevent GC between contains and add List t = trackers.hardList(); if (!t.contains(tracker)) trackers.add(tracker); trackers.trimToSize(); } } /** * Instructs the trackers monitoring this resource to fire a * download event. */ protected void fireDownloadEvent() { List send; synchronized (trackers) { send = trackers.hardList(); } for (ResourceTracker rt : send) { rt.fireDownloadEvent(this); } } public void setDownloadOptions(DownloadOptions downloadOptions) { this.downloadOptions = downloadOptions; } public DownloadOptions getDownloadOptions() { return this.downloadOptions; } public boolean isConnectable() { return JNLPRuntime.isConnectable(this.location); } @Override public int hashCode() { // FIXME: should probably have a better hashcode than this, but considering // #equals(Object) was already defined first (without also overriding hashcode!), // this is just being implemented in line with that so we don't break HashMaps, // HashSets, etc return location.hashCode(); } @Override public boolean equals(Object other) { if (other instanceof Resource) { // this prevents the URL handler from looking up the IP // address and doing name resolution; much faster so less // time spent in synchronized addResource determining if // Resource is already in a tracker, and better for offline // mode on some OS. return UrlUtils.urlEquals(location, ((Resource) other).location); } return false; } @Override public String toString() { return "location=" + location.toString() + " state=" + getStatusString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/CacheUtil.java0000644000000000000000000000013113441742745024023 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/CacheUtil.java0000644000175000002070000011473313441742745024645 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.cache; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FilePermission; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Permission; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import javax.jnlp.DownloadServiceListener; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.controlpanel.CachePane; import net.sourceforge.jnlp.runtime.ApplicationInstance; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.security.ConnectionFactory; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.PropertiesFile; import net.sourceforge.jnlp.util.logging.OutputController; /** * Provides static methods to interact with the cache, download * indicator, and other utility methods. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.17 $ */ public class CacheUtil { /** * Caches a resource and returns a URL for it in the cache; * blocks until resource is cached. If the resource location is * not cacheable (points to a local file, etc) then the original * URL is returned. * * @param location location of the resource * @param version the version, or {@code null} * @param policy how to handle update * @return either the location in the cache or the original location */ public static URL getCachedResourceURL(URL location, Version version, UpdatePolicy policy) { try { File f = getCachedResourceFile(location, version, policy); //url was ponting to nowhere eg 404 if (f == null){ //originally f.toUrl was throwing NPE return null; //returning null seems to be better } // TODO: Should be toURI().toURL() return f.toURL(); } catch (MalformedURLException ex) { return location; } } /** * This is returning File object of cached resource originally from URL * @param location original location of blob * @param version version of resource * @param policy update policy of resource * @return location in ITW cache on filesystem */ public static File getCachedResourceFile(URL location, Version version, UpdatePolicy policy) { ResourceTracker rt = new ResourceTracker(); rt.addResource(location, version, null, policy); File f = rt.getCacheFile(location); return f; } /** * Returns the Permission object necessary to access the * resource, or {@code null} if no permission is needed. * @param location location of the resource * @param version the version, or {@code null} * @return permissions of the location */ public static Permission getReadPermission(URL location, Version version) { Permission result = null; if (CacheUtil.isCacheable(location, version)) { File file = CacheUtil.getCacheFile(location, version); result = new FilePermission(file.getPath(), "read"); } else { try { // this is what URLClassLoader does URLConnection conn = ConnectionFactory.getConnectionFactory().openConnection(location); result = conn.getPermission(); ConnectionFactory.getConnectionFactory().disconnect(conn); } catch (java.io.IOException ioe) { // should try to figure out the permission OutputController.getLogger().log(ioe); } } return result; } /** * Clears the cache by deleting all the Netx cache files * * Note: Because of how our caching system works, deleting jars of another javaws * process is using them can be quite disasterous. Hence why Launcher creates lock files * and we check for those by calling {@link #okToClearCache()} * @return true if the cache could be cleared and was cleared */ public static boolean clearCache() { // clear all cache CacheLRUWrapper lruHandler = CacheLRUWrapper.getInstance(); File cacheDir = lruHandler.getCacheDir().getFile(); if (!checkToClearCache()) { return false; } OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Clearing cache directory: " + cacheDir); lruHandler.lock(); try { cacheDir = cacheDir.getCanonicalFile(); // remove windows shortcuts before cache dir is gone if (JNLPRuntime.isWindows()) { removeWindowsShortcuts("ALL"); } FileUtils.recursiveDelete(cacheDir, cacheDir); cacheDir.mkdir(); lruHandler.clearLRUSortedEntries(); lruHandler.store(); } catch (IOException e) { throw new RuntimeException(e); } finally { lruHandler.unlock(); } return true; } public static boolean clearCache(final String application, boolean jnlpPath, boolean domain) { // clear one app if (!checkToClearCache()) { return false; } OutputController.getLogger().log(OutputController.Level.WARNING_ALL, Translator.R("BXSingleCacheCleared", application)); List ids = getCacheIds(".*", jnlpPath, domain); int found = 0; int files = 0; for (CacheId id : ids) { if (id.getId().equalsIgnoreCase(application)) { found++; files += id.files.size(); } } if (found == 0) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, Translator.R("BXSingleCacheClearNotFound", application)); } if (found > 1) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, Translator.R("BXSingleCacheMoreThenOneId", application)); } OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, Translator.R("BXSingleCacheFileCount", files)); CacheLRUWrapper.getInstance().lock(); try { Files.walk(Paths.get(CacheLRUWrapper.getInstance().getCacheDir().getFile().getCanonicalPath())).filter(new Predicate() { @Override public boolean test(Path t) { return Files.isRegularFile(t); } }).forEach(new Consumer() { @Override public void accept(Path path) { if (path.getFileName().toString().endsWith(CacheDirectory.INFO_SUFFIX)) { PropertiesFile pf = new PropertiesFile(new File(path.toString())); // if jnlp-path in .info equals path of app to delete mark to delete String jnlpPath = pf.getProperty(CacheEntry.KEY_JNLP_PATH); if (application.equalsIgnoreCase(jnlpPath) || application.equalsIgnoreCase(getDomain(path))) { pf.setProperty("delete", "true"); pf.store(); OutputController.getLogger().log("marked for deletion: " + path); } } } }); if (JNLPRuntime.isWindows()) { removeWindowsShortcuts(application.toLowerCase()); } // clean the cache of entries now marked for deletion cleanCache(); } catch (IOException e) { throw new RuntimeException(e); } finally { CacheLRUWrapper.getInstance().unlock(); } return true; } public static boolean checkToClearCache() { if (!okToClearCache()) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, R("CCannotClearCache")); return false; } return CacheLRUWrapper.getInstance().getCacheDir().getFile().isDirectory(); } public static void removeWindowsShortcuts(String jnlpApp) throws IOException { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Clearing Windows shortcuts"); if (CacheLRUWrapper.getInstance().getWindowsShortcutList().exists()) { List lines = Files.readAllLines(CacheLRUWrapper.getInstance().getWindowsShortcutList().toPath(), Charset.forName("UTF-8")); Iterator it = lines.iterator(); Boolean fDelete; while (it.hasNext()) { String sItem = it.next().toString(); String[] sArray = sItem.split(","); String application = sArray[0]; String sPath = sArray[1]; // if application is codebase then delete files if (application.equalsIgnoreCase(jnlpApp)) { fDelete = true; it.remove(); } else { fDelete = false; } if (jnlpApp.equals("ALL")) { fDelete = true; } if (fDelete) { OutputController.getLogger().log("Deleting item = " + sPath); File scList = new File(sPath); try { FileUtils.recursiveDelete(scList, scList); } catch (Exception e) { OutputController.getLogger().log(e); } } } if (jnlpApp.equals("ALL")) { //delete shortcut list file Files.deleteIfExists(CacheLRUWrapper.getInstance().getWindowsShortcutList().toPath()); } else { //write file after application scuts have been removed Files.write(CacheLRUWrapper.getInstance().getWindowsShortcutList().toPath(), lines, Charset.forName("UTF-8")); } } } public static void listCacheIds(String filter, boolean jnlpPath, boolean domain) { List items = getCacheIds(filter, jnlpPath, domain); if (JNLPRuntime.isDebug()) { for (CacheId id : items) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, id.getId()+" ("+id.getType()+") ["+id.files.size()+"]"); for(Object[] o: id.getFiles()){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < o.length; i++) { Object object = o[i]; if (object == null) { object = "??"; } sb.append(object.toString()).append(" ; "); } OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, " * " + sb); } } } else { for (CacheId id : items) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, id.getId()); } } } /** * This method load all known IDs of applications and will gather all members, which share the id * @param filter - regex to filter keys * @return */ public static List getCacheIds(final String filter, final boolean jnlpPath, final boolean domain) { CacheLRUWrapper.getInstance().lock(); final List r = new ArrayList<>(); try { Files.walk(Paths.get(CacheLRUWrapper.getInstance().getCacheDir().getFile().getCanonicalPath())).filter(new Predicate() { @Override public boolean test(Path t) { return Files.isRegularFile(t); } }).forEach(new Consumer() { @Override public void accept(Path path) { if (path.getFileName().toString().endsWith(CacheDirectory.INFO_SUFFIX)) { PropertiesFile pf = new PropertiesFile(new File(path.toString())); if (jnlpPath) { // if jnlp-path in .info equals path of app to delete mark to delete String jnlpPath = pf.getProperty(CacheEntry.KEY_JNLP_PATH); if (jnlpPath != null && jnlpPath.matches(filter)) { CacheId jnlpPathId = new CacheJnlpId(jnlpPath); if (!r.contains(jnlpPathId)) { r.add(jnlpPathId); jnlpPathId.populate(); } } } if (domain) { String domain = getDomain(path); if (domain != null && domain.matches(filter)) { CacheId doaminId = new CacheDomainId(domain); if (!r.contains(doaminId)) { r.add(doaminId); doaminId.populate(); } } } } } }); } catch (IOException e) { throw new RuntimeException(e); } finally { CacheLRUWrapper.getInstance().unlock(); } return r; } /** * Returns a boolean indicating if it ok to clear the netx application cache at this point * @return true if the cache can be cleared at this time without problems */ private static boolean okToClearCache() { File otherJavawsRunning = PathsAndFiles.MAIN_LOCK.getFile(); FileLock locking = null; try { if (otherJavawsRunning.isFile()) { FileOutputStream fis = new FileOutputStream(otherJavawsRunning); FileChannel channel = fis.getChannel(); locking = channel.tryLock(); if (locking == null) { OutputController.getLogger().log("Other instances of javaws are running"); return false; } OutputController.getLogger().log("No other instances of javaws are running"); return true; } else { OutputController.getLogger().log("No instance file found"); return true; } } catch (IOException e) { return false; } finally { if (locking != null) { try { locking.release(); } catch (IOException ex) { OutputController.getLogger().log(ex); } } } } /** * Returns whether there is a version of the URL contents in the * cache and it is up to date. This method may not return * immediately. * * @param source the source {@link URL} * @param version the versions to check for * @param lastModifed time in milis since epoch of last modfication * @return whether the cache contains the version * @throws IllegalArgumentException if the source is not cacheable */ public static boolean isCurrent(URL source, Version version, long lastModifed) { if (!isCacheable(source, version)) throw new IllegalArgumentException(R("CNotCacheable", source)); try { CacheEntry entry = new CacheEntry(source, version); // could pool this boolean result = entry.isCurrent(lastModifed); OutputController.getLogger().log("isCurrent: " + source + " = " + result); return result; } catch (Exception ex) { OutputController.getLogger().log(ex); return isCached(source, version); // if can't connect return whether already in cache } } /** * Returns true if the cache has a local copy of the contents of * the URL matching the specified version string. * * @param source the source URL * @param version the versions to check for * @return true if the source is in the cache * @throws IllegalArgumentException if the source is not cacheable */ public static boolean isCached(URL source, Version version) { if (!isCacheable(source, version)) throw new IllegalArgumentException(R("CNotCacheable", source)); CacheEntry entry = new CacheEntry(source, version); // could pool this boolean result = entry.isCached(); OutputController.getLogger().log("isCached: " + source + " = " + result); return result; } /** * Returns whether the resource can be cached as a local file; * if not, then URLConnection.openStream can be used to obtain * the contents. * @param source the url of resource * @param version version of resource * @return whether this resource can be cached */ public static boolean isCacheable(URL source, Version version) { if (source == null) return false; if (source.getProtocol().equals("file")){ return false; } if (source.getProtocol().equals("jar")){ return false; } return true; } /** * Returns the file for the locally cached contents of the * source. This method returns the file location only and does * not download the resource. The latest version of the * resource that matches the specified version will be returned. * * @param source the source {@link URL} * @param version the version id of the local file * @return the file location in the cache, or {@code null} if no versions cached * @throws IllegalArgumentException if the source is not cacheable */ public static File getCacheFile(URL source, Version version) { // ensure that version is an version id not version string if (!isCacheable(source, version)) throw new IllegalArgumentException(R("CNotCacheable", source)); File cacheFile = null; CacheLRUWrapper lruHandler = CacheLRUWrapper.getInstance(); synchronized (lruHandler) { try { lruHandler.lock(); // We need to reload the cacheOrder file each time // since another plugin/javaws instance may have updated it. lruHandler.load(); cacheFile = getCacheFileIfExist(urlToPath(source, "")); if (cacheFile == null) { // We did not find a copy of it. cacheFile = makeNewCacheFile(source, version); } else lruHandler.store(); } finally { lruHandler.unlock(); } } return cacheFile; } /** * This will return a File pointing to the location of cache item. * * @param urlPath Path of cache item within cache directory. * @return File if we have searched before, {@code null} otherwise. */ private static File getCacheFileIfExist(File urlPath) { CacheLRUWrapper lruHandler = CacheLRUWrapper.getInstance(); synchronized (lruHandler) { File cacheFile = null; List> entries = lruHandler.getLRUSortedEntries(); // Start searching from the most recent to least recent. for (Entry e : entries) { final String key = e.getKey(); final String path = e.getValue(); if (pathToURLPath(path).equals(urlPath.getPath())) { // Match found. cacheFile = new File(path); lruHandler.updateEntry(key); break; // Stop searching since we got newest one already. } } return cacheFile; } } /** * Get the path to file minus the cache directory and indexed folder. */ private static String pathToURLPath(String path) { int len = CacheLRUWrapper.getInstance().getCacheDir().getFullPath().length(); int index = path.indexOf(File.separatorChar, len + 1); return path.substring(index); } /** * Returns the parent directory of the cached resource. * @param filePath The path of the cached resource directory. * @return parent dir of cache */ public static String getCacheParentDirectory(String filePath) { String path = filePath; String tempPath; String cacheDir = CacheLRUWrapper.getInstance().getCacheDir().getFullPath(); while(path.startsWith(cacheDir) && !path.equals(cacheDir)){ tempPath = new File(path).getParent(); if (tempPath.equals(cacheDir)) break; path = tempPath; } return path; } /** * This will create a new entry for the cache item. It is however not * initialized but any future calls to getCacheFile with the source and * version given to here, will cause it to return this item. * * @param source the source URL * @param version the version id of the local file * @return the file location in the cache. */ public static File makeNewCacheFile(URL source, Version version) { CacheLRUWrapper lruHandler = CacheLRUWrapper.getInstance(); synchronized (lruHandler) { File cacheFile = null; try { lruHandler.lock(); lruHandler.load(); for (long i = 0; i < Long.MAX_VALUE; i++) { String path = lruHandler.getCacheDir().getFullPath()+ File.separator + i; File cDir = new File(path); if (!cDir.exists()) { // We can use this directory. try { cacheFile = urlToPath(source, path); FileUtils.createParentDir(cacheFile); File pf = new File(cacheFile.getPath() + CacheDirectory.INFO_SUFFIX); FileUtils.createRestrictedFile(pf, true); // Create the info file for marking later. lruHandler.addEntry(lruHandler.generateKey(cacheFile.getPath()), cacheFile.getPath()); } catch (IOException ioe) { OutputController.getLogger().log(ioe); } break; } } lruHandler.store(); } finally { lruHandler.unlock(); } return cacheFile; } } /** * Returns a buffered output stream open for writing to the * cache file. * * @param source the remote location * @param version the file version to write to * @return the stream to write to resource * @throws java.io.IOException if IO breaks */ public static OutputStream getOutputStream(URL source, Version version) throws IOException { File localFile = getCacheFile(source, version); OutputStream out = new FileOutputStream(localFile); return new BufferedOutputStream(out); } /** * Copies from an input stream to an output stream. On * completion, both streams will be closed. Streams are * buffered automatically. * @param is stream to read from * @param os stream to write to * @throws java.io.IOException if copy fails */ public static void streamCopy(InputStream is, OutputStream os) throws IOException { if (!(is instanceof BufferedInputStream)) is = new BufferedInputStream(is); if (!(os instanceof BufferedOutputStream)) os = new BufferedOutputStream(os); try { byte b[] = new byte[4096]; while (true) { int c = is.read(b, 0, b.length); if (c == -1) break; os.write(b, 0, c); } } finally { is.close(); os.close(); } } /** * Converts a URL into a local path string within the given directory. For * example a url with subdirectory /tmp/ will * result in a File that is located somewhere within /tmp/ * * @param location the url * @param subdir the subdirectory * @return the file */ public static File urlToPath(URL location, String subdir) { if (subdir == null) { throw new NullPointerException(); } StringBuilder path = new StringBuilder(); path.append(subdir); path.append(File.separatorChar); path.append(location.getProtocol()); path.append(File.separatorChar); path.append(location.getHost()); path.append(File.separatorChar); /** * This is a bit of imprecise. The usage of default port would be * better, but it would cause terrible backward incompatibility. */ if (location.getPort() > 0) { path.append(location.getPort()); path.append(File.separatorChar); } path.append(location.getPath().replace('/', File.separatorChar)); if (location.getQuery() != null && !location.getQuery().trim().isEmpty()) { path.append(".").append(location.getQuery()); } File candidate = new File(FileUtils.sanitizePath(path.toString())); if (candidate.getName().length() > 255) { /** * When filename is longer then 255 chars, then then various * filesytems have issues to save it. By saving the file by its * summ, we are trying to prevent collision of two files differs in * suffixes (general suffix of name, not only 'filetype suffix') * only. It is also preventing bug when truncate (files with 1000 * chars hash in query) cuts to much. */ try { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] sum = md.digest(candidate.getName().getBytes(StandardCharsets.UTF_8)); //convert the byte to hex format method 2 StringBuilder hexString = new StringBuilder(); for (int i = 0; i < sum.length; i++) { hexString.append(Integer.toHexString(0xFF & sum[i])); } String extension = ""; int i = candidate.getName().lastIndexOf('.'); if (i > 0) { extension = candidate.getName().substring(i);//contains dot } if (extension.length() < 10 && extension.length() > 1) { hexString.append(extension); } candidate = new File(candidate.getParentFile(), hexString.toString()); } catch (NoSuchAlgorithmException ex) { // should not occure, cite from javadoc: // every java iomplementation should support // MD5 SHA-1 SHA-256 throw new RuntimeException(ex); } } return candidate; } /** * Waits until the resources are downloaded, while showing a * progress indicator. * * @param app application instance with context for this resource * @param tracker the resource tracker * @param resources the resources to wait for * @param title name of the download */ public static void waitForResources(ApplicationInstance app, ResourceTracker tracker, URL resources[], String title) { DownloadIndicator indicator = JNLPRuntime.getDefaultDownloadIndicator(); DownloadServiceListener listener = null; try { if (indicator == null) { tracker.waitForResources(resources, 0); return; } // see if resources can be downloaded very quickly; avoids // overhead of creating display components for the resources if (tracker.waitForResources(resources, indicator.getInitialDelay())) return; // only resources not starting out downloaded are displayed List urlList = new ArrayList<>(); for (URL url : resources) { if (!tracker.checkResource(url)) urlList.add(url); } URL undownloaded[] = urlList.toArray(new URL[urlList.size()]); listener = indicator.getListener(app, title, undownloaded); do { long read = 0; long total = 0; for (URL url : undownloaded) { // add in any -1's; they're insignificant total += tracker.getTotalSize(url); read += tracker.getAmountRead(url); } int percent = (int) ((100 * read) / Math.max(1, total)); for (URL url : undownloaded) { listener.progress(url, "version", tracker.getAmountRead(url), tracker.getTotalSize(url), percent); } } while (!tracker.waitForResources(resources, indicator.getUpdateRate())); // make sure they read 100% until indicator closes for (URL url : undownloaded) { listener.progress(url, "version", tracker.getTotalSize(url), tracker.getTotalSize(url), 100); } } catch (InterruptedException ex) { OutputController.getLogger().log(ex); } finally { if (listener != null) indicator.disposeListener(listener); } } /** * This will remove all old cache items. */ public static void cleanCache() { CacheLRUWrapper lruHandler = CacheLRUWrapper.getInstance(); if (okToClearCache()) { // First we want to figure out which stuff we need to delete. HashSet keep = new HashSet<>(); HashSet remove = new HashSet<>(); try { lruHandler.lock(); lruHandler.load(); long maxSize = -1; // Default try { maxSize = Long.parseLong(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_CACHE_MAX_SIZE)); } catch (NumberFormatException nfe) { } maxSize = maxSize << 20; // Convert from megabyte to byte (Negative values will be considered unlimited.) long curSize = 0; for (Entry e : lruHandler.getLRUSortedEntries()) { // Check if the item is contained in cacheOrder. final String key = e.getKey(); final String path = e.getValue(); File file = new File(path); PropertiesFile pf = new PropertiesFile(new File(path + CacheDirectory.INFO_SUFFIX)); boolean delete = Boolean.parseBoolean(pf.getProperty("delete")); /* * This will get me the root directory specific to this cache item. * Example: * cacheDir = /home/user1/.icedtea/cache * file.getPath() = /home/user1/.icedtea/cache/0/http/www.example.com/subdir/a.jar * rStr first becomes: /0/http/www.example.com/subdir/a.jar * then rstr becomes: /home/user1/.icedtea/cache/0 */ String rStr = file.getPath().substring(lruHandler.getCacheDir().getFullPath().length()); rStr = lruHandler.getCacheDir().getFullPath()+ rStr.substring(0, rStr.indexOf(File.separatorChar, 1)); long len = file.length(); if (keep.contains(file.getPath().substring(rStr.length()))) { lruHandler.removeEntry(key); continue; } /* * we remove entries from our lru if any of the following condition is met. * Conditions: * - delete: file has been marked for deletion. * - !file.isFile(): if someone tampered with the directory, file doesn't exist. * - maxSize >= 0 && curSize + len > maxSize: If a limit was set and the new size * on disk would exceed the maximum size. */ if (delete || !file.isFile() || (maxSize >= 0 && curSize + len > maxSize)) { lruHandler.removeEntry(key); remove.add(rStr); continue; } curSize += len; keep.add(file.getPath().substring(rStr.length())); for (File f : file.getParentFile().listFiles()) { if (!(f.equals(file) || f.equals(pf.getStoreFile()))) { try { FileUtils.recursiveDelete(f, f); } catch (IOException e1) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e1); } } } } lruHandler.store(); } finally { lruHandler.unlock(); } removeSetOfDirectories(remove); } } private static void removeSetOfDirectories(Set remove) { for (String s : remove) { File f = new File(s); try { FileUtils.recursiveDelete(f, f); } catch (IOException e) { } } } static class CacheJnlpId extends CacheId { public CacheJnlpId(String id) { super(id); } @Override public void populate() { ArrayList all = CachePane.generateData(); for (Object[] object : all) { if (id.equals(object[6])) { this.files.add(object); } } } @Override String getType() { return "JNLP-PATH"; } @Override //hascode in super is ok public boolean equals(Object obj) { if (obj instanceof CacheJnlpId) { return super.equals(obj); } else { return false; } } } static class CacheDomainId extends CacheId { public CacheDomainId(String id) { super(id); } @Override public void populate() { ArrayList all = CachePane.generateData(); for (Object[] object : all) { if (id.equals(object[3].toString())) { this.files.add(object); } } } @Override String getType() { return "DOMAIN"; } @Override //hascode in super is ok public boolean equals(Object obj) { if (obj instanceof CacheDomainId) { return super.equals(obj); } else { return false; } } } public abstract static class CacheId { //last century array of objects instead of some nice class inherited from previous century protected final List files = new ArrayList<>(); abstract void populate(); abstract String getType(); protected final String id; public CacheId(String id) { this.id = id; } @Override public String toString() { return id; } public List getFiles() { return files; } public String getId() { return id; } @Override public boolean equals(Object obj) { if (obj instanceof CacheId) { CacheId c = (CacheId) obj; if (c.id == null && this.id == null) { return true; } if (c.id == null) { return false; } return c.id.equals(this.id); } else { return false; } } @Override public int hashCode() { return Objects.hashCode(this.id); } } private static String getDomain(Path path) { String relativeToCache = path.toAbsolutePath().toString().replace(CacheLRUWrapper.getInstance().getCacheDir().getFullPath(), ""); for (int x = 0; x < 3; x++) { int i = relativeToCache.indexOf(File.separator); relativeToCache = relativeToCache.substring(i + 1); } int i = relativeToCache.indexOf(File.separator); relativeToCache = relativeToCache.substring(0, i); return relativeToCache; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/UpdatePolicy.java0000644000000000000000000000013213441742745024565 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/UpdatePolicy.java0000644000175000002070000000506313441742745025401 0ustar00jvanekmock00000000000000// Copyright (C) 2002 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.cache; /** * A policy that determines when a resource should be checked for * an updated version. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.3 $ */ public class UpdatePolicy { // todo: implement session updating // todo: doesn't seem to work in the same JVM, probably because // Resource is being held by a tracker so it isn't collected; // then next time a tracker adds the resource even if // shouldUpdate==true it's state is already marked // CONNECTED|DOWNLOADED. Let the resource be collected or reset // to UNINITIALIZED. public static UpdatePolicy ALWAYS = new UpdatePolicy(0); public static UpdatePolicy SESSION = new UpdatePolicy(-1); public static UpdatePolicy FORCE = new UpdatePolicy(Long.MIN_VALUE); public static UpdatePolicy NEVER = new UpdatePolicy(Long.MAX_VALUE); private long timeDiff = -1; /** * Create a new update policy; this policy always updates the * entry unless the shouldUpdate method is overridden. */ public UpdatePolicy() { } /** * Create an update policy that only checks a file for being * updated if it has not been checked for longer than the * specified time. * * @param timeDiff how long in ms until update needed */ public UpdatePolicy(long timeDiff) { this.timeDiff = timeDiff; } /** * @return whether the resource should be checked for being * up-to-date. * @param entry entry which shoul;d be cared */ public boolean shouldUpdate(CacheEntry entry) { long updated = entry.getLastUpdated(); long current = System.currentTimeMillis(); return current - updated >= timeDiff; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/DownloadIndicator.java0000644000000000000000000000013213441742745025567 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/DownloadIndicator.java0000644000175000002070000000644713441742745026412 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.cache; import java.net.*; import javax.jnlp.*; import net.sourceforge.jnlp.runtime.*; /** * A DownloadIndicator creates DownloadServiceListeners that are * notified of resources being transferred and their progress. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.8 $ */ public interface DownloadIndicator { /** * Return a download service listener that displays the progress * of downloading resources. Update messages may be reported * for URLs that are not included initially. *

    * Progress messages are sent as if the DownloadServiceListener * were listening to a DownloadService request. The listener * will receive progress messages from time to time during the * download. *

    * * @param app JNLP application downloading the files, or null if not applicable * @param downloadName name identifying the download to the user * @param resources initial urls to display, empty if none known at start * @return dedicated listener */ public DownloadServiceListener getListener(ApplicationInstance app, String downloadName, URL resources[]); /** * Indicates that a download service listener that was obtained * from the getDownloadListener method will no longer be used. * This method can be used to ensure that progress dialogs are * properly removed once a particular download is finished. * * @param listener the listener that is no longer in use */ public void disposeListener(DownloadServiceListener listener); /** * Return the desired time in milliseconds between updates. * Updates are not guarenteed to occur based on this value; for * example, they may occur based on the download percent or some * other factor. * * @return rate in milliseconds, must be >= 0 */ public int getUpdateRate(); /** * Return a time in milliseconds to wait for a download to * complete before obtaining a listener for the download. This * value can be used to skip lengthy operations, such as * initializing a GUI, for downloads that complete quickly. The * getListener method is not called if the download completes * in less time than the returned delay. * * @return delay in milliseconds, must be >= 0 */ public int getInitialDelay(); } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/NativeLibraryStorage.java0000644000000000000000000000013113441742745026262 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/NativeLibraryStorage.java0000644000175000002070000001272613441742745027103 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.cache; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.OutputController; /** * Handles loading and access of native code loading through a JNLP application or applet. * Stores native code in a temporary folder. * Be sure to call cleanupTemporayFolder when finished with the object. */ public class NativeLibraryStorage { private final ResourceTracker tracker; private final List nativeSearchDirectories = new ArrayList<>(); /* Temporary directory to store native jar entries, added to our search path */ private File jarEntryDirectory = null; public NativeLibraryStorage(ResourceTracker tracker) { this.tracker = tracker; } /** * Clean up our temporary folder if we created one. */ public void cleanupTemporaryFolder() { if (jarEntryDirectory != null) { OutputController.getLogger().log("Cleaning up native directory" + jarEntryDirectory.getAbsolutePath()); try { FileUtils.recursiveDelete(jarEntryDirectory, new File(System.getProperty("java.io.tmpdir"))); jarEntryDirectory = null; } catch (IOException e) { /* * failed to delete a file in tmpdir, no big deal (as well the VM * might be shutting down at this point so no much we can do) */ } } } /** * Adds the {@link File} to the search path of this {@link NativeLibraryStorage} * when trying to find a native library * @param directory directory to be added */ public void addSearchDirectory(File directory) { nativeSearchDirectories.add(directory); } public List getSearchDirectories() { return nativeSearchDirectories; } /** * Looks in the search directories for 'fileName', * returning a path to the found file if it exists. * @param fileName name of library to be found * @return path to library if found, null otherwise. */ public File findLibrary(String fileName) { for (File dir : getSearchDirectories()) { File target = new File(dir, fileName); if (target.exists()) return target; } return null; } public static final String[] NATIVE_LIBRARY_EXTENSIONS = { ".so", ".dylib", ".jnilib", ".framework", ".dll" }; /** * Search for and enable any native code contained in a JAR by copying the * native files into the filesystem. Called in the security context of the * classloader. * @param jarLocation location of jar to be searched */ public void addSearchJar(URL jarLocation) { OutputController.getLogger().log("Activate native: " + jarLocation); File localFile = tracker.getCacheFile(jarLocation); if (localFile == null) return; try { try (JarFile jarFile = new JarFile(localFile, false)) { Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry e = entries.nextElement(); if (e.isDirectory()) { continue; } String name = new File(e.getName()).getName(); boolean isLibrary = false; for (String suffix : NATIVE_LIBRARY_EXTENSIONS) { if (name.endsWith(suffix)) { isLibrary = true; break; } } if (!isLibrary) { continue; } ensureNativeStoreDirectory(); File outFile = new File(jarEntryDirectory, name); if (!outFile.isFile()) { FileUtils.createRestrictedFile(outFile, true); } CacheUtil.streamCopy(jarFile.getInputStream(e), new FileOutputStream(outFile)); } } } catch (IOException ex) { OutputController.getLogger().log(ex); } } void ensureNativeStoreDirectory() { if (jarEntryDirectory == null) { jarEntryDirectory = createNativeStoreDirectory(); addSearchDirectory(jarEntryDirectory); } } /** * Create a random base directory to store native code files in. */ private static File createNativeStoreDirectory() { final int rand = (int)((Math.random()*2 - 1) * Integer.MAX_VALUE); File nativeDir = new File(System.getProperty("java.io.tmpdir") + File.separator + "netx-native-" + (rand & 0xFFFF)); File parent = nativeDir.getParentFile(); if (!parent.isDirectory() && !parent.mkdirs()) { return null; } try { FileUtils.createRestrictedDirectory(nativeDir); return nativeDir; } catch (IOException e) { return null; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/CacheLRUWrapper.java0000644000000000000000000000013213441742745025112 xustar0030 mtime=1552401893.025832852 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java0000644000175000002070000003001713441742745025723 0ustar00jvanekmock00000000000000/* CacheLRUWrapper -- Handle LRU for cache files. Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.File; import java.io.IOException; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import java.util.Set; import net.sourceforge.jnlp.config.InfrastructureFileDescriptor; import net.sourceforge.jnlp.config.PathsAndFiles; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.PropertiesFile; import net.sourceforge.jnlp.util.logging.OutputController; /** * This class helps maintain the ordering of most recently use items across * multiple jvm instances. * */ public class CacheLRUWrapper { /* * back-end of how LRU is implemented This file is to keep track of the most * recently used items. The items are to be kept with key = (current time * accessed) followed by folder of item. value = path to file. */ private final InfrastructureFileDescriptor recentlyUsedPropertiesFile; private final InfrastructureFileDescriptor cacheDir; private final File windowsShortcutList; public CacheLRUWrapper() { this(PathsAndFiles.getRecentlyUsedFile(), PathsAndFiles.CACHE_DIR); } /** * testing constructor * @param recentlyUsed file to be used as recently_used file * @param cacheDir dir with cache */ CacheLRUWrapper(final InfrastructureFileDescriptor recentlyUsed, final InfrastructureFileDescriptor cacheDir) { recentlyUsedPropertiesFile = recentlyUsed; this.cacheDir = cacheDir; windowsShortcutList = new File(cacheDir.getFile(), "shortcutList.txt"); if (!recentlyUsed.getFile().exists()) { try { FileUtils.createParentDir(recentlyUsed.getFile()); FileUtils.createRestrictedFile(recentlyUsed.getFile(), true); } catch (IOException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } } /** * Returns an instance of the policy. * * @return an instance of the policy */ public static CacheLRUWrapper getInstance() { return CacheLRUWrapperHolder.INSTANCE; } private PropertiesFile cachedRecentlyUsedPropertiesFile = null ; /** * @return the recentlyUsedPropertiesFile */ synchronized PropertiesFile getRecentlyUsedPropertiesFile() { if (cachedRecentlyUsedPropertiesFile == null) { //no properties file yet, create it cachedRecentlyUsedPropertiesFile = new PropertiesFile(recentlyUsedPropertiesFile.getFile()); return cachedRecentlyUsedPropertiesFile; } if (recentlyUsedPropertiesFile.getFile().equals(cachedRecentlyUsedPropertiesFile.getStoreFile())){ //The underlying InfrastructureFileDescriptor is still pointing to the same file, use current properties file return cachedRecentlyUsedPropertiesFile; } else { //the InfrastructureFileDescriptor was set to different location, move to it if (cachedRecentlyUsedPropertiesFile.tryLock()) { cachedRecentlyUsedPropertiesFile.store(); cachedRecentlyUsedPropertiesFile.unlock(); } cachedRecentlyUsedPropertiesFile = new PropertiesFile(recentlyUsedPropertiesFile.getFile()); return cachedRecentlyUsedPropertiesFile; } } /** * @return the cacheDir */ public InfrastructureFileDescriptor getCacheDir() { return cacheDir; } public File getWindowsShortcutList() { return windowsShortcutList; } /** * @return the recentlyUsedFile */ public InfrastructureFileDescriptor getRecentlyUsedFile() { return recentlyUsedPropertiesFile; } private static class CacheLRUWrapperHolder{ private static final CacheLRUWrapper INSTANCE = new CacheLRUWrapper(); } /** * Update map for keeping track of recently used items. */ public synchronized void load() { boolean loaded = getRecentlyUsedPropertiesFile().load(); /* * clean up possibly corrupted entries */ if (loaded && checkData()) { OutputController.getLogger().log(new LruCacheException()); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CFakeCache")); store(); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, R("CFakedCache")); } } /** * check content of recentlyUsedPropertiesFile and remove invalid/corrupt entries * * @return true, if cache was corrupted and affected entry removed */ private boolean checkData () { boolean modified = false; Set> q = getRecentlyUsedPropertiesFile().entrySet(); for (Iterator> it = q.iterator(); it.hasNext();) { Entry currentEntry = it.next(); final String key = (String) currentEntry.getKey(); final String path = (String) currentEntry.getValue(); // 1. check key format: "milliseconds,number" try { String sa[] = key.split(","); Long l1 = Long.parseLong(sa[0]); Long l2 = Long.parseLong(sa[1]); } catch (Exception ex) { it.remove(); modified = true; continue; } // 2. check path format - does the path look correct? if (path != null) { if (!path.contains(getCacheDir().getFullPath())) { it.remove(); modified = true; } } else { it.remove(); modified = true; } } return modified; } /** * Write file to disk. * @return true if properties were successfully stored, false otherwise */ public synchronized boolean store() { if (getRecentlyUsedPropertiesFile().isHeldByCurrentThread()) { getRecentlyUsedPropertiesFile().store(); return true; } return false; } /** * This adds a new entry to file. * * @param key key we want path to be associated with. * @param path path to cache item. * @return true if we successfully added to map, false otherwise. */ public synchronized boolean addEntry(String key, String path) { PropertiesFile props = getRecentlyUsedPropertiesFile(); if (props.containsKey(key)) { return false; } props.setProperty(key, path); return true; } /** * This removed an entry from our map. * * @param key key we want to remove. * @return true if we successfully removed key from map, false otherwise. */ public synchronized boolean removeEntry(String key) { PropertiesFile props = getRecentlyUsedPropertiesFile(); if (!props.containsKey(key)) { return false; } props.remove(key); return true; } private String getIdForCacheFolder(String folder) { int len = getCacheDir().getFullPath().length(); int index = folder.indexOf(File.separatorChar, len + 1); return folder.substring(len + 1, index); } /** * This updates the given key to reflect it was recently accessed. * * @param oldKey Key we wish to update. * @return true if we successfully updated value, false otherwise. */ public synchronized boolean updateEntry(String oldKey) { PropertiesFile props = getRecentlyUsedPropertiesFile(); if (!props.containsKey(oldKey)) { return false; } String value = props.getProperty(oldKey); String folder = getIdForCacheFolder(value); props.remove(oldKey); props.setProperty(Long.toString(System.currentTimeMillis()) + "," + folder, value); return true; } /** * Return a copy of the keys available. * * @return List of Strings sorted by ascending order. */ @SuppressWarnings({"unchecked", "rawtypes"}) //although Properties are pretending to be they are always //bug in jdk? public synchronized List> getLRUSortedEntries() { List> entries = new ArrayList<>(); for (Entry e : getRecentlyUsedPropertiesFile().entrySet()) { entries.add(new AbstractMap.SimpleImmutableEntry(e)); } // sort by keys in descending order. Collections.sort(entries, new Comparator>() { @Override public int compare(Entry e1, Entry e2) { Long t1 = Long.parseLong(e1.getKey().split(",")[0]); Long t2 = Long.parseLong(e2.getKey().split(",")[0]); int c = t1.compareTo(t2); return c < 0 ? 1 : (c > 0 ? -1 : 0); } }); return entries; } /** * Lock the file to have exclusive access. */ public synchronized void lock() { getRecentlyUsedPropertiesFile().lock(); } /** * Unlock the file. */ public synchronized void unlock() { getRecentlyUsedPropertiesFile().unlock(); } /** * Return the value of given key. * * @param key key of property * @return value of given key, null otherwise. */ public synchronized String getValue(String key) { return getRecentlyUsedPropertiesFile().getProperty(key); } public synchronized boolean containsKey(String key) { return getRecentlyUsedPropertiesFile().containsKey(key); } public synchronized boolean containsValue(String value) { return getRecentlyUsedPropertiesFile().containsValue(value); } /** * Generate a key given the path to file. May or may not generate the same * key given same path. * * @param path Path to generate a key with. * @return String representing the a key. */ public String generateKey(String path) { return System.currentTimeMillis() + "," + getIdForCacheFolder(path); } void clearLRUSortedEntries() { getRecentlyUsedPropertiesFile().clear(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/package-info.java0000644000000000000000000000013213441742745024507 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/package-info.java0000644000175000002070000000327113441742745025322 0ustar00jvanekmock00000000000000/* package-info.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.*/ /** * This package contains the JNLP cache. */ package net.sourceforge.jnlp.cache; icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/IllegalResourceDescriptorException.j0000644000000000000000000000013213441742745030472 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/IllegalResourceDescriptorException.java0000644000175000002070000000401613441742745031773 0ustar00jvanekmock00000000000000/* IllegalResourceDescriptorException.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; @SuppressWarnings("serial") public class IllegalResourceDescriptorException extends IllegalArgumentException { /** * Constructs a {@code IllegalResourceDescriptorException} with the * specified detail message. * @param msg the detail message. */ public IllegalResourceDescriptorException(String msg) { super(msg); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/CacheDirectory.java0000644000000000000000000000013213441742745025053 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/CacheDirectory.java0000644000175000002070000001046313441742745025667 0ustar00jvanekmock00000000000000/* CacheDirectory.java -- Traverse the given directory and return the leafs. Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import java.io.File; import java.util.ArrayList; import net.sourceforge.jnlp.util.FileUtils; import net.sourceforge.jnlp.util.logging.OutputController; public final class CacheDirectory { /* Don't allow instantiation of this class */ private CacheDirectory(){} public static final String INFO_SUFFIX = ".info"; /** * Get the structure of directory for keeping track of the protocol and * domain. * * @param root Location of cache directory. */ public static void getDirStructure(DirectoryNode root) { for (File f : root.getFile().listFiles()) { DirectoryNode node = new DirectoryNode(f.getName(), f, root); if (f.isDirectory() || (!f.isDirectory() && !f.getName().endsWith(INFO_SUFFIX))) root.addChild(node); if (f.isDirectory()) getDirStructure(node); } } /** * Get all the leaf nodes. * * @param root The point where we want to start getting the leafs. * @return An ArrayList of DirectoryNode. */ public static ArrayList getLeafData(DirectoryNode root) { ArrayList temp = new ArrayList<>(); for (DirectoryNode f : root.getChildren()) { if (f.isDir()) temp.addAll(getLeafData(f)); else if (!f.getName().endsWith(INFO_SUFFIX)) temp.add(f); } return temp; } /** * Removes empty folders in the current directory. * * @param root File pointing at the beginning of directory. * @return True if something was deleted. */ public static boolean cleanDir(File root) { boolean delete = true; for (File f : root.listFiles()) { if (f.isDirectory()) cleanDir(f); else delete = false; } if (delete){ OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Delete -- " + root); } // root.delete(); return true; } /** * This will recursively remove the parent folders if they are empty. * * @param fileNode node of file which parent is going to be cleaned */ public static void cleanParent(DirectoryNode fileNode) { DirectoryNode parent = fileNode.getParent(); if (parent.getParent() == null) return; // Don't delete the root. if (parent.getChildren().isEmpty()) { FileUtils.deleteWithErrMesg(parent.getFile()); parent.getParent().removeChild(parent); cleanParent(parent); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/ResourceUrlCreator.java0000644000000000000000000000013213441742745025755 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java0000644000175000002070000002005313441742745026565 0ustar00jvanekmock00000000000000/* ResourceUrlCreator.java Copyright (C) 2011 Red Hat, Inc This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import java.net.MalformedURLException; import java.net.URL; import java.util.LinkedList; import java.util.List; import net.sourceforge.jnlp.DownloadOptions; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; public class ResourceUrlCreator { protected final Resource resource; protected final DownloadOptions downloadOptions; public ResourceUrlCreator(Resource resource, DownloadOptions downloadOptions) { this.resource = resource; this.downloadOptions = downloadOptions; } /** * Returns a list of URLs that the resources might be downloadable from. The * Resources may not be downloadable from any of them. The returned order is * the order the urls should be attempted in. * * @return a list of URLs that the resources might be downloadable from */ public List getUrls() { List urls = new LinkedList<>(); URL url; if (downloadOptions.useExplicitPack() && downloadOptions.useExplicitVersion()) { url = getUrl(resource, true, true); if (url != null) { urls.add(url); } url = getUrl(resource, false, true); if (url != null) { urls.add(url); } url = getUrl(resource, true, false); if (url != null) { urls.add(url); } } else if (downloadOptions.useExplicitPack()) { url = getUrl(resource, true, false); if (url != null) { urls.add(url); } } else if (downloadOptions.useExplicitVersion()) { url = getUrl(resource, false, true); if (url != null) { urls.add(url); } } url = getVersionedUrl(); urls.add(url); urls.add(resource.getLocation()); boolean noHttpsPreffered = Boolean.valueOf(JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_HTTPS_DONT_ENFORCE)); if (!noHttpsPreffered) { //preffering https and owerriding case, when applciation was moved to https, but the jnlp stayed intacted List urlsCopy = new LinkedList<>(urls); for (URL u : urlsCopy) { if (u.getProtocol().equals("http") && u.getPort() < 0) { try { urls.add(0, copyUrltoHttps(u)); } catch (Exception ex) { OutputController.getLogger().log(ex); } } } } return urls; } /** * Returns a url for the resource. * * @param resource the resource * @param usePack whether the URL should point to the pack200 file * @param useVersion whether the URL should be modified to include the * version * @return a URL for the resource or null if an appropriate URL can not be * found */ static URL getUrl(Resource resource, boolean usePack, boolean useVersion) { if (!(usePack || useVersion)) { throw new IllegalArgumentException("either pack200 or version required"); } String location = resource.getLocation().toString(); int lastSlash = resource.getLocation().toString().lastIndexOf('/'); if (lastSlash == -1) { return resource.getLocation(); } String filename = location.substring(lastSlash + 1); if (useVersion && resource.getRequestVersion() != null) { // With 'useVersion', j2-commons-cli.jar becomes, for example, j2-commons-cli__V1.0.jar String parts[] = filename.split("\\.", -1 /* Keep blank strings*/); StringBuilder sb = new StringBuilder(); for (int i = 0; i < parts.length; i++) { sb.append(parts[i]); // Append __V before last '.' if (i == parts.length - 2) { sb.append("__V").append(resource.getRequestVersion()); } sb.append('.'); } sb.setLength(sb.length() - 1); // remove last '.' filename = sb.toString(); } if (usePack) { filename = filename + ".pack.gz"; } location = location.substring(0, lastSlash + 1) + filename; try { URL newUrl = new URL(location); return newUrl; } catch (MalformedURLException e) { return null; } } /** * Returns the URL for this resource, including the resource's version * number in the query string * * @return url with version cared about */ protected URL getVersionedUrl() { URL resourceUrl = resource.getLocation(); String protocol = uriPartToString(resourceUrl.getProtocol()) + "://"; String userInfo = uriPartToString(resourceUrl.getUserInfo()); if (!userInfo.isEmpty()) { userInfo += "@"; } String host = uriPartToString(resourceUrl.getHost()); String port; if (resourceUrl.getPort() == -1) { port = ""; } else { port = ":" + String.valueOf(resourceUrl.getPort()); } String path = uriPartToString(resourceUrl.getPath()); String query = uriPartToString(resourceUrl.getQuery()); if (!query.isEmpty()) { query = "?" + query; } if (resource.getRequestVersion() != null && resource.getRequestVersion().isVersionId()) { if (!query.isEmpty()) { query += "&"; } else { query = "?" + query; } query += "version-id=" + resource.getRequestVersion(); } try { URL url = new URL(protocol + userInfo + host + port + path + query); return url; } catch (MalformedURLException e) { return resourceUrl; } } private static String uriPartToString(String part) { if (part == null) { return ""; } return part; } private URL copyUrltoHttps(URL u) throws MalformedURLException { if (u.getPort() < 0) { return new URL("https", u.getHost(), u.getFile()); } else { return new URL("https", u.getHost(), u.getPort(), u.getFile(), null); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/DirectoryNode.java0000644000000000000000000000013213441742745024735 xustar0030 mtime=1552401893.030832841 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/DirectoryNode.java0000644000175000002070000001221113441742745025542 0ustar00jvanekmock00000000000000/* DirectoryNode.java -- Structure for maintaining the cache directory tree. Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import java.io.File; import java.util.ArrayList; public class DirectoryNode { private String name; private File path; private ArrayList childNodes; private DirectoryNode parent = null; private File infoFile; /** * Create a new instance of DirectoryNode. * * @param name Name representing this node. * @param absPathToNode Absolute path to this node given as a String. * @param parent The parent node. */ public DirectoryNode(String name, String absPathToNode, DirectoryNode parent) { this(name, new File(absPathToNode), parent); } /** * Create a new instance of DirectoryNode. * * @param name Name representing this node. * @param absPathToNode Absolute path to this node as a File. * @param parent The parent node. */ public DirectoryNode(String name, File absPathToNode, DirectoryNode parent) { this(name, absPathToNode, null, parent); } /** * Create a new instance of DirectoryNode. * * @param name Name representing this node. * @param absPathToNode Absolute path to this node given as a File. * @param childNodes List of children nodes. * @param parent The parent node. */ public DirectoryNode(String name, File absPathToNode, ArrayList childNodes, DirectoryNode parent) { this.name = name; this.path = absPathToNode; this.childNodes = childNodes; if (this.childNodes == null) this.childNodes = new ArrayList(); this.parent = parent; if (!isDir()) this.infoFile = new File(this.getFile().getAbsolutePath().concat(CacheDirectory.INFO_SUFFIX)); } /** * Append the given node to the list of child nodes. * * @param node Node to be appended. */ public void addChild(DirectoryNode node) { try { childNodes.add(node); } catch (NullPointerException e) { this.childNodes = new ArrayList(); this.childNodes.add(node); } } /** * Removes the node specified. * * @param node Node to be removed from the list of children * @return true if this list of children contained the specified element */ public boolean removeChild(DirectoryNode node) { return this.childNodes.remove(node); } /** * Retrieve the name of this node. * * @return Name of this node. */ public String getName() { return this.name; } public String toString() { return this.name; } /** * Retrieve the file associated with this node. * * @return File that is associated with this node. */ public File getFile() { return path; } /** * Retrieve the parent node. * * @return DirectoryNode representing the parent of the current node. */ public DirectoryNode getParent() { return parent; } /** * Retrieves the list of child nodes. * * @return ArrayList of type DirectoryNode containing all the child nodes. */ public ArrayList getChildren() { return this.childNodes; } /** * Check if this node is a directory. * * @return True if node is directory. */ public boolean isDir() { return path.isDirectory(); } public File getInfoFile() { return this.infoFile; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/LruCacheException.java0000644000000000000000000000013113441742745025527 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/LruCacheException.java0000644000175000002070000000367513441742745026353 0ustar00jvanekmock00000000000000/* LruCacheException.java -- Thrown when cache is corrupted. Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; class LruCacheException extends RuntimeException { public LruCacheException() { super(); } public LruCacheException(String string) { super(string); } public LruCacheException(Throwable cause) { super(cause); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/CacheEntry.java0000644000000000000000000000013213441742745024210 xustar0030 mtime=1552401893.025832852 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/CacheEntry.java0000644000175000002070000002015013441742745025016 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp.cache; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.File; import java.net.URL; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.util.PropertiesFile; import net.sourceforge.jnlp.util.logging.OutputController; /** * Describes an entry in the cache. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.10 $ */ public class CacheEntry { public static final long LENGTH_UNKNOWN = -1; private static final String KEY_CONTENT_LENGTH = "content-length"; private static final String KEY_CONTENT_ORIGINAL_LENGTH = "content-original-length"; private static final String KEY_LAST_MODIFIED = "last-modified"; private static final String KEY_LAST_UPDATED = "last-updated"; public static final String KEY_JNLP_PATH = "jnlp-path"; /** the remote resource location */ private final URL location; /** the requested version */ private final Version version; /** info about the cached file */ private final PropertiesFile properties; /** * Create a CacheEntry for the resources specified as a remote * URL. * * @param location the remote resource location * @param version the version of the resource */ public CacheEntry(URL location, Version version) { this.location = location; this.version = version; this.properties = readCacheEntryInfo(); } /** * Seam for testing */ PropertiesFile readCacheEntryInfo() { File infoFile = CacheUtil.getCacheFile(location, version); infoFile = new File(infoFile.getPath() + CacheDirectory.INFO_SUFFIX); // replace with something that can't be clobbered return new PropertiesFile(infoFile, R("CAutoGen")); } /** * Returns the remote location this entry caches. * @return URL same as the one on which this entry was created */ public URL getLocation() { return location; } /** * Returns the time in the local system clock that the file was * most recently checked for an update. * @return when the item was updated (in ms) */ public long getLastUpdated() { return getLongKey(KEY_LAST_UPDATED); } /** * Sets the time in the local system clock that the file was * most recently checked for an update. * @param updatedTime the time (in ms) to be set as last updated time */ public void setLastUpdated(long updatedTime) { setLongKey(KEY_LAST_UPDATED, updatedTime); } public long getRemoteContentLength() { return getLongKey(KEY_CONTENT_LENGTH); } public void setRemoteContentLength(long length) { setLongKey(KEY_CONTENT_LENGTH, length); } public void setJnlpPath(String jnlpPath) { properties.setProperty(KEY_JNLP_PATH, jnlpPath); } /** * Return the length of the original content that was cached. May be different * from the actual cache entry size due to (de)compression. * * @return the content length or {@link #LENGTH_UNKNOWN} if unknown. */ public long getOriginalContentLength() { return getLongKey(KEY_CONTENT_ORIGINAL_LENGTH, LENGTH_UNKNOWN); } /** * Set the length of the original content that was cached. May be different * from the actual cache entry size due to (de)compression. * @param contentLength length of content */ public void setOriginalContentLength(long contentLength) { setLongKey(KEY_CONTENT_ORIGINAL_LENGTH, contentLength); } public long getLastModified() { return getLongKey(KEY_LAST_MODIFIED); } public void setLastModified(long modifyTime) { setLongKey(KEY_LAST_MODIFIED, modifyTime); } private long getLongKey(String key) { return getLongKey(key, 0); } private long getLongKey(String key, long defaultValue) { try { return Long.parseLong(properties.getProperty(key)); } catch (Exception ex) { OutputController.getLogger().log(ex); return defaultValue; } } private void setLongKey(String key, long value) { properties.setProperty(key, Long.toString(value)); } /** * Returns whether there is a version of the URL contents in * the cache and it is up to date. * * @param lastModified - current time as get from server (in ms). Mostly value of "Last-Modified" http header'? * @return whether the cache contains the version */ public boolean isCurrent(long lastModified) { boolean cached = isCached(); OutputController.getLogger().log("isCurrent:isCached " + cached); if (!cached) { return false; } try { long cachedModified = Long.parseLong(properties.getProperty(KEY_LAST_MODIFIED)); OutputController.getLogger().log("isCurrent:lastModified cache:" + cachedModified + " actual:" + lastModified); return lastModified > 0 && lastModified <= cachedModified; } catch (Exception ex){ OutputController.getLogger().log(ex); return cached; } } /** * Returns true if the cache has a local copy of the contents * of the URL matching the specified version string. * * @return true if the resource is in the cache */ public boolean isCached() { File localFile = getCacheFile(); if (!localFile.exists()) return false; try { long cachedLength = localFile.length(); String originalLength = properties.getProperty(KEY_CONTENT_ORIGINAL_LENGTH); if (originalLength != null) { cachedLength = Long.parseLong(originalLength); } long remoteLength = Long.parseLong(properties.getProperty(KEY_CONTENT_LENGTH, "-1")); OutputController.getLogger().log("isCached: remote:" + remoteLength + " cached:" + cachedLength); if (remoteLength >= 0 && cachedLength != remoteLength) return false; else return true; } catch (Exception ex) { OutputController.getLogger().log(ex); return false; // should throw? } } /** * Seam for testing */ File getCacheFile() { return CacheUtil.getCacheFile(location, version); } /** * Save the current information for the cache entry. * * @return True if successfuly stored into file, false otherwise */ protected boolean store() { if (properties.isHeldByCurrentThread()) { properties.store(); return true; } else { return false; } } /** * Mark this entry for deletion at shutdown. */ public void markForDelete() { // once marked it should not be unmarked. properties.setProperty("delete", Boolean.toString(true)); } /** * Lock cache item. */ protected void lock() { properties.lock(); } /** * Unlock cache item. Does not do anything if not holding the lock. */ protected void unlock() { properties.unlock(); } protected boolean tryLock() { return properties.tryLock(); } protected boolean isHeldByCurrentThread() { return properties.isHeldByCurrentThread(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/ResourceDownloader.java0000644000000000000000000000013213441742745025771 xustar0030 mtime=1552401893.032832837 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/ResourceDownloader.java0000644000175000002070000006336313441742745026614 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp.cache; import static net.sourceforge.jnlp.cache.Resource.Status.CONNECTED; import static net.sourceforge.jnlp.cache.Resource.Status.CONNECTING; import static net.sourceforge.jnlp.cache.Resource.Status.DOWNLOADED; import static net.sourceforge.jnlp.cache.Resource.Status.DOWNLOADING; import static net.sourceforge.jnlp.cache.Resource.Status.ERROR; import static net.sourceforge.jnlp.cache.Resource.Status.PRECONNECT; import static net.sourceforge.jnlp.cache.Resource.Status.PREDOWNLOAD; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.jar.JarOutputStream; import java.util.jar.Pack200; import java.util.zip.GZIPInputStream; import net.sourceforge.jnlp.DownloadOptions; import net.sourceforge.jnlp.OptionsDefinitions; import net.sourceforge.jnlp.Version; import net.sourceforge.jnlp.runtime.Boot; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.security.ConnectionFactory; import net.sourceforge.jnlp.security.SecurityDialogs; import net.sourceforge.jnlp.security.dialogs.InetSecurity511Panel; import net.sourceforge.jnlp.util.HttpUtils; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; public class ResourceDownloader implements Runnable { private final Resource resource; private final Object lock; public ResourceDownloader(Resource resource, Object lock) { this.resource = resource; this.lock = lock; } static int getUrlResponseCode(URL url, Map requestProperties, ResourceTracker.RequestMethods requestMethod) throws IOException { return getUrlResponseCodeWithRedirectonResult(url, requestProperties, requestMethod).result; } /** * Connects to the given URL, and grabs a response code and redirecton if * the URL uses the HTTP protocol, or returns an arbitrary valid HTTP * response code. * * @return the response code if HTTP connection and redirection value, or * HttpURLConnection.HTTP_OK and null if not. * @throws IOException */ static UrlRequestResult getUrlResponseCodeWithRedirectonResult(URL url, Map requestProperties, ResourceTracker.RequestMethods requestMethod) throws IOException { UrlRequestResult result = new UrlRequestResult(); URLConnection connection = ConnectionFactory.getConnectionFactory().openConnection(url); for (Map.Entry property : requestProperties.entrySet()) { connection.addRequestProperty(property.getKey(), property.getValue()); } if (connection instanceof HttpURLConnection) { HttpURLConnection httpConnection = (HttpURLConnection) connection; httpConnection.setRequestMethod(requestMethod.toString()); int responseCode = httpConnection.getResponseCode(); /* Fully consuming current request helps with connection re-use * See http://docs.oracle.com/javase/1.5.0/docs/guide/net/http-keepalive.html */ HttpUtils.consumeAndCloseConnectionSilently(httpConnection); result.result = responseCode; } Map> header = connection.getHeaderFields(); for (Map.Entry> entry : header.entrySet()) { OutputController.getLogger().log("Key : " + entry.getKey() + " ,Value : " + entry.getValue()); } /* * Do this only on 301,302,303(?)307,308> * Now setting value for all, and lets upper stack to handle it */ String possibleRedirect = connection.getHeaderField("Location"); if (possibleRedirect != null && possibleRedirect.trim().length() > 0) { result.URL = new URL(possibleRedirect); } ConnectionFactory.getConnectionFactory().disconnect(connection); result.lastModified = connection.getLastModified(); result.length = connection.getContentLengthLong(); return result; } @Override public void run() { if (resource.isSet(PRECONNECT) && !resource.hasFlags(EnumSet.of(ERROR, CONNECTING, CONNECTED))) { resource.changeStatus(EnumSet.noneOf(Resource.Status.class), EnumSet.of(CONNECTING)); resource.fireDownloadEvent(); // fire CONNECTING initializeResource(); } if (resource.isSet(PREDOWNLOAD) && !resource.hasFlags(EnumSet.of(ERROR, DOWNLOADING, DOWNLOADED))) { resource.changeStatus(EnumSet.noneOf(Resource.Status.class), EnumSet.of(DOWNLOADING)); resource.fireDownloadEvent(); // fire CONNECTING downloadResource(); } } private void initializeResource() { if (!JNLPRuntime.isOfflineForced() && resource.isConnectable()) { initializeOnlineResource(); } else { initializeOfflineResource(); } } private void initializeOnlineResource() { try { UrlRequestResult finalLocation = findBestUrl(resource); if (finalLocation != null) { initializeFromURL(finalLocation); } else { initializeOfflineResource(); } } catch (Exception e) { OutputController.getLogger().log(e); resource.changeStatus(EnumSet.noneOf(Resource.Status.class), EnumSet.of(ERROR)); synchronized (lock) { lock.notifyAll(); // wake up wait's to check for completion } resource.fireDownloadEvent(); // fire ERROR } } private void initializeFromURL(UrlRequestResult location) throws IOException { CacheEntry entry = new CacheEntry(resource.getLocation(), resource.getRequestVersion()); entry.lock(); try { resource.setDownloadLocation(location.URL); URLConnection connection = ConnectionFactory.getConnectionFactory().openConnection(location.URL); // this won't change so should be okay not-synchronized connection.addRequestProperty("Accept-Encoding", "pack200-gzip, gzip"); File localFile = CacheUtil.getCacheFile(resource.getLocation(), resource.getDownloadVersion()); Long size = location.length; if (size == null) { size = connection.getContentLengthLong(); } Long lm = location.lastModified; if (lm == null) { lm = connection.getLastModified(); } boolean current = CacheUtil.isCurrent(resource.getLocation(), resource.getRequestVersion(), lm) && resource.getUpdatePolicy() != UpdatePolicy.FORCE; if (!current) { if (entry.isCached()) { entry.markForDelete(); entry.store(); // Old entry will still exist. (but removed at cleanup) localFile = CacheUtil.makeNewCacheFile(resource.getLocation(), resource.getDownloadVersion()); CacheEntry newEntry = new CacheEntry(resource.getLocation(), resource.getRequestVersion()); newEntry.lock(); entry.unlock(); entry = newEntry; } } synchronized (resource) { resource.setLocalFile(localFile); // resource.connection = connection; resource.setSize(size); resource.changeStatus(EnumSet.of(PRECONNECT, CONNECTING), EnumSet.of(CONNECTED, PREDOWNLOAD)); // check if up-to-date; if so set as downloaded if (current) { resource.changeStatus(EnumSet.of(PREDOWNLOAD, DOWNLOADING), EnumSet.of(DOWNLOADED)); } } // update cache entry if (!current) { entry.setRemoteContentLength(size); entry.setLastModified(lm); } entry.setLastUpdated(System.currentTimeMillis()); try { //do not die here no metter of cost. Just metadata //is the path from user best to store? He can run some jnlp from temp which then be stored //on contrary, this downloads the jnlp, we actually do not have jnlp parsed during first interaction //in addition, downloaded name can be really nasty (some generated has from dynamic servlet.jnlp) //anjother issue is forking. If this (eg local) jnlp starts its second isntance, the url *can* be different //in contrary, usally si no. as fork is reusing all args, and only adding xmx/xms and xnofork. String jnlpPath = Boot.getOptionParser().getMainArg(); //get jnlp from args passed if (jnlpPath == null || jnlpPath.equals("")) { jnlpPath = Boot.getOptionParser().getParam(OptionsDefinitions.OPTIONS.JNLP); if (jnlpPath == null || jnlpPath.equals("")) { jnlpPath = Boot.getOptionParser().getParam(OptionsDefinitions.OPTIONS.HTML); if (jnlpPath == null || jnlpPath.equals("")) { OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "Not-setting jnlp-path for missing main/jnlp/html argument"); } else { entry.setJnlpPath(jnlpPath); } } else { entry.setJnlpPath(jnlpPath); } } else { entry.setJnlpPath(jnlpPath); } } catch (Exception ex){ OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); } entry.store(); synchronized (lock) { lock.notifyAll(); // wake up wait's to check for completion } resource.fireDownloadEvent(); // fire CONNECTED // explicitly close the URLConnection. ConnectionFactory.getConnectionFactory().disconnect(connection); } finally { entry.unlock(); } } private void initializeOfflineResource() { CacheEntry entry = new CacheEntry(resource.getLocation(), resource.getRequestVersion()); entry.lock(); try { File localFile = CacheUtil.getCacheFile(resource.getLocation(), resource.getDownloadVersion()); if (localFile != null && localFile.exists()) { long size = localFile.length(); synchronized (resource) { resource.setLocalFile(localFile); resource.setSize(size); resource.changeStatus(EnumSet.of(PREDOWNLOAD, DOWNLOADING), EnumSet.of(DOWNLOADED)); } } else { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "You are trying to get resource " + resource.getLocation().toExternalForm() + " but it is not in cache and could not be downloaded. Attempting to continue, but you may expect failure"); resource.changeStatus(EnumSet.noneOf(Resource.Status.class), EnumSet.of(ERROR)); } synchronized (lock) { lock.notifyAll(); // wake up wait's to check for completion } resource.fireDownloadEvent(); // fire CONNECTED or ERROR } finally { entry.unlock(); } } /** * Returns the 'best' valid URL for the given resource. This first adjusts * the file name to take into account file versioning and packing, if * possible. * * @param resource the resource * @return the best URL, or null if all failed to resolve */ protected UrlRequestResult findBestUrl(Resource resource) { DownloadOptions options = resource.getDownloadOptions(); if (options == null) { options = new DownloadOptions(false, false); } List urls = new ResourceUrlCreator(resource, options).getUrls(); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Finding best URL for: " + resource.getLocation() + " : " + options.toString()); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "All possible urls for " + resource.toString() + " : " + urls); for (ResourceTracker.RequestMethods requestMethod : ResourceTracker.RequestMethods.getValidRequestMethods()) { for (int i = 0; i < urls.size(); i++) { URL url = urls.get(i); try { Map requestProperties = new HashMap<>(); requestProperties.put("Accept-Encoding", "pack200-gzip, gzip"); UrlRequestResult response = getUrlResponseCodeWithRedirectonResult(url, requestProperties, requestMethod); if (response.result == 511) { if (!InetSecurity511Panel.isSkip()) { boolean result511 = SecurityDialogs.show511Dialogue(resource); if (!result511) { throw new RuntimeException("Terminated on users request after encauntering 'http 511 authentication'."); } //try again, what to do with original resource was nowhere specified i--; continue; } } if (response.shouldRedirect()) { if (response.URL == null) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Although " + resource.toString() + " got redirect " + response.result + " code for " + requestMethod + " request for " + url.toExternalForm() + " the target was null. Not following"); } else { OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Resource " + resource.toString() + " got redirect " + response.result + " code for " + requestMethod + " request for " + url.toExternalForm() + " adding " + response.URL.toExternalForm() + " to list of possible urls"); if (!JNLPRuntime.isAllowRedirect()) { throw new RedirectionException("The resource " + url.toExternalForm() + " is being redirected (" + response.result + ") to " + response.URL.toExternalForm() + ". This is disabled by default. If you wont to allow it, run javaws with -allowredirect parameter."); } urls.add(response.URL); } } else if (response.isInvalid()) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "For " + resource.toString() + " the server returned " + response.result + " code for " + requestMethod + " request for " + url.toExternalForm()); } else { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "best url for " + resource.toString() + " is " + url.toString() + " by " + requestMethod); if (response.URL == null) { response.URL = url; } return response; /* This is the best URL */ } } catch (IOException e) { // continue to next candidate OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "While processing " + url.toString() + " by " + requestMethod + " for resource " + resource.toString() + " got " + e + ": "); OutputController.getLogger().log(e); } } } /* No valid URL, return null */ return null; } private void downloadResource() { URLConnection connection = null; URL downloadFrom = resource.getDownloadLocation(); //Where to download from URL downloadTo = resource.getLocation(); //Where to download to try { connection = getDownloadConnection(downloadFrom); String contentEncoding = connection.getContentEncoding(); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Downloading " + downloadTo + " using " + downloadFrom + " (encoding : " + contentEncoding + ") "); boolean packgz = "pack200-gzip".equals(contentEncoding) || downloadFrom.getPath().endsWith(".pack.gz"); boolean gzip = "gzip".equals(contentEncoding); // It's important to check packgz first. If a stream is both // pack200 and gz encoded, then con.getContentEncoding() could // return ".gz", so if we check gzip first, we would end up // treating a pack200 file as a jar file. if (packgz) { downloadPackGzFile(resource, connection, new URL(downloadFrom + ".pack.gz"), downloadTo); } else if (gzip) { downloadGZipFile(resource, connection, new URL(downloadFrom + ".gz"), downloadTo); } else { downloadFile(resource, connection, downloadTo); } resource.changeStatus(EnumSet.of(DOWNLOADING), EnumSet.of(DOWNLOADED)); synchronized (lock) { lock.notifyAll(); // wake up wait's to check for completion } resource.fireDownloadEvent(); // fire DOWNLOADED } catch (Exception ex) { OutputController.getLogger().log(ex); resource.changeStatus(EnumSet.noneOf(Resource.Status.class), EnumSet.of(ERROR)); synchronized (lock) { lock.notifyAll(); } resource.fireDownloadEvent(); // fire ERROR } finally { if (connection != null) { ConnectionFactory.getConnectionFactory().disconnect(connection); } } } private URLConnection getDownloadConnection(URL location) throws IOException { URLConnection con = ConnectionFactory.getConnectionFactory().openConnection(location); con.addRequestProperty("Accept-Encoding", "pack200-gzip, gzip"); con.connect(); return con; } private void downloadPackGzFile(Resource resource, URLConnection connection, URL downloadFrom, URL downloadTo) throws IOException { downloadFile(resource, connection, downloadFrom); uncompressPackGz(downloadFrom, downloadTo, resource.getDownloadVersion()); storeEntryFields(new CacheEntry(downloadTo, resource.getDownloadVersion()), connection.getContentLength(), connection.getLastModified()); } private void downloadGZipFile(Resource resource, URLConnection connection, URL downloadFrom, URL downloadTo) throws IOException { downloadFile(resource, connection, downloadFrom); uncompressGzip(downloadFrom, downloadTo, resource.getDownloadVersion()); storeEntryFields(new CacheEntry(downloadTo, resource.getDownloadVersion()), connection.getContentLength(), connection.getLastModified()); } private void downloadFile(Resource resource, URLConnection connection, URL downloadLocation) throws IOException { CacheEntry downloadEntry = new CacheEntry(downloadLocation, resource.getDownloadVersion()); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Downloading file: " + downloadLocation + " into: " + downloadEntry.getCacheFile().getCanonicalPath()); if (!downloadEntry.isCurrent(connection.getLastModified())) { try { writeDownloadToFile(resource, downloadLocation, new BufferedInputStream(connection.getInputStream())); } catch (IOException ex) { String IH = "Invalid Http response"; if (ex.getMessage().equals(IH)) { OutputController.getLogger().log(ex); OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, "'" + IH + "' message detected. Attempting direct socket"); Object[] result = UrlUtils.loadUrlWithInvalidHeaderBytes(connection.getURL()); OutputController.getLogger().log("Header of: " + connection.getURL() + " (" + downloadLocation + ")"); String head = (String) result[0]; byte[] body = (byte[]) result[1]; OutputController.getLogger().log(head); OutputController.getLogger().log("Body is: " + body.length + " bytes long"); writeDownloadToFile(resource, downloadLocation, new ByteArrayInputStream(body)); } else { throw ex; } } } else { resource.setTransferred(CacheUtil.getCacheFile(downloadLocation, resource.getDownloadVersion()).length()); } storeEntryFields(downloadEntry, connection.getContentLengthLong(), connection.getLastModified()); } private void storeEntryFields(CacheEntry entry, long contentLength, long lastModified) { entry.lock(); try { entry.setRemoteContentLength(contentLength); entry.setLastModified(lastModified); entry.store(); } finally { entry.unlock(); } } private void writeDownloadToFile(Resource resource, URL downloadLocation, InputStream in) throws IOException { byte buf[] = new byte[1024]; int rlen; try (OutputStream out = CacheUtil.getOutputStream(downloadLocation, resource.getDownloadVersion())) { while (-1 != (rlen = in.read(buf))) { resource.incrementTransferred(rlen); out.write(buf, 0, rlen); } in.close(); } } private void uncompressGzip(URL compressedLocation, URL uncompressedLocation, Version version) throws IOException { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Extracting gzip: " + compressedLocation + " to " + uncompressedLocation); byte buf[] = new byte[1024]; int rlen; try (GZIPInputStream gzInputStream = new GZIPInputStream(new FileInputStream(CacheUtil .getCacheFile(compressedLocation, version)))) { InputStream inputStream = new BufferedInputStream(gzInputStream); BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(CacheUtil .getCacheFile(uncompressedLocation, version))); while (-1 != (rlen = inputStream.read(buf))) { outputStream.write(buf, 0, rlen); } outputStream.close(); inputStream.close(); } } private void uncompressPackGz(URL compressedLocation, URL uncompressedLocation, Version version) throws IOException { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Extracting packgz: " + compressedLocation + " to " + uncompressedLocation); try (GZIPInputStream gzInputStream = new GZIPInputStream(new FileInputStream(CacheUtil .getCacheFile(compressedLocation, version)))) { InputStream inputStream = new BufferedInputStream(gzInputStream); JarOutputStream outputStream = new JarOutputStream(new FileOutputStream(CacheUtil .getCacheFile(uncompressedLocation, version))); Pack200.Unpacker unpacker = Pack200.newUnpacker(); unpacker.unpack(inputStream, outputStream); outputStream.close(); inputStream.close(); } } /** * Complex wrapper around url request Contains return code (default is * HTTP_OK), length and last modified * * The storing of redirect target is quite obvious The storing length and * last modified may be not, but appearently * (http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=2591) the url * conenction is not always chaced as expected, and so another request may * be sent when length and lastmodified are checked * */ static class UrlRequestResult { //http response code int result = HttpURLConnection.HTTP_OK; URL URL; Long lastModified; Long length; public UrlRequestResult() { } public UrlRequestResult(URL URL) { this.URL = URL; } URL getURL() { return URL; } /** * @return whether the result code is redirect one. Rigth now 301-303 * and 307-308 */ public boolean shouldRedirect() { return (result == 301 || result == 302 || result == 303/*?*/ || result == 307 || result == 308); } /** * @return whether the return code is OK one - anything except <200,300) */ public boolean isInvalid() { return (result < 200 || result >= 300); } @Override public String toString() { return "" + "url: " + (URL == null ? "null" : URL.toExternalForm()) + "; " + "result:" + result + "; " + "lastModified: " + (lastModified == null ? "null" : lastModified.toString()) + "; " + "length: " + length == null ? "null" : length.toString() + "; "; } } private static class RedirectionException extends RuntimeException { public RedirectionException(String string) { super(string); } public RedirectionException(Throwable cause) { super(cause); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/PaxHeaders.7406/CachedDaemonThreadPoolProvider.java0000644000000000000000000000013213441742745030153 xustar0030 mtime=1552401893.031832839 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java0000644000175000002070000000655213441742745030773 0ustar00jvanekmock00000000000000/* Copyright (C) 2011 Red Hat, Inc This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.cache; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; public class CachedDaemonThreadPoolProvider { /** * This is copypasted default factory from java.util.concurrent.Executors. * The only difference is, that it creates daemon threads. * * Except creating new threads, the rest of class is complicated creation of * name. */ private static class DaemonThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private final String namePrefix; DaemonThreadFactory() { SecurityManager s = System.getSecurityManager(); group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = "itwpool-" + poolNumber.getAndIncrement() + "-itwthread-"; } @Override public Thread newThread(Runnable r) { Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); if (!t.isDaemon()) { t.setDaemon(true); } if (t.getPriority() != Thread.NORM_PRIORITY) { t.setPriority(Thread.NORM_PRIORITY); } return t; } } public static final ExecutorService DAEMON_THREAD_POOL = Executors.newCachedThreadPool(new DaemonThreadFactory()); } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/browser0000644000000000000000000000013113441742745021662 xustar0030 mtime=1552401893.049832802 29 atime=1552410887.11418344 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/browser/0000755000175000002070000000000013441742745022550 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/jnlp/browser/PaxHeaders.7406/BrowserAwareProxySelector.java0000644000000000000000000000013213441742745027751 xustar0030 mtime=1552401893.049832802 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/browser/BrowserAwareProxySelector.java0000644000175000002070000002361613441742745030571 0ustar00jvanekmock00000000000000/* BrowserAwareProxySelector.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browser; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.Proxy; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.JNLPProxySelector; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.PacEvaluator; import net.sourceforge.jnlp.runtime.PacEvaluatorFactory; import net.sourceforge.jnlp.util.logging.OutputController; /** * A ProxySelector which can read proxy settings from a browser's * configuration and use that. * * @see JNLPProxySelector */ public class BrowserAwareProxySelector extends JNLPProxySelector { /* firefox's constants */ public static final int BROWSER_PROXY_TYPE_NONE = 0; public static final int BROWSER_PROXY_TYPE_MANUAL = 1; public static final int BROWSER_PROXY_TYPE_PAC = 2; public static final int BROWSER_PROXY_TYPE_NONE2 = 3; /** use gconf, WPAD and then env (and possibly others)*/ public static final int BROWSER_PROXY_TYPE_AUTO = 4; /** use env variables */ public static final int BROWSER_PROXY_TYPE_SYSTEM = 5; private int browserProxyType = BROWSER_PROXY_TYPE_NONE; private URL browserAutoConfigUrl; /** Whether the http proxy should be used for http, https, ftp and socket protocols */ private Boolean browserUseSameProxy; private String browserHttpProxyHost; private int browserHttpProxyPort; private String browserHttpsProxyHost; private int browserHttpsProxyPort; private String browserFtpProxyHost; private int browserFtpProxyPort; private String browserSocks4ProxyHost; private int browserSocks4ProxyPort; private PacEvaluator browserProxyAutoConfig = null; /** * Create a new instance of this class, reading configuration fropm the browser */ public BrowserAwareProxySelector(DeploymentConfiguration config) { super(config); } public void initialize() { try { initFromBrowserConfig(); } catch (IOException e) { OutputController.getLogger().log(e); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, R("RProxyFirefoxNotFound")); browserProxyType = PROXY_TYPE_NONE; } } /** * Initialize configuration by reading preferences from the browser (firefox) */ private void initFromBrowserConfig() throws IOException { Map prefs = parseBrowserPreferences(); String type = prefs.get("network.proxy.type"); if (type != null) { browserProxyType = Integer.valueOf(type); } else { browserProxyType = BROWSER_PROXY_TYPE_AUTO; } try { String url = prefs.get("network.proxy.autoconfig_url"); if (url != null) { browserAutoConfigUrl = new URL(url); } } catch (MalformedURLException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } if (browserProxyType == BROWSER_PROXY_TYPE_PAC) { if (browserAutoConfigUrl != null) { browserProxyAutoConfig = PacEvaluatorFactory.getPacEvaluator(browserAutoConfigUrl); } } browserUseSameProxy = Boolean.valueOf(prefs.get("network.proxy.share_proxy_settings")); browserHttpProxyHost = prefs.get("network.proxy.http"); browserHttpProxyPort = stringToPort(prefs.get("network.proxy.http_port")); browserHttpsProxyHost = prefs.get("network.proxy.ssl"); browserHttpsProxyPort = stringToPort(prefs.get("network.proxy.ssl_port")); browserFtpProxyHost = prefs.get("network.proxy.ftp"); browserFtpProxyPort = stringToPort(prefs.get("network.proxy.ftp_port")); browserSocks4ProxyHost = prefs.get("network.proxy.socks"); browserSocks4ProxyPort = stringToPort(prefs.get("network.proxy.socks_port")); } Map parseBrowserPreferences() throws IOException { File preferencesFile = FirefoxPreferencesFinder.find(); FirefoxPreferencesParser parser = new FirefoxPreferencesParser(preferencesFile); parser.parse(); return parser.getPreferences(); } /** * Returns port inside a string. Unlike {@link Integer#valueOf(String)}, * it will not throw exceptions. * * @param string the string containing the integer to parse * @return the port inside the string, or Integer.MIN_VALUE */ private int stringToPort(String string) { try { return Integer.valueOf(string); } catch (NumberFormatException nfe) { return Integer.MIN_VALUE; } } /** *

    * The main entry point for {@link BrowserAwareProxySelector}. Based on * the browser settings, determines proxy information for a given URI. *

    *

    * The appropriate proxy may be determined by reading static information * from the browser's preferences file, or it may be computed dynamically, * by, for example, running javascript code. *

    */ @Override protected List getFromBrowser(URI uri) { List proxies = new ArrayList(); String optionDescription = null; switch (browserProxyType) { case BROWSER_PROXY_TYPE_PAC: proxies.addAll(getFromBrowserPAC(uri)); break; case BROWSER_PROXY_TYPE_MANUAL: proxies.addAll(getFromBrowserConfiguration(uri)); break; case BROWSER_PROXY_TYPE_NONE: proxies.add(Proxy.NO_PROXY); break; case BROWSER_PROXY_TYPE_AUTO: // firefox will do a whole lot of stuff to automagically // figure out the right settings. gconf, WPAD, and ENV are used. // https://bugzilla.mozilla.org/show_bug.cgi?id=66057#c32 // TODO this is probably not easy/quick to do. using libproxy might be // the simpler workaround if (optionDescription == null) { optionDescription = "Automatic"; } case BROWSER_PROXY_TYPE_SYSTEM: // means use $http_proxy, $ftp_proxy etc. // TODO implement env vars if possible if (optionDescription == null) { optionDescription = "System"; } default: if (optionDescription == null) { optionDescription = "Unknown"; } OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG,R("RProxyFirefoxOptionNotImplemented", browserProxyType, optionDescription)); proxies.add(Proxy.NO_PROXY); } OutputController.getLogger().log("Browser selected proxies: " + proxies.toString()); return proxies; } /** * Get an appropriate proxy for a given URI using a PAC specified in the * browser. */ private List getFromBrowserPAC(URI uri) { if (browserAutoConfigUrl == null || uri.getScheme().equals("socket")) { return Arrays.asList(new Proxy[] { Proxy.NO_PROXY }); } List proxies = new ArrayList(); try { String proxiesString = browserProxyAutoConfig.getProxies(uri.toURL()); proxies.addAll(getProxiesFromPacResult(proxiesString)); } catch (MalformedURLException e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); proxies.add(Proxy.NO_PROXY); } return proxies; } /** * Get an appropriate proxy for the given URI using static information from * the browser's preferences file. */ private List getFromBrowserConfiguration(URI uri) { return getFromArguments(uri, browserUseSameProxy, true, browserHttpsProxyHost, browserHttpsProxyPort, browserHttpProxyHost, browserHttpProxyPort, browserFtpProxyHost, browserFtpProxyPort, browserSocks4ProxyHost, browserSocks4ProxyPort); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/browser/PaxHeaders.7406/FirefoxPreferencesParser.java0000644000000000000000000000013213441742745027544 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/browser/FirefoxPreferencesParser.java0000644000175000002070000001362013441742745030356 0ustar00jvanekmock00000000000000/* FirefoxPreferencesParser.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browser; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.Map; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; /** *

    * A parser for Firefox's preferences file. It can 'parse' Firefox's * preferences file and expose the prefrences in a simple to use format. *

    * Sample usage: *
    
     * FirefoxPreferencesParser p = new FirefoxPreferencesParser(prefsFile);
     * p.parse();
     * Map<String,String> prefs = p.getPreferences();
     * System.out.println("blink allowed: " + prefs.get("browser.blink_allowed"));
     * 
    */ public final class FirefoxPreferencesParser { File prefsFile = null; Map prefs = null; /** * Creates a new FirefoxPreferencesParser * @param preferencesFile */ public FirefoxPreferencesParser(File preferencesFile) { prefsFile = preferencesFile; } /** * Parse the prefernces file * @throws IOException if an exception ocurrs while reading the * preferences file. */ public void parse() throws IOException { /* * The Firefox preference file is actually in javascript. It does seem * to be nicely formatted, so it should be possible to hack reading it. * The correct way of course is to use a javascript library and extract * the user_pref object */ prefs = new HashMap(); BufferedReader reader = new BufferedReader(new FileReader(prefsFile)); try { while (true) { String line = reader.readLine(); // end of stream if (line == null) { break; } line = line.trim(); if (line.startsWith("user_pref")) { /* * each line is of the form: user_pref("key",value); where value * can be a string in double quotes or an integer or float or * boolean */ boolean foundKey = false; boolean foundValue = false; // extract everything inside user_pref( and ); String pref = line.substring("user_pref(".length(), line.length() - 2); // key and value are separated by a , int firstCommaPos = pref.indexOf(','); if (firstCommaPos >= 1) { String key = pref.substring(0, firstCommaPos).trim(); if (key.startsWith("\"") && key.endsWith("\"")) { key = key.substring(1, key.length() - 1); if (key.trim().length() > 0) { foundKey = true; } } if (pref.length() > firstCommaPos + 1) { String value = pref.substring(firstCommaPos + 1).trim(); if (value.startsWith("\"") && value.endsWith("\"")) { value = value.substring(1, value.length() - 1).trim(); } foundValue = true; if (foundKey && foundValue) { //ItwLogger.getLogger().printOutLn("added (\"" + key + "\", \"" + value + "\")"); prefs.put(key, value); } } } } } } finally { reader.close(); } OutputController.getLogger().log("Read " + prefs.size() + " entries from Firefox's preferences"); } /** * Get the firefox preferences as a map (key,value pair). Note that * all values (including integers and booleans) are stored as a string, so * conversion to an appropriate type may be required. * * @return a map containing firefox' preferences */ public Map getPreferences() { HashMap newMap = new HashMap(); newMap.putAll(prefs); return newMap; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/browser/PaxHeaders.7406/FirefoxPreferencesFinder.java0000644000000000000000000000013213441742745027517 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/browser/FirefoxPreferencesFinder.java0000644000175000002070000001266613441742745030342 0ustar00jvanekmock00000000000000/* FirefoxPreferencesFinder.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp.browser; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; /** * Finds the file corresponding to firefox's (default) preferences file */ public class FirefoxPreferencesFinder { /** * Returns a file object representing firefox's preferences file * * @return a File object representing the preferences file. * @throws FileNotFoundException if the preferences file could not be found * @throws IOException if an exception occurs while trying to identify the * location of the preferences file. */ public static File find() throws IOException { String configPath = System.getProperty("user.home") + File.separator + ".mozilla" + File.separator + "firefox" + File.separator; if (JNLPRuntime.isWindows()) { Map env = System.getenv(); if (env != null) { String appdata = env.get("APPDATA"); if (appdata != null) { configPath = appdata + File.separator + "Mozilla" + File.separator + "Firefox" + File.separator; } } } String profilesPath = configPath + "profiles.ini"; if (!(new File(profilesPath).isFile())) { throw new FileNotFoundException(profilesPath); } OutputController.getLogger().log("Using firefox's profiles file: " + profilesPath); BufferedReader reader = new BufferedReader(new FileReader(profilesPath)); List linesInSection = new ArrayList(); boolean foundDefaultSection = false; /* * The profiles.ini file is an ini file. This is a quick hack to read * it. It is very likely to break given anything strange. */ // find the section with an entry Default=1 try { while (true) { String line = reader.readLine(); if (line == null) { break; } line = line.trim(); if (line.startsWith("[Profile") && line.endsWith("]")) { if (foundDefaultSection) { break; } // new section linesInSection = new ArrayList(); } else { linesInSection.add(line); int equalSignPos = line.indexOf('='); if (equalSignPos > 0) { String key = line.substring(0, equalSignPos).trim(); String value = line.substring(equalSignPos+1).trim(); if (key.toLowerCase().equals("default") && value.equals("1")) { foundDefaultSection = true; } } } } } finally { reader.close(); } if (!foundDefaultSection && linesInSection.size() == 0) { throw new FileNotFoundException("preferences file"); } String path = null; for (String line : linesInSection) { if (line.startsWith("Path=")) { path = line.substring("Path=".length()); } } if (path == null) { throw new FileNotFoundException("preferences file"); } else { String fullPath = configPath + path + File.separator + "prefs.js"; OutputController.getLogger().log("Found preferences file: " + fullPath); return new File(fullPath); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/UpdateDesc.java0000644000000000000000000000013113441742745023140 xustar0029 mtime=1552401893.02183286 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/UpdateDesc.java0000644000175000002070000000650513441742745023757 0ustar00jvanekmock00000000000000/* UpdateDesc.java Copyright (C) 2010 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; /** * Represents an 'update' element in a JNLP file. This element describes when to * check for updates and what actions to take if updates are available * * @see Check * @see Policy */ public class UpdateDesc { /** * Describes when/how long to check for updates. */ public enum Check { /** Always check for updates before launching the application */ ALWAYS, /** * Default. Check for updates until a certain timeout. If the update * check is not completed by timeout, launch the cached application and * continue updating in the background */ TIMEOUT, /** Check for application updates in the background */ BACKGROUND } /** * Describes what to do when the Runtime knows there is an applicatFion * update before the application is launched. */ public enum Policy { /** * Default. Always download updates without any user prompt and then launch the * application */ ALWAYS, /** * Prompt the user asking whether the user wants to download and run the * updated application or run the version in the cache */ PROMPT_UPDATE, /** * Prompts the user asking to download and run the latest version of the * application or abort running */ PROMPT_RUN, } private Check check; private Policy policy; public UpdateDesc(Check check, Policy policy) { this.check = check; this.policy = policy; } public Check getCheck() { return this.check; } public Policy getPolicy() { return this.policy; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/PluginParameterException.java0000644000000000000000000000013113441742745026075 xustar0029 mtime=1552401893.02183286 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/PluginParameterException.java0000644000175000002070000000346313441742745026714 0ustar00jvanekmock00000000000000/* Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; public class PluginParameterException extends RuntimeException { public PluginParameterException(String detail) { super(detail); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/Node.java0000644000000000000000000000013213441742745022005 xustar0030 mtime=1552401893.020832862 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/Node.java0000644000175000002070000001476113441742745022626 0ustar00jvanekmock00000000000000/* Node.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Objects; import net.sourceforge.nanoxml.XMLElement; // this class makes assumptions on how parser calls methods (such // as getFirstChild->getNextChild only called by a single loop at // a time, so no need for an iterator). /** * This class converts the NanoXML's XMLElement nodes into the * regular XML Node interface (for the methods used by Parser). */ /* NANO */ public class Node { private XMLElement xml; private Node next; private Node children[]; private List attributeNames= null; Node(XMLElement xml) { this.xml = xml; } Node getFirstChild() { if (children == null) { getChildNodes(); } if (children.length == 0) { return null; } else { return children[0]; } } Node getNextSibling() { return next; } void normalize() { } String getNodeValue() { return xml.getContent(); } Node[] getChildNodes() { if (children == null) { List list = new ArrayList(); for (Enumeration e = xml.enumerateChildren(); e.hasMoreElements();) { list.add(new Node(e.nextElement())); } children = list.toArray(new Node[list.size()]); for (int i = 0; i < children.length - 1; i++) { children[i].next = children[i + 1]; } } return children; } /** * To retrieve all attribute names * @return all attribute names of the Node in ArrayList */ List getAttributeNames() { if (attributeNames == null) { attributeNames= new ArrayList(); for (Enumeration e = xml.enumerateAttributeNames(); e.hasMoreElements();) { attributeNames.add(new String(e.nextElement())); } } return attributeNames; } String getAttribute(String name) { return (String) xml.getAttribute(name); } public ElementName getNodeName() { if (xml.getName() == null) { return new ElementName(""); } else { return new ElementName(xml.getName()); } } @Override public String toString() { return getNodeName().getOriginal(); } public static class ElementName { private final String base; public ElementName(String base) { this.base = base; } @Override public boolean equals(Object obj) { if (obj instanceof ElementName) { return ((ElementName) obj).base.equals(base); } else { return false; } } @Override public int hashCode() { return base.hashCode(); } public String getName() { if (base.contains(":")) { return base.split(":")[1]; } else { return base; } } public String getPrefix() { if (base.contains(":")) { return base.split(":")[0]; } else { return ""; } } private String getOriginal() { return base + "(" + getPrefix() + ":" + getName() + ")"; } } } /** * This class converts the TinyXML's ParsedXML nodes into the * regular XML Node interface (for the methods used by Parser). */ /* TINY class Node { private ParsedXML tinyNode; private Node next; private Node children[]; private String attributeNames[]; Node(ParsedXML tinyNode) { this.tinyNode = tinyNode; } Node getFirstChild() { if (children == null) getChildNodes(); if (children.length == 0) return null; else return children[0]; } Node getNextSibling() { return next; } void normalize() { } String getNodeValue() { return tinyNode.getContent(); } Node[] getChildNodes() { if (children == null) { List list = new ArrayList(); for (Enumeration e = tinyNode.elements(); e.hasMoreElements();) { list.add( new Node((ParsedXML)e.nextElement()) ); } children = (Node[]) list.toArray( new Node[list.size()] ); for (int i=0; i < children.length-1; i++) children[i].next = children[i+1]; } return children; } String getAttribute(String name) { return tinyNode.getAttribute(name); } String getNodeName() { if (tinyNode.getName() == null) return ""; else return tinyNode.getName(); } public String toString() { return getNodeName(); } } */ icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/LaunchHandler.java0000644000000000000000000000013213441742745023630 xustar0030 mtime=1552401893.020832862 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/LaunchHandler.java0000644000175000002070000000635313441742745024447 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import net.sourceforge.jnlp.runtime.*; /** * This optional interface is used to handle conditions that occur * while launching JNLP applications, applets, and installers. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.9 $ */ public interface LaunchHandler { /** * Called when the application could not be launched due to a * fatal error, such as the inability to find the main class or * non-parseable XML. * @param exception to be re-thrown as launch error */ public void launchError(LaunchException exception); /** * Called when launching the application can not be launched due * to an error that is not fatal. For example a JNLP file that * is not strictly correct yet does not necessarily prohibit the * system from attempting to launch the application. * * @param warning exception to be consummed as warning * @return true if the launch should continue, false to abort */ public boolean launchWarning(LaunchException warning); /** * Called when a security validation error occurs while * launching the application. * * @param error to be rethrown as launch error * @return true to allow the application to continue, false to stop it. */ public boolean validationError(LaunchException error); // this method will probably be replaced when real security // controller is in place. /** * Called when an application, applet or installer has been determined. * We have some very basic information about the application at this point, * but do not have everything required. This is a nice point to show the * splash screen. * * @param file the JNLP file of the instance that is starting */ public void launchInitialized(JNLPFile file); /** * Called when an application, applet or installer is ready to start. * Good point to hide the splash screen. * * @param application the application instance that is ready */ public void launchStarting(ApplicationInstance application); /** * Called when an application, applet, or installer has been * launched successfully (the main method or applet start method * returned normally). * * @param application the launched application instance */ public void launchCompleted(ApplicationInstance application); } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/JNLPCreator.java0000644000000000000000000000013213441742745023203 xustar0030 mtime=1552401893.019832864 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/JNLPCreator.java0000644000175000002070000000270213441742745024014 0ustar00jvanekmock00000000000000/* * Copyright 2012 Red Hat, Inc. * This file is part of IcedTea, http://icedtea.classpath.org * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sourceforge.jnlp; import java.io.IOException; import java.net.URL; import net.sourceforge.jnlp.cache.UpdatePolicy; public class JNLPCreator { public JNLPFile create(URL location, Version version, ParserSettings settings, UpdatePolicy policy, URL forceCodebase) throws IOException, ParseException { return new JNLPFile(location, version, settings, policy, forceCodebase); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/DefaultLaunchHandler.java0000644000000000000000000000013213441742745025135 xustar0030 mtime=1552401893.019832864 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/DefaultLaunchHandler.java0000644000175000002070000000575013441742745025754 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import net.sourceforge.jnlp.runtime.*; import net.sourceforge.jnlp.util.logging.OutputController; /** * This default implementation shows prints the exception to * stdout and if not in headless mode displays the exception in a * dialog. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.1 $ */ public class DefaultLaunchHandler extends AbstractLaunchHandler { public DefaultLaunchHandler(OutputController out) { super(out); } /** * Called when the application could not be launched due to a * fatal error, such as the inability to find the main class * or non-parseable XML. */ public void launchError(LaunchException exception) { printMessage(exception); } /** * Called when launching the application can not be launched * due to an error that is not fatal. For example a JNLP file * that is not strictly correct yet does not necessarily * prohibit the system from attempting to launch the * application. * * @return true if the launch should continue, false to abort */ public boolean launchWarning(LaunchException warning) { printMessage(warning); return true; } /** * Called when a security validation error occurs while * launching the application. * * @return true to allow the application to continue, false to stop it. */ public boolean validationError(LaunchException error) { printMessage(error); return true; } /** * Called when an application, applet, or installer has been * launched successfully (the main method or applet start method * returned normally). * * @param application the launched application instance */ public void launchCompleted(ApplicationInstance application) { // } /** * Do nothing on when initializing */ @Override public void launchInitialized(JNLPFile file) { // do nothing } /** * Do nothing when starting */ @Override public void launchStarting(ApplicationInstance application) { // do nothing } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/RelatedContentDesc.java0000644000000000000000000000013213441742745024632 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/RelatedContentDesc.java0000644000175000002070000000461513441742745025450 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.net.URL; public class RelatedContentDesc { /** title of the content */ private String title = null;; /** the description of the content */ private String description = null; /** the location of the content */ private URL location = null; /** the icon for this related content */ private IconDesc icon = null; /** * Create a related-content descriptor * @param href the url of the related content */ public RelatedContentDesc(URL href) { this.location = href; } /** * Set the title of this content * @param title the title of this content */ public void setTitle(String title) { this.title = title; } /** * @return the title of this content.. */ public String getTitle() { return title; } /** * Set the description of this related content * @param description to be set */ public void setDescription(String description) { this.description = description; } /** * @return the description of the related content */ public String getDescription() { return description; } /** * @return the location of the related content. Not null */ public URL getLocation() { return location; } /** * Set the icon for this related content * @param icon set to be used */ public void setIconDesc(IconDesc icon) { this.icon = icon; } /** * @return the icon descriptor for the realted content */ public IconDesc getIcon() { return icon; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/PackageDesc.java0000644000000000000000000000013213441742745023252 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/PackageDesc.java0000644000175000002070000000517113441742745024066 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; /** * The package element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.6 $ */ public class PackageDesc { /** the package name */ private final String name; /** the part required by the package */ private final String part; /** whether the package includes subpackages */ private final boolean recursive; /** * Create a package descriptor. * * @param name the package name * @param part the part required by the package * @param recursive whether the package includes subpackages */ public PackageDesc(String name, String part, boolean recursive) { this.name = name; this.part = part; this.recursive = recursive; } /** * @return whether the specified class is part of this package. * * @param className the fully qualified class name */ public boolean matches(String className) { // form 1: exact class if (name.equals(className)) return true; // form 2: package.* if (name.endsWith(".*")) { String pkName = name.substring(0, name.length() - 1); if (className.startsWith(pkName)) { String postfix = className.substring(pkName.length() + 1); if (recursive || -1 == postfix.indexOf(".")) return true; } } return false; } /** * @return the package name. */ public String getName() { return name; } /** * @return the part name. */ public String getPart() { return part; } /** * @return whether subpackages should be matched by this * package. */ public boolean isRecursive() { return recursive; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/MenuDesc.java0000644000000000000000000000013213441742745022623 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/MenuDesc.java0000644000175000002070000000231713441742745023436 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; public class MenuDesc { /** the submenu for this menu entry */ private final String subMenu; /** * Create a new menu descriptor * @param subMenu sub-menu of this menu if any or null. */ public MenuDesc(String subMenu) { this.subMenu = subMenu; } /** * @return the submenu for this menu entry. */ public String getSubMenu() { return subMenu; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/JNLPMatcherException.java0000644000000000000000000000013213441742745025046 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/JNLPMatcherException.java0000644000175000002070000000370713441742745025665 0ustar00jvanekmock00000000000000/* JNLPMatcherException.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; public class JNLPMatcherException extends Exception { private static final long serialVersionUID = 1L; public JNLPMatcherException(String message) { super(message); } public JNLPMatcherException(String message, Throwable cause) { super(message, cause); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/GuiLaunchHandler.java0000644000000000000000000000013213441742745024275 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/GuiLaunchHandler.java0000644000175000002070000001213313441742745025105 0ustar00jvanekmock00000000000000/* GuiLaunchHandler.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.net.URL; import net.sourceforge.swing.SwingUtils; import net.sourceforge.jnlp.cache.ResourceTracker; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.runtime.ApplicationInstance; import net.sourceforge.jnlp.util.BasicExceptionDialog; import net.sourceforge.jnlp.util.logging.OutputController; /** * A {@link LaunchHandler} that gives feedback to the user using GUI elements * including splash screens and exception dialogs. */ public class GuiLaunchHandler extends AbstractLaunchHandler { private volatile JNLPSplashScreen splashScreen = null; private final Object mutex = new Object(); private UpdatePolicy policy = UpdatePolicy.ALWAYS; public GuiLaunchHandler(OutputController outputStream) { super(outputStream); } @Override public void launchCompleted(ApplicationInstance application) { // do nothing } @Override public void launchError(final LaunchException exception) { BasicExceptionDialog.willBeShown(); SwingUtils.invokeLater(new Runnable() { @Override public void run() { closeSplashScreen(); BasicExceptionDialog.show(exception); } }); printMessage(exception); } private void closeSplashScreen() { synchronized (mutex) { if (splashScreen != null) { if (splashScreen.isSplashScreenValid()) { splashScreen.setVisible(false); splashScreen.stopAnimation(); } splashScreen.dispose(); } } } @Override public void launchStarting(ApplicationInstance application) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { closeSplashScreen(); } }); } @Override @SuppressWarnings("empty-statement") public void launchInitialized(final JNLPFile file) { int preferredWidth = 500; int preferredHeight = 400; final URL splashImageURL = file.getInformation().getIconLocation( IconDesc.SPLASH, preferredWidth, preferredHeight); final ResourceTracker resourceTracker = new ResourceTracker(true); if (splashImageURL != null) { resourceTracker.addResource(splashImageURL, file.getFileVersion(), null, policy); } synchronized (mutex) { SwingUtils.invokeAndWait(new Runnable() { @Override public void run() { splashScreen = new JNLPSplashScreen(resourceTracker, file); splashScreen.setSplashImageURL(splashImageURL); } }); } SwingUtils.invokeLater(new Runnable() { @Override public void run() { if (splashScreen != null) { synchronized (mutex) { if (splashScreen.isSplashScreenValid()) { splashScreen.setVisible(true); } } } } }); } @Override public boolean launchWarning(LaunchException warning) { printMessage(warning); return true; } @Override public boolean validationError(LaunchException error) { closeSplashScreen(); printMessage(error); return true; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/AbstractLaunchHandler.java0000644000000000000000000000013113441742745025313 xustar0029 mtime=1552401893.02183286 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/AbstractLaunchHandler.java0000644000175000002070000000575613441742745026141 0ustar00jvanekmock00000000000000/* AbstractLaunchHandler.java Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import net.sourceforge.jnlp.util.logging.OutputController; public abstract class AbstractLaunchHandler implements LaunchHandler { protected final OutputController logger; public AbstractLaunchHandler(OutputController logger) { this.logger = logger; } /** * Print a message * @param ex exception to be printed out */ protected void printMessage(LaunchException ex) { StringBuilder result = new StringBuilder(); result.append("netx: "); result.append(ex.getCategory()); if (ex.getSummary() != null) { result.append(": "); result.append(ex.getSummary()); } if (ex.getCause() != null) { result.append(recursiveDescription(ex.getCause())); } logger.log(OutputController.Level.MESSAGE_ALL, result.toString()); logger.log(ex); } private String recursiveDescription(Throwable throwable) { StringBuilder builder = new StringBuilder(); builder.append(" ("); builder.append(throwable.getMessage() == null ? "" : throwable.getMessage()); if (throwable.getCause() != null) { builder.append(recursiveDescription(throwable.getCause())); } builder.append(")"); return builder.toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/Version.java0000644000000000000000000000013213441742745022545 xustar0030 mtime=1552401893.028832846 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/Version.java0000644000175000002070000003034413441742745023361 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.util.*; import javax.swing.JOptionPane; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.util.logging.OutputController; /** *

    * A JNLP Version string in the form "1.2-3_abc" followed by an * optional + (includes all later versions) or * (matches any * suffixes on versions). More than one version can be included * in a string by separating them with spaces. *

    *

    * Version strings are divided by "._-" charecters into parts. * These parts are compared numerically if they can be parsed as * integers or lexographically as strings otherwise. If the * number of parts is different between two version strings then * the smaller one is padded with zero or the empty string. Note * that the padding in this version means that 1.2+ matches * 1.4.0-beta1, but may not in future versions. *

    * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.5 $ */ public class Version { /** * This is special case of version, used only for checking jre version. If * jre do not match, in strict not-headless mode the dialog with * confirrmation appears If jre do not match, in strict headless mode the * exception is thrown If jre match, or non-strict mode is run, then only * message is printed * */ public static class JreVersion extends Version { public static boolean warned = false; public JreVersion(String v, boolean strict) { this(v, strict, JNLPRuntime.isHeadless()); } /* * for testing purposes */ JreVersion(String v, boolean strict, boolean headless) { super(v); boolean match = matchesJreVersion(); if (!match) { String s = Translator.R("JREversionDontMatch", getJreVersion(), v); String e = "Strict run is deffined, and your JRE - " + getJreVersion() + " - dont match requested JRE(s) - " + v; if (strict) { if (!headless) { if (!warned) { int r = JOptionPane.showConfirmDialog(null, s + "\n" + Translator.R("JREContinueDialogSentence2"), Translator.R("JREContinueDialogSentenceTitle"), JOptionPane.YES_NO_OPTION); if (r == JOptionPane.NO_OPTION) { throw new RuntimeException(e); } warned = true; } } else { throw new RuntimeException(e); } } else { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, s); } } else { OutputController.getLogger().log("good - your JRE - " + getJreVersion() + " - match requested JRE - " + v); } } public boolean matchesJreVersion() { return matches(getJreVersion()); } private String getJreVersion() { return System.getProperty("java.version"); } } // to do: web start does not match versions with a "-" like // "1.4-beta1" using the + modifier, change to mimic that // behavior. // also refactor into Version and VersionID classes so that // individual version ids can be easily modified to add/remove // "*" and "+" modifiers. /** separates parts of a version string */ private static final String seperators = ".-_"; /** magic key for whether a version part was created due to normalization */ private static final String emptyString = new String(""); // not intern'ed /** contains all the versions matched */ private final String versionString; /** * Create a Version object based on a version string (ie, * "1.2.3+ 4.56*"). * @param versions string describing version */ public Version(String versions) { versionString = versions; } /** * @return true if the version represents a version-id (a * single version number such as 1.2) and false otherwise. */ public boolean isVersionId() { return -1 == versionString.indexOf(" "); } /** * @return true if all of this version's version-ids match one * or more of the specifed version's version-id. * * @param version a version string */ public boolean matches(String version) { return matches(new Version(version)); } /** * @return true if all of this version's version-ids match one * or more of the specifed version's version-id. * * @param version a Version object */ public boolean matches(Version version) { List versionStrings = version.getVersionStrings(); for (String versionString1 : versionStrings) { if (!this.matchesSingle(versionString1)) { return false; } } return true; } /** * @return true if any of this version's version-ids match one * or more of the specifed version's version-id. * * @param version a version string */ public boolean matchesAny(String version) { return matches(new Version(version)); } /** * @return true if any of this version's version-ids match one * or more of the specifed version's version-id. * * @param version a Version object */ public boolean matchesAny(Version version) { List versionStrings = version.getVersionStrings(); for (String versionString1 : versionStrings) { if (this.matchesSingle(versionString1)) { return true; } } return false; } /** * Returns whether a single version string is supported by this * Version. * * @param version a non-compound version of the form "1.2.3[+*]" */ private boolean matchesSingle(String version) { List versionStrings = this.getVersionStrings(); for (String versionString1 : versionStrings) { if (matches(version, versionString1)) { return true; } } return false; } /** * Returns whether a single version string is supported by * another single version string. * * @param subversion a non-compound version without "+" or "*" * @param version a non-compound version optionally with "+" or "*" */ private boolean matches(String subversion, String version) { List subparts = getParts(subversion); List parts = getParts(version); int maxLength = Math.max(subversion.length(), version.length()); if (version.endsWith("*")) // star means rest of parts irrelevant: truncate them maxLength = parts.size(); List> versions = new ArrayList<>(); versions.add(subparts); versions.add(parts); normalize(versions, maxLength); if (equal(subparts, parts)) return true; return version.endsWith("+") && greater(subparts, parts); } /** * @return whether the parts of one version are equal to the * parts of another version. * * @param parts1 normalized version parts * @param parts2 normalized version parts */ protected boolean equal(List parts1, List parts2) { for (int i = 0; i < parts1.size(); i++) { if (0 != compare(parts1.get(i), parts2.get(i))) return false; } return true; } /** * @return whether the parts of one version are greater than * the parts of another version. * * @param parts1 normalized version parts * @param parts2 normalized version parts */ protected boolean greater(List parts1, List parts2) { //if (true) return false; for (int i = 0; i < parts1.size(); i++) { // if part1 > part2 then it's a later version, so return true if (compare(parts1.get(i), parts2.get(i)) > 0) return true; // if part1 < part2 then it's a ealier version, so return false if (compare(parts1.get(i), parts2.get(i)) < 0) return false; // if equal go to next part } // all parts were equal return false; // not greater than } /** * Compares two parts of a version string, by value if both can * be interpreted as integers or lexically otherwise. If a part * is the result of normalization then it can be the Integer * zero or an empty string. * * Returns a value equivalent to part1.compareTo(part2); * * @param part1 a part of a version string * @param part2 a part of a version string * @return comparison of the two parts */ protected int compare(String part1, String part2) { Integer number1 = 0; Integer number2 = 0; // compare as integers // for normalization key, compare exact object, not using .equals try { if (!(part1 == emptyString)) // compare to magic normalization key number1 = Integer.valueOf(part1); if (!(part2 == emptyString)) // compare to magic normalization key number2 = Integer.valueOf(part2); return number1.compareTo(number2); } catch (NumberFormatException ex) { // means to compare as strings } if (part1 == emptyString) // compare to magic normalization key part1 = ""; if (part2 == emptyString) // compare to magic normalization key part2 = ""; return part1.compareTo(part2); } /** * Normalize version strings so that they contain the same * number of constituent parts. * * @param versions list array of parts of a version string * @param maxLength truncate lists to this maximum length */ protected void normalize(List> versions, int maxLength) { int length = 0; for (List vers : versions) length = Math.max(length, vers.size()); if (length > maxLength) length = maxLength; for (List vers : versions) { // remove excess elements while (vers.size() > length) vers.remove(vers.size() - 1); // add in empty pad elements while (vers.size() < length) vers.add(emptyString); } } /** * @return the individual version strings that make up a Version. */ protected List getVersionStrings() { ArrayList strings = new ArrayList<>(); StringTokenizer st = new StringTokenizer(versionString, " "); while (st.hasMoreTokens()) strings.add(st.nextToken()); return strings; } /** * @return the constituent parts of a version string. * * @param oneVersion a single version id string (not compound) */ protected List getParts(String oneVersion) { ArrayList strings = new ArrayList<>(); StringTokenizer st = new StringTokenizer(oneVersion, seperators + "+*"); while (st.hasMoreTokens()) { strings.add(st.nextToken()); } return strings; } @Override public String toString() { return versionString; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/PluginParameters.java0000644000000000000000000000013213441742745024402 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/PluginParameters.java0000644000175000002070000001753213441742745025222 0ustar00jvanekmock00000000000000/* PluginAppletAttributes -- Provides parsing for applet attributes Copyright (C) 2012 Red Hat This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.net.URL; import java.util.Collections; import java.util.HashMap; import java.util.Map; import static net.sourceforge.jnlp.runtime.Translator.R; /** * Represents plugin applet parameters, backed by a HashMap. */ public class PluginParameters { private final Map parameters; public PluginParameters(Map params) { this.parameters = createParameterTable(params); if (this.parameters.get("code") == null && this.parameters.get("object") == null //If code/object parameters are missing, we can still determine the main-class name from the jnlp file passed using jnlp_href && this.parameters.get("jnlp_href") == null) { throw new PluginParameterException(R("BNoCodeOrObjectApplet")); } } // Note, lower-case key expected public String get(String key) { return this.parameters.get(key); } public void put(String key, String value) { parameters.put(key.toLowerCase(), value); } public Map getUnmodifiableMap() { return Collections.unmodifiableMap(parameters); } public Map getUnderlyingMap() { return parameters; } public String getDefaulted(String key, String defaultStr) { String value = get(key); return (value != null) ? value : defaultStr; } public String getAppletTitle() { String name = get("name"); if (name == null) { return "Applet"; } else { return name + " applet"; } } public boolean useCodebaseLookup() { return Boolean.valueOf(getDefaulted("codebase_lookup", "true")); } public String getArchive() { return getDefaulted("archive", ""); } public String getJavaArchive() { return getDefaulted("java_archive", ""); } public String getJavaArguments() { return getDefaulted("java_arguments", ""); } public String getCacheArchive() { return getDefaulted("cache_archive", ""); } public String getCacheArchiveEx() { return getDefaulted("cache_archive_ex", ""); } public String getCacheOption() { return getDefaulted("cache_option", ""); } public String getCacheVersion() { return getDefaulted("cache_version", ""); } public String getCode() { return getDefaulted("code", ""); } public String getJNLPHref() { return get("jnlp_href"); } public String getJNLPEmbedded() { return get("jnlp_embedded"); } public String getJarFiles() { return getDefaulted("archive", ""); } public int getWidth() { String widthStr = getDefaulted("width", "0"); return Integer.valueOf(widthStr); } public int getHeight() { String heightStr = getDefaulted("height", "0"); return Integer.valueOf(heightStr); } public String getPermissions() { return get("permissions"); } public void updateSize(int width, int height) { parameters.put("width", Integer.toString(width)); parameters.put("height", Integer.toString(height)); } public String getUniqueKey(URL codebase) { /* According to http://download.oracle.com/javase/6/docs/technotes/guides/deployment/deployment-guide/applet-compatibility.html, * classloaders are shared iff these properties match: * codebase, cache_archive, java_archive, archive * * To achieve this, we create the uniquekey based on those 4 values, * always in the same order. The initial "=" parts ensure a * bad tag cannot trick the loader into getting shared with another. */ return "codebase=" + codebase.toExternalForm() + "cache_archive=" + getCacheArchive() + "java_archive=" + getJavaArchive() + "archive=" + getArchive(); } /** * Replace an attribute with its 'java_'-prefixed version. * Note that java_* aliases override older names: * http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/using_tags.html#in-nav */ static void ensureJavaPrefixTakesPrecedence(Map params, String attribute) { String javaPrefixAttribute = params.get("java_" + attribute); if (javaPrefixAttribute != null) { params.put(attribute, javaPrefixAttribute); } } /** * Creates the underlying hash table with the proper overrides. Ensure all * keys are lowercase consistently. * * @param rawParams the properties, before parameter aliasing rules. * @return the resulting parameter table */ static Map createParameterTable( Map rawParams) { Map params = new HashMap(); for (Map.Entry entry : rawParams.entrySet()) { String key = entry.getKey().toLowerCase(); String value = entry.getValue(); params.put(key, value); } String codeTag = params.get("code"); String classID = params.get("classid"); // If there is a classid and no code tag present, transform it to code tag if (codeTag == null && classID != null && !classID.startsWith("clsid:")) { codeTag = classID; params.put("code", codeTag); } // remove java: from code tag if (codeTag != null && codeTag.startsWith("java:")) { codeTag = codeTag.substring("java:".length()); params.put("code", codeTag); } // java_* aliases override older names: // http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/using_tags.html#in-nav ensureJavaPrefixTakesPrecedence(params, "code"); ensureJavaPrefixTakesPrecedence(params, "codebase"); ensureJavaPrefixTakesPrecedence(params, "archive"); ensureJavaPrefixTakesPrecedence(params, "object"); ensureJavaPrefixTakesPrecedence(params, "type"); return params; } public String toString() { return parameters.toString(); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/NullJnlpFileException.java0000644000000000000000000000013213441742745025335 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/NullJnlpFileException.java0000644000175000002070000000350013441742745026143 0ustar00jvanekmock00000000000000package net.sourceforge.jnlp; /* Copyright (C) 2012 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ public class NullJnlpFileException extends NullPointerException { public NullJnlpFileException() { super(); } public NullJnlpFileException(String s) { super(s); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/Launcher.java0000644000000000000000000000013113441742745022660 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/Launcher.java0000644000175000002070000011240213441742745023471 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import static net.sourceforge.jnlp.runtime.Translator.R; import java.applet.Applet; import java.applet.AppletStub; import java.awt.Container; import java.awt.SplashScreen; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Map; import net.sourceforge.jnlp.util.JarFile; import net.sourceforge.jnlp.cache.CacheUtil; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.runtime.AppletInstance; import net.sourceforge.jnlp.runtime.ApplicationInstance; import net.sourceforge.jnlp.runtime.JNLPClassLoader; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.services.InstanceExistsException; import net.sourceforge.jnlp.services.ServiceUtil; import javax.swing.text.html.parser.ParserDelegator; import net.sourceforge.jnlp.splashscreen.SplashUtils; import net.sourceforge.jnlp.util.StreamUtils; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.swing.SwingUtils; import sun.awt.SunToolkit; /** * Launches JNLPFiles either in the foreground or background. *

    * An optional LaunchHandler can be specified that is notified of * warning and error condition while launching and that indicates * whether a launch may proceed after a warning has occurred. If * specified, the LaunchHandler is notified regardless of whether * the file is launched in the foreground or background. *

    * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.22 $ */ public class Launcher { // defines class Launcher.BgRunner, Launcher.TgThread /** shared thread group */ /*package*/static final ThreadGroup mainGroup = new ThreadGroup(R("LAllThreadGroup")); /** the handler */ private LaunchHandler handler = null; /** the update policy */ private UpdatePolicy updatePolicy = JNLPRuntime.getDefaultUpdatePolicy(); /** whether to create an AppContext (if possible) */ private boolean context = true; /** If the application should call JNLPRuntime.exit on fatal errors */ private boolean exitOnFailure = true; private ParserSettings parserSettings = new ParserSettings(); private Map> extra = null; public static final String KEY_JAVAWS_LOCATION = "icedtea-web.bin.location"; /** * Create a launcher with the runtime's default update policy * and launch handler. */ private Launcher() { this(null, null); if (handler == null) { handler = JNLPRuntime.getDefaultLaunchHandler(); } } /** * Create a launcher with the runtime's default update policy * and launch handler. * * @param exitOnFailure Exit if there is an error (usually default, but false when being used from the plugin) */ public Launcher(boolean exitOnFailure) { this(null, null); if (handler == null) { handler = JNLPRuntime.getDefaultLaunchHandler(); } this.exitOnFailure = exitOnFailure; } /** * Create a launcher with the specified handler and the * runtime's default update policy. * * @param handler the handler to use or null for no handler. */ private Launcher(LaunchHandler handler) { this(handler, null); } /** * Create a launcher with an optional handler using the * specified update policy and launch handler. * * @param handler the handler to use or null for no handler. * @param policy the update policy to use or null for default policy. */ private Launcher(LaunchHandler handler, UpdatePolicy policy) { if (policy == null) policy = JNLPRuntime.getDefaultUpdatePolicy(); this.handler = handler; this.updatePolicy = policy; } /** * Sets the update policy used by launched applications. * @param policy to be used for resources */ public void setUpdatePolicy(UpdatePolicy policy) { if (policy == null) { throw new IllegalArgumentException(R("LNullUpdatePolicy")); } this.updatePolicy = policy; } /** * @return the update policy used when launching applications. */ public UpdatePolicy getUpdatePolicy() { return updatePolicy; } /** * Sets whether to launch the application in a new AppContext * (a separate event queue, look and feel, etc). If the * sun.awt.SunToolkit class is not present then this method * has no effect. The default value is true. * @param context appcontext to be set */ public void setCreateAppContext(boolean context) { this.context = context; } /** * @return whether applications are launched in their own * AppContext. */ public boolean isCreateAppContext() { return this.context; } /** * @param settings the parser settings to use when the Launcher initiates parsing of * a JNLP file. */ public void setParserSettings(ParserSettings settings) { parserSettings = settings; } /** * Set a map to use when trying to extract extra information, including * arguments, properties and parameters, to be merged into the main JNLP * @param input a map containing extra information to add to the main JNLP. * the values for keys "arguments", "parameters", and "properties" are * used. */ public void setInformationToMerge(Map> input) { this.extra = input; } /** * Launches a JNLP file by calling the launch method for the * appropriate file type. The application will be started in * a new window. * * @param file the JNLP file to launch * @return the application instance * @throws LaunchException if an error occurred while launching (also sent to handler) */ public ApplicationInstance launch(JNLPFile file) throws LaunchException { return launch(file, null); } /** * Launches a JNLP file inside the given container if it is an applet. Specifying a * container has no effect for Applcations and Installers. * * @param file the JNLP file to launch * @param cont the container in which to place the application, if it is an applet * @return the application instance * @throws LaunchException if an error occurred while launching (also sent to handler) */ public ApplicationInstance launch(JNLPFile file, Container cont) throws LaunchException { TgThread tg; mergeExtraInformation(file, extra); JNLPRuntime.markNetxRunning(); if (!JNLPRuntime.isOfflineForced()) { //Xoffline NOT specified //First checks whether offline-allowed tag is specified inside the jnlp file. if (!file.getInformation().isOfflineAllowed() && !JNLPRuntime.isOnlineDetected()) { { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Remote systems unreachable, and client application is not able to run offline. Exiting."); return null; } } } else { //Xoffline IS specified if (!file.getInformation().isOfflineAllowed() && !JNLPRuntime.isOnlineDetected()) { { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Remote systems unreachable, and client application is not able to run offline. However, you specified -Xoffline argument. Attmpting to run."); } } } if (file instanceof PluginBridge && cont != null) { tg = new TgThread(file, cont, true); } else if (cont == null) { tg = new TgThread(file); } else { tg = new TgThread(file, cont); } tg.start(); try { tg.join(); } catch (InterruptedException ex) { //By default, null is thrown here, and the message dialog is shown. throw launchWarning(new LaunchException(file, ex, R("LSMinor"), R("LCSystem"), R("LThreadInterrupted"), R("LThreadInterruptedInfo"))); } if (tg.getException() != null) { throw tg.getException(); } // passed to handler when first created if (handler != null) { handler.launchCompleted(tg.getApplication()); } return tg.getApplication(); } /** * Launches a JNLP file by calling the launch method for the * appropriate file type. * * @param location the URL of the JNLP file to launch * location to get the pristine version * @throws LaunchException if there was an exception * @return the application instance */ public ApplicationInstance launch(URL location) throws LaunchException { JNLPRuntime.saveHistory(location.toExternalForm()); return launch(fromUrl(location)); } /** * Merges extra information into the jnlp file * * @param file the JNLPFile * @param extra extra information to merge into the JNLP file * @throws LaunchException if an exception occurs while extracting * extra information */ private void mergeExtraInformation(JNLPFile file, Map> extra) throws LaunchException { if (extra == null) { return; } List properties = extra.get("properties"); if (properties != null) { addProperties(file, properties); } List arguments = extra.get("arguments"); if (arguments != null && file.isApplication()) { addArguments(file, arguments); } List parameters = extra.get("parameters"); if (parameters != null && file.isApplet()) { addParameters(file, parameters); } } /** * Add the properties to the JNLP file. * @throws LaunchException if an exception occurs while extracting * extra information */ private void addProperties(JNLPFile file, List props) throws LaunchException { ResourcesDesc resources = file.getResources(); for (String input : props) { try{ resources.addResource(PropertyDesc.fromString(input)); }catch (LaunchException ex){ throw launchError(ex); } } } /** * Add the params to the JNLP file; only call if file is * actually an applet file. * @throws LaunchException if an exception occurs while extracting * extra information */ private void addParameters(JNLPFile file, List params) throws LaunchException { AppletDesc applet = file.getApplet(); for (String input : params) { // allows empty param, not sure about validity of that. int equals = input.indexOf("="); if (equals == -1) { throw launchError(new LaunchException(R("BBadParam", input))); } String name = input.substring(0, equals); String value = input.substring(equals + 1, input.length()); applet.addParameter(name, value); } } /** * Add the arguments to the JNLP file; only call if file is * actually an application (not installer). */ private void addArguments(JNLPFile file, List args) { ApplicationDesc app = file.getApplication(); for (String input : args ) { app.addArgument(input); } } /** * Launches the JNLP file in a new JVM instance. * All streams are properly redirected. * * @param vmArgs the arguments to pass to the new JVM. Can be empty but * must not be null. * @param file the JNLP file to launch * @param javawsArgs the arguments to pass to the javaws command. Can be * an empty list but must not be null. * @throws LaunchException if there was an exception */ public void launchExternal(List vmArgs, JNLPFile file, List javawsArgs) throws LaunchException { List updatedArgs = new LinkedList(javawsArgs); if (file.getFileLocation() != null) { updatedArgs.add(file.getFileLocation().toString()); } else if (file.getSourceLocation() != null) { updatedArgs.add(file.getFileLocation().toString()); } else { launchError(new LaunchException(file, null, R("LSFatal"), R("LCExternalLaunch"), R("LNullLocation"), R("LNullLocationInfo"))); } launchExternal(vmArgs, updatedArgs); } /** * Launches the JNLP file in a new JVM instance. * All streams are properly redirected. * * @param url the URL of the JNLP file to launch * @throws LaunchException if there was an exception */ public void launchExternal(URL url) throws LaunchException { List javawsArgs = new LinkedList(); javawsArgs.add(url.toString()); launchExternal(new LinkedList(), javawsArgs); } /** * Launches the JNLP file at the specified location in a new JVM * instance. All streams are properly redirected. * @param vmArgs the arguments to pass to the jvm * @param javawsArgs the arguments to pass to javaws (aka Netx) * @throws LaunchException if there was an exception */ public void launchExternal(List vmArgs, List javawsArgs) throws LaunchException { try { List commands = new LinkedList<>(); // this property is set by the javaws launcher to point to the javaws binary String pathToWebstartBinary = System.getProperty(KEY_JAVAWS_LOCATION); commands.add(pathToWebstartBinary); // use -Jargument format to pass arguments to the JVM through the launcher for (String arg : vmArgs) { commands.add("-J" + arg); } commands.addAll(javawsArgs); String[] command = commands.toArray(new String[] {}); ProcessBuilder pb = new ProcessBuilder(command); pb.inheritIO(); Process p =pb.start(); StreamUtils.waitForSafely(p); } catch (NullPointerException ex) { throw launchError(new LaunchException(null, null, R("LSFatal"), R("LCExternalLaunch"), R("LNetxJarMissing"), R("LNetxJarMissingInfo"))); } catch (Exception ex) { throw launchError(new LaunchException(null, ex, R("LSFatal"), R("LCExternalLaunch"), R("LCouldNotLaunch"), R("LCouldNotLaunchInfo"))); } } /** * Returns the JNLPFile for the URL, with error handling. */ private JNLPFile fromUrl(URL location) throws LaunchException { try { JNLPFile file = new JNLPFile(location, parserSettings); boolean isLocal = false; boolean haveHref = false; if ("file".equalsIgnoreCase(location.getProtocol()) && new File(location.getFile()).exists()) { isLocal = true; } if (file.getSourceLocation() != null) { haveHref = true; } if (!isLocal && haveHref){ //this is case when remote file have href to different file if (!location.equals(file.getSourceLocation())){ //mark local true, so the folowing condition will be true and //new jnlp file will be downlaoded isLocal = true; //maybe this check is to strict, and will force redownlaod to often //another check can be just on jnlp name. But it will not work //if the href will be the file of same name, but on diferent path (or even domain) } } if (isLocal && haveHref) { JNLPFile fileFromHref = new JNLPFile(file.getSourceLocation(), parserSettings); if (fileFromHref.getCodeBase() == null) { fileFromHref.codeBase = file.getCodeBase(); } file = fileFromHref; } return file; } catch (Exception ex) { if (ex instanceof LaunchException) { throw (LaunchException) ex; // already sent to handler when first thrown } else { // IO and Parse throw launchError(new LaunchException(null, ex, R("LSFatal"), R("LCReadError"), R("LCantRead"), R("LCantReadInfo"))); } } } /** * Launches a JNLP application. This method should be called * from a thread in the application's thread group. * @param file jnlpfile - source of application * @return application to be launched * @throws net.sourceforge.jnlp.LaunchException if launch fails on unrecoverable exception */ protected ApplicationInstance launchApplication(JNLPFile file) throws LaunchException { if (!file.isApplication()) { throw launchError(new LaunchException(file, null, R("LSFatal"), R("LCClient"), R("LNotApplication"), R("LNotApplicationInfo"))); } try { try { ServiceUtil.checkExistingSingleInstance(file); } catch (InstanceExistsException e) { OutputController.getLogger().log("Single instance application is already running."); return null; } if (JNLPRuntime.getForksAllowed() && file.needsNewVM()) { if (!JNLPRuntime.isHeadless()){ SplashScreen sp = SplashScreen.getSplashScreen(); if (sp!=null) { sp.close(); } } List netxArguments = new LinkedList(); netxArguments.add("-Xnofork"); netxArguments.addAll(JNLPRuntime.getInitialArguments()); launchExternal(file.getNewVMArgs(), netxArguments); return null; } handler.launchInitialized(file); ApplicationInstance app = createApplication(file); app.initialize(); String mainName = file.getApplication().getMainClass(); // When the application-desc field is empty, we should take a // look at the main jar for the main class. if (mainName == null) { JARDesc mainJarDesc = file.getResources().getMainJAR(); File f = CacheUtil.getCacheFile(mainJarDesc.getLocation(), null); if (f != null) { JarFile mainJar = new JarFile(f); mainName = mainJar.getManifest(). getMainAttributes().getValue("Main-Class"); } } if (mainName == null) { throw launchError(new LaunchException(file, null, R("LSFatal"), R("LCClient"), R("LCantDetermineMainClass"), R("LCantDetermineMainClassInfo"))); } OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Starting application [" + mainName + "] ..."); Class mainClass = app.getClassLoader().loadClass(mainName); Method main = mainClass.getMethod("main", new Class[] { String[].class }); String args[] = file.getApplication().getArguments(); // create EDT within application context: SwingUtils.callOnAppContext(new Runnable() { // dummy method to force Event Dispatch Thread creation @Override public void run() { } }); setContextClassLoaderForAllThreads(app.getThreadGroup(), app.getClassLoader()); handler.launchStarting(app); main.setAccessible(true); OutputController.getLogger().log("Invoking main() with args: " + Arrays.toString(args)); main.invoke(null, new Object[] { args }); return app; } catch (LaunchException lex) { throw launchError(lex); } catch (Exception ex) { throw launchError(new LaunchException(file, ex, R("LSFatal"), R("LCLaunching"), R("LCouldNotLaunch"), R("LCouldNotLaunchInfo"))); } } /** * Set the classloader as the context classloader for all threads in * the given threadgroup. This is required to make some applications * work. For example, an application that provides a custom Swing LnF * may ask the swing thread to load resources from their JNLP, which * would only work if the Swing thread knows about the JNLPClassLoader. * * @param tg The threadgroup for which the context classloader should be set * @param classLoader the classloader to set as the context classloader */ private void setContextClassLoaderForAllThreads(ThreadGroup tg, ClassLoader classLoader) { /* be prepared for change in thread size */ int threadCountGuess = tg.activeCount(); Thread[] threads; do { threadCountGuess = threadCountGuess * 2; threads = new Thread[threadCountGuess]; tg.enumerate(threads, true); } while (threads[threadCountGuess - 1] != null); for (Thread thread : threads) { if (thread != null) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Setting " + classLoader + " as the classloader for thread " + thread.getName()); thread.setContextClassLoader(classLoader); } } } /** * Launches a JNLP applet. This method should be called from a * thread in the application's thread group. *

    * The enableCodeBase parameter adds the applet's codebase to * the locations searched for resources and classes. This can * slow down the applet loading but allows browser-style applets * that don't use JAR files exclusively to be run from a applet * JNLP file. If the applet JNLP file does not specify any * resources then the code base will be enabled regardless of * the specified value. *

    * * @param file the JNLP file * @param enableCodeBase whether to add the codebase URL to the classloader * @param cont container where to put application * @return application * @throws net.sourceforge.jnlp.LaunchException if deploy unrecoverably die */ protected ApplicationInstance launchApplet(JNLPFile file, boolean enableCodeBase, Container cont) throws LaunchException { if (!file.isApplet()) { throw launchError(new LaunchException(file, null, R("LSFatal"), R("LCClient"), R("LNotApplet"), R("LNotAppletInfo"))); } if (JNLPRuntime.getForksAllowed() && file.needsNewVM()) { if (!JNLPRuntime.isHeadless()) { SplashScreen sp = SplashScreen.getSplashScreen(); if (sp != null) { sp.close(); } } } if (handler != null) { handler.launchInitialized(file); } AppletInstance applet = null; try { ServiceUtil.checkExistingSingleInstance(file); applet = createApplet(file, enableCodeBase, cont); applet.initialize(); applet.getAppletEnvironment().startApplet(); // this should be a direct call to applet instance return applet; } catch (InstanceExistsException ieex) { OutputController.getLogger().log("Single instance applet is already running."); throw launchError(new LaunchException(file, ieex, R("LSFatal"), R("LCLaunching"), R("LCouldNotLaunch"), R("LSingleInstanceExists")), applet); } catch (LaunchException lex) { throw launchError(lex, applet); } catch (Exception ex) { throw launchError(new LaunchException(file, ex, R("LSFatal"), R("LCLaunching"), R("LCouldNotLaunch"), R("LCouldNotLaunchInfo")), applet); }finally{ if (handler != null) { handler.launchStarting(applet); } } } /** * Gets an ApplicationInstance, but does not launch the applet. * @param file the JNLP file * @param enableCodeBase whether to add the codebase URL to the classloader * @param cont container where to put applet * @return applet * @throws net.sourceforge.jnlp.LaunchException if deploy unrecoverably die */ protected ApplicationInstance getApplet(JNLPFile file, boolean enableCodeBase, Container cont) throws LaunchException { if (!file.isApplet()) { throw launchError(new LaunchException(file, null, R("LSFatal"), R("LCClient"), R("LNotApplet"), R("LNotAppletInfo"))); } AppletInstance applet = null; try { ServiceUtil.checkExistingSingleInstance(file); applet = createApplet(file, enableCodeBase, cont); applet.initialize(); return applet; } catch (InstanceExistsException ieex) { OutputController.getLogger().log("Single instance applet is already running."); throw launchError(new LaunchException(file, ieex, R("LSFatal"), R("LCLaunching"), R("LCouldNotLaunch"), R("LSingleInstanceExists")), applet); } catch (LaunchException lex) { throw launchError(lex, applet); } catch (Exception ex) { throw launchError(new LaunchException(file, ex, R("LSFatal"), R("LCLaunching"), R("LCouldNotLaunch"), R("LCouldNotLaunchInfo")), applet); } } /** * Launches a JNLP installer. This method should be called from * a thread in the application's thread group. * @param file jnlp file to read installer from * @return application * @throws net.sourceforge.jnlp.LaunchException if deploy unrecoverably die */ protected ApplicationInstance launchInstaller(JNLPFile file) throws LaunchException { // TODO Check for an existing single instance once implemented. // ServiceUtil.checkExistingSingleInstance(file); throw launchError(new LaunchException(file, null, R("LSFatal"), R("LCNotSupported"), R("LNoInstallers"), R("LNoInstallersInfo"))); } /** * Create an AppletInstance. * * @param file the JNLP file * @param enableCodeBase whether to add the codebase URL to the classloader * @param cont container where to put applet * @return applet * @throws net.sourceforge.jnlp.LaunchException if deploy unrecoverably die */ //FIXME - when multiple applets are on one page, this method is visited simultaneously //and then appelts creates in little bit strange manner. This issue is visible with //randomly showing/notshowing spalshscreens. //See also PluginAppletViewer.framePanel protected AppletInstance createApplet(JNLPFile file, boolean enableCodeBase, Container cont) throws LaunchException { AppletInstance appletInstance = null; try { JNLPClassLoader loader = JNLPClassLoader.getInstance(file, updatePolicy, enableCodeBase); if (enableCodeBase) { loader.enableCodeBase(); } else if (file.getResources().getJARs().length == 0) { throw new ClassNotFoundException("Can't do a codebase look up and there are no jars. Failing sooner rather than later"); } ThreadGroup group = Thread.currentThread().getThreadGroup(); // appletInstance is needed by ServiceManager when looking up // services. This could potentially be done in applet constructor // so initialize appletInstance before creating applet. if (cont == null) { appletInstance = new AppletInstance(file, group, loader, null); } else { appletInstance = new AppletInstance(file, group, loader, null, cont); } /** * Due to PR2968, moved to earlier phase, so early stages of appelt * can access Thread.currentThread().getContextClassLoader(). * * However it is notable, that init and start still do not have access to right classloader. * See LoadResources test. */ setContextClassLoaderForAllThreads(appletInstance.getThreadGroup(), appletInstance.getClassLoader()); loader.setApplication(appletInstance); // Initialize applet now that ServiceManager has access to its // appletInstance. String appletName = file.getApplet().getMainClass(); Class appletClass = loader.loadClass(appletName); Applet applet = (Applet) appletClass.newInstance(); applet.setStub((AppletStub)cont); // Finish setting up appletInstance. appletInstance.setApplet(applet); appletInstance.getAppletEnvironment().setApplet(applet); return appletInstance; } catch (Exception ex) { throw launchError(new LaunchException(file, ex, R("LSFatal"), R("LCInit"), R("LInitApplet"), R("LInitAppletInfo")), appletInstance); } } /** * Creates an Applet object from a JNLPFile. This is mainly to be used with * gcjwebplugin. * @param file the PluginBridge to be used. * @param enableCodeBase whether to add the code base URL to the classloader. * @param cont container where to put applet * @return applet * @throws net.sourceforge.jnlp.LaunchException if deploy unrecoverably dien */ protected Applet createAppletObject(JNLPFile file, boolean enableCodeBase, Container cont) throws LaunchException { try { JNLPClassLoader loader = JNLPClassLoader.getInstance(file, updatePolicy, enableCodeBase); if (enableCodeBase) { loader.enableCodeBase(); } else if (file.getResources().getJARs().length == 0) { throw new ClassNotFoundException("Can't do a codebase look up and there are no jars. Failing sooner rather than later"); } String appletName = file.getApplet().getMainClass(); Class appletClass = loader.loadClass(appletName); Applet applet = (Applet) appletClass.newInstance(); return applet; } catch (Exception ex) { throw launchError(new LaunchException(file, ex, R("LSFatal"), R("LCInit"), R("LInitApplet"), R("LInitAppletInfo"))); } } /** * Creates an Application. * @param file the JNLP file * @return application * @throws net.sourceforge.jnlp.LaunchException if deploy unrecoverably die */ protected ApplicationInstance createApplication(JNLPFile file) throws LaunchException { try { JNLPClassLoader loader = JNLPClassLoader.getInstance(file, updatePolicy, false); ThreadGroup group = Thread.currentThread().getThreadGroup(); ApplicationInstance app = new ApplicationInstance(file, group, loader); loader.setApplication(app); return app; } catch (Exception ex) { throw new LaunchException(file, ex, R("LSFatal"), R("LCInit"), R("LInitApplication"), R("LInitApplicationInfo")); } } /** * Create a thread group for the JNLP file. * @param file the JNLP file * Note: if the JNLPFile is an applet (ie it is a subclass of PluginBridge) * then this method simply returns the existing ThreadGroup. The applet * ThreadGroup has to be created at an earlier point in the applet code. * @return ThreadGroup for this app/applet */ protected ThreadGroup createThreadGroup(JNLPFile file) { final ThreadGroup tg; if (file instanceof PluginBridge) { tg = Thread.currentThread().getThreadGroup(); } else { tg = new ThreadGroup(mainGroup, file.getTitle()); } return tg; } /** * Send n launch error to the handler, if set, and also to the * caller. */ private LaunchException launchError(LaunchException ex) { return launchError(ex, null); } private LaunchException launchError(LaunchException ex, AppletInstance applet) { if (applet != null) { SplashUtils.showErrorCaught(ex, applet); } if (handler != null) { handler.launchError(ex); } return ex; } /** * Send a launch error to the handler, if set, and to the * caller only if the handler indicated that the launch should * continue despite the warning. * * @return an exception to throw if the launch should be aborted, or null otherwise */ private LaunchException launchWarning(LaunchException ex) { if (handler != null) { if (!handler.launchWarning(ex)) // no need to destroy the app b/c it hasn't started return ex; } // chose to abort return null; // chose to continue, or no handler } /** * Do hacks on per-application level to allow different AppContexts to work * * @see JNLPRuntime#doMainAppContextHacks */ private static void doPerApplicationAppContextHacks() { /* * With OpenJDK6 (but not with 7) a per-AppContext dtd is maintained. * This dtd is created by the ParserDelgate. However, the code in * HTMLEditorKit (used to render HTML in labels and textpanes) creates * the ParserDelegate only if there are no existing ParserDelegates. The * result is that all other AppContexts see a null dtd. */ new ParserDelegator(); } /** * This runnable is used to call the appropriate launch method * for the application, applet, or installer in its thread group. */ private class TgThread extends Thread { // ThreadGroupThread private JNLPFile file; private ApplicationInstance application; private LaunchException exception; private Container cont; private boolean isPlugin = false; TgThread(JNLPFile file) { this(file, null); } TgThread(JNLPFile file, Container cont) { super(createThreadGroup(file), file.getTitle()); this.file = file; this.cont = cont; } TgThread(JNLPFile file, Container cont, boolean isPlugin) { super(createThreadGroup(file), file.getTitle()); this.file = file; this.cont = cont; this.isPlugin = isPlugin; } @Override public void run() { try { // Do not create new AppContext if we're using NetX and icedteaplugin. // The plugin needs an AppContext too, but it has to be created earlier. if (context && !isPlugin) { SunToolkit.createNewAppContext(); } doPerApplicationAppContextHacks(); if (isPlugin) { // Do not display download indicators if we're using gcjwebplugin. JNLPRuntime.setDefaultDownloadIndicator(null); application = getApplet(file, ((PluginBridge)file).codeBaseLookup(), cont); } else { if (file.isApplication()) { application = launchApplication(file); } else if (file.isApplet()) { application = launchApplet(file, true, cont); } // enable applet code base else if (file.isInstaller()) { application = launchInstaller(file); } else { throw launchError(new LaunchException(file, null, R("LSFatal"), R("LCClient"), R("LNotLaunchable"), R("LNotLaunchableInfo"))); } } } catch (LaunchException ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); exception = ex; // Exit if we can't launch the application. if (exitOnFailure) { JNLPRuntime.exit(1); } } catch (Throwable ex) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ex); throw new RuntimeException(ex); } } public LaunchException getException() { return exception; } public ApplicationInstance getApplication() { return application; } }; } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/JNLPFile.java0000644000000000000000000000013213441742745022463 xustar0030 mtime=1552401893.025832852 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/JNLPFile.java0000644000175000002070000012631113441742745023277 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.io.File; import java.io.FileInputStream; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.jar.Attributes; import net.sourceforge.jnlp.SecurityDesc.RequestedPermissionLevel; import net.sourceforge.jnlp.cache.ResourceTracker; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.runtime.JNLPClassLoader; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.ClasspathMatcher; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; import static net.sourceforge.jnlp.runtime.Translator.R; /** *

    * Provides methods to access the information in a Java Network * Launching Protocol (JNLP) file. The Java Network Launching * Protocol specifies in an XML file the information needed to * load, cache, and run Java code over the network and in a secure * environment. *

    *

    * This class represents the overall information about a JNLP file * from the jnlp element. Other information is accessed through * objects that represent the elements of a JNLP file * (information, resources, application-desc, etc). References to * these objects are obtained by calling the getInformation, * getResources, getSecurity, etc methods. *

    * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.21 $ */ public class JNLPFile { public static enum ManifestBoolean { TRUE, FALSE, UNDEFINED; } // todo: save the update policy, then if file was not updated // then do not check resources for being updated. // // todo: make getLaunchInfo return a superclass that all the // launch types implement (can get codebase from it). // // todo: currently does not filter resources by jvm version. // /** the location this JNLP file was created from */ protected URL sourceLocation = null; /** the network location of this JNLP file */ protected URL fileLocation; /** the ParserSettings which were used to parse this file */ protected ParserSettings parserSettings = null; /** A key that uniquely identifies connected instances (main jnlp+ext) */ protected String uniqueKey = null; /** the URL used to resolve relative URLs in the file */ protected URL codeBase; /** file version */ protected Version fileVersion; /** spec version */ protected Version specVersion; /** information */ protected List info; protected UpdateDesc update; /** resources */ protected List resources; /** additional resources not in JNLP file (from command line) */ protected ResourcesDesc sharedResources = new ResourcesDesc(this, null, null, null); /** the application description */ protected LaunchDesc launchType; /** the component description */ protected ComponentDesc component; /** the security descriptor */ protected SecurityDesc security; /** the default JVM locale */ protected Locale defaultLocale = null; /** the default OS */ protected String defaultOS = null; /** the default arch */ protected String defaultArch = null; /** A signed JNLP file is missing from the main jar */ private boolean missingSignedJNLP = false; /** JNLP file contains special properties */ private boolean containsSpecialProperties = false; /** * List of acceptable properties (not-special) */ final private String[] generalProperties = SecurityDesc.getJnlpRIAPermissions(); /** important manifests' attributes */ private final ManifestsAttributes manifestsAttributes = new ManifestsAttributes(); public static final String TITLE_NOT_FOUND = "Application title was not found in manifest. Check with application vendor"; { // initialize defaults if security allows try { defaultLocale = Locale.getDefault(); defaultOS = System.getProperty("os.name"); defaultArch = System.getProperty("os.arch"); } catch (SecurityException ex) { // null values will still work, and app can set defaults later } } static enum Match { LANG_COUNTRY_VARIANT, LANG_COUNTRY, LANG, GENERALIZED } /** * Empty stub, allowing child classes to override the constructor */ protected JNLPFile() { } /** * Create a JNLPFile from a URL. * * @param location the location of the JNLP file * @throws IOException if an IO exception occurred * @throws ParseException if the JNLP file was invalid */ public JNLPFile(URL location) throws IOException, ParseException { this(location, new ParserSettings()); } /** * Create a JNLPFile from a URL checking for updates using the * default policy. * * @param location the location of the JNLP file * @param settings the parser settings to use while parsing the file * @throws IOException if an IO exception occurred * @throws ParseException if the JNLP file was invalid */ public JNLPFile(URL location, ParserSettings settings) throws IOException, ParseException { this(location, (Version) null, settings); } /** * Create a JNLPFile from a URL and a Version checking for updates using * the default policy. * * @param location the location of the JNLP file * @param version the version of the JNLP file * @param settings the parser settings to use while parsing the file * @throws IOException if an IO exception occurred * @throws ParseException if the JNLP file was invalid */ public JNLPFile(URL location, Version version, ParserSettings settings) throws IOException, ParseException { this(location, version, settings, JNLPRuntime.getDefaultUpdatePolicy()); } /** * Create a JNLPFile from a URL and a version, checking for updates * using the specified policy. * * @param location the location of the JNLP file * @param version the version of the JNLP file * @param settings the {@link ParserSettings} to use when parsing the {@code location} * @param policy the update policy * @throws IOException if an IO exception occurred * @throws ParseException if the JNLP file was invalid */ public JNLPFile(URL location, Version version, ParserSettings settings, UpdatePolicy policy) throws IOException, ParseException { this(location, version, settings, policy, null); } /** * Create a JNLPFile from a URL and a version, checking for updates * using the specified policy. * * @param location the location of the JNLP file * @param version the version of the JNLP file * @param settings the parser settings to use while parsing the file * @param policy the update policy * @param forceCodebase codebase to use if not specified in JNLP file. * @throws IOException if an IO exception occurred * @throws ParseException if the JNLP file was invalid */ protected JNLPFile(URL location, Version version, ParserSettings settings, UpdatePolicy policy, URL forceCodebase) throws IOException, ParseException { InputStream input = openURL(location, version, policy); this.parserSettings = settings; parse(input, location, forceCodebase); //Downloads the original jnlp file into the cache if possible //(i.e. If the jnlp file being launched exist locally, but it //originated from a website, then download the one from the website //into the cache). if (sourceLocation != null && "file".equals(location.getProtocol())) { openURL(sourceLocation, version, policy); } this.fileLocation = location; this.uniqueKey = Calendar.getInstance().getTimeInMillis() + "-" + ((int)(Math.random()*Integer.MAX_VALUE)) + "-" + location; OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "UNIQUEKEY=" + this.uniqueKey); } /** * Create a JNLPFile from a URL, parent URLm a version and checking for * updates using the specified policy. * * @param location the location of the JNLP file * @param uniqueKey A string that uniquely identifies connected instances * @param version the version of the JNLP file * @param settings the parser settings to use while parsing the file * @param policy the update policy * @throws IOException if an IO exception occurred * @throws ParseException if the JNLP file was invalid */ public JNLPFile(URL location, String uniqueKey, Version version, ParserSettings settings, UpdatePolicy policy) throws IOException, ParseException { this(location, version, settings, policy); this.uniqueKey = uniqueKey; OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "UNIQUEKEY (override) =" + this.uniqueKey); } /** * Create a JNLPFile from an input stream. * * @param input input stream from which create jnlp file * @param settings settings of parser * @throws ParseException if the JNLP file was invalid */ public JNLPFile(InputStream input, ParserSettings settings) throws ParseException { this.parserSettings = settings; parse(input, null, null); } /** * Create a JNLPFile from an input stream. * * @param input input stream of JNLP file. * @param codebase codebase to use if not specified in JNLP file.. * @param settings the {@link ParserSettings} to use when parsing * @throws ParseException if the JNLP file was invalid */ public JNLPFile(InputStream input, URL codebase, ParserSettings settings) throws ParseException { this.parserSettings = settings; parse(input, null, codebase); } /** * Open the jnlp file URL from the cache if there, otherwise * download to the cache. * Unless file is find in cache, this method blocks until it is downloaded. * This is the best way in itw how to download and cache file * @param location of resource to open * @param version of resource * @param policy update policy of resource * @return opened streamfrom given url * @throws java.io.IOException if something goes wrong */ public static InputStream openURL(URL location, Version version, UpdatePolicy policy) throws IOException { if (location == null || policy == null) throw new IllegalArgumentException(R("NullParameter")); try { ResourceTracker tracker = new ResourceTracker(false); // no prefetch tracker.addResource(location, version, null, policy); File f = tracker.getCacheFile(location); return new FileInputStream(f); } catch (Exception ex) { throw new IOException(ex); } } /** * @return the JNLP file's best localized title. This method returns the same * value as InformationDesc.getTitle(). * * Since jdk7 u45, also manifest title, and mainclass are taken to consideration; * See PluginBridge */ public String getTitle() { try { return getTitle(false); } catch (MissingTitleException cause) { throw new RuntimeException(cause); } } public String getTitle(boolean kill) throws MissingTitleException { String title = getTitleImpl(); if (title == null) { title = ""; } if (title.trim().isEmpty() && kill) { throw new MissingTitleException(); } if (title.trim().isEmpty()) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("PMissingElement", R("PMissingTitle"))); title = R("PMissingMandatorySubstitution", R("PMissingTitle")); OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("PMissingMandatoryWarning", R("PMissingTitle")) + ": " + title); } else { OutputController.getLogger().log("Acceptable title tag found, contains: " + title); } return title; } private String getTitleImpl() { String jnlpTitle = getTitleFromJnlp(); String manifestTitle = getTitleFromManifest(); if (jnlpTitle != null && manifestTitle != null) { if (jnlpTitle.equals(manifestTitle)) { return jnlpTitle; } return jnlpTitle + " (" + manifestTitle + ")"; } if (jnlpTitle != null && manifestTitle == null) { return jnlpTitle; } if (jnlpTitle == null && manifestTitle != null) { return manifestTitle; } String mainClass = getManifestsAttributes().getMainClass(); return mainClass; } /** * @return the JNLP file's best localized title. This method returns the * same value as InformationDesc.getTitle(). */ public String getTitleFromJnlp() { return getInformation().getTitle(); } public String getTitleFromManifest() { String inManifestTitle = getManifestsAttributes().getApplicationName(); if (inManifestTitle == null && getManifestsAttributes().isLoader()) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, TITLE_NOT_FOUND); } return inManifestTitle; } /** * @return the JNLP file's best localized vendor. This method returns the * same value as InformationDesc.getVendor(). */ public String getVendor() { try { return getVendor(false); } catch (MissingVendorException cause) { throw new RuntimeException(cause); } } public String getVendor(boolean kill) throws MissingVendorException { String vendor = getVendorImpl(); if (vendor == null) { vendor = ""; } if (vendor.trim().isEmpty() && kill) { throw new MissingVendorException(); } if (vendor.trim().isEmpty()) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("PMissingElement", R("PMissingVendor"))); vendor = R("PMissingMandatorySubstitution", R("PMissingVendor")); OutputController.getLogger().log(OutputController.Level.WARNING_ALL, R("PMissingMandatoryWarning", R("PMissingVendor")) + ": " + vendor); } else { OutputController.getLogger().log("Acceptable vendor tag found, contains: " + vendor); } return vendor; } private String getVendorImpl() { return getInformation().getVendor(); } /** * @return the JNLP file's network location as specified in the * JNLP file. */ public URL getSourceLocation() { return sourceLocation; } /** * @return the location of the file parsed to create the JNLP * file, or null if it was not created from a URL. */ public URL getFileLocation() { return fileLocation; } /** * @return the location of the parent file if it exists, null otherwise */ public String getUniqueKey() { return uniqueKey; } /** * @return the ParserSettings that was used to parse this file */ public ParserSettings getParserSettings() { return parserSettings; } /** * @return the JNLP file's version. */ public Version getFileVersion() { return fileVersion; } /** * @return the specification version required by the file. */ public Version getSpecVersion() { return specVersion; } /** * @return the codebase URL for the JNLP file. */ public URL getCodeBase() { return codeBase; } /** * It is not recommended to use this method for internals of itw - use normal getCodeBase rather, as null is expected always except toString calls. * * If you are not sure, use getCodeBase and chek null as you need. See that this method is used mostly for xtendedAppletSecuriyty dialogs. * * @return the codebase URL for the JNLP file or url of location of calling file (jnlp, hreffed jnlp, or directly html) */ public URL getNotNullProbalbeCodeBase() { if (getCodeBase()!=null){ return getCodeBase(); } try { return UrlUtils.removeFileName(getSourceLocation()); } catch (Exception ex) { OutputController.getLogger().log(ex); } return getSourceLocation(); } /** * @return the information section of the JNLP file as viewed * through the default locale. */ public InformationDesc getInformation() { return getInformation(defaultLocale); } /** * @param locale preferred locale of informations * @return the information section of the JNLP file as viewed * through the specified locale. */ public InformationDesc getInformation(final Locale locale) { boolean strict = false; if (this.info != null) { for (InformationDesc infoDesc : this.info) { if (infoDesc.strict) { strict = true; break; } } } return new InformationDesc(new Locale[] { locale }, strict) { @Override protected List getItems(Object key) { List result = new ArrayList<>(); for (Match precision : Match.values()) { for (InformationDesc infoDesc : JNLPFile.this.info) { if (localeMatches(locale, infoDesc.getLocales(), precision)) { result.addAll(infoDesc.getItems(key)); } } if (result.size() > 0) { return result; } } return result; } @Override public String getTitle() { for (Match precision : Match.values()) { for (InformationDesc infoDesc : JNLPFile.this.info) { String title = infoDesc.getTitle(); if (localeMatches(locale, infoDesc.getLocales(), precision) && title != null && !"".equals(title)) { return title; } } } return null; } @Override public String getVendor() { for (Match precision : Match.values()) { for (InformationDesc infoDesc : JNLPFile.this.info) { String vendor = infoDesc.getVendor(); if (localeMatches(locale, infoDesc.getLocales(), precision) && vendor != null && !"".equals(vendor)) { return vendor; } } } return null; } }; } /** * @return the update section of the JNLP file. */ public UpdateDesc getUpdate() { return update; } /** * @return the security section of the JNLP file. */ public SecurityDesc getSecurity() { return security; } public RequestedPermissionLevel getRequestedPermissionLevel() { return this.security.getRequestedPermissionLevel(); } /** * @return the resources section of the JNLP file as viewed * through the default locale and the os.name and os.arch * properties. */ public ResourcesDesc getResources() { return getResources(defaultLocale, defaultOS, defaultArch); } /** * @param locale preferred locale of resource * @param os preferred os of resource * @param arch preferred arch of resource * @return the resources section of the JNLP file for the * specified locale, os, and arch. */ public ResourcesDesc getResources(final Locale locale, final String os, final String arch) { return new ResourcesDesc(this, new Locale[] { locale }, new String[] { os }, new String[] { arch }) { @Override public List getResources(Class launchType) { List result = new ArrayList<>(); for (ResourcesDesc rescDesc : resources) { boolean hasUsableLocale = false; for (Match match : Match.values()) { hasUsableLocale |= localeMatches(locale, rescDesc.getLocales(), match); } if (hasUsableLocale && stringMatches(os, rescDesc.getOS()) && stringMatches(arch, rescDesc.getArch())) { List ll = rescDesc.getResources(launchType); result.addAll(ll); } else { //those are skipped } } result.addAll(sharedResources.getResources(launchType)); return result; } @Override public void addResource(Object resource) { // todo: honor the current locale, os, arch values sharedResources.addResource(resource); } }; } /** * @return the resources section of the JNLP file as viewed * through the default locale and the os.name and os.arch * properties. * XXX: Before overriding this method or changing its implementation, * read the comment in JNLPFile.getDownloadOptionsForJar(JARDesc). */ public ResourcesDesc[] getResourcesDescs() { return getResourcesDescs(defaultLocale, defaultOS, defaultArch); } /** * @param locale preferred locale of resource * @param os preferred os of resource * @param arch preferred arch of resource * @return the resources section of the JNLP file for the * specified locale, os, and arch. */ public ResourcesDesc[] getResourcesDescs(final Locale locale, final String os, final String arch) { List matchingResources = new ArrayList<>(); for (ResourcesDesc rescDesc: resources) { boolean hasUsableLocale = false; for (Match match : Match.values()) { hasUsableLocale |= localeMatches(locale, rescDesc.getLocales(), match); } if (hasUsableLocale && stringMatches(os, rescDesc.getOS()) && stringMatches(arch, rescDesc.getArch())) { matchingResources.add(rescDesc); } } return matchingResources.toArray(new ResourcesDesc[0]); } /** * @return an object of one of the following types: AppletDesc, * ApplicationDesc and InstallerDesc */ public LaunchDesc getLaunchInfo() { return launchType; } /** * @return the launch information for an applet. * * @throws UnsupportedOperationException if there is no applet information */ public AppletDesc getApplet() { if (!isApplet()) throw new UnsupportedOperationException(R("JNotApplet")); return (AppletDesc) launchType; } /** * @return the launch information for an application. * * @throws UnsupportedOperationException if there is no application information */ public ApplicationDesc getApplication() { if (!isApplication()) throw new UnsupportedOperationException(R("JNotApplication")); return (ApplicationDesc) launchType; } /** * @return the launch information for a component. * * @throws UnsupportedOperationException if there is no component information */ public ComponentDesc getComponent() { if (!isComponent()) throw new UnsupportedOperationException(R("JNotComponent")); return component; } /** * @return the launch information for an installer. * * @throws UnsupportedOperationException if there is no installer information */ public InstallerDesc getInstaller() { if (!isInstaller()) throw new UnsupportedOperationException(R("NotInstaller")); return (InstallerDesc) launchType; } /** * @return whether the lauch descriptor describes an Applet. */ public boolean isApplet() { return launchType instanceof AppletDesc; } /** * @return whether the lauch descriptor describes an Application. */ public boolean isApplication() { return launchType instanceof ApplicationDesc; } /** * @return whether the lauch descriptor describes a Component. */ public boolean isComponent() { return component != null; } /** * @return whether the lauch descriptor describes an Installer. */ public boolean isInstaller() { return launchType instanceof InstallerDesc; } /** * Sets the default view of the JNLP file returned by * getInformation, getResources, etc. If unset, the defaults * are the properties os.name, os.arch, and the locale returned * by Locale.getDefault(). * @param os preferred os of resource * @param arch preferred arch of resource * @param locale preferred locale of resource */ public void setDefaults(String os, String arch, Locale locale) { defaultOS = os; defaultArch = arch; defaultLocale = locale; } /** * Returns whether a locale is matched by one of more other * locales. Only the non-empty language, country, and variant * codes are compared; for example, a requested locale of * Locale("","","") would always return true. * * @param requested the requested locale * @param available the available locales * @param matchLevel the depth with which to match locales. * @return {@code true} if {@code requested} matches any of {@code available}, or if * {@code available} is empty or {@code null}. * @see Locale * @see Match */ public boolean localeMatches(Locale requested, Locale[] available, Match matchLevel) { if (matchLevel == Match.GENERALIZED) return available == null || available.length == 0; String language = requested.getLanguage(); // "" but never null String country = requested.getCountry(); String variant = requested.getVariant(); for (Locale locale : available) { switch (matchLevel) { case LANG: if (!language.isEmpty() && language.equals(locale.getLanguage()) && locale.getCountry().isEmpty() && locale.getVariant().isEmpty()) return true; break; case LANG_COUNTRY: if (!language.isEmpty() && language.equals(locale.getLanguage()) && !country.isEmpty() && country.equals(locale.getCountry()) && locale.getVariant().isEmpty()) return true; break; case LANG_COUNTRY_VARIANT: if (language.equals(locale.getLanguage()) && country.equals(locale.getCountry()) && variant.equals(locale.getVariant())) return true; break; default: break; } } return false; } /** * @return whether the string is a prefix for any of the strings * in the specified array. * * @param prefixStr the prefix string * @param available the strings to test * @return true if prefixStr is a prefix of any strings in * available, or if available is empty or null. */ static boolean stringMatches(String prefixStr, String available[]) { if (available == null || available.length == 0){ return true; } for (String candidate : available) { String trimmedPrefix = null; if (prefixStr != null) { trimmedPrefix = prefixStr.split("\\s+")[0]; } String trimmedCandidate = null; if (candidate != null) { trimmedCandidate = candidate.split("\\s+")[0]; } if (trimmedCandidate != null && trimmedCandidate.startsWith(trimmedPrefix)) { return true; } } return false; } /** * Initialize the JNLPFile fields. Private because it's called * from the constructor. * * @param location the file location or {@code null} */ private void parse(InputStream input, URL location, URL forceCodebase) throws ParseException { try { //if (location != null) // location = new URL(location, "."); // remove filename Node root = Parser.getRootNode(input, parserSettings); Parser parser = new Parser(this, location, root, parserSettings, forceCodebase); // true == allow extensions // JNLP tag information specVersion = parser.getSpecVersion(); fileVersion = parser.getFileVersion(); codeBase = parser.getCodeBase(); sourceLocation = parser.getFileLocation() != null ? parser.getFileLocation() : location; info = parser.getInfo(root); parser.checkForInformation(); update = parser.getUpdate(root); resources = parser.getResources(root, false); // false == not a j2se/java resources section launchType = parser.getLauncher(root); component = parser.getComponent(root); security = parser.getSecurity(root); checkForSpecialProperties(); } catch (ParseException ex) { throw ex; } catch (Exception ex) { OutputController.getLogger().log(ex); throw new RuntimeException(ex.toString()); } } /** * Inspects the JNLP file to check if it contains any special properties */ private void checkForSpecialProperties() { for (ResourcesDesc res : resources) { for (PropertyDesc propertyDesc : res.getProperties()) { for (int i = 0; i < generalProperties.length; i++) { String property = propertyDesc.getKey(); if (property.equals(generalProperties[i])) { break; } else if (!property.equals(generalProperties[i]) && i == generalProperties.length - 1) { containsSpecialProperties = true; return; } } } } } /** * * @return true if the JNLP file specifies things that can only be * applied on a new vm (eg: different max heap memory) */ public boolean needsNewVM() { return !getNewVMArgs().isEmpty(); } /** * @return a list of args to pass to the new * JVM based on this JNLP file */ public List getNewVMArgs() { List newVMArgs = new LinkedList<>(); JREDesc[] jres = getResources().getJREs(); for (JREDesc jre : jres) { String initialHeapSize = jre.getInitialHeapSize(); if (initialHeapSize != null) { newVMArgs.add("-Xms" + initialHeapSize); } String maxHeapSize = jre.getMaximumHeapSize(); if (maxHeapSize != null) { newVMArgs.add("-Xmx" + maxHeapSize); } String vmArgsFromJre = jre.getVMArgs(); if (vmArgsFromJre != null) { String[] args = vmArgsFromJre.split(" "); newVMArgs.addAll(Arrays.asList(args)); } } return newVMArgs; } /** * @return the download options to use for downloading jars listed in this jnlp file. */ public DownloadOptions getDownloadOptions() { boolean usePack = false; boolean useVersion = false; ResourcesDesc desc = getResources(); if (Boolean.valueOf(desc.getPropertiesMap().get("jnlp.packEnabled"))) { usePack = true; } if (Boolean.valueOf(desc.getPropertiesMap().get("jnlp.versionEnabled"))) { useVersion = true; } return new DownloadOptions(usePack, useVersion); } /** * Returns a boolean after determining if a signed JNLP warning should be * displayed in the 'More Information' panel. * * @return true if a warning should be displayed; otherwise false */ public boolean requiresSignedJNLPWarning() { return (missingSignedJNLP && containsSpecialProperties); } /** * Informs that a signed JNLP file is missing in the main jar */ public void setSignedJNLPAsMissing() { missingSignedJNLP = true; } public ManifestsAttributes getManifestsAttributes() { return manifestsAttributes; } public class ManifestsAttributes { public static final String APP_NAME = "Application-Name"; public static final String CALLER_ALLOWABLE = "Caller-Allowable-Codebase"; public static final String APP_LIBRARY_ALLOWABLE = "Application-Library-Allowable-Codebase"; public static final String PERMISSIONS = "Permissions"; public static final String CODEBASE = "Codebase"; public static final String TRUSTED_ONLY = "Trusted-Only"; public static final String TRUSTED_LIBRARY = "Trusted-Library"; public static final String ENTRY_POINT="Entry-Point"; private JNLPClassLoader loader; public void setLoader(JNLPClassLoader loader) { this.loader = loader; } public boolean isLoader() { return loader != null; } /** * main class can be defined outside of manifest. * This method is mostly for completeness * @return main-class as it is specified in application */ public String getMainClass(){ if (loader == null) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Jars not ready to provide main class"); return null; } return loader.getMainClass(); } /** * * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html#entry_pt * @return values of Entry-Points attribute */ public String[] getEntryPoints() { return splitEntryPoints(getEntryPointString()); } public String getEntryPointString() { return getAttribute(ENTRY_POINT); } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#app_name * @return value of Application-Name manifest attribute */ public String getApplicationName(){ return getAttribute(APP_NAME); } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#caller_allowable * @return values of Caller-Allowable-Codebase manifest attribute */ public ClasspathMatcher.ClasspathMatchers getCallerAllowableCodebase() { return getCodeBaseMatchersAttribute(CALLER_ALLOWABLE, false); } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#app_library * @return values of Application-Library-Allowable-Codebase manifest attribute */ public ClasspathMatcher.ClasspathMatchers getApplicationLibraryAllowableCodebase() { return getCodeBaseMatchersAttribute(APP_LIBRARY_ALLOWABLE, true); } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#codebase * @return values of Codebase manifest attribute */ public ClasspathMatcher.ClasspathMatchers getCodebase() { return getCodeBaseMatchersAttribute(CODEBASE, false); } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#trusted_only * @return value of Trusted-Only manifest attribute */ public ManifestBoolean isTrustedOnly() { return processBooleanAttribute(TRUSTED_ONLY); } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#trusted_library * @return value of Trusted-Library manifest attribute */ public ManifestBoolean isTrustedLibrary() { return processBooleanAttribute(TRUSTED_LIBRARY); } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#permissions * @return value of Permissions manifest attribute */ public ManifestBoolean isSandboxForced() { String s = getAttribute(PERMISSIONS); if (s == null) { return ManifestBoolean.UNDEFINED; } else if (s.trim().equalsIgnoreCase(SecurityDesc.RequestedPermissionLevel.SANDBOX.toHtmlString())) { return ManifestBoolean.TRUE; } else if (s.trim().equalsIgnoreCase(SecurityDesc.RequestedPermissionLevel.ALL.toHtmlString())) { return ManifestBoolean.FALSE; } else { throw new IllegalArgumentException("Unknown value of " + PERMISSIONS + " attribute " + s + ". Expected "+SecurityDesc.RequestedPermissionLevel.SANDBOX.toHtmlString()+" or "+SecurityDesc.RequestedPermissionLevel.ALL.toHtmlString()); } } /** * http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#permissions * @return plain string values of Permissions manifest attribute */ public String permissionsToString() { String s = getAttribute(PERMISSIONS); if (s == null) { return "Not defined"; } else if (s.trim().equalsIgnoreCase(SecurityDesc.RequestedPermissionLevel.SANDBOX.toHtmlString())) { return s.trim(); } else if (s.trim().equalsIgnoreCase(SecurityDesc.RequestedPermissionLevel.ALL.toHtmlString())) { return s.trim(); } else { return "illegal"; } } /** * get custom attribute. */ String getAttribute(String name) { return getAttribute(new Attributes.Name(name)); } /** * get standard attribute * @param name name of the manifest attribute to find in application * @return plain attribute value */ public String getAttribute(Attributes.Name name) { if (loader == null) { OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Jars not ready to provide attribute " + name); return null; } return loader.checkForAttributeInJars(Arrays.asList(getResources().getJARs()), name); } public ClasspathMatcher.ClasspathMatchers getCodeBaseMatchersAttribute(String s, boolean includePath) { return getCodeBaseMatchersAttribute(new Attributes.Name(s), includePath); } public ClasspathMatcher.ClasspathMatchers getCodeBaseMatchersAttribute(Attributes.Name name, boolean includePath) { String s = getAttribute(name); if (s == null) { return null; } return ClasspathMatcher.ClasspathMatchers.compile(s, includePath); } private ManifestBoolean processBooleanAttribute(String id) throws IllegalArgumentException { String s = getAttribute(id); if (s == null) { return ManifestBoolean.UNDEFINED; } else { s = s.toLowerCase().trim(); switch (s) { case "true": return ManifestBoolean.TRUE; case "false": return ManifestBoolean.FALSE; default: throw new IllegalArgumentException("Unknown value of " + id + " attribute " + s + ". Expected true or false"); } } } } public String createJnlpVendorValue() { final String location; if (getSourceLocation() != null) { location = getSourceLocation().toString(); } else if (getCodeBase() != null) { location = getCodeBase().toString(); } else { location = "unknown"; } return location; } public String createJnlpVendor() { return "Generated from applet from " + createJnlpVendorValue(); } private String createJnlpTitleValue() { final String location; if (getSourceLocation() != null) { location = new File(getSourceLocation().getFile()).getName(); } else if (getCodeBase() != null) { location = new File(getCodeBase().getFile()).getName(); } else { location = "unknown"; } return location; } public String createJnlpTitle() { //case when creating name from already created name String shortenedTitle = getTitle(); int i = shortenedTitle.lastIndexOf("("); if (i >= 2) { // not cutting immidiately... shortenedTitle = shortenedTitle.substring(0, i - 1); } if (createJnlpTitleValue().startsWith(shortenedTitle)) { return createJnlpTitleValue(); } return getTitle() + " from " + createJnlpTitleValue(); } public String createNameForDesktopFile() { String basicTitle = getTitle(); if (basicTitle == null || basicTitle.trim().isEmpty()) { return createJnlpTitleValue().replaceAll(".jnlp$",""); } else { return basicTitle; } } //not private for testing purposes static String[] splitEntryPoints(String entryPointString) { if (entryPointString == null || entryPointString.trim().isEmpty()) { return null; } String[] result = entryPointString.trim().split("\\s+"); if (result.length == 0) { return null; } return result; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/DownloadOptions.java0000644000000000000000000000013213441742745024243 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/DownloadOptions.java0000644000175000002070000000436213441742745025060 0ustar00jvanekmock00000000000000/* DownloadOptions.java Copyright (C) 2011 Red Hat, Inc This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; public class DownloadOptions { private final boolean usePack200; private final boolean useVersion; public DownloadOptions(boolean usePack, boolean useVersion) { this.usePack200 = usePack; this.useVersion = useVersion; } public boolean useExplicitPack() { return usePack200; } public boolean useExplicitVersion() { return useVersion; } @Override public String toString() { return "DownloadOptions[use pack: " + usePack200 + "; use version: " + useVersion + "]"; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/ShortcutDesc.java0000644000000000000000000000013213441742745023532 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/ShortcutDesc.java0000644000175000002070000001072213441742745024344 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.runtime.Translator; public final class ShortcutDesc { /** Never create a shortcut */ public static final String CREATE_NEVER = "NEVER"; /** Always create a shortcut */ public static final String CREATE_ALWAYS = "ALWAYS"; /** Always ask user whether to create a shortcut */ public static final String CREATE_ASK_USER = "ASK_USER"; /** Ask user whether to create a shortcut but only if jnlp file asks for it */ public static final String CREATE_ASK_USER_IF_HINTED = "ASK_IF_HINTED"; /** Create a desktop shortcut without prompting if the jnlp asks for it */ public static final String CREATE_ALWAYS_IF_HINTED = "ALWAYS_IF_HINTED"; /** * the application wants to be placed on the desktop * based of existence/not existence of desktop tag */ private final boolean onDesktop; /** * the application needs to be launched online * happily ignored. itw is trying to run any app even if it is offline (some apps are enforcing it without sense) */ private final boolean requiresOnline; /** * the menu descriptor * based on existence of menu tag * if null, then no tag was presented * if there is some value, then menu tag was presented * depending on value inside MenuDesc, the attribute submenu was/was not presented */ private MenuDesc menu = null; /** * Create a new Shortcut descriptor * @param requiresOnline whether the shortcut requires connectivity * @param onDesktop whether the shortcut wants to be placed on the desktop */ public ShortcutDesc(boolean requiresOnline, boolean onDesktop) { this.requiresOnline = requiresOnline; this.onDesktop = onDesktop; } /** * @return whether the shortcut requires being online */ public boolean isOnline() { throw new RuntimeException("icedtea-web is not saving online-enforcing attribute. See Xoffline impelmentations if needed."); } /** * For testing purposes. Verify if it have been parsed out correctly. * @return whether the shortcut requires being online. */ public boolean isOnlineValue() { return requiresOnline; } /** * @return whether the shortcut should be placed on the desktop */ public boolean onDesktop() { return onDesktop; } /** * @return whether the shortcut should be placed to the menus */ public boolean toMenu() { return getMenu() != null; } /** * Add a shortcut to the 'start menu' * (whatever that means on gnome/kde/other ...) * @param menu if/what menu this shortcut should be added to */ public void setMenu(MenuDesc menu) { this.menu = menu; } /** * @return the menu this shortcut should be added to */ public MenuDesc getMenu() { return menu; } public static String deploymentJavawsShortcutToString(String i) { switch (i) { case ShortcutDesc.CREATE_NEVER: return Translator.R("DSPNeverCreate"); case ShortcutDesc.CREATE_ALWAYS: return Translator.R("DSPAlwaysAllow"); case ShortcutDesc.CREATE_ASK_USER: return Translator.R("DSPAskUser"); case ShortcutDesc.CREATE_ASK_USER_IF_HINTED: return Translator.R("DSPAskIfHinted"); case ShortcutDesc.CREATE_ALWAYS_IF_HINTED: return Translator.R("DSPAlwaysIfHinted"); } throw new RuntimeException("Unknown value of " + DeploymentConfiguration.KEY_CREATE_DESKTOP_SHORTCUT + " for " + i); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/PluginBridge.java0000644000000000000000000000013213441742745023473 xustar0030 mtime=1552401893.028832846 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/PluginBridge.java0000644000175000002070000006120713441742745024311 0ustar00jvanekmock00000000000000/* * Copyright 2012 Red Hat, Inc. * This file is part of IcedTea, http://icedtea.classpath.org * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sourceforge.jnlp; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import net.sourceforge.jnlp.SecurityDesc.RequestedPermissionLevel; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.StreamUtils; import net.sourceforge.jnlp.util.UrlUtils; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.replacements.BASE64Decoder; /** * Allows reuse of code that expects a JNLPFile object, * while overriding behaviour specific to applets. */ public final class PluginBridge extends JNLPFile { private final PluginParameters params; final private Set jars = new HashSet<>(); private List extensionJars = new ArrayList<>(); //Folders can be added to the code-base through the archive tag final private List codeBaseFolders = new ArrayList<>(); private String[] cacheJars = new String[0]; private String[] cacheExJars = new String[0]; private boolean usePack = false; private boolean useVersion = false; private boolean useJNLPHref; private String debugJnlp; /** * Creates a new PluginBridge using a default JNLPCreator. * @param codebase as specified in attribute * @param documentBase as specified in attribute * @param jar jar attribute value * @param main main method attribute value * @param width width of appelt as specified in attribute * @param height height of applet as specified in attribute * @param params parameters as parsed from source html * @throws java.lang.Exception general exception as anything can happen */ public PluginBridge(URL codebase, URL documentBase, String jar, String main, int width, int height, PluginParameters params) throws Exception { this(codebase, documentBase, jar, main, width, height, params, new JNLPCreator()); } /** * Handles archive tag entries, which may be folders or jar files * @param archives the components of the archive tag */ private void addArchiveEntries(String[] archives) { for (String archiveEntry : archives){ // trim white spaces archiveEntry = archiveEntry.trim(); /*Only '/' on linux, '/' or '\\' on windows*/ if (archiveEntry.endsWith("/") || archiveEntry.endsWith(File.pathSeparator)) { this.codeBaseFolders.add(archiveEntry); } else { this.jars.add(archiveEntry); } } } public PluginBridge(URL codebase, URL documentBase, String archive, String main, int width, int height, final PluginParameters params, JNLPCreator jnlpCreator) throws Exception { specVersion = new Version("1.0"); fileVersion = new Version("1.1"); this.codeBase = codebase; this.sourceLocation = documentBase; this.params = params; this.parserSettings = ParserSettings.getGlobalParserSettings(); if (params.getJNLPHref() != null) { useJNLPHref = true; try { // Use codeBase as the context for the URL. If jnlp_href's // value is a complete URL, it will replace codeBase's context. final ParserSettings defaultSettings = new ParserSettings(); final URL jnlp = new URL(codeBase, params.getJNLPHref()); if (fileLocation == null){ fileLocation = jnlp; } JNLPFile jnlpFile; if (params.getJNLPEmbedded() != null) { InputStream jnlpInputStream = new ByteArrayInputStream(decodeBase64String(params.getJNLPEmbedded())); jnlpFile = new JNLPFile(jnlpInputStream, codeBase, defaultSettings); debugJnlp = new StreamProvider() { @Override InputStream getStream() throws Exception { return new ByteArrayInputStream(decodeBase64String(params.getJNLPEmbedded())); } }.readStream(); } else { // see http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=2746#c3 URL codebaseRewriter=UrlUtils.ensureSlashTail(UrlUtils.removeFileName(jnlp)); this.codeBase = codebaseRewriter; jnlpFile = jnlpCreator.create(jnlp, null, defaultSettings, JNLPRuntime.getDefaultUpdatePolicy(), codebaseRewriter); debugJnlp = new StreamProvider() { @Override InputStream getStream() throws Exception { return JNLPFile.openURL(jnlp, null, UpdatePolicy.ALWAYS); } }.readStream(); } OutputController.getLogger().log("Loaded JNLPhref:"); OutputController.getLogger().log((debugJnlp == null) ? "null" : debugJnlp); if (jnlpFile.isApplet()) main = jnlpFile.getApplet().getMainClass(); Map jnlpParams = jnlpFile.getApplet().getParameters(); info = jnlpFile.info; // Change the parameter name to lowercase to follow conventions. for (Map.Entry entry : jnlpParams.entrySet()) { this.params.put(entry.getKey().toLowerCase(), entry.getValue()); } JARDesc[] jarDescs = jnlpFile.getResources().getJARs(); for (JARDesc jarDesc : jarDescs) { String fileName = jarDesc.getLocation().toExternalForm(); this.jars.add(fileName); } usePack = jnlpFile.getDownloadOptions().useExplicitPack(); useVersion = jnlpFile.getDownloadOptions().useExplicitVersion(); // Store any extensions listed in the JNLP file to be returned later on, namely in getResources() extensionJars = Arrays.asList(jnlpFile.getResources().getExtensions()); } catch (MalformedURLException e) { // Don't fail because we cannot get the jnlp file. Parameters are optional not required. // it is the site developer who should ensure that file exist. OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Unable to get JNLP file at: " + params.getJNLPHref() + " with context of URL as: " + codeBase.toExternalForm()); } } else { // Should we populate this list with applet attribute tags? info = new ArrayList<>(); useJNLPHref = false; } // also, see if cache_archive is specified String cacheArchive = params.getCacheArchive(); if (!cacheArchive.isEmpty()) { String[] versions = new String[0]; // are there accompanying versions? String cacheVersion = params.getCacheVersion(); if (!cacheVersion.isEmpty()) { versions = cacheVersion.split(","); } String[] ljars = cacheArchive.split(","); cacheJars = new String[ljars.length]; for (int i = 0; i < ljars.length; i++) { cacheJars[i] = ljars[i].trim(); if (versions.length > 0) { cacheJars[i] += ";" + versions[i].trim(); } } } String cacheArchiveEx = params.getCacheArchiveEx(); if (!cacheArchiveEx.isEmpty()) { cacheExJars = cacheArchiveEx.split(","); } if (archive != null && archive.length() > 0) { String[] archives = archive.split(","); addArchiveEntries(archives); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "Jar string: " + archive); OutputController.getLogger().log(OutputController.Level.ERROR_DEBUG, "jars length: " + archives.length); } if (main.endsWith(".class")) main = main.substring(0, main.length() - 6); // the class name should be of the form foo.bar.Baz not foo/bar/Baz String mainClass = main.replace('/', '.'); launchType = new AppletDesc(getTitle(), mainClass, documentBase, width, height, params.getUnmodifiableMap()); if (main.endsWith(".class")) //single class file only security = new SecurityDesc(this, SecurityDesc.SANDBOX_PERMISSIONS, codebase); else security = null; this.uniqueKey = params.getUniqueKey(codebase); String jargs = params.getJavaArguments(); if (!jargs.isEmpty()) { for (String s : jargs.split(" ")) { String[] parts = s.trim().split("="); if (parts.length == 2 && Boolean.valueOf(parts[1])) { if (null != parts[0]) switch (parts[0]) { case "-Djnlp.packEnabled": usePack = true; break; case "-Djnlp.versionEnabled": useVersion = true; break; } } } } } public List getArchiveJars() { return new ArrayList<>(jars); } public boolean codeBaseLookup() { return params.useCodebaseLookup(); } public boolean useJNLPHref() { return useJNLPHref; } public PluginParameters getParams() { return params; } @Override public RequestedPermissionLevel getRequestedPermissionLevel() { final String level = params.getPermissions(); if (level == null) { return RequestedPermissionLevel.NONE; } else if (level.equals(SecurityDesc.RequestedPermissionLevel.DEFAULT.toHtmlString())) { return RequestedPermissionLevel.NONE; } else if (level.equals(SecurityDesc.RequestedPermissionLevel.SANDBOX.toHtmlString())) { return RequestedPermissionLevel.SANDBOX; } else if (level.equals(SecurityDesc.RequestedPermissionLevel.ALL.toHtmlString())) { return RequestedPermissionLevel.ALL; } else { return RequestedPermissionLevel.NONE; } } /** * {@inheritDoc } * @return options of download */ @Override public DownloadOptions getDownloadOptions() { return new DownloadOptions(usePack, useVersion); } @Override public String getTitle() { String inManifestTitle = super.getTitleFromManifest(); if (inManifestTitle != null) { return inManifestTitle; } //specification is recommending main class instead of html parameter //http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#app_name String mainClass = getManifestsAttributes().getMainClass(); if (mainClass != null) { return mainClass; } return params.getAppletTitle(); } @Override public ResourcesDesc getResources(final Locale locale, final String os, final String arch) { return new ResourcesDesc(this, new Locale[] { locale }, new String[] { os }, new String[] { arch }) { @Override public List getResources(Class launchType) { // Need to add the JAR manually... //should this be done to sharedResources on init? if (launchType.equals(JARDesc.class)) { try { List jarDescs = new ArrayList<>(); jarDescs.addAll(sharedResources.getResources(JARDesc.class)); for (String name : jars) { if (name.length() > 0) jarDescs.add(new JARDesc(new URL(codeBase, name), null, null, false, true, false, true)); } boolean cacheable = true; if (params.getCacheOption().equalsIgnoreCase("no")) cacheable = false; for (String cacheJar : cacheJars) { String[] jarAndVer = cacheJar.split(";"); String jar = jarAndVer[0]; Version version = null; if (jar.length() == 0) continue; if (jarAndVer.length > 1) { version = new Version(jarAndVer[1]); } jarDescs.add(new JARDesc(new URL(codeBase, jar), version, null, false, true, false, cacheable)); } for (String cacheExJar : cacheExJars) { if (cacheExJar.length() == 0) continue; String[] jarInfo = cacheExJar.split(";"); String jar = jarInfo[0].trim(); Version version = null; boolean lazy = true; if (jarInfo.length > 1) { // format is name[[;preload];version] if (jarInfo[1].equals("preload")) { lazy = false; } else { version = new Version(jarInfo[1].trim()); } if (jarInfo.length > 2) { lazy = false; version = new Version(jarInfo[2].trim()); } } jarDescs.add(new JARDesc(new URL(codeBase, jar), version, null, lazy, true, false, false)); } // We know this is a safe list of JarDesc objects @SuppressWarnings("unchecked") List result = (List) jarDescs; return result; } catch (MalformedURLException ex) { /* Ignored */ } } else if (launchType.equals(ExtensionDesc.class)) { // We hope this is a safe list of JarDesc objects @SuppressWarnings("unchecked") List castList = (List) extensionJars; // this list is populated when the PluginBridge is first constructed return castList; } return sharedResources.getResources(launchType); } @Override public JARDesc[] getJARs() { List jarDescs = getResources(JARDesc.class); return jarDescs.toArray(new JARDesc[jarDescs.size()]); } @Override public void addResource(Object resource) { // todo: honor the current locale, os, arch values sharedResources.addResource(resource); } }; } /** * @return the list of folders to be added to the codebase */ public List getCodeBaseFolders() { return new ArrayList<>(codeBaseFolders); } /** * @return the resources section of the JNLP file for the * specified locale, os, and arch. */ @Override public ResourcesDesc[] getResourcesDescs(final Locale locale, final String os, final String arch) { return new ResourcesDesc[] { getResources(locale, os, arch) }; } @Override public boolean isApplet() { return true; } @Override public boolean isApplication() { return false; } @Override public boolean isComponent() { return false; } @Override public boolean isInstaller() { return false; } /** * Returns the decoded BASE64 string */ static byte[] decodeBase64String(String encodedString) throws IOException { BASE64Decoder base64 = new BASE64Decoder(); return base64.decodeBuffer(encodedString); } public String getDebugJnlp() { return debugJnlp; } public boolean haveDebugJnlp() { return debugJnlp != null; } public String toJnlp(boolean needSecurity, boolean useHref, boolean fix) { if (useJNLPHref && debugJnlp != null && useHref) { OutputController.getLogger().log("Using debugjnlp as return value toJnlp"); if (fix) { return fixCommonIsuses(needSecurity, debugJnlp); } else { return debugJnlp; } } else { StringBuilder s = new StringBuilder(); s.append("\n" + "\n") .append(" \n" + " ").append(createJnlpTitle()).append("\n" + " ").append(createJnlpVendor()).append("\n" + " \n"); if (needSecurity) { s.append(getSecurityElement()); } s.append(" \n"); for (String i : getArchiveJars()) { s.append(" \n"); } s.append(" \n" + " \n"); if (!getApplet().getParameters().isEmpty()) { Set> prms = getApplet().getParameters().entrySet(); for (Map.Entry entry : prms) { s.append(" \n"); } } s.append(" \n" + "\n"); OutputController.getLogger().log("toJnlp generated:"); OutputController.getLogger().log(s.toString()); return s.toString(); } } private String getStrippedMain() { return strippClass(getApplet().getMainClass().trim()); } public static String strippClass(String s) { if (s.endsWith(".class")) { return s.substring(0, s.length() - ".class".length()); } else { return s; } } //Those constants are public, because they are tested in PluginBridgeTest static final String SANDBOX_REGEX = toBaseRegex("sandbox", false); static final String CLOSE_INFORMATION_REGEX = toBaseRegex("information", true); static final String SECURITY_REGEX = toBaseRegex("security", false); static final String RESOURCE_REGEX = toBaseRegex("resources", false); static final String TITLE_REGEX = toBaseRegex("title", false); static final String VENDOR_REGEX = toBaseRegex("vendor", false); static final String AP_REGEX = toBaseRegex("all-permissions", false); static final String CODEBASE_REGEX1 = "(?i).*\\s+codebase\\s*=\\s*"; static final String CODEBASE_REGEX2 = "(?i)\\s+codebase\\s*=\\s*.\\.{0,1}.((\\s+)|(\\s*>))";// "." '.' '' "" static String toMatcher(String regex) { return "(?s).*" + regex + ".*"; } static String toBaseRegex(String tagName, boolean closing) { return "(?i)<\\s*" + ((closing) ? "/\\s*" : "") + tagName + "\\s*>"; } private String fixCommonIsuses(boolean needSecurity, String orig) { String codebase = getNotNullProbalbeCodeBase().toString(); return fixCommonIsuses(needSecurity, orig, codebase, createJnlpTitle(), createJnlpVendor()); } //testing allowing method static String fixCommonIsuses(boolean needSecurity, String orig, String codebase, String title, String vendor) { //no information element at all if (!orig.matches(toMatcher(CLOSE_INFORMATION_REGEX))) { OutputController.getLogger().log("no information element Found. Trying to fix"); if (orig.matches(toMatcher(SECURITY_REGEX))) { orig = orig.replaceAll(SECURITY_REGEX, "\n\n\n\n"); } else { if (orig.matches(toMatcher(RESOURCE_REGEX))) { orig = orig.replaceAll(RESOURCE_REGEX, "\n\n\n\n"); } } } //some have missing codebase, thats fatal if (!orig.matches(toMatcher(CODEBASE_REGEX1))) { OutputController.getLogger().log("jnlphref did not had codebase. Fixing"); orig = orig.replaceAll("(?i)<\\s*jnlp\\s+", "" + title + "\n\n"); } if (!orig.matches(toMatcher(VENDOR_REGEX))) { OutputController.getLogger().log("Missing vendor. Fixing"); orig = orig.replaceAll(CLOSE_INFORMATION_REGEX, "\n" + vendor + "\n\n"); } //also all-security is not enforced via jnlpHref if (needSecurity && !orig.matches(toMatcher(AP_REGEX))) { OutputController.getLogger().log("all-permissions not found and app is signed."); if (orig.matches(SANDBOX_REGEX)) { OutputController.getLogger().log("Replacing sandbox by all-permissions"); orig = orig.replaceAll(SANDBOX_REGEX, getAllPermissionsElement()); } else { OutputController.getLogger().log("adding security element"); orig = orig.replaceAll(CLOSE_INFORMATION_REGEX, "\n" + getSecurityElement()); } } return orig; } private static String getSecurityElement() { return " \n" + getAllPermissionsElement() + " \n"; } private static String getAllPermissionsElement() { return " \n"; } private abstract class StreamProvider { abstract InputStream getStream() throws Exception; String readStream() { try { return StreamUtils.readStreamAsString(getStream()); } catch (Exception ex) { OutputController.getLogger().log(ex); } return null; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/NetxPanel.java0000644000000000000000000000013213441742745023016 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/NetxPanel.java0000644000175000002070000002004113441742745023623 0ustar00jvanekmock00000000000000/* * Copyright 2012 Red Hat, Inc. * This file is part of IcedTea, http://icedtea.classpath.org * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sourceforge.jnlp; import net.sourceforge.jnlp.runtime.AppletInstance; import net.sourceforge.jnlp.runtime.JNLPRuntime; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import net.sourceforge.jnlp.splashscreen.SplashController; import net.sourceforge.jnlp.splashscreen.SplashPanel; import net.sourceforge.jnlp.splashscreen.SplashUtils; import net.sourceforge.jnlp.util.logging.OutputController; import sun.applet.AppletViewerPanelAccess; import sun.awt.SunToolkit; /** * This panel calls into netx to run an applet, and pipes the display * into a panel from the icedtea-web browser plugin. * * @author Francis Kung <fkung@redhat.com> */ public class NetxPanel extends AppletViewerPanelAccess implements SplashController { private final PluginParameters parameters; private PluginBridge bridge = null; private AppletInstance appInst = null; private SplashController splashController; private volatile boolean initialized; // We use this so that we can create exactly one thread group // for all panels with the same uKey. private static final Map uKeyToTG = new HashMap<>(); private static final Object TGMapMutex = new Object(); // This map is actually a set (unfortunately there is no ConcurrentSet // in java.util.concurrent). If KEY is in this map, then we know that // an app context has been created for the panel that has uKey.equals(KEY), // so we avoid creating it a second time for panels with the same uKey. // Because it's a set, only the keys matter. However, we can't insert // null values in because if we did, we couldn't use null checks to see // if a key was absent before a putIfAbsent. private static final ConcurrentMap appContextCreated = new ConcurrentHashMap<>(); public NetxPanel(URL documentURL, PluginParameters params, PluginBridge bridge) { super(documentURL, params.getUnderlyingMap()); this.bridge = bridge; this.parameters = params; this.initialized = false; String uniqueKey = params.getUniqueKey(getCodeBase()); synchronized(TGMapMutex) { if (!uKeyToTG.containsKey(uniqueKey)) { ThreadGroup tg = new ThreadGroup(Launcher.mainGroup, this.getDocumentURL().toString()); uKeyToTG.put(uniqueKey, tg); } } } public AppletInstance getAppInst() { return appInst; } @Override protected void showAppletException(Throwable t) { /* * Log any exceptions thrown while loading, initializing, starting, * and stopping the applet. */ OutputController.getLogger().log(OutputController.Level.MESSAGE_ALL, t); //new logger super.showAppletException(t); } //Overriding to use Netx classloader. You might need to relax visibility //in sun.applet.AppletPanel for runLoader(). @Override protected void ourRunLoader() { try { if (bridge == null) { bridge = new PluginBridge(getBaseURL(), getDocumentBase(), getJarFiles(), getCode(), getWidth(), getHeight(), parameters); } init(bridge); } catch (Exception e) { status = APPLET_ERROR; OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); replaceSplash(SplashUtils.getErrorSplashScreen(getWidth(), getHeight(), e)); } finally { // PR1157: This needs to occur even in the case of an exception // so that the applet's event listeners are signaled. // Once PluginAppletViewer.AppletEventListener is signaled PluginAppletViewer can properly stop waiting // in PluginAppletViewer.waitForAppletInit this.initialized = true; dispatchAppletEvent(APPLET_LOADING_COMPLETED, null); } } /** * Creates a new Thread (in a new applet-specific ThreadGroup) for running * the applet */ // Reminder: Relax visibility in sun.applet.AppletPanel @Override protected synchronized void createAppletThread() { // initialize JNLPRuntime in the main threadgroup synchronized (JNLPRuntime.initMutex) { //The custom NetX Policy and SecurityManager are set here. if (!JNLPRuntime.isInitialized()) { OutputController.getLogger().log("initializing JNLPRuntime..."); JNLPRuntime.initialize(false); } else { OutputController.getLogger().log("JNLPRuntime already initialized"); } } handler = new Thread(getThreadGroup(), this, "NetxPanelThread@" + this.getDocumentURL()); handler.start(); } public void updateSizeInAtts(int height, int width) { parameters.updateSize(width, height); } public ClassLoader getAppletClassLoader() { return appInst.getClassLoader(); } public boolean isInitialized() { return initialized; } public ThreadGroup getThreadGroup() { synchronized(TGMapMutex) { return uKeyToTG.get(parameters.getUniqueKey(getCodeBase())); } } public void createNewAppContext() { if (Thread.currentThread().getThreadGroup() != getThreadGroup()) { throw new RuntimeException("createNewAppContext called from the wrong thread."); } // only create a new context if one hasn't already been created for the // applets with this unique key. if (null == appContextCreated.putIfAbsent(parameters.getUniqueKey(getCodeBase()), Boolean.TRUE)) { SunToolkit.createNewAppContext(); } } public void setAppletViewerFrame(SplashController framePanel) { splashController=framePanel; } @Override public void removeSplash() { splashController.removeSplash(); } @Override public void replaceSplash(SplashPanel r) { splashController.replaceSplash(r); } @Override public int getSplashWidth() { return splashController.getSplashWidth(); } @Override public int getSplashHeigth() { return splashController.getSplashHeigth(); } public void init(PluginBridge bridge) throws LaunchException { setDoInitIfExists(true); dispatchAppletEvent(APPLET_LOADING, null); status = APPLET_LOAD; Launcher l = new Launcher(false); // May throw LaunchException: appInst = (AppletInstance) l.launch(bridge, this); setApplet(appInst.getApplet()); if (getApplet() != null) { // Stick it in the frame getApplet().setStub(this); getApplet().setVisible(false); add("Center", getApplet()); showAppletStatus("loaded"); validate(); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/LaunchException.java0000644000000000000000000000013113441742745024210 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/LaunchException.java0000644000175000002070000001234513441742745025026 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.util.Collections; import java.util.Date; import java.util.LinkedList; import java.util.List; /** * Thrown when a JNLP application, applet, or installer could not * be created. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.9 $ */ public class LaunchException extends Exception { public static class LaunchExceptionWithStamp{ private final LaunchException ex; private final Date stamp; private LaunchExceptionWithStamp(LaunchException ex) { this.ex=ex; this.stamp=new Date(); } public LaunchException getEx() { return ex; } public Date getStamp() { return stamp; } } private static final List launchExceptionChain = Collections.synchronizedList(new LinkedList()); private static final long serialVersionUID = 7283827853612357423L; /** the file being launched */ private final JNLPFile file; /** the category of the exception */ final private String category; /** summary */ final private String summary; /** description of the action that was taking place */ final private String description; /** severity of the warning/error */ final private String severity; /** * Creates a LaunchException without detail message. * @param file jnlp-file which caused exception * @param cause cause of exception * @param severity severity of exception * @param category category of exception * @param summary short summary of exception * @param description full description of exception */ public LaunchException(JNLPFile file, Exception cause, String severity, String category, String summary, String description) { super(severity + ": " + category + ": " + summary + " " + (description == null ? "" : description), cause); this.file = file; this.category = category; this.summary = summary; this.description = description; this.severity = severity; saveLaunchException(this); } /** * Creates a LaunchException with a cause. * @param cause cause of exception */ public LaunchException(Throwable cause) { super(cause); this.file = null; this.category = null; this.summary = null; this.description = null; this.severity = null; saveLaunchException(this); } /** * Creates a LaunchException with a cause and detail message * @param message text of exception * @param cause cause of exception */ public LaunchException(String message, Throwable cause) { super(message, cause); this.file = null; this.category = null; this.summary = null; this.description = null; this.severity = null; saveLaunchException(this); } /** * Constructs a LaunchException with the specified detail * message. * * @param message the detail message */ public LaunchException(String message) { super(message); this.file = null; this.category = null; this.summary = null; this.description = null; this.severity = null; saveLaunchException(this); } /** * @return the JNLPFile being launched. */ public JNLPFile getFile() { return file; } /** * @return the category string, a short description of the * exception suitable for displaying in a window title. */ public String getCategory() { return category; } /** * @return a one-sentence summary of the problem. */ public String getSummary() { return summary; } /** * @return a description of the exception and the action being * performed when the exception occurred. */ public String getDescription() { return description; } /** * @return a short description of the severity of the problem. */ public String getSeverity() { return severity; } private synchronized void saveLaunchException(LaunchException ex) { launchExceptionChain.add(new LaunchExceptionWithStamp(ex)); } public synchronized static List getLaunchExceptionChain() { return launchExceptionChain; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/JARDesc.java0000644000000000000000000000013213441742745022333 xustar0030 mtime=1552401893.025832852 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/JARDesc.java0000644000175000002070000000750513441742745023152 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.net.URL; /** * The JAR element. * * This class is immutable and thread safe * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.6 $ */ public class JARDesc { /** the location of the JAR file */ private final URL location; /** the required JAR versions, or null */ private final Version version; /** the part name */ private final String part; /** whether to load the JAR on demand */ private final boolean lazy; /** whether the JAR contains the main class */ private final boolean main; /** whether the JAR contains native libraries */ private final boolean nativeJar; /** whether the JAR can be cached */ private final boolean cacheable; /** * Create a JAR descriptor. * * @param location the location of the JAR file * @param version the required JAR versions, or null * @param part the part name, or null * @param lazy whether to load the JAR on demand * @param main whether the JAR contains the main class * @param nativeJar whether the JAR contains native libraries * @param cacheable whether the JAR can be cached or not */ public JARDesc(URL location, Version version, String part, boolean lazy, boolean main, boolean nativeJar, boolean cacheable) { this.location = location; this.version = version; this.part = part; this.lazy = lazy; this.main = main; this.nativeJar = nativeJar; this.cacheable = cacheable; } /** * @return the URL of the JAR file. */ public URL getLocation() { return location; } /** * @return the required version of the JAR file. */ public Version getVersion() { return version; } /** * @return the part name, or null if not specified in the JNLP * file. */ public String getPart() { return part; } /** * @return true if the JAR file contains native code * libraries. */ public boolean isNative() { return nativeJar; } // these both are included in case the spec adds a new value, // where !lazy would no longer imply eager. /** * @return true if the JAR file should be downloaded before * starting the application. */ public boolean isEager() { return !lazy; } /** * @return true if the JAR file should be downloaded on demand. */ public boolean isLazy() { return lazy; } /** * @return true if the JNLP file defined this JAR as containing * the main class. If no JARs were defined as the main JAR then * the first JAR should be used to locate the main class. * * @see ResourcesDesc#getMainJAR */ public boolean isMain() { return main; } /** * Returns if this jar is cacheable * * @return Whether or not this jar is cacheable */ public boolean isCacheable() { return cacheable; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/ComponentDesc.java0000644000000000000000000000013213441742745023661 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.226253505 30 ctime=1552410887.030183637 icedtea-web-1.8/netx/net/sourceforge/jnlp/ComponentDesc.java0000644000175000002070000000225313441742745024473 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; /** * The component-desc element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.6 $ */ public class ComponentDesc { // this is for completeness and in case of changes to spec for components. /** * Create a component descriptor. */ public ComponentDesc() { } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/XmlParser.java0000644000000000000000000000013213441742745023035 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/XmlParser.java0000644000175000002070000001533613441742745023655 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PipedInputStream; import java.io.PipedOutputStream; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.nanoxml.XMLElement; //import javax.xml.parsers.*; // commented to use right Node //import org.w3c.dom.*; // class for using Tiny XML | NanoXML //import org.xml.sax.*; //import gd.xml.tiny.*; /** * A gateway to the actual implementation of the parsers. * * Used by net.sourceforge.jnlp.Parser */ class XMLParser { /** * Parses input from an InputStream and returns a Node representing the * root of the parse tree. * * @param input the {@link InputStream} containing the XML * @return a {@link Node} representing the root of the parsed XML * @throws ParseException if parsing fails */ public Node getRootNode(InputStream input) throws ParseException { try { /* SAX DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(errorHandler); Document doc = builder.parse(input); return doc.getDocumentElement(); */ /* TINY Node document = new Node(TinyParser.parseXML(input)); Node jnlpNode = getChildNode(document, "jnlp"); // skip comments */ //A BufferedInputStream is used to allow marking and reseting //of a stream. BufferedInputStream bs = new BufferedInputStream(input); /* NANO */ final XMLElement xml = new XMLElement(); final PipedInputStream pin = new PipedInputStream(); final PipedOutputStream pout = new PipedOutputStream(pin); final InputStreamReader isr = new InputStreamReader(bs, getEncoding(bs)); // Clean the jnlp xml file of all comments before passing // it to the parser. new Thread( new Runnable() { @Override public void run() { (new XMLElement()).sanitizeInput(isr, pout); try { pout.close(); } catch (IOException ioe) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, ioe); } } }).start(); xml.parseFromReader(new InputStreamReader(pin)); Node jnlpNode = new Node(xml); return jnlpNode; } catch (Exception ex) { throw new ParseException(R("PBadXML"), ex); } } /** * Returns the name of the encoding used in this InputStream. * * @param input the InputStream * @return a String representation of encoding */ private static String getEncoding(InputStream input) throws IOException { //Fixme: This only recognizes UTF-8, UTF-16, and //UTF-32, which is enough to parse the prolog portion of xml to //find out the exact encoding (if it exists). The reason being //there could be other encodings, such as ISO 8859 which is 8-bits //but it supports latin characters. //So what needs to be done is to parse the prolog and retrieve //the exact encoding from it. int[] s = new int[4]; String encoding = "UTF-8"; //Determine what the first four bytes are and store //them into an int array. input.mark(4); for (int i = 0; i < 4; i++) { s[i] = input.read(); } input.reset(); //Set the encoding base on what the first four bytes of the //inputstream turn out to be (following the information from //www.w3.org/TR/REC-xml/#sec-guessing). if (s[0] == 255) { if (s[1] == 254) { if (s[2] != 0 || s[3] != 0) { encoding = "UnicodeLittle"; } else { encoding = "X-UTF-32LE-BOM"; } } } else if (s[0] == 254 && s[1] == 255 && (s[2] != 0 || s[3] != 0)) { encoding = "UTF-16"; } else if (s[0] == 0 && s[1] == 0 && s[2] == 254 && s[3] == 255) { encoding = "X-UTF-32BE-BOM"; } else if (s[0] == 0 && s[1] == 0 && s[2] == 0 && s[3] == 60) { encoding = "UTF-32BE"; } else if (s[0] == 60 && s[1] == 0 && s[2] == 0 && s[3] == 0) { encoding = "UTF-32LE"; } else if (s[0] == 0 && s[1] == 60 && s[2] == 0 && s[3] == 63) { encoding = "UTF-16BE"; } else if (s[0] == 60 && s[1] == 0 && s[2] == 63 && s[3] == 0) { encoding = "UTF-16LE"; } return encoding; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/PropertyDesc.java0000644000000000000000000000013213441742745023543 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/PropertyDesc.java0000644000175000002070000000445313441742745024361 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import static net.sourceforge.jnlp.runtime.Translator.R; /** * The property element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.6 $ */ public class PropertyDesc { /** * * @param prop - the property to be parsed from format key=value * @return new PropertyDesc based on parsed key=value, though composed from key and value * @throws net.sourceforge.jnlp.LaunchException if creations fails */ public static PropertyDesc fromString(String prop) throws LaunchException { // allows empty property, not sure about validity of that. int equals = prop.indexOf("="); if (equals == -1) { throw new LaunchException(R("BBadProp", prop)); } String key = prop.substring(0, equals); String value = prop.substring(equals + 1, prop.length()); return new PropertyDesc(key, value); } /** the key name */ final private String key; /** the value */ final private String value; /** * Creates a property descriptor. * * @param key the key name * @param value the value */ public PropertyDesc(String key, String value) { this.key = key; this.value = value; } /** * @return the property's key */ public String getKey() { return key; } /** * @return the property's value */ public String getValue() { return value; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/OptionsDefinitions.java0000644000000000000000000000013213441742745024747 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/OptionsDefinitions.java0000644000175000002070000002237613441742745025571 0ustar00jvanekmock00000000000000/* Copyright (C) 2008 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static net.sourceforge.jnlp.runtime.Translator.R; import net.sourceforge.jnlp.util.docprovider.TextsProvider; public class OptionsDefinitions { public static enum OPTIONS { //javaws undocummented swithces TRUSTALL("-Xtrustall","BOTrustall"), //javaws control-options ABOUT("-about", "BOAbout"), VIEWER("-viewer", "BOViewer"), CLEARCACHE("-Xclearcache", "BXclearcache", NumberOfArguments.NONE_OR_ONE), LISTCACHEIDS("-Xcacheids", "BXcacheids", NumberOfArguments.NONE_OR_ONE), LICENSE("-license", "BOLicense"), HELP1("-help", "BOHelp1"), //javaws run-options VERSION("-version", "BOVersion"), ARG("-arg", "arg", "BOArg", NumberOfArguments.ONE_OR_MORE), PARAM("-param", "name=value", "BOParam", NumberOfArguments.ONE_OR_MORE), PROPERTY("-property", "name=value", "BOProperty", NumberOfArguments.ONE_OR_MORE), UPDATE("-update", "seconds", "BOUpdate", NumberOfArguments.ONE), VERBOSE("-verbose", "BOVerbose"), DETAILS("-details", "BOVerbose"), //backward compatibility for itweb settings NOSEC("-nosecurity", "BONosecurity"), NOUPDATE("-noupdate", "BONoupdate"), HEADLESS("-headless", "BOHeadless"), STRICT("-strict", "BOStrict"), XML("-xml", "BOXml"), REDIRECT("-allowredirect", "BOredirect"), NOFORK("-Xnofork", "BXnofork"), NOHEADERS("-Xignoreheaders", "BXignoreheaders"), OFFLINE("-Xoffline", "BXoffline"), TRUSTNONE("-Xtrustnone","BOTrustnone"), JNLP("-jnlp","BOJnlp", NumberOfArguments.ONE), HTML("-html","BOHtml", NumberOfArguments.ONE_OR_MORE), BROWSER("-browser", "BrowserArg", NumberOfArguments.ONE_OR_MORE), //itweb settings LIST("-list", "IBOList"), GET("-get", "name", "IBOGet", NumberOfArguments.ONE_OR_MORE), INFO("-info", "name", "IBOInfo", NumberOfArguments.ONE_OR_MORE), SET("-set", "name value", "IBOSet", NumberOfArguments.EVEN_NUMBER_SUPPORTS_EQUALS_CHAR), RESETALL("-reset", "all", "IBOResetAll"), RESET("-reset", "name", "IBOReset", NumberOfArguments.ONE_OR_MORE), CHECK("-check", "name", "IBOCheck"), HELP2("-help", "BOHelp2"), //policyeditor //-help FILE("-file", "policy_file", "PBOFile", NumberOfArguments.ONE), DEFAULTFILE("-defaultfile", "PBODefaultFile"), CODEBASE("-codebase", "url", "PBOCodebase", NumberOfArguments.ONE), SIGNEDBY("-signedby", "certificate_alias", "PBOSignedBy", NumberOfArguments.ONE), PRINCIPALS("-principals", "class_name principal_name", "PBOPrincipals", NumberOfArguments.EVEN_NUMBER_SUPPORTS_EQUALS_CHAR); public final String option; public final String helperString; public final String decriptionKey; private final NumberOfArguments numberOfArguments; OPTIONS(String option, String helperString, String decriptionKey, NumberOfArguments numberOfArguments) { this.decriptionKey = decriptionKey; this.option = option; this.helperString = helperString; this.numberOfArguments = numberOfArguments; } OPTIONS(String option, String helperString, String decriptionKey) { this(option, helperString, decriptionKey, NumberOfArguments.NONE); } OPTIONS(String option, String decriptionKey, NumberOfArguments numberOfArguments) { this(option, "", decriptionKey, numberOfArguments); } OPTIONS(String option, String decriptionKey) { this(option, "", decriptionKey); } public String getLocalizedDescription() { return R(decriptionKey); } public boolean hasNoArguments() { return numberOfArguments == NumberOfArguments.NONE; } public boolean hasEvenNumberSupportingEqualsChar() { return numberOfArguments == NumberOfArguments.EVEN_NUMBER_SUPPORTS_EQUALS_CHAR; } public boolean hasOneOrMoreArguments() { return numberOfArguments == NumberOfArguments.ONE_OR_MORE; } public boolean hasOneArgument() { return numberOfArguments == NumberOfArguments.ONE; } public String getArgumentExplanation() { return numberOfArguments.getMessage(); } } private enum NumberOfArguments { NONE("NOAnone"), ONE("NOAone"), ONE_OR_MORE("NOAonemore"), NONE_OR_ONE("NOAnonorone"), EVEN_NUMBER_SUPPORTS_EQUALS_CHAR("NOAevennumber"); String messageKey; NumberOfArguments(String messageKey) { this.messageKey = messageKey; } public String getMessage() { return R(messageKey); } } public static List getItwsettingsCommands() { return Arrays.asList(new OPTIONS[]{ OPTIONS.HELP2, OPTIONS.LIST, OPTIONS.GET, OPTIONS.INFO, OPTIONS.SET, OPTIONS.RESET, OPTIONS.RESETALL, OPTIONS.HEADLESS, OPTIONS.CHECK, OPTIONS.VERBOSE }); } public static List getPolicyEditorOptions() { return Arrays.asList(new OPTIONS[]{ OPTIONS.HELP1, OPTIONS.FILE, OPTIONS.DEFAULTFILE, OPTIONS.CODEBASE, OPTIONS.SIGNEDBY, OPTIONS.PRINCIPALS, OPTIONS.VERBOSE } ); } public static List getJavaWsControlOptions() { return Arrays.asList(new OPTIONS[]{ OPTIONS.ABOUT, OPTIONS.VIEWER, OPTIONS.CLEARCACHE, OPTIONS.LISTCACHEIDS, OPTIONS.LICENSE, OPTIONS.HELP1} ); } public static List getJavaWsRuntimeOptions() { return Arrays.asList(new OPTIONS[]{ OPTIONS.VERSION, OPTIONS.ARG, OPTIONS.PARAM, OPTIONS.PROPERTY, OPTIONS.UPDATE, OPTIONS.VERBOSE, OPTIONS.NOSEC, OPTIONS.NOUPDATE, OPTIONS.HEADLESS, OPTIONS.STRICT, OPTIONS.XML, OPTIONS.REDIRECT, OPTIONS.NOFORK, OPTIONS.NOHEADERS, OPTIONS.OFFLINE, OPTIONS.TRUSTNONE, OPTIONS.JNLP, OPTIONS.HTML, OPTIONS.BROWSER }); } public static List getJavaWsOptions() { List l = new ArrayList<>(); l.addAll(getJavaWsRuntimeOptions()); l.addAll(getJavaWsControlOptions()); //trustall is not returned by getJavaWsRuntimeOptions //or getJavaWsControlOptions, as it is not desired in documentation l.add(OPTIONS.TRUSTALL); return l; } public static void main(String[] args) throws IOException { switch (args[0]) { case TextsProvider.JAVAWS: printOptions(getJavaWsOptions()); break; case TextsProvider.ITWEB_SETTINGS: printOptions(getItwsettingsCommands()); break; case TextsProvider.POLICY_EDITOR: printOptions(getPolicyEditorOptions()); break; default: break; } } private static void printOptions(List options) { StringBuilder sb = new StringBuilder(); for (OPTIONS option : options) { sb.append(option.option).append(" "); } System.out.println(sb.toString().trim()); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/MalformedXMLParser.java0000644000000000000000000000013213441742745024564 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/MalformedXMLParser.java0000644000175000002070000001112013441742745025367 0ustar00jvanekmock00000000000000/* Copyright (C) 2013 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import net.sourceforge.jnlp.util.logging.OutputController; import org.ccil.cowan.tagsoup.HTMLSchema; import org.ccil.cowan.tagsoup.Parser; import org.ccil.cowan.tagsoup.XMLWriter; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; /** * An specialized {@link XMLParser} that uses TagSoup[1] to parse * malformed XML * * Used by net.sourceforge.jnlp.Parser * * [1] http://home.ccil.org/~cowan/XML/tagsoup/ */ public class MalformedXMLParser extends XMLParser { /** * Parses the data from an {@link java.io.InputStream} to create a XML tree. * Returns a {@link Node} representing the root of the tree. * * @param input the {@link java.io.InputStream} to read data from * @return root node of document * @throws ParseException if an exception occurs while parsing the input */ @Override public Node getRootNode(InputStream input) throws ParseException { OutputController.getLogger().log("Using MalformedXMLParser"); InputStream xmlInput = xmlizeInputStream(input); return super.getRootNode(xmlInput); } /** * Reads malformed XML from the InputStream original and returns a new * InputStream which can be used to read a well-formed version of the input * * @param original original input * @return an {@link InputStream} which can be used to read a well-formed * version of the input XML * @throws ParseException if an exception occurs while parsing the input */ public static InputStream xmlizeInputStream(InputStream original) throws ParseException { try { ByteArrayOutputStream out = new ByteArrayOutputStream(); HTMLSchema schema = new HTMLSchema(); XMLReader reader = new Parser(); //TODO walk through the javadoc and tune more settings //see tagsoup javadoc for details reader.setProperty(Parser.schemaProperty, schema); reader.setFeature(Parser.bogonsEmptyFeature, false); reader.setFeature(Parser.ignorableWhitespaceFeature, true); reader.setFeature(Parser.ignoreBogonsFeature, false); Writer writeger = new OutputStreamWriter(out); XMLWriter x = new XMLWriter(writeger); reader.setContentHandler(x); InputSource s = new InputSource(original); reader.parse(s); return new ByteArrayInputStream(out.toByteArray()); } catch (SAXException | IOException e1) { throw new ParseException(R("PBadXML"), e1); } catch (NoClassDefFoundError e2) { OutputController.getLogger().log(e2); ParseException.setUsed(null); return original; } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/JNLPMatcher.java0000644000000000000000000000013213441742745023167 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/JNLPMatcher.java0000644000175000002070000002305313441742745024002 0ustar00jvanekmock00000000000000/* JNLPMatcher.java Copyright (C) 2011 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package net.sourceforge.jnlp; import java.util.List; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; import java.io.StringReader; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.nanoxml.XMLElement; /** * To compare launching JNLP file with signed APPLICATION.JNLP or * APPLICATION_TEMPLATE.jnlp. * * Used by net.sourceforge.jnlp.runtime.JNLPCLassLoader */ public final class JNLPMatcher { private final Node appTemplateNode; private final Node launchJNLPNode; private final boolean isTemplate; /** * Public constructor * * @param appTemplate * the reader stream of the signed APPLICATION.jnlp or * APPLICATION_TEMPLATE.jnlp * @param launchJNLP * the reader stream of the launching JNLP file * @param isTemplate * a boolean that specifies if appTemplateFile is a template * @param p settings of parser * @throws JNLPMatcherException * if IOException, XMLParseException is thrown during parsing; * Or launchJNLP/appTemplate is null */ public JNLPMatcher(InputStream appTemplate, InputStream launchJNLP, boolean isTemplate, ParserSettings p) throws JNLPMatcherException { if (appTemplate == null && launchJNLP == null) throw new JNLPMatcherException("Template JNLP file and Launching JNLP file are both null."); else if (appTemplate == null) throw new JNLPMatcherException("Template JNLP file is null."); else if (launchJNLP == null) throw new JNLPMatcherException("Launching JNLP file is null."); try { this.appTemplateNode = Parser.getRootNode(appTemplate, p); this.launchJNLPNode = Parser.getRootNode(launchJNLP, p); this.isTemplate = isTemplate; } catch (Exception e) { throw new JNLPMatcherException("Failed to create an instance of JNLPVerify with specified InputStreamReader", e); } finally { closeInputStream(appTemplate); closeInputStream(launchJNLP); } } /** * Compares both JNLP files * * @return true if both JNLP files are 'matched', otherwise false */ public boolean isMatch() { return matchNodes(appTemplateNode, launchJNLPNode); } /** * Compares two Nodes regardless of the order of their children/attributes * * @param appTemplate * signed application or template's Node * @param launchJNLP * launching JNLP file's Node * * @return true if both Nodes are 'matched', otherwise false */ private boolean matchNodes(Node appTemplate, Node launchJNLP) { if (appTemplate != null && launchJNLP != null) { Node templateNode = appTemplate; Node launchNode = launchJNLP; // Store children of Node List appTemplateChild = new LinkedList<>(Arrays.asList(templateNode.getChildNodes())); List launchJNLPChild = new LinkedList<>(Arrays.asList(launchNode.getChildNodes())); // Compare only if both Nodes have the same name, else return false if (templateNode.getNodeName().equals(launchNode.getNodeName())) { if (appTemplateChild.size() == launchJNLPChild.size()) { // Compare // children int childLength = appTemplateChild.size(); for (int i = 0; i < childLength;) { for (int j = 0; j < childLength; j++) { boolean isSame = matchNodes(appTemplateChild.get(i), launchJNLPChild.get(j)); if (!isSame && j == childLength - 1) { return false; } else if (isSame) { // If both child matches, remove them from the list of children appTemplateChild.remove(i); launchJNLPChild.remove(j); --childLength; break; } } } if (!templateNode.getNodeValue().equals(launchNode.getNodeValue())) { // If it's a template and the template's value is NOT '*' if (isTemplate && !templateNode.getNodeValue().equals("*")) { return false; } // Else if it's not a template, then return false else if (!isTemplate) { return false; } } // Compare attributes of both Nodes return matchAttributes(templateNode, launchNode); } } } return false; } /** * Compares attributes of two {@link Node Nodes} regardless of order * * @param templateNode signed application or template's {@link Node} with attributes * @param launchNode launching JNLP file's {@link Node} with attributes * * @return {@code true} if both {@link Node Nodes} have 'matched' attributes, otherwise {@code false} */ private boolean matchAttributes(Node templateNode, Node launchNode) { if (templateNode != null && launchNode != null) { List appTemplateAttributes = templateNode.getAttributeNames(); List launchJNLPAttributes = launchNode.getAttributeNames(); Collections.sort(appTemplateAttributes); Collections.sort(launchJNLPAttributes); if (appTemplateAttributes.size() == launchJNLPAttributes.size()) { int size = appTemplateAttributes.size(); // Number of attributes for (int i = 0; i < size; i++) { if (launchJNLPAttributes.get(i).equals(appTemplateAttributes.get(i))) { // If both Node's attribute name are the // same then compare the values String attribute = launchJNLPAttributes.get(i); boolean isSame = templateNode.getAttribute(attribute).equals( // Check if the Attribute values match launchNode.getAttribute(attribute)); if (!isTemplate && !isSame) { return false; } else if (isTemplate && !isSame && !templateNode.getAttribute(attribute).equals("*")) { return false; } } else { // If attributes names do not match, return false return false; } } return true; } } return false; } /*** * Closes an input stream * * @param stream * The input stream that will be closed */ private void closeInputStream(InputStream stream) { if (stream != null) try { stream.close(); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } /*** * Closes an output stream * * @param stream * The output stream that will be closed */ private void closeOutputStream(OutputStream stream) { if (stream != null) try { stream.close(); } catch (Exception e) { OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/ExtensionDesc.java0000644000000000000000000000013213441742745023673 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/ExtensionDesc.java0000644000175000002070000001044213441742745024504 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.*; import java.net.*; import java.util.*; import net.sourceforge.jnlp.util.logging.OutputController; /** * The extension element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.8 $ */ public class ExtensionDesc { /** the extension name */ private final String name; /** the required extension version */ private final Version version; /** the location of the extension JNLP file */ private final URL location; /** the JNLPFile the extension refers to */ private JNLPFile file; /** map from ext-part to local part */ private final Map extToPart = new HashMap<>(); /** eager ext parts */ private final List eagerExtParts = new ArrayList<>(); /** * Create an extention descriptor. * * @param name the extension name * @param version the required version of the extention JNLPFile * @param location the location of the extention JNLP file */ public ExtensionDesc(String name, Version version, URL location) { this.name = name; this.version = version; this.location = location; } /** * Adds an extension part to be downloaded when the specified * part of the main JNLP file is loaded. The extension part * will be downloaded before the application is launched if the * lazy value is false or the part is empty or null. * * @param extPart the part name in the extension file * @param part the part name in the main file * @param lazy whether to load the part before launching */ protected void addPart(String extPart, String part, boolean lazy) { extToPart.put(extPart, part); if (!lazy || part == null || part.length() == 0) eagerExtParts.add(extPart); } /** * @param thisPart unimplemented * @return the parts in the extension JNLP file mapped to the * part of the main file. */ public String[] getExtensionParts(String thisPart) { return null; } /** * @return the name of the extension. */ public String getName() { return name; } /** * @return the required version of the extension JNLP file. */ public Version getVersion() { return version; } /** * @return the location of the extension JNLP file. */ public URL getLocation() { return location; } /** * Resolves the extension by creating a JNLPFile from the file * specified by the extension's location property. * * @throws IOException if the extension JNLPFile could not be resolved. * @throws ParseException if the extension JNLPFile could not be * parsed or was not a component or installer descriptor. */ public void resolve() throws ParseException, IOException { if (file == null) { file = new JNLPFile(location); OutputController.getLogger().log("Resolve: " + file.getInformation().getTitle()); // check for it being an extension descriptor if (!file.isComponent() && !file.isInstaller()) throw new ParseException(R("JInvalidExtensionDescriptor", name, location)); } } /** * @return a JNLPFile for the extension, or null if the JNLP * file has not been resolved. */ public JNLPFile getJNLPFile() { return file; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/ResourcesDesc.java0000644000000000000000000000013213441742745023671 xustar0030 mtime=1552401893.030832841 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/ResourcesDesc.java0000644000175000002070000001676313441742745024516 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.util.*; /** * The resources element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.7 $ */ public class ResourcesDesc { /** the locales of these resources */ private final Locale locales[]; /** the OS for these resources */ private final String os[]; /** the arch for these resources */ private final String arch[]; /** the JNLPFile this information is for */ private final JNLPFile jnlpFile; /** list of jars, packages, properties, and extensions */ private final List resources = new ArrayList<>(); // mixed list makes easier for lookup code /** * Create a representation of one information section of the * JNLP File. * * @param jnlpFile JNLP file the resources are for * @param locales the locales of these resources * @param os the os of these resources * @param arch the arch of these resources */ public ResourcesDesc(JNLPFile jnlpFile, Locale locales[], String os[], String arch[]) { this.jnlpFile = jnlpFile; this.locales = locales; this.os = os; this.arch = arch; } /** * @return the JVMs. */ public JREDesc[] getJREs() { List lresources = getResources(JREDesc.class); return lresources.toArray(new JREDesc[lresources.size()]); } public static JARDesc getMainJAR(JARDesc jars[] ) { return getMainJAR(Arrays.asList(jars)); } public static JARDesc getMainJAR(List jars) { for (JARDesc jar : jars) { if (jar.isMain()) { return jar; } } if (jars.size() > 0) { return jars.get(0); } else { return null; } } /** * @return the main JAR for these resources. There first JAR * is returned if no JARs are specified as the main JAR, and if * there are no JARs defined then null is returned. */ public JARDesc getMainJAR() { return getMainJAR(getJARs()); } /** * @return all of the JARs. */ public JARDesc[] getJARs() { List lresources = getResources(JARDesc.class); return lresources.toArray(new JARDesc[lresources.size()]); } /** * @return the JARs with the specified part name. * * @param partName the part name, null and "" equivalent */ public JARDesc[] getJARs(String partName) { List lresources = getResources(JARDesc.class); for (int i = lresources.size(); i-- > 0;) { JARDesc jar = lresources.get(i); if (!("" + jar.getPart()).equals("" + partName)) lresources.remove(i); } return lresources.toArray(new JARDesc[lresources.size()]); } /** * @return the Extensions. */ public ExtensionDesc[] getExtensions() { List lresources = getResources(ExtensionDesc.class); return lresources.toArray(new ExtensionDesc[lresources.size()]); } /** * @return the Packages. */ public PackageDesc[] getPackages() { List lresources = getResources(PackageDesc.class); return lresources.toArray(new PackageDesc[lresources.size()]); } /** * Returns the Packages that match the specified class name. * * @param className the fully qualified class name * @return the PackageDesc objects matching the class name */ public PackageDesc[] getPackages(String className) { List lresources = getResources(PackageDesc.class); for (int i = lresources.size(); i-- > 0;) { PackageDesc pk = lresources.get(i); if (!pk.matches(className)) lresources.remove(i); } return lresources.toArray(new PackageDesc[lresources.size()]); } /** * @return the Properties as a list. */ public PropertyDesc[] getProperties() { List lresources = getResources(PropertyDesc.class); return lresources.toArray(new PropertyDesc[lresources.size()]); } /** * @return the properties as a map. */ public Map getPropertiesMap() { Map properties = new HashMap<>(); List lresources = getResources(PropertyDesc.class); for (PropertyDesc prop : lresources) { properties.put(prop.getKey(), prop.getValue()); } return properties; } /** * @return the os required by these resources, or null if no * locale was specified in the JNLP file. */ public String[] getOS() { return os; } /** * @return the architecture required by these resources, or null * if no locale was specified in the JNLP file. */ public String[] getArch() { return arch; } /** * @return the locale required by these resources, or null if no * locale was specified in the JNLP file. */ public Locale[] getLocales() { return locales; } /** * @return the JNLPFile the resources are for. */ public JNLPFile getJNLPFile() { return jnlpFile; } /** * @param type of resource to be found * @param type resource to be found * @return all resources of the specified type. */ public List getResources(Class type) { List result = new ArrayList<>(); for (Object resource : resources) { if (resource instanceof JREDesc) { JREDesc jre = (JREDesc) resource; List descs = jre.getResourcesDesc(); for (ResourcesDesc desc : descs) { result.addAll(desc.getResources(type)); } } if (isWontedResource(resource, type)) { result.add(getWontedResource(resource, type)); } } return result; } private static boolean isWontedResource(Object resource, Class type) { T l = getWontedResource(resource, type); return l != null; } private static T getWontedResource(Object resource, Class type) { if (type.isAssignableFrom(resource.getClass())) { return type.cast(resource); } return null; } /** * Add a resource. * @param resource to be added */ public void addResource(Object resource) { // if this is going to stay public it should probably take an // interface instead of an Object if (resource == null) throw new IllegalArgumentException("null resource"); resources.add(resource); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/Parser.java0000644000000000000000000000013213441742745022354 xustar0030 mtime=1552401893.029832844 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/Parser.java0000644000175000002070000014573413441742745023202 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // Copyright (C) 2009-2013 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import static net.sourceforge.jnlp.runtime.Translator.R; import java.io.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sourceforge.jnlp.SecurityDesc.RequestedPermissionLevel; import net.sourceforge.jnlp.UpdateDesc.Check; import net.sourceforge.jnlp.UpdateDesc.Policy; import net.sourceforge.jnlp.runtime.JNLPRuntime; import net.sourceforge.jnlp.util.logging.OutputController; /** * Contains methods to parse an XML document into a JNLPFile. Implements JNLP * specification version 1.0. * * @author Jon A. Maxwell * (JAM) - initial author * @version $Revision: 1.13 $ */ public final class Parser { private static String CODEBASE = "codebase"; private static String MAINCLASS = "main-class"; private static final Pattern anyWhiteSpace = Pattern.compile("\\s"); // defines netx.jnlp.Node class if using Tiny XML or Nano XML // Currently uses the Nano XML parse. Search for "SAX" or // "TINY" or "NANO" and uncomment those blocks and comment the // active ones (if any) to switch XML parsers. Also // (un)comment appropriate Node class at end of this file and // do a clean build. /** * Ensure consistent error handling. */ /* SAX static ErrorHandler errorHandler = new ErrorHandler() { public void error(SAXParseException exception) throws SAXParseException { //throw exception; } public void fatalError(SAXParseException exception) throws SAXParseException { //throw exception; } public void warning(SAXParseException exception) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "XML parse warning:"); OutputController.getLogger().log(OutputController.Level.ERROR_ALL, exception); } }; */ // fix: some descriptors need to use the jnlp file at a later // date and having file ref lets us pass it to their // constructors // /** * the file reference */ private final JNLPFile file; // do not use (uninitialized) /** * the root node */ private final Node root; /** * the specification version */ private final Version spec; /** * the base URL that all hrefs are relative to */ private final URL base; /** * the codebase URL */ private URL codebase; /** * the file URL */ private final URL fileLocation; /** * whether to throw errors on non-fatal errors. */ private final boolean strict; // if strict==true parses a file with no error then strict==false should also /** * whether to allow extensions to the JNLP specification */ private final boolean allowExtensions; // true if extensions to JNLP spec are ok /** * Create a parser for the JNLP file. If the location parameters is not null * it is used as the default codebase (does not override value of jnlp * element's href attribute). *

    * The root node may be normalized as a side effect of this constructor. *

    * * @param file the (uninitialized) file reference * @param base if codebase is not specified, a default base for relative * URLs * @param root the root node * @param settings the parser settings to use when parsing the JNLP file * @throws ParseException if the JNLP file is invalid */ public Parser(JNLPFile file, URL base, Node root, ParserSettings settings) throws ParseException { this(file, base, root, settings, null); } /** * Create a parser for the JNLP file. If the location parameters is not null * it is used as the default codebase (does not override value of jnlp * element's href attribute). *

    * The root node may be normalized as a side effect of this constructor. *

    * * @param file the (uninitialized) file reference * @param base if codebase is not specified, a default base for relative * URLs * @param root the root node * @param settings the parser settings to use when parsing the JNLP file * @param codebase codebase to use if we did not parse one from JNLP file. * @throws ParseException if the JNLP file is invalid */ public Parser(JNLPFile file, URL base, Node root, ParserSettings settings, URL codebase) throws ParseException { this.file = file; this.root = root; this.strict = settings.isStrict(); this.allowExtensions = settings.isExtensionAllowed(); // ensure it's a JNLP node if (root == null || !root.getNodeName().getName().equals("jnlp")) { throw new ParseException(R("PInvalidRoot")); } // JNLP tag information this.spec = getVersion(root, "spec", "1.0+"); try { this.codebase = addSlash(getURL(root, CODEBASE, base)); } catch (ParseException e) { //If parsing fails, continue by overriding the codebase with the one passed in } if (this.codebase == null) // Codebase is overwritten if codebase was not specified in file or if parsing of it failed { this.codebase = codebase; } this.base = (this.codebase != null) ? this.codebase : base; // if codebase not specified use default codebase fileLocation = getURL(root, "href", this.base); // normalize the text nodes root.normalize(); } /** * Returns the file version. * * @return version of file */ public Version getFileVersion() { return getVersion(root, "version", null); } /** * Returns the file location. * * @return url of source file */ public URL getFileLocation() { return fileLocation; } /** * @return the codebase. */ public URL getCodeBase() { return codebase; } /** * @return the specification version. * */ public Version getSpecVersion() { return spec; } UpdateDesc getUpdate(Node parent) throws ParseException { UpdateDesc updateDesc = null; Node child = parent.getFirstChild(); while (child != null) { if (child.getNodeName().getName().equals("update")) { if (strict && updateDesc != null) { throw new ParseException(R("PTwoUpdates")); } Node node = child; Check check; String checkValue = getAttribute(node, "check", "timeout"); switch (checkValue) { case "always": check = Check.ALWAYS; break; case "timeout": check = Check.TIMEOUT; break; case "background": check = Check.BACKGROUND; break; default: check = Check.TIMEOUT; break; } String policyString = getAttribute(node, "policy", "always"); Policy policy; switch (policyString) { case "always": policy = Policy.ALWAYS; break; case "prompt-update": policy = Policy.PROMPT_UPDATE; break; case "prompt-run": policy = Policy.PROMPT_RUN; break; default: policy = Policy.ALWAYS; break; } updateDesc = new UpdateDesc(check, policy); } child = child.getNextSibling(); } if (updateDesc == null) { updateDesc = new UpdateDesc(Check.TIMEOUT, Policy.ALWAYS); } return updateDesc; } // // This section loads the resources elements // /** * @return all of the ResourcesDesc elements under the specified node (jnlp * or j2se). * * @param parent the parent node (either jnlp or j2se) * @param j2se true if the resources are located under a j2se or java node * @throws ParseException if the JNLP file is invalid */ public List getResources(Node parent, boolean j2se) throws ParseException { List result = new ArrayList<>(); Node resources[] = getChildNodes(parent, "resources"); // ensure that there are at least one information section present if (resources.length == 0 && !j2se) { throw new ParseException(R("PNoResources")); } for (Node resource : resources) { result.add(getResourcesDesc(resource, j2se)); } return result; } /** * @return the ResourcesDesc element at the specified node. * * @param node the resources node * @param j2se true if the resources are located under a j2se or java node * @throws ParseException if the JNLP file is invalid */ private ResourcesDesc getResourcesDesc(Node node, boolean j2se) throws ParseException { boolean mainFlag = false; // if found a main tag // create resources ResourcesDesc resources = new ResourcesDesc(file, getLocales(node), splitString(getAttribute(node, "os", null)), splitString(getAttribute(node, "arch", null))); // step through the elements Node child = node.getFirstChild(); while (child != null) { String name = child.getNodeName().getName(); // check for nativelib but no trusted environment if ("nativelib".equals(name)) { if (!isTrustedEnvironment()) { throw new ParseException(R("PUntrustedNative")); } } if ("j2se".equals(name) || "java".equals(name)) { if (getChildNode(root, "component-desc") != null) { if (strict) { throw new ParseException(R("PExtensionHasJ2SE")); } } if (!j2se) { resources.addResource(getJRE(child)); } else { throw new ParseException(R("PInnerJ2SE")); } } if ("jar".equals(name) || "nativelib".equals(name)) { JARDesc jar = getJAR(child); // check for duplicate main entries if (jar.isMain()) { if (mainFlag == true) { if (strict) { throw new ParseException(R("PTwoMains")); } } mainFlag = true; } resources.addResource(jar); } if ("extension".equals(name)) { resources.addResource(getExtension(child)); } if ("property".equals(name)) { resources.addResource(getProperty(child)); } if ("package".equals(name)) { resources.addResource(getPackage(child)); } child = child.getNextSibling(); } return resources; } /** * @return the JRE element at the specified node. * * @param node the j2se/java node * @throws ParseException if the JNLP file is invalid */ private JREDesc getJRE(Node node) throws ParseException { Version version = getVersion(node, "version", null); URL location = getURL(node, "href", base); String vmArgs = getAttribute(node, "java-vm-args", null); try { checkVMArgs(vmArgs); } catch (IllegalArgumentException argumentException) { vmArgs = null; } String initialHeap = getAttribute(node, "initial-heap-size", null); String maxHeap = getAttribute(node, "max-heap-size", null); List resources = getResources(node, true); // require version attribute getRequiredAttribute(node, "version", null); return new JREDesc(new Version.JreVersion(version.toString(), strict), location, vmArgs, initialHeap, maxHeap, resources); } /** * Returns the JAR element at the specified node. * * @param node the jar or nativelib node * @throws ParseException if the JNLP file is invalid */ private JARDesc getJAR(Node node) throws ParseException { boolean nativeJar = "nativelib".equals(node.getNodeName().getName()); URL location = getRequiredURL(node, "href", base); Version version = getVersion(node, "version", null); String part = getAttribute(node, "part", null); boolean main = "true".equals(getAttribute(node, "main", "false")); boolean lazy = "lazy".equals(getAttribute(node, "download", "eager")); if (nativeJar && main) { if (strict) { throw new ParseException(R("PNativeHasMain")); } } return new JARDesc(location, version, part, lazy, main, nativeJar, true); } /** * @return the Extension element at the specified node. * * @param node the extension node * @throws ParseException if the JNLP file is invalid */ private ExtensionDesc getExtension(Node node) throws ParseException { String name = getAttribute(node, "name", null); Version version = getVersion(node, "version", null); URL location = getRequiredURL(node, "href", base); ExtensionDesc ext = new ExtensionDesc(name, version, location); Node dload[] = getChildNodes(node, "ext-download"); for (Node dload1 : dload) { boolean lazy = "lazy".equals(getAttribute(dload1, "download", "eager")); ext.addPart(getRequiredAttribute(dload1, "ext-part", null), getAttribute(dload1, "part", null), lazy); } return ext; } /** * @return the Property element at the specified node. * * @param node the property node * @throws ParseException if the JNLP file is invalid */ private PropertyDesc getProperty(Node node) throws ParseException { String name = getRequiredAttribute(node, "name", null); String value = getRequiredAttribute(node, "value", ""); return new PropertyDesc(name, value); } /** * @return the Package element at the specified node. * * @param node the package node * @throws ParseException if the JNLP file is invalid */ private PackageDesc getPackage(Node node) throws ParseException { String name = getRequiredAttribute(node, "name", null); String part = getRequiredAttribute(node, "part", ""); boolean recursive = getAttribute(node, "recursive", "false").equals("true"); return new PackageDesc(name, part, recursive); } // // This section loads the information elements // /** * Make sure a title and vendor are present and nonempty and localized as * best matching as possible for the JVM's current locale. Fallback to a * generalized title and vendor otherwise. If none is found, throw an * exception. * * Additionally prints homepage, description, title and vendor to stdout if * in Debug mode. * * @throws RequiredElementException */ void checkForInformation() throws RequiredElementException { OutputController.getLogger().log("Homepage: " + file.getInformation().getHomepage()); OutputController.getLogger().log("Description: " + file.getInformation().getDescription()); file.getTitle(strict); file.getVendor(strict); } /** * @return all of the information elements under the specified node. * * @param parent the parent node (jnlp) * @throws ParseException if the JNLP file is invalid */ public List getInfo(Node parent) throws ParseException { List result = new ArrayList<>(); Node info[] = getChildNodes(parent, "information"); // ensure that there are at least one information section present if (info.length == 0) { throw new MissingInformationException(); } // create objects from the info sections for (Node infoNode : info) { result.add(getInformationDesc(infoNode)); } return result; } /** * @return the information element at the specified node. * * @param node the information node * @throws ParseException if the JNLP file is invalid */ InformationDesc getInformationDesc(Node node) throws ParseException { List descriptionsUsed = new ArrayList<>(); // locale Locale locales[] = getLocales(node); // create information InformationDesc info = new InformationDesc(locales, strict); // step through the elements Node child = node.getFirstChild(); while (child != null) { String name = child.getNodeName().getName(); if ("title".equals(name)) { addInfo(info, child, null, getSpanText(child, false)); } if ("vendor".equals(name)) { addInfo(info, child, null, getSpanText(child, false)); } if ("description".equals(name)) { String kind = getAttribute(child, "kind", "default"); if (descriptionsUsed.contains(kind)) { if (strict) { throw new ParseException(R("PTwoDescriptions", kind)); } } descriptionsUsed.add(kind); addInfo(info, child, kind, getSpanText(child, false)); } if ("homepage".equals(name)) { addInfo(info, child, null, getRequiredURL(child, "href", base)); } if ("icon".equals(name)) { addInfo(info, child, getAttribute(child, "kind", "default"), getIcon(child)); } if ("offline-allowed".equals(name)) { addInfo(info, child, null, Boolean.TRUE); } if ("sharing-allowed".equals(name)) { if (strict && !allowExtensions) { throw new ParseException(R("PSharing")); } addInfo(info, child, null, Boolean.TRUE); } if ("association".equals(name)) { addInfo(info, child, null, getAssociation(child)); } if ("shortcut".equals(name)) { addInfo(info, child, null, getShortcut(child)); } if ("related-content".equals(name)) { addInfo(info, child, null, getRelatedContent(child)); } child = child.getNextSibling(); } return info; } /** * Adds a key,value pair to the information object. * * @param info the information object * @param node node name to be used as the key * @param mod key name appended with "-"+mod if not null * @param value the info object to add (icon or string) */ protected void addInfo(InformationDesc info, Node node, String mod, Object value) { String modStr = (mod == null) ? "" : "-" + mod; if (node == null) { return; } info.addItem(node.getNodeName().getName() + modStr, value); } /** * @return the icon element at the specified node. * * @param node the icon node * @throws ParseException if the JNLP file is invalid */ private IconDesc getIcon(Node node) throws ParseException { int width = Integer.parseInt(getAttribute(node, "width", "-1")); int height = Integer.parseInt(getAttribute(node, "height", "-1")); int size = Integer.parseInt(getAttribute(node, "size", "-1")); int depth = Integer.parseInt(getAttribute(node, "depth", "-1")); URL location = getRequiredURL(node, "href", base); Object kind = getAttribute(node, "kind", "default"); return new IconDesc(location, kind, width, height, depth, size); } // // This section loads the security descriptor element // /** * @return the security descriptor element. If no security element was * specified in the JNLP file then a SecurityDesc with applet permissions is * returned. * * @param parent the parent node * @throws ParseException if the JNLP file is invalid */ public SecurityDesc getSecurity(Node parent) throws ParseException { Node nodes[] = getChildNodes(parent, "security"); // test for too many security elements if (nodes.length > 1) { if (strict) { throw new ParseException(R("PTwoSecurity")); } } Object type = SecurityDesc.SANDBOX_PERMISSIONS; RequestedPermissionLevel requestedPermissionLevel = RequestedPermissionLevel.NONE; if (nodes.length == 0) { type = SecurityDesc.SANDBOX_PERMISSIONS; requestedPermissionLevel = RequestedPermissionLevel.NONE; } else if (null != getChildNode(nodes[0], "all-permissions")) { type = SecurityDesc.ALL_PERMISSIONS; requestedPermissionLevel = RequestedPermissionLevel.ALL; } else if (null != getChildNode(nodes[0], "j2ee-application-client-permissions")) { type = SecurityDesc.J2EE_PERMISSIONS; requestedPermissionLevel = RequestedPermissionLevel.J2EE; } else if (strict) { throw new ParseException(R("PEmptySecurity")); } if (base != null) { return new SecurityDesc(file, requestedPermissionLevel, type, base); } else { return new SecurityDesc(file, requestedPermissionLevel, type, null); } } /** * Returns whether the JNLP file requests a trusted execution environment. */ private boolean isTrustedEnvironment() { Node security = getChildNode(root, "security"); if (security != null) { if (getChildNode(security, "all-permissions") != null || getChildNode(security, "j2ee-application-client-permissions") != null) { return true; } } return false; } // // This section loads the launch descriptor element // /** * @return the launch descriptor element, either AppletDesc, * ApplicationDesc, or InstallerDesc. * * @param parent the parent node * @throws ParseException if the JNLP file is invalid */ public LaunchDesc getLauncher(Node parent) throws ParseException { // check for other than one application type if (1 < getChildNodes(parent, "applet-desc").length + getChildNodes(parent, "application-desc").length + getChildNodes(parent, "javafx-desc").length + getChildNodes(parent, "installer-desc").length) { throw new ParseException(R("PTwoDescriptors")); } Node child = parent.getFirstChild(); while (child != null) { String name = child.getNodeName().getName(); if ("applet-desc".equals(name)) { return getApplet(child); } if ("application-desc".equals(name)) { return getApplication(child, false); } if ("installer-desc".equals(name)) { return getInstaller(child); } if ("javafx-desc".equals(name)) { return getApplication(child, true); } child = child.getNextSibling(); } // not reached return null; } /** * @param node * @return the applet descriptor. * * @throws ParseException if the JNLP file is invalid */ private AppletDesc getApplet(Node node) throws ParseException { String name = getRequiredAttribute(node, "name", R("PUnknownApplet")); String main = getMainClass(node, true); URL docbase = getURL(node, "documentbase", base); Map paramMap = new HashMap<>(); int width = 0; int height = 0; try { width = Integer.parseInt(getRequiredAttribute(node, "width", "100")); height = Integer.parseInt(getRequiredAttribute(node, "height", "100")); } catch (NumberFormatException nfe) { if (width <= 0) { throw new ParseException(R("PBadWidth")); } throw new ParseException(R("PBadWidth")); } // read params Node params[] = getChildNodes(node, "param"); for (Node param : params) { paramMap.put(getRequiredAttribute(param, "name", null), getRequiredAttribute(param, "value", "")); } return new AppletDesc(name, main, docbase, width, height, paramMap); } /** * @return the application descriptor. * * @param node * @throws ParseException if the JNLP file is invalid */ private ApplicationDesc getApplication(Node node, boolean isFx) throws ParseException { String main = getMainClass(node, false); List argsList = new ArrayList<>(); // if (main == null) // only ok if can be found in main jar file (can't check here but make a note) // read parameters Node args[] = getChildNodes(node, "argument"); for (Node arg : args) { //argsList.add( args[i].getNodeValue() ); //This approach was not finding the argument text argsList.add(getSpanText(arg)); } String argStrings[] = argsList.toArray(new String[argsList.size()]); return new ApplicationDesc(main, argStrings, isFx); } /** * @param parent * @return the component descriptor. * @throws net.sourceforge.jnlp.ParseException */ ComponentDesc getComponent(Node parent) throws ParseException { if (1 < getChildNodes(parent, "component-desc").length) { throw new ParseException(R("PTwoDescriptors")); } Node child = parent.getFirstChild(); while (child != null) { String name = child.getNodeName().getName(); if ("component-desc".equals(name)) { return new ComponentDesc(); } child = child.getNextSibling(); } return null; } /** * @param node * @return the installer descriptor. */ private InstallerDesc getInstaller(Node node) { String main = getOptionalMainClass(node); return new InstallerDesc(main); } /** * @return the association descriptor. * @param node * @throws net.sourceforge.jnlp.ParseException */ private AssociationDesc getAssociation(Node node) throws ParseException { String[] extensions = getRequiredAttribute(node, "extensions", null).split(" "); String mimeType = getRequiredAttribute(node, "mime-type", null); return new AssociationDesc(mimeType, extensions); } /** * @return the shortcut descriptor. */ private ShortcutDesc getShortcut(Node node) throws ParseException { String online = getAttribute(node, "online", "true"); boolean shortcutIsOnline = Boolean.valueOf(online); boolean showOnDesktop = false; MenuDesc menu = null; // step through the elements Node child = node.getFirstChild(); while (child != null) { String name = child.getNodeName().getName(); if (null != name) { switch (name) { case "desktop": if (showOnDesktop && strict) { throw new ParseException(R("PTwoDesktops")); } showOnDesktop = true; break; case "menu": if (menu != null && strict) { throw new ParseException(R("PTwoMenus")); } menu = getMenu(child); break; } } child = child.getNextSibling(); } ShortcutDesc shortcut = new ShortcutDesc(shortcutIsOnline, showOnDesktop); if (menu != null) { shortcut.setMenu(menu); } return shortcut; } /** * @return the menu descriptor. */ private MenuDesc getMenu(Node node) { String subMenu = getAttribute(node, "submenu", null); return new MenuDesc(subMenu); } /** * @return the related-content descriptor. */ private RelatedContentDesc getRelatedContent(Node node) throws ParseException { getRequiredAttribute(node, "href", null); URL location = getURL(node, "href", base); String title = null; String description = null; IconDesc icon = null; // step through the elements Node child = node.getFirstChild(); while (child != null) { String name = child.getNodeName().getName(); if (null != name) { switch (name) { case "title": if (title != null && strict) { throw new ParseException(R("PTwoTitles")); } title = getSpanText(child, false); break; case "description": if (description != null && strict) { throw new ParseException(R("PTwoDescriptions")); } description = getSpanText(child, false); break; case "icon": if (icon != null && strict) { throw new ParseException(R("PTwoIcons")); } icon = getIcon(child); break; } } child = child.getNextSibling(); } RelatedContentDesc relatedContent = new RelatedContentDesc(location); relatedContent.setDescription(description); relatedContent.setIconDesc(icon); relatedContent.setTitle(title); return relatedContent; } // other methods /** * @return an array of substrings seperated by spaces (spaces escaped with * backslash do not separate strings). This method splits strings as per the * spec except that it does replace escaped other characters with their own * value. */ private String[] splitString(String source) { if (source == null) { return new String[0]; } List result = new ArrayList(); StringTokenizer st = new StringTokenizer(source, " "); StringBuilder part = new StringBuilder(); while (st.hasMoreTokens()) { part.setLength(0); // tack together tokens joined by backslash while (true) { part.append(st.nextToken()); if (st.hasMoreTokens() && part.charAt(part.length() - 1) == '\\') { part.setCharAt(part.length() - 1, ' '); // join with the space } else { break; // bizarre while format gets \ at end of string right (no extra space added at end) } } // delete \ quote chars for (int i = part.length(); i-- > 0;) // sweet syntax for reverse loop { if (part.charAt(i) == '\\') { part.deleteCharAt(i--); // and skip previous char so \\ becomes \ } } result.add(part.toString()); } return result.toArray(new String[result.size()]); } /** * @return the Locale object(s) from a node's locale attribute. * * @param node the node with a locale attribute */ private Locale[] getLocales(Node node) { List locales = new ArrayList<>(); String localeParts[] = splitString(getAttribute(node, "locale", "")); for (String localePart : localeParts) { Locale l = getLocale(localePart); if (l != null) { locales.add(l); } } return locales.toArray(new Locale[locales.size()]); } /** * Returns a {@link Locale} from a single locale. * * @param localeStr the locale string * @return locale of document */ public Locale getLocale(String localeStr) { if (localeStr.length() < 2) { return null; } String language = localeStr.substring(0, 2); String country = (localeStr.length() < 5) ? "" : localeStr.substring(3, 5); String variant = (localeStr.length() > 7) ? localeStr.substring(6) : ""; // null is not allowed n locale but "" is return new Locale(language, country, variant); } // XML junk /** * Returns the implied text under a node, for example "text" in * "<description>text</description>". * * @param node the node with text under it * @return * @throws ParseException if the JNLP file is invalid */ private String getSpanText(Node node) throws ParseException { return getSpanText(node, true); } /** * Returns the implied text under a node, for example "text" in * "<description>text</description>". If preserveSpacing is * false, sequences of whitespace characters are turned into a single space * character. * * @param node the node with text under it * @param preserveSpacing if true, preserve whitespace * @throws ParseException if the JNLP file is invalid */ private String getSpanText(Node node, boolean preserveSpacing) throws ParseException { if (node == null) { return null; } // NANO String val = node.getNodeValue(); if (preserveSpacing) { return val; } else if (val == null) { return null; } else { return val.replaceAll("\\s+", " "); } /* TINY Node child = node.getFirstChild(); if (child == null) { if (strict) // not sure if this is an error or whether "" is proper throw new ParseException("No text specified (node="+node.getNodeName().getName()+")"); else return ""; } return child.getNodeValue(); */ } /** * Returns the first child node with the specified name. */ private static Node getChildNode(Node node, String name) { Node[] result = getChildNodes(node, name); if (result.length == 0) { return null; } else { return result[0]; } } /** * Returns all child nodes with the specified name. */ private static Node[] getChildNodes(Node node, String name) { List result = new ArrayList<>(); Node child = node.getFirstChild(); while (child != null) { if (child.getNodeName().getName().equals(name)) { result.add(child); } child = child.getNextSibling(); } return result.toArray(new Node[result.size()]); } /** * Returns a URL with a trailing / appended to it if there is no trailing * slash on the specifed URL. */ private URL addSlash(URL source) { if (source == null) { return null; } if (!source.toString().endsWith("/")) { try { source = new URL(source.toString() + "/"); } catch (MalformedURLException ex) { } } return source; } /** * @return the same result as getURL except that a ParseException is thrown * if the attribute is null or empty. * * @param node the node * @param name the attribute containing an href * @param base the base URL * @throws ParseException if the JNLP file is invalid */ private URL getRequiredURL(Node node, String name, URL base) throws ParseException { // probably should change "" to null so that url is always // required even if !strict getRequiredAttribute(node, name, ""); return getURL(node, name, base); } /** * @return a URL object from a href string relative to the code base. If the * href denotes a relative URL, it must reference a location that is a * subdirectory of the codebase. * * @param node the node * @param name the attribute containing an href * @param base the base URL * @throws ParseException if the JNLP file is invalid */ public URL getURL(Node node, String name, URL base) throws ParseException { String href; if (CODEBASE.equals(name)) { href = getCleanAttribute(node, name); //in case of null code can throw an exception later //some bogus jnlps have codebase as "" and expect it behaving as "." if (href != null && href.trim().isEmpty()) { href = "."; } } else { href = getAttribute(node, name, null); } return getURL(href, node.getNodeName().getName(), base, strict); } public static URL getURL(String href, String nodeName, URL base, boolean strict) throws ParseException { if (href == null) { return null; // so that code can throw an exception if attribute was required } try { if (base == null) { return new URL(href); } else { try { return new URL(href); } catch (MalformedURLException ex) { // is relative } URL result = new URL(base, href); // check for going above the codebase if (!result.toString().startsWith(base.toString()) && !base.toString().startsWith(result.toString())) { if (strict) { throw new ParseException(R("PUrlNotInCodebase", nodeName, href, base)); } } return result; } } catch (MalformedURLException ex) { if (base == null) { throw new ParseException(R("PBadNonrelativeUrl", nodeName, href)); } else { throw new ParseException(R("PBadRelativeUrl", nodeName, href, base)); } } } /** * @return a Version from the specified attribute and default value. * * @param node the node * @param name the attribute * @param defaultValue default if no such attribute * @return a Version, or null if no such attribute and default is null */ private Version getVersion(Node node, String name, String defaultValue) { String version = getAttribute(node, name, defaultValue); if (version == null) { return null; } else { return new Version(version); } } /** * Check that the VM args are valid and safe * * @param vmArgs a string containing the args * @throws ParseException if the VM arguments are invalid or dangerous */ private void checkVMArgs(String vmArgs) throws IllegalArgumentException { if (vmArgs == null) { return; } List validArguments = Arrays.asList(getValidVMArguments()); List validStartingArguments = Arrays.asList(getValidStartingVMArguments()); String[] arguments = vmArgs.split(" "); boolean argumentIsValid; for (String argument : arguments) { argumentIsValid = false; if (validArguments.contains(argument)) { argumentIsValid = true; } else { for (String validStartingArgument : validStartingArguments) { if (argument.startsWith(validStartingArgument)) { argumentIsValid = true; break; } } } if (!argumentIsValid) { throw new IllegalArgumentException(argument); } } } /** * Returns an array of valid (ie safe and supported) arguments for the JVM * * Based on * http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html */ private String[] getValidVMArguments() { return new String[]{ "-d32", /* use a 32-bit data model if available */ "-client", /* to select the client VM */ "-server", /* to select the server VM */ "-verbose", /* enable verbose output */ "-version", /* print product version and exit */ "-showversion", /* print product version and continue */ "-help", /* print this help message */ "-X", /* print help on non-standard options */ "-ea", /* enable assertions */ "-enableassertions", /* enable assertions */ "-da", /* disable assertions */ "-disableassertions", /* disable assertions */ "-esa", /* enable system assertions */ "-enablesystemassertions", /* enable system assertions */ "-dsa", /* disable system assertione */ "-disablesystemassertions", /* disable system assertione */ "-Xmixed", /* mixed mode execution (default) */ "-Xint", /* interpreted mode execution only */ "-Xnoclassgc", /* disable class garbage collection */ "-Xincgc", /* enable incremental garbage collection */ "-Xbatch", /* disable background compilation */ "-Xprof", /* output cpu profiling data */ "-Xdebug", /* enable remote debugging */ "-Xfuture", /* enable strictest checks, anticipating future default */ "-Xrs", /* reduce use of OS signals by Java/VM (see documentation) */ "-XX:+ForceTimeHighResolution", /* use high resolution timer */ "-XX:-ForceTimeHighResolution", /* use low resolution (default) */}; } /** * Returns an array containing the starts of valid (ie safe and supported) * arguments for the JVM * * Based on * http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html */ private String[] getValidStartingVMArguments() { return new String[]{ "-ea", /* enable assertions for classes */ "-enableassertions", /* enable assertions for classes */ "-da", /* disable assertions for classes */ "-disableassertions", /* disable assertions for classes */ "-verbose", /* enable verbose output */ "-Xms", /* set initial Java heap size */ "-Xmx", /* set maximum Java heap size */ "-Xss", /* set java thread stack size */ "-XX:NewRatio", /* set Ratio of new/old gen sizes */ "-XX:NewSize", /* set initial size of new generation */ "-XX:MaxNewSize", /* set max size of new generation */ "-XX:PermSize", /* set initial size of permanent gen */ "-XX:MaxPermSize", /* set max size of permanent gen */ "-XX:MaxHeapFreeRatio", /* heap free percentage (default 70) */ "-XX:MinHeapFreeRatio", /* heap free percentage (default 40) */ "-XX:UseSerialGC", /* use serial garbage collection */ "-XX:ThreadStackSize", /* thread stack size (in KB) */ "-XX:MaxInlineSize", /* set max num of bytecodes to inline */ "-XX:ReservedCodeCacheSize", /* Reserved code cache size (bytes) */ "-XX:MaxDirectMemorySize",}; } /** * @return the same result as getAttribute except that if strict mode is * enabled or the default value is null a parse exception is thrown instead * of returning the default value. * * @param node the node * @param name the attribute * @param defaultValue default value * @throws ParseException if the attribute does not exist or is empty */ private String getRequiredAttribute(Node node, String name, String defaultValue) throws ParseException { String result = getAttribute(node, name, null); if (result == null || result.length() == 0) { if (strict || defaultValue == null) { throw new ParseException(R("PNeedsAttribute", node.getNodeName().getName(), name)); } } if (result == null) { return defaultValue; } else { return result; } } /** * @return an attribute or the specified defaultValue if there is no such * attribute. * * @param node the node * @param name the attribute * @param defaultValue default if no such attribute */ private String getAttribute(Node node, String name, String defaultValue) { // SAX // String result = ((Element) node).getAttribute(name); String result = getCleanAttribute(node, name); if (result == null || result.length() == 0) { return defaultValue; } return result; } private String getCleanAttribute(Node node, String name) { String result = node.getAttribute(name); return result; } public static final String MALFORMED_PARSER_CLASS = "net.sourceforge.jnlp.MalformedXMLParser"; public static final String NORMAL_PARSER_CLASS = "net.sourceforge.jnlp.XMLParser"; /** * @return the root node from the XML document in the specified input * stream. * * @throws ParseException if the JNLP file is invalid */ public static Node getRootNode(InputStream input, ParserSettings settings) throws ParseException { try { Object parser = getParserInstance(settings); Method m = parser.getClass().getMethod("getRootNode", InputStream.class); return (Node) m.invoke(parser, input); } catch (InvocationTargetException e) { if (e.getCause() instanceof ParseException) { throw (ParseException) (e.getCause()); } throw new ParseException(R("PBadXML"), e); } catch (Exception e) { throw new ParseException(R("PBadXML"), e); } } public static Object getParserInstance(ParserSettings settings) throws ClassNotFoundException, IllegalAccessException, InstantiationException { String className; if (settings.isMalformedXmlAllowed()) { className = MALFORMED_PARSER_CLASS; ParseException.setExpected(ParseException.UsedParsers.MALFORMED); } else { className = NORMAL_PARSER_CLASS; ParseException.setExpected(ParseException.UsedParsers.NORMAL); } Class klass; Object instance; try { klass = Class.forName(className); instance = klass.newInstance(); //catch both, for case that tagsoup was removed after build } catch (ClassNotFoundException | NoClassDefFoundError | InstantiationException e) { OutputController.getLogger().log(e); klass = Class.forName(NORMAL_PARSER_CLASS); instance = klass.newInstance(); } switch (instance.getClass().getName()) { case MALFORMED_PARSER_CLASS: ParseException.setUsed(ParseException.UsedParsers.MALFORMED); break; case NORMAL_PARSER_CLASS: ParseException.setUsed(ParseException.UsedParsers.NORMAL); break; } return instance; } private String getOptionalMainClass(Node node) { try { return getMainClass(node, false); } catch (ParseException ex) { //only getRequiredAttribute can throw this //and as there is call to getMainClass with required false //it is not going to be thrown OutputController.getLogger().log(ex); return null; } } private String getMainClass(Node node, boolean required) throws ParseException { String main; if (required) { main = getRequiredAttribute(node, MAINCLASS, null); } else { main = getAttribute(node, MAINCLASS, null); } return cleanMainClassAttribute(main); } private String cleanMainClassAttribute(String main) throws ParseException { if (main != null) { Matcher matcher = anyWhiteSpace.matcher(main); boolean found = matcher.find(); if (found && !strict) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "Warning! main-class contains whitespace - '" + main + "'"); main = main.trim(); OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "Trimmed - '" + main + "'"); } boolean valid = true; if (!Character.isJavaIdentifierStart(main.charAt(0))) { valid = false; OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Invlaid char in main-class: '" + main.charAt(0) + "'"); } for (int i = 1; i < main.length(); i++) { if (main.charAt(i) == '.') { //dot connects identifiers continue; } if (!Character.isJavaIdentifierPart(main.charAt(i))) { valid = false; OutputController.getLogger().log(OutputController.Level.MESSAGE_DEBUG, "Invlaid char in main-class: '" + main.charAt(i) + "'"); } } if (!valid) { OutputController.getLogger().log(OutputController.Level.WARNING_ALL, "main-class contains invalid characters - '" + main + "'. Check with vendor."); if (strict) { throw new ParseException("main-class contains invalid characters - '" + main + "'. Check with vendor. You are in strict mode. This is fatal."); } } } return main; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/MissingTitleException.java0000644000000000000000000000013213441742745025412 xustar0030 mtime=1552401893.028832846 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/MissingTitleException.java0000644000175000002070000000303713441742745026225 0ustar00jvanekmock00000000000000// Copyright (C) 2012 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import static net.sourceforge.jnlp.runtime.Translator.R; /** * Thrown when a title that is required from the information tag is not found * under the current JVM's locale or as a generalized element. */ public class MissingTitleException extends RequiredElementException { private static final long serialVersionUID = 1L; private static final String message = R("PMissingElement", R("PMissingTitle")); /* (non-Javadoc) * @see net.sourceforge.jnlp.ParseException(String) */ public MissingTitleException() { super(message); } /* (non-Javadoc) * @see net.sourceforge.jnlp.ParseException(String, Throwable) */ public MissingTitleException(Throwable cause) { super(message, cause); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/JREDesc.java0000644000000000000000000000013213441742745022337 xustar0030 mtime=1552401893.028832846 30 atime=1552402157.226253505 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/JREDesc.java0000644000175000002070000001117113441742745023150 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.net.URL; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import static net.sourceforge.jnlp.runtime.Translator.R; /** * The J2SE/Java element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.5 $ */ public class JREDesc { private static final Pattern heapPattern= Pattern.compile("\\d+[kmg]?"); /** the platform version or the product version if location is not null */ final private Version.JreVersion version; /** the location of a JRE product or null */ final private URL location; /** inital heap size */ final private String initialHeapSize; /** maximum head size */ final private String maximumHeapSize; /** args to pass to the vm */ final private String vmArgs; /** list of ResourceDesc objects */ final private List resources; /** * Create a JRE descriptor. * * @param version the platform version or the product version * if location is not null * @param location the location of a JRE product or null * @param vmArgs arguments to VM * @param initialHeapSize initial heap size * @param maximumHeapSize maximum head size * @param resources list of ResourceDesc objects * @throws net.sourceforge.jnlp.ParseException is something goes wrong */ public JREDesc(Version.JreVersion version, URL location, String vmArgs, String initialHeapSize, String maximumHeapSize, List resources) throws ParseException { this.version = version; this.location = location; this.vmArgs = vmArgs; this.initialHeapSize = checkHeapSize(initialHeapSize); this.maximumHeapSize = checkHeapSize(maximumHeapSize); this.resources = resources; } /** * @return the JRE version. Use isPlatformVersion to * determine if this version corresponds to a platform or * product version. */ public Version.JreVersion getVersion() { return version; } /** * @return true if the JRE version is a Java platform version * (java.specification.version property) or false if it is a * product version (java.version property). */ public boolean isPlatformVersion() { return getLocation() == null; } /** * @return the JRE version string. */ public URL getLocation() { return location; } /** * @return the maximum heap size in bytes. */ public String getMaximumHeapSize() { return maximumHeapSize; } /** * @return the initial heap size in bytes. */ public String getInitialHeapSize() { return initialHeapSize; } /** * @return the resources defined for this JRE. */ public List getResourcesDesc() { return resources; } /** * @return the additional arguments to pass to the Java VM * Can be null */ public String getVMArgs() { return vmArgs; } /** * Check for valid heap size string * @return trimmed heapSize if correct * @throws ParseException if heapSize is invalid */ static String checkHeapSize(String heapSize) throws ParseException { // need to implement for completeness even though not used in netx if (heapSize == null) { return null; } heapSize = heapSize.trim(); // the last character must be 0-9 or k/K/m/M/g/G //0 or 0k/m/g is also accepted value String heapSizeLower = heapSize.toLowerCase(); Matcher heapMatcher = heapPattern.matcher(heapSizeLower); if (!heapMatcher.matches()) { throw new ParseException(R("PBadHeapSize", heapSize)); } return heapSize; } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/InformationDesc.java0000644000000000000000000000013213441742745024204 xustar0030 mtime=1552401893.027832847 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/InformationDesc.java0000644000175000002070000002023713441742745025020 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.net.*; import java.util.*; /** * The information element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.9 $ */ public class InformationDesc { // There is an understanding between this class and the parser // that description and icon types are keyed by "icon-"+kind and // "description-"+kind, and that other types are keyed by their // specification name. /** one-line description */ /**http://docs.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html**/ public static final Object ONE_LINE = "one-line"; /** short description */ public static final Object SHORT = "short"; /** tooltip description */ public static final Object TOOLTIP = "tooltip"; /** default description */ public static final Object DEFAULT = "default"; /** the locales for the information */ final private Locale locales[]; /** the data as list of key,value pairs */ private List info; final boolean strict; /** * Create an information element object. * * @param locales the locales the information is for * @param strict whether parser was strict */ public InformationDesc(Locale locales[], boolean strict) { this.locales = locales; this.strict = strict; } InformationDesc(Locale locales[]) { this(locales, false); } /** * @return the application's title. */ public String getTitle() { return (String) getItem("title"); } /** * @return the application's vendor. */ public String getVendor() { return (String) getItem("vendor"); } /** * @return the application's homepage. */ public URL getHomepage() { return (URL) getItem("homepage"); } /** * @return the default description for the application. */ public String getDescription() { String result = getDescription(DEFAULT); // try to find any description if default is null if (result == null) result = getDescription(ONE_LINE); if (result == null) result = getDescription(SHORT); if (result == null) result = getDescription(TOOLTIP); return result; } /** * @return the application's description of the specified type. * * @param kind one of Information.SHORT, Information.ONE_LINE, * Information.TOOLTIP, Information.DEFAULT */ public String getDescription(Object kind) { String result = getDescriptionStrict(kind); if (result == null) return (String) getItem("description-" + DEFAULT); else return result; } /** * @return the application's description of the specified type. * * @param kind one of Information.SHORT, Information.ONE_LINE, * Information.TOOLTIP, Information.DEFAULT */ public String getDescriptionStrict(Object kind) { return (String) getItem("description-" + kind); } /** * Returns the icons specified by the JNLP file. * * @param kind one of IconDesc.SELECTED, IconDesc.DISABLED, * IconDesc.ROLLOVER, IconDesc.SPLASH, IconDesc.DEFAULT * @return an array of zero of more IconDescs of the specified icon type */ public IconDesc[] getIcons(Object kind) { List icons = getItems("icon-" + kind); return icons.toArray(new IconDesc[icons.size()]); }; /** * Returns the URL of the icon closest to the specified size and * kind. This method will not return an icon smaller than the * specified width and height unless there are no other icons * available. * * @param kind the kind of icon to get * @param width desired width of icon * @param height desired height of icon * @return the closest icon by size or null if no icons declared */ public URL getIconLocation(Object kind, int width, int height) { IconDesc icons[] = getIcons(kind); if (icons.length == 0) return null; IconDesc best = null; for (IconDesc icon : icons) { if (icon.getWidth() >= width && icon.getHeight() >= height) { if (best == null) { best = icon; } if (icon.getWidth() <= best.getWidth() && icon.getHeight() <= best.getHeight()) { best = icon; } } } // FIXME if there's no larger icon, choose the closest smaller icon // instead of the first if (best == null) best = icons[0]; return best.getLocation(); } /** * @return the locales for the information. */ public Locale[] getLocales() { return locales; } /** * @return whether offline execution allowed. */ public boolean isOfflineAllowed() { if (strict) { return null != getItem("offline-allowed"); } else { // by deault itw ignore this switch. Most applications are missusing it return true; } } /** * @return whether the resources specified in the JNLP file may * be shared by more than one instance in the same JVM * (JNLP extension). This is an extension to the JNLP spec and * will always return false for standard JNLP files. */ public boolean isSharingAllowed() { return null != getItem("sharing-allowed"); } /** * @return the associations specified in the JNLP file */ public AssociationDesc[] getAssociations() { List associations = getItems("association"); return associations.toArray(new AssociationDesc[associations.size()]); } /** * @return the shortcut specified by this JNLP file */ public ShortcutDesc getShortcut() { return (ShortcutDesc) getItem("shortcut"); } /** * @return the related-contents specified by this JNLP file */ public RelatedContentDesc[] getRelatedContents() { List relatedContents = getItems("related-content"); return relatedContents.toArray(new RelatedContentDesc[relatedContents.size()]); } /** * @param key key to find item * @return the last item matching the specified key. */ protected Object getItem(Object key) { List items = getItems(key); if (items.isEmpty()) return null; else return items.get(items.size() - 1); } /** * @param key key to find item * @return all items matching the specified key. */ protected List getItems(Object key) { if (info == null) return Collections.emptyList(); List result = new ArrayList<>(); for (int i = 0; i < info.size(); i += 2) if (info.get(i).equals(key)) result.add(info.get(i + 1)); return result; } /** * Add an information item (description, icon, etc) under a * specified key name. * @param key key to place value to * @param value value to be placed to key */ protected void addItem(String key, Object value) { if (info == null) info = new ArrayList<>(); info.add(key); info.add(value); } } icedtea-web-1.8/netx/net/sourceforge/jnlp/PaxHeaders.7406/ApplicationDesc.java0000644000000000000000000000013113441742745024161 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/jnlp/ApplicationDesc.java0000644000175000002070000000411513441742745024773 0ustar00jvanekmock00000000000000// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package net.sourceforge.jnlp; import java.util.*; /** * The application-desc element. * * @author Jon A. Maxwell (JAM) - initial author * @version $Revision: 1.7 $ */ public class ApplicationDesc implements LaunchDesc { /** the main class name and package */ private final String mainClass; /** the arguments */ private String arguments[]; private final boolean fx; /** * Create an Application descriptor. * * @param mainClass the main class name and package * @param arguments the arguments */ public ApplicationDesc(String mainClass, String[] arguments, boolean isFX) { this.mainClass = mainClass; this.arguments = arguments; this.fx = isFX; } /** * @return the main class name */ @Override public String getMainClass() { return mainClass; } /** * @return the arguments */ public String[] getArguments() { return arguments.clone(); } /** * Add an argument to the end of the arguments. * @param arg argument of command */ public void addArgument(String arg) { List l = new ArrayList<>(Arrays.asList(arguments)); l.add(arg); arguments = l.toArray(arguments); } } icedtea-web-1.8/netx/net/sourceforge/PaxHeaders.7406/nanoxml0000644000000000000000000000013113441742745020710 xustar0030 mtime=1552401893.051832798 29 atime=1552410887.11418344 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/nanoxml/0000755000175000002070000000000013441742745021576 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/net/sourceforge/nanoxml/PaxHeaders.7406/XMLParseException.java0000644000000000000000000000013213441742745025143 xustar0030 mtime=1552401893.051832798 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/nanoxml/XMLParseException.java0000644000175000002070000000766013441742745025764 0ustar00jvanekmock00000000000000/* XMLParseException.java * * $Revision: 1.1 $ * $Date: 2002/08/03 04:05:32 $ * $Name: $ * * This file is part of NanoXML 2 Lite. * Copyright (C) 2000-2002 Marc De Scheemaecker, All Rights Reserved. * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from the * use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software in * a product, an acknowledgment in the product documentation would be * appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source distribution. *****************************************************************************/ package net.sourceforge.nanoxml; /** * An XMLParseException is thrown when an error occures while parsing an XML * string. *

    * $Revision: 1.1 $

    *

    * $Date: 2002/08/03 04:05:32 $

    * * @see net.sourceforge.nanoxml.XMLElement * * @author Marc De Scheemaecker * @version $Name: $, $Revision: 1.1 $ */ public class XMLParseException extends RuntimeException { /** * Indicates that no line number has been associated with this exception. */ public static final int NO_LINE = -1; /** * The line number in the source code where the error occurred, or * NO_LINE if the line number is unknown. * *
    Invariants:
    *
    • {@code lineNr > 0 || lineNr == NO_LINE} *
    */ private final int lineNr; /** * Creates an exception. * * @param name The name of the element where the error is located. * @param message A message describing what went wrong. * *
    Preconditions:
    *
    • {@code message != null}
    • *
    * *
    Postconditions:
    *
    • {@code getLineNr() => NO_LINE}
    • *
    */ public XMLParseException(String name, String message) { super("XML Parse Exception during parsing of " + ((name == null) ? "the XML definition" : ("a " + name + " element")) + ": " + message); this.lineNr = XMLParseException.NO_LINE; } /** * Creates an exception. * * @param name The name of the element where the error is located. * @param lineNr The number of the line in the input. * @param message A message describing what went wrong. * *
    Preconditions:
    *
    • {@code message != null}
    • *
    • {@code lineNr > 0}
    • *
    * *
    Postconditions:
    *
    • {@code getLineNr() => lineNr}
    • *
    */ public XMLParseException(String name, int lineNr, String message) { super("XML Parse Exception during parsing of " + ((name == null) ? "the XML definition" : ("a " + name + " element")) + " at line " + lineNr + ": " + message); this.lineNr = lineNr; } /** * Where the error occurred, or {@code NO_LINE} if the line number is * unknown. * * @return line in source where exception occurred * @see net.sourceforge.nanoxml.XMLParseException#NO_LINE */ public int getLineNr() { return this.lineNr; } } icedtea-web-1.8/netx/net/sourceforge/nanoxml/PaxHeaders.7406/XMLElement.java0000644000000000000000000000013013441742745023601 xustar0028 mtime=1552401893.0508328 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/net/sourceforge/nanoxml/XMLElement.java0000644000175000002070000012663113441742745024424 0ustar00jvanekmock00000000000000/* XMLElement.java * * $Revision: 1.2 $ * $Date: 2002/08/03 04:36:34 $ * $Name: $ * * This file is part of NanoXML 2 Lite. * Copyright (C) 2000-2002 Marc De Scheemaecker, All Rights Reserved. * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from the * use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software in * a product, an acknowledgment in the product documentation would be * appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source distribution. *****************************************************************************/ /* JAM: hacked the source to remove unneeded methods and comments. */ package net.sourceforge.nanoxml; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.io.Reader; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.Vector; import net.sourceforge.jnlp.util.logging.OutputController; /** * XMLElement is a representation of an XML object. The object is able to parse * XML code. *
    *
    Parsing XML Data
    *
    * You can parse XML data using the following code: *
    {@code
     *XMLElement xml = new XMLElement();
     *FileReader reader = new FileReader("filename.xml");
     *xml.parseFromReader(reader);
     *}
    *
    Retrieving Attributes
    *
    * You can enumerate the attributes of an element using the method * {@link #enumerateAttributeNames() enumerateAttributeNames}. * The attribute values can be retrieved using the method * {@link #getAttribute(java.lang.String) getAttribute}. * The following example shows how to list the attributes of an element: *
    {@code
     *XMLElement element = ...;
     *Enumeration enum = element.enumerateAttributeNames();
     *while (enum.hasMoreElements()) {
     *    String key = (String) enum.nextElement();
     *    String value = (String) element.getAttribute(key);
     *    System.out.println(key + " = " + value);
     *}}
    *
    Retrieving Child Elements
    *
    * You can enumerate the children of an element using * {@link #enumerateChildren() enumerateChildren}. * The number of child elements can be retrieved using * {@link #countChildren() countChildren}. *
    *
    Elements Containing Character Data
    *
    * If an elements contains character data, like in the following example: *
    {@code The Title}
    * you can retrieve that data using the method * {@link #getContent() getContent}. *
    *
    Subclassing XMLElement
    *
    * When subclassing XMLElement, you need to override the method * {@link #createAnotherElement() createAnotherElement} * which has to return a new copy of the receiver. *
    * * @see net.sourceforge.nanoxml.XMLParseException * * @author Marc De Scheemaecker * <cyberelf@mac.com> * @version $Name: $, $Revision: 1.2 $ */ public class XMLElement { /** * The attributes given to the element. * *
    Invariants:
    *
    • The field can be empty.
    • *
    • The field is never {@code null}.
    • *
    • The keys and the values are strings.
    • *
    */ private Map attributes; /** * Child elements of the element. * *
    Invariants:
    *
    • The field can be empty.
    • *
    • The field is never {@code null}.
    • *
    • The elements are instances of {@code XMLElement} * or a subclass of {@code XMLElement}.
    • *
    */ private Vector children; /** * The name of the element. * *
    Invariants:
    *
    • The field is {@code null} iff the element is not * initialized by either parse or {@link #setName setName()}.
    • *
    • If the field is not {@code null}, it's not empty.
    • *
    • If the field is not {@code null}, it contains a valid * XML identifier.
    • *
    */ private String name; /** * The {@code #PCDATA} content of the object. * *
    Invariants:
    *
    • The field is {@code null} iff the element is not a * {@code #PCDATA} element.
    • *
    • The field can be any string, including the empty string.
    • *
    */ private String contents; /** * Conversion table for &...; entities. The keys are the entity names * without the & and ; delimiters. * *
    Invariants:
    *
    • The field is never {@code null}.
    • *
    • The field always contains the following associations: * "lt" => "<", "gt" => ">", * "quot" => "\"", "apos" => "'", * "amp" => "&"
    • *
    • The keys are strings
    • *
    • The values are char arrays
    • *
    */ private Map entities; /** * The line number where the element starts. * *
    Invariants:
    *
    • {@code lineNr >= 0}
    • *
    */ private int lineNr; /** * {@code true} if the case of the element and attribute names are case * insensitive. */ private boolean ignoreCase; /** * {@code true} if the leading and trailing whitespace of {@code #PCDATA} * sections have to be ignored. */ private boolean ignoreWhitespace; /** * Character read too much. *

    * This character provides push-back functionality to the input reader * without having to use a PushbackReader. * If there is no such character, this field is {@code '\0'}. */ private char charReadTooMuch; /** * Character read too much for the comment remover. */ private char sanitizeCharReadTooMuch; /** * Whether the BOM header appeared */ private boolean BOM = false; /** * The reader provided by the caller of the parse method. * *

    Invariants:
    *
    • The field is not {@code null} while the parse method is * running.
    • *
    */ private Reader reader; /** * The current line number in the source content. * *
    Invariants:
    *
    • parserLineNr > 0 while the parse method is running.
    • *
    */ private int parserLineNr; /** * Creates and initializes a new XML element. *

    * Calling the construction is equivalent to: *

    • {@code new XMLElement(new HashMap(), false, true)}
    * *
    Postconditions:
    *
    • {@linkplain #countChildren} => 0
    • *
    • {@linkplain #enumerateChildren} => empty enumeration
    • *
    • enumeratePropertyNames() => empty enumeration
    • *
    • getChildren() => empty vector
    • *
    • {@linkplain #getContent} => ""
    • *
    • {@linkplain #getLineNr} => 0
    • *
    • {@linkplain #getName} => null
    • *
    */ public XMLElement() { this(new HashMap(), false, true, true); } /** * Creates and initializes a new XML element. *

    * This constructor should only be called from * {@link #createAnotherElement} to create child elements. * * @param entities * The entity conversion table. * @param skipLeadingWhitespace * {@code true} if leading and trailing whitespace in PCDATA * content has to be removed. * @param fillBasicConversionTable * {@code true} if the basic entities need to be added to * the entity list (client code calling this constructor). * @param ignoreCase * {@code true} if the case of element and attribute names have * to be ignored. * *

    Preconditions:
    *
    • {@code entities != null}
    • *
    • if {@code fillBasicConversionTable == false} * then {@code entities} contains at least the following * entries: {@code amp}, {@code lt}, {@code gt}, {@code apos} and * {@code quot}
    • *
    * *
    Postconditions:
    *
    • {@linkplain #countChildren} => 0
    • *
    • {@linkplain #enumerateChildren} => empty enumeration
    • *
    • enumeratePropertyNames() => empty enumeration
    • *
    • getChildren() => empty vector
    • *
    • {@linkplain #getContent} => ""
    • *
    • {@linkplain #getLineNr} => 0
    • *
    • {@linkplain #getName} => null
    • *
    */ protected XMLElement(Map entities, boolean skipLeadingWhitespace, boolean fillBasicConversionTable, boolean ignoreCase) { this.ignoreWhitespace = skipLeadingWhitespace; this.ignoreCase = ignoreCase; this.name = null; this.contents = ""; this.attributes = new HashMap<>(); this.children = new Vector<>(); this.entities = entities; this.lineNr = 0; Set e = this.entities.keySet(); for(String key: e) { Object value = this.entities.get(key); if (value instanceof String) { entities.put(key, ((String) value).toCharArray()); } } if (fillBasicConversionTable) { this.entities.put("amp", new char[] { '&' }); this.entities.put("quot", new char[] { '"' }); this.entities.put("apos", new char[] { '\'' }); this.entities.put("lt", new char[] { '<' }); this.entities.put("gt", new char[] { '>' }); } } /** * Adds a child element. * * @param child * The child element to add. * *
    Preconditions:
    *
    • {@code child != null}
    • *
    • {@code child.getName() != null}
    • *
    • {@code child} does not have a parent element
    • *
    * *
    Postconditions:
    *
    • {@linkplain #countChildren} => old.countChildren() + 1
    • *
    • {@linkplain #enumerateChildren} => old.enumerateChildren() + child
    • *
    • getChildren() => old.enumerateChildren() + child
    • *
    * */ public void addChild(XMLElement child) { this.children.addElement(child); } /** * Adds or modifies an attribute. * * @param name * The name of the attribute. * @param value * The value of the attribute. * *
    Preconditions:
    *
    • {@code name != null}
    • *
    • {@code name} is a valid XML identifier
    • *
    • {@code value != null}
    • *
    * *
    Postconditions:
    *
    • {@linkplain #enumerateAttributeNames} * => old.enumerateAttributeNames() + name
    • *
    • {@linkplain #getAttribute(java.lang.String) getAttribute(name)} * => value
    • *
    */ public void setAttribute(String name, Object value) { if (this.ignoreCase) { name = name.toUpperCase(); } this.attributes.put(name, value.toString()); } /** * @return the number of child elements of the element. * *
    Postconditions:
    *
    • {@code result >= 0}
    • *
    */ public int countChildren() { return this.children.size(); } /** * @return Enumeration of the attribute names. * *
    Postconditions:
    *
    • {@code result != null}
    • *
    */ public Enumeration enumerateAttributeNames() { return new Vector(this.attributes.keySet()).elements(); } /** * @return Enumeration the child elements. * *
    Postconditions:
    *
    • {@code result != null}
    • *
    */ public Enumeration enumerateChildren() { return this.children.elements(); } /** * @return the PCDATA content of the object. If there is no such content, * {@code null} is returned. */ public String getContent() { return this.contents; } /** * @return the line nr in the source data on which the element is found. * This method returns {@code 0} there is no associated source data. * *
    Postconditions:
    *
    • {@code result >= 0}
    • *
    */ public int getLineNr() { return this.lineNr; } /** * @return an attribute of the element. *

    * If the attribute doesn't exist, {@code null} is returned. * * @param name The name of the attribute. * *

    Preconditions:
    *
    • {@code name != null}
    • *
    • {@code name} is a valid XML identifier
    • *
    */ public Object getAttribute(String name) { if (this.ignoreCase) { name = name.toUpperCase(); } Object value = this.attributes.get(name); return value; } /** * Returns the name of the element. * @return this {@code XMLElement} object's name */ public String getName() { return this.name; } /** * Reads one XML element from a {@link java.io.Reader} and parses it. * * @param reader * The reader from which to retrieve the XML data. * *
    Preconditions:
    *
    • {@code reader != null}
    • *
    • {@code reader} is not closed
    • *
    * *
    Postconditions:
    *
    • the state of the receiver is updated to reflect the XML element * parsed from the reader
    • *
    • the reader points to the first character following the last * {@code '>'} character of the XML element
    • *
    * * @throws java.io.IOException * If an error occured while reading the input. * @throws net.sourceforge.nanoxml.XMLParseException * If an error occured while parsing the read data. */ public void parseFromReader(Reader reader) throws IOException, XMLParseException { this.parseFromReader(reader, /*startingLineNr*/1); } /** * Reads one XML element from a java.io.Reader and parses it. * * @param reader * The reader from which to retrieve the XML data. * @param startingLineNr * The line number of the first line in the data. * *
    Preconditions:
    *
    • {@code reader != null}
    • *
    • {@code reader} is not closed
    • *
    * *
    Postconditions:
    *
    • the state of the receiver is updated to reflect the XML element * parsed from the reader
    • *
    • the reader points to the first character following the last * {@code '>'} character of the XML element
    • *
    * * @throws java.io.IOException * If an error occured while reading the input. * @throws net.sourceforge.nanoxml.XMLParseException * If an error occured while parsing the read data. */ public void parseFromReader(Reader reader, int startingLineNr) throws IOException, XMLParseException { this.charReadTooMuch = '\0'; this.reader = reader; this.parserLineNr = startingLineNr; for (;;) { char ch = this.scanLeadingWhitespace(); if (ch != '<') { throw this.expectedInput("<", ch); } ch = this.readChar(); if ((ch == '!') || (ch == '?')) { this.skipSpecialTag(0); } else { this.unreadChar(ch); this.scanElement(this); return; } } } /** * Creates a new similar XML element. *

    * You should override this method when subclassing XMLElement. *

    * @return next element in tree based on global settings */ protected XMLElement createAnotherElement() { return new XMLElement(this.entities, this.ignoreWhitespace, false, this.ignoreCase); } /** * Changes the content string. * * @param content * The new content string. */ public void setContent(String content) { this.contents = content; } /** * Changes the name of the element. * * @param name * The new name. * *
    Preconditions:
    *
    • {@code name != null}
    • *
    • {@code name} is a valid XML identifier
    • *
    */ public void setName(String name) { this.name = name; } /** * Scans an identifier from the current reader. * The scanned identifier is appended to result. * * @param result * The buffer in which the scanned identifier will be put. * *
    Preconditions:
    *
    • {@code result != null}
    • *
    • The next character read from the reader is a valid first * character of an XML identifier.
    • *
    * *
    Postconditions:
    *
    • The next character read from the reader won't be an identifier * character.
    • *
    * @throws java.io.IOException if something goes wrong */ protected void scanIdentifier(StringBuffer result) throws IOException { for (;;) { char ch = this.readChar(); if (((ch < 'A') || (ch > 'Z')) && ((ch < 'a') || (ch > 'z')) && ((ch < '0') || (ch > '9')) && (ch != '_') && (ch != '.') && (ch != ':') && (ch != '-') && (ch <= '\u007E')) { this.unreadChar(ch); return; } result.append(ch); } } private boolean isRegularWhiteSpace(char ch) { switch (ch) { case ' ': case '\t': case '\n': case '\r': return true; default: return false; } } /** * This method scans an identifier from the current reader. * * @return the next character following the whitespace. * @throws java.io.IOException if something goes wrong */ private char scanWhitespace() throws IOException { while(true) { char ch = this.readChar(); if (!isRegularWhiteSpace(ch)) { return ch; } } } /** * This method scans an leading identifier from the current reader. * * UNlike scanWhitespace, it skipps also BOM * * @return the next character following the whitespace. * @throws java.io.IOException if something goes wrong */ private char scanLeadingWhitespace() throws IOException { while(true) { char ch = this.readChar(); //this is BOM , when used without \\u, appear like space, but causes issues on windows development if (ch == '\uFEFF') { BOM = true; } else if (!isRegularWhiteSpace(ch)) { return ch; } } } /** * This method scans an identifier from the current reader. *

    * The scanned whitespace is appended to {@code result}. * * @param result where to append scanned text * @return the next character following the whitespace. * *

    Preconditions:
    *
    • {@code result != null}
    • *
    * @throws java.io.IOException if something goes wrong */ protected char scanWhitespace(StringBuffer result) throws IOException { while (true) { char ch = this.readChar(); if (!isRegularWhiteSpace(ch)) { return ch; } else { switch (ch) { case ' ': case '\t': case '\n': result.append(ch); } } } } /** * This method scans a delimited string from the current reader. *

    * The scanned string without delimiters is appended to {@code string}. * *

    Preconditions:
    *
    • {@code string != null}
    • *
    • the next char read is the string delimiter
    • *
    * @param string where to append the result * @throws java.io.IOException if something goes wrong */ protected void scanString(StringBuffer string) throws IOException { char delimiter = this.readChar(); if ((delimiter != '\'') && (delimiter != '"')) { throw this.expectedInput("' or \""); } for (;;) { char ch = this.readChar(); if (ch == delimiter) { return; } else if (ch == '&') { this.resolveEntity(string); } else { string.append(ch); } } } /** * Scans a {@code #PCDATA} element. CDATA sections and entities are * resolved. *

    * The next < char is skipped. *

    * The scanned data is appended to {@code data}. * *

    Preconditions:
    *
    • {@code data != null}
    • *
    * @param data where to append data * @throws java.io.IOException if something goes wrong */ protected void scanPCData(StringBuffer data) throws IOException { for (;;) { char ch = this.readChar(); if (ch == '<') { ch = this.readChar(); if (ch == '!') { this.checkCDATA(data); } else { this.unreadChar(ch); return; } } else if (ch == '&') { this.resolveEntity(data); } else { data.append(ch); } } } /** * Scans a special tag and if the tag is a CDATA section, append its * content to {@code buf}. * *
    Preconditions:
    *
    • {@code buf != null}
    • *
    • The first < has already been read.
    • *
    * @param buf buffer where to append data * @return whether the CDATA were ok * @throws java.io.IOException if something goes wrong */ protected boolean checkCDATA(StringBuffer buf) throws IOException { char ch = this.readChar(); if (ch != '[') { this.unreadChar(ch); this.skipSpecialTag(0); return false; } else if (!this.checkLiteral("CDATA[")) { this.skipSpecialTag(1); // one [ has already been read return false; } else { int delimiterCharsSkipped = 0; while (delimiterCharsSkipped < 3) { ch = this.readChar(); switch (ch) { case ']': if (delimiterCharsSkipped < 2) { delimiterCharsSkipped += 1; } else { buf.append(']'); buf.append(']'); delimiterCharsSkipped = 0; } break; case '>': if (delimiterCharsSkipped < 2) { for (int i = 0; i < delimiterCharsSkipped; i++) { buf.append(']'); } delimiterCharsSkipped = 0; buf.append('>'); } else { delimiterCharsSkipped = 3; } break; default: for (int i = 0; i < delimiterCharsSkipped; i += 1) { buf.append(']'); } buf.append(ch); delimiterCharsSkipped = 0; } } return true; } } /** * Skips a comment. * *
    Preconditions:
    *
    • The first <!-- has already been read.
    • *
    * @throws java.io.IOException if something goes wrong */ protected void skipComment() throws IOException { int dashesToRead = 2; while (dashesToRead > 0) { char ch = this.readChar(); if (ch == '-') { dashesToRead -= 1; } else { dashesToRead = 2; } // Be more tolerant of extra -- (double dashes) // in comments. if (dashesToRead == 0) { ch = this.readChar(); if (ch == '>') { return; } else { dashesToRead = 2; this.unreadChar(ch); } } } /* if (this.readChar() != '>') { throw this.expectedInput(">"); } */ } /** * Skips a special tag or comment. * * @param bracketLevel The number of open square brackets ([) that have * already been read. * *
    Preconditions:
    *
    • The first <! has already been read.
    • *
    • {@code bracketLevel >= 0}
    • *
    * @throws java.io.IOException if something goes wrong */ protected void skipSpecialTag(int bracketLevel) throws IOException { int tagLevel = 1; // < char stringDelimiter = '\0'; if (bracketLevel == 0) { char ch = this.readChar(); if (ch == '[') { bracketLevel += 1; } else if (ch == '-') { ch = this.readChar(); if (ch == '[') { bracketLevel += 1; } else if (ch == ']') { bracketLevel -= 1; } else if (ch == '-') { this.skipComment(); return; } } } while (tagLevel > 0) { char ch = this.readChar(); if (stringDelimiter == '\0') { if ((ch == '"') || (ch == '\'')) { stringDelimiter = ch; } else if (bracketLevel <= 0) { if (ch == '<') { tagLevel += 1; } else if (ch == '>') { tagLevel -= 1; } } if (ch == '[') { bracketLevel += 1; } else if (ch == ']') { bracketLevel -= 1; } } else { if (ch == stringDelimiter) { stringDelimiter = '\0'; } } } } /** * Scans the data for literal text. *

    * Scanning stops when a character does not match or after the complete * text has been checked, whichever comes first. * * @param literal the literal to check. * *

    Preconditions:
    *
    • {@code literal != null}
    • *
    * @return true if literal was ok * @throws java.io.IOException if something goes wrong */ protected boolean checkLiteral(String literal) throws IOException { int length = literal.length(); for (int i = 0; i < length; i += 1) { if (this.readChar() != literal.charAt(i)) { return false; } } return true; } /** * Reads a character from a reader. * @return the read char * @throws java.io.IOException if something goes wrong */ protected char readChar() throws IOException { if (this.charReadTooMuch != '\0') { char ch = this.charReadTooMuch; this.charReadTooMuch = '\0'; return ch; } else { int i = this.reader.read(); if (i < 0) { throw this.unexpectedEndOfData(); } else if (i == 10) { this.parserLineNr += 1; return '\n'; } else { return (char) i; } } } /** * Scans an XML element. * * @param elt The element that will contain the result. * *
    Preconditions:
    *
    • The first < has already been read.
    • *
    • {@code elt != null}
    • *
    * @throws java.io.IOException if something goes wrong */ protected void scanElement(XMLElement elt) throws IOException { StringBuffer buf = new StringBuffer(); this.scanIdentifier(buf); String lname = buf.toString(); elt.setName(lname); char ch = this.scanWhitespace(); while ((ch != '>') && (ch != '/')) { buf.setLength(0); this.unreadChar(ch); this.scanIdentifier(buf); String key = buf.toString(); ch = this.scanWhitespace(); if (ch != '=') { throw this.expectedInput("="); } this.unreadChar(this.scanWhitespace()); buf.setLength(0); this.scanString(buf); elt.setAttribute(key, buf); ch = this.scanWhitespace(); } if (ch == '/') { ch = this.readChar(); if (ch != '>') { throw this.expectedInput(">"); } return; } buf.setLength(0); ch = this.scanWhitespace(buf); if (ch != '<') { this.unreadChar(ch); this.scanPCData(buf); } else { for (;;) { ch = this.readChar(); if (ch == '!') { if (this.checkCDATA(buf)) { this.scanPCData(buf); break; } else { ch = this.scanWhitespace(buf); if (ch != '<') { this.unreadChar(ch); this.scanPCData(buf); break; } } } else { buf.setLength(0); break; } } } if (buf.length() == 0) { while (ch != '/') { if (ch == '!') { ch = this.readChar(); if (ch != '-') { throw this.expectedInput("Comment or Element"); } ch = this.readChar(); if (ch != '-') { throw this.expectedInput("Comment or Element"); } this.skipComment(); } else { this.unreadChar(ch); XMLElement child = this.createAnotherElement(); this.scanElement(child); elt.addChild(child); } ch = this.scanWhitespace(); if (ch != '<') { throw this.expectedInput("<"); } ch = this.readChar(); } this.unreadChar(ch); } else { if (this.ignoreWhitespace) { elt.setContent(buf.toString().trim()); } else { elt.setContent(buf.toString()); } } ch = this.readChar(); if (ch != '/') { throw this.expectedInput("/"); } this.unreadChar(this.scanWhitespace()); if (!this.checkLiteral(lname)) { throw this.expectedInput(lname); } if (this.scanWhitespace() != '>') { throw this.expectedInput(">"); } } /** * Resolves an entity. The name of the entity is read from the reader. *

    * The value of the entity is appended to {@code buf}. * * @param buf Where to put the entity value. * *

    Preconditions:
    *
    • The first & has already been read.
    • *
    • {@code buf != null}
    • *
    * @throws java.io.IOException if something goes wrong */ protected void resolveEntity(StringBuffer buf) throws IOException { char ch = '\0'; StringBuffer keyBuf = new StringBuffer(); for (;;) { ch = this.readChar(); if (ch == ';') { break; } keyBuf.append(ch); } String key = keyBuf.toString(); if (key.charAt(0) == '#') { try { if (key.charAt(1) == 'x') { ch = (char) Integer.parseInt(key.substring(2), 16); } else { ch = (char) Integer.parseInt(key.substring(1), 10); } } catch (NumberFormatException e) { throw this.unknownEntity(key); } buf.append(ch); } else { char[] value = entities.get(key); if (value == null) { throw this.unknownEntity(key); } buf.append(value); } } /** * Pushes a character back to the read-back buffer. * * @param ch The character to push back. * *
    Preconditions:
    *
    • The read-back buffer is empty.
    • *
    • {@code ch != '\0'}
    • *
    */ protected void unreadChar(char ch) { this.charReadTooMuch = ch; } /** * Creates a parse exception for when an invalid valueset is given to * a method. * * @param name The name of the entity. * *
    Preconditions:
    *
    • {@code name != null}
    • *
    * @return exception to be thrown */ protected XMLParseException invalidValueSet(String name) { String msg = "Invalid value set (entity name = \"" + name + "\")"; return new XMLParseException(this.getName(), this.parserLineNr, msg); } /** * Creates a parse exception for when an invalid value is given to a * method. * * @param name The name of the entity. * @param value The value of the entity. * *
    Preconditions:
    *
    • {@code name != null}
    • *
    • {@code value != null}
    • *
    * @return exception to be used */ protected XMLParseException invalidValue(String name, String value) { String msg = "Attribute \"" + name + "\" does not contain a valid " + "value (\"" + value + "\")"; return new XMLParseException(this.getName(), this.parserLineNr, msg); } /** * Creates a parse exception for when the end of the data input has been * reached. * @return exception to be used */ protected XMLParseException unexpectedEndOfData() { String msg = "Unexpected end of data reached"; return new XMLParseException(this.getName(), this.parserLineNr, msg); } /** * Creates a parse exception for when a syntax error occured. * * @param context The context in which the error occured. * *
    Preconditions:
    *
    • {@code context != null}
    • *
    • {@code context.length() > 0}
    • *
    * @return exception to be used */ protected XMLParseException syntaxError(String context) { String msg = "Syntax error while parsing " + context; return new XMLParseException(this.getName(), this.parserLineNr, msg); } /** * Creates a parse exception for when the next character read is not * the character that was expected. * * @param charSet The set of characters (in human readable form) that was * expected. * *
    Preconditions:
    *
    • {@code charSet != null}
    • *
    • {@code charSet.length() > 0}
    • *
    * @return exception to be used */ protected XMLParseException expectedInput(String charSet) { String msg = "Expected: " + charSet; return new XMLParseException(this.getName(), this.parserLineNr, msg); } /** * Creates a parse exception for when the next character read is not * the character that was expected. * * @param charSet The set of characters (in human readable form) that was * expected. * @param ch The character that was received instead. *
    Preconditions:
    *
    • {@code charSet != null}
    • *
    • {@code charSet.length() > 0}
    • *
    * @return exception to be used */ protected XMLParseException expectedInput(String charSet, char ch) { String msg = "Expected: '" + charSet + "'" + " but got: '" + ch + "'"; return new XMLParseException(this.getName(), this.parserLineNr, msg); } /** * Creates a parse exception for when an entity could not be resolved. * * @param name The name of the entity. * @return exception to be used * *
    Preconditions:
    *
    • {@code name != null}
    • *
    • {@code name.length() > 0}
    • *
    */ protected XMLParseException unknownEntity(String name) { String msg = "Unknown or invalid entity: &" + name + ";"; return new XMLParseException(this.getName(), this.parserLineNr, msg); } /** * Reads an xml file and removes the comments, leaving only relevant * xml code. * * @param isr The reader of the {@link java.io.InputStream} containing the xml. * @param pout The {@link java.io.PipedOutputStream} that will be receiving the * filtered xml file. */ public void sanitizeInput(Reader isr, OutputStream pout) { StringBuilder line = new StringBuilder(); try (PrintStream out = new PrintStream(pout)) { this.sanitizeCharReadTooMuch = '\0'; this.reader = isr; this.parserLineNr = 0; int newline = 2; char prev = ' '; while (true) { char ch; if (this.sanitizeCharReadTooMuch != '\0') { ch = this.sanitizeCharReadTooMuch; this.sanitizeCharReadTooMuch = '\0'; } else { int i = this.reader.read(); if (i == -1) { // no character in buffer, and nothing read out.flush(); break; } else if (i == 10) { ch = '\n'; } else { ch = (char) i; } } char next; int i = this.reader.read(); if (i == -1) { // character in buffer and nothing read. write out // what's in the buffer out.print(ch); out.flush(); if (ch == 10) { OutputController.getLogger().log(line.toString()); line = new StringBuilder("line: " + newline + " "); newline++; } else { line.append(ch); } break; } else if (i == 10) { next = '\n'; } else { next = (char) i; } this.sanitizeCharReadTooMuch = next; // If the next chars are !--, then we've hit a comment tag, // and should skip it. if (ch == '<' && sanitizeCharReadTooMuch == '!') { ch = (char) this.reader.read(); if (ch == '-') { ch = (char) this.reader.read(); if (ch == '-') { this.skipComment(); this.sanitizeCharReadTooMuch = '\0'; } else { out.print('<'); out.print('!'); out.print('-'); this.sanitizeCharReadTooMuch = ch; line.append("<"); line.append("!"); line.append("-"); } } else { out.print('<'); out.print('!'); this.sanitizeCharReadTooMuch = ch; line.append("<"); line.append("!"); } } // Otherwise we haven't hit a comment, and we should write ch. else { out.print(ch); if (ch == 10) { OutputController.getLogger().log(line.toString()); line = new StringBuilder("line: " + newline + " "); newline++; } else { line.append(ch); } } prev = next; } isr.close(); } catch (Exception e) { // Print the stack trace here -- xml.parseFromReader() will // throw the ParseException if something goes wrong. OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e); } finally { OutputController.getLogger().log("");//force new line in all cases OutputController.getLogger().log(line.toString()); //flush remaining line } } public boolean isBOM() { return BOM; } } icedtea-web-1.8/netx/PaxHeaders.7406/javax0000644000000000000000000000013113441742745015234 xustar0030 mtime=1552401893.018832866 29 atime=1552410887.11418344 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/0000755000175000002070000000000013441742745016122 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/javax/PaxHeaders.7406/jnlp0000644000000000000000000000013013441742745016176 xustar0029 mtime=1552401893.04583281 29 atime=1552410887.11418344 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/0000755000175000002070000000000013441742745017065 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/ServiceManager.java0000644000000000000000000000013113441742745022012 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/ServiceManager.java0000644000175000002070000000253713441742745022632 0ustar00jvanekmock00000000000000package javax.jnlp; import java.util.*; public final class ServiceManager { private static ServiceManagerStub stub = null; private static Map lookupTable = new HashMap(); // ensure lookup is idempotent private ServiceManager() { // says it can't be instantiated } public static java.lang.Object lookup(java.lang.String name) throws UnavailableServiceException { if (stub == null) throw new UnavailableServiceException("service stub not set."); synchronized (lookupTable) { Object result = lookupTable.get(name); if (result == null) { result = stub.lookup(name); if (result != null) lookupTable.put(name, result); } if (result == null) throw new UnavailableServiceException("service not available (stub returned null)."); return result; } } public static java.lang.String[] getServiceNames() { // should this return the required ones even though no stub?? if (stub == null) return new String[0]; return stub.getServiceNames(); } public static void setServiceManagerStub(ServiceManagerStub stub) { if (ServiceManager.stub == null) ServiceManager.stub = stub; } } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/ExtensionInstallerService.java0000644000000000000000000000013113441742745024272 xustar0029 mtime=1552401893.04583281 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/ExtensionInstallerService.java0000644000175000002070000000140513441742745025103 0ustar00jvanekmock00000000000000package javax.jnlp; public interface ExtensionInstallerService { public java.lang.String getInstallPath(); public java.lang.String getExtensionVersion(); public java.net.URL getExtensionLocation(); public void hideProgressBar(); public void hideStatusWindow(); public void setHeading(java.lang.String heading); public void setStatus(java.lang.String status); public void updateProgress(int value); public void installSucceeded(boolean needsReboot); public void installFailed(); public void setJREInfo(java.lang.String platformVersion, java.lang.String jrePath); public void setNativeLibraryInfo(java.lang.String path); public java.lang.String getInstalledJRE(java.net.URL url, java.lang.String version); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/PersistenceService.java0000644000000000000000000000013113441742745022724 xustar0029 mtime=1552401893.02183286 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/PersistenceService.java0000644000175000002070000000154713441742745023544 0ustar00jvanekmock00000000000000package javax.jnlp; public interface PersistenceService { public static final int CACHED = 0; public static final int TEMPORARY = 1; public static final int DIRTY = 2; public long create(java.net.URL url, long maxsize) throws java.net.MalformedURLException, java.io.IOException; public FileContents get(java.net.URL url) throws java.net.MalformedURLException, java.io.IOException, java.io.FileNotFoundException; public void delete(java.net.URL url) throws java.net.MalformedURLException, java.io.IOException; public java.lang.String[] getNames(java.net.URL url) throws java.net.MalformedURLException, java.io.IOException; public int getTag(java.net.URL url) throws java.net.MalformedURLException, java.io.IOException; public void setTag(java.net.URL url, int tag) throws java.net.MalformedURLException, java.io.IOException; } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/DownloadServiceListener.java0000644000000000000000000000013213441742745023716 xustar0030 mtime=1552401893.020832862 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/DownloadServiceListener.java0000644000175000002070000000076113441742745024532 0ustar00jvanekmock00000000000000package javax.jnlp; public interface DownloadServiceListener { public void progress(java.net.URL url, java.lang.String version, long readSoFar, long total, int overallPercent); public void validating(java.net.URL url, java.lang.String version, long entry, long total, int overallPercent); public void upgradingArchive(java.net.URL url, java.lang.String version, int patchPercent, int overallPercent); public void downloadFailed(java.net.URL url, java.lang.String version); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/SingleInstanceListener.java0000644000000000000000000000013213441742745023534 xustar0030 mtime=1552401893.018832866 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/SingleInstanceListener.java0000644000175000002070000000243113441742745024344 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package javax.jnlp; /** * This interface specifies a listener which is notified whenever a new instance * of the web start application is launched. * */ public interface SingleInstanceListener { /** * This method is called when a new instance of the application is launched. * The arguments passed to the new instance are passed into this method. * * @param arguments the arguments passed to the new instance of the * application */ void newActivation(String[] arguments); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/FileOpenService.java0000644000000000000000000000013213441742745022142 xustar0030 mtime=1552401893.018832866 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/FileOpenService.java0000644000175000002070000000047613441742745022761 0ustar00jvanekmock00000000000000package javax.jnlp; public interface FileOpenService { public FileContents openFileDialog(java.lang.String pathHint, java.lang.String[] extensions) throws java.io.IOException; public FileContents[] openMultiFileDialog(java.lang.String pathHint, java.lang.String[] extensions) throws java.io.IOException; } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/BasicService.java0000644000000000000000000000013213441742745021462 xustar0030 mtime=1552401893.018832866 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/BasicService.java0000644000175000002070000000034213441742745022271 0ustar00jvanekmock00000000000000package javax.jnlp; public interface BasicService { public java.net.URL getCodeBase(); public boolean isOffline(); public boolean showDocument(java.net.URL url); public boolean isWebBrowserSupported(); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/JNLPRandomAccessFile.java0000644000000000000000000000013213441742745022746 xustar0030 mtime=1552401893.020832862 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/JNLPRandomAccessFile.java0000644000175000002070000000464213441742745023564 0ustar00jvanekmock00000000000000package javax.jnlp; public interface JNLPRandomAccessFile extends java.io.DataInput, java.io.DataOutput { public void close() throws java.io.IOException; public long length() throws java.io.IOException; public long getFilePointer() throws java.io.IOException; public int read() throws java.io.IOException; public int read(byte[] b, int off, int len) throws java.io.IOException; public int read(byte[] b) throws java.io.IOException; public void readFully(byte[] b) throws java.io.IOException; public void readFully(byte[] b, int off, int len) throws java.io.IOException; public int skipBytes(int n) throws java.io.IOException; public boolean readBoolean() throws java.io.IOException; public byte readByte() throws java.io.IOException; public int readUnsignedByte() throws java.io.IOException; public short readShort() throws java.io.IOException; public int readUnsignedShort() throws java.io.IOException; public char readChar() throws java.io.IOException; public int readInt() throws java.io.IOException; public long readLong() throws java.io.IOException; public float readFloat() throws java.io.IOException; public double readDouble() throws java.io.IOException; public java.lang.String readLine() throws java.io.IOException; public java.lang.String readUTF() throws java.io.IOException; public void seek(long pos) throws java.io.IOException; public void setLength(long newLength) throws java.io.IOException; public void write(int b) throws java.io.IOException; public void write(byte[] b) throws java.io.IOException; public void write(byte[] b, int off, int len) throws java.io.IOException; public void writeBoolean(boolean v) throws java.io.IOException; public void writeByte(int v) throws java.io.IOException; public void writeShort(int v) throws java.io.IOException; public void writeChar(int v) throws java.io.IOException; public void writeInt(int v) throws java.io.IOException; public void writeLong(long v) throws java.io.IOException; public void writeFloat(float v) throws java.io.IOException; public void writeDouble(double v) throws java.io.IOException; public void writeBytes(java.lang.String s) throws java.io.IOException; public void writeChars(java.lang.String s) throws java.io.IOException; public void writeUTF(java.lang.String str) throws java.io.IOException; } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/DownloadService2.java0000644000000000000000000000013213441742745022272 xustar0030 mtime=1552401893.020832862 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/DownloadService2.java0000644000175000002070000000267313441742745023112 0ustar00jvanekmock00000000000000package javax.jnlp; public interface DownloadService2 { public static class ResourceSpec { public static final long UNKNOWN = Long.MIN_VALUE; protected String url; protected String version; protected int type; public ResourceSpec(java.lang.String url, java.lang.String version, int type) { this.url = url; this.version = version; this.type = type; } public long getExpirationDate() { return UNKNOWN; } public long getLastModified() { return UNKNOWN; } public long getSize() { return UNKNOWN; } public int getType() { return type; } public java.lang.String getUrl() { return url; } public java.lang.String getVersion() { return version; } } public static final int ALL = 0; public static final int APPLET = 2; public static final int APPLICATION = 1; public static final int CLASS = 6; public static final int EXTENSION = 3; public static final int IMAGE = 5; public static final int JAR = 4; public DownloadService2.ResourceSpec[] getCachedResources( javax.jnlp.DownloadService2.ResourceSpec resourceSpec); public DownloadService2.ResourceSpec[] getUpdateAvailableResources( javax.jnlp.DownloadService2.ResourceSpec resourceSpec); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/SingleInstanceService.java0000644000000000000000000000013213441742745023347 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/SingleInstanceService.java0000644000175000002070000000343313441742745024162 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package javax.jnlp; /** * The SingleInstanceService provides a way to ensure that only one instance of * the application is ever running - singleton behavior at the application * level. * */ public interface SingleInstanceService { /** * Adds the specified SingleInstanceListener to the notification list. This * listener is notified when a new instance of the application is started. * * * @param listener the single instance listener to be added. No action is * performed if it is null. */ void addSingleInstanceListener(SingleInstanceListener listener); /** * Removes the specified SingleInstanceListener from the notification list. * This listener will not be notified if a new instance of the application * is started. * * @param listener the single instance listener to be removed. No action is * performed if it is null or not in the notification list. */ void removeSingleInstanceListener(SingleInstanceListener listener); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/FileSaveService.java0000644000000000000000000000013213441742745022137 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/FileSaveService.java0000644000175000002070000000060313441742745022746 0ustar00jvanekmock00000000000000package javax.jnlp; public interface FileSaveService { public FileContents saveFileDialog(java.lang.String pathHint, java.lang.String[] extensions, java.io.InputStream stream, java.lang.String name) throws java.io.IOException; public FileContents saveAsFileDialog(java.lang.String pathHint, java.lang.String[] extensions, FileContents contents) throws java.io.IOException; } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/ClipboardService.java0000644000000000000000000000013213441742745022340 xustar0030 mtime=1552401893.022832858 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/ClipboardService.java0000644000175000002070000000030513441742745023146 0ustar00jvanekmock00000000000000package javax.jnlp; public interface ClipboardService { public java.awt.datatransfer.Transferable getContents(); public void setContents(java.awt.datatransfer.Transferable contents); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/ServiceManagerStub.java0000644000000000000000000000013213441742745022651 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/ServiceManagerStub.java0000644000175000002070000000031713441742745023462 0ustar00jvanekmock00000000000000package javax.jnlp; public interface ServiceManagerStub { public java.lang.Object lookup(java.lang.String name) throws UnavailableServiceException; public java.lang.String[] getServiceNames(); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/FileContents.java0000644000000000000000000000013213441742745021515 xustar0030 mtime=1552401893.024832854 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/FileContents.java0000644000175000002070000000130413441742745022323 0ustar00jvanekmock00000000000000package javax.jnlp; public interface FileContents { public java.lang.String getName() throws java.io.IOException; public java.io.InputStream getInputStream() throws java.io.IOException; public java.io.OutputStream getOutputStream(boolean overwrite) throws java.io.IOException; public long getLength() throws java.io.IOException; public boolean canRead() throws java.io.IOException; public boolean canWrite() throws java.io.IOException; public JNLPRandomAccessFile getRandomAccessFile(java.lang.String mode) throws java.io.IOException; public long getMaxLength() throws java.io.IOException; public long setMaxLength(long maxlength) throws java.io.IOException; } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/UnavailableServiceException.java0000644000000000000000000000013113441742745024542 xustar0029 mtime=1552401893.02183286 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/UnavailableServiceException.java0000644000175000002070000000037213441742745025355 0ustar00jvanekmock00000000000000package javax.jnlp; public class UnavailableServiceException extends Exception { public UnavailableServiceException() { super(); } public UnavailableServiceException(java.lang.String message) { super(message); } } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/IntegrationService.java0000644000000000000000000000013113441742745022723 xustar0029 mtime=1552401893.02183286 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/IntegrationService.java0000644000175000002070000000107113441742745023533 0ustar00jvanekmock00000000000000package javax.jnlp; public interface IntegrationService { public boolean hasAssociation(java.lang.String mimeType, java.lang.String[] extensions); public boolean hasDesktopShortcut(); public boolean hasMenuShortcut(); public boolean removeAssociation(java.lang.String mimeType, java.lang.String[] extensions); public boolean removeShortcuts(); public boolean requestAssociation(java.lang.String mimeType, java.lang.String[] extensions); public boolean requestShortcut(boolean onDesktop, boolean inMenu, java.lang.String subMenu); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/DownloadService.java0000644000000000000000000000013213441742745022210 xustar0030 mtime=1552401893.020832862 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/DownloadService.java0000644000175000002070000000335113441742745023022 0ustar00jvanekmock00000000000000package javax.jnlp; public interface DownloadService { public boolean isResourceCached(java.net.URL ref, java.lang.String version); public boolean isPartCached(java.lang.String part); public boolean isPartCached(java.lang.String[] parts); public boolean isExtensionPartCached(java.net.URL ref, java.lang.String version, java.lang.String part); public boolean isExtensionPartCached(java.net.URL ref, java.lang.String version, java.lang.String[] parts); public void loadResource(java.net.URL ref, java.lang.String version, DownloadServiceListener progress) throws java.io.IOException; public void loadPart(java.lang.String part, DownloadServiceListener progress) throws java.io.IOException; public void loadPart(java.lang.String[] parts, DownloadServiceListener progress) throws java.io.IOException; public void loadExtensionPart(java.net.URL ref, java.lang.String version, java.lang.String part, DownloadServiceListener progress) throws java.io.IOException; public void loadExtensionPart(java.net.URL ref, java.lang.String version, java.lang.String[] parts, DownloadServiceListener progress) throws java.io.IOException; public void removeResource(java.net.URL ref, java.lang.String version) throws java.io.IOException; public void removePart(java.lang.String part) throws java.io.IOException; public void removePart(java.lang.String[] parts) throws java.io.IOException; public void removeExtensionPart(java.net.URL ref, java.lang.String version, java.lang.String part) throws java.io.IOException; public void removeExtensionPart(java.net.URL ref, java.lang.String version, java.lang.String[] parts) throws java.io.IOException; public DownloadServiceListener getDefaultProgressWindow(); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/PrintService.java0000644000000000000000000000013113441742745021534 xustar0029 mtime=1552401893.02683285 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/PrintService.java0000644000175000002070000000050613441742745022346 0ustar00jvanekmock00000000000000package javax.jnlp; public interface PrintService { public java.awt.print.PageFormat getDefaultPage(); public java.awt.print.PageFormat showPageFormatDialog(java.awt.print.PageFormat page); public boolean print(java.awt.print.Pageable document); public boolean print(java.awt.print.Printable painter); } icedtea-web-1.8/netx/javax/jnlp/PaxHeaders.7406/ExtendedService.java0000644000000000000000000000013213441742745022201 xustar0030 mtime=1552401893.025832852 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/javax/jnlp/ExtendedService.java0000644000175000002070000000345113441742745023014 0ustar00jvanekmock00000000000000// Copyright (C) 2009 Red Hat, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package javax.jnlp; import java.io.File; import java.io.IOException; /** * This interface provides a way for the JNLP application to open specific files * in the client's system. It asks permission from the user before opening any * files. * * @author Omair Majid * */ public interface ExtendedService { /** * Open a file on the client' system and return its contents. The user must * grant permission to the application for this to work. * * @param file the file to open * @return the opened file as a {@link FileContents} object * @throws IOException on any io problems */ FileContents openFile(File file) throws IOException; /** * Opens multiple files on the user's sytem and returns their contents as a * {@link FileContents} array * * @param files the files to open * @return an array of FileContents objects * @throws IOException on any io problems */ FileContents[] openFiles(File[] files) throws IOException; } icedtea-web-1.8/netx/PaxHeaders.7406/sun0000644000000000000000000000013113441742745014730 xustar0030 mtime=1552401893.059832781 29 atime=1552410887.11418344 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/sun/0000755000175000002070000000000013441742745015616 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/sun/PaxHeaders.7406/applet0000644000000000000000000000013113441742745016215 xustar0030 mtime=1552401893.078832742 29 atime=1552410887.11418344 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/sun/applet/0000755000175000002070000000000013441742745017103 5ustar00jvanekmock00000000000000icedtea-web-1.8/netx/sun/applet/PaxHeaders.7406/AppletViewerPanelAccess.java0000644000000000000000000000013213441742745023647 xustar0030 mtime=1552401893.078832742 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/sun/applet/AppletViewerPanelAccess.java0000644000175000002070000001444713441742745024471 0ustar00jvanekmock00000000000000/* package-info.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.*/ package sun.applet; import java.applet.Applet; import java.applet.AppletContext; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.util.Hashtable; import java.util.Map; import net.sourceforge.jnlp.NetxPanel; import net.sourceforge.jnlp.util.logging.OutputController; public abstract class AppletViewerPanelAccess extends AppletViewerPanel { public AppletViewerPanelAccess(URL documentURL, Map atts) { // note, this is copy. // But th eonly usecasein applet outside ITW is get on parameters super(documentURL, new Hashtable<>(atts)); } protected URL getDocumentURL() { try { Field field = AppletViewerPanel.class.getDeclaredField("documentURL"); field.setAccessible(true); return (URL) field.get(this); } catch (IllegalAccessException | IllegalArgumentException | NoSuchFieldException | SecurityException ex) { throw new RuntimeException(ex); } } protected void setApplet(Applet iapplet) { try { Field field = AppletPanel.class.getDeclaredField("applet"); field.setAccessible(true); field.set(this, iapplet); } catch (IllegalAccessException | IllegalArgumentException | NoSuchFieldException | SecurityException ex) { throw new RuntimeException(ex); } } @Override public void run() { // this is copypasted chunk from AppletPanel.run (the only current // call of runLoader). Pray it do not change Thread curThread = Thread.currentThread(); if (curThread == loaderThread) { ourRunLoader(); return; } super.run(); } @Override public AppletContext getAppletContext() { if (getParent() instanceof AppletContext) { return super.getAppletContext(); } return ((NetxPanel)this).getAppInst().getAppletEnvironment(); } /** * NOTE. We cannot override private method, and this call is unused and useless. * But kept for record of troubles to run on any openjdk. * upstream patch posted http://mail.openjdk.java.net/pipermail/awt-dev/2014-May/007828.html */ private void superRunLoader() { try { Class klazz = AppletPanel.class; Method runLoaderMethod = klazz.getDeclaredMethod("runLoader"); runLoaderMethod.setAccessible(true); runLoaderMethod.invoke(getApplet()); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ex) { throw new RuntimeException(ex); } } protected URL getBaseURL() { try { Field field = AppletViewerPanel.class .getDeclaredField("baseURL"); field.setAccessible( true); return (URL) field.get( this); } catch (IllegalAccessException | IllegalArgumentException | NoSuchFieldException | SecurityException ex) { throw new RuntimeException(ex); } } @Override //remaining stub of unpatched jdk protected synchronized void createAppletThread() { throw new RuntimeException("Not yet implemented"); //no need to call super, is overriden, and not used in upstream //AppletViewerPanel or AppletPanel } abstract protected void ourRunLoader(); /** * jdk9 removed doInit. * http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/2b680924a73f This is way how * to set it in older jdks and still compile on jdk9+ * * @param a value to set to doInit if it exists */ protected void setDoInitIfExists(boolean a) { //doInit = a; try { Class c = this.getClass(); Field fs = null; while (c != null) { if (AppletPanel.class.equals(c)) { fs = c.getDeclaredField("doInit"); break; } //known location is NetxPanel->AppeltViwerPannelAccess->AppletViwerPanel->AppletPanel c = c.getSuperclass(); } if (fs == null) { throw new NoSuchFieldException("AppletPanel not found."); } fs.setAccessible(true); fs.set(this, a); } catch (IllegalAccessException | IllegalArgumentException | NoSuchFieldException | SecurityException ex) { OutputController.getLogger().log("Can't get/set doInit. Runing on JDK9 or higher?"); OutputController.getLogger().log(ex); } } } icedtea-web-1.8/netx/sun/applet/PaxHeaders.7406/package-info.java0000644000000000000000000000013213441742745021462 xustar0030 mtime=1552401893.059832781 30 atime=1552402157.225253507 30 ctime=1552410887.029183639 icedtea-web-1.8/netx/sun/applet/package-info.java0000644000175000002070000000336013441742745022274 0ustar00jvanekmock00000000000000/* package-info.java Copyright (C) 2014 Red Hat, Inc. This file is part of IcedTea. IcedTea is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. IcedTea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IcedTea; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.*/ /** * This package serve as access to package private classes in JDK. *

    Do not use it for anything else

    */ package sun.applet; icedtea-web-1.8/netx/PaxHeaders.7406/javaws_splash.png0000644000000000000000000000013213441742745017554 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.225253507 30 ctime=1552410887.028183642 icedtea-web-1.8/netx/javaws_splash.png0000644000175000002070000005562013441742745020374 0ustar00jvanekmock00000000000000‰PNG  IHDR{рн}ЋŠbKGDљCЛ pHYs  šœtIMEс&рв)­ IDATxкьнw|Sхў№OVї ”–Šь)” Ъ’!JQPPAмŠ‚p§)Ž{QЙо PDPйPЖˆŒV(e•бEїоm’fчїД/F“œЄI›ЖŸїые—вœœœ|ЯщЩ'Я9ЯѓˆŒFЃDDDDд ‰Y""""†=""""bи#""""†=""""bи#""""†=""""bи#"""bи#""""†=""""bи#""""†=""""bи#""""†=""""bи#"""bи#""""†=""""bи#""""†=""""bи#""""†=""""†=""""bи#""""†=""""bи#""""†=""""bи#""""†=""""†=""""bи#""""†=""""bи#""""†=""""bи#""""†=""""†=""""bи#""""†=""""bи#""""†=""""bи#"""bи#""""†=""""bи#""""†=""""bи#""""†=""""bи#"""bи#""""†=""""bи#""""†=""""bи#""""†=""""†=""""bи#""""†=""""bи#""""†=""""bи#""""†=""""†=""""bи#""""†=""""bи#""""†=""""bи#""""†=""""†=""""bи#""""†=""""bи#""""†=""""bи#"""bи#""""†=""""bи#""""†=""""bи#""""†=""""bи#"""bи#""""†=""""bи#""""†=""""bи#""""†=""""†=–€ˆˆˆˆaˆˆˆˆіˆˆˆˆˆaˆˆˆˆіˆˆˆˆˆaˆˆˆˆіˆˆˆˆіˆˆˆˆˆaˆˆˆˆіˆˆˆˆˆaˆˆˆˆіˆˆˆˆˆaˆˆˆˆіˆˆˆˆіˆˆˆˆˆaˆˆˆˆіˆˆˆˆˆaˆˆˆˆіˆˆˆˆˆaˆˆˆˆaˆˆˆˆіˆˆˆˆˆaˆˆˆˆіˆˆˆˆˆaˆˆˆˆіˆˆˆˆˆaˆˆˆˆaˆˆˆˆ)K@DDƒ ‰`0`4яz\,W=.‰X0"†=""rvFЃ*• rЙrЙМ*ЬЉT*ЈеъЊžžžpqqX,†ЛЛ;d2мннсттТ№GФАGDDЕ%33йййШЫЫCqq1 P\\ŒЂЂ"ЂЌЌ P(ЈЈЈ€VЋ…бhМ+иЦЊŸJbБИЊUяЮж=777xyyСЧЧооо№ѕѕ…ЗЗ7š4i‚€€оѕ____ю$"†=""2EЋе"##ШЪЪBnn. PPP€’’Шхr( ЈT*ЈT*TTT@­VW§[ЃбмььE,УХХхЎИЛЛпѕущщ‰-Z wяоxьБЧРJф`"уН7f‘SШЯЯGnn.ђѓѓЋZцђђђ““ƒЌЌ,фхх!//………PЉTѕц}I$tяоC† Axx8њѕыюp"†="Ђ†ЋђО9ЅR‰ђђrdee!..зЏ_G\\’’’PTTдроїАaУ№Ю;я`Фˆ<ˆ„—q‰ˆjYх=rƒzН9998wюЮž=‹ .ркЕk(--mЕ8~ќ8 ZЕj…Ю;ГГ‘АeˆЈ–edd 22gЯžХЙsчœœ ЕZ ­V ­V Н^пЈъсююŽЧ?§єЄRЖA1ье3jЕWЏ^ELL .^Мˆ+WЎ ИИ%%%(**OУ@ѓцЭёэЗпbшаЁpssуACdGќ EDф………ˆE\\œœŒ›7o"%%jЕšКG~~>Оџў{tэкmлЖeAˆіˆˆœ3рхчч#-- —.]ТЩ“'…BСтX`0pша!DFF"00ююю, УQнгjЕЈЈЈ@nn.ўјуьпП‘‘‘P*•,Ž ~љхДiг `1ˆіˆˆъ–\.ЧЉSЇАmл69reeeащtМЏŽ;†Ч{ŒaˆaˆЈюФФФ`пО}8uъRSSЋfЎ ћ8qтBCC1hа ƒˆaˆЈv””” 22ЇOŸЦХ‹q§њuфффА0pъд)єшбƒaˆaˆШё222˜˜ˆЈЈ(=zQQQМLы`rЙgЯžE\\:wюЬ‚1ьй—^ЏGYYRRRАoп>ќђЫ/HKKcajQbb"ЖoпŽХ‹ГD5ФA•‰ˆюqхЪќќѓЯиВe Y:ŠC‡СУУƒХ ЊЖьнvсТќ№УјыЏП™™‰ŠŠ ЅeeeсрСƒ3f Чн#bи#"ВнеЋWБuыVœ9sБББ(++cQœ@qq16oоŒG}”aˆaˆШz7oоФщгЇqј№a=z”!ЯЩЈеjœ9sЉЉЉ№їїgAˆіˆˆ„),,ФЭ›7ёлoПaћіэШЫЫcQœTYYNž<‰рр`В D {DDцeeeaлЖmXО|9C^=2ь1ь™f0Аkз.|ѓЭ7ИtщT*‹ROœ:u ))) c1ˆіˆˆюїїпcгІM8~ќ8ввв зыY”z&::§ћїGыж­Y "†="Ђ[Š‹‹Б{їnьлЗ'Nœ€RЉdQъq`‹tGиS*• {D {DdoQQQиП? ag}њєСoМgŸ}іЎпЇЇЇcхЪ•ШЮЮf‘ю {yœA"†="rˆддTDFFВ…ЩЮЦ‡Зоz ?ќ№]ПWЉTˆŠŠТoП§ЦPSMи+//ч={D {DdOћіэУщгЇY;š7o^|ёEєьйѓОЧ"##БrхJНj ^Ц%bи#"{ЉlEљѓЯ?9-šИЙЙaЦŒ˜={6:wю|пуиЗo.\ИРb™8&•J%[іˆіˆШ^ЌЧŽУ7X ;№їїЧИqу№о{я!((Јкevюм‰ˆˆЫ FЃбШB1ьQMЉеjlпОгЂйA“&M№єгOуГЯ>ƒ——WЕЫФЦЦbїюнHKKcСЬ|aЋУйщC5##gЮœBЁ`AjРннЏНіо~ћmxxxTЛŒ^ЏЧвЅKqётEЬН^Я–="†="ЊЉЂЂ"ьмЙ“уъе››–,Y‚чž{ЮdаSЉTиЙs'ЂЂЂPQQСЂ1ь1ьQэ„Нпџ*•ŠХАQ“&MА`СLš4 Эš53Й\JJ V­ZХЫх {D {DT; тттpѕъUУF˜>}:fܘ“Ыхццbћіэь}keи#"†="Њ””œћь3‹AяТ… иГgђђђX8+HЅRˆD"‚шоП –€ˆ„JHH@ll, aƒwоysцЬ1йуNЛvэТЮ;Y45Уб§иВGD‚$&&тЪ•+,„ оzы-М№Т &LОгŽ;pєшQшt:ЮJlй#2ёЗС‘.\`иГ’D"С„ 0sцLДoпотђјх—_XgˆD"Жь1ьQM\Йrёёё,„@bБ РТ… бЁC‹ЫЋT*ќўћя8{і,{•књVУ–=ЃV }A ee0jЕ€X БЛ;ФОО7i‘˜Уˆaˆ(Fƒјјx(•JC ~§њсƒ>@їюн-ŸššŠхЫ—ЃААХГH$‚‹‹‹MaЯh4ТPVЭ•+P8ЭХ‹аBфцiлЖpызn@‘Ћ+ ‘@$“1ќУ5QQQШЮЮf! ХмЙs1tшPAЫЇЅЅaЭš5Ќq Уž››Ф60mBŠџѕ/Шwэ‚AЉŒЦ[?pц ф[З d•Сoр@И—Ў]Yxbи#Ђ†смЙsœХA V­ZaцЬ™xъЉЇ-o0pюм9lоМ™2jіМММ ‘HЌz^Х™3(ўяЁ>ї<н;eUuSX YFаіџч#yzzт“O>AЏ^НЌzо•+WАeЫ”””№€В3‰D‚цЭ› oйsЖžхz=”{і@Йg\ћєЯьй№ž2booˆЌ(šˆaˆjјFŒоН{#** ‘‘‘HNN†RЉ„X,†‡‡ЄR)мммрююИККТгг‰юююUЫИЛЛУнн2™ ЎЎЎUПїєє„ЋЋ+d2YЕм:rЙ*• rЙeee(++C~~>RSS‘œœŒИИ8ЄЄЄ8ЄОООxщЅ—0hа xxxXѕм“'ObЫ–-<іiАхЫEmQ_ОŒТE‹PОq#|gЯ†їдЉЙЙq'У5>У‡Ч… pўќљuŒшлЗ/цЬ™ƒрр`ЋžЇP(АgЯDFFђРqБX сї’аWЭyыД ho§мМ ѕ… p:n@ЪЁЈЁ‡=kZ|,a‹sю_["ї'н)004h233qј№a9rБББHOO7yЯauZЕj…)SІ`ܘ1VoЧў§ћqъд)шœЕ%ЉžsssГjца:иЛƒцђeh._†ђ№axO›сУсвЅ Фьœjи#Вњ В\Ž‹>MЬћщјЧ1x}”;ж ­ZЕТŒ3№Т /ррСƒјюЛяpљђe›НД*‹сююŽ7п|SІLБњuЫЪЪАvэZ$$$p'8ˆЇЇ'ZЗn-ќЃњ‚ЧЊьˆаwэ ?јeнКСoСxŽ I@чо%Гъеб‘H„шшшћzойњ3oо<ˆD"ЌYГ†GQ# “Щ0fЬlлЖ ыж­УиБcсъъjrљЎ]Лт‡~РДiгрууcеkЩхrќілoˆgсШУУ!!!Vняi(.vшTiŽІНqyЏМ‚МYГ <|˜™Х–="j|'Олїњ <]КtСЌYГ„„”••СХХСССx№СбЛwo„„„˜М/аœММ<ЌYГ………,КƒУ^›6m„OWg0@—“c}žЎЬ`4(&1ŠнЛбdў|ИtшР‚іШљEGGЈўоLЃ ‚J ‡ЛЛ;кДiƒ6mк GШЭЭ…JЅ‚D"ŸŸZЖl)М‡ч=ђѓѓБ{їnмИqƒ…Ў…АзЖm[Ћ.уъRSaP*ы§{7ЊеаоИВЬLшrrр5aТ­^Лўў<0ˆa7ЏG‡ гё?jМeєyмшзпфуmО]…fsчдјu2п_€мЏџУч@Э›7GѓцЭэЖОK—.aгІM,l-…Н6mкXіД7oТиТ^е[*/‡bз.hууЁKO‡чИqpщж ")?цЉž…НЪSацZ}ЬиZфмћЛђџzш!…ъ…ќќ|ќѕз_lеЋ%ООО№ђђŒT*швгыt~\Gб\Л†Тџћ?Tœ9ПљѓскЗ/$Mš№ iфъeїО}ћкm]ЋWЏцQ@DvЕwя^ќўћя,D-pssCЋV­„=ƒКєtUЊ]хШž<EŸ}]A†НњчооИжЖ{{уrL6"ВЇєєtќљчŸHMMe1jAPPBBB„ЈTа$%Сшlsу:€ЁЈeыз#gк4(OžфСвˆёb>‘mкД ЇOŸf!j1ь=№РТBэеЋ@#{`(-EХбЃ(,.†цљчс§мs4kЦ‡aˆˆЌe4‘œœŒˆˆфффА ЕЄE‹hзЎ№§$—C}ё"Œi6­ЊЈ(шrsЁЯЯ‡зЄIpэбƒO#Т!З‰ˆь@ЁP`У† Иyѓ&‹Q‹ЌНŒkЫЁКxh„Sзщ’“QєХ(^Ж Њ˜ъс "ФАGDTgrrr№ѓЯ?ЃЄЄ„ХЈхАчщщ)<ь•”@—”д {т Ђб |уFфNŸх‘# | {DD$D~~>"""P\\ЬbдЂ€€ zr94qq,n б’7kJўћ_шхr„aˆˆЬ)**Bdd$єфІgбЉS'ДlйR№ђКЬLЈ/^dсР`€>'%Ы—ЃpС†рŽ4Јq|ЋёђBЈЁўоЃгjйWhЕь+юH'ЅT*‘’’ТкkYЗnнаКukСЫkгв :wŽ…Лƒ>'e?џ ƒR п9sрўШ#, У™;йяоН@ZZ233‘™™ ЉTŠfЭšЁYГfшиБ#ˆЂgЯž‚'эЖUrr26nмˆ˜˜ЄЇЇ#== …-ZД@Ы–-Œ‘#GтщЇŸ†ЏЏo­е*..ыж­УхЫ—‘œœŒŒŒ  }ћіhпО=yфМ№Т pqqсEѕ‚С`€ЊвыŒКwяŽрр`СЫыRSЁЙ|™…Л‡Q.GљO?СP^уыЏУ}Рˆ\]Y†=Њ”””„O?§;vь€мФ}хххHNNЦЙsч№Ы/ПИuSёДiг0sцLtюмйЎлtрР|ѕеW8qтDЕ- 7oоЌъ1ИeЫМњъЋ3f >љфєъеЫaЕ:ў</^Œ#GŽмЗ]iiiHKKУёуЧБnн:|ђЩ'XДhfЮœЩач@кœ”юољ™3аfgC› ]N.єr9ЄЭšAж<вцЭ!kбоC‡Тч‰16mZwл›™ ХпgЁКqЊ7 Ž‡ЎАњВ2шЫЪ ‰ ёѓƒФЯRП&p чУУkр@Иѕь‘Dт˜ЉTŠ&œ’ЊжuшаApч ƒJmRRƒŸ9Ѓ&;v@ŸžП?„зИq,УFЌZЕ .„ВšЩДя 3еЭЫ›““ƒЏОњ _}ѕ† ‚Я?џƒЎб6UTT`ўќљ&gЉмІ{ЗG­VcзЎ]ˆˆˆР’%KА`СHьќЁИ~§zМњъЋамгѓЫTввв0oо<ќќѓЯ8|ј08{Лj5ђПћ%лЖAeВWЂ63кЬЬЊў№#D <<ПI“аь•й98ˆ”J”E@йБc(џу8д цпУэа 8}E›o}С’јј щєi|ыMИZ1Џ>>>шж­ЮŸ?ЯћіjH$BЯž=бдŠ/š7SN IDATЫ—y_šЊsчPИx1єЙЙ№=›i иAУrЙƒЦoМQєю†эо@SнOЅПўњ C† СИqуpѕъU›Ж)55;wО+ш™z=SлЂбhАxёbєызЏкkЋЉSЇbжЌYаh4Vе Юœ9ƒааP“­ІdвˆИжЃ2о~ђгgЌ~ТЈзC~ђвп| зzѕFiФћ‡Q­Ѕћ#ђТ‹ИмМnN~п}o1шYЂ/+CўЪopЕSм|fДvлц   Œ=šAЏ–H$„……YеšЊŠ‰цк5OH0ОzХ_тў“Х`иkœдj5ТТТЊІCЊ.ДўPЛчЙ{їюХгO?mѕzВГГбЇOЄЇЇлМMw>'&&}ћіНЏЮ/М№~§ѕзЊзАv› >>уЧчСWКЂ"$Mx IcУЁNJВЯпB|<’Ц†#iмxшKKэЖ­%лw )|Š~љ…ТўХ0PВc'Ў‡†ЁьРAЛЌвннЁЁЁ:tЈУяХЅ[њѕыgUиSЧФ@Ы–=СДqq(YПEK—ТP^Ю‚0ь5eeehлЖ-тnŸ0ьеѓюЮ gU _BB:tш€тттЯ{ж7RЃОЩ“'cѓцЭ5ЊUхѓЪЪЪxкzвЮЭEТАс(нГзф2nнЛЁе—_ ЫЙГш™‰> єИ™ˆN'ўDаЂрbf†‚в}ћ‘0ъqшkqŒ9БЛ;^‡ЖkПGЧЃGауf"z+ЪбэZ,кяо…р/CГЙs kеЪt.(@тиpф§чПvйІцЭ›уеW_Eїюнyа9˜——zїю-Иc™69кјxЮк/‰ЩЩ(ўњk”§єєљљ,H=Ц{івh4шлЗ/rss‡—Ъ{а„Ѓб‘H„Н{ї"++ бббf—/..ЦУ? ЅRiзэЉмŽььlŒ1ЇNВњОхЫ—cлЖmv Х•лC6ЗщщHљ8д&>шФ^^hНb9ќgМtпc.!!p зрAhљљgШћяrdўуCеъћ–Už‹FТc#бс№!H§§і~DЎЎh6{‚}Y‹ї‡ж.]ржЅKеП ЫОBЮв/ћѕЊнnШXАЎ:Рw\xЭNІR)ž|ђIмИqхххHIIсш‰элЗGлЖm?Gy№ twмкPићLi(,DСЂE€бяiг ЉХ‘ШŽ_YЛС€‰'"11бbx‰DU?ц~WSjЕЃFBQQ‘Х0eЫіTЎ3** ЏПўКUлvњєiМїо{V=ЁлCТщKK‘0l„Щ ' @—sWєЊйA|їt‰ј€ХЈ‡xз‚ДД4|њщЇ–?L\\ƒоН{пѕћvэкЁ]Лv;v,р№сУpqqЉQч‡ЋWЏbеЊU‚Ж)##AAAw§ОC‡шаЁЦ‡ƒB*•BЇг™žЙј№—6mьі~šОјšНRГa Фnnhїл\эдЅкKКeB}a}kМНЭ›7Gxx8Ў\Й‚C‡ё€ДЃРР@„…… {r9ф{їТPXШТй>7хП§БЇ'šўуxЙaЫžяМѓNеШјІТ†H$Тіэля zе5jіэлWЃVЋwоyЧbЫ™H$ТюнЛя zї=z4>ўјc‹лsётElкДЩь2eeeјт‹/,3‘H„.]К ??‹/Fџў§бМysxxx sчޘ0aіяпнЛwC,Г…ЯJКќ|ЄЭ{ефуВр`ОѓvЭТЬТ&W6ШхHыmЛОЇf/Пl—ѕИДn€9Џ˜|<ч_џВл6їьйГfЭB`` J;ёєєDЗnн_"з—” ќЗп`АуPR>№efЂєЛяPіУvэ…O {uцфЩ“иБc‡Х Š№pс7w5 §ћїЗ)ФєСBˆннkє__Мaњ^Юв={ЁБSi@<А[}š>џМщэ>p;ЭАръъŠСƒcтФ‰‚gy ѓxр  ьX0а&&B№>3ћОМ<~ђ {ї2H3ьеkзЎДмќљѓ­^їЌYГlкІuыж™ Ÿ•ЊВ…MшЗхЉSЇZ\юЦИrхŠЩЧ+[ў,]n}эЕзѕж[oСзз—­{5|oњИЩd№{юYЛМ–пфIц>iQјуЛМŽяИpЛNsцб7?Пъ7[­†"ъoЛН–——цЯŸж­[ѓрДƒіэлcрР‚–еЅЄ@Й?РЎјrsQИd фЛvБ {ѕ—\.ЗиЊWy2Ÿ4i’еыкъvWЋCi)іэлgq9wwwŒ=кЊu Дxыж­еў>66ЖjќAГœXŒз^{ЭЊЫйœВGАт-ПA{{x ъјŒmЗЙmнКv…[Зn&/칓M=s§ž{Ё]еOлЕплљЌ'†k‡іІџіOœАлK‰D"сйgŸE+3cў‘eRЉнКu<фŠ61хПџЮТ9.) ђ-[Pqъ‹САW?mпО Ѓї‹D" 4HаТїjеЊКvэjU‹еЖmл ЎnЌА{ЖiфШ‘‚‡%Ј4tшPxzzZМ”[9vоН~pR­Мфbf€оъ<љф“< Ъ_mО'ЌЏkщѓи“iвгQvє˜s‡fЭL>Vqщ’ГЅгЇOGЏ^Нx€ж@XXњєщ#hY}I *ЂЂ KMeсLyќ8ф;wВ {ѕ7ьнrL6l˜ЭЏбЃGЋ–ввhk8ЊќжlI\\вввюћ}e‹ЃЅm:tЈел6pр@x{{ѓRЎЅИвR(Юž3ЛŒчУлѕ5н,Уіl%Г'‰щж ємlоМ9†Ž6vьЁми 0ЁЁЁ‚–U> хсУ,Z-0ЪхP_К}I GL`иЋЮ;'8ˆдVиГ4ЃFЅ‡zШЁлsя}{:БББ‚žkKи“ЩdшлЗ/J ‘Q€™“­ФлюнЛйѕ5=|аќ6 ќ;r&КТ"‡ЌwфШ‘2dTШd2єщгЧтш•”'N@ХТеCI 4ёёfЯ?ФАчtВГГ‘““cv™ЪVІ:иќ:}єŒF#&Ož\5ˆpпО}a4я vШ07ЁD"Б:DVъкЕЋ х._О|зП,^^ЎdыЅЌŽ;ђРД@~цŒйЧн{?ˆэћ'якЙ“љншѓѕю@я 1й:vьˆР•c“YэбGХ< hYUt4дчЯ&Ц%ћ3jЕ0””АNŒƒ*Wуќљѓ‚–sssCѓцЭkќz=zє0y/\Ѕ .ZWГfЭlК‡АђЙfџ oА|oЫžЙКw†c™LfѓMъ {–),„=+цJту‘Lfr %}I 䉉pЕгў3ъѕPХ^…2:ŠшhЈbcЁ+.ОЄњвR,мg+(ьйaцОьŒ;Жъ6ц‰'žмЃYОc4зЏГhЕH$•BЬс…іъ›KoаnзЎ]^яЃ>ТG}d—mЪЭЭuјНmї†ЛЋWЏ z^ppАХ8Ь=—,Дhм0пкХAї‹I›65лXyсbУž&%ы@с 0CKЭЅуZ"{єш№№p†=+ДhбC† ПППАПƒШHшГГYИк {Жi№Оj†Нњ$//OаrBяЉ­mЊ­ ї^тZ/k{сЪ[І/2Џ™‹ƒЦz“јћ› {:3Y|O%%Шxw> 7ўlг0.ЮF&“Ё[ЗnшдЉahяЩ‘<==Ž–-[ ўа Ин…ьKьы Ч’dиЋoJNусссTлT[=Ёюн–ђђrС'юšœєЩ4CE…Х™вцНjv5GбйжсЁtв^™mkЅ ФиБcБjе*СїК6VЭš5УдЉSkF#Œ*ŒDЙіƒ„ng"†Н: {–ТSm†НВВВZ tцhЕZ(ŠЊ&tлмk0EУžyњттЕmХ[З!yъѓf[ѓФžž№{цixЯА0H ёѓ4\ђ”Љ(ўmkдЃI“&xт‰'№гO?1ь™!“ЩаН{wСЃ ˆD"ˆНН!b˜к AAqH!†Нњі,qЏсќЂŽиІкRRRRР„Жье$Kь8]VУ {ЮлЮкqыJїG хХi&ƒžH*EатE|ћ-HNЛчl!ІwяошиБ#Š‹‹y)з„Ž;тщЇŸЖъ9booH[Е‚ЦЮc“™š7oi nбЁZкO,С§”'vЎЭ!”N6йtЩнь…n›‹‹ ЎFШšЫИКЂ"ЄNЩdя^‰:;ŠK>Ў—AЏъ[ЖTŠсУ‡#00ˆ™А7nм8ЋŸч9jdэлГ€ЕѕхЅukШ:ub!œ§œУTsВxЩPЃб8е6еF ŸћZ…Жиё’•уHќ,ŸM?Ѓщд)N§>В?љдt8‰ђгx Tџї—D‚ЧЛwяЖ8ІgcдЎ]; :дІЋ^Я> Ut4ДII,dm„ˆЖmск­ сфиВW ___AсЉЂЂЂжЖЩчієNu=eи™jЦrѓ13ѕT]еЋб…НІM-.cpрјqі ЭЬDСъ5&o2ё)јŽз і—X,Цƒ>(xьИЦfФˆxќёЧm AA№yёExŒУBжFиkнтлŸ™фФћ‰%0іœ)МнІ‰'жњ^оооUAд\'šдKkтВнnnЛЙ™э‘kЫњ=”юнЃ™YšЯŸп іYe„ГgЯЂЈЈˆёm:t(кж`pQЃ rsD"hЎ\ОЈЦ{ПьˆDЗ~ФbЫ3ЫЗю!eOпЛПdЖl )Ч@eиkшaЏ6яЃsЦmЊ$ЄeЯh4bиАa6П†аN њФыяCfІЩЧѕЮіія7Œš7‡чУ§м>ызЏNŸ>(ЮуZeъдЉшгЇOзу>dZєщљіэPьпѕ•+USс‰нм//ˆЅRˆ<ГbIHH‡`аЖm[L:Mt6Њ кД4(AЩЊUШћm,^ŒтЏПFщњѕЈ8~š+W`(,Меbиш’ƒвHkp_%е.ЖьU#((AAA‚†DИyѓ&š5kfѓkU † rпяZЖl‰РР@‹ѓаFмМyнjи~зЎ]w§[&“a№рСе.лЁCИЙЙ ™—.]ВщЦыИИ8˜–ТоУ§oнhnb^ur2 *е­ћ•œŒОФ|Ы­иЮ˜;SЯфж­[ЃgЯž8vьXЃ=v0qтDtэкЕюŽСвRшѓѓa((€ццMh.]‚њьYTœ?#яОчл—юC†€œ$ŸГе:EOddЄMыЏlбћёЧoЭщxЧЯ AƒЊmс ДюѓчЯлќО+[єRSSяк&Fj[ј$ zѕъ%h§ўљЇMлЫƒввљзЧž§ћ™I8(ЮD:фЕЕYYИ sEŒXzзOЪ‹г„mЛЏљN>šмяYkgѕpЄ6mк K—.њи ХыЏП^ЋгAЕZ шKJ Йqђ;QєљчШ~іYф>џ<ŠПњ Ъ?џdаЋ†H*…ЧаЁ3ь1ьеwЯ<ѓЬ­ƒкТЭЛ§ѕ—Mы7uIєNїЖ№UNdi›Ž=jѓћОЗEя^ІZјТУУіRRRpуЦ ”BZH^}еьу%іЏ­Š6mЎvњ&уЧ zОдBыИЪЮћ_“–ю4ћЌeЫ–ши@яIтСФ3Я<ƒІM›жк8ЂFЊЈ(§5ВТУ‘ў№УШ›=х›6A—žЮ‰ЅАчщ їЁC!сјz {ѕнФ‰ЭZqђфI›цЖ<|јАйЧнммюk]|ц™gрfсœбhДљrа… Ьі˜‰DшпПЕЃк ЧFЃ/^D’•#лянЛЗъљdžпфIЕhaђёвн{ђК…ОџфтцŸбТЦ{yAlцяMgПЮ%šфdГН–k›››[Ц”Ћя†މ':ќutйй(пОyoПŒ!C;cJVЎ„ъьYJKoн{Їз7кaT=ИI n_"†=Їсхх…ЇžzЪl€1ШЯЯЧСƒ­Zwll,2oим`*_kиАaїЭ%ыууS5WЄЙP•™™iS‹у­zІ‚еиБcЋ§}—.]н'h4ёЭ7пџn4тћяПч)єD,“Ёйм9ІƒNz:JїьЕыk*ЃЯCuэк}Пї?b//сsf†WбЄІТ`Ї1$KrК§цяя:4КуuдЈQxт‰',~‰Е…б`€њъU”§ђ .Dўo xщR”oкUd$ДII0Е8эeC iкžO> Q-Ю O {5{іlAЫ­ZЕЪЊѕnйВХт2гЇOЏіїГfЭОќђKЋЖIЅRa§њѕf—‘JЅ&З ІM›f1ˆРš5kЯ№ћяПѓ~=+М:в€г_ўё“8l‘ЛlY5ЉS„ E‹ЌZїˆІ4Зт5пXƒљџ[щ”_.ЛwяБИёœ’}}}1eЪСї" ЁЫЮ†*:ђнЛQКbJОўХ_}…тЏО‚|ћvЈЯŸПеƒ–l{p9ђж˜ƒФАз 2Фbы8p/^ДЮ„„„Њ fЊѕЌI“&˜0aBЕ9ЃGЖИMˆŽŽќ^пxу “­•Џ5~ќx™\ЧkЏН&h •J…Gy: C\Иp/ОјЂйZQ5ЁмпmПџЮt§Џ^CўšяьђZyЫW xляї‡…{ЏžV­Ы7|Ќйnsўљ/hjx?Uс†Ÿ rТžнооошмЙsЃ {ЎЎЎxюЙч0hа ћЎ`X•нU*ш ЁMNFХЉS(нА…џїШ6 љяО‹В„цв%žьvr‘BжЙ3\BBn 2M { ХўѓHЭ|ƒЉь­њшЃZs/;;лlШЉ ooНѕ\Э4‘/_О\аРФC† AМ…tF#о}ї]Ќ[ЗЮќ"cсТ…['/^l6ˆV†Жјјxр_џњЮž=‹ММС’%KЬО†H$‚L&УМyѓ№єгOЃ]Лv№їїG||<._ОŒЫ—/cѕъеUsзšj= BbbЂХЮ! ,РВл—ЯЬm“X,ЦгO?iгІЁcЧŽhнК5ђѓѓЋЖiЧŽˆ‰‰1[C‘H„YГfaэкЕ–?Pеjtъд iii6эsћT$™}Џ–žяЪшѓИбЯєœ­mО]eі:G2ШхИёP“-Y<А§wxnѕКхФЭI“ЁЫЯПџ=ЗЭfЯВi›+ЎФтzя>fo’oљЏ"шƒ…V­WuэЧ<)ЈePьщ‰охЕ;c‹^ЏЧпџ'Ÿ|š~Y›6mАrхJ<њшЃЩdV?_’•+ЁпппзЏ_G€Р?№ГgЯbрРаjЕvн—Ж„=G>g{ ЭЩAтуЃQq%жд@Рм9hЙє_јјXѓIIШ\јJvьЌіёІ/О€Ÿ6дh›Г?ћй/1ЛŒп”чќх›?ЎѕzўИ™ ?€ОИИъїR“cэеEиnM'иП”5рVЉ-Z`цЬ™xяНїЌО|k4 иЕ %+WB]9{еБЏ/šўу№{џ}ƒaЯБ*[єьЙЩ•!СR _EEZЖl‰’’AЂК№a)ŒОљц›XБb…рm///GЫ–-!П= З-aзвћJЅ8{іЌр)ф*­YГѓцЭГлОЊм~kзgыѓюtуЁ~PžqШ1jpќTKКЂ"$=ё$gЯ™>‘ЛЛУч‰1№{њiИvю Y‹ H§ќ IM…*.ЊИ8T\Й‚тпЖТhЂхЩџх™hћнš[ГxдPђsSPМu›љ}ыъ ПЩ“р;z4<ТњBБ‡tљљаЄІЁь№aoнvї}"кЌњх'N јЗ­VoWГ9Џ ЭъoВŸŠŠŠ0lиА;5 H$ТДiгАhб"ДЖa>UљоН(^Ж Њ“'љЩ]<ЦŒAг… сўшЃ,F=Фю4ЙЛЛ#!!­[З†JЅ2лЪdmИ‰D0`ўѓŸџXЕMоооИvэ:tшFcv›l ;bБ[ЖlБ:шРмЙsqцЬ‹uВ&А‘фM›Ђуб#H3ХПVпмPQ’э;PВ}‡ѕћG*EаЂат“%vлцŸ6@ьщ‰Т7˜ўSЋQєѓ&§МI№vЖ§ё4}~*ЪOœpО–БmлЖEzz:дjuƒ;‡ ‚gžyЦІ ЇЫЩAйкЕ zuі† ƒЋР9кЩљАƒ†5пъ›5C~~>|o^г"‰Њ‚ощгЇuКИWыж­‘••U5аБ=‚‘H$‚D"СŽ;0yђd›зГqуFЬœ9гnлD5јCїђBЛЭ›ащФŸpя§ нжыљpt‰>gз мjЕkЛ~к|Л тjёЖ–зрAшќwš>?еyї‘XŒ–-[жЈwЊГ ТМyѓ0|Иѕї‡ ”­_ЕРШ_ƒƒсБ€[=ˆaЏA№ђђBrr2BBBjB*Ÿїјул<хZ%$%%ЁХэ™jŒD"\]]БgЯ“УПXc§њѕxщЅ—jT'™L†џћп<јьqќ„ЎбчаіЧр3ђ1ˆlИA^фъ Пg'ЃУЁƒш|њ”еCЌXѕkюєHNBаЂнSxЯСа>hЗхWt:ё'<њєvъ}#‘HаЂE‹і\\\Аlй2›‚шrsQОe Ї1ЋЫѓЦѓЯCжО= Q5ЈЖВЅzНŸ~њ)ўљЯBG/0ЁїЭ‰D",YВ}є‘но‡FЃСТ… БbХŠћЖCшvѕьйлЗoЗћ\@ŒgаIDAT7nФ+ЏМRuyJш=ўўў8~ќ8zіьiѓОча-fŽувR”E@й@›™ mNt9ЙаBьцI“&4ё…K›6№ ƒЧCСы‘‡!ёѓЋѕm5TT@qњ Ъ‡"2кллЉ/)иЫ в€Ш †ї№с№}b d6эQ***Аyѓf,]К999 тјђ№№РЂE‹0}њtјћћ[ПЯЫЫQќпџЂфыЏ9œJ]Ељј есУpыпŸХ`иЋ]І†^Б…ЁWЬЙ|љ2>ўјcьпП_PяS3f >џќs›ю…тєщгјьГЯpєшбЛ‚Ј9:tР‚ 0}њt‡Е,\Мx‹-ТЁC‡,0wwwМќђЫXИp!‚яшq}пœС zдЈеj:t ,@zhХђђђТ3Я<ƒ?ўXа`ыежфтEdOšэЭ›vѕ…wwx>ёПџ’ІMY†=*))Сж­[ёЧ ==ШЩЩЇЇ'бЎ];<іиc3fŒ 9dэ!77Пќђ N:…ŒŒ ddd ??>>>№їїGыж­1x№` 6 ДщžA[$$$рћяПЧЅK—œœŒŒŒ 4mкmлЖEHHњіэ‹—_~Mš4сE†VЋEdd$^}ѕU$''зыї"‹1nм8,^МнЛwЗiКм\”­]‹Тџћ?uDŒ€еЋс1r$Фœ —aˆˆjFЏзуъ厘6mъѕ{yьБЧ№ц›ob„ЙљŽ-яйƒќ7о€.-Gq6 ­†ˆѓрж{ь ADф пМE"јњњжZ ЛЃ<єаCxу7jєдББPькХ W‡d]КР{ЪН‚{‘ˆШОy‹Х№ѕѕ5;ЗГылЗ/>љф 4ЈFы‘џў;ЪЗnхAQ‡\{ѕ‚З€йœЈžœ_X""чрццБИ~ž–ћєщƒ?ќАЦїџЪwь€bя^ uDжЅ [ЃѕшKKQіуЈјћo@рQd’–-с>t(Є­ZБ [іˆˆœ,№еНzѕТ‚ j<лŽA­†ъм9љ% %%<ъяŒœ—aˆˆЩPO~ьБЧА`С<ђШ#5^—:&oП Ci)€Кћ–iЋV№œ0В6mX†=""rН^яєГОˆХbŒ?oОљ&ТТТjмЉŠ‰AЩŠа\НЪ ‰d24yу ШьC]NЪ7m‚bЯюќ:Mz"Иєь ЏgŸ…Фз—ѕ`и#""G0P*•Nіќ§§ёмsЯсЕз^CлЖmяШ Ж=ƒBВѕы!пОЦŠ uZЗ†їдЉМ|ЫАGDDŽd0PXX­VыTл%‰рээљѓчcњєщv™ГкPQђ_~AщwпA—žЮ_Ч\ћєЯьй,У@BBD"QеOх‡ЁЗlй’$Гa///ЯщТ^ЇN№Х_`рР№єєДKаSFD №Ѓ ЯЩсŽЏы зЗ/М'O†ФЫ‹Х`и#""G‡Нмм\Ї {^^^˜8q"fЭš…=zРееЕЦы4ъѕP;†‚E‹єœ„Ч˜1№œ8‘…`и#ЂJЭєTKMMeШfzНIIIPЋеuО-:uТ3Я<ƒ‰'ЂkзЎvYЇQЋ…bя^/_mBwИ№?^ссЛЙБ {DDTaяњѕыP*•uЖ ...шйГ'ІOŸŽ‰'ТЯЯЯ.ы5ЈTPFD xХ ЈNžфЮvтІMсѓвKp c1іˆˆЈ6TTTркЕkuіš6mŠАА0|ќёЧшнЛЗнжkЈЈ€ђа!~ђ 4—/sG;‘Ћ+МЇMƒ[П~‰9k*У9œС`@JJ ыdPхіэлуЕз^У /М`—NUяKЉ„|л6,^ }VwДГ|№Зn ПЗо‚”ЦіˆˆЈvфччудЉSащtЕњКЭš5УѓЯ?чž{!!!v zњ‚”Ў[‡’•+єœˆЄeKј/YТ ЧАGDDЕЉИИQQQЕкЊ7vьX„‡‡cшаЁЖыКU—.Ё|УШwь`аs""oox=ё<Ч‡ШХ…aи#"ЂкЂT*‘ššъ№А'‘HаЕkW 8Яў{їUyџqќГЛйM6—MHИЅ UQP XЄRЁ ЙŒ­д"…(3ŒСŒХŽUj[l™ZQІˆVTЕ#ЪEKЇŠс,Ш@cЁ` М @.$›нЭоЮя5ќ $›лnВ›М_3В9ЫЙ|w“ѓйч9чyfЮдјУˆoУНwЏЮЏ^-чЛяЪЈЋуХ!іœ9цЮ•™1ѕ{шИЅK—†>EЕqанІ?єаCэк‡—^zщВuЭ;З]ыzы­ЗZЕЏЭ-›:ujTъМgЯž&ї#'АЮVSSsйqЅЅЅёЫеMƒСЈЙbГй”‘‘ЁoМQ?џљЯ5sцЬШC]VхcЩНk/jЌьЏМRЉyyJКљfŠAиCw№т‹/69_х+ЏМвюРзUŠ‹‹У†ЬІьлЗЏйчпxу1u|MюЋЙ‰;фъъъš|ЎнnчMчЌVkФ†9љ_fГYcЧŽе§їпЏ‰'FєКМFЊ*9џі7U.^ЌР™3М 1(НАPЉwнE!{ш жЎ]ЋћюЛ/ІїqЧŽ-КFуЦЛ,ш…sрР ыНс†КьЯœ9гфБeee]іГкккАыђx<2™L™с]УсphиАa*))‰XWЎЩdв~є#jܘ1ъгЇЌVkФїнГПjV­’ѓНїd8М˜1(5?_)?љ‰,ХшЁLFWмчп§сhЖ+tётХлЮъеЋ[ь"Ždи{ћэЗ/йЦwойюumлЖ­йжЛЦяЧпцѕ–””ДинЈбЃGЗњџиэv]qХЪЭЭемЙsЕtщR=іиcЪЩЩ‰xа3 Cў3gфќћпUѓЬ3Њ~т ‚^,ŸмЅLЊєyѓzрšНXВ|љr§ъWПjзџ}с…:u_7oо|ЩуіЖъ}јс‡aЏЫ‹Tаk4jд(}zЛжГuыжАЫsssЃR›HЮћ Dкєщгѕт‹/jйВeM^K:tшPъƒ>а+ЏМЂ;юИ#ЊУђNеЌXЁгyyЊYБ‚ E‘ zщВDQzoqЭ^зјуџиь5]mmнћЫ_ўrйК,Xpaљš5kТ^?6gЮœVokуЦ—§џМММv‡НpзЖнzы­QЋџўѓŸfЗло–Нж\Гщ–НFcД5ЕmZітaЊЌЌдщгЇUSSЃъъj™ЭfЅЅЅ)33SYYYъзЏ_“CєDJ ЊJЮM›TЗqЃМGŽ(P^.qКˆyжСƒ•Йd‰вюО›V=\@7n zњщЇѕ№УЗъЙЯ?џќeн Нhkoаk;wFd`ъџ}мв.Ÿ}і™† ёу‰VаkБe&Œj(@>…›LънЛЗzїюнщліŸ9#їЎ]rЩНg|eeМ qТьp(уС•ђгŸєpщ{ƒt_џњзQYя§їпйЯцЭ›іџМўњы­Zї† .y|Wшќрƒx1Ф_Q!їюнЊ]НZUO<Ёк5kzёє!%EiГg+эž{dЩЬЄ ьХƒgžyІХч<їмs­^_K3gќѕЏmSаџ П_AЇS ЅЅЊ{§uЙя>U.Y"o'н™ŽБйd7NYOџ\ Ÿ~*Яž=rЫт…щЎОZY?ЎдМ<™SS)ТшЇБс‘G Л|хЪ•MўМ­AOR‹ѓтОёЦMў<вAO’ІL™вьВ;wF=ш§ЏhЮž!…Zї"Щэv‡]Nаыy‚ѕѕђ——ЫѓЏЩљц›Њ\КTЊ]ЗŽ зMXњїWЏE‹”:}КЬЉЉЂЭ-~8 ёcхЪ•жЅК~§њN;ЎЩ“'7;?nqqqФЇL;x№`‹cэEгщгЇ#6?nи_ю~Н{У0Bзк œ?/їіэЊлАAютbЋЋ)Pw z§њ)}ў|9цЯ—91Q’Ид-Ђ7Ц,_ОМЩЎИЦыЎ.^і‹_ќЂCлzѕеW[=ёЌYГЂ~ьлЖmkrлпO˜0ЁУл8pр@ГЧ8|ј№­ЛЅnмя|ч;*//П№И_П~кžЫхjv[V&>я1ќххrmлІњ­[хљјckjdИ\2ОUн‡9+KŽ9s”ѕћпЫœœLA@и‹gO?§t‹aoсТ…йжkЏНжbиЫЯЯядуoМЗЙ§ЪЩЩiгњJJJšœAутu75i4ТžjйЛxyпО}[Н ЇгйтыeГйј%ъц|_~)Яў§rяо-яЇŸЪџѕзђŸ>ЭМЕн9шef*}о<Ѕџђ—В~ћЗh-њyтPЄ‚^ktvа“.Н1ЃИИјВхџќч?л<]ZsFŽйІ};zєhЛЗеЈБ ЗЂЂB’tіьйVЕф6>nJтЗн9шžŒ`PОуЧх;rD eeђ6~:$Ѓ…ы6б ‚^V–вчЮ•Ѓ € Т^wё№УЗjH˜3gNЋЇKы _ЏїбGux}ЃFŠ™cЛИEямЙsэZ‡нnчІ› : œ;Ї@eЅ|GЪГwЏ\;wЪ{ј0ХщIAЏW/9fЯVњТ…ВHAа.tу@ 0ќ~>Ÿ *pњД<%%ЊпКUюmлфџњk дCƒ^j^žz/_.KFAЛбВ],шr…ZюvьkћvљŽ“Q_/#ќ~ дƒ^fІљљЪќгŸdIIЁ ь@Мё<)їGЩНgМЅЅ TT(XSЃ@u5/’Ђ5р‰eРЅЯŸЏŒТB‚{o••rnм(зЎ]ђ–•ЩwќИŒњz gЂєЌз]Їєyѓ”–Ÿ/Kюд{ќп|ЃК7оPЭЪ•ђGx6Ф?ыѕз+cсТPаЫШa ˜ ТФ УчSн† :їЛпI>СЅAoШe-YЂдiгdВZ z ь@МqОћЎъ6n$шс2‰cЦЈї“OЪ>~МLпЮgMаaтŒkћv5ьпO!p‰Д{юQЦЂEJ9ђBа{gќххђŸ*Ч=ї(сŠ+(:џ=H њь99JИъ* бг^їм\ѕ}љeЅЯŸ/ыwП+“™г.:-{а R~і3љŽSЭŸџмхћЭy]bщлW)wмЁд3”2e aК;ы AJ›5KО'ф..V№ќyŠв ™’’dНњjЅLŸЎŒ ”0p EAзП/ ƒ[Ф ГјNžTхВerНїžUUR @QКХйд$“н.ћ„ Ъxш!ЅLšDM@и€ž*шrЩsр€jV­’ыџС|q/сЊЋ”ѕјуJЙ§vYњєЁ ь@Ogј|ђWTЈЁЄDЮЭ›хмДIFC…‰3–ў§•–ŸЏДйГeЛц™ŠТрЂаШ[Z*ЯюнЊпЖMЎЂ"N'…‰ѕ“gJŠ’'MRЪдЉJОѕVYЏОšЂ€АЯГoŸœяМ#їюнђ–•)X]MQbэЄ™šЊФ#”4nœвђѓ•4z4EaаЦаЗПjз­S§ћя+X[Ћ`m-7rtѕЩ21Q–ў§e?^щ……ВKQ@иДŸ ЪџЭ7rО§ЖЮПќВ|ŸNрыТ —:mš (љ–[({€>УЕьUUЩНk—ъ6lЋЈˆазIЬJ1Ciwп-лuзЩ’•%“еJa@иD^АЖVоcЧф§єSЙ?ўXЎїп—џЋЏ(LЄЖ$ыЕз*eЪ%Oœ(лАaВ"“‰9G@иtябЃrmп.ЯоНђ––ЪwќИ‚55І#'УдT%Ž)лˆJ3Fі d<˜Т€Аш:šЙ‹‹Uџс‡jиП_ЪJЋЋC7t№ЇНх`bЂЬщщВdg+iєhЅЮœЉфЩ“iХa{ З[Ўтbеoй"WQ‘|'N„ƒП‹™Э’Х"“ЭІЄ1c”zчJО§vZё@иФAрѓzexН TUЉсРеoйЂњ-[ЈЈ 8’” xyyJОэ6%єя/“н.SbЂLf3ѕa?‚nЗЇNЩъ”МGŽЈс№a5<(ясУ=ъњО„+ЏTтїПЏЄ›n’mјpYЏМR–ьl%0-{€юТ№zхћђKљŽ—яФ љOž =ўт‹аЭUUнцXЭНzЩzеUВ^sЌC†Ш6dˆЌƒЫ6tЈ,YYМ@иє оЃGеpр€>љDоВ2љЫЫt:e8 ~ћ%П?vРb‘9-Mf‡#єoZšЬНzЩ6l˜GRв˜1В]{-/4@иH’яјqyЫЪф=rфТ—яФ .—Œ@ 4s # нєб7~X,’йКžЎё{‹E&Л=дz7l˜‡—mФˆаxxййМaаЃ1МƒО7\.љОјBоЯ>“їПџ•яыЏ8s&єuъ”gЯFяф”š*ы AJ8P–•0`€Ќƒ…КfЏП^ц””а]Еfsш[Г™!SТ Э!ая—сv+шrЩhhсѓI^Џ ŸOFCƒчЯ+pіЌ‚чЮ…ЦјѓxBЯёљ.м,ŸOС††PЗpB‚,iiRRв…;aЭvЛЬЉЉ2%%ЩвЛЗ,}њШьpHVkшNйФD™lЖ Я5йlМ0aаY‚^ЏŒњњP—ЏпџџнОпƒ2ќўаЯ,–PxГZЅ„™Ќжа—Эњ7%…aPТZ‹O„=і@иa„=і{ ь€АТ{ ь€А@иa„=і@иa€АТ{ ь€АТ{„=і@иa„=і@и ь€АТ{ ь€А@иa„=і@иa„=Т{ ь€АТ{„=і@иa„=і@и ь€АТ{ ь€АТa„=і@иa„=Т{ ь€АТ{ ьі@иa„=і@иa€АТ{ ь€АТa„=і@иa„=і{ ь€АТ{ ьі@иa„=і@иa€АТ{ ь€АТ$§}юFљЃ*”IENDЎB`‚icedtea-web-1.8/PaxHeaders.7406/itw-modularjdk.args0000644000000000000000000000013213441742745017036 xustar0030 mtime=1552401893.025832852 30 atime=1552402157.222253514 30 ctime=1552410887.025183649 icedtea-web-1.8/itw-modularjdk.args0000644000175000002070000000242613441742745017652 0ustar00jvanekmock00000000000000# ------------------------------------- # IcedTea-Web jigsaw run args (jdk9+) # ------------------------------------- --add-reads=java.base=ALL-UNNAMED,java.desktop --add-reads=java.desktop=ALL-UNNAMED,java.naming --add-reads=java.naming=ALL-UNNAMED,java.desktop --add-exports=java.desktop/sun.awt=ALL-UNNAMED,java.desktop --add-exports=java.desktop/javax.jnlp=ALL-UNNAMED,java.desktop --add-exports=java.base/com.sun.net.ssl.internal.ssl=ALL-UNNAMED,java.desktop --add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED,java.desktop --add-exports=java.base/sun.security.action=ALL-UNNAMED,java.desktop --add-exports=java.base/sun.security.provider=ALL-UNNAMED,java.desktop --add-exports=java.base/sun.security.util=ALL-UNNAMED,java.desktop --add-exports=java.base/sun.security.validator=ALL-UNNAMED,java.desktop --add-exports=java.base/sun.security.x509=ALL-UNNAMED,java.desktop --add-exports=java.base/jdk.internal.util.jar=ALL-UNNAMED,java.desktop --add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED,java.desktop --add-exports=java.desktop/sun.awt.X11=ALL-UNNAMED,java.desktop --add-exports=java.desktop/sun.applet=ALL-UNNAMED,java.desktop --add-exports=java.desktop/sun.applet=ALL-UNNAMED,jdk.jsobject --add-exports=java.naming/com.sun.jndi.toolkit.url=ALL-UNNAMED,java.desktop icedtea-web-1.8/PaxHeaders.7406/missing0000644000000000000000000000013213441764276014622 xustar0030 mtime=1552410814.756352739 30 atime=1552410868.391227242 30 ctime=1552410887.024183651 icedtea-web-1.8/missing0000755000175000002070000001533613441764276015445 0ustar00jvanekmock00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: icedtea-web-1.8/PaxHeaders.7406/install-sh0000644000000000000000000000013213441764276015227 xustar0030 mtime=1552410814.754352743 30 atime=1552410814.754352743 30 ctime=1552410887.022183656 icedtea-web-1.8/install-sh0000755000175000002070000003601013441764276016042 0ustar00jvanekmock00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: icedtea-web-1.8/PaxHeaders.7406/config.sub0000644000000000000000000000013213441764276015206 xustar0030 mtime=1552410814.753352746 30 atime=1552410868.479227036 30 ctime=1552410887.021183658 icedtea-web-1.8/config.sub0000755000175000002070000010707013441764276016026 0ustar00jvanekmock00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-05-05' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Spilt fields of configuration type IFS="-" read -r field1 field2 field3 field4 <&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | csky-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nfp-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-pc os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh5el) basic_machine=sh5le-unknown ;; simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; x64) basic_machine=x86_64-pc ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x$os != x ] then case $os in # First match some system type aliases that might get confused # with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) -es1800*) os=-ose ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ | -midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -xray | -os68k* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo "$os" | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4*) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -none) ;; -*-eabi) case $basic_machine in arm*) ;; esac ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; pru-*) os=-elf ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac echo "$basic_machine$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: icedtea-web-1.8/PaxHeaders.7406/config.guess0000644000000000000000000000013013441764276015541 xustar0029 mtime=1552410814.75135275 29 atime=1552410868.46922706 30 ctime=1552410887.019183663 icedtea-web-1.8/config.guess0000755000175000002070000012620613441764276016365 0ustar00jvanekmock00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-03-08' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # Note: order is significant - the case branches are not exclusive. case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ echo unknown)` case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-unknown ;; *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval "$set_cc_for_build" if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "$machine-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval "$set_cc_for_build" SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` case "$UNAME_MACHINE" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "$sc_cpu_version" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "$sc_kernel_bits" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "$HP_ARCH" = "" ]; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ "$HP_ARCH" = hppa2.0w ] then eval "$set_cc_for_build" # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: icedtea-web-1.8/PaxHeaders.7406/compile0000644000000000000000000000013013441764276014577 xustar0029 mtime=1552410814.75135275 29 atime=1552410814.75135275 30 ctime=1552410887.018183665 icedtea-web-1.8/compile0000755000175000002070000001632713441764276015425 0ustar00jvanekmock00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: icedtea-web-1.8/PaxHeaders.7406/README0000644000000000000000000000013113441742745014102 xustar0030 mtime=1552401893.019832864 30 atime=1552402157.214253532 29 ctime=1552410887.01618367 icedtea-web-1.8/README0000644000175000002070000001523513441742745014721 0ustar00jvanekmock00000000000000IcedTea-Web =========== The IcedTea-Web project provides a Free Software web browser plugin for running applets written in the Java programming language and an implementation of Java Web Start, originally based on the NetX project. Homepage (wiki): http://icedtea.classpath.org/wiki/IcedTea-Web Bugs (bugzilla): http://icedtea.classpath.org/bugzilla Mailing List: distro-pkg-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/distro-pkg-dev FAQ: http://icedtea.classpath.org/wiki/FrequentlyAskedQuestions Anonymous Mercurial checkout: hg clone http://icedtea.classpath.org/hg/icedtea-web NetX ==== NetX provides a drop-in replacement for javaws (Java Web Start). Since upstream NetX is dead, we forked the code into the netx/net/sourceforge/jnlp package, whole implementation is still in this package, NetX is kept referenced However, as icedtea-web has evolved to complex set of tools, extensions and tests, it has now only a few lines of code shared with the original implementation. IcedTea's NetX currently supports verification of signed jars, trusted certificate storing, system certificate store checking, and provides the services specified by the jnlp API. In addition it also provides: * full desktop integration * offline run * own appletviewer * many extended security features * own policy editor and much more. For full list read NEWS and Changelog The Browser Plugin ================== IcedTea-Web contains a Free Software browser plugin based on NPRuntime called NPPlugin. By default, this will be built, and it can be turned off using the --disable-native-plugin option. Building IcedTea-Web ==================== IcedTea-Web is built using the standard: $ ./autogen.sh (if building from Mercurial rather than a tarball) $ ./configure $ make $ make install incantation. The build requirements are as follows: * A bootstrap JDK. You can use any java JDK7 or higher compatible. * A C compiler (for the launchers). Additionally, the plugin requires: * A C++ compiler * npapi headers - depending on your distribution: firefox-devel or xulrunner-devel or NPAPI-SDK ... Some distributions do not provide correct NPAPI headers so you can use those: https://bitbucket.org/mgorny/npapi-sdk/downloads. The plugin can be disabled by passing --disable-native-plugin. The following optional dependencies enable additional features * rhino (enables support for using proxy auto config files evaluating javascript) * tagsoup (enables cleanup of not well formed JNLP files) * junit4 (enables unit tests) * jacoco (enables codecoverage) See ./configure --help if you need to override the defaults. Check IT_CHECK_FOR_JDK in acinclude.m4 to see the default search paths for JDKs. At present, some of these options fail due to sun.* classes required by IcedTea-Web. Most targets in IcedTea-Web create stamp files in the stamps directory to determine what and when dependencies were compiled. Each target has a corresponding clean-x target which removes the output and the stamp file, allowing it to be rebuilt. Build Modification Options ========================== The build process may be modified by passing the following options to configure: To configure jdk used for build and runtime, * --with-jdk-home and --with-jre-home are your best friends. If you are using jdk without jre, it may force you to use both those switches to point to same location. * --disable-docs: Don't build the Javadoc documentation. * --with-gcj: Compile ecj to native code with gcj prior to building. (deprecated) * --with-ecj: Specify the location of a 'ecj' binary. By default, the path is checked for ecj, ecj-3.1, ecj-3.2 and ecj-3.3. (deprecated) * --with-javac: Specify the location of a 'javac' binary. By default, the path is checked for javac. (deprecated) * --with-jar: Specify the location of a 'jar' binary. By default, the path is checked for gjar and jar. (deprecated) --with-ecj-jar: Specify the location of an ecj JAR file. (deprecated) Other options may be supplied which enable or disable new features. These are documented fully in the relevant section below. * --disable-native-plugin: Don't build the browser plugin. * --with-rhino: Specify the location of rhino jar * --with-tagsoup: Specify the location of the tagsoup jar * --with-jacoco: Specify the location of the jacoco jar Rhino and Tagsoup Support ========================= IcedTea-Web needs rhino for using Proxy Auto Config (PAC) files. If rhino is not found, or explicitly disabled, then support for PAC files will be disabled. If a rhino jar is not found, rhino support is disabled. The --with-rhino build option can be used to specify the location of the jar file. To explicitly disable rhino use --with-rhino=no. Tagsoup is used in similar way, and it is library used to fix malformed JNLP files. Check acinclude.m4 to see the default search paths. JUnit and Jacoco Support ======================== JUnit is needed for running some tests. It has no run-time impact. By default, the following paths are checked: - /usr/share/java/junit4.jar If JUnit is not found, JUnit support is disabled. The --with-junit option can be used to specify the location of the JUnit 4 jar. To disable JUnit support explicitly, use --with-junit=no. A custom JUnit ouput formatter is supplied. This makes the output of JUnit tests match the output of other tests. A simple 'Passed:' or 'FAILED:' is printed out, followed by .. This is also the format used by JTreg. Jacoco is used in similar way and can be used to measure code-coverage both for junit tests and for reproducer. For plugin a fake binary is created and used. Check acinclude.m4 and Makefile.am to see the default behavior. Testing ======= A set of automated tests is supplied for IcedTea-Web. They can be run by using 'make check' or "make run-netx-dist-tests" 'make check' runs a set of unit tests are that always supposed to pass. 'make run-next-dist-tets' runs the reproducer test suite which requires you to install IcedTea-Web first. (if you want to use it in your personal space, use --prefix to specify final path) The number and type of tests run by 'make check' may be affected by the build options, including JUnit support and rhino support. A test suite is supplied for the browser plugin. It can be built using 'make plugin-tests' and run by loading the HTML page specified into a browser with the plugin installed. See http://icedtea.classpath.org/wiki/Reproducers for more. For debugging, the environment variable ICEDTEAPLUGIN_DEBUG should be set to 'true'. It also starts the debug server on port 8787. If you set it to suspend java will wait for debugger to join before launching main class. You can set verbosity and logging levels via itweb-settings icedtea-web-1.8/PaxHeaders.7406/NEWS0000644000000000000000000000013213441742745013722 xustar0030 mtime=1552401893.019832864 30 atime=1552402157.212253536 30 ctime=1552410887.015183672 icedtea-web-1.8/NEWS0000644000175000002070000004223413441742745014537 0ustar00jvanekmock00000000000000Key: SX - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=X PRX - http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=X RHX - https://bugzilla.redhat.com/show_bug.cgi?id=X DX - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=X GX - http://bugs.gentoo.org/show_bug.cgi?id=X CVE-XXXX-YYYY: http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=XXXX-YYYY New in release 1.8 (2019-03-12): * added support for javafx-desc and so allwong run of pure-javafx only applications * --nosecurity enhanced for possibility to skip invalid signatures * enhanced to allow resources to be read also from j2se/java element (OmegaT) * PR3644 - java.lang.NoClassDefFoundError: Could not initialize class net.sourceforge.jnlp.runtime.JNLPRuntime$DeploymentConfigurationHolder * deployment.config now support generic url instead just file * Added support for windows desktop shortcuts via https://github.com/DmitriiShamrikov/mslinks * cache can now be operated by groups, list by -Xcacheids (details via -verbose, can filter by regex), Xclearcache now can clear only selected id. There is also gui to operate cache via id in itweb-settings now. * desktop shortcut name get shortened to title or file if title is missing. * shared native launchers * scripted launchers rework: Windows bat launchers rewritten to be feature complete, Linux shell launchers made portable, build enhanced to produce platform independent image New in release 1.7 (2017-07-19): * PR3366 - bash completion file was split to three, and is setup-able by bashcompdir environment variable * added experimental support for windows * added experimental support for java 9 (linux only) * added experimental support for jnlp protocol (see https://bugs.openjdk.java.net/browse/JDK-8055464) * restricted to JDK8 and higher * all connection restrictions now consider also port * Enabled Entry-Point attribute check * permissions sandbox and signed app and unsigned app with permissions all-permissions now run in sandbox instead of not at all. * fixed DownloadService * PR2779: html-gen.sh: Don't try to call hg if .hg directory isn't present * PR2591 - IcedTea-Web request resources twice for meta informations and causes ClientAbortException on tomcat in conjunction with JnlpDownloadServlet * PR2690 - Can't run BOM into JNLP file * PR2669 - remove bash-specific syntax from top level Makefile.am * PR2489 - various NPEs when codebase is null * PR2855 - configure.ac: Remove unnecessary checks for libX11 and zlib * PR878 - (http-511) Handle HTTP error 511 Network Authentication Required (standard secure proxy authentification/captive portal detection) * PR1190 - unuseable javaws cache handling * PR3227 - can not save file with query longer then (together with name) then 255 chars * comments in deployment.properties now should persists load/save * fixed bug in caching of files with query * fixed issues with recreating of existing shortcut * trustAll/trustNone now processed correctly * headless no longer shows dialogues * RH1231441 Unable to read the text of the buttons of the security dialogue * Fixed RH1233697 icedtea-web: applet origin spoofing * Fixed RH1233667 icedtea-web: unexpected permanent authorization of unsigned applets * FIXED PR3263 - Cannot retrieve JavaScript Engine using ScriptEngineManager.getEngineByName * fixed fatal impact of initialization error of FileLog * MissingALACAdialog made available also for unsigned applications (but ignoring actual manifest value) and fixed * more dialogs got remember me possibility - MissingALACAttributePanel - AccessWarning - MissingPermissionsAttributePanel - MatchingALACAttributePanel - UnsignedAppletTrustWarningPanel - PartiallySignedAppTrustWarningPanel * Itw-settings - All rememberable dialogues can have saved value modified * NetX - fixed issues with -html shortcuts - fixed issue with -html receiving garbage in width and height - main-class attribute trimmed by default - in strict mode, main-class attribute checked for invalid characters - added -browser switch as workaround around most uttermost http authentications cornercases * PolicyEditor - Entry list is sorted, entries will appear with consistent ordering - file flag made to work when used standalone - file flag cannot be used in combination with main argument - defaultfile flag added - support for SignedBy and Principals along with existing Codebase * Plugin - RH1273691 - Escaped equals signs in deployment.properties not un-escaped when used - PR2746 - IcedTea-Web Plugin 1.6.1: net.sourceforge.jnlp.LaunchException - PR2714 - IcedTea-Web plugin sends uninitialized memory garbage across a pipe when NPN_GetValueForURL call fails - PR3198 - Error in webmin - PR2968 - IcedTea-Web crashes on Dell EqualLogic SAN New in release 1.6 (2015-XX-XX): * Massively improved offline abilities. Added Xoffline switch to force work without inet connection. * Improved to be able to run with any JDK * JDK 6 and older no longer supported * JDK 8 support added (URLPermission granted if applicable) * JDK 9 supported * Added support for Entry-Point manifest attribute * Added KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK deployment property to control scan of Manifest file * starting arguments now accept also -- abbreviations * Added new documentation * Added support for menu shortcuts - both javaws applications/applets and html applets are supported * added support for -html switch for javaws. Now you can run most of the applets without browser at all * Control Panel - PR1856: ControlPanel UI improvement for lower resolutions (800*600) * NetX - PR1858: Java Console accepts multi-byte encodings - PR1859: Java Console UI improvement for lower resolutions (800*600) - RH1091563: [abrt] icedtea-web-1.5-2.fc20: Uncaught exception java.lang.ClassCastException in method sun.applet.PluginAppletViewer$8.run() - Dropped support for long unmaintained -basedir argument - Returned support for -jnlp argument - RH1095311, PR574 - References class sun.misc.Ref removed in OpenJDK 9 - fixed, and so buildable on JDK9 * Plugin - PR1743 - Intermittant deadlock in PluginRequestProcessor - PR1298 - LiveConnect - problem setting array elements (applet variables) from JS - RH1121549: coverity defects - Resolves method overloading correctly with superclass heirarchy distance * PolicyEditor - codebases can be renamed in-place, copied, and pasted - codebase URLs can be copied to system clipboard - displays a progress dialog while opening or saving files - codebases without permissions assigned save to file anyway (and re-appear on next open) - PR1776: NullPointer on save-and-exit - PR1850: duplicate codebases when launching from security dialogs - Fixed bug where clicking "Cancel" on the "Save before Exiting" dialog could result in the editor exiting without saving changes - Keyboard accelerators and mnemonics greatly improved - "File - New" allows editing a new policy without first selecting the file to save to * Common - PR1769: support signed applets which specify Sandbox permissions in their manifests * Temporary Permissions in security dialog now multi-selectable and based on PolicyEditor permissions New in release 1.5 (2014-XX-XX): * IcedTea-Web now using tagsoup as default (tagsoup dependence) sanitizer for input * JDK older then 1.5 no longer supported * IcedTea-Web is now following XDG .config and .cache specification(RH947647) * A console for debugging plugin and javaws * Dialogs center on screen before becoming visible * Support for u45 and u51 new manifest attributes (Application-Name, Codebase, Permissions, Trusted-only) * Custom applet permission policies panel in itweb-settings control panel * javaws -version flag * New PolicyEditor for easily adding/removing permissions to individual applets * Cache Viewer - Can be closed by ESC key - Enabling and disabling of operational buttons is handled properly - Time consuming operations are indicated by a mouse busy cursor - "Size" and "Last Modified" columns display localized data * NetX - PR1465 - java.io.FileNotFoundException while trying to download a JAR file - Netx can now parse malformed jnlp files using tagsoup - PR1026 - Apps fail to run because of the nanoxml parser's strict XML validation - PR1473 - javaws should not depend on name of local file - Redesigned About dialogue layout and contents - Console made aware of plugin messages - PR1856: ControlPanel UI improvement for lower resolutions (800*600) - PR1858: Java Console accepts multi-byte encodings - PR1859: Java Console UI improvement for lower resolutions (800*600) * Plugin - PR854: Resizing an applet several times causes 100% CPU load - PR1271: icedtea-web does not handle 'javascript:'-protocol URLs - RH976833: Multiple applets on one page cause deadlock - Pipes moved into XDG_RUNTIME_DIR - Added debug to file - RH1010958: insecure temporary file use flaw in LiveConnect implementation - Resolves method overloading correctly with superclass heirarchy distance * Common - PR1474: Can't get javaws to use SOCKS proxy - Man page for itweb-settings * Security Updates - CVE-2012-4540, RH869040: Heap-based buffer overflow after triggering event attached to applet New in release 1.4 (2013-XX-XX): * Added cs localization * Added de localization * Added pl localization * Splash screen for javaws and plugin * Better error reporting for plugin via Error-splash-screen * All IcedTea-Web dialogues are centered to middle of active screen * Download indicator made compact for more then one jar * User can select its own JVM via itw-settings and deploy.properties. * Added extended applets security settings and dialogue * Security updates - CVE-2013-1926, RH916774: Class-loader incorrectly shared for applets with same relative-path. - CVE-2013-1927, RH884705: fixed gifar vulnerabilit - CVE-2012-3422, RH840592: Potential read from an uninitialized memory location - CVE-2012-3423, RH841345: Incorrect handling of not 0-terminated strings * NetX - PR1027: DownloadService is not supported by IcedTea-Web - PR725: JNLP applications will prompt for creating desktop shortcuts every time they are run - PR1292: Javaws does not resolve versioned jar names with periods correctly * Plugin - PR1106: Buffer overflow in plugin table- - PR1166: Embedded JNLP File is not supported in applet tag - PR1217: Add command line arguments for plugins - PR1189: Icedtea-plugin requires code attribute when using jnlp_href - PR1198: JSObject is not passed to javascript correctly - PR1260: IcedTea-Web should not rely on GTK - PR1157: Applets can hang browser after fatal exception - PR580: http://www.horaoficial.cl/ loads improperly * Common - PR1049: Extension jnlp's signed jar with the content of only META-INF/* is considered - PR955: regression: SweetHome3D fails to run - PR1145: IcedTea-Web can cause ClassCircularityError - PR1161: X509VariableTrustManager does not work correctly with OpenJDK7 - PR822: Applets fail to load if jars have different signers - PR1186: System.getProperty("deployment.user.security.trusted.cacerts") is null - PR909: The Java applet at http://de.gosupermodel.com/games/wardrobegame.jsp fails - PR1299: WebStart doesn't read socket proxy settings from firefox correctly New in release 1.3 (2012-XX-XX): * NetX - PR898: signed applications with big jnlp-file doesn't start (webstart affect like "frozen") - PR811: javaws is not handling urls with spaces (and other characters needing encoding) correctly * Plugin - PR820: IcedTea-Web 1.1.3 crashing Firefox when loading Citrix XenApp - PR863: Error passing strings to applet methods in Chromium - PR895: IcedTea-Web searches for missing classes on each loadClass or findClass - PR861: Allow loading from non codebase hosts. Allow code to connect to hosting server - PR518: NPString.utf8characters not guaranteed to be nul-terminated - PR722: META-INF/ unsigned entries should be ignored in signing - PR855: AppletStub getDocumentBase() doesn't return full URL - PR1011: Folders treated as jar files in archive tag - PR588: Cookies not written from cookie jar to browser cookies - PR920: Classes attempted to load twice when class extends from outside jar * Common - PR918: java applet windows uses a low resulution black/white icon - RH838417: Disambiguate signed applet security prompt from certificate warning - RH838559: Disambiguate signed applet security prompt from certificate warning - RH720836: project can be compiled against GTK+ 2 or 3 librarie New in release 1.2 (2011-XX-XX): * Security updates: - RH718164, CVE-2011-2513: Home directory path disclosure to untrusted applications - RH718170, CVE-2011-2514: Java Web Start security warning dialog manipulation - RH742515, CVE-2011-3377: IcedTea-Web: second-level domain subdomains and suffix domain SOP bypass * NetX - PR618: Can't install OpenDJ, JavaWebStart fails with Input stream is null error - PR765: JNLP file with all resource jars marked as 'lazy' fails to validate signature and stops the launch of application - PR788: Elluminate Live! is not working - PR804: javaws launcher incorrectly handles file names with spaces * Plugin - PR749: sun.applet.PluginStreamHandler#handleMessage(String) really slow - PR782: Support building against npapi-sdk as well - PR838: IcedTea plugin crashes with chrome browser when javascript is executed - PR852: Classloader not being flushed after last applet from a site is closed - RH586194: Unable to connect to connect with Juniper VPN client - RH718693: MindTerm SSH Applet doesn't work Common - PR768: Signed applets/Web Start apps don't work with OpenJDK7 and up - PR771: IcedTea-Web certificate verification code does not use the right API - PR742: IcedTea-Web checks certs only upto 1 level deep before declaring them untrusted. - PR769: IcedTea-Web does not work with some ssl sites with OpenJDK7 - PR778: Jar download and server certificate verification deadlock - PR789: typo in jrunscript.sh - PR794: IcedTea-Web does not work if a Web Start app jar has a Class-Path element in the manifest - PR808: javaws is unable to start, when missing jars are enumerated before main jar - RH734081: Javaws cannot use proxy settings from Firefox - RH738814: Access denied at ssl handshake - Support for authenticating using client certificates New in release 1.1 (2011-XX-XX): * Security updates - S6983554, CVE-2010-4450: Launcher incorrect processing of empty library path entries - RH677332, CVE-2011-0706: IcedTea multiple signers privilege escalation * New Features - IcedTea-Web now installs to a FHS-compliant location - IcedTea-Web can now handle Proxy Auto Config files - Binary launchers replaced with simple shell scripts - Can now use codebase_lookup=false with applets. * Common Fixes and Improvements - PR497: Mercurial revision detection not very reliable - PR638: JNLPClassLoader.loadClass(String name) can return null - RH677772: NoSuchAlgorithmException using SSL/TLS in javaws - PR724: Possible NullPointerException in JNLPClassLoader.getClassPathsFromManifest * NetX - Use Firefox's proxy settings if possible - The user's default browser (determined from xdg-open or $BROWSER) is used - RH669942: javaws fails to download version/packed files (missing support for jnlp.packEnabled and jnlp.versionEnabled) - PR464: plugin can now load parameters from jnlp files. - PR658: now jnlp.packEnabled works with applets. - PR726: closing javaws -about no longer throws exceptions. - PR727: cache now properly removes files. * Plugin - PR475, RH604061: Allow applets from the same page to use the same classloader - PR612: NetDania application ends on java.security.AccessControlException: access denied (java.util.PropertyPermission browser read) - PR664: Sound doesn't play on runescape.com. - PR721: IcedTeaPlugin.so cannot run g_main_context_iteration on a different thread unless a different GMainContext *context is used - PR735: Firefox 4 sometimes freezes if the applet calls showDocument() New in release 1.0 (2010-XX-XX): * Initial release of IcedTea-Web * Security updates - RH645843, CVE-2010-3860: IcedTea System property information leak via public static - RH672262, CVE-2011-0025: IcedTea jarfile signature verification bypass * Plugin - PR542: Plugin fails with NPE on http://www.openprocessing.org/visuals/iframe.php?visualID=2615 - PR552: Support for FreeBSD's pthread implementation - PR554: System.err writes content two times - PR556: Applet initialization code is prone to race conditions - PR557: Applet opens in a separate window if tab is closed when the applet loads - PR565: UIDefaults.getUI fails with jgoodies:looks 2.3.1 - PR593: Increment of invalidated iterator in IcedTeaPluginUtils (patch from barbara.xxx1975@libero.it) - PR597: Entities are parsed incorrectly in PARAM tag in applet plugin - PR619: Improper finalization by the plugin can crash the browser - Applets are now double-buffered to eliminate flicker in ones that do heavy drawing - RH665104: OpenJDK Firefox Java plugin loses a cookie * NetX - Add a new option -Xclearcache - Interfaces javax.jnlp.IntegrationService and javax.jnlp.DownloadService2 are now available - PR592: NetX can create invalid desktop entry files - RH663680, CVE-2010-4351: IcedTea JNLP SecurityManager bypass * Control Panel - Modifications to deployments.properties file can now be done through a GUI icedtea-web-1.8/PaxHeaders.7406/INSTALL0000644000000000000000000000013113441742745014253 xustar0029 mtime=1552401893.02183286 30 atime=1552402157.211253539 30 ctime=1552410887.013183677 icedtea-web-1.8/INSTALL0000644000175000002070000003633213441742745015073 0ustar00jvanekmock00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. icedtea-web-1.8/PaxHeaders.7406/ChangeLog0000644000000000000000000000013213441764270014772 xustar0030 mtime=1552410808.314367821 30 atime=1552410814.993352185 30 ctime=1552410887.012183679 icedtea-web-1.8/ChangeLog0000644000175000002070000337226513441764270015624 0ustar00jvanekmock000000000000002019-03-12 Lars Herschke Hidden console on Windows * rust-launcher/src/dirs_paths_helper.rs: factory for windows os now supply third parameter * rust-launcher/src/main.rs: (get_os) on windows now have three params. Call to get os if-windows cfged out (main) parent process is now checking ATTACH_PARENT_PROCESS before get_os on windows * rust-launcher/src/os_access.rs: oon windows, without console, no window is enforced. Trait got win-only inside_console method windows impl of os_access. Win module made public to expose AttachConsole function. * rust-launcher/src/utils.rs: test logger got windows-only inside_console 2019-03-12 Jiri Vanek Pre-release tuning * Makefile.am: (netx-html-gen.stamp) set number of changests to 140 (since 1.7) * NEWS: date of 1.8 set * configure.ac: (AC_INIT) set to use 1.8 2019-03-07 Lars Herschke Native launchers now iterate through various keys of jre/jdk in registry * rust-launcher/src/os_access.rs: introduced RegQueryInfoKeyW and RegEnumKeyExW to enable registry query jdk_registry_path renamed to java_registry_path. jdk_registry_path now iterates over several keys * rust-launcher/src/utils.rs: adapted, and if jdk is found, its jre is used. 2019-03-06 Jiri Vanek Lars Herschke On windows, use dunce to canonicalize paths * rust-launcher/Cargo.toml: added dunce crate for windows target * rust-launcher/src/dirs_paths_helper.rs: declared canonicalize methods, one for windows, second for not-windows. The windows one is using dunce, other is on PathBuf. * rust-launcher/src/utils.rs:used above method insted PathBuf::canonicalize 2019-03-05 Jiri Vanek Lars Herschke Fixed path to jfxrt.jar from lib/jfxrt.jar to ext/lib * rust-launcher/src/jars_helper.rs: in (get_cp_members) * shell-launcher/launchers.bat.in: in both CP and CUSTOM_JRE * shell-launcher/launchers.sh.in: in both CP and CUSTOM_JRE 2019-03-05 Lars Herschke * acinclude.m4: Moved windows specific check for JDK on the begging of SYSTEM_JDK part of IT_CHECK_FOR_JDK macro to fix search on windows 2019-03-05 Lars Herschke * Makefile.am: removed dual slash between destdir and modularjdk, included CPPUNIT_FRAMEWORK_CLEAN_IMPL with clean-unittest++-impl/plaeholder to avoid fail of unknown target when native plugin is gone. Cleaning up rust_test_tmp 2019-02-28 Jiri Vanek Michal Vala * Makefile.am: using proper classpath separator variable instead of hardcoded one 2019-02-27 Jiri Vanek Alexandr Kolouch Added Czech translation for 1.8 * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: adapted 2019-02-27 Jiri Vanek keytool command used to create test keystores is called windows friendly * Makefile.am: path to keystore or PUBLIC_KEYSTORE is preprocessed via cygapth on windows 2019-02-27 Jiri Vanek jar command used to pack reproducers is called windows friendly * Makefile.am: (stamps/netx-dist-tests-prepare-reproducers.stamp) TMP_MANIFEST is now exported so it can reach subshell of cygpath. If cygpath is in on PATH, TMP_MANIFEST path is cygpathed 2019-02-27 Jiri Vanek shell launcher got support for JAVA_HOME * shell-launcher/launchers.sh.in: if JAVA_HOME is detected, is used as most preferred 2019-02-25 Olesya Gerasimenko Updated Russian translation * netx/net/sourceforge/jnlp/resources/Messages_ru.properties: adapted to current state 2019-02-20 Jiri Vanek Implemented way how to modify cp/bootcp in native launchers * netx/net/sourceforge/jnlp/config/BasicValueValidators.java: added (RustCpValidator) as provider for help for new properties * netx/net/sourceforge/jnlp/config/Defaults.java: declared for properties to control native lanchers cp/bootcp deployment.launcher.rust.{cp,bootcp}.{add,remove} * netx/net/sourceforge/jnlp/resources/Messages.properties: added help message for new properties * rust-launcher/src/jars_helper.rs: (get_{bootcp,cp}_members) method nw filter items in and from based on properties added and tested new methods (filter_in_val) to add string to vector, and (filter_out_val) to remove matching items from vector * rust-launcher/src/property_from_files_resolver.rs: added try_direct_key_from_properties to get raw property without validation and without option. * rust-launcher/src/utils.rs: test logger return none rather then panic for providing of properties files 2019-02-18 Jiri Vanek Implemented forgotten support for mslinks.jar library in rust launchers * Makefile.am: MSLINKS_JAR are now eported in rust launchers build * rust-launcher/src/hardcoded_paths.rs: MSLINKS_JAR is being captured here and exported as optional * rust-launcher/src/jars_helper.rs: (get_bootcp_members) now append_if_exists also get_mslinks 2019-02-18 Jiri Vanek * rust-launcher/src/log_helper.rs: deployment.log.stdstreams is now honored 2019-02-18 Jiri Vanek For linux, implemented and used system logging * rust-launcher/src/hardcoded_paths.rs: call to info moved to important * rust-launcher/src/jars_helper.rs: same * rust-launcher/src/log_helper.rs: if log_to_system is true(defoult) log_impl logs important messages also to system log * rust-launcher/src/os_access.rs: added trait methods of important and system_log. Implemented for Linux * rust-launcher/src/utils.rs:call to info moved to important. TestLogger got implemented and important and system_log declared as panicking 2019-02-17 Jiri Vanek Implemented proper file logging * rust-launcher/src/dirs_paths_helper.rs: AdvancedLogging moved to log_helper; Linux::new(false) redeclared new to Linux::new(false, false); * rust-launcher/src/log_helper.rs: now harbor AdvancedLogging as it should since beggining log_impl now logs to fille only if log_to_file is true, logs to correct file, format time-stamp a bit better, creates a parent directory * rust-launcher/src/main.rs: get_os functions redeclared to (debug: bool, al: bool) and now calls new(debug, al) main no longer creates AdvancedLogging but calls proper get_os * rust-launcher/src/os_access.rs: added trait method of (advanced_logging), implementations now keep AdvancedLogging variable - dummy or loaded from properties as requested during creation * rust-launcher/src/property_from_files_resolver.rs: adapted to log_to_file -> log_to_file refactoring * rust-launcher/src/utils.rs: try_custom_logdir_from_properties renamed to try_logtarget_from_properties and now returns final log file. New method of (logfile_name) whic compses itw-like name for new log file. TestLogger implements (unimplemented) advanced_logging function 2019-02-16 Jiri Vanek Implemented basic stub for file logging * rust-launcher/src/log_helper.rs: extracted log_impl from os. Implemented (always on for now) call to log to file * rust-launcher/src/main.rs: made aware of new log_hlper module * rust-launcher/src/os_access.rs: adapted to log_helper. Added forgotten is_verbose to windows os impl. 2019-02-16 Jiri Vanek * rust-launcher/src/os_access.rs: removed duplicated code from windows launchers * rust-launcher/src/utils.rs: implemented is_verbose for testing os impl 2019-02-16 Jiri Vanek Native launchers got loading (unused for now) of advanced logging properties * rust-launcher/src/dirs_paths_helper.rs: added struct AdvancedLogging which holds setup of extended logging * rust-launcher/src/main.rs: now load advanced settings from properties. Debug output of jre from properties moved to utils.rs * rust-launcher/src/property_from_file.rs: declared keys for advanced logging properties. Added simple string validator. * rust-launcher/src/property_from_files_resolver.rs: now provides reading methods with validation for new logging keys * rust-launcher/src/utils.rs: got that logging message from main. 2019-02-16 Jiri Vanek * Makefile.am: fixed issue with MODULARJDK_ARGS_FILE being installded as executable 2019-02-15 Jiri Vanek Native launchers got support for modular jdk (via @MODULARJDK_ARGS_LOCATION file) * rust-launcher/src/hardcoded_paths.rs: introduced MODULARJDK_ARGS_LOCATION recognition * rust-launcher/src/jars_helper.rs: now are able search in bin, and this reads MODULARJDK_ARGS_LOCATION * rust-launcher/src/main.rs: now reads java -version, and if modular, put MODULARJDK_ARGS_LOCATION to args * rust-launcher/src/os_access.rs: removed duplicated code form windows in java spawn, extracted args creation so it could be reused for java version recognition * rust-launcher/src/property.rs: added note about Unicode failure in case properties (thus jre location) contains \u values 2019-02-13 Alex Kashchenko Os trait implemented for windows * rust-launcher/src/dirs_paths_helper.rs: added (get_os) os dependent factory method to provide os impl with debug off. (check_config_files_paths_global) split to os independent (check_config_files_paths) and rest linux only * rust-launcher/src/jars_helper.rs: (get_bootclasspath) fixed issue with hardcoded cp delimiter in xbootclasspath * rust-launcher/src/main.rs: added (get_os) os dependent factory method to provide os impl with debug parameter * rust-launcher/src/os_access.rs: implemented os trait for windows * rust-launcher/src/utils.rs: better recognition of rop_dir and parent dir in (try_jre_exists_on_path) 2019-02-13 Jiri Vanek Propagating unimplemented DownloadService2. Added tests for it * netx/net/sourceforge/jnlp/services/ServiceUtil.java: added static getter for DownloadService2 * netx/net/sourceforge/jnlp/services/XDownloadService2.java: unimplemented stub for future DownloadService2 * netx/net/sourceforge/jnlp/services/XServiceManagerStub.java: listed javax.jnlp.DownloadService2 providing XDownloadService2 * tests/reproducers/simple/DownloadService2/resources/DownloadService.jnlp: jnlp to call DownloadService * tests/reproducers/simple/DownloadService2/resources/DownloadService2.jnlp:jnlp to call DownloadService2 * tests/reproducers/simple/DownloadService2/srcs/DownloadService.java: app to call DownloadService * tests/reproducers/simple/DownloadService2/srcs/DownloadService2.java: app to call DownloadService2 * tests/reproducers/simple/DownloadService2/testcases/DownloadService2Test.java: test to laounch DownloadService2 and DownloadService 2019-02-12 Jim Douglas Fixed typo in DownloadService2 * netx/javax/jnlp/DownloadService2.java: getUpdateAvailableResources repalced incorrect getUpdateAvaiableReosurces 2019-02-11 Laurent BourgУЈs Jiri Vanek Rewritten bat launcher and introduced file to keep modular JDK swithces * .Makefile: introduced MODULARJDK_ARGS_FILE=itw-modularjdk.args; built to launcher-build, handled as separate file. MODULARJDK_ARGS_LOCATION is sedded into shell scripts. bat files are now cleaned to windows line-endings. * acinclude.m4: Introduced new switch to allow to set switch file target location * configure.ac: IT_CHECK_MODULARJDK_ARGS called; fixed few typos (mostly lunch->launch) * itw-modularjdk.args: new file, containing jisgsaw argument to allow ITW to run on jdk9 and up * shell-launcher/launchers.bat.in: rewritten from scratch; to be more like linux shell launcher * shell-launcher/launchers.sh.in: JAVA no longer sed. USed JRE/bin/java instead. Adapted for itw-modularjdk.args file; few additional cosmetic changes 2019-02-07 Jiri Vanek Allowed cross-build of bat launchers on linux systems * .Makefile: some if WINDOWS changed to if WINDOWS_OR_INCLUDE_BATS * configure.ac: introduced --enable-bats-on-linux which (or if host is windows) set WINDOWS_OR_INCLUDE_BATS to true 2019-02-07 Jiri Vanek Added protection against to small applets. Enhanced understanding of properties like width/height * netx/net/sourceforge/jnlp/AppletDesc.java: (getWidth) and (getHeight) now query proeprties for new keys and resize acodringly to them and/ * netx/net/sourceforge/jnlp/config/Defaults.java: new keys made validated by integer. Treshold must be positive * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: added keys of deployment.small.size.treshold to allow value since which applet is to small (default 10), deployment.small.size.override.{width,height} to set new size negative values to enforce it, positive to be used as fallback, if no width/heigh (lower/upper/cammel) parameter found default is set to search for width/height param and enforce 800x600 if not present 2019-02-07 Jiri Vanek Desktop sortcuts name is now based on title. And only if missing, then on file * netx/net/sourceforge/jnlp/JNLPFile.java: new method of createNameForDesktopFile, which returns title if it is present, jnlp file name otherwise. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: getGeneratedJnlpFileName and getDesktopIconName now uses * NEWS: mentioned 2019-02-06 Jiri Vanek Delete-by app dialogue split keys to two groups instead of mixing them * netx/net/sourceforge/jnlp/cache/CacheUtil.java: clearCache(String) changed to (String,bool,bool) to allow by-key access. (listCacheIds) - same. (getCacheIds) - same plus used those two booleasn to select what keys to include in filtering * netx/net/sourceforge/jnlp/controlpanel/CacheAppViewer.java: the deleteByApp dialog enhanced by TabView. Each tab holds one family of keys. * netx/net/sourceforge/jnlp/runtime/Boot.java: adapted to new signature of (CacheUtil.listCacheIds) 2019-02-04 Jiri Vanek Native launchers got splash support * rust-launcher/src/main.rs: made parsing of variables and arguments testable; added handling of splash Fixed issue with wrongly parsed -switch from commandline; splash is now added to java command if not forbidden or headless added tests for all above 2019-01-15 Jiri Vanek Relaxed vendor and title to be no longer mandatory - based on oracle javaws behavior * netx/net/sourceforge/jnlp/JNLPFile.java: getVendor/Title refactored to work without values. In strict mode, they keep throwing MisisngElement exception/ * netx/net/sourceforge/jnlp/Parser.java: delegating logic to check title/vendor to JNLPfile. Jsut calling it with possibility of fail. * netx/net/sourceforge/jnlp/resources/Messages.properties: added PMissingMandatoryWarning and PMissingMandatorySubstitution to inform about missing title/vendor * tests/netx/unit/net/sourceforge/jnlp/ParserTest.java: adapted to new behavior 2019-01-15 Jiri Vanek Made Linux launchers portable * shell-launcher/launchers.bat.in: made aware of the variables substituted from * shell-launcher/launchers.sh.in: included snippet for current directory resolving. If NEXT_JAR is not found on its location, compose new (boot)classpath, based on current directory. 2018-01-07 Joel Tesdall Jiri Vanek Added optional windows desktop integration * AUTHORS: added Joel * Makefile: Excluded (WindowsDesktopEntry.java) if mslinks are not included, added mslinks to UNIFIED_CLASSPATH_SEGMENTS included mslinks to windows and linux runtime libs, added MSLINKS_JAR to other composeclasspath calls * NEWS: mentioned windows desktop support, mentioned listing of cache and operations via id. * acinclude.m4: added check (IT_CHECK_FOR_MSLINKS) for optional mslinks.jar, strong warning printed if build is on windows * configure.ac: call (IT_CHECK_FOR_MSLINKS) * netx/net/sourceforge/jnlp/Launcher.java: new variable of (KEY_JAVAWS_LOCATION) to replace hardcoded icedtea-web.bin.location over netx. * netx/net/sourceforge/jnlp/OptionsDefinitions.java: re-declared clear cache to take none or one argument. Added Xcacheids switch for listing the cache (works with verbose) * netx/net/sourceforge/jnlp/cache/CacheDirectory.java: refactored hardcoded ".info" to constant. * netx/net/sourceforge/jnlp/cache/CacheEntry.java: introduced KEY_JNLP_PATH and used to set jnlp-path attribute * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: hide private constructor, declared and provided (windowsShortcutList) * netx/net/sourceforge/jnlp/cache/CacheUtil.java: extracted and used (checkToClearCache). Added second method clearCache with arg to clear only specific part of cache. Clear cache also alerts windows desktop files now via new removeWindowsShortcuts. Added methods to lists ids and details from cache listCacheIds and getCacheIds. Included new inner class CacheId to encapsualte various types of id - CacheJnlpId and CacheDomainId now. * netx/net/sourceforge/jnlp/cache/DirectoryNode.java: only adapted to .info refactoring * netx/net/sourceforge/jnlp/cache/ResourceDownloader.java: Save main argument, or jnlp argument or html argument to jnlp-path .info entry if found. * netx/net/sourceforge/jnlp/controlpanel/CacheAppViewer.java: gui to itweb-settings cache pane to allow comfortable listing of ids and deleting via those grouping. New file. * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: added logic to show .info details for each file shown by cache viewer. (generateData) made jnlp-path aware, made public and reused several times * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: added button to show dilog which is deleting by id * netx/net/sourceforge/jnlp/resources/Messages.properties: added BXclearcache BXSingleCacheCleared BXSingleCacheClearNotFound BXSingleCacheMoreThenOneId BXSingleCacheFileCount BXcacheids NOAnonorone WinDesktopError. Modified BXclearcache. Improved EXAWdesktopWants EXAWdesktopDontWants EXAWsubmenu EXAWmenuWants EXAWmenuDontWants EXAWrememberByApp EXAWrememberByPage EXAWrememberByAppTooltip EXAWbrowsersTolltip SDesktopShortcut * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: added if isWindows reflective calls to WindowsDesktopEntry and original XdesktopEntry work moved to else part. * netx/net/sourceforge/jnlp/runtime/Boot.java: now offer getter for optionParser (so it van be reused in ResourceDownloader) Added understanding to Xcacheids. Understanding to Xclearcache adapted to its new optional argument * netx/net/sourceforge/jnlp/util/GenericDesktopEntry.java: interface for (future) WindowsDesktopEntry and XDesktopEntry unification * netx/net/sourceforge/jnlp/util/WindowsDesktopEntry.java: new file, implementation fo windos desktop integration via lnk files generated by mslinks.jar. Unlike XDesktop integration, it swarms also uninstall shortcuts. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: Mostly adapted to refactorings. Extracted extraction of favicon to method, reused, and improved to try more locations on server. * netx/net/sourceforge/jnlp/util/optionparser/OptionParser.java: adapted to refactorings * shell-launcher/launchers.bat.in: mslinks included in bootclasspath * tests/netx/unit/net/sourceforge/jnlp/cache/CacheUtilTest.java: addd tests for CacheId * tests/netx/unit/net/sourceforge/jnlp/util/XDesktopEntryTest.java: Added tests for favicon extraction 2019-01-14 Jiri Vanek Refactored arranging of arguments and finding jre on path to be testable * rust-launcher/src/main.rs: introduced compose_arguments, include_not_dashJs, include_dashJs_values; used, tested * rust-launcher/src/utils.rs: introduced get_jdk_from_path_conditionally_testable and get_jdk_from_given_path_testable; used, tested 2019-01-14 Jiri Vanek Added detection of JDK from PATH * rust-launcher/src/hardcoded_paths.rs: minor fix of Err to err * rust-launcher/src/jars_helper.rs: removed redundant declaration of i * rust-launcher/src/main.rs:resolving of jre moved to utils * rust-launcher/src/os_access.rs: declared new method, get_exec_suffixes to obtain java's executable suffix implemented for linux as "" * rust-launcher/src/utils.rs: new method find_jre, extracted form main, enhanced for call to get_jdk_from_path_conditionally new method get_jdk_from_path, for bundled build and both, searching fo jre on path. Based on java executable on path, resolves jre 2019-01-14 Jiri Vanek Added support for -J options * rust-launcher/src/main.rs: arguments are now copied to sub-process in two steps First those with -J prefix are having it stripped and are given to JVM. Those withou J are suffixed to the itw itself 2019-01-14 Jiri Vanek Added code-coverage for rust launchers * .Makefile.am: declared target counting code coverage on rust launchers based on kcov * acinclude.m4: declared checkfor kcov directory * configure.ac: added optional check for kcov 2019-01-09 Jiri Vanek Made rust launchers to resovle jars, compose classpath and this run itw * Makefile: renamed netx.jar to javaws.jar; properly ued variabels for NETX_JAR and SPLASH_PNG and all other .jar and.png resources * configure.a: added check for --with-itw-libs which determines wheter build is for distribution, self or portable usage * netx/net/sourceforge/jnlp/cache/CacheUtil.java: adapted netx->javaws renaming * netx/net/sourceforge/jnlp/controlpanel/ClassFinder.java: adapted netx->javaws renaming * netx/net/sourceforge/jnlp/resources/Messages.properties: adapted netx->javaws renaming * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: adapted netx->javaws renaming * netx/net/sourceforge/jnlp/resources/Messages_de.properties: adapted netx->javaws renaming * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: adapted netx->javaws renaming * netx/net/sourceforge/jnlp/resources/Messages_ru.properties: adapted netx->javaws renaming * netx/net/sourceforge/jnlp/runtime/Translator.java: adapted netx->javaws renaming * rust-launcher/src/dirs_paths_helper.rs: added utility methods of path_to_string, current_program, current_program_parent, current_program_name check_config_files_paths split to check_config_files_paths and check_legacy_config_files_paths. Both win only. First one temporarily. * rust-launcher/src/hardcoded_paths.rs: made aware of SPLASH_PNG, TAGSOUP_JAR, RHINO_JAR, ITW_LIBS added enum for ITW_LIBS - BOTH, BUNDLED and DISTRIBUTION * rust-launcher/src/main.rs: by using jars_helper, compose classpath, put it to java args together with main, and so is making launchers work * rust-launcher/src/jars_helper.rs: new class, responsible composing classpath by resolving which jars to use * rust-launcher/src/os_access.rs: Added trait method get_classpath_separator * rust-launcher/src/property_from_files_resolver.rs: TestLogger moved to utils * rust-launcher/src/utils.rs: got TestLogger and provided factory method for it. 2018-12-10 Jiri Vanek jtesdall Replaced hardcoded BOM character with utf representation (PR3671) * netx/net/sourceforge/nanoxml/XMLElement.java: (scanLeadingWhitespace) resolved PR3671, relaced ' ' by \\ufeff 2018-12-10 Jiri Vanek Made get_home os dependent. * rust-launcher/src/dirs_paths_helper.rs: removed get_home; used os.get_home where appropriate. Introduced is_dir, and moved is_file here and theirs tests. * rust-launcher/src/os_access.rs: prescribed get_home and implemeted for Linux, solemnly on HOME variable * rust-launcher/src/property_from_file.rs: adapted to new location of is_file * rust-launcher/src/property_from_files_resolver.rs: implemented get_home doing nothing for testing stub 2018-11-30 Jiri Vanek verbose also from deployment.properties * rust-launcher/src/main.rs: now reading verbose also from deployment.properties * rust-launcher/src/property_from_file.rs: added wrapping functions to load deployment.log boolean * rust-launcher/src/property_from_files_resolver.rs: refactored to use new validators 2018-11-30 Jiri Vanek Rust properties parser generalized to be reusable * rust-launcher/src/dirs_paths_helper.rs: new file, including get_xdg_config_dir, deployment.properties and similar originally from jvm_from_properties.rs * rust-launcher/src/main.rs: adapted to re-factored state * rust-launcher/src/os_access.rs: added and for Linux implemented get_system_config_javadir, get_user_config_dir * rust-launcher/src/property_from_file.rs: renamed from jvm_from_properties_file and generalized * rust-launcher/src/property_from_files_resolver.rs: renamed from jvm_from_files_resolver and generalized * rust-launcher/src/utils.rs: adapted to renamed JRE_PROPERTY_NAME from PROPERTY_NAME 2018-11-28 Jiri Vanek deployment.config now support generic url instead just file * netx/net/sourceforge/jnlp/config/Defaults.java: added option KEY_SYSTEM_CONFIG as url and KEY_SYSTEM_CONFIG_MANDATORY as boolean, thus documented * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: refactored to work with general url rather then with file only * netx/net/sourceforge/jnlp/config/InfrastructureFileDescriptor.java: added (getUrl) as shortcut to getFile().toURI().toURL() * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java: (CommandLine) made aware of MalformedURLException * tests/netx/unit/net/sourceforge/jnlp/config/DeploymentConfigurationTest.java: added tests for new DeploymentConfiguration.checkUrl covering ok/not ok file, ok/not ok http * NEWS: mentioned 2018-11-27 Jiri Vanek * netx/net/sourceforge/jnlp/OptionsDefinitions.java: (main) moved from ifelse to switch 2018-11-27 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPProxySelectorTest.java: fixed tests in (testConvertingProxyAutoConfigResultToProxyObject) 2018-11-27 Jiri Vanek https is preffered only on default port * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java: (getUrls) when http protocol-ed url have set port its https clone is not put to the list of possible urls 2018-11-27 Jiri Vanek PR3645, second part - following windows system paths correctly * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: following https://docs.oracle.com/javase/7/docs/technotes/guides/jweb/jcp/properties.html (SystemCofigFileDescriptor) now honor WINDIR on windows 2018-11-27 Jiri Vanek Lars Herschke Fixed PR3637 - making cache work with jdk9+ #runtime jar url anchor * netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java: (retrieve) if jar is not found in cache, ale url without anchor is attempted * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: usinf localFile.toURI().toURL() instead of direct localFile.toURL() 2018-11-23 Lars Herschke Jiri Vanek Fixed LockedFile for readonly on windows * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: made isUnix deprecated * netx/net/sourceforge/jnlp/util/lockingfile/LockedFile.java: creating file (for windows) only if not readonly * tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/NonWindowsLockedFile.java: tests for os set to no windows * tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/WindowsLockedFileTest.java: tests for os set to windows 2018-11-23 Lars Herschke Fix for java.lang.NoClassDefFoundError: Could not initialize class net.sourceforge.jnlp.runtime.JNLPRuntime$DeploymentConfigurationHolder * NEWS: mentioned PR3644 * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: removed useless logging of headless - initiation of logging - on windows * AUTHORS: added Lars 2018-11-07 Olesya Gerasimenko Added Russian translation * netx/net/sourceforge/jnlp/resources/Messages_ru.propertie: new file with Russian strings * tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java: added RU to iterated sets. * AUTHORS: added Olesya 2018-10-18 Jiri Vanek Removed gcc if native plugin is not build * acinclude.m4: AC_PROG_CC and AC_PROG_CXX moved behind enable_native_plugin condition * configure.ac: AC_PROG_CC and AC_PROG_CXX moved behind enable_native_plugin condition, Faked fastDepC variables otherwise configure always fell * Makefile.am: plugin native tests made passing without plugin 2018-10-17 Jiri Vanek Alex Kashchenko * netx/net/sourceforge/jnlp/util/lockingfile/LockedFile.java: caching enabled, or at least semi-enabled on windows 2018-10-17 Laurent BourgУЈs * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: using SwingUtils.invokeLater instead of * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java: same + calling SwingUtils.setup * netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/Blinker.java: same * netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/FreeDesktopIntegrationEditorFrame.java: same * netx/net/sourceforge/jnlp/runtime/Boot.java: same + calling SwingUtils.setup * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExtendedAppletSecurityHelp.java: same * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: same + calling SwingUtils.setup * netx/net/sourceforge/jnlp/splashscreen/parts/BasicComponentErrorSplashScreen.java: same * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java: same * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: same * netx/net/sourceforge/jnlp/util/ImageResources.java: added check for null in stream * netx/net/sourceforge/swing/SwingUtils.java: added setup-able. removed EDT_DAEMON_THREAD_POOL (thus currently not working properly in jdk11+, but fix for JDK itself is on the way) 2018-10-12 Jiri Vanek reworked showDocument logic * netx/net/sourceforge/jnlp/config/BasicValueValidators.java: added special validator for browser * netx/net/sourceforge/jnlp/config/Defaults.java: used this validator * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: declared browser's constants and environment variable * netx/net/sourceforge/jnlp/resources/Messages.properties: removed invalid lines, added new lines * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: removed invalid lines, * netx/net/sourceforge/jnlp/resources/Messages_de.properties: removed invalid lines, * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: removed invalid lines, * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java: showDocument now works * netx/net/sourceforge/jnlp/runtime/Translator.java: added shortcut method to call call VVPossibleBrowserValues * netx/net/sourceforge/jnlp/runtime/html/browser/LinkingBrowser.java: split creation from stand alone launch * netx/net/sourceforge/jnlp/services/XBasicService.java: fully reworked showDocument. Focus on standard desktop api and customization * tests/reproducers/signed/ShowDocument/resources/ShowDocumentApplet.jnlp: test jnlp for applet's context.showDocument * tests/reproducers/signed/ShowDocument/resources/ShowDocumentMain.jnlp: test jnlp for application's basicService.showDocument * tests/reproducers/signed/ShowDocument/resources/document.txt: document to be shown in test * tests/reproducers/signed/ShowDocument/srcs/ShowDocument.java: body of applet/jnlp-app * tests/reproducers/signed/ShowDocument/testcases/ShowDocumentTest.java: two testcases - one for applet, second for app. Both running on headless. 2018-10-10 Jiri Vanek Rust launchers now spawn jvm * rust-launcher/src/jvm_from_properties_resolver.rs: implemented new trait method (spawn_java_process). Stub only. Will panic * rust-launcher/src/main.rs: java from found java_dir is launched. Process is awaited, its return returned. * rust-launcher/src/os_access.rs: trait method of (spawn_java_process) add and implemented for linux. 2018-10-01 Jiri Vanek * rust-launcher/src/main.rs: new method of (is_debug_on) based on cmd line determining verbosity. (main) return of is_debug_on used for os_access::Linux::new call. 2018-09-26 Jiri Vanek Allowed itw-settings to be opened from viewer * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: used exit instead of dispose * netx/net/sourceforge/jnlp/resources/Messages.properties: new string with key of ButLunchFullItwSettings * netx/net/sourceforge/jnlp/runtime/Boot.java: get rid of exit, and only return from main method * netx/net/sourceforge/jnlp/security/SecurityDialog.java: call too showSingleCertInfoDialog changed to Window * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: added new button to launch ControlPanel main class * netx/net/sourceforge/jnlp/security/viewer/CertificateViewer.java: used exit instead of dispose * netx/net/sourceforge/swing/SwingUtils.java: (info) now accepts Window instead of JDialog 2018-10-01 Laurent BourgУЈs Fixed EDT hanging * AUTHORS: added Laurent * netx/net/sourceforge/jnlp/GuiLaunchHandler.java: invokeLater and invokeAndWait moved from SwingUtilities to the local wrapper SwingUtils. Simplified splashscreen loading * netx/net/sourceforge/jnlp/JNLPSplashScreen.java: called super and added name to the dialog * netx/net/sourceforge/jnlp/Launcher.java: added log entry for main class loading. Highlighted usage of SwingUtilities on top SwingUtils for this particular space * netx/net/sourceforge/jnlp/about/AboutDialog.java: added name. InvokeLater and invokeAndWait moved from SwingUtilities to the local wrapper SwingUtils. * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java: reworked to work in SwingUtils.invokeAndWait. Added name. * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java: added name * netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java: added name * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: added top level setup for enabling SwingUtils debugging abilities added log entry for main class loading. Highlighted usage of SwingUtilities on top SwingUtils for this particular space * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java: instead of invokeAndWait, used SwingUtils.callOnAppContext * netx/net/sourceforge/jnlp/runtime/Boot.java: added top level setup for enabling SwingUtils debugging abilities CertificateViwer moved to invokeAndWait. added log entry for main class loading. Highlighted usage of SwingUtilities instead of SwingUtils for this particular case * netx/net/sourceforge/jnlp/runtime/HtmlBoot.java: invokeLater and invokeAndWait moved from SwingUtilities to the local wrapper SwingUtils. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: removed import of import javax.swing.JWindow * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java: direct call to JWindow().getOwner(), moved to SwingUtils.getOrCreateWindowOwner. Its existence doubtful * netx/net/sourceforge/jnlp/security/SecurityDialog.java: installPanel moved to invokeAndWait * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: used SwingUtils instead of SwingUtilities, added name * netx/net/sourceforge/jnlp/security/dialogs/ViwableDialog.java: swing ops moved to invokeAndWait * netx/net/sourceforge/jnlp/security/viewer/CertificateViewer.java: calling Swingutils.setup, still all the same * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java: still the same * netx/net/sourceforge/jnlp/util/BasicExceptionDialog.java: same - name, SwingUtils x SwingUtilities, and proper usage of invokes * netx/net/sourceforge/jnlp/util/FileUtils.java: SwingUtils x SwingUtilities * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: observable.notifyObservers moved to invokeLater and and invoked only if observable.hasChanged * netx/net/sourceforge/swing/SwingUtils.java: new class. Wrapper around most commonly used SwingUtilities calls. Add debugging bridge property of icedtea-web.edt.debug set to true, can enable it on runtime. * netx/net/sourceforge/swing/ThreadCheckingRepaintManager.java: Based on http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html debugging repaint manager 2018-10-01 Fridrich Strba Added eternal java version detection * acinclude.m4: used sophisticated head-cut to determine single number major java version * plugin/icedteanp/IcedTeaNPPlugin.cc: similar * shell-launcher/launchers.sh.in: same 2018-09-05 Jiri Vanek * shell-launcher/launchers.sh.in: inverted logic to detect modular jdk. If it is jdk8, then it is not modular JDK, otherwise it is. 2018-09-05 Jiri Vanek Implemented JVM recognition in rust launchers * .hgignore: added rust-launcher/.idea * .Makefile: (launcher.build) adapted to tmp handling - exporting rust_tests_tmp and creating it * rust-launcher/src/hardcoded_paths.rs: not-using returns consistently * rust-launcher/src/jvm_from_properties.rs: logic to parse properties file, and to read JDK value from here * rust-launcher/src/jvm_from_properties_resolver.rs: logic to waterfall all usable properties files and try locate JDK here. * rust-launcher/src/main.rs: now trying various JDKS: proeprties->JAVA_HOME->registry->default (from build) * rust-launcher/src/os_access.rs: set of classes serving to bridge few details where win and Linux may differ * rust-launcher/src/property.rs: class to read generic properties file * rust-launcher/src/utils.rs: class for various utility methods. Including testing subclass 2018-09-04 Alex Kashchenko Fix cargo detection in autoconf * autoconf.ac: add missed check whether cargo was found in PATH 2018-08-13 Jiri Vanek * LICENSE: new file. Added explicit license with details 2018-06-20 Jiri Vanek Enhanced itw-settngs' certificate viewer to show what file is backing showed certificate store. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: adapted to refactoring of KeyStores * netx/net/sourceforge/jnlp/security/KeyStores.java: getKeyStore now returns wrapper with path alongside with ks itself * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: adapted to refactoring of KeyStores * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: now shows read-only path to shown ks 2018-06-20 Jiri Vanek * netx/net/sourceforge/jnlp/security/dialogs/CertsInfoPane.java: fixed hex output of certificate signature for jdk8 2018-06-20 Jiri Vanek Added semi support for recognition jdk10 and up * netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java: replaced hardcoded 9 by cycle from 9 to 99 * netx/net/sourceforge/jnlp/resources/Messages.properties: replaced jdk9 by jdk9 and up. 2018-05-28 Jiri Vanek added deployment property to enforce headfull execution * netx/net/sourceforge/jnlp/config/Defaults.java: IGNORE_HEADLESS_CHECK set to false * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: deployment.headless.ignore * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: if deployment.headless.ignore is true, then headless state is not checked and environment is always considered as headfull 2018-05-24 Jiri Vanek Made headless detection softer * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: JWindow().getOwner() repalced by GraphicsEnvironment.isHeadless() JWindow().getOwner() was failing on headfull systems after headless check itself, on NPE. 2018-05-14 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java: getDocumentBase now returns codeBase as fallback when documentBase is null. Oracle Applications R12, Oracle Forms Java Webstart application is requesting getDocumentBase where it shouldn't, however they refuse to modify their code and add ITW to supported platforms 2018-02-15 Jiri Vanek Build of rust lunchers moved to cargo * configure.ac: added check for cargo * .hgignore: added target and Cargo.lock * .Makefile.am: dropped all launcher.in/libhardoced_paths_*.rs targets and rustc targets. (launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor)) adapted to use cargo. Variables handled in switch. (clean) now cleans all launcher.in* * rust-launcher/Cargo.toml: primitive declaration of package * rust-launcher/src/hardcoded_paths.rs: copied from rust-launcher/hardoced_paths.rs.in adapted to get substitution via cargo rather then by sed. Added test and wrapping getters * rust-launcher/src/main.rs: copied from rust-launcher/launchers.rs. Adapted imports to new infrastructure,s till just reprinting hardcoded stuff 2018-02-06 Jiri Vanek Added test for javafx-desc * tests/reproducers/custom/JavaFx/resources/JavaFx.jar * tests/reproducers/custom/JavaFx/resources/JavaFx.jnlp * tests/reproducers/custom/JavaFx/srcs/Controller.class * tests/reproducers/custom/JavaFx/srcs/Controller.java * tests/reproducers/custom/JavaFx/srcs/Main.class * tests/reproducers/custom/JavaFx/srcs/Main.java * tests/reproducers/custom/JavaFx/srcs/Makefile * tests/reproducers/custom/JavaFx/srcs/helloworld.fxml * tests/reproducers/custom/JavaFx/testcases/JavaFxTest.java 2018-02-05 Jiri Vanek Fixed news for latest changes * NEWS: mentioned javafx-desc, -nosecurity enhancement and j2se/java resources 2018-02-05 Jiri Vanek Added basic support for javafx desc * netx/net/sourceforge/jnlp/ApplicationDesc.java: added flag fx to rember what was initiator * netx/net/sourceforge/jnlp/Node.java: Added abstraction ElementName over string of element name to hold namespace and separate it for name if present * netx/net/sourceforge/jnlp/Parser.java: for javafx-desc ApplicationDesc is instantiated. Adapted to ElementName * tests/netx/unit/net/sourceforge/jnlp/ParserCornerCases.java: ElementName * tests/netx/unit/net/sourceforge/jnlp/ParserTest.java: ElementName 2018-02-03 Jiri Vanek nosecurity switch made extendable also for certificate issues * netx/net/sourceforge/jnlp/config/Defaults.java: set deployment.security.itw.ignorecertissues * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: added deployment.security.itw.ignorecertissues * netx/net/sourceforge/jnlp/resources/Messages.properties: BONosecurity is now tailed by rumor about deployment.security.itw.ignorecertissues * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: when ITW was about to throw certificate-caused launch exception, it i snow consulted with nosecurity and deployment.security.itw.ignorecertissues. If both are here, exception is only printed 2018-02-03 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: autoformatted 2018-02-03 Jiri Vanek Made ITW to load resources from j2se/java tag too * netx/net/sourceforge/jnlp/Parser.java: constructors/methods made public to help unittests * netx/net/sourceforge/jnlp/ShortcutDesc.java: same * netx/net/sourceforge/jnlp/ResourcesDesc.java: getJars made to iterate recursively over content of j2se * tests/netx/unit/net/sourceforge/jnlp/ParserBasic.java: added testcase * tests/netx/unit/net/sourceforge/jnlp/jarsInJreDesc.jnlp: testfile copied form omegat which have this strange resources 2018-02-03 Jiri Vanek * netx/net/sourceforge/jnlp/Parser.java: auto-formatted 2017-12-11 Jiri Vanek * Makefile.am: preprocessing hardoced_paths.rs.in for each binary and creating libs * rust-launcher/launchers.rs: now uses new, future lib * rust-launcher/hardoced_paths.rs.in: source for all hardcoded libs we currently use 2017-12-08 Jiri Vanek Added possibility to turn off https preference via deployment properties * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java: if deployment.https.noenforce is true, then https variants are not smuggled into urlslist * netx/net/sourceforge/jnlp/config/Defaults.java: deployment.https.noenforce declared as false by default * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: added field of KEY_HTTPS_DONT_ENFORCE = "deployment.https.noenforce" 2017-11-02 Jiri Vanek Added linux binary dist target * Makefile.am: (uninstall-linux-only) fixed suffixes of removed lunchers added new target (linux-bin-dist) creating binary javaws static distribute-able image 2017-11-09 Jiri Vanek Fixed XDGspecificationTests to survive with shell scripts of .sh suffix * tests/reproducers/simple/simpletest1/testcases/XDGspecificationTests.java: now using system getItwebSettingsFile call * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: added getItwebSettingsFile and getIPolicyEditorFile methods to guess those binaries from javaws, as those can be now .sh or none suffix 2017-11-08 Alex Kashchenko Support creating cache files with restricted access on windows * netx/net/sourceforge/jnlp/util/FileUtils.java: set proper ACLs for cache files and directories * tests/netx/unit/net/sourceforge/jnlp/util/FileUtilsTest.java: added testCreateRestrictedFile test that checks ACLs for cache file 2017-11-02 Jiri Vanek Deprecated shell launchers, added skeleton for future rust launcher * Makefile.am: launchers and desktop files gathered to variable, filled according to configure iffed out deprecated shell launchers, added build stubs for rustc calls * configure.ac: added switch --enable-shell-launchers to enable build of legacy shell launchers. note, that when installed, those launchers will have .sh suffix added check for rustc - Mandatory without shell launchers, only optional with. * rust-launcher/launchers.rs: new, stub for native launchers * shell-launcher/launchers.bat.in: renamed from launcher/launchers.bat.in * shell-launcher/launchers.sh.in: renamed from launcher/launchers.in 2017-09-25 Jiri Vanek TomУЁХЁ Votava Authors made as links in html docs * netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java: isntanceof replaced by correct interface method * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/Formatter.java: added getAdressLink and replaceLtGtCharacters methods * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/HtmlFormatter.java: implemented newmethods. Added dummy antispam protection * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatter.java: dummy impl of new methods * tests/netx/unit/net/sourceforge/jnlp/util/docprovider/ReadAutorsTest.java: adapted 2017-09-14 Jiri Vanek TomУЁХЁ Votava PR3426 - ITW Docs do not have correct 'AUTHOR' field * AUTHORS: removed invalid space after one lt mark * Makefile: (generate-docs.stamp) added and used (where appropriate) path to src AUTHORS file. * netx/net/sourceforge/jnlp/resources/Messages.properties: added message for case, when no authors file specified on input. * netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java: implemented possibility to include authors file to documentation. * tests/netx/unit/net/sourceforge/jnlp/util/docprovider/ReadAutorsTest.java: tests for generator 2017-09-12 Fridrich Strba Set source language version for javadoc generation for jdk9 * Makefile.am: (JAVADOC_OPTS) if HAVE_JAVA9 then -source is appended with correct IT_LANGUAGE_SOURCE_VERSION number 2017-09-12 Fridrich Strba Get rid of X509Factory class usage * netx/net/sourceforge/jnlp/security/CertificateUtils.java: removed import and usage of X509Factory (replaced by hardcoded string). Still better then reflection. * configure.ac: removed check for sun.security.provider.X509Factory 2017-09-12 Fridrich Strba Plugin made work again with jdk9 * launcher/launchers.in: added exports for sun.applet * plugin/icedteanp/IcedTeaNPPlugin.cc: same 2017-07-20 Jiri Vanek Post-release changes * NEWS: added 1.8 section * configure.ac: (AC_INIT) bumped to 1.8pre 2017-07-20 Jiri Vanek * javaws.desktop.in: value type changed from %f (file) to %u (url) this helps jnlp protocol a lot, and should not harm older normal_file_path behavior 2017-07-19 Jiri Vanek Pre-release tuning * Makefile.am: (netx-html-gen.stamp) set number of changests to 236 (since 1.6) * NEWS: date of 1.7 set * configure.ac: (AC_INIT) set to use 1.7 2017-07-19 Jiri Vanek made usable with jdk9 again * acinclude.m4: IT_CHECK_FOR_CLASS removed no longer valid -Xmodule usage * launcher/launchers.in: made immune to missing plugin jar * netx/net/sourceforge/jnlp/jdk89acesses/SunMiscLauncher.java: moved to reflection, made javaws buildable under jdk9 2017-07-18 Jiri Vanek * netx/net/sourceforge/jnlp/security/dialogs/CertsInfoPane.java: HexEncoder loaded by reflection to allow smooth jdk8 x 9 transition. 2017-07-18 Jiri Vanek * launcher/launchers.in: added exports for javax.jnlp to hook jdk9 one more times 2017-07-13 Jiri Vanek Fixed issue, when some resources were not used, because of OS was reporting full name. Eg. "Windows 7" where just "windows" was expected * netx/net/sourceforge/jnlp/JNLPFile.java: (stringMatches) now compares only parts before first space (getResources) added brackets behind ifs * tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java: added test 2017-07-12 Jiri Vanek * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java: escaped windows path slash 2017-07-11 Jiri Vanek Alexandr Kolouch Added Czech translation for 1.7. * netx/net/sourceforge/jnlp/resources/Messages_cs.propertie: added missing properties, adapted changed ones. * tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java: added shift f2 to blacklisted items 2017-07-07 Jiri Vanek Fixed pr3417 * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: nested jars go into subdirectory instead alongside parent * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: test for the issue * tests/netx/unit/net/sourceforge/jnlp/runtime/pf.jar-orig: jar with nested name clash 2017-06-28 Jiri Vanek Tereza Hlavackova * javaws.png: adapted to new color schema (still work planned) * win-installer/greetings_banner.bmp: fixed small glitches * win-installer/icon.ico: made multisize 2017-16-15 Jiri Vanek Splash screen aligned with current graphic * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/SplinesDefs.java: leading points of main leaves regenerated from current graphics. Pushed generating algorithm. Cubic splines are no longer used, instead the exact polygon is filled. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java: adapted splinesDefs * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: iffed out NPE in midori * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainterTest.java: aligned * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/SplinesDefsTest.java: aligned 2017-06-15 Jiri Vanek Tereza Hlavackova More tuning of itw graphics. Now new splashscreen have to be done * netx/javaws_splash.png: adapted to new leaves * netx/net/sourceforge/jnlp/resources/itw_logo.png: same * netx/net/sourceforge/jnlp/resources/netx-icon.png: added frozen lines around to be less environment-settings vulnereable * win-installer/greetings_banner.bmp: aligned to more blue color schema * win-installer/icon.ico: adapted to frozen leaves * win-installer/top_banner.bmp: added a bit of ice 2017-06-08 Jiri Vanek Small alignment of icon usage * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: removed custom loading of netx.icon and replaced by standard call. * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: added usage of netx.icon 2017-06-07 Jiri Vanek Tereza Hlavackova Updated installer graphic, aligned first set of icons * AUTHORS: added Tereza * win-installer/icon.ico: designed new frontend ico * netx/net/sourceforge/jnlp/resources/netx-icon.png: aligned with ico.ico * win-installer/greetings_banner.bmp: redrawn (in style with ico.ico) * win-installer/top_banner.bmp: redrawn (in style with ico.ico) 2017-05-22 Jiri Vanek * netx/net/sourceforge/jnlp/resources/Messages.properties: TAGSOUPnotUsed got fixed key/value delimiter 2017-05-22 Juergen Hoffmann Jiri Vanek * netx/net/sourceforge/jnlp/resources/Messages.properties: fixed grammar in JREContinueDialogSentence2 and ALACAMatchingMainTitle keys 2017-05-22 Jiri Vanek Windows desktop path attempted to be handled correctly * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: adapted to new name * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: added windows desktop locating * tests/netx/unit/net/sourceforge/jnlp/util/XDesktopEntryTest.java: on windows excluded xdg tests. Added test for windows desktop 2017-05-22 Jiri Vanek TomУЁХЁ Votava Splash-screen text renderers adapted to different fonts on windows. It is miracle splash screen is working on windows... * AUTHORS: added Tom * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextOutlineRenderer.java: cutTo now returns rectangle in vain attempt to find center * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextWithWaterLevel.java: same * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/MovingTextTest.java: where possible, used relative measurements. hardcoded if values otherwise * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextOutlineRendererTest.java: same * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextWithWaterLevelTest.java: same 2017-05-22 Jiri Vanek TomУЁХЁ Votava * tests/netx/unit/net/sourceforge/jnlp/util/replacements/BASE64DecoderTest.java: enhanced for windows new lines * tests/netx/unit/net/sourceforge/jnlp/util/replacements/BASE64EncoderTest.java: same 2017-05-19 Jiri Vanek Alex Kashchenko added support for reading java home from regsitry * launcher/launchers.bat.in: registry support(Alex), fixed issue with ITW_WIN_SPECIALS, fixed issue with returnvlaue, user-in-file java path proffered over all. 2017-12-19 Alex Kashchenko Aligned msi and netx icons * netx/net/sourceforge/jnlp/resources/netx-icon.png: redrawn * win-installer/icon.ico: redrawn 2017-05-18 Jiri Vanek TomУЁХЁ Votava * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextWithWaterLevelTest.java: cutToTest get rid of hardcoded siezes, ad follows relative placement of testing points (used font is different on windows) 2017-05-18 Jiri Vanek TomУЁХЁ Votava * tests/netx/unit/net/sourceforge/jnlp/util/logging/TeeOutputStreamTest.java: testPrint and testWriteByteArrayString made dual for linux and windows. Those tests are charset specific. testWriteByteArrayString2 is new test, showing strange issue when strange characters are going into and from byte array. On windows, this test fails, showing, that somewhere in the stack, there is bad encoding or bad offset/lenght used. 2017-05-18 Jiri Vanek TomУЁХЁ Votava * tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/FormatterTest.java: regular expression of testXNewLinesPlain adapted to match both win and linux line endings 2017-05-15 Jiri Vanek Installer graphic made a bit more ITWized * win-installer/greetings_banner.bmp: added semi-transparent logo * win-installer/top_banner.bmp: same 2017-12-10 Jiri Vanek * Makefile.am: installer renamed to itw-installer.msi, relative paths in json.in sedded to absolute ones to allow build in different build dir. 2017-12-10 Alex Kashchenko Jiri Vanek * launcher/launchers.bat.in: added pause to the end of the script to allow reading of messages if launched out of prompt. 2017-12-10 Alex Kashchenko Made jnlp protocol work in msi * win-installer/installer.json.in: "name": "TODO_DEFAULT", replaced by "name": "". Needs wixgen 1.3 https://github.com/akashche/wixgen/releases/tag/1.3 2017-12-10 Alex Kashchenko Jiri Vanek Used absolute dirs, win installer work done in special folder, better WiX detection, win installer clean * Makefile.am: introduced WIN_INSTALLER_DIR putting win-installer.build to abs build dir introduced WIN_INSTALLER_SRC_DIR to put win-installer to abs src dir. clean-win-installer, new target, cleaning installer. installer.json and win-installer targets now using correct path macros. All work done done in special dir * acinclude.m4: WIX_TOOLSET_DIR is now striped only once, so it wrks well for both bin(msi) and no bin(zip) WiX isntallations * configure.ac: wixgen.jar added more defaults to try * win-installer/installer.json.in: adapted to work in different subdirectory (hot candidate for sed) 2017-12-10 Alex Kashchenko Jiri Vanek Michal Vala Added support for MSI generation * AUTHORS: added Michal and Alex * Makefile.am: added win-installer target. For now missing clean * acinclude.m4: all search macros enhanced for cygpath on windows, java read from path (if available, windows only), added IT_CHECK_FOR_WIX macro * configure.ac: added checks for wixgen.jar and WiX tools * win-installer/LICENSE.rtf: new file, license for MSI to display. generated from COPYING * win-installer/greetings_banner.bmp: new file, main banner for MSI * win-installer/icon.ico: new file, icon for MSI * win-installer/top_banner.bmp: new file, banner for MSI * win-installer/installer.json.in: MSI descriptor, hart beat of whole MSI archive generator. Needs a lot of sedding 2017-12-10 Jiri Vanek * Makefile.am: (install-exec-local) completion files installed last 2017-05-11 Jiri Vanek * launcher/launchers.bat.in: hardcoded Xnofork, as it is necessary anyway 2017-05-11 Jiri Vanek fixed windows headless detection problems * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: as (mostly) first initialized class on windows, enforced headless check and initialized logging. This is WORKAROUND and shoudl get FIXED. There is strange behavior in AWT windows impelmentation, which is causing awt queue to get corrupted when called from "bad" thread. This hack is enforcing to be called from "correct" thread. This is likely bug in JDK and have to be investigated. Btw see patch from 2017.04.10 about awt hooks. That is same issue. 2017-05-11 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/Boot.java: processing of -about adapted to correct headless check 2017-05-11 Jiri Vanek * Makefile: (clean-launchers) added removal of win launchers (if windows) 2017-05-11 Jiri Vanek * netx/net/sourceforge/jnlp/util/logging/FileLog.java: on windows, name of logs do not contain colons, path is printed to console 2017-05-10 Jiri Vanek Added support for pure windows image and distribute-able windows-bin-dist archive * NEWS: mentioned windows support, jdk9 support limited for linux * Makefile.am: (install-exec-local) make of win-deps dirs made -p, to allow re-installing without error. (uninstall-linux-only) new target. Cleans linux-specific stuff. (uninstall-local) now depends on, uninstall-linux-only. Removed code which moved to it. (remove-empty-linux-only-dirs) target to remove various empty directories in dist folder (win-only-image) windows only target. by calling remove-empty-linux-only-dirs and copying bit more stuff, creating clean windows-only image. (win-bin-dist) last new target, compressing pure windows image to redistributable zip. Note that this patch was not tested in windows, but was designed to not harm linux parts. Fixes expected. 2017-05-10 Jiri Vanek * AUTHORS: added Ville SkyttУЄ 2017-05-10 Jiri Vanek Ville SkyttУЄ PR3366 - Split bash completion to (three) files per binary (4./4) * NEWS: mentioned configure-ability and split to three * icedteaweb-completion.in: removed (split to three following files) * completion/itweb-settings.bash.in: new file, extracted from icedteaweb-completion.in individual @@ replace identifiers replaced by OPTIONS * completion/javaws.bash.in: same * completion/policyeditor.bash.in: same * Makefile: EXTRA_DIST now lists completion dir instead of icedteaweb-completion.in file (install-exec-local) installs three new files instead of old one. (uninstall-local) same with removal. (TOP_BUILD_DIR/completion/itweb-settings.bash) split to three targets accordingly. (clean-icedteaweb-completion) as uninstall. 2017-05-10 Jiri Vanek Ville SkyttУЄ PR3366 - Install bash completion to configured dynamic load location (3/4) * Makefile.am: BASH_CMPL_DEST_DIR subsituted from bashcompdir * configure.ac: added PKG_CHECK_VAR on bashcompdir and bash-completion 2017-05-04 Jiri Vanek * Makefile: (stamps/run-netx-unit-tests.stamp) variable CLASSPATH's content and its usage on with Xbootclasspath put to quotes, to run junits in cygwin. Note, that this issue is spread on all usages of raw call to joinsegments and its results. Will be fixed on demand. 2017-05-04 Jiri Vanek * Makefile: (install-data-local) when copying to WIN_RUN_DEPS, the name of resource is stripped to be versionless 2017-05-04 Jiri Vanek Adam Buchta sanitizing of paths made windows friendly * netx/net/sourceforge/jnlp/util/FileUtils.java: (INVALID_CHARS) replaced by INVALID_PATH for filtering paths, and INVALID_NAME, based on INVALID_PATH with slashes, for filtering chars form name. (sanitizePath) and (sanitizeFileName) rewrote to use adequate list, and get rid of unreliable separator - windows can have both. In addition. (sanitizePath) enhanced to deal with absolute X:\ windows path and keep filtering any other colons. * tests/netx/unit/net/sourceforge/jnlp/util/FileUtilsTest.java: test adapted to new logic. Added tests for new cases,added tests for some cornercases 2017-05-03 Jiri Vanek * javaws.desktop.in: added x-scheme-handler/jnlp;x-scheme-handler/jnlps 2017-05-02 Adam Buchta Jiri Vanek * AUTHORS: added Adam Buchta to authors * netx/net/sourceforge/jnlp/browser/FirefoxPreferencesFinder.java (find) for windows, using different path firefox profile 2017-05-02 Jiri Vanek * launcher/launchers.bat.in: added INST_ITW_HOME=%~dp0/../ as default location for windows CP search 2017-04-28 Jiri Vanek Added and installed windows.bat launchers * Makefile.am: added set of target, if windows, creating and installing .bat launchers from bat.in * launcher/launchers.bat.in: new file, bat launcher skeleton 2017-04-28 Jiri Vanek * Makefile.am: removed quoting about UNIFIED_BOOTCLASSPATH in LAUNCHER_BOOTCLASSPATH to get more freedom. Intentionallynot added quoting about LAUNCHER_BOOTCLASSPATH in run-reproducers-test-code-coverage-jacoco.stamp, as imho their sed was error passing just by luck * launcher/launchers.in: in consequence, added quotes about @LAUNCHER_BOOTCLASSPATH@ 2017-04-28 Jiri Vanek Hopefully fixed codecoverage, which failed with 8u131 update * Makefile.am: JACOCO_ADVANCED_EXCLUDE added javax.swing.* 2017-04-27 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/JNLPPolicy.java: all win-slashes replaced by linux-slashes before uri is created 2017-04-27 Jiri Vanek * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: .old properties file removed before original is renamed. On windows, rewriting was not working 2017-04-26 Jiri Vanek * Makefile.am: (composeclasspath) is now quoting its result. Needed for some cygwin build and praying not destroying everything. 2017-04-26 Jiri Vanek jars used during windows build are now saved to distribution image * Makefile.am: (printvars) new target to print out all used variables (printvarsfile) new target to save all variables to file. Those is only way I found to extract jars from configure in without manual enumeration. (uninstall-local) on windows, removes copied dependence. (install-data-local) on windows, copy all used jars. Some selected jars are duplicated in runtime dependeces 2017-04-26 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/Boot.java: added support for jnlp:other_protocol:// handlig * tests/netx/unit/net/sourceforge/jnlp/runtime/BootTest.java: added unitt tests for various jnlp protocol cases 2017-04-25 Jiri Vanek * tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java: added tests for jnlp protocol * tests/reproducers/simple/simpletest1/testcases/SimpleTest1Test.java: added tests for jnlp protocol 2017-04-25 Jiri Vanek * Makefile.am: cp -a got extracted -a switch to variable, disabled on win, which may fail on certain combinations ow wndows x cygwin. 2017-04-25 Jiri Vanek * html-gen.sh: fixed case for some cygwin versions, when changelog html generation could end in endless loop. 2017-04-24 Jiri Vanek javaws made to understand jnlp "network protokol" * NEWS: mentioned jnlp protocol * netx/net/sourceforge/jnlp/runtime/Boot.java: when main or jnlp argument starts with jnlp(s): then it is substituted by http(s) 2017-04-24 Jiri Vanek * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java: https preffered over http 2017-04-24 Jiri Vanek fixed PR3365 * icedteaweb-completion.in: _itweb-settings renamed to _itwebsettings 2017-04-11 Michal Vala Jiri Vanek * .Makefile.am: on windows, replace prefix by its cygwin path 2017-04-10 Michal Vala Jiri Vanek fixed quoting wrongly interpreted by cigwin * Makefile.am: LAUNCHER_BOOTCLASSPATH now using ' instead of " 2017-04-10 Jiri Vanek Reproduced issue PR3351 * tests/reproducers/signed/Kemtrakpro/resources/Kemtrak_javaws.jnlp: jnlp file to test also javaws (next to applet) behavior * tests/reproducers/signed/Kemtrakpro/srcs/Kemtrak.java: added code to reproduce issue * tests/reproducers/signed/Kemtrakpro/testcases/KemtrakTests.java: added testcases for applet to close jar and try to load class again. added same testcases for javaws. Added testcase for plain java run to prove underlying jdk is not guilty * tests/reproducers/signed/jcalendar/srcs/jcalendar.java: small modification to add distinguish call inside. 2017-04-10 Jiri Vanek better handling of WEmbeddedFrame/XEmbeddedFrame * configure.ac: IT_CHECK_FOR_CLASS removed NonFatal support check for WEmbeddedFrame/XEmbeddedFrame done by windows/linux recognition removed checks on SUN_AWT_X11_XEMBEDDEDFRAME and SUN_AWT_WEMBEDDEDFRAME * Makefile.am: sed in PluginAppletViewer.java conditioned by WINDOWS variable isntead of SUN_AWT_WEMBEDDEDFRAME one 2017-04-10 Michal Vala Jiri Vanek made fully buildable (java) on windows * Makefile.am: on windows used ";" as cp separator on win, TOP_BUILD_DIR and expanded to win paths. macros TOP_BUILD_DIR and TOP_SRC_DIR used constantly over abs_top_builddir and abs_top_srcdir * configure.ac: added win/linux recognition based on autotools standard approaches 2017-04-10 Jiri Vanek On windows, shutdown hook added like we do, via lazy initiated OutputController (which may be swing/awt hidden call (not verified)) causes exception "can't add shutdown hook, shutdown already in progress" * netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java: (main) enforced headless mode, to prevent itw debug console from showing. 2017-04-06 Jiri Vanek Reproduce and fixed pr3350. * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: (showMatchingALACAttributePanel) defensive NPE check for document base * netx/net/sourceforge/jnlp/util/UrlUtils.java: (setOfUrlsToHtmlList) defensive NPE check * tests/reproducers/signed/Kemtrakpro/resources/Kemtrak.jnlp: exact jnlp from pr3350 bug report * tests/reproducers/signed/Kemtrakpro/srcs/Kemtrak.java: dummy main jar * tests/reproducers/signed/Kemtrakpro/srcs/META-INF/MANIFEST.MF: exact manifest from pr3350 * tests/reproducers/signed/jcalendar/srcs/jcalendar.java:dummy dependence of Kemtrak * tests/reproducers/signed/Kemtrakpro/testcases/KemtrakTests.java: simple launch of jnlp. This test is hitting the issue. Headless dialogue used. 2017-04-06 Jiri Vanek * Makefile.am: for windows build, sed PluginAppletViewer's super call 2017-04-05 Jiri Vanek plugin.jar made buildable on windows * Makefile.am: (liveconnect-source-files.txt) added sed to source code to use WEmbeddedFrame on windows (based on SUN_AWT_WEMBEDDEDFRAME value) * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: added warning that base class name is sedded * acinclude.m4: IT_CHECK_FOR_CLASS got new parameter. If its value is NonFatal, then its absence is only warning * configure.ac: IT_CHECK_FOR_CLASS SUN_AWT_X11_XEMBEDDEDFRAME made NonFatal, added similar check for SUN_AWT_WEMBEDDEDFRAME. Added checks that exactly one of them exists, otherwise error 2017-04-05 Jiri Vanek Split ENABLE_PLUGIN to ENABLE_NATIVE_PLUGIN and ENABLE_PLUGINJAR to allow build of plugin.jar and jsobject.jar without native plugin. Doing so, javaws -html may end on plugin-less system. --disable-plugin replaced by --disable-native_plugin and --disable-plugin.jar * configure.ac: added check, that native_plugin can not be built without pluginjar * acinclude.m4: IT_CHECK_PLUGIN and comp. changed to IT_CHECK_NATIVE_PLUGIN and likewise. Added IT_CHECK_PLUGINJAR to allow user enable/disable plugin completely. * Makefile.am: following configure changes, ENABLE_PLUGIN renamed/split to ENABLE_NATIVE_PLUGIN and ENABLE_PLUGINJAR all testsuites keep running with --disable-native_plugin. Not so with disabled plugin completely 2017-04-05 Jiri Vanek * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: (AccessWarningPaneComplexReturn) fixed javadoc warning 2017-01-13 Jiri Vanek Basic certificate got command line saving support * netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java: if dialog is CertWarningPane and should be remembered, is. * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: extracted saving method, so it can be reused 2017-01-11 Jiri Vanek * icedteaweb-completion.in: improved to suggest also files in relevant cases 2017-01-04 Jiri Vanek Fixed bash completion generation * Makefile.am: (icedteaweb-completion) now depends on stamps/netx.stamp 2017-01-04 Jiri Vanek Added signed reproducer for nashorn and applets * tests/reproducers/signed/jsengineSigned/resources/jsengineAppletSigned.html: * tests/reproducers/signed/jsengineSigned/resources/jsengineAppletSigned.jnlp: * tests/reproducers/signed/jsengineSigned/srcs/jsengineAppletSigned.java: * tests/reproducers/signed/jsengineSigned/testcases/jsengineSignedTest.java: * tests/reproducers/simple/jsengine/srcs/jsengineApplet.java: 2017-01-04 Jiri Vanek applets got javafx and nashorn support too * plugin/icedteanp/IcedTeaNPPlugin.cc: added default locations of appletviewer_default_jfxrtjar and appletviewer_default_nashonrjar. Added methods get_plugin_jfx_jar and get_plugin_nashorn_jar to get dynamically resolved nashorn/javafx (command_line.push_back) for jdk8, on classapth added javafx, for jdk9 added classpath attribute with javafx (unknown behavior), for both jdks appended nashorn.jar to bootclassapth * tests/reproducers/simple/jsengine/resources/jsengineApplet.html: testcase html * tests/reproducers/simple/jsengine/testcases/jsengineTest.java: added test for apelt in html 2017-01-04 Jiri Vanek Added test for javaws-applet and nashorn * tests/reproducers/simple/jsengine/resources/jsengineApplet.jnlp: new file, aplet definition * tests/reproducers/simple/jsengine/srcs/jsengineApplet.java: new file, applet impelmentation * tests/reproducers/simple/jsengine/testcases/jsengineTest.java: added test calling jsengineApplet.jnlp 2017-01-04 Jiri Vanek Fixed reproducers code coverage after plugin+jdk9 changeset * Makefile.am: (COVERABLE_PLUGIN_DIR) added sets for new -DNETX_JAR, -DPLUGIN_JAR and -DJSOBJECT_JAR 2017-01-04 Jiri Vanek When system desktop integration directory do not exists, do not die. * netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/JListUtils.java: workarounded NPE when listFiles was invoked on non-existing dir, and so returned null instead of empty array. 2017-01-04 Jiri Vanek * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: "can not open" dialog do not show when policy file simply do not exists. 2016-12-16 Jiri Vanek Nashorn made accessible to javaws applications * NEWS: mentioned PR3263 * launcher/launchers.in: added nashorn to BOOT_CLASSPATH * tests/reproducers/signed/jsengineSigned/: reproducer of behavior * tests/reproducers/simple/jsengine/: for completeness, added signed reproducer of behavior 2016-11-21 Jiri Vanek internal browser extended for trivial charset selection * netx/net/sourceforge/jnlp/runtime/html/browser/HtmlBrowserPanel.java: Added combobox with all currently known java standard charsets. (load) if this combobox value is selected, then given encoding is used to read the page. If not, then default is used as before. * netx/net/sourceforge/jnlp/util/UrlUtils.java: (loadUrlWithInvalidHeader) overloaded with optional charset argument. Default kept on US_ASCII (loadUrl) overloaded with optional charset argument Default kept on UTF_8 * tests/reproducers/simple/Http511/testcases/Http511Test.java: (http511AuthRequired_jnlpOneFirstAuthorisedServerServerResourceAnother511Server) "fixed". by putting more input before final SKIP to cause delay allowing external logging to success. 2016-11-21 Jiri Vanek AbsolutePathsAndQueryStrings reproducer adapted to port in cache path * tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java: (testCaching) exemplar urls now uses server's port instead of random and hardcoded 1234 2016-11-18 Jiri Vanek * netx/net/sourceforge/jnlp/Launcher.java: (createApplet) call to setContextClassLoaderForAllThreads moved to earlier stage to allow Thread.currentThread().getContextClassLoader(). call in early stages of constructions. * tests/reproducers/signed/LoadResources/resources/LoadResources1.jnlp: jnlp for javaws reproducer in default package * tests/reproducers/signed/LoadResources/resources/LoadResources2.jnlp: jnlp for javaws reproducer in some.pkg package * tests/reproducers/signed/LoadResources/resources/LoadResourcesApplet1.jnlp: jnlp for applet reproducer in default package * tests/reproducers/signed/LoadResources/resources/LoadResourcesApplet2.jnlp: jnlp for applet reproducer in some.pkg package * tests/reproducers/signed/LoadResources/srcs/LoadResources.java: reproducer in default package calling various getClassLoader * tests/reproducers/signed/LoadResources/srcs/LoadResourcesPackaged.java: reproducer in some.pkg package calling various getClassLoader * tests/reproducers/signed/LoadResources/srcs/some.file: testabel resource * tests/reproducers/signed/LoadResources/testcases/LoadResourcesTest.java: testcase of reproducer * NEWS: mentioned PR2968 2016-11-14 Jiri Vanek Fixed PR3227. When filename in cache is to long, it is saved under its hash. * NEWS: mentioned PR3227 * netx/net/sourceforge/jnlp/cache/CacheUtil.java: when resulting filename is longer then 255, then it is saved under its name hash. * tests/netx/unit/net/sourceforge/jnlp/cache/CacheUtilTest.java: added tests for urls with filenames longer then 255 chars. 2016-11-14 Jiri Vanek If port is specified in URL, it is used in cache. * NEWS: mentioned PR1190 * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (urlToPath) por, if used, included in path of cached resource. * tests/netx/unit/net/sourceforge/jnlp/cache/CacheUtilTest.java: added test (testUrlToPathWithPort) to to check port. 2016-11-14 Jiri Vanek Exception from closing silent connection printed out only in debug mode. It was spamming FileNotFound exception even if the file was later found on different(valid) url * netx/net/sourceforge/jnlp/util/HttpUtils.java: (consumeAndCloseConnectionSilently) exception printed only in debug mode 2016-11-08 Jiri Vanek Fixed PR3198. ITW now tries direct socket connection when it met invalid http header by java impl. * netx/net/sourceforge/jnlp/cache/ResourceDownloader.java: (downloadFile) when Invalid Http response exception is encountered, direct socket connection is tried before giving up * netx/net/sourceforge/jnlp/util/UrlUtils.java: new method of loadUrlWithInvalidHeaderBytes introduced. Based on loadUrlWithInvalidHeader, just slower in reading header, and returns header as string and body as byte[]. New method getRemainingBytes introduced to read remaining byte[] from originally char-processed stream. * NEWS: mentioned PR3198 2016-11-08 Jiri Vanek Fixed behavior of JarIndexAccess to better copy original JarIndex usage * netx/net/sourceforge/jnlp/jdk89acesses/JarIndexAccess.java: (JarIndexAccess)if parent is attempted to be null, object is not created (JarIndexAccess) if result of method invoking is null, null is returned rather then JarIndexAccess with null parent. Note - this error successfully fixed PR2219 (see NoClassDeff reproducer) but still it looks as bad idea to wrap/replace ClassNotFound error/exception by different exception. 2016-11-04 Jiri Vanek Plugin made run on jdk9 * .Makefile: ($(PLUGIN_DIR)/%.o) and (stamps/cpp-unit-tests-compile.stamp) got setters for -DNETX_JAR, -DPLUGIN_JAR and -DJSOBJECT_JAR * configure.ac: added cehck for sun.net.www.protocol.http.Handler * launcher/launchers.in: wrong reads for java.desktop (java.desktop) fixed to java.naming. Added exports for java.base/sun.net.www.protocol.http to ALL-UNAMED,java.desktop. * netx/net/sourceforge/jnlp/jdk89acesses/JarIndexAccess.java: fixed type of JarFile - from wrong in sourceforge, to correct in java.util.jar * plugin/icedteanp/IcedTeaNPPlugin.cc: added plugin_get_java_version which, by spawning java process determine java version it wonts to be launching. (plugin_start_appletviewer) based on javaVersion adds patch-module, add-reads, add-exports if jdk9 is detected. rt.jar is now added only for jdk8. (NP_Initialize) sets javaVersion by calling plugin_get_java_version 2016-11-03 Jiri Vanek javaws -html made run under jdk9 (if compiled by jdk8) * .Makefile: (stamps/liveconnect-dist.stamp)(install-exec-local) plugin jar split to plugin.jar (sun package) and jsobject.jar (nescape package) so each can be patched into different module * launcher/launchers.in: all add-exports and add-reads now adds to java.desktop too (next to ALL-UNNAMED). plugin.jar and netx.jar patched into java.desktop. jsobject.jar patched into jdk.jsobject 2016-11-01 Jiri Vanek javaws made run under jdk9 (if compiled by jdk8) * configure.ac: added check for sun.security.action.GetPropertyAction * launcher/launchers.in: added check for jdk9 and if jdk9 detected, added many modules-related access-allowing switches. * netx/net/sourceforge/jnlp/jdk89acesses/JarIndexAccess.java: helping class allowing access to JarIndex for both jdk9 and jdk8 packages locations * netx/net/sourceforge/jnlp/jdk89acesses/SunMiscLauncher.java: similar for sun.misc.Launcher. Used as used in jdk8, but in jdk9, where is missing is used BootClassLoader instead. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Using JarIndexAccess instead of JarInde * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java: Using SunMiscLauncher isntead of sun.misc.Launcher * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/MoreInfoPane.java: same * netx/net/sourceforge/jnlp/util/ScreenFinder.java: Added catch for IllegalArgumentException - jdk9 is newly smuggling [0,0] size window under some conditions causing this to be thrown 2016-10-26 Jiri Vanek Configure made more JDK9 friendly * acinclude.m4: (IT_CHECK_FOR_CLASS) added support for modules, including support for access to private parts of module system removed IT_CHECK_FOR_HEXDUMPENCODER as jdk8/9 separation is done elsewhere anyway * configure.ac: IT_CHECK_FOR_HEXDUMPENCODER replaced by corresponding IT_CHECK_FOR_CLASS. All IT_CHECK_FOR_CLASS got corresponding module param. Module variables filled for jdk9, empty otherwise. Added checks for sun.misc.JarIndex (jdk8,9) and sun.misc.Launcher (jdk8 only, 9 have comment.. and troubles) 2016-10-25 Jiri Vanek JDialog removed as main keeper of information in SecurityDialog class * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java: If headless, is printing downloading message to console * netx/net/sourceforge/jnlp/resources/Messages.properties: Added key HEADLESS_MISSCONFIGURED warning user that he do not have X * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: checkHeadless made lazy in first call to isHeadless * netx/net/sourceforge/jnlp/security/SecurityDialog.java: no longer Extends JDialog, instead have member ViwableDialog. All calls to former extensions of JDialog changed to this viwableDialog * netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java: All calls to former JDialog changed to viwableDialog * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: same * netx/net/sourceforge/jnlp/security/dialogresults/SetValueHandler.java: same * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/InetSecurity511Panel.java: same * netx/net/sourceforge/jnlp/security/dialogs/MissingALACAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/MissingPermissionsAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/MoreInfoPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/PasswordAuthenticationPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/MatchingALACAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberDialog.java: Search now contains check for itself, as input is not dialog, but security panel * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: made better accepting headless state * netx/net/sourceforge/jnlp/security/dialogs/ViwableDialog.java: New class. Instead of applying all sets to jdialog itself, those are saved, and applied just before cration of the dialog itself. 2016-10-17 Jiri Vanek Workarounded to pass configure checks on jdk9 to debug build failures themselves * acinclude.m4: (IT_CHECK_FOR_CLASS) changed to accept third parameter - package where to make check in, as not all checks needs to be doen in sun.applet. (IT_CHECK_FOR_HEXDUMPENCODER) test moved out of sun.applet too. * configure.ac: IT_CHECK_FOR_CLASS adapted to third parameter, various classes which are private in jdk9 moved out from configure check. This s not permanent solution, those classes will be deal with. 2016-10-14 Jiri Vanek * NEWS: mentioned rememberable dialogues editor and jdk8 2016-10-14 Jiri Vanek Enforced JDK8 or better for runtime and compile * Makefile.am: IT_LANGUAGE_SOURCE_VERSION, IT_CLASS_TARGET_VERSION) bumped to 8 * acinclude.m4: (IT_CHECK_JAVA_VERSION) modified to accept jdk9. Simplified. (IT_CHECK_FOR_JDK) changed directories to search for JDK, notably adding alternatives-defined JDK9 locations. * plugin/icedteanp/IcedTeaNPPlugin.cc: added records for version=1.8 * netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java: jvm recognition made java9 aware * netx/net/sourceforge/jnlp/resources/Messages.properties: added corresponding messages 2016-10-13 Jiri Vanek Finished implementation of editor of state of remembered dialogues * netx/net/sourceforge/jnlp/SecurityDesc.java: small fix - not enforcing array on input of method expecting ... type * netx/net/sourceforge/jnlp/controlpanel/ClassFinder.java: do not count interfaces as valid members * netx/net/sourceforge/jnlp/controlpanel/RemmeberableDialogueEditor.java: implemented missing code for Expert edit button and for combobox selection. Implemented save and close and close and cancel buttons. * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java: highlighted some copying whew one would expect instance * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: gui creation moved to separate method, implemented reactions on RemmeberableDialogueEditor * netx/net/sourceforge/jnlp/resources/Messages.properties: added EPE group for RemmeberableDialogueEditor * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java: highlighted some copying whew one would expect instance * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java: made deamon * tests/netx/unit/net/sourceforge/jnlp/controlpanel/ClassFinderTest.java: adapted to ignorance of interface 2016-03-15 Jiri Vanek * NEWS: mentioned PR2855 2016-03-15 James Le Cuirot * README: removed libX11 and zlib-devel from requirement * configure.ac: removed check on zlib and on Xlibs 2016-03-08 Jiri Vanek Added support for http 511 authentication As side effect added -browser switch, which enables internal browser as standalone window * NEWS: mentioned PR878, mentioned -browser switch * netx/net/sourceforge/jnlp/OptionsDefinitions.java: added BROWSER to represent -browser switch * netx/net/sourceforge/jnlp/cache/ResourceDownloader.java: when 511 is encountered, show511Dialogue is called and dialog shown * netx/net/sourceforge/jnlp/resources/Messages.properties: added resource regarding to integrated browser and http 511 dialog messages * netx/net/sourceforge/jnlp/runtime/Boot.java: added reaction to -browser; refactored * netx/net/sourceforge/jnlp/runtime/html/browser/DocumentChangededListener.java: new file, used to notify LinksPannel that Browser changed * netx/net/sourceforge/jnlp/runtime/html/browser/HtmlBrowserPanel.java: dummy implementation of browser based on jeditorpane, to resolve http 511 messages and forms * netx/net/sourceforge/jnlp/runtime/html/browser/LinkingBrowser.java: connected dualpane for Browser and LinksPanel. * netx/net/sourceforge/jnlp/runtime/html/browser/LinksPanel.java: primarily for headless dialogues, extracts links from http communication and prints them out. In Xfull mode allows user to quickly browse out to real browser to resolve http 511 * netx/net/sourceforge/jnlp/security/SecurityDialog.java: add http 511 invocation * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: same and reformatted. * netx/net/sourceforge/jnlp/security/dialogresults/BasicDialogValue.java: added SKIP result. * netx/net/sourceforge/jnlp/security/dialogresults/YesCancel.java: constructor made protected to allow inheritance * netx/net/sourceforge/jnlp/security/dialogresults/YesCancelSkip.java: extension of YES CANCEL by SKIP * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: button made final * netx/net/sourceforge/jnlp/security/dialogs/InetSecurity511Panel.java: security dialog based on LinkingBrowser * netx/net/sourceforge/jnlp/security/dialogs/SecurityDialogPanel.java: removed unused import * netx/net/sourceforge/jnlp/util/UrlUtils.java: added loadUrl and loadUrlWithInvalidHeader to load content of url negotination. First for URLconection, second for Socket connection * tests/reproducers/simple/Http511/testcases/Http511Test.java: huge reproducer for various http 511 cases * tests/reproducers/simple/Http511/resources/Http511.html: * tests/reproducers/simple/Http511/resources/Http511.jnlp: * tests/reproducers/simple/Http511/resources/Http511_applet.jnlp: * tests/reproducers/simple/Http511/resources/Http511_href.html: * tests/reproducers/simple/Http511/srcs/Http511.java: * tests/test-extensions/net/sourceforge/jnlp/Authentication511Requester.java: interface to summary necessary methods for http 511 authentification * tests/test-extensions/net/sourceforge/jnlp/ClosingListener.java: assasin made accessible * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java: kill -9 again enabled on demand * tests/test-extensions/net/sourceforge/jnlp/ServerLauncher.java: now implements Authentication511Requester * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: can set and use Authentication511Requester * tests/test-extensions/net/sourceforge/jnlp/tools/WaitingForStringProcess.java: output made final 2016-02-02 Jiri Vanek maven artifacts version substituted to contains only major version * .Makefile: ($(abs_top_builddir)/metadata) version stripped by everything behind second number 2016-01-28 Matthias Klose Jiri Vanek * Makefile: (stamps/generate-docs.stamp) added quotes around HTML_DOCS_INDEX 2016-01-26 Jiri Vanek Messages for Invalid JDK dialog improved a bit. * netx/net/sourceforge/jnlp/resources/Messages.properties: * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: * netx/net/sourceforge/jnlp/resources/Messages_de.properties: * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: 2016-01-26 Jiri Vanek Revisited some jnlp_href tests. * tests/reproducers/signed/ClasspathManifestTest/testcases/ClasspathManifestTest.java: explained why localtests on "." are passing (removed KnownToFail) and added (correctly failing) tests in various dirs * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedMatching.java: used diamond * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedNotMatching.java: same * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntryUnsignedMatching.java: same * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntryUnsignedNotMatching.java: same * tests/reproducers/simple/SingleInstanceServiceTest/testcases/SingleInstanceTest.java: fixed midori incompatible tests 2016-01-25 Jiri Vanek Fixed various cosmetic NPEs when codebase is null (+tests) * NEWS: mentioned PR2489 * netx/net/sourceforge/jnlp/JNLPFile.java: added method getNotNullProbalbeCodeBase workaround cases when codebase is null (for various output reasons) * netx/net/sourceforge/jnlp/PluginBridge.java: using getNotNullProbalbeCodeBase when fixing codebase during generation of jnlp stub. * netx/net/sourceforge/jnlp/SecurityDesc.java: same for generating uri for policies record * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (manageExternalJars) same for ref string comparsion * netx/net/sourceforge/jnlp/security/SecurityDialog.java: same for visible form of codebase * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: same * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/util/UrlUtils.java: (normalizeUrlAndStripParams) and (removeFileName) when input is null, return null. * tests/junit-runner/JunitLikeXmlOutputListener.java: now supports hg commits * tests/reproducers/signed/CodebasesAttsSigned/srcs/CodebasesAttsSigned.java: test printing "hardocded" id and paramet to know jar and calling jnlp/html source * tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSigned.html.in: resouirce capable of substitue id param, codebase, jar and htmlHref * tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSignedApp.jnlp.in: same * tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSignedApplet.jnlp.in: same * tests/reproducers/signed/CodebasesAttsSigned/resources/CodebasesAttsSignedJnlpHref.html.in: same * tests/reproducers/signed/CodebasesAttsSigned/testcases/CodebasesAttsSignedDialogsTest1.java: Test testing various dialogues of signed app. Including tests for corrupted signature * tests/reproducers/simple/CodebasesAtts/srcs/CodebasesAtts.java: same as CodebasesAttsSigned but not signed * tests/reproducers/simple/CodebasesAtts/resources/CodebasesAtts.html.in: same as signed ones * tests/reproducers/simple/CodebasesAtts/resources/CodebasesAttsApp.jnlp.in: same * tests/reproducers/simple/CodebasesAtts/resources/CodebasesAttsApplet.jnlp.in: same * tests/reproducers/simple/CodebasesAtts/resources/CodebasesAttsJnlpHref.html.in: same * tests/reproducers/simple/CodebasesAtts/testcases/CodebasesAttsDialogsTest1.java: same * tests/reproducers/simple/CodebasesAtts/testcases/CodebasesAttsNoDialogsTest1.java: * tests/reproducers/simple/CodebasesAtts/testcases/CodebasesAttsNoDialogsTest2.java: * tests/reproducers/simple/CodebasesAtts/testcases/CodebasesAttsNoDialogsTest3.java: Again tests for various substituted values * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: added stubs to create independent instance upon tmp folder and execute browser upon url. * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/firefox/FirefoxProfilesOperator.java: (copyFile) moved to autocloseable * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoErrorClosingListener.java: fixed to not to close on rhino exception * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringBasedClosingListener.java: condition made protected 2016-01-19 Jiri Vanek When tagsoup is missing, parsing errors are more informative * acinclude.m4: when building without tagsoup, more verbose warning is printed * netx/net/sourceforge/jnlp/GuiLaunchHandler.java: (launchError) is now noting that BasicExceptionDialog will be shown. * netx/net/sourceforge/jnlp/MalformedXMLParser.java: Now react on NoClassDefFoundError by returning original stream. * netx/net/sourceforge/jnlp/ParseException.java: Stores information about parsers loading, and add this info to ParseException message. * netx/net/sourceforge/jnlp/Parser.java: (getRootNode) logic retrieving parser class extracted to separate method getParserInstance * netx/net/sourceforge/jnlp/resources/Messages.properties: added family of TAGSOUP for messages about its state * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (exit) now waits for BasicExceptionDialog. * netx/net/sourceforge/jnlp/runtime/html/AppletExtractor.java: (cleanStreamIfPossible) now uses Parser.getParserInstance ratehr then its own. * netx/net/sourceforge/jnlp/util/BasicExceptionDialog.java: Is now capable of publishing number of shown instances. 2016-01-14 Jiri Vanek Fridrich Strba Adapted to change in package of HexDumpEncoder (1.8 sun.misc.HexDumpEncoder, 1.9 sun.security.util.HexDumpEncoder) * acinclude.m4: added new macro IT_CHECK_FOR_HEXDUMPENCODER, which tries both locations of HexDumpEncoder * configure.ac: now uses IT_CHECK_FOR_HEXDUMPENCODER instead of IT_CHECK_FOR_CLASS(SUN_MISC_HEXDUMPENCODER, [sun.misc.HexDumpEncoder]) * netx/net/sourceforge/jnlp/security/dialogs/CertsInfoPane.java: added imports to both import sun.misc.*; and import sun.security.util.*; 2016-01-14 Jiri Vanek Added GenericName to desktop files * itweb-settings.desktop.in: * javaws.desktop.in: * policyeditor.desktop.in: 2016-01-14 Jiri Vanek Included maven artifacts and appstream metadata * .Makefile: (clean-local) and (.PHONY) now depends on clean-metadata. ($(abs_top_builddir)/metadata) new target, copy metadata-in to metadata and replace name, vendor and version check-meatdata, new stand alone target, checks correctness of poms and xmls in metadata folder. (stamps/netx-dist.stamp) now depends on $(abs_top_builddir)/metadata. clean-metadata, new target, removes built metadata folder * metadata.in/icedtea-web-javaws.appdata.xml: appstream metadata for javaws * metadata.in/icedtea-web.metainfo.xml: appstream metadata for plugin * metadata.in/icedtea-web-plugin.pom: pom for plugin.jar * metadata.in/icedtea-web.pom: pom for netx jar 2016-01-14 Jiri Vanek Vendor desktop entry replaced by X-Vendor * ChangeLog: fixed date * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: if vendor is present in jnlp instead of Vendor X-Vendor entry is generated to desktop file 2016-01-14 Jiri Vanek Added reprodcuer for NoClassDeffFoundError behavior * tests/reproducers/custom/NoClassDeff/srcs/NoClassDeff.java: small app including inner class, which is missing in deployed jar. Then calling this class on demand * tests/reproducers/custom/NoClassDeff/srcs/.Makefile: responsible for removing the compiled inner class before jarring * tests/reproducers/custom/NoClassDeff/testcases/NoClassDeffTest.java: testing behavior when ClassNotFound/NoClassDefFound is thrown in various stages * tests/reproducers/custom/NoClassDeff/resources/NoClassDeff.html.in: * tests/reproducers/custom/NoClassDeff/resources/NoClassDeffApp.jnlp.in: * tests/reproducers/custom/NoClassDeff/resources/NoClassDeffApplet.jnlp.in: * tests/reproducers/custom/NoClassDeff/resources/NoClassDeffJnlpHref.html.in: templates to launch app with instruction when to call LostClass and how to deal with it 2016-01-07 David Cantrell Jiri Vanek Andrew John Hughes Remove bash-specifics from top level Makefile.a * Makefile.am: (generate-docs.stamp) double == in test function replaced by single = (stamps/netx-html-gen.stamp) call to plain bash replaced by ${SHELL} * NEWS: mentioned PR2669 2016-01-07 Tiago StУМrmer Daitx Jiri Vanek Resolves an issue where, if IcedTea's call to NPN_GetValueForURL fails, IcedTea-Web attempts to send uninitialized memory garbage across a pipe, which (usually) results in an error. At this point, IcedTea gives up, but does not inform Firefox that it has done so, and unless dom.ipc.plugins.asyncInit is true, this causes Firefox's UI to lock up in addition to the Java component failing to load. * plugin/icedteanp/IcedTeaNPPlugin.cc: (onsume_plugin_message) initialize len and proxy_info. (get_proxy_info) returns correct message if browser_functions.getvalueforurl returns error * NEWS: mentioned PR2714 2016-01-07 Jiri Vanek Codebase resolution of jnlp-href is now aligned with oracle plugin * netx/net/sourceforge/jnlp/PluginBridge.java: When jnlp href is used, codebase is forced to become codebase of jnlp * netx/net/sourceforge/jnlp/SecurityDesc.java: When file.getCodeBase() is null then instead of NPE, codebase of file.fileLocation is used * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: stripFile and ensureSlashTail moved to UrlUtils * netx/net/sourceforge/jnlp/util/UrlUtils.java: stripFile and ensureSlashTail moved from UnsignedAppletTrustConfirmation * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: removed empty lines * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmationTest.java: adapted to moved methods * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java: added more tests to removeFileName and enabled accidentlay disabled getHostAndPortTest and getPortTest * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: ensured manifest attributes are off for this test * tests/netx/unit/net/sourceforge/jnlp/ParserMalformedXml.java: fixed bom tests to use proper classloader 2016-01-07 Jiri Vanek BOM character now dont cause error * netx/net/sourceforge/nanoxml/XMLElement.java: duplicated whitespace recognition code moved to isRegularWhiteSpace. First call to scanWhitespace repalced by call to scanLeadingWhitespace. New field BOM introduced. (scanWhitespace) made private, and uses isRegularWhiteSpace. (scanLeadingWhitespace) new method, same as scanWhitespacebut also skipps BOM and marks it. * tests/netx/unit/net/sourceforge/jnlp/ParserMalformedXml.java: Added tests to issue * tests/netx/unit/net/sourceforge/jnlp/templates/EFBBBF.jnlp: new file. jnlp file starting with bom. * NEWS: mentioned PR2690 2016-01-06 James Le Cuirot Fixed typo in javadoc generation * Makefile.am: (stamps/netx-docs.stamp) ( _OPTS)->(JAVADOC_OPTS) 2016-01-06 Jiri Vanek Fixed PR2591 - IcedTea-Web request resources twice for meta informations and causes ClientAbortException on tomcat in conjunction with JnlpDownloadServlet * NEWS: mentioned PR2591 * netx/net/sourceforge/jnlp/cache/ResourceDownloader.java: CodeWithRedirect renamed to UrlRequestResult and now cached also lastModified and length if available. (initializeFromURL) now expects UrlRequestResult instead of URL, (findBestUrl) now returns in same manner (SimpleTest1CountRequests) now passes * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceDownloaderTest.java: adapted to ResourceDownloader. 2016-01-06 Jiri Vanek Added redirection tests * tests/test-extensions/net/sourceforge/jnlp/ServerLauncher.java: Enhanced so it can redirect requests to another instance. Enhanced to be able to count requests * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: same * tests/reproducers/simple/simpletest1/testcases/SimpleTest1Test.java: small refactoring to reuse checking methods * tests/reproducers/simple/simpletest1/testcases/SimpleTest1CountRequests.java: Added FAILING tests for 2591 - counting ITW requests to test server * tests/reproducers/simple/simpletest1/testcases/SimpleTestDefaultRedirects.java: added set of tests to test behavior under various redirect codes 2016-01-05 Jiri Vanek * NEWS: mentioned PR2779 * html-gen.sh: now don't generate mercurial changesets' links if .hg is missing 2015-12-23 Jiri Vanek Added base logic and design for rememberable dialogues editor. * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java: (windowGainedFocus) added Override annotation * netx/net/sourceforge/jnlp/controlpanel/ClassFinder.java: new class. Responsible for searching of all RememberableDialog implementations on classpath * netx/net/sourceforge/jnlp/controlpanel/RemmeberableDialogueEditor.java: Desaigned, for now nearly no-op dialog to modify state of (not)remembered dialogues * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java: first column of extended security table made read only again. * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: Click on read only columns of extended security table make RemmeberableDialogueEditor pop up. * netx/net/sourceforge/jnlp/security/dialogs/remember/AppletSecurityActions.java: added api to remove keys from main map. * tests/netx/unit/net/sourceforge/jnlp/controlpanel/ClassFinderTest.java: new class, added tests for ClassFinder 2015-12-23 Jiri Vanek Small properties parser in C (plugin) now unescapes \= \\ \: \t \n and \r correctly * plugin/icedteanp/IcedTeaParseProperties.cc: (get_property_value) now unescape known escape sequences by calling IcedTeaPluginUtilities::unescape * plugin/icedteanp/IcedTeaPluginUtils.cc: implemented (unescape) which unescape known properties escape sequences * plugin/icedteanp/IcedTeaPluginUtils.h: declared (unescape) * tests/cpp-unit-tests/IcedTeaParsePropertiesTest.cc: ((get_property_value)) added testcase which verifies unnescape of escaped sequences from get_property_value * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc: added family of (unescape) tests * /tests/reproducers/signed/CheckPluginParams: reproducer to verify if params from -D in deployment.plugin.jvm.arguments get correctly unescaped during its way up to users program. 2015-12-02 Jiri Vanek * NEWS: mentioned main-class handling change 2015-11-27 Jiri Vanek ParserTest sielnced * tests/netx/unit/net/sourceforge/jnlp/ParserTest.java: now extends NoStdOutErrTest 2015-11-26 Jiri Vanek Main-class attribute get trimmed by default * netx/net/sourceforge/jnlp/Parser.java: declared MAINCLASS to keep main-class constant, declared anyWhiteSpace regex to determine whitespaces. All possible fields made final, hardcoded main-class replaced bu constant. New method getOptionalMainClass wrapper around getMainClass but consuming exception. getMainClass, new method reading MAINCLASS from node and handling it. cleanMainClassAttribute, new method trim value and do checks to die or warn if necessary. * tests/netx/unit/net/sourceforge/jnlp/ParserTest.java: added tests for top level behavior on various spaced main-classes 2015-11-13 Jiri Vanek Added reproducer to test ico provider accessibility * tests/reproducers/simple/IcoAccess/resources/IcoAccess.html: html for applet * tests/reproducers/simple/IcoAccess/resources/IcoAccess.jnlp: jnlp for javaws app * tests/reproducers/simple/IcoAccess/srcs/IcoAccess.java: main class * tests/reproducers/simple/IcoAccess/testcases/IcoAccessTest.java: tests applet, appelt via -html and javaws can access ico normaly. javaws -headless can not. Strange. 2015-11-13 Jiri Vanek Tested ico implementation * netx/net/sourceforge/jnlp/tools/ico/impl/ImageInputStreamIco.java: added getImages public method get images to return all parts of ico. * tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/ImageInputStreamIcoTest.java: new class. Added a lot of tests to test ico parsing * tests/netx/unit/net/sourceforge/jnlp/tools/ico/impl/resources/: added 26 ico files with various sizes, pallets and recoverable corruptions 2015-11-12 Jiri Vanek Added and registered and used image spi provider for icons * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: IcoSpi registered during initialization * netx/net/sourceforge/jnlp/tools/ico/IcoReader.java: new class, implementation of ImageReader for icons. * netx/net/sourceforge/jnlp/tools/ico/IcoSpi.java: new class, implementation of ImageReaderSpi for icons. * netx/net/sourceforge/jnlp/tools/ico/impl/IcoException.java: new class, exception for special cases in ico parsing * netx/net/sourceforge/jnlp/tools/ico/impl/IcoHeader.java: new class, parser and holder of parsed information of header of ico file * netx/net/sourceforge/jnlp/tools/ico/impl/IcoHeaderEntry.java: new class, parser and holder of parsed information of headers of individual images stored in header of ico file * netx/net/sourceforge/jnlp/tools/ico/impl/ImageInputStreamIco.java: parser of icon files from ImageInputStream 2015-11-12 Jiri Vanek Added desktop integration dialog * netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java: added linux-only button to sow FreeDesktopIntegrationEditorFrame * netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/Blinker.java: new class, blink colors on selected component * netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/FreeDesktopIntegrationEditorFrame.java: new class, window to allow managing generated icons, jnlpfiles and shortcuts * netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/JListUtils.java: new class, provides models, extensions, renderers and listeners for FreeDesktopIntegrationEditorFrame * netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/Panels.java: new class, provides various encapsulated parts of FreeDesktopIntegrationEditorFrame * netx/net/sourceforge/jnlp/controlpanel/desktopintegrationeditor/PreviewSelectionJTextPane.java: new class, impelmetation of preview for FreeDesktopIntegrationEditorFrame * netx/net/sourceforge/jnlp/resources/Messages.properties: added Control Panel - desktop integration manager DIM family * netx/net/sourceforge/jnlp/security/dialogs/SecurityDialogPanel.java: htmlWrap made public * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: htmlWrapp called from SecurityDialogPanel * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/MatchingALACAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningPanel.java: same * tests/netx/unit/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanelTest.java: same * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberPanel.java: remoed reimplemented htmlWrap, same * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: findFreedesktopOrgDesktopPathCatch made public * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java: replacing of chars by html entities extracted to new method escapeHtmlForJTextPane 2015-11-12 Jiri Vanek fixed build and runtime with jdk9 * netx/net/sourceforge/jnlp/NetxPanel.java: (init) setting doInit to true replaced by call to setDoInitIfExists * netx/sun/applet/AppletViewerPanelAccess.java: added new function of (setDoInitIfExists) which sets doInit if exists 2015-10-27 Jiri Vanek itweb-settings, debugging panel made aware about legacy log and client apps log * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java: added checboxes for KEY_ENABLE_APPLICATION_LOGGING_TOFILE and KEY_ENABLE_LEGACY_LOGBASEDFILELOG Cusotm config directory place was a bit repacked to be more compact and more useful. * netx/net/sourceforge/jnlp/resources/Messages.properties: added labels and tooltips for new checkboxes 2015-10-27 Jiri Vanek Added and by default enabled logging to files for client applications. * netx/net/sourceforge/jnlp/config/Defaults.java: KEY_ENABLE_APPLICATION_LOGGING_TOFILE added and set by default to true * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: declared KEY_ENABLE_APPLICATION_LOGGING_TOFILE * netx/net/sourceforge/jnlp/util/logging/FileLog.java: next to createFileLog can now does also createAppFileLog * netx/net/sourceforge/jnlp/util/logging/LogConfig.java: made aware of KEY_ENABLE_APPLICATION_LOGGING_TOFILE * netx/net/sourceforge/jnlp/util/logging/OutputController.java: if logging to file is enabled and logging to file for client applications is enabled then output of client app is sent also to special file. Added new singleton of AppFileLogHolder to keep instance of file log for client app. proceedHeader extracted as separate method to be reused. 2015-10-15 Jiri Vanek Added and by default enabled possibility to write logs directly to file without java.util.logging * netx/net/sourceforge/jnlp/config/Defaults.java: (defaults) added new key KEY_ENABLE_LEGACY_LOGBASEDFILELOG, by default false * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: defined KEY_ENABLE_LEGACY_LOGBASEDFILELOG for deployment.log.file.legacylog * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (exit) catch new exception * netx/net/sourceforge/jnlp/util/logging/FileLog.java: removed all logic. Now serve onl as factory provider of FileLog implementation * netx/net/sourceforge/jnlp/util/logging/LogConfig.java: fixed indentation, made aware about LOGBASEDFILELOG * netx/net/sourceforge/jnlp/util/logging/OutputController.java: adapted to autocloseable SingleStreamLogger * netx/net/sourceforge/jnlp/util/logging/SingleStreamLogger.java: this interface now extends AutoCloseable * netx/net/sourceforge/jnlp/util/logging/filelogs/LogBasedFileLog.java: copy of original FileLog. Writing to file is done via java.util.loggiing engine * netx/net/sourceforge/jnlp/util/logging/filelogs/WriterBasedFileLog.java: writing to file is done by simple buffered writer * tests/netx/unit/net/sourceforge/jnlp/util/logging/FileLogTest.java: now tests LogBasedFileLog * tests/netx/unit/net/sourceforge/jnlp/util/logging/OutputControllerTest.java: now tests WriterBasedFileLog instead of FileLog * tests/netx/unit/net/sourceforge/jnlp/util/logging/WriterBasedFileLogTest.java: Similar set of tests as are in FileLogTest but for WriterBasedFileLog 2015-10-15 Jiri Vanek Broken file logging now dont crash itw * NEWS: mentioned * netx/net/sourceforge/jnlp/util/logging/FileLog.java: Instance now acquired from factory method (createFileLog) which defaults new SingleStreamLoggerImpl if normal initialization fails. * netx/net/sourceforge/jnlp/util/logging/OutputController.java: (getFileLog) uses new factory method rather then constructor. * netx/net/sourceforge/jnlp/util/logging/SingleStreamLogger.java: enforces now also close method * netx/net/sourceforge/jnlp/util/logging/PrintStreamLogger.java: impl close * netx/net/sourceforge/jnlp/util/logging/UnixSystemLog.java: impl close * netx/net/sourceforge/jnlp/util/logging/WinSystemLog.java: impl close * netx/net/sourceforge/jnlp/util/logging/headers/PluginMessage.java: removed unused import 2015-10-08 Jiri Vanek * NEWS: mentioned restriction about ports 2015-10-08 Jiri Vanek Tuned SOP reproducer to check also resource's connection and to work on localhost * .Makefile: added target (run-test-server-on-itwtestsport) which lunches testserver on $ITWTESTSPORT port * tests/reproducers/signed/SOPBypassSigned/srcs/SOPBypassSigned.java: addapted to support resource's location * tests/reproducers/simple/SOPBypass/srcs/SOPBypass.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassBeforeAndAfterChunks.java: extracted @before and @after hunks from other testcases to avoid duplicated code. All test servers for this case are run in HOSTNAME mode to enforce visibility of calls from localhost to localhost. Added utility methods above its instances, deployment modifiers forces verbose (same reason) * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassHtmlAppletTest.java: adapted to new api and added assertNoResourcesConnection/assertResourcesConnection * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTest.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTestWithHtmlSwitch.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedHtmlAppletTest.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpAppletTest.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpAppletTestWithHtmlSwitch.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassUtil.java: added logic to serve assertNoResourcesConnection/assertResourcesConnection. Changed evaluation logic. To workaround ignorance of AccessDenied exception from calls from localhost to localhost the check on pass fail is done in different way. If connection is not expected, then no security exception is allowed to appear nor "Denying permissions ..." string is allowed to appear. If connection is expected, then appearance of security exception or "Denying permissions ..." string is considered as failure. 2015-10-07 Jiri Vanek All connection restrictions now consider also port * netx/net/sourceforge/jnlp/SecurityDesc.java: downloadHost redeclared to URL and made final. All set/gets adapted * netx/net/sourceforge/jnlp/Parser.java: (base) passes url to SecurityDesc * netx/net/sourceforge/jnlp/PluginBridge.java: (PluginBridge) same * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: same * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (getApplet) (getApplets) same * netx/net/sourceforge/jnlp/util/UrlUtils.java: added methods sanitizePort and getPort, which always returns port. If no port goes in, default port is going out. Added getHostAndPort which returns host also with port. * tests/netx/unit/net/sourceforge/jnlp/SecurityDescTest.java: adapted to new api * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java: tested new methods 2015-10-07 Jiri Vanek Testserver enhanced to work also in hostname mode or ip mode * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: added enum declared constants for localhost, default protocol (http) and default ip address (127.0.0.1) * tests/test-extensions/net/sourceforge/jnlp/ServerLauncher.java: added enum ServerNaming determining state, whether it respond as localhost, 127.0.0.1 or host-name Added getter for each state, added getter to return all types. Added toString method (stop) now reports what was stopped * tests/test-extensions/net/sourceforge/jnlp/tools/DeploymentPropertiesModifier.java: 2015-10-02 Jiri Vanek Fixed possible segfault during files on and debug on * plugin/icedteanp/IcedTeaNPPlugin.cc: added file_logs_initiated initiated as false. plugin_file_log initiated to NULL. * plugin/icedteanp/IcedTeaNPPlugin.h: made aware about extern file_logs_initiated * plugin/icedteanp/IcedTeaPluginUtils.h: (initialize_debug) set file_logs_initiated to true after initFileLog finishes. (PLUGIN_DEBUG) and (PLUGIN_ERROR) logs to file only when enabled and initiated. 2015-09-30 Jiri Vanek fixed doclint errors * netx/net/sourceforge/jnlp/security/package-info.java: li elements wrapped by ul elements 2015-09-25 Jiri Vanek * tests/reproducers/signed/SOPBypassSigned/srcs/SOPBypassSigned.java fixed handling of connect url and added socket reading from internal server * tests/reproducers/simple/SOPBypass/srcs/SOPBypass.java same 2015-09-24 Jiri Vanek SOPBypass reprodcuer addapted to use instance of internal server as unrleated url Improved for real reading from all tested urls. * tests/reproducers/signed/SOPBypassSigned/srcs/SOPBypassSigned.java: * tests/reproducers/simple/SOPBypass/resources/SOPBypass.jnlp: * tests/reproducers/simple/SOPBypass/resources/SOPBypass.html: * tests/reproducers/simple/SOPBypass/resources/SOPBypassSigned.jnlp: * tests/reproducers/simple/SOPBypass/resources/SOPBypassSigned.html: * tests/reproducers/simple/SOPBypass/srcs/SOPBypass.java: * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassHtmlAppletTest.java: * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTest.java: * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTestWithHtmlSwitch.java: * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedHtmlAppletTest.java: * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpAppletTest.java: * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpAppletTestWithHtmlSwitch.java: * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassUtil.java: 2015-09-24 Jiri Vanek * .Makefile: (stamps/compile-reproducers-testcases.stamp) added support for tests in packages * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyPackage/MixedSigningAndTrustedOnly.java: moved to correct dir to follow package name delcared in file * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyPackage/MixedSigningAndTrustedOnlyBS1.java: same * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyPackage/MixedSigningAndTrustedOnlyBSmanifest.java: same * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyPackage/MixedSigningAndTrustedOnlyFSSU.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassHtmlAppletTest.java: moved to correct dir to follow package name delcared in file * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTest.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassJnlpAppletTestWithHtmlSwitch.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedHtmlAppletTest.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpAppletTest.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassSignedJnlpAppletTestWithHtmlSwitch.java: same * tests/reproducers/simple/SOPBypass/testcases/sopbypasstests/SOPBypassUtil.java: same 2015-09-22 Jiri Vanek fixed two doclint errors * netx/net/sourceforge/jnlp/security/package-info.java: diagram put inside code annotation * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java: (getTitle) added javadoc to prevent auto-generated return with (doclint) invalid character 2015-09-09 Jacob Wisor * ChangeLog: Fix spelling and formatting 2015-09-10 Andrew Azores Add new signed version of SOPBypass reproducers, add privilege level check to existing unsigned SOPBypass * tests/reproducers/signed/SOPBypassSigned/resources/SOPBypassSigned.html: new signed SOPBypass tests * tests/reproducers/signed/SOPBypassSigned/resources/SOPBypassSigned.jnlp: same * tests/reproducers/signed/SOPBypassSigned/srcs/SOPBypassSigned.java: same * tests/reproducers/signed/SOPBypassSigned/testcases/SOPBypassSignedHtmlAppletTest.java: same * tests/reproducers/signed/SOPBypassSigned/testcases/SOPBypassSignedJnlpAppletTest.java: same * tests/reproducers/signed/SOPBypassSigned/testcases/SOPBypassSignedJnlpAppletTestWithHtmlSwitch.java: same * tests/reproducers/signed/SOPBypassSigned/testcases/SOPBypassSignedUtil.java: same * tests/reproducers/simple/SOPBypass/srcs/SOPBypass.java: add check for privilege level * tests/reproducers/simple/SOPBypass/testcases/SOPBypassHtmlAppletTest.java: same * tests/reproducers/simple/SOPBypass/testcases/SOPBypassJnlpAppletTest.java: same * tests/reproducers/simple/SOPBypass/testcases/SOPBypassJnlpAppletTestWithHtmlSwitch.java: same * tests/reproducers/simple/SOPBypass/testcases/SOPBypassUtil.java: same 2015-09-10 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanelTest.java: Backuped, reset and restored .appletTrustSettings so its content can not affect test 2015-09-10 Jiri Vanek * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: (stripFileImp) fixed typo on variable of normlaized to normalized 2015-09-09 Jacob Wisor * .hgignore: Fix regex patterns of files ignored by Mercurial 2015-09-07 Jiri Vanek * NEWS: added descriptions for RH1233697, RH1233667 2015-09-04 Jiri Vanek Fixed reproducer affected by identificator in .appletTrustSettings * tests/reproducers/simple/FakeCodebase/testcases/FakeCodebaseTests.java: instead of checking number of lines in appletTrustSettings directly, now reading this file via UnsignedAppletActionStorageImpl and using its data 2015-09-03 Jiri Vanek * netx/net/sourceforge/jnlp/resources/Messages_de.properties: removed all commented original sentences 2015-09-03 Jiri Vanek Jacob Wisor Stefan Ring Gathered and applied shards of DE translation * netx/net/sourceforge/jnlp/resources/Messages_de.properties: added throng of keys * AUTHORS: added Stefan Ring, stefan@complang.tuwien.ac.at 2015-09-03 Jiri Vanek * NEWS: mentioned fixes for RH1233697, RH1233667 and reuse of MissingALACAdialog for unsigned applications 2015-09-03 Jiri Vanek Fixed ArrayIndexOutOfBound in version corner case issue * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: length of array is checked, * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/VersionRestrictionTest.java: added tests for this case 2015-09-03 Jiri Vanek Added identifier to .appletTrustSettings to specify version of file * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: added handling of version - readVersion, versionPreffix, backup, currentVersion. (readLine) when first line is read, it is checked for version and acted. If loaded version is missing or older then current 2, then file is not loaded. otherwise normal loading. (writeContent) now inserts header with version. (actOnVersionLoad) new method, handling consequences of recognized x current version (backupOldFile) new method, backing up old file as .appletTrustSettings.version-backup * netx/net/sourceforge/jnlp/util/UrlUtils.java: consumed exception during normalization is logged only to console/verbose * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: added considering of version * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/LegacyUnsignedAppletActionStorageImplTest.java: same * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImplTest.java: same * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/VersionRestrictionTest.java: new test file testing version recognition and processing 2015-09-02 Jiri Vanek All UrlRegEx-es got unified and correct quoting * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java: (addRow) now uses factory methods of quoteAndStar form UrlRegEx * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: same, but of exact. Removed redundant space in APPEXTSECguiPanelTableInvalid key * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java: same of exact. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UrlRegEx.java: constructor made private, field final. Creation allowed over factory methods of quote. quoteAndStar, exact. Added and iprved mehtods for visualisation * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UrlRegExTest.java: new test file with tests to new methods in UrlRegex 2015-09-02 Jiri Vanek * Changelog: fixed indentation of alaca paragraph from 9.1 2015-09-02 Jiri Vanek Newline characters are banned from saving to .appletTrustSettings * netx/net/sourceforge/jnlp/security/appletextendedsecurity/InvalidLineException.java: New file. Exception to be specially handled if error appear in saved line. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java: (serializeToReadableAndParseableString) if new-line appear in line, InvalidLineException is thrown * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: (writeContent) InvalidLineException is expected and logged. * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmationTest.java: adapted and quite a lot of tests added. * tests/reproducers/simple/UnicodeLineBreak/resources/UnicodeLineBreak.java: * tests/reproducers/simple/UnicodeLineBreak/srcs/UnicodeLineBreak.java: * tests/reproducers/simple/UnicodeLineBreak/testcases/UnicodeLineBreakTests.java: half automated reproducer of this behavior * netx/net/sourceforge/jnlp/runtime/HtmlBoot.java: based on existence of -xml, now can turn off tagsoup * netx/net/sourceforge/jnlp/runtime/html/AppletExtractor.java: is passing parsersettings to HtmlBoot 2015-09-01 Jiri Vanek Saving of status of dialogs for "whole codebase" now includes also document base * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: (updateAppletAction) now saves base of docbase instead of .* "for remember for codebase" stripFile - new method, ensuring docbase do not contains file * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmationTest.java: added testSripFile unit test for new method * tests/reproducers/simple/FakeCodebase/resources/FakeCodebase.html.in: * tests/reproducers/simple/FakeCodebase/resources/FakeCodebase.jnlp.in: * tests/reproducers/simple/FakeCodebase/resources/OriginalCodebase.html: * tests/reproducers/simple/FakeCodebase/resources/OriginalCodebase.jnlp: * tests/reproducers/simple/FakeCodebase/srcs/FakeCodebase.java: * tests/reproducers/simple/FakeCodebase/testcases/FakeCodebaseTests.java: Reproducer of this behavior 2015-09-01 Jiri Vanek application-library-allowable-codebase dialog made available for unsigned apps * netx/net/sourceforge/jnlp/resources/Messages.properties: (ALACAMissingMainTitle) added warning about possible consequences of resources out of docbase. (ALACAMatchingMainTitle) the red higlights changed to green and added calming words about it. * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: same * netx/net/sourceforge/jnlp/resources/Messages_de.properties: same * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: adapted to red to green recoloring * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: (checkApplicationLibraryAllowableCodebaseAttribute) removed return for in case of unsigned app. Fixed check for all matching resources against codebase and docbase If app is unsigned, then value in manifest is ignored. Missing alaca required also in low security mode * tests/netx/unit/net/sourceforge/jnlp/runtime/ManifestAttributesCheckerTest.java: new file to test stripDocbase. 2015-08-31 Andrew Azores Added new tests to check where applets are allow to make network connections, depending on different combinations of applet codebase, documentbase, and applet archive location. * tests/reproducers/simple/SOPBypass/resources/SOPBypass.html * tests/reproducers/simple/SOPBypass/resources/SOPBypass.jnlp * tests/reproducers/simple/SOPBypass/srcs/SOPBypass.java * tests/reproducers/simple/SOPBypass/testcases/SOPBypassHtmlAppletTest.java * tests/reproducers/simple/SOPBypass/testcases/SOPBypassJnlpAppletTest.java * tests/reproducers/simple/SOPBypass/testcases/SOPBypassJnlpAppletTestWithHtmlSwitch.java * tests/reproducers/simple/SOPBypass/testcases/SOPBypassUtil.java 2015-08-25 Jiri Vanek Lukasz Dracz * Makefile.am: declared BASH_CMPL_DEST_DIR as directory where to install generated icedteaweb-completion. (clean-local) (.PHONY) added clean-icedteaweb-completion (install-exec-local) now creates BASH_CMPL_DEST_DIR and copy icedteaweb-completion to it (uninstall-local) now removes also BASH_CMPL_DEST_DIR/icedteaweb-completion (icedteaweb-completion), new target, substiture real values from javacode via icedteaweb-completion.in to icedteaweb-completion (stamps/netx-dist.stamp) now depends also on icedteaweb-completion (clean-icedteaweb-completion) new target to remove generated file * icedteaweb-completion.in: hardcoded opts value replaced by fields for substitutions *netx/net/sourceforge/jnlp/OptionsDefinitions.java: added main method, which can print currently accurate switches 2015-08-25 Jiri Vanek * icedteaweb-completion: removed, renamed to icedteaweb-completion.in * icedteaweb-completion.in: new file from icedteaweb-completion 2015-08-25 Jiri Vanek Added more tests MixedSigningAndTrustedOnly * tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MixedSigningAndTrustedOnlyClass1.java modified to suite more compelx tests * tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MixedSigningAndTrustedOnlyClass2.java same * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnly.java same * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyBS1.java adapted to MixedSigningAndTrustedOnly * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyBSmanifest.java same * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyFSSU.java: new file to test signed_>unsigned and unsigned->signed calls behaviors. First on classpath is signed 2015-08-19 Andrew Azores PolicyEditor dies given invalid -codebase -signedby or -principals arguments * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (main): extracted helper methods for getting codebase, signedBy, principals arguments. (getCodebaseArgument, getSignedByArgument, getPrincipalsArgument): new methods (cleanFilePathArgument): make parameter final for consistent style * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java (testGetCodebaseArgument, testGetCodebaseArgument2, testGetCodebaseArgument3, testGetCodebaseArgumentWhenNotProvided, testGetPrincipalsArgument, testGetPrincipalsArgument2, testGetPrincipalsArgument3, testGetPrincipalsArgumentWhenNotProvided, testGetSignedByArgument, testGetSignedByArgumentWhenNotProvided): new tests 2015-08-19 Andrew Azores Sort identifiers list in PolicyEditor * NEWS: add note about sorting * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (addNewEntry): clear listModel before adding new identifiers from policyEditorController. Controller handles sorting results for us, so we just clear and repopulate the UI. * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java (getIdentifiers): return SortedSet rather than Set * netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java (getIdentifiers): likewise * netx/net/sourceforge/jnlp/security/policyeditor/PolicyIdentifier.java (compareTo, compareComparable): new methods for implementing Comparable (getPrincipals): return Set, not List * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyIdentifierTest.java: new tests for PolicyIdentifier 2015-07-30 Andrew Azores Add tests for PolicyEditor.getFilePathArgument * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (getFilePathArgument): made package-private for testing * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java: new tests for PolicyEditor.getFilePathArgument 2015-07-30 Jiri Vanek Added more asserts to MixedSigningAndTrustedOnly tests * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyBS1.java * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyBSmanifest.java 2015-07-30 Andrew Azores Add -defaultfile switch to PolicyEditor * NEWS: add note about defaultfile flag * netx/net/sourceforge/jnlp/OptionsDefinitions.java (OPTIONS, getPolicyEditorOptions): add DEFAULTFILE for PolicyEditor * netx/net/sourceforge/jnlp/resources/Messages.properties (PBODefaultFile, PEDefaultFileFilePathSpecifiedError, PEMainArgAndFileSwitchSpecifiedError): new messages * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (main): add handling for -defaultfile, die when both -defaultfile and -file are given (openDefaultButtonAction): extract method (getDefaultPolicyFilePath): new method extracted from openDefaultButtonAction (getFilePathArgument): new method (cleanFilePathArgument): new method 2015-07-29 Jiri Vanek Added tests for single signed jar with manifest containing trusted-only * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnly.java: added checks for complete filure and launchException * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyBSmanifest.java: single signed jar with manifest containing trusted-only. File is same as MixedSigningAndTrustedOnlyBS1, but four reproducers of jnlpApp and jnlpApplet without security correctly don't run. 2015-07-29 Jiri Vanek replaced Trusted-only by Trusted-Only, cosmetic change in TrustedOnlyAttribute reproducer * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed-nosecurity.jnlp: * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed-security.jnlp: * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigned-nosecurity.jnlp: * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigned-security.jnlp: * tests/reproducers/custom/TrustedOnlyAttribute/srcs/MANIFEST.MF: 2015-07-29 Jiri Vanek Initial push for big trusted-only/mixed-permissions reproducer * tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/MixedSigningAndTrustedOnly.html.in: template for javaws html and browser test (substitute archives and mainclass and commnad) * tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/MixedSigningAndTrustedOnlyApp.jnlp.in: template for javaws (substitute security, archives and mainclass and commnads) * tests/reproducers/custom/MixedSigningAndTrustedOnly/resources/MixedSigningAndTrustedOnlyApplet.jnlp.in: template for javaws applet (substitute security, archives and mainclass and commnads) * tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MANIFEST.MF: manifest with Trusted-only: true to be potentially used in jars * tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/Makefile: custom makefile which generates 12 jars. six signed, six unsigned, six with manifest, six without. two times two with one class, two with both classes * tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MixedSigningAndTrustedOnlyClass1.java: source class1, may confirm itself, try privileged action, try those two on second class, * tests/reproducers/custom/MixedSigningAndTrustedOnly/srcs/MixedSigningAndTrustedOnlyClass2.java: same but vice versa * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnly.java: utility class for this reproducer (with tests) * tests/reproducers/custom/MixedSigningAndTrustedOnly/testcases/MixedSigningAndTrustedOnlyBS1.java: simple twelve tests verifying single signed jar with both classes without manifest works 2015-07-27 Jiri Vanek Removed last remains of BOOT_DIR * Makefile.am: declared and exported EXPORTED_JAR EXPORTED_KEYTOOL EXPORTED_JARSIGNER EXPORTED_PACK200 * tests/reproducers/custom/AdditionalJarsInMetaInfIndexList/srcs/Makefile: all of (BOOT_DIR)/bin/keytool (BOOT_DIR)/bin/jarsigner (BOOT_DIR)/bin/javac (BOOT_DIR)/bin/jar (BOOT_DIR)/bin/pack200 replaced by (EXPORTED_KEYTOOL) (EXPORTED_JARSIGNER) (EXPORTED_JAVAC) (EXPORTED_JAR) (EXPORTED_PACK200) * tests/reproducers/custom/AppletExtendsFromOutsideJar/srcs/Makefile: same * tests/reproducers/custom/ExtensionJnlpsInApplet/srcs/Makefile: same * tests/reproducers/custom/JNLPClassLoaderDeadlock/srcs/Makefile: same * tests/reproducers/custom/MixedSigningApplet/srcs/Makefile: same * tests/reproducers/custom/MultipleSignaturesPerJar/srcs/Makefile: same * tests/reproducers/custom/PackGZip/srcs/Makefile: same * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/Makefile: same * tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/Makefile: same * tests/reproducers/custom/SignedAppletExternalMainClass/srcs/Makefile: same * tests/reproducers/custom/TrustedOnlyAttribute/srcs/Makefile: same * tests/reproducers/custom/UnsignedContentInMETAINF/srcs/Makefile: same 2015-07-27 Andrew Azores PolicyEditor updated to use sun.security.provider.PolicyParser * NEWS: mention new PolicyEditor support for SignedBy and Principals * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: UI updates to support SignedBy and Principals * netx/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewer.java: likewise * netx/net/sourceforge/jnlp/security/policyeditor/PermissionActions.java: use diamond operator where applicable * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java: refactor to support use of PolicyIdentifiers rather than plain codebases * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java: replace fromString with fromPermissionEntry, fix formatting * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEntry.java: implement Serializable and Transferable to enable clipboard support. Use Builder pattern. Support PolicyIdentifiers rather than only plain codebases * netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java: refactor to support PolicyIdentifiers and use PolicyParser * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java: use PolicyIdentifier to identify current applet by its codebase alone * netx/net/sourceforge/jnlp/util/docprovider/PolicyEditorTextsProvider.java: remove -codebase from PolicyEditor help text * netx/net/sourceforge/jnlp/OptionsDefinitions.java: add SIGNEDBY and PRINCIPALS for PolicyEditor, define CODEBASE to take exactly one argument * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewerTest.java: use PolicyIdentifier rather than codebase string * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorControllerTest.java: redo to use PolicyIdentifiers, DisplayablePermissions * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorParsingTest.java: use PolicyIdentifier rather than codebase string * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissionsTest.java (testActionsRegex, testTargetRegex, testRegexesAgainstBadPermissionNames): removed, PolicyParser has replaced this * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java: use PolicyIdentifier rather than codebase string * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEntryTest.java: use DisplayablePermission and PolicyEntry rather than CustomPermission * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyFileModelTest.java: use PolicyIdentifier rather than codebase string * netx/net/sourceforge/jnlp/security/policyeditor/KeystoreInfo.java: new file * netx/net/sourceforge/jnlp/security/policyeditor/PolicyIdentifier.java: new file * netx/net/sourceforge/jnlp/security/policyeditor/CustomPermission.java: removed * netx/net/sourceforge/jnlp/security/policyeditor/InvalidPolicyException.java: removed * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPermissionTest.java: removed * netx/net/sourceforge/jnlp/resources/Messages.properties: many changes to PolicyEditor messages for key bindings, UI messages, error messages, etc. * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: likewise * netx/net/sourceforge/jnlp/resources/Messages_de.properties: likewise * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: likewise 2015-07-23 Jiri Vanek Enabled and properly tested Entry-Point attribute check * NEWS: mentioned enabling * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: enabled call to checkEntryPoint if enabled * tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid.java: * tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid.java: * tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid_applet.java: * tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid_applet_security.java: * tests/reproducers/signed/EntryPointSignedSingleBothInvalid/resources/EntryPointSignedSingleBothInvalid_security.java: * tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/EntryPointSignedSingleBothInvalid.java: * tests/reproducers/signed/EntryPointSignedSingleBothInvalid/srcs/META-INF/MANIFEST.java: * tests/reproducers/signed/EntryPointSignedSingleBothInvalid/testcases/EntryPointSignedSingleBothInvalidTest.java: tests for Entry-Point with two values, both invalid * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk1.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk1.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk2.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk2.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_applet1.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_applet2.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_applet_security1.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_applet_security2.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_security1.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/resources/EntryPointSignedSingleBothOk_security2.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/EntryPointSignedSingleBothOk1.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/EntryPointSignedSingleBothOk2.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/srcs/META-INF/MANIFEST.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/testcases/EntryPointSignedSingleBothOkTest1.java: * tests/reproducers/signed/EntryPointSignedSingleBothOk/testcases/EntryPointSignedSingleBothOkTest2.java: tests for Entry-Point with two values, both valid * tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk.java: * tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk.java: * tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk_applet.java: * tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk_applet_security.java: * tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/resources/EntryPointSignedSingleFirstInvalidSecondOk_security.java: * tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/EntryPointSignedSingleFirstInvalidSecondOk.java: * tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/srcs/META-INF/MANIFEST.java: * tests/reproducers/signed/EntryPointSignedSingleFirstInvalidSecondOk/testcases/EntryPointSignedSingleFirstInvalidSecondOkTest.java: tests for Entry-Point with two values, first invalid, second ok * tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid.java: * tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid.java: * tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid_applet.java: * tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid_applet_security.java: * tests/reproducers/signed/EntryPointSignedSingleInvalid/resources/EntryPointSignedSingleInvalid_security.java: * tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/EntryPointSignedSingleInvalid.java: * tests/reproducers/signed/EntryPointSignedSingleInvalid/srcs/META-INF/MANIFEST.java: * tests/reproducers/signed/EntryPointSignedSingleInvalid/testcases/EntryPointSignedSingleInvalidTest.java: tests for Entry-Point with one invalid value * tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk.java: * tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk.java: * tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk_applet.java: * tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk_applet_security.java: * tests/reproducers/signed/EntryPointSignedSingleOk/resources/EntryPointSignedSingleOk_security.java: * tests/reproducers/signed/EntryPointSignedSingleOk/srcs/EntryPointSignedSingleOk.java: * tests/reproducers/signed/EntryPointSignedSingleOk/srcs/META-INF/MANIFEST.java: * tests/reproducers/signed/EntryPointSignedSingleOk/testcases/EntryPointSignedSingleOkTest.java: tests for Entry-Point with one ok value * tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk.java: * tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk.java: * tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk_applet.java: * tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk_applet_security.java: * tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/resources/EntryPointSignedSingleSecondInvalidFirstOk_security.java: * tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/EntryPointSignedSingleSecondInvalidFirstOk.java: * tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/srcs/META-INF/MANIFEST.java: * tests/reproducers/signed/EntryPointSignedSingleSecondInvalidFirstOk/testcases/EntryPointSignedSingleSecondInvalidFirstOkTest.java: tests for Entry-Point with two values, first ok, second invalid * tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid.java: * tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid.java: * tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid_applet.java: * tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid_applet_security.java: * tests/reproducers/simple/EntryPointUnsignedSingleInvalid/resources/EntryPointUnsignedSingleInvalid_security.java: * tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/EntryPointUnsignedSingleInvalid.java: * tests/reproducers/simple/EntryPointUnsignedSingleInvalid/srcs/META-INF/MANIFEST.java: * tests/reproducers/simple/EntryPointUnsignedSingleInvalid/testcases/EntryPointUnsignedSingleInvalidTest.java: tests for Entry-Point with one invalid value in unsigned jar (ignoring this value) 2015-07-22 Jiri Vanek Added tests for html switch for Sandbox attribute * tests/reproducers/signed/SandboxSignedAllPerm/testcases/SandboxSignedAllPermTest.java * tests/reproducers/signed/SandboxSignedInvalid/testcases/SandboxSignedInvalidTest.java * tests/reproducers/signed/SandboxSignedMissing/testcases/SandboxSignedMissingTest.java * tests/reproducers/signed/SandboxSignedMissing/testcases/SandboxSignedMissingTestHighSecurity.java * tests/reproducers/signed/SandboxSignedSandbox/testcases/SandboxSignedSandboxTest.java * tests/reproducers/simple/SandboxUnsignedAllPerm/testcases/SandboxUnsignedAllPermTest.java * tests/reproducers/simple/SandboxUnsignedInvalid/testcases/SandboxUnsignedInvalidTest.java * tests/reproducers/simple/SandboxUnsignedMissing/testcases/SandboxUnsignedMissingTest.java * tests/reproducers/simple/SandboxUnsignedMissing/testcases/SandboxUnsignedMissingTestHighSecurity.java * tests/reproducers/simple/SandboxUnsignedSandbox/testcases/SandboxUnsignedSandboxTest.java 2015-07-22 Fridrich Strba * Makefile.am: (generate-docs.stamp) added '-' to tail of tail command as some implementations of tail parse the file information as the last argument 2015-07-20 Jiri Vanek * NEWS: change of permissions attribute mentioned in news 2015-07-20 Jiri Vanek Tuned permissions attribute behavior for unsigned jnlps * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: permissions sandbox and signed app and unsigned app with permissions all-permissions now run in sandbox instead of not at all. * tests/reproducers/signed/SandboxSignedSandbox/testcases/SandboxSignedSandboxTest.java: Failing tests of (javawsAllPermNoSecurity) (javawsAppletAllPermNoSecurity) with bug comment got removed this comment and are now passing * tests/reproducers/simple/SandboxUnsignedAllPerm/testcases/SandboxUnsignedAllPermTest.java Failing tests of (javawsAllPermNoSecurity) (javawsAppletAllPermNoSecurity) with bug comment got removed this comment and are now passing 2015-07-20 Jiri Vanek Fixed download service * /netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (fillInPartJars) for-each loop replaced by indexed loop to prevent ConcurrentModificationException * tests/reproducers/signed/DownloadService/testcases/DownloadServiceTest.java: small refactoring in favour of diamond operator 2015-07-16 Jiri Vanek Fixing various reproducers * tests/reproducers/simple/ManifestedJar1/testcases/ManifestedJar1Test.java: fixed check on return value * tests/reproducers/simple/InformationTitleVendorParser/testcases/InformationTitleVendorParserTest.java: same 2015-07-15 Jiri Vanek Fixing various reproducers * netx/net/sourceforge/jnlp/runtime/JnlpBoot.java: LaunchException now also cause exit with nonzero return * tests/reproducers/custom/remote/testcases/RemoteApplicationSettings.java: fixed url for SunSwingDemo and checking reduced to no exception only * tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java: moved to one browser only * tests/reproducers/signed/CountingAppletSigned/srcs/CountingAppletSigned.java: added flush, validateTree replaced by validate * tests/reproducers/simple/CountingApplet1/srcs/CountingApplet1.java: same * tests/reproducers/signed/DeploymentPropertiesAreExposed/testcases/DeploymentPropertiesAreExposedTest.java: fixed check on sucess * tests/reproducers/simple/AppletTagWithMissingCodeAttribute/testcases/AppletTagWithMissingCodeAttribute.java: added comment explaining failure in most browsers * tests/reproducers/simple/CountingApplet1/testcases/ParallelAppletsTest.java: verification on counts loosed to 7 from 10 (last are often consumed via exit) * tests/reproducers/simple/JnlpHrefAttribute/testcases/JnlpHrefAttributeTest.java: added exclusive handlers for midori and epiphany * tests/reproducers/simple/SingleInstanceServiceTest/testcases/SingleInstanceTest.java: added comment explaining failure in most browsers * tests/reproducers/simple/simpletest1/resources/simpletest1.jnlp: added second description to make ti fail in strict mode * tests/reproducers/simple/simpletest1/testcases/SimpleTest1Test.java: fixed verification asserts 2015-07-14 Jiri Vanek Fixed various tests * tests/reproducers/signed/GifarBase/testcases/GifarTestcases.java: (GifarViaJnlp_applet_ignoreHeaders) and (GifarViaJnlp_application_ignoreHeaders) marked as KnownToFail. They will never pass on jdk8+ * tests/reproducers/signed/ReadPropertiesBySignedHack/testcases/ReadPropertiesBySignedHackTest.java: now correctly expect non-zero return value of child javaws * tests/reproducers/signed/ReadPropertiesSigned/testcases/ReadPropertiesSignedTest.java: same * tests/reproducers/simple/AddShutdownHook/testcases/AddShutdownHookTest.java: same * tests/reproducers/simple/AddShutdownHook/testcases/HangFirefoxTests.java: same * tests/reproducers/simple/AllStackTraces/testcases/AllStackTracesTest.java: same * tests/reproducers/simple/CreateClassLoader/testcases/CreateClassLoaderTest.java: same * tests/reproducers/simple/ManifestedJar1/testcases/ManifestedJar1Test.java: same except (manifestedJar1main2mainAppDesc). (manifestedJar1main2mainAppDesc) now pass with correct(?) message from first main jar (test never passed imho) * tests/reproducers/simple/ReadEnvironment/testcases/ReadEnvironmentTest.java: same * tests/reproducers/simple/ReadProperties/testcases/ReadPropertiesTest.java: same * tests/reproducers/simple/RedirectStreams/testcases/RedirectStreamsTest.java: same * tests/reproducers/simple/ReplaceSecurityManager/testcases/ReplaceSecurityManagerTest.java: same * tests/reproducers/simple/SetContextClassLoader/testcases/SetContextClassLoaderTest.java: same 2015-07-14 Jiri Vanek Fixed AccessClassInPackageTest * tests/reproducers/simple/AccessClassInPackage/testcases/AccessClassInPackageTest.java: (AccessClassInPackageSUNSEC) and (AccessClassInPackageNETSF) now correctly expect non-zero return value of child javaws 2015-07-13 Jiri Vanek Fixed codebase reproducers * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedMatching.java: improved (getMessage) to take message directly via Translator * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedNotMatching.java: now ensures deployment.manifest.attributes.check have always CODEBASE value * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntryUnsignedMatching.java: same * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntryUnsignedNotMatching.java: same 2015-07-13 Jiri Vanek Added tests for unsigned applet/app using Permission attribute * tests/reproducers/unsigned/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm.html * tests/reproducers/unsigned/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm.jnlp * tests/reproducers/unsigned/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm_applet.jnlp * tests/reproducers/unsigned/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm_applet_security.jnlp * tests/reproducers/unsigned/SandboxUnsignedAllPerm/resources/SandboxUnsignedAllPerm_security.jnlp * tests/reproducers/unsigned/SandboxUnsignedAllPerm/srcs/META-INF/MANIFEST.MF contains Permissions: all-permissions * tests/reproducers/unsigned/SandboxUnsignedAllPerm/srcs/SandboxUnsignedAllPerm.java * tests/reproducers/unsigned/SandboxUnsignedAllPerm/testcases/SandboxUnsignedAllPermTest.java test cases with permissions in manifest check on. There is probably an bug in impl. The applet should not run at all, or javaws without permissions should run in sandbox too. * tests/reproducers/unsigned/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid.html * tests/reproducers/unsigned/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid.jnlp * tests/reproducers/unsigned/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid_applet.jnlp * tests/reproducers/unsigned/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid_applet_security.jnlp * tests/reproducers/unsigned/SandboxUnsignedInvalid/resources/SandboxUnsignedInvalid_security.jnlp * tests/reproducers/unsigned/SandboxUnsignedInvalid/srcs/META-INF/MANIFEST.MF contains Permissions: invalidValue * tests/reproducers/unsigned/SandboxUnsignedInvalid/srcs/SandboxUnsignedInvalid.java * tests/reproducers/unsigned/SandboxUnsignedInvalid/testcases/SandboxUnsignedInvalidTest.java test cases with permissions in manifest check on * tests/reproducers/unsigned/SandboxUnsignedMissing/resources/SandboxUnsignedMissing.html * tests/reproducers/unsigned/SandboxUnsignedMissing/resources/SandboxUnsignedMissing.jnlp * tests/reproducers/unsigned/SandboxUnsignedMissing/resources/SandboxUnsignedMissing_applet.jnlp * tests/reproducers/unsigned/SandboxUnsignedMissing/resources/SandboxUnsignedMissing_applet_security.jnlp * tests/reproducers/unsigned/SandboxUnsignedMissing/resources/SandboxUnsignedMissing_security.jnlp * tests/reproducers/unsigned/SandboxUnsignedMissing/srcs/META-INF/MANIFEST.MF does not contains Permissions * tests/reproducers/unsigned/SandboxUnsignedMissing/srcs/SandboxUnsignedMissing.java * tests/reproducers/unsigned/SandboxUnsignedMissing/testcases/SandboxUnsignedMissingTest.java test cases with permissions in manifest check on * tests/reproducers/unsigned/SandboxUnsignedMissing/testcases/SandboxUnsignedMissingTestHighSecurity.java test cases with permissions in manifest check on and on high security => interactive tests with auto-reply * tests/reproducers/unsigned/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox.html * tests/reproducers/unsigned/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox.jnlp * tests/reproducers/unsigned/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox_applet.jnlp * tests/reproducers/unsigned/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox_applet_security.jnlp * tests/reproducers/unsigned/SandboxUnsignedSandbox/resources/SandboxUnsignedSandbox_security.jnlp * tests/reproducers/unsigned/SandboxUnsignedSandbox/srcs/META-INF/MANIFEST.MF contains Permissions: sandbox * tests/reproducers/unsigned/SandboxUnsignedSandbox/srcs/SandboxUnsignedSandbox.java * tests/reproducers/unsigned/SandboxUnsignedSandbox/testcases/SandboxUnsignedSandboxTest.java * tests/reproducers/cloneReproducer.sh: small fix to support blue/red background for unsigned/signed html applets 2015-07-10 Jiri Vanek Added script to clone reproducer skeleton * tests/reproducers/cloneReproducer.sh: new file. Helping script which can prepare new reproducer from old one by simple copy and sed. 2015-07-10 Jiri Vanek Added tests for signed applet/app using Permission attribute * tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm.html * tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm.jnlp * tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm_applet.jnlp * tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm_applet_security.jnlp * tests/reproducers/signed/SandboxSignedAllPerm/resources/SandboxSignedAllPerm_security.jnlp * tests/reproducers/signed/SandboxSignedAllPerm/srcs/META-INF/MANIFEST.MF contains Permissions: all-permissions * tests/reproducers/signed/SandboxSignedAllPerm/srcs/SandboxSignedAllPerm.java * tests/reproducers/signed/SandboxSignedAllPerm/testcases/SandboxSignedAllPermTest.java test cases with permissions in manifest check on * tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid.html * tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid.jnlp * tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid_applet.jnlp * tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid_applet_security.jnlp * tests/reproducers/signed/SandboxSignedInvalid/resources/SandboxSignedInvalid_security.jnlp * tests/reproducers/signed/SandboxSignedInvalid/srcs/META-INF/MANIFEST.MF contains Permissions: invalidValue * tests/reproducers/signed/SandboxSignedInvalid/srcs/SandboxSignedInvalid.java * tests/reproducers/signed/SandboxSignedInvalid/testcases/SandboxSignedInvalidTest.java test cases with permissions in manifest check on * tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing.html * tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing.jnlp * tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing_applet.jnlp * tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing_applet_security.jnlp * tests/reproducers/signed/SandboxSignedMissing/resources/SandboxSignedMissing_security.jnlp * tests/reproducers/signed/SandboxSignedMissing/srcs/META-INF/MANIFEST.MF does not contains Permissions * tests/reproducers/signed/SandboxSignedMissing/srcs/SandboxSignedMissing.java * tests/reproducers/signed/SandboxSignedMissing/testcases/SandboxSignedMissingTest.java test cases with permissions in manifest check on * tests/reproducers/signed/SandboxSignedMissing/testcases/SandboxSignedMissingTestHighSecurity.java test cases with permissions in manifest check on and on high security => interactive tests with auto-reply * tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox.html * tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox.jnlp * tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox_applet.jnlp * tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox_applet_security.jnlp * tests/reproducers/signed/SandboxSignedSandbox/resources/SandboxSignedSandbox_security.jnlp * tests/reproducers/signed/SandboxSignedSandbox/srcs/META-INF/MANIFEST.MF contains Permissions: sandbox * tests/reproducers/signed/SandboxSignedSandbox/srcs/SandboxSignedSandbox.java * tests/reproducers/signed/SandboxSignedSandbox/testcases/SandboxSignedSandboxTest.java test cases with permissions in manifest check on. Contains two failing tests currently itw with sandbox in manifest and jnlp not requesting permissions fails. Bug to be fixed 2015-06-25 Jiri Vanek Fixed to short buttons for localized text - RH1231441 * NEWS: mentioned RH1231441 * netx/net/sourceforge/jnlp/security/dialogs/AppletWarningPane.java: removed set of preferred sizes to minimal size. added debugging main method * netx/net/sourceforge/jnlp/security/dialogs/PasswordAuthenticationPane.java same * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: removed set of preferred sizes to minimal size. * netx/net/sourceforge/jnlp/security/dialogs/MissingALACAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/MissingPermissionsAttributePanel.java: same 2015-06-20 Jiri Vanek DummyJNLPFileWithJar enhanced to accept urls only, added test to UnsignedAppletTrustConfirmationTest * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: (updateAppletAction) fixed wrong type, Class become Class * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmationTest.java: Added updateAppletActionTest1 * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedMatching.java: moved to diamond * tests/test-extensions/net/sourceforge/jnlp/mock/DummyJNLPFileWithJar.java: constructors hierarchy enhanced to accept also plain URLs as resources. They are dummy anyway 2015-06-19 Jiri Vanek Cache reproducer adapted to newest state * tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html: used correct query,a s test rely on it * tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp: same * tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java: (testCaching) adapted to query in cache and correclty made depndent on testAbsolutePathAndQueryStringWebstart 2015-06-19 Jiri Vanek Added experimental usage of headless dialogues to reproducers suite * tests/reproducers/signed/RunInSandbox/testcases/RunInSandboxTest.java: added four tests popuping and answering headless dialogue * tests/test-extensions/net/sourceforge/jnlp/ProcessWrapper.java: use diamonds, added methods setWriter alllowing to set StdInWriter of ThreadedProcess * tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java: added setWriter method, which allows to set writer to to underlying process stdin. (run) if writer is not null, thenstdin writer thread is started and it writes writer to underlying process. 2015-06-19 Jiri Vanek Partially signed reproducer adapted to new schema and enhanced * tests/reproducers/signed/RunInSandbox/resources/RunInSandboxApplet.jnlp: moved from app to applet * tests/reproducers/signed/RunInSandbox/resources/RunInSandboxApplication.jnlp: moved from applet to app * tests/reproducers/signed/RunInSandbox/srcs/RunInSandbox.java: system exit not called in case of applet * tests/reproducers/signed/RunInSandbox/testcases/RunInSandboxTest.java: added manipulation with certificates to simulate proper environment * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: fixed small bug headless switch now moved to start of argument list, not to the end. Being on end was killing -html or -jnlp arg functionality (arg was -headless then) 2015-06-18 Jiri Vanek JnlpBoot and XBasicService are called with exitOnException true now. All other then boolean constructor of Launcher made private. True/False enforced and reconsidered * netx/net/sourceforge/jnlp/Launcher.java: All other then boolean constructor of Launcher made private. * netx/net/sourceforge/jnlp/runtime/JnlpBoot.java: (run) new Launcher called with true rather then false * netx/net/sourceforge/jnlp/services/XBasicService.java: (lunchUrl) same 2015-06-18 Jiri Vanek All dialogs are able to accept answer from standard input and thus works in headless mode * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: turned headless/logic order. Headless is now only hanging output, not behavior. * netx/net/sourceforge/jnlp/resources/Messages.properties: Changed KSheadlesWarning added HeadlessDialogues AWPstdoutHint1-3 PAPstdinInfo and HDwrongValue keys for headless dialogues. * netx/net/sourceforge/jnlp/security/KeystorePasswordAttempter.java: headelss error changed to stdin reading. Shared code extracted to addPnewPassword * netx/net/sourceforge/jnlp/security/SecurityDialog.java: small refactroings createTitle, new methods, and one more abstraction upon getPanel * netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java: added and called processMessageInHeadless * netx/net/sourceforge/jnlp/security/dialogresults/AccessWarningPaneComplexReturn.java: added method returning string with all possible values * netx/net/sourceforge/jnlp/security/dialogresults/NamePassword.java: (readValue) got logic * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java: implemented readFromStdIn and helpToStdIn * netx/net/sourceforge/jnlp/security/dialogs/AppletWarningPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/CertsInfoPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/MissingALACAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/MissingPermissionsAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/MoreInfoPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/PasswordAuthenticationPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberDialog.java: logic of setOrUpdateRememberedState splited to two methods to allow headless to save added * netx/net/sourceforge/jnlp/security/dialogs/SecurityDialogPanel.java: written default getText method, which creates stdout message from already done gui implementations * netx/net/sourceforge/jnlp/util/logging/OutputController.java: added readLine method to allow simple reading of standard in * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: become NoStdOutErrTest. Disabled most partiallYsignedTests. Hard to mock certVerifier and securityDelegate * tests/test-extensions/net/sourceforge/jnlp/util/logging/NoStdOutErrTest.java: enhanced to handle also stdout/err not jsut logger 2015-06-16 Jiri Vanek All headless, xtrustatAll/None, shouldPrompt dialogue decisions moved into shared place * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (checkTrustWithUser) (promptUserOnPartialSigning) calls to trusts removed. * netx/net/sourceforge/jnlp/security/SecurityDialog.java: added getDefaultNegativeAnswer getDefaultPositiveAnswer stubs to access panel. * netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java: all trust/shouldPrompt/headless decisions moved to this place. Small modularization done. * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: all trust/shouldPrompt/headless removed * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: same * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java: implemented abstract methods of getDefaultNegativeAnswer getDefaultPositiveAnswer * netx/net/sourceforge/jnlp/security/dialogs/AppletWarningPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/CertsInfoPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/MissingALACAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/MissingPermissionsAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/MoreInfoPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/PasswordAuthenticationPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/SecurityDialogPanel.java: same and added javadoc to htmlWrap * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberDialog.java: added null check to (findRememberablePanel) * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: heavily adapted (all tests now use fakeQeue). Timeout moved to 10s. 2015-06-16 Jiri Vanek runtime.exec replaced by ProcessBuilder. All waits for proeces amde safe * netx/net/sourceforge/jnlp/Launcher.java: runtime.exec replaced by process builder. All streams correctly redirected * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: same * netx/net/sourceforge/jnlp/StreamEater.java: no longer used, removed * netx/net/sourceforge/jnlp/util/StreamUtils.java: Added new utility method waitForSafely * netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java: now uses waitForSafely * netx/net/sourceforge/jnlp/services/XBasicService.java: same * netx/net/sourceforge/jnlp/util/logging/UnixSystemLog.java: same * tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java: same * netx/net/sourceforge/jnlp/util/logging/TeeOutputStream.java: cleaned whitespaces 2015-06-16 Jiri Vanek Removed dual panel in panel misleading declaration in AppTrustWarningDialog * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningDialog.java: no longer extends SecurityDdialog. Static methods are now only simple factory methods creating concrete extensions of AppTrustWarningPanel * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: now extends SecurityDialogPanel instead of JPanel. Removed SecurityDialog parent, now inherited, added call to super with securityDialog parameter 2015-06-16 Jiri Vanek Removed redeclared line.separator * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEntry.java: newline constructed using PlainTextFormatter.getLineSeparator() * netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java: same for append call * net/sourceforge/jnlp/util/logging/TeeOutputStream.java: same for lineSeparator * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorParsingTest.java: same for LINEBREAK * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PlainTextFormatter.java: constant of LINE_SEPARATOR removed, (getLineSeparator) now returns line.separator property, obtained via doPrivlidged block. (getNewLine) adapted 2015-06-16 Jiri Vanek Improved security package javadoc description * netx/net/sourceforge/jnlp/security/package-info.java: fixed linguistic issues in graph, added title, added description of implementing RememberableDialog 2015-06-12 Jiri Vanek Updated NEWS, added javadoc fo security package. Added changelog entry for last commit * NEWS: mentioned major work in last month and half * netx/net/sourceforge/jnlp/security/package-info.java: new file, describing flow of SecurityDialogMessage * ChangeLog: added content to previous item 2015-06-12 Jiri Vanek Implemented general solution for remembering of various dialogues * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java: removed columns for separate remember actions. Replaced by single column with all remembered actions. * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java: same * netx/net/sourceforge/jnlp/resources/Messages.properties: removed APPEXTSECunsetAppletAction, APPEXTSECguiTableModelTableColumnActionUA, APPEXTSECguiTableModelTableColumnActionMatchALACA added APPEXTSECguiTableModelTableColumnRD * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: added null check for ics * netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java: removed final keyword from class definition. Extension is necessary for testing. (handleMessage) made protected and added logic for remembering actions. Unlocking of message moved to unlockMessagesClient method. * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: (showPartiallySignedWarningDialog) moved to return YesNoSandbox * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java: same in (doPrivileged) * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java: adapted imports * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionStorage.java: All usages of id retyped from int to Class extends RememberableDialog * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: Class rewritten to handle new saving/loading schema. Support for legacy structure kept. * netx/net/sourceforge/jnlp/security/dialogresults/AccessWarningPaneComplexReturn.java: adapted to be able to read various malformed shortcut definitions. Removed RemeberType * netx/net/sourceforge/jnlp/security/dialogresults/BasicDialogValue.java: added various equals and hashcode methods. * netx/net/sourceforge/jnlp/security/dialogresults/Yes.java: made extendable, added toString * netx/net/sourceforge/jnlp/security/dialogresults/YesCancel.java: extends Yes * netx/net/sourceforge/jnlp/security/dialogresults/YesNo.java: extends Yes * netx/net/sourceforge/jnlp/security/dialogresults/YesNoCancel.java: extends YesNo * netx/net/sourceforge/jnlp/security/dialogresults/YesNoSandbox.java: extends YesNo * netx/net/sourceforge/jnlp/security/dialogresults/YesNoSandboxLimited.java: New class. Extends YesNoSandbox, but accept only YesNo by default. Used in AppTrustWarningPanel, which by default accept only YES and NO, but is extended by PartiallySignedAppTrustWarningPanel, which add also SANDBOX. * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java: implements RememberableDialog, removed RemeberType usage * netx/net/sourceforge/jnlp/security/dialogs/MissingALACAttributePanel.java: implements RememberableDialog * netx/net/sourceforge/jnlp/security/dialogs/MissingPermissionsAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/MatchingALACAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: uses class instead of id in additional info obtaining methods. * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/remember/ActionChoiceListener.java: removed,useless * netx/net/sourceforge/jnlp/security/dialogs/remember/AppSigningWarningAction.java: same * netx/net/sourceforge/jnlp/security/dialogs/remember/AppletSecurityActions.java: Class rewritten to handle new saving/loading schema. Support for legacy structure kept. * netx/net/sourceforge/jnlp/security/dialogs/remember/ExecuteAppletAction.java: removed Sandbox and Unset support. * netx/net/sourceforge/jnlp/security/dialogs/remember/RemeberActionProvider.java: new file, general interface to provide values for remembering/ * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberDialog.java: new file for general utility methods for remembering logic. * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberPanel.java: cleaned from legacy code * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberPanelResult.java: new file. Keeper of remembered information. * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberableDialog.java: interface identifying rememberable panels. * netx/net/sourceforge/jnlp/security/dialogs/remember/SavedRememberAction.java: new class. Wrapper around remembered value and remembered decision. * netx/net/sourceforge/jnlp/services/ServiceUtil.java: adapted call to showAccessWarningDialog * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: Added tests for saved actions, adapted old tests * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/LegacyUnsignedAppletActionStorageImplTest.java: copy of original UnsignedAppletActionStorageImplTest * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImplTest.java: new file, tests for parser of new schema * tests/netx/unit/net/sourceforge/jnlp/security/dialogs/remember/AppletSecurityActionsTest.java: adapted to new methods. * tests/netx/unit/net/sourceforge/jnlp/util/XDesktopEntryTest.java: adapted 2015-06-11 Jiri Vanek AppletSecurityActions, ExecuteAppletAction, AppletSecurityActionsTest moved to remember package * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java: adapted imports * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: same * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/MatchingALACAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/remember/AppSigningWarningAction.java: same * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberPanel.java same * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java same * netx/net/sourceforge/jnlp/security/SecurityDialog.java: (getPanel) extracted from (installPanel). It now throws exception if panel is about to be null. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java: used diamond * net/sourceforge/jnlp/security/appletextendedsecurity/AppletSecurityActions.java: moved to * netx/net/sourceforge/jnlp/security/dialogs/remember/AppletSecurityActions.java: here * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteAppletAction.java: moved to * netx/net/sourceforge/jnlp/security/dialogs/remember/ExecuteAppletAction.java: here * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/AppletSecurityActionsTest.java: moved to * tests/netx/unit/net/sourceforge/jnlp/security/dialogs/remember/AppletSecurityActionsTest.java: here 2015-06-11 Jiri Vanek make jnlpfile nearly mandatory argument of message and adapt various re-declarations accordingly * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: adapted to new api * netx/net/sourceforge/jnlp/security/SecurityDialog.java: all (SecurityDialog) made private (getPanel) adapted to new apis * netx/net/sourceforge/jnlp/security/SecurityDialogMessage.java: file made final and only default constructor is the one with file. * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: All constructions of SecurityDialogMessage adapted to new constructor. All sets, where information from file were dulicated, replaced by calls to file * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: showMissingPermissionsAttributeDialogue's constructor adapted. 2015-06-10 Jiri Vanek Security dialogs got, moreover, unified dealing with trustNone/All and headless * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: setTrustAll setTrustNone made public so it can be used in testing. * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: all calls to show security dialog now have correct introduction based on shouldPromptUser with resolution based on trustAll. (shouldPromptUser) now takes also headless to accounting. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: (checkUnsignedWithUserIfRequired) now react trustAll and trustNone (checkPartiallySignedWithUserIfRequired) now react also trustAll * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: new file, tests verifying adapted logic 2015-06-10 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesTest.java: fixed yesReadOk tests, which accidentally expected exception, but should not. 2015-06-09 Jiri Vanek Fixed issue, when desktop/menu shortcut created during -html mode, was not created like it * netx/net/sourceforge/jnlp/runtime/Boot.java: setHtml(true) used when command line contains html switch * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: added html field and setter and getter * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: (getContentsAsReader) now add -html if jnlpruntime.isHtml. Partially reworked logging of this method. * tests/netx/unit/net/sourceforge/jnlp/util/XDesktopEntryTest.java: added tests for new functionality * Changelog: occurence of tab asterix slash replaced by tab asterix space in file declarations 2015-06-09 Jiri Vanek Fixed bug when generated desktop icon was not matched and user was asked for recreation * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: (getShortcutTmpFile) (getLinuxDesktopIconFile) (getLinuxMenuIconFile) now generate file name by same way. By new method getDesktopIconFileName which is using sanitizing getDesktopIconName. 2015-06-01 Jiri Vanek SecurityDialog return type changed from Object (mostly int) to regular type * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: removed handling of integer results/inputs * netx/net/sourceforge/jnlp/security/JNLPAppVerifier.java: AppletAction usage replaced by YesNoSandbox * netx/net/sourceforge/jnlp/security/PluginAppVerifier.java: same * netx/net/sourceforge/jnlp/security/JNLPAuthenticator.java: usages of Object[] replaced by regular type * netx/net/sourceforge/jnlp/security/SecurityDialog.java: value changed from Object to DialogResult * netx/net/sourceforge/jnlp/security/SecurityDialogMessage.java: same for userResponse, class made public * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: removed redundant AppletAction and all to/from int/boolean conversion methods. All Object returns repalced by proper class/interface. Removed redundant showAppletWarning * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java: adapted to removed AppletAction and new BasicDialogValue * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java: added override annotations. * netx/net/sourceforge/jnlp/security/dialogresults/AccessWarningPaneComplexReturn.java: class extracted from netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPaneComplexReturn.java Made to implement DialogResult * netx/net/sourceforge/jnlp/security/dialogresults/BasicDialogValue.java: New class, which keeps together main utility methods and base classes of dialog return. * netx/net/sourceforge/jnlp/security/dialogresults/DialogResult.java: new class, main interface of SecurityDialog return. * netx/net/sourceforge/jnlp/security/dialogresults/NamePassword.java: Implementation of SecurityDialog for dialog asking for username and password. * netx/net/sourceforge/jnlp/security/dialogresults/SetValueHandler.java: extracted from SecurityDialogPanel. Have DialogResult instead of Object. It is base implementation of any click to button. * netx/net/sourceforge/jnlp/security/dialogresults/Yes.java: Wrapper for return from dialog, which can return only and only yes. * netx/net/sourceforge/jnlp/security/dialogresults/YesCancel.java: Wrapper for return from dialog, which can return only and only yes or cancel * netx/net/sourceforge/jnlp/security/dialogresults/YesNo.java: Wrapper for return from dialog, which can return only and only yes or no * netx/net/sourceforge/jnlp/security/dialogresults/YesNoCancel.java: Wrapper for return from dialog, which can return only and only yes, no or cancel * netx/net/sourceforge/jnlp/security/dialogresults/YesNoSandbox.java: Wrapper for return from dialog, which can return only and only yes, no or sandbox * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java: get rid of int buttons, replaced by YesNo. * netx/net/sourceforge/jnlp/security/dialogs/AppletWarningPane.java: get rid of int buttons, replaced by YesNoCancel. * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: get rid of int buttons, replaced by YesNoSadnbox * netx/net/sourceforge/jnlp/security/dialogs/CertsInfoPane.java: get rid of int buttons, replaced by Yes. * netx/net/sourceforge/jnlp/security/dialogs/MoreInfoPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/MissingALACAttributePanel.java: get rid of int buttons, replaced by YesNo. * netx/net/sourceforge/jnlp/security/dialogs/MissingPermissionsAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/PasswordAuthenticationPane.java: get rid of Object[] return, replaced by NamePassword. * netx/net/sourceforge/jnlp/security/dialogs/SecurityDialogPanel.java: get rid of inner SetValueHandler * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberPanel.java: included wrappers, which allows compilation and pass tests. Must be fixed in next changesets. * netx/net/sourceforge/jnlp/services/ServiceUtil.java: adapted to DialogResult * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: changed import * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: removed. Tests were checking int conversions from legacy model. * tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/AccessWarningPaneComplexReturnTest.java: new tests for new class * tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesCancelTest.java: same * tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesNoCancelTest.java: same * tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesNoSandboxTest.java: same * tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesNoTestTest.java: same * tests/netx/unit/net/sourceforge/jnlp/security/dialogresults/YesTest.java: same 2015-06-01 Jiri Vanek Remember panel extracted so it can be reused * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: now correctly behaves on Xtrustall * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: result is using diamond * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningDialog.java: Simplified constructors, getting dialogue and jnlpfile is all they need * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: extracted remember panel and related stuff. Made to use extracted one * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/MatchingALACAttributePanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/remember/ActionChoiceListener.java: new class. Extracted stuff from AppTrustWarningPanel * netx/net/sourceforge/jnlp/security/dialogs/remember/AppSigningWarningAction.java: new class. Extracted stuff from AppTrustWarningPanel * netx/net/sourceforge/jnlp/security/dialogs/remember/RememberPanel.java: new class. Extracted stuff from AppTrustWarningPanel * tests/netx/unit/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanelTest.java: minor, adapted to match current codebase 2015-05-27 Jiri Vanek Improved caching of files obtained via query * netx/net/sourceforge/jnlp/cache/CacheUtil.java: now consider also query(if any) when creating file-name for item to be cached * tests/netx/unit/net/sourceforge/jnlp/cache/CacheUtilTest.java: fixed old tests due to change and added two new tests to test change. * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceDownloaderTest.java: removed unused import. 2015-05-22 Jiri Vanek Comments in deployment.properties now persists saving via itweb-settings * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: (loadComments) new method. Saves every line starting with # char except date and DEPLOYMENT_COMMENT. (load) This method is called before every load, and read lines are stored. (save) Saved comments are inserted to other comments before call to store. * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: (countOccurences) made public so it can be reused * tests/netx/unit/net/sourceforge/jnlp/config/DeploymentConfigurationTest.java: added tests to verify preserving of comments and non-multiplying date and DEPLOYMENT_COMMENT 2015-05-22 Jiri Vanek Removed garbage from htmls' width and height * netx/net/sourceforge/jnlp/runtime/html/AppletParser.java: new method (sanitizeSize) which remove all non digit content from string * tests/netx/unit/net/sourceforge/jnlp/runtime/html/AppletParserTest.java: new file, test for (sanitizeSize) 2015-04-30 Jie Kang Fix policyeditor file flag to work when used standalone * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (main): filepath no longer set to null when file flag has parameter and there is no main argument 2015-04-28 Jiri Vanek Fixed incorrect usage of apostrophes in intro generation * Makefile.am: (stamps/generate-docs.stamp) fixed redundant false in version appearing in doc intro 2015-04-28 Jiri Vanek 1.6 post-branch operations * configure.ac: bumped (AC_INIT) to 1.7pre * NEWS: Added 1.7 section, Bumped date of 1.6 release to 2015 2015-04-28 Jiri Vanek * README: updated to match current state. 2015-04-28 Jiri Vanek Improved JDK9 detection * acinclude.m4: (IT_CHECK_FOR_JDK) if found jdk is link, then it is printed out also as resolved. (IT_CHECK_FOR_JRE) same, plus except classical JDK/jre verification, also modular JRE is checked. 2015-04-27 Lukasz Dracz Removed Executable Permissions from bash completion * icedteaweb-completion 2015-04-24 Jiri Vanek Fixed resource test to pass for CZ localization * tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java: added four more items to whitelist. 2015-04-24 Alexandr Kolouch Added Czech translation for 1.6. * netx/net/sourceforge/jnlp/resources/Messages_cs.propertie: added missing properties, adapted changed ones. 2015-04-24 Jiri Vanek Messages from TextsProvider moved to properties * netx/net/sourceforge/jnlp/resources/Messages.properties: added family ITWTB with fourproeprties. * netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java: is now using those properties instead of hardcoded values * netx/net/sourceforge/jnlp/util/docprovider/ItwebSettingsTextsProvider.java: * netx/net/sourceforge/jnlp/util/docprovider/PolicyEditorTextsProvider.java: now includes getFilesAppendix in (getFiles) 2015-04-24 Alexandr Kolouch * netx/net/sourceforge/jnlp/resources/Messages.properties: various improvements to default set. 2015-04-23 Jiri Vanek * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/testcases/PartiallySignedAppletManifestSpecifiesSandboxTests.java: used new MultipleDeploymentPropertiesModifier * tests/test-extensions-tests/net/sourceforge/jnlp/tools/DeploymentPropertiesModifierTest.java: add new inner class, MultipleDeploymentPropertiesModifier able to gather and apply/revert in bulk normal DeploymentPropertiesModifier * tests/test-extensions/net/sourceforge/jnlp/tools/DeploymentPropertiesModifier.java: Added testMultipleDeploymentPropertiesModifier, test to new MultipleDeploymentPropertiesModifier class 2015-04-23 Jiri Vanek * javac.in: removed. Its usage gone out with removal of bootstrap. * configure.ac: removed dependence on it 2015-04-23 Jiri Vanek Fixed loading of deployment.properties during 1.4 migration to 1.5 fs. * netx/net/sourceforge/jnlp/config/Defaults.java: hardcoded value of ALL fixed * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: reused first line of transfer moved to (TRANSFER_TITLE). Added possibility to specify destination of source file. (move14AndOlderFilesTo15Structure) order of moving files reorder, so deployment.properties go first and sensitive files after, setupable files first. Used getDefaultFullPAth insted of getFullPath where suitable (everywhere in this method) * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: encapsulated security string, generalized getAllFiles,a dd getAllSwcurityFiles * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: Removed redundant calls to DeplymentConfiguration. Used PathsAndFiles rather. * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: same * netx/net/sourceforge/jnlp/security/appletextendedsecurity/AppletStartupSecuritySettings.java: * tests/reproducers/simple/simpletest1/testcases/XDGspecificationTests.java: (fakeExtendedSecurity) adapted to new deployment.manifest.attributes.check schema 2015-04-20 Lukasz Dracz Add Tab Completion for icedtea-web * Makefile.am: Added to tarball generated * icedteaweb-completion: Added bash completion file 2015-04-20 Lukasz Dracz add Boolean Cast for JarCertVerifier * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: Added a Boolean cast that was needed for Java 7 to work 2015-04-20 Jiri Vanek Added support for jdk7 and javafx * launcher/launchers.in: noted lib/jfxrt.jar 2015-04-15 Jiri Vanek Fixed javadoc warnings and errors to pass doclint * /netx: nearly all files in main package get rid of doclint errors 2015-04-15 Jiri Vanek jnlp-signing mechanism now uses general parser (and so also tagsoup if enabled) * netx/net/sourceforge/jnlp/JNLPMatcher.java: removed redundant code to laod xmls and used Parser.getRootNode rather. Added same brackets to if statements. Added parameter of ParserSettings to * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: same. * tests/netx/unit/net/sourceforge/jnlp/JNLPMatcherTest.java: refactored to autoclseable and to never use tagsoup. * tests/netx/unit/net/sourceforge/jnlp/JNLPMatcherTestMallformedAllowed.java: new file, copy of JNLPMatcherTest. But always using tagsoup (if available) 2015-04-15 Jiri Vanek KeystorePasswordAttempter moved to outer class. Added comments and prevention about possible null password writing to keystore. KeystorePasswordAttempter made much more object-like. * netx/net/sourceforge/jnlp/resources/Messages.properties: added KSresultUntilNow KSinvalidPassword KSheadlesWarning KSnwPassHelp keys for keystore prompt * netx/net/sourceforge/jnlp/security/KeyStores.java: operation on keystores moved from stream to file * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same + removal of unused fields and imports * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: same * netx/net/sourceforge/jnlp/security/SecurityUtil.java: same. Also get rid of default password - moved to KeystorePasswordAttempter. (initKeyManagerFactory) (setKeyEntry) (getKey) (loadKeyStore) (storeKeyStore) moved from enum and switch to runnable like approach. * netx/net/sourceforge/jnlp/security/KeystorePasswordAttempter.java: moved from inner 2015-04-15 Jiri Vanek User is now prompted on unknown password to keystore * netx/net/sourceforge/jnlp/security/KeyStores.java: Operations above keystores moved to calls to SecurityUtil.storeKeyStore/loadKeyStore * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: same * netx/net/sourceforge/jnlp/security/SecurityUtil.java: (initKeyManagerFactory) (setKeyEntry) (getKey) (loadKeyStore) (setKeyEntry/storeKeyStore) refactored to use unified call to unlockKeystore. Added inner class KeystorePasswordAttempter which is responsible for attempting several passwords and to ask user if fail. 2015-04-13 Jie Kang Increase server timeout for remote reproducers * tests/reproducers/custom/remote/testcases/RemoteApplicationTests.java: Timeout changed to 20s instead of default 10s 2015-04-13 Jie Kang Kill processes in Integration Tests more cleanly; revised * Makefile.am: remove all instances of softkiller (softkiller no longer works) * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java: use SIGTERM instead of SIGINT, don't destroy process after sending signal * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: reduce timeout from 20 seconds to 10 * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java: remove usage of softkiller to close tabs * tests/softkiller/Makefile: * tests/softkiller/softkiller.c: remove softkiller 2015-04-13 Jie Kang Add reproducers for jnlp_href attribute * tests/reproducers/simple/JnlpHrefAttribute/resources/JnlpHrefAttribute.html: * tests/reproducers/simple/JnlpHrefAttribute/resources/JnlpHrefAttribute.jnlp: * tests/reproducers/simple/JnlpHrefAttribute/srcs/JnlpHrefAttribute.java: * tests/reproducers/simple/JnlpHrefAttribute/testcases/JnlpHrefAttributeTest.java: Added test for firefox/opera that succeeds with attribute and test for midori/epiphany that fails with attribute 2015-04-13 Jiri Vanek set single place for keystore operations * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: usage of keystore moved to utility method * netx/net/sourceforge/jnlp/security/CertificateUtils.java: same * netx/net/sourceforge/jnlp/security/KeyStores.java: same * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: same * netx/net/sourceforge/jnlp/security/SecurityUtil.java: added five new methods wrapping work on keystores 2015-04-13 Jiri Vanek Removed redundant occurrence of default keystore password * netx/net/sourceforge/jnlp/security/KeyStores.java: removed redundant DEFAULT_PASSWORD * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: call to KeyStores.getPassword replaced by SecurityUtil.getTrustedCertsPassword * netx/net/sourceforge/jnlp/security/CertificateUtils.java: same * netx/net/sourceforge/jnlp/security/SecurityUtil.java: same * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: same 2015-04-13 Jiri Vanek reverted "Kill processes in Integration Tests more cleanly" It needs to be revisited. 2015-04-10 Lukasz Dracz add DeploymentPropertiesModifierTests * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/testcases/PartiallySignedAppletManifestSpecifiesSandboxTests.java: Changed spelling of DeploymentPropertiesModifier * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedMatching.java Changed spelling of DeploymentPropertiesModifier * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/testcases/SignedAppletManifestSpecifiesSandboxTests.java Changed spelling of DeploymentPropertiesModifier * tests/test-extensions-tests/net/sourceforge/jnlp/tools/DeploymentPropertiesModifierTest.java: Added tests for DeploymentPropertiesModifier * tests/test-extensions/net/sourceforge/jnlp/tools/DeploymentPropertiesModifier.java: added proper spelling of this file * tests/test-extensions/net/sourceforge/jnlp/tools/DeploymentPropetiesModifier.java: removed due to spelling error and added proper spelling of the same file 2015-04-10 Jie Kang Kill processes in Integration Tests more cleanly * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java: use SIGUSR1 instead of SIGINT, don't destroy process after sending signal * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: reduce timeout from 20 seconds to 10 * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java: remove usage of softkiller to close tabs (softkiller no longer works) 2015-04-10 Jiri Vanek ok/apply/cancel mechanism in itweb-settings fixed to work again. Added rest button for cache path. * netx/net/sourceforge/jnlp/config/InfrastructureFileDescriptor.java: added setValue and getFullPaths overloads with DeploymentConfiguration param to allow itweb-settings work with two copies of properties. * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: returned config. Calls to PathsAndFiles made with this config. * netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java: same * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java: Calls to PathsAndFiles made with config. * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: usableDiskSpace removed, and replaced by dynamic getter to react on change of cache dir. Added button resting cache to default. 2015-04-10 Jiri Vanek Cache now uses PathsAndFiles instances instead of various duplicates * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: using InfrastructureFileDescriptor instead of copied Files. Same with recentlyUsedPropertiesFile. Both made final private and accessible only via getter. (getRecentlyUsedPropertiesFile) redesigned, to use cached PropertiesFile. If underlying InfrastructureFileDescriptor changes, the cached PropertiesFile is closed and new created and returned. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: Are using getters from CacheLRUWrapper singleton to atomic approach. Not storing those values anymore. * netx/net/sourceforge/jnlp/config/InfrastructureFileDescriptor.java: Moved out from inner class in PathsAndFiles * netx/net/sourceforge/jnlp/config/PathsAndFiles.java:Lost InfrastructureFileDescriptor in favour of outer one. * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java: config made final * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsPane.java: same * netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/SecuritySettingsPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java: removed config * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: adapted to above * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java: moved to diamond * netx/net/sourceforge/jnlp/security/KeyStores.java: adapted to InfrastructureFileDescriptor * netx/net/sourceforge/jnlp/util/docprovider/ItwebSettingsTextsProvider.java: same * netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java: same * sun/applet/PluginProxySelector.java: same * tests/netx/unit/net/sourceforge/jnlp/security/KeyStoresTest.java: same * tests/test-extensions/net/sourceforge/jnlp/tools/DeploymentPropetiesModifier.java: same * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: is now using dummy InfrastructureFileDescriptor to allow fake CacheLRUWrapper tests * tests/netx/unit/net/sourceforge/jnlp/controlpanel/CommandLineTest.java: small fixes to unclear strings 2015-04-09 Lukasz Dracz fix lines displayed in javaws help * netx/net/sourceforge/jnlp/resources/Messages.properties: (JWSoptionsL1): modified (JWSoptionsL3): added * netx/net/sourceforge/jnlp/util/docprovider/JavaWsTextsProvider.java: added a third line for javaws help 2015-04-03 Lukasz Dracz Added tool for manipulating deployment-properties during tests run * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/testcases/PartiallySignedAppletManifestSpecifiesSandboxTests.java: is now using DeploymentPropetiesModifier * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedMatching.java: same * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/testcases/SignedAppletManifestSpecifiesSandboxTests.java: same * tests/test-extensions/net/sourceforge/jnlp/tools/DeploymentPropetiesModifier.java: new tool to manipulate deployment properties in runtime. 2015-04-02 Jiri Vanek InfrastructureFileDescriptor got setter * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: minor formatting * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: all getFullPath replaced by getPropertiesKey, and instead of config, value, returns key. Added setValue, solution. Adapted getFullPath. (gcpd) removed. (getDir) removed - is now confusing. * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java: setter into property KEY_USER_LOG_DIR replaced by setter into LOG_DIR. * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: same for KEY_USER_CACHE_DIR -> CACHE_DIR * netx/net/sourceforge/jnlp/util/docprovider/ItwebPluginTextProvider.java: All browser directories adapted to missing getDir. * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: KEY_USER_CACHE_DIR -> CACHE_DIR * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceDownloaderTest.java: KEY_USER_CACHE_DIR -> CACHE_DIR * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: KEY_USER_CACHE_DIR -> CACHE_DIR 2015-04-02 Jiri Vanek All reading from file properties replaced by getter from PathsAndFiles * netx/net/sourceforge/jnlp/cache/CacheUtil.java: read from KEY_USER_NETX_RUNNING_FILE property replaced by get from MAIN_LOCK. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: similarly for KEY_USER_PERSISTENCE_CACHE_DIR -> PCACHE_DIR and KEY_USER_LOG_DIR -> LOG_DIR and KEY_USER_TMP_DIR -> TMP_DIR * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: added overrides of getFullPath to RECENTLY_USED_FILE, SYS_CER and all USER keystores. All fields in InfrastructureFileDescriptor made private final, and reasonable ones got protected setters. * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: KEY_USER_CACHE_DIR -> CACHE_DIR, KEY_USER_NETX_RUNNING_FILE -> MAIN_LOCK. Config param removed. * netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java: adapted to configless constructor * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: same * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java: KEY_USER_LOG_DIR -> LOG_DIR, config made final. * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: removed redundant boxing, KEY_USER_CACHE_DIR -> CACHE_DIR * netx/net/sourceforge/jnlp/runtime/JNLPPolicy.java: KEY_USER_SECURITY_POLICY -> JAVA_POLICY. getPolicyFromConfig splited into getPolicyFromConfig and getPolicyFromUrl * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: read from KEY_USER_NETX_RUNNING_FILE property replaced by get from MAIN_LOCK. * netx/net/sourceforge/jnlp/security/KeyStores.java: removed config field and its filling. (getKeyStoreLocation) all keystores properties replaced by correct PahtsAndFiles. * netx/net/sourceforge/jnlp/security/SecurityUtil.java: adapted to getKeyStoreLocation changed return type * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java: same * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: same * netx/net/sourceforge/jnlp/services/SingleInstanceLock.java: KEY_USER_LOCKS_DIR -> LOCKS_DIR * netx/net/sourceforge/jnlp/services/XPersistenceService.java: KEY_USER_PERSISTENCE_CACHE_DIR -> PCACHE_DIR * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: KEY_USER_TMP_DIR -> TMP_DIR * netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java: adapted to existence of file protocol by new method removeFileProtocol * netx/net/sourceforge/jnlp/util/logging/LogConfig.java: KEY_USER_LOG_DIR -> LOG_DIR * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: KEY_USER_CACHE_DIR -> CACHE_DIR * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceDownloaderTest.java: same * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: same * tests/netx/unit/net/sourceforge/jnlp/security/KeyStoresTest.java: adapted to getKeyStoreLocation 2015-04-02 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/security/KeyStoresTest.java: new file, added tests for getKeyStoreLocation API. * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: minor cleanup on redundant autoboxing. 2015-04-01 Jiri Vanek PathsAndFiles definitions made aware of deployment.properties which can change them * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: (CacheLRUWrapper) used gette rinstead of field for RECENTLY_USED_FILE * netx/net/sourceforge/jnlp/config/Defaults.java: all getFullPath replaced by getDefaultFullPath. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: removed read from properties and repalced by getters from PathsAndFiles. * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: same * tests/reproducers/signed/CacheReproducer/testcases/CacheReproducerTest.java: same * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: Or setup-able InfrastructureFileDescriptor now can return their non-default value by overriden getFullPath and reading from properties. * netx/net/sourceforge/jnlp/resources/Messages.properties: added BUTControlledBy of Controlled by and BUTmodified of modified * netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java: now uses new Messages.properties keys 2015-03-31 Jiri Vanek PolicyEditor now honor verbose switch * netx/net/sourceforge/jnlp/OptionsDefinitions.java: OPTIONS.VERBOSE added to list of PolicyEditor's commands * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor: (main) set debug to true, if verbose is presented. 2015-03-31 Jiri Vanek * Messages.properties: (FILElogs) adapted to more suit current docs. 2015-03-25 Lukasz Dracz * tests/reproducers/custom/TrustedOnlyAttribute/testcases/TrustedOnlyAttributeTest.java: added BeforeClass and AfterClass hunks which adapt USER_DEPLOYMENT_FILE for test's needs. 2015-03-27 Jiri Vanek * Makefile.am: (stamps/generate-docs.stamp) fixed redundant false in version appearing in docs 2015-03-26 Lukasz Dracz fix clean to replace new Manifest Attributes messages * tests/reproducers/custom/remote/testcases/RemoteApplicationSettings.java: Changed clean to replace the two new Manifest Attributes Checker messages instead of the old deleted Manifest Attributes Checker message 2015-03-25 Lukasz Dracz Change Manifest Attributes Checker to check combinations of attributes * netx/net/sourceforge/jnlp/config/BasicValueValidators.java: Added MultipleStringValueValidator that validates single and combination of string values. Added ManifestAttributesCheckValidator uses MultipleStringValueValidator with the appropriate Manifest Attributes options * netx/net/sourceforge/jnlp/config/Defaults.java: Changed manifest attributes check validator to ManifestAttributesCheckValidator and made have default value of ALL * netx/net/sourceforge/jnlp/resources/Messages.properties: (MACDisabledMessage, MACCheckSkipped): added * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: MANIFEST_ATTRIBUTES_CHECK enum added, changed logic to allow combinations of attributes to be checked, Translator.R made into static import * tests/netx/unit/net/sourceforge/jnlp/config/BasicValueValidatorsTests.java: (testMultipleStringValueValidator, testMultipleStringValueValidatorCantMixSingleAndComboValues, testManifestAttributesCheckValidator): added * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPFileTest.java: Changed to work with new ManifestAttributesChecker, set to ALL which is equivalent to the old value of true * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/testcases/PartiallySignedAppletManifestSpecifiesSandboxTests.java: Added BeforeClass and AfterClass handling of deployment.properties file to ensure PERMISSIONS and ALLOW_UNSIGNED are active for tests to pass then reverted to previous values for next tests * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/testcases/SignedAppletManifestSpecifiesSandboxTests.java: Added BeforeClass and AfterClass handling of deployment.properties file to ensure PERMISSIONS is set for tests to pass then reverted to previous values for next tests 2015-03-23 Lukasz Dracz Fix itweb-settings set command to allow duplicate strings * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java: Fixed a bug where the set command would only use the first of duplicate strings due to the use of index for sorting into keys and values * tests/netx/unit/net/sourceforge/jnlp/controlpanel/CommandLineTest.java: Added tests for set command 2015-03-18 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (main) Fixed a bug where a local string variable was compared to the empty string using ==. 2015-03-18 Jiri Vanek * NEWS: mentioned documentation. -html and menu shortcuts moved to general. 2015-03-18 Jiri Vanek Added support for Entry-Point manifest * netx/net/sourceforge/jnlp/JNLPFile.java: defined ENTRY_POINT. Added methods to get raw manifest, or list of possible entry points. * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: Added logic to check real main class against manifest attribute. * tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java: Existing tests made aware about Entry-Point. Added tests for splitEntryPoints. All occurences of claslaoder repalced by classloader. 2015-03-17 Jie Kang Escape apostrophes in Messages.properties * netx/net/sourceforge/jnlp/resources/Messages.properties: * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: * netx/net/sourceforge/jnlp/resources/Messages_de.properties: Apostrophes escaped using two apostrophes as specified in MessageFormat java class. Used in Translator class to format values * tests/netx/unit/net/sourceforge/jnlp/runtime/TranslatorTest.java: Test added making sure escaped apostrophes work properly * tests/reprocers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedMatching.java: (getMessage) Uses MessageFormat to format values from Messages.properties 2015-03-17 Jiri Vanek Removed forgotten occurrence of netx-dist-tests-whitelist and so fixing make dist * Makefile.am: (EXTRA_DIST) lost netx-dist-tests-whitelist. 2015-03-17 Jie Kang Fix resource loading in CodebaseManifestEntry reproducers * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/testcases/CodeBaseManifestEntrySignedMatching.java: Now uses Class.getResourceAsStream which will use system class loader if necessary 2015-03-13 Jiri Vanek Fixing xdg tests * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: some elements made public - DEPLOYMENT_SUBDIR_DIR and XDG*VAR * tests/reproducers/simple/simpletest1/testcases/XDGspecificationTests.java: fixed issues with permissions attribute dialogue (faked deployment.properties everywhere), fixed issues with same key in set copmmand everywhere, added test for duplicated key in set, fixed issue with remianing icons and generated jnlps 2015-03-13 Jiri Vanek Docs now include possible options for each property * netx/net/sourceforge/jnlp/resources/Messages.properties: added key of IWSpossible * netx/net/sourceforge/jnlp/util/docprovider/ItwebSettingsTextsProvider.java: added hunk adding posibilites behainf each property 2015-03-13 Jiri Vanek * tests/reproducers/signed/GifarBase/resources/gifar_application.jnlp: removed dangling element * tests/reproducers/signed/GifarBase/srcs/GifarMain.java: formating * tests/reproducers/signed/GifarBase/testcases/GifarTestcases.java: used constants instead of hardcoded values * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: same 2015-03-10 Jiri Vanek Fixed locale tests * tests/reproducers/simple/LocalesTest/testcases/LocalesTestTest.java : not existing BOHelp replaced by BOHelp1. (getProperties) if used classlaoder is null then system one is used. 2015-03-10 Jiri Vanek Removed invalid URLs, empty codebases and enabled js tests for opera * tests/reproducers/simple/JSToJFuncParam/resources/jstoj-funcparam.jnlp * tests/reproducers/simple/JSToJFuncParam/testcases/JSToJFuncParamTest.java * tests/reproducers/simple/JSToJFuncResol/resources/jstoj-funcresol.jnlp * tests/reproducers/simple/JSToJFuncReturn/resources/jstoj-funcreturn.jnlp * tests/reproducers/simple/JSToJGet/resources/jstoj-get.jnlp * tests/reproducers/simple/JSToJGet/testcases/JSToJGetTest.java * tests/reproducers/simple/JSToJSet/resources/jstoj-set.jnlp * tests/reproducers/simple/JSToJSet/testcases/JSToJSetTest.java * tests/reproducers/simple/JSToJTypeConv/resources/jstoj-typeconv.jnlp * tests/reproducers/simple/JSToJTypeConv/testcases/JSToJTypeConvTest.java * tests/reproducers/simple/JToJSString/testcases/JToJSStringTest.java * tests/reproducers/simple/JavascriptFuncParam/resources/javascript-funcparam.jnlp * tests/reproducers/simple/JavascriptFuncParam/testcases/JavascriptFuncParamTest.java * tests/reproducers/simple/JavascriptFuncReturn/resources/JavascriptFuncReturn.jnlp * tests/reproducers/simple/JavascriptFuncReturn/testcases/JavascriptFuncReturnTest.java * tests/reproducers/simple/JavascriptGet/resources/javascript-get.jnlp * tests/reproducers/simple/JavascriptGet/testcases/JavascriptGetTest.java * tests/reproducers/simple/JavascriptSet/resources/javascript-set.jnlp * tests/reproducers/simple/JavascriptSet/testcases/JavascriptSetTest.java * tests/reproducers/simple/JavawsAWTRobotFindsButton/resources/javaws-awtrobot-finds-button.jnlp * tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/javaws-awtrobot-usage-sample.jnlp 2015-03-05 Jie Kang Use jnlp_href parameter instead of attribute in applet tag for reproducers. This is to maintain compatibility with midori and epiphany browsers that don't support jnlp_href as an applet tag's attribute * tests/reproducer/simple/JSToJGet/resources/JSToJGet.html: * tests/reproducer/simple/JSToJSet/resources/JSToJSet.html: * tests/reproducer/simple/JavascriptFuncParam/resources/JavascriptFuncParam.html: * tests/reproducer/simple/JavascriptGet/resources/JavascriptGet.html: * tests/reproducer/simple/JavascriptSet/resources/JavascriptSet.html: All tests now use parameter tag for jnlp_href 2015-03-04 Jiri Vanek Fixed broken CacheUtil. * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: removed misleading one parameter constructor. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: adapted to new CacheLRUWrapper * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: adapted to new constructor. 2015-03-03 Jiri Vanek Changing enum CacheLRUWrapper singleton to instantiatible one. recently_used moved to PathsAndFiles. * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: changed form enum to class. Added testing constructors. Fields encapsualted and made final. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java:is now using PathsAndFiles.CACHE_DIR * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: defined CACHE_INDEX_FILE_NAME as recently_used and declared InfrastructureFileDescriptor RECENTLY_USED_FILE * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: moved to PathsAndFiles * netx/net/sourceforge/jnlp/resources/Messages.properties: added description of RECENTLY_USED_FILE, FILErecentlyUsed * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: now using fake instance * tests/reproducers/signed/CacheReproducer/testcases/CacheReproducerTest.java: same + fixed 2015-03-03 Jiri Vanek Fixed CacheReproducerTest and VersionedJarTest tests * tests/reproducers/signed/CacheReproducer/testcases/CacheReproducerTest.java: fixed * tests/reproducers/simple/VersionedJar__V1/testcases/VersionedJarTest.java: fixed * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: introduced executeJavawsClearCache shortcut method to executeJavawsHeadless 2015-03-03 Jie Kang Fix DeadLockTest reproducers * tests/reproducers/simple/deadlocktest/testcases/DeadLockTestTest.java: (testSimpletest1lunchFork), (testSimpletest1lunchNoFork) removed division by two in final assert 2015-03-02 Jie Kang Use temporary cache in PluginBridge unit tests * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: sets temporary cache in @BeforeClass and unsets in @AfterClass 2015-02-27 Jiri Vanek Silenced to verbose unittests * netx/net/sourceforge/jnlp/cache/ResourceDownloader.java: refactored to use try-with-resources * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: become NoStdOutErrTest * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceDownloaderTest.java: same * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: same * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java: same 2015-02-27 Jiri Vanek All manifests in reproducers' jars have now Application-Name attribute * Makefile.am: (stamps/netx-dist-tests-prepare-reproducers.stamp) added logic to include Application-Name: $reproducerName key: value to each non-custom manifest file * tests/reproducers/*/MANIFEST.MF*: all custom manifests enhanced by the same key: value. They do not relay on it. 2015-02-27 Jiri Vanek Fixed third party tests. * netx/net/sourceforge/jnlp/resources/Messages.properties: (JREversionDontMatch) don't changed to does not. The apostrophe was causing last variable to not expanding. * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: shared string moved to constant of MANIFEST_CHECK_DISABLED_MESSAGE * tests/reproducers/custom/remote/testcases/RemoteApplicationSettings.java: adapted to current state * tests/reproducers/custom/remote/testcases/RemoteApplicationTests.java: same 2015-02-25 Jiri Vanek * Makefile.am: netx-dist-tests-whitelist mad mandatory and will be removed 2015-02-24 Jiri Vanek Marking threads in ResourceTracker's threadPool as daemons, so the dont prevent shutdown. * netx/net/sourceforge/jnlp/cache/CachedDaemonThreadPoolProvider.java: new file, implementation of ExecutorService singleton, whose threads are daemons. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (startDownloadThread) now calls CachedDaemonThreadPoolProvider 2015-02-18 Jiri Vanek Added menuentry to PolicyEditor to allow quicky open default java.policy * netx/net/sourceforge/jnlp/resources/Messages.properties: added keys of PEOpenDefaultMenuItem, PEOpenDefaultMenuItemMnemonic, PEOpenDefaultMenuItemAccelerator * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: added openDefaultButtonAction to open PathsAndFiles.JAVA_POLICY. Added openDefaultItem menu entry calling openDefaultButtonAction. 2015-02-17 Jie Kang Refactor initializeResources in ResourceDownloader. * netx/net/sourceforge/jnlp/cache/Resource.java: (isConnectable) new method checking if we can connect to the resources URL * netx/net/sourceforge/jnlp/cache/ResourceDownloader.java: (initializeResources), (initializeOnlineResource), (initializeFromURL), (initializeOfflineResource) refactored methods to handle offline and online cases separately * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (isConnectable) new method checking if we can connect to URL argument * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceDownloaderTest.java: (testDownloadLocalResourceFails): test modified to expect error status on failure instead of uncaught exception 2015-02-13 Jiri Vanek Fixed few small errors in jacoco processing after removal of bootstrap. * Makefile.am: (JACOCO_CLASSPATH) changed to be space delimited, to be used via joinsegments. (JACOCO_OPERATOR_EXEC) using joinsegments on JACOCO_CLASSPATH. (UNIFIED_CLASSPATH) split to new *_SEGMENTS and call of joinsegments on it. Similarly with UNIFIED_JACOCO_CLASSPATH/(_SEGMENTS). Adapted PLUGIN_COVERAGE_BOOTCLASSPATH. (stamps/compile-jacoco-operator.stamp) uses composeclasspath on JACOCO_CLASSPATH. (stamps/compile-jacoco-operator.stamp) nw_bootclasspath adapted. (stamps/run-reproducers-test-code-coverage-jacoco.stamp) added missing comma in CLASSPATH=$(call joinsegment, ... ) call. 2015-02-13 Jie Kang * .hgignore: added netx-dist-tests-whitelist to prevent unintentional commits 2015-02-13 Jiri Vanek Added better support for not-matching detected jdk when version forced. * netx/net/sourceforge/jnlp/JREDesc.java: is using JreVersion instead of pure Version * netx/net/sourceforge/jnlp/Parser.java: (getJRE) JREDesc is constructed with JreVersion * netx/net/sourceforge/jnlp/Version.java: made immutable, added specialized inner class, tho handle JRE version. * /tests/netx/unit/net/sourceforge/jnlp/VersionTest.java: added tests for main cases cornerCases, testMatchesMinus, multiplePossibilities and tests for new class jreVersionTestOk, jreVersionTestFails1, jreVersionTestFails2. * netx/net/sourceforge/jnlp/resources/Messages.properties: added JRE family of warnings for JreVersion 2015-02-11 Jiri Vanek Saving/Loading of icon made resistant against URLs with invalid/without target * netx/net/sourceforge/jnlp/cache/CacheUtil.java: getCachedResource split into getCachedResourceFile and getCachedResourceURL (which is jsut transforming file from getCachedResourceFile to URL) * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: (cacheIcon) calls to getCachedResource replaced by calls to getCachedResourceURL and added null checks. New method of cantCache to unify NonFileProtocolException throw. 2015-02-09 Jie Kang Fix javascript url error in JSToJSet reproducer. * tests/reproducers/simple/JSToJSet/resources/JSToJSet.html: added quotes around scriptable paramter. * tests/reproducers/simple/JSToJSet/resources/JSToJava_Set.js: decode url before using it * tests/reproducers/simple/JSToJSet/testcases/JSToJSetTest.java: KnownToFail annotations removed from tests that now pass correctly. 2015-02-06 Fridrich Strba Removed bootstrap, made buildable with modular JDK * AUTHORS: Fridrich added * Makefile.am: defined composeclasspath to create always valid classpath elements EMMA_JAVA_ARGS and EMMA_MODIFIED_FILES renamed to COVERAGE_JAVA_ARG and COVERAGE_MODIFIED_FILES. Removed RHINO_RUNTIME, BOOT_DIR. PLUGIN_RUNTIME renamed to PLUGIN_JAR. All manual constructions of classpath replaced by composeclasspath. All BOOT_ definition replaced by SYSTEM_JRE_DIR and SYSTEM_JDK_DIR. Removed all legacy emma targets. Removed all bootstrap targets. * acinclude.m4: added check for jdk9 * configure.ac: removed check for emma * plugin/icedteanp/IcedTeaNPPlugin.cc: added support for jdk9 mimetypes * tests/test-extensions/net/sourceforge/jnlp/tools/CodeSignerCreator.java: made aware of jdk9 2015-02-06 Jiri Vanek Also javaws.png icon is being installed in make install. * Makefile.am: declared ICONS_DEST_DIR with value pointing to icons dir (install-exec-local) ICONS_DEST_DIR added to list of created directories javaws.png installed into ICONS_DEST_DIR. (uninstall-local) javaws.png removed from ICONS_DEST_DIR. 2015-02-02 Omair Majid * configure.ac: Search for hamcrest jar. * Makefile.am: Initialize JUNIT_RUNTIME with JUNIT_JAR and/or HAMCREST_JAR. Adjust all code using JUNIT_JAR to use JUNIT_RUNTIME or HAMCREST_JAR explicitly. 2015-01-30 Jie Kang Remove KnownToFail annotation from JToJSString reproducer tests. * tests/reproducers/simple/JToJSString/testcases/JToJSStringTest.java: (StringArrayTest)(jnlpStringArrayAppletTest): annotations removed 2015-01-29 Jie Kang Fix accessing Java array elements from Javascript. PR1298. Fix provided by Marcin Cieslak * AUTHORS: Add Marcin Cieslak to authors. * NEWS: Add fix to news * plugin/icedteanp/IcedTeaPluginUtils.cc: (javaObjectResultToNPVariant) add jclass_name parameter to javaObjectResultToNPVariant function and use to determine type of object. 2015-01-28 Jie Kang Refactor initialize/download runnable out of ResourceTracker and add tests * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: moved Downloader runnable into ResourceDownloader along with initialize and download functions and their sub-functions. Removed prefetchTracker system and queue. Moved downloadOptions into Resource.java. * netx/net/sourceforge/jnlp/cache/Resource.java: added downloadOptions field and getter/setter * netx/net/sourceforge/jnlp/cache/ResourceDownloader.java: (getUrlResponseCode), (getUrlResponseCodeWithRedirectonResult) (initializeResource), (findBestUrl), (downloadResource), (getDownloadConnection), (downloadPackGzFile), (downloadGZipFile), (downloadFile), (storeEntryFields), (writeDownloadToFile)(uncompressGzip), (uncompressPackGz): new Runnable class for initializing and downloading resources. Code from ResourceTracker.java * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: tests for downloading/initializing functions and their subfunctions moved to ResourceDownloaderTest.java * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceDownloaderTest.java: relevant tests from ResourceTrackerTest.java moved here. (testDownloadResource), (testDownloadPackGzResource) (testDownloadVersionedResource), (testDownloadVersionedPackGzResource) (testDownloadLocalResourceFails), (testDownloadNotExistingResourceFails): New tests added 2014-01-23 Jiri Vanek Returned accidentally removed creation of shortcuts for jnlp applications. * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java: filling of AccessWarningPaneComplexReturn no longer depnds on existence of htmlPanels. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: (BROWSERS) opera added to list of recognized browsers 2014-01-22 Jie Kang Add quotes to Docs paths in Makefile.am * Makefile.am:(install-data-local)(stamps/generate-docs.stamp) paths have quotes "" around them 2014-01-21 Lukasz Dracz Change PolicyEditor to use OptionParser * netx/net/sourceforge/jnlp/OptionsDefinitions.java * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (argsToMap): removed * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java: (testArgsToMap): removed 2014-12-20 Jiri Vanek Added -html switch for javaws to run applets out of browser in applets sandbox * Makefile.am: if plugin is enabled, then plugin.jar is placed to (both)classpaths * NEWS: mentioned -html switch * netx/net/sourceforge/jnlp/Launcher.java: removed unused imports * netx/net/sourceforge/jnlp/MalformedXMLParser.java: same, also (xmlizeInputStream) made public static * netx/net/sourceforge/jnlp/NetxPanel.java: used diamonds, constructor is accepting plugin bridge, appletInstance got geter, (ourRunLoader) initialize PuginBridge if it is not set in advance. Logic to init it. moved to separate method (init). * netx/net/sourceforge/jnlp/OptionsDefinitions.java: implemented -html. Now takes one or more args. * netx/net/sourceforge/jnlp/Parser.java: made public, static getUrl separated from internal getUrl. reused MalformedXMLParser and XMLParser classes moved to String constants. * netx/net/sourceforge/jnlp/PluginBridge.java: params made final and getter added. * netx/net/sourceforge/jnlp/PluginParameters.java: Removed hashtable * netx/net/sourceforge/jnlp/resources/Messages.properties: BNoCodeOrObjectApplet fixed (mentioned jnlp_href), added HTMLnoneFound, HTMLmoreThenOne. Adapted BOHtml * netx/net/sourceforge/jnlp/runtime/Boot.java: (getMainFile) now supports html init moved out of (run). Logic to lunch javaws moved to separate class * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: minor formating * netx/net/sourceforge/jnlp/util/optionparser/OptionParser.java: added fnuction to allow element addition to allow minor cheating if needed. * netx/net/sourceforge/nanoxml/XMLElement.java: removed hashtable, used diamonds, final and try-with-resources * netx/sun/applet/AppletViewerPanelAccess.java: Copied map to hashtable in super, added special hack to access AppletContext for out-of-browser applets. * plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java: can pass PluginBridge inside. * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java: removed hashtable, used string in switches, used diamonds * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: some logic extracted to initialize. Removed hashtable. * plugin/icedteanp/java/sun/applet/PluginMain.java: Removed hashtable. Init logic moved to more methods (initSecurityContext). New method javawsHtmlMain to encapsulate all plugin.jar calls. * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java: Added inner DummyHandler doing nothing for -html run. * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: final possible fields made final; * tests/netx/unit/net/sourceforge/jnlp/PluginParametersTest.java: hashtable removal. * netx/net/sourceforge/jnlp/JNLPSplashScreen.java: enabled hot swap of file, enabled switch to error screen. * netx/net/sourceforge/jnlp/runtime/HtmlBoot.java: new class, contains logic to lunch from html * netx/net/sourceforge/jnlp/runtime/JnlpBoot.java: new class, into which original logic from boot.run was moved. * netx/net/sourceforge/jnlp/runtime/html/AppletExtractor.java: new class, responsible for parsing of html page and search for applets * netx/net/sourceforge/jnlp/runtime/html/AppletParser.java: new class, responsible for construction of PluginBridge from parsed xml (applet-like) element * netx/net/sourceforge/jnlp/runtime/html/AppletsFilter.java: new class, responsible for providing correct applets from page * netx/net/sourceforge/jnlp/runtime/html/ElementValidator.java: new simple interface used for searching in html document, to fire if element is/is not appelt * netx/net/sourceforge/jnlp/util/Reflect.java: this class is long unused. removed. 2014-12-19 Jiri Vanek * NEWS: mentioned menus 2014-12-19 Lukasz Dracz IcedTea-Web settings made to use OptionParser * netx/net/sourceforge/jnlp/OptionsDefinitions: HELP split to HELP1 and HELP2 HELP1 for javaws and policyediotr, HELP2 for itweb settings. SET changed to EVEN_NUMBER_SUPPORTS_EQUALS_CHAR type. ItwebSettings added VERBOSE * netx/net/sourceforge/jnlp/controlpanel/CommandLine: Rewritten touse OptionParser Fixed usage of verbose. * netx/net/sourceforge/jnlp/resources/Messages.properties: adapted IBOList, IBOGet IBOInfo, IBOSet, IBOReset, IBOCheck. Added OPUnevenParams, CLUnexpectedNumberOfCommands. BOHelp removed, and replaced by its copy BOHelp1. Added BOHelp2. * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: BOHelp removed, and replaced by its copy BOHelp1. * netx/net/sourceforge/jnlp/resources/Messages_de.properties: BOHelp removed, and replaced by its copy BOHelp1. * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: BOHelp removed, and replaced by its copy BOHelp1. * netx/net/sourceforge/jnlp/runtime/Boot: Used HELP1, and UnevenParameterException * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor: Used HELP1 * netx/net/sourceforge/jnlp/util/optionparser/OptionParser: Added handling of handleEvenNumberSupportingEqualsChar * netx/net/sourceforge/jnlp/util/optionparser/UnevenParameterException: new exception to be thrown in case of parsing of EVEN_NUMBER_SUPPORTS_EQUALS_CHAR * tests/netx/unit/net/sourceforge/jnlp/util/optionparser/OptionParserTest: Added tests for new functions 2014-12-19 Jie Kang * tests/test-extensions-tests/net/sourceforge/jnlp/TinyHttpdImplTest.java: added testLastModifiedHeader and testLastModifiedHeaderNotIncluded tests to test the LAs-Modified functionality in internal test server. 2014-12-18 Jiri Vanek Added support for generating shortcuts also for applets. * Makefile.am: javaws_bin and javaws_name passed to plugin * netx/net/sourceforge/jnlp/JNLPFile: (openURL) made public and added javadoc. Added unifying methods to generate title and vendor to be reused in jnlp and shortcuts: createJnlpVendorValue, createJnlpVendor, createJnlpTitleValue, createJnlpTitle. * netx/net/sourceforge/jnlp/OptionsDefinitions: Added unimplemented -html param * netx/net/sourceforge/jnlp/PluginBridge: able to be final fields made final. Jnlp href file is stored for debugging purposes. Added override annotations. Added possibility to generate jnlp xml file from itself (toJnlp). Added function (fixCommonIsuses) to enable usage of jnlpHref as mian jnlp file if used in shortcut. * netx/net/sourceforge/jnlp/config/PathsAndFiles: Declared GEN_JNLPS_DIR for saving generated jnlp shortcut. * netx/net/sourceforge/jnlp/resources/Messages.properties: declared ButAdvancedOptions, AlwaysForbidAction, BOHtml, FILEjnlps keys and whole family of EXAW keys. * netx/net/sourceforge/jnlp/runtime/ApplicationInstance: now use AccessWarningPaneComplexReturn instead of removed IconsCreationDescriptor. * netx/net/sourceforge/jnlp/security/SecurityDialogs: AccessWarningDialog family of methods adapted to handle boolean, integer and AccessWarningPaneComplexReturn * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane: reworked to support controls of shortcut creation and saving buttons. * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPaneComplexReturn: New class to store information about shortcuts and saving of result. Used from AccessWarningPane instead of integer. * netx/net/sourceforge/jnlp/util/StreamUtils: added possibility to control encoding. * netx/net/sourceforge/jnlp/util/XDesktopEntry: Included possibility to create shrotcut from applet, based on the AccessWarningPaneComplexReturn. Is trying to use also favico if no more suitable icons found. * netx/net/sourceforge/jnlp/util/optionparser/OptionParser: added to-be-removed hack to die if -html is found. * plugin/icedteanp/IcedTeaNPPlugin.cc: made aware of JAVAWS_BIN and JAVAWS_NAME * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest: tested class stripping and fixing of common issues. * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest: backedUpStream made final. * tests/netx/unit/net/sourceforge/jnlp/util/logging/JavaConsoleTest: Fixed timezone depending test to be timezone independent. 2014-12-17 Jie Kang Fixed typo in Makefile.am for test-extensions-tests compilation * Makefile.am: 2014-12-12 Jiri Vanek JDK7 like refactroing of JNLPClassLoader * netx/net/sourceforge/jnlp/config/Defaults.java: KEY_STRICT_JNLP_CLASSLOADER added * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: deployment.jnlpclassloader.strict declared * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: minor refactoring, and usage of KEY_STRICT_JNLP_CLASSLOADER instead of hardcoded strict=true. 2014-12-08 Jie Kang Added last-modified information to TinyHttpdImpl * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: (setSupportLastModified): used to set whether or not to return last-modified in header (isSupportingLastModified): whether or not currently returning last-modified (run): adds last-modified to header if enabled 2014-12-05 Jiri Vanek Added support for menu shortcuts. * netx/net/sourceforge/jnlp/Parser.java: used setMenu instead of addMenu * netx/net/sourceforge/jnlp/ShortcutDesc.java: removed isOnline support, added onDesktop and toMenu support. addMenu renamed to setMenu. Added deploymentJavawsShortcutToString, just for comfortableness. * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: Added support for XDG_DATA_HOME, declared ICONS_DIR and MENUS_DIR * netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java: removed duplicated logic of deploymentJavawsShortcutToString/comboboxItem and hardcoded calls to deployment. * netx/net/sourceforge/jnlp/resources/Messages.properties: added CPTabMenuShortcuts, FILEicons, FILEmenus. adapted SDesktopShortcut * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: removed retired fixme, now it do not ask for shortcut creation if menu or desktop entry exists. Added menu support and removed not-implemented call. Added temporary IconsCreationDescriptor quick fix for dialog->logic information transfer. Used where needed. * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: Added boolean and integer workarounds around showAccessWarningDialog * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java: Added menu support. Is now coding more sophisticated return value if are about desktop creations. * netx/net/sourceforge/jnlp/services/ServiceUtil.java: Adapted to showAccessWarningDialog changes * netx/net/sourceforge/jnlp/util/FileUtils.java: INVALID_CHARS extended for more linux one and most windows ones. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: added logic to place menu shortcut. * tests/netx/unit/net/sourceforge/jnlp/ParserBasic.java: Is now testing only presence of isOnline instead if it is used. 2014-11-28 Jie Kang * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java (testDownloadResource): new test for downloading basic resource 2014-11-25 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: (checkAll) permissions attribute is now also skipped when attribute checks are disabled 2014-11-25 Jiri Vanek * netx/net/sourceforge/jnlp/Launcher.java: (fromUrl) file from href get substituted codebase from previous one if it is missing in new one. 2014-11-25 Jie Kang Fixed newly failing unit test: JavaConsoleTest:CreatePluginHeaderTestNotOK * tests/netx/unit/net/sourceforge/jnlp/util/logging/JavaConsoleTest.java (CreatePluginHeaderTestNotOK): Added a new failing string (CreatePluginHeaderTestOK): Old string from NotOk moved to this test 2014-11-19 Jiri Vanek Logging jnlp file into console * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java: is now html-like escaping lesser then and greater then chars * netx/net/sourceforge/nanoxml/XMLElement.java: instead of reprinting jnlp file to stdout, the line is gathered and logged via standard logger 2014-11-19 Jie Kang Fixed PluginMessage dates to use localized date from icedteanp-side. See PR2063 * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java: Sort-by-date compares using timestamp * netx/net/sourceforge/jnlp/util/logging/headers/Header.java: 'date' is a string for the localized date and 'timestamp' is a Date for sort-by-date comparison * netx/net/sourceforge/jnlp/util/logging/headers/PluginHeader.java: no longer has timestamp field, uses Header's timestamp field * netx/net/sourceforge/jnlp/util/logging/headers/PluginMessage.java: 'date' acquired directly from icedteanp-side (strftime) without formatting 2014-11-18 Jie Kang Added reproducer for packgz compressed applets. * acinclude.m4: Added check for pack200 in jdk bin * configure.ac: Added check of pack200 during configure * Makefile.am: Added use of pack200 if existing * netx/net/sourceforge/jnlp/PluginBridge: Added use of pack/version from jnlp file when launched through browser * tests/reproducers/custom/PackGZip/resources/PackGZip.jnlp: packgz reproducer * tests/reproducers/custom/PackGZip/resources/PackGZipApplet.html: * tests/reproducers/custom/PackGZip/resources/PackGZipJNLP.html: * tests/reproducers/custom/PackGZip/srcs/Makefile: * tests/reproducers/custom/PackGZip/srcs/PackGZip.java: * tests/reproducers/custom/PackGZip/testcases/PackGzipTest.java: 2014-11-14 Jiri Vanek http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2014-June/028399.html (long thread) * netx/net/sourceforge/jnlp/Launcher.java: using PropertyDesc.fromString to add resources. * netx/net/sourceforge/jnlp/PropertyDesc.java: New method fromString to handle parsing * netx/net/sourceforge/jnlp/runtime/Boot.java: is now merging the properties to main configuration. * tests/netx/unit/net/sourceforge/jnlp/PropertyDescTest.java: new file. Added tests for fromString. 2014-11-14 Jiri Vanek Making loading of PAC provider more lenient * netx/net/sourceforge/jnlp/runtime/PacEvaluatorFactory.java: (getPacEvaluator) changed to autocloseable, general Exception (instead IOException only) is catch. 2014-11-14 Jiri Vanek Connection factory fixed for offline usage * netx/net/sourceforge/jnlp/security/ConnectionFactory.java: (disconnect) got null check 2014-11-10 Jie Kang Refactored downloading of resources * netx/net/sourceforge/jnlp/cache/CacheEntry.java: added logging messages * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (downloadResource): refactored into multiple methods (getDownloadConnection): new method to get and setup URLConnection (downloadPackGzFile): new method to download .pack.gz files (downloadGZipFile): new method to download .gz files (uncompressPackGz): new method to uncompress .pack.gz files (uncompressGZip): new method to uncompress .gz files (downloadFile): new method to download files (writeDownloadToFile): new method to write download into file, byte-by-byte (storeEntryFields): new method to store cache entry fields after download 2014-11-05 Lukasz Dracz Option parser refactored to use Parsed Option * netx/net/sourceforge/jnlp/OptionsDefinitions.java: enum EQUALS_CHAR removed, EVEN_NUMBER_OR_WITHEQUALCHAR renamed to EVEN_NUMBER_SUPPORTS_EQUALS_CHAR * netx/net/sourceforge/jnlp/resources/Messages.properties: * netx/net/sourceforge/jnlp/runtime/Boot.java: removed first check of JNLP option being not present * netx/net/sourceforge/jnlp/util/optionparser/OptionParser.java: refactored to use a List of ParsedOption instead of map, refactored parseContents to be split into smaller methods and made parsing more strict but easier to read/maintain (shouldAddParam, isOneArgumentNotFull, oneOrMoreArguments, addOptionToList, argumentToOption): added (getValue, getValues): renamed to (getParam, getParams) (findMainArg):removed, main args only looked for in parseContents * tests/netx/unit/net/sourceforge/jnlp/util/optionparser/OptionParserTest.java: removed tests that were no longer valid and added new ones based on the change in option parser functionality * netx/net/sourceforge/jnlp/util/optionparser/ParsedOption.java: added 2014-11-03 Jiri Vanek Get rid of @BOLD_OPEN@ and @BOLD_CLOSE@ in favor of and * netx/net/sourceforge/jnlp/resources/Messages.properties: ssia * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/HtmlFormatter.java: now overrides process, as input is expected to be html (aka text with B tags). * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatter.java: (process) using regexes to replace B tags * tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatterTest.java: adapted to new logic,added tests 2014-10-29 Jie Kang Configure switch for whitelist processing added. 'configure --enable-whitelist-processing': Process white-listed reproducers based on directory name and run all processed reproducers. 'configure': Process all reproducers and run reproducers white-listed on test-case name. * Makefile.am: support for --enable-whitelist-processing switch * configure.ac: added switch --enable-whitelist-processing 2014-10-24 Jiri Vanek Opening of connections moved into factory * netx/net/sourceforge/jnlp/cache/CacheUtil.java: * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: * netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java: * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: all calls to url.openConnection(), replaced by ConnectionFactory.getConnectionFactory().openConnection(url) and all calls to if (conn instanceof HttpURLConnection){((HttpURLConnection)conn).disconnect();} by ConnectionFactory.getConnectionFactory().disconnect(conn); * netx/net/sourceforge/jnlp/security/ConnectionFactory.java: new class singleton responsible for opening and closing of connections. Have debugging feature to download https connections one by one (needs tweeking) 2014-10-21 Jiri Vanek Fixed case when already decoded file is wonted from cache (RH1154177) * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (getCacheFile) if all previous attempts to get cached file, plain url.getPath is tried. 2014-10-21 Jiri Vanek Unittests coverage adapted to latest jacoco * Makefile.am: (JACOCO_AGENT_SWITCH) is now using both JACOCO_ADVANCED_EXCLUDE) and inclbootstrapclasses=true too. (JACOCO_AGENT_JAVAWS_SWITCH) and (JACOCO_AGENT_PLUGIN_SWITCH) are using JACOCO_AGENT_SWITCH instead of copypasting values. 2014-10-21 Lukasz Dracz PolicyFileModel null file tests added * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyFileModelTest.java 2014-10-20 Jiri Vanek Added support for chromium binary (along with older chromium-browser one) * tests/test-extensions/net/sourceforge/jnlp/browsertesting/Browsers.java: (static) check if legacy chromium-browser do exists. If so use it, otherwise use newer chromium only 2014-10-20 Jiri Vanek Support only @BOLD_OPEN@ and @BOLD_CLOSE@ in documentation * netx/net/sourceforge/jnlp/util/docprovider/PolicyEditorTextsProvider.java: Replace @@ usage by calls to methods * netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java: same * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/Formatter.java: added license * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/HtmlFormatter.java: same * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ManFormatter.java: same * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatter.java: Added license. (process) All but @BOLD_OPEN@ and @BOLD_CLOSE@ support removed * tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatterTest.java Added test for process method 2014-10-17 Jiri Vanek Jacoco boot class loading moved from custom built to upstreamed form * Makefile.am: (JACOCO_AGENT_JAVAWS_SWITCH) and (JACOCO_AGENT_PLUGIN_SWITCH) moved from xboot=true to inclbootstrapclasses=true which is now supported by upstream. 2014-10-17 Jiri Vanek Plain and main text formatters have more human readable urls * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/Formatter.java: only added formatting line * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ManFormatter.java: removed overriding getUrl * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PlainTextFormatter.java: same * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatter.java Implemented general getUrl for plaintexts in format readable (url), except cases where readable do not exists or is same as url. 2014-10-17 Jiri Vanek Fixed jdk8 javadoc generation error * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java: invalid link #allCommands replaced by plain optionsDefinitions.getItwsettingsCommands 2014-10-13 Fridrich Strba Removed all references to deprecated sun.misc.Ref * configure.ac: removed check for a sun.misc.Ref * netx/net/sourceforge/jnlp/util/ui/NonEditableTableModel.java: all occurrences of Vector replaced by Vector. JDK9 compliant style. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (getCachedImageRef) type of return value changed from Ref to AppletImageRef. Adapted imports. 2014-10-09 Jiri Vanek Empty "" codebase now behaves as "." codebase * file netx/net/sourceforge/jnlp/Parser.java: introduced CODEBASE constant to avoid duplicated String getAttribute split to getCleanAttribute, which get the pure attribute, and remaining getAttribute keep adding null in case of empty * file netx/net/sourceforge/jnlp/security/SecurityDialogs.java: added workaround about possible null codebase * file tests/netx/unit/net/sourceforge/jnlp/ParserTest.java: added test for empty codebase 2014-10-08 Lukasz Dracz Standardize all options to use hyphens * netx/net/sourceforge/jnlp/OptionsDefinitions.java: itweb-settings options changed to have hyphens in front, added new enum to NumberOfArguments (getItwsettingsCommands): added headless, changed nodashhelp to help * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java * netx/net/sourceforge/jnlp/resources/Messages.properties: (BOHelp, IBOCheck): modified (NOAevennumberorequalschar): added 2014-10-08 Jiri Vanek itw-plugin and itweb-settings documentation made localizable * Makefile.am: documentation root (DOCS_DIR) is now icedtea-web-docs/$(FULL_VERSION) (install-data-local) now can copy all man pages more simply and from new DOCS_DIR (stamps/generate-docs.stamp) is adapted to new DOCS_DIR * netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java: minor fixes like removal of redeclared deployment properties and switch on strings * netx/net/sourceforge/jnlp/resources/Messages.properties: added missing brackets behind @@ hints, all icedtea-web replaced by IcedTea-Web, (CBCheckOkSignedOk) removed double space, added families of ITWS and ITWP * netx/net/sourceforge/jnlp/util/docprovider/ItwebPluginTextProvider.java: and * netx/net/sourceforge/jnlp/util/docprovider/ItwebSettingsTextsProvider.java: all texts moved to properties 2014-10-07 Jie Kang Modified unit tests for CacheEntry and CacheLRUWrapper to prevent blocking. * netx/net/sourceforge/jnlp/cache/CacheEntry.java: comments for unlocking * netx/net/sourceforge/jnlp/util/PropertiesFile.java: same * netx/net/sourceforge/jnlp/util/lockingfile/LockedFile.java: same * tests/netx/unit/net/sourceforge/jnlp/cache/CacheEntryTest.java: fixed multi-threaded tests to prevent blocking, and added timeout to threaded tests to prevent tests from blocking test runs * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: same * tests/netx/unit/net/sourceforge/jnlp/cache/CacheTestUtils.java: utilities for cache tests 2014-10-07 Jie Kang Changed ResourceTracker to use cached thread pool as opposed to manual thread management * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: 2014-10-07 Jiri Vanek Files, arguments types and icedtea-web man page made localizable * netx/net/sourceforge/jnlp/OptionsDefinitions.java: (NumberOfArguments) sentences moved to properties * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: same * netx/net/sourceforge/jnlp/util/docprovider/IcedTeaWebTextsProvider.java: same * netx/net/sourceforge/jnlp/resources/Messages.properties: added families of ITW, NOA and FILE * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/Formatter.java: added getNewLine override with argument, number of new lines to be generated * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatter.java getNewLine(int i) implemented * tests/netx/unit/net/sourceforge/jnlp/util/docprovider/formatters/formatters/FormatterTest.java getNewLine(int i) tested for all formatters 2014-10-07 Jiri Vanek Option parser now accept 0-n hyphens * launcher/launchers.in: regex matching for headless changed to * instead of 0-1 * netx/net/sourceforge/jnlp/util/optionparser/OptionParser.java: added new method to removeLeadingHyphens. (stringEqualsOption) now sanitize both inputs by it. * tests/netx/unit/net/sourceforge/jnlp/util/optionparser/OptionParserTest.java: Added tests to verify none or more leading hyphens are correctly recognized. Added tests to verify hyphens elsewhere will not confuse parser. 2014-10-03 Lukasz Dracz IcedTea-Web Splashscreen allows zero or one hyphens preceding headless option * launcher/launchers.in: regex matching for headless 2014-09-22 Jiri Vanek Preventing rare class cast exception in erroneous detached applets * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java: getSplashControler renamed to getSplashController. (getSplashController) added check for SplashController instance. Returning null if not so. * netx/net/sourceforge/jnlp/splashscreen/SplashUtils.java: adapted to renaming * tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashUtilsTest.java: added (assertNulsAreOkInShow) test to check null values for showError methods 2014-09-19 Jie Kang Modified Makefile.am to use whitelist when processing reproducers. * Makefile.am: Now filters reproducers using netx-dist-tests-whitelist 2014-09-19 Jie Kang Added three keys to DeploymentConfiguration. Max cache size, cache enable, and cache compression enable. * netx/net/sourceforge/jnlp/CacheUtil.java: now uses keys * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: now uses keys * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: 2014-09-19 Jiri Vanek Translator made immutable * netx/net/sourceforge/jnlp/runtime/Translator.java: changed form enum to class, initialization handled by holder pattern, resources made final, removed loadResourceBundle, getMessage made protected. * tests/netx/unit/net/sourceforge/jnlp/runtime/TranslatorTest.java: (setup) (and all tests) now uses special instance based on fake resources. Added two tests to test singleton instance itself. 2014-09-18 Lukasz Dracz Added New Option Parser and used in boot of javaws * netx/net/sourceforge/jnlp/Launcher.java: (addProperties, addArguments, addParameters) refactored to take in a List instead of String[] * netx/net/sourceforge/jnlp/OptionsDefinitions.java: added JNLP to enum OPTIONS * netx/net/sourceforge/jnlp/ParserSettings.java (setGlobalParserSettingsFromOptionParser): refactored to take in an OptionParser instead of args * netx/net/sourceforge/jnlp/runtime/Boot.java: Uses OptionParser to parse arguments for options and check whether an option is present. (getJNLPFile): changed to use OptionParser, and look for one main argument or one value from the JNLP option, if not present then throws an InvalidArgumentException * netx/net/sourceforge/jnlp/util/optionparser/InvalidArgumentException.java: added * netx/net/sourceforge/jnlp/util/optionparser/OptionParser.java: new file, a common parser for options and their values (parseContents): called in OptionParser constructor, parses and populates values in a map based on their option (findMainArg): Takes arguments and parses them backwards to find the first value that is eligible to be a main arg (not an option or a value for an option with one value) (addMainArg): adds the specified arg to main and removes it from its current placement in the map (stringEqualsOption): used to determine whether a string fits an option keyword irrespective if it has a leading dash or is followed by a equals char * tests/netx/unit/net/sourceforge/jnlp/ParserSettingsTest.java: (testSetGlobalParserSettingsFromOptionParser, testSetGlobalParserSettingsFromOptionParserHasSameOptionsAsOptionParser): added * tests/netx/unit/net/sourceforge/jnlp/util/optionparser/OptionParserTest.java: new file to test parser works as intended 2014-09-17 Jiri Vanek Javaws and PolicyEditor made localizable * Makefile.am: usage of $TP_TAIL fixed to be correctly $$TP_TAIL * netx/net/sourceforge/jnlp/resources/Messages.properties: added PE and JWS families * netx/net/sourceforge/jnlp/util/docprovider/JavaWsTextsProvider.java: and * netx/net/sourceforge/jnlp/util/docprovider/PolicyEditorTextsProvider.java: all strings moved to properties. Minor reformatting. 2014-09-15 Lukasz Dracz Fix itweb-settings Cache Panel Tooltip * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: Tooltip appears when spinner is enabled and hovered over * netx/net/sourceforge/jnlp/resources/Messages.properties: Removed not needed html tags 2014-09-15 Jie Kang Moved translator responsibility from JNLPRuntime to Translator * netx/net/sourceforge/jnlp/runtime/Translator.java: * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (getMessage): moved from JNLPRuntime to Translator * netx/net/sourceforge/jnlp/runtime/TranslatorTest.java: added tests for translating using a ResourceBundle 2014-09-15 Jie Kang * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java (getLRUSortedEntries): now creates a deeper copy of cacheOrder list 2014-09-13 Andrew Azores * netx/net/sourceforge/jnlp/resources/Messages.properties (CertWarnHTTPSAcceptTip, CertWarnHTTPSRejectTip): new messages more applicable for HTTPS cert warning dialogs * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: distinguish between HTTPS cert warnings and signed applet cert warnings. Display appropriate text labels and buttons corresponding to either case. * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java: remove assertions for non-null file, securityDelegate, and linkedButton. Instead, if any are null, simply disable this component and do not add component listeners dependent upon these fields. 2014-09-10 Lukasz Dracz Refactor of the cache panel GUI in itweb-settings * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: Changed slider into a spinner for cache size, changed order of elements in the panel, added a checkbox to limit the cache size, added disabling of components based on whether they are needed * netx/net/sourceforge/jnlp/resources/Messages.properties 2014-09-10 Jie Kang Changed CacheLRUWrapper to use PropertiesFile's provided locking system Added unit tests for CacheLRUWrapper * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java 2014-09-10 Jie Kang Added unit tests to PropertiesFile.java and refactored existing unit tests to not use external code. * tests/netx/unit/net/sourceforge/jnlp/util/PopertiesFileTest.java 2014-09-09 Jiri Vanek Outdated documentation replaced by documentation generation * Makefile.am: added (DOCS_DIR) pointing to target directory for generated docs (clean-local) and (.PHONY) now cleaning also clean-generated-docs (install-data-local) removed usage of old man pages, copied all generated man pages (uninstall-local) added removal of javaws_splash.png, all known man pages cleaned (stamps/generate-docs.stamp) new target, generates all known language mutations of all known man pages to correct directories. (stamps/netx-dist.stamp) depends on stamps/generate-docs.stamp (clean-generated-docs) new target, removes DOCS_DIR and stamp * netx/itweb-settings.1: removed * netx/javaws.1: removed * netx/policyeditor.1: removed * netx/net/sourceforge/jnlp/OptionsDefinitions.java: new class, contains definitions of all command-line arguments * netx/net/sourceforge/jnlp/about/AboutDialog.java:improved to contains window with generated localized help. Default welcome screen points to localized mutation (if available). Loading of pages made lazy, and only once per app. run. Added possibility to chose start page. * netx/net/sourceforge/jnlp/about/HTMLPanel.java: get rid of useless id * netx/net/sourceforge/jnlp/about/InternalHTMLPanel.java: extension of HTMLPanel, links are pointing to internal window (in HTMLPanel points to external browser) * netx/net/sourceforge/jnlp/config/Defaults.java: All files declarations moved to PathsAndFiles. Defaults array now uses those. Iteration in defaults now done by iterator. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: All files declarations moved to PathsAndFiles. Configuration now uses those. * netx/net/sourceforge/jnlp/config/PathsAndFiles.java: New file. Gathers all files declared in ITW. * netx/net/sourceforge/jnlp/config/Setting.java: added human readable toString * netx/net/sourceforge/jnlp/controlpanel/AboutPanel.java: set origin - itweb-settings. * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java: options now uses OptionsDefinitions and runtime help now uses TextsProvider's instances. * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: uses PathsAndFiles * netx/net/sourceforge/jnlp/resources/Messages.properties: BOUsage and BOUsage2 stripped for javaws keyword. Added (BOTrustnone), added IBO and PBO and man families. Removed PEUsage PEHelpFlag PEFileFlag PECodebaseFlag, PEAboutDialogTitle PEAboutDialogContent CLHelpDescription SPLASHurl SPLASHurlLooks. All urls replaced by variables. * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: fixed BAboutITW,rmeove * netx/net/sourceforge/jnlp/resources/Messages_de.properties: same * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: same * netx/net/sourceforge/jnlp/resources/about.html: removed. replaced by generated, and localized one. * netx/net/sourceforge/jnlp/runtime/Boot.java: Handling of verbose moved to be one of first switches. All runtime helps moved to TextsProvider's instances. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExtendedAppletSecurityHelp.java: added parameter so (R). * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: All runtime helps moved to TextsProvider's instances. About policy editor replaced by About.help Modality of About dialog recognized on state of underlying dialogue. Added About icedtea-web menu entry. * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorAboutDialog.java: removed unused (title) * netx/net/sourceforge/jnlp/splashscreen/impls/DefaultSplashScreens2012Commons.java: AboutDialog displayed with reason * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java: Links here replaced by TextsProviders constants. * netx/net/sourceforge/jnlp/util/docprovider/IcedTeaWebTextsProvider.java: implementation of TextsProvider for icedtea-web package * netx/net/sourceforge/jnlp/util/docprovider/ItwebPluginTextProvider.java: implementation of TextsProvider for plugin * netx/net/sourceforge/jnlp/util/docprovider/ItwebSettingsTextsProvider.java implementation of TextsProvider for itweb-settings * netx/net/sourceforge/jnlp/util/docprovider/JavaWsTextsProvider.java implementation of TextsProvider for javaws * netx/net/sourceforge/jnlp/util/docprovider/PolicyEditorTextsProvider.java implementation of TextsProvider for policy editor * netx/net/sourceforge/jnlp/util/docprovider/TextsProvider.java: New abstract class to handle basic operations on texts and defining abstract methods. * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/Formatter.java Definition interface for any Formatter used by TextsProvider * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/HtmlFormatter.java html markup adding Formatter * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ManFormatter.java man pages markup adding Formatter * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/PlainTextFormatter.java no markup adding Formatter * netx/net/sourceforge/jnlp/util/docprovider/formatters/formatters/ReplacingTextFormatter.java Stub for all formatters needing text substituitons. * netx/net/sourceforge/jnlp/util/logging/UnixSystemLog.java: Links here replaced by TextsProviders constants. 2014-09-02 Jie Kang Fixed CacheUtils clearCache method to also clear the Least Recently Used entries. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: 2014-08-20 Jie Kang Improved CacheEntry locking system to respect threads and processes. * netx/net/sourceforge/jnlp/cache/CacheEntry.java (lock), (unlock): now uses PropertiesFile lock instead of CacheUtil (tryLock), (isHeldByCurrentThread): added functions * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: moved unlock calls into finally blocks * netx/net/sourceforge/jnlp/cache/CacheUtil.java: lock and unlock no longer needed and are removed * netx/net/sourceforge/jnlp/util/PropertiesFile.java: now uses LockedFile and has methods to lock/trylock/unlock. * netx/net/sourceforge/jnlp/util/LockedFile.java (tryLock), (isHeldByCurrentThread): added functions (unlock): no longer attempts unlock unless lock is held by current thread and process * tests/netx/unit/net/sourceforge/jnlp/cache/CacheEntryTest.java: 6 new tests for the locking mechanism (testLock), (testUnlock), (testStoreFailsWithoutLock), (testStoreWorksWithLock), (testMultithreadLockPreventsWrite), (testMultithreadLockAllowsRead) * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: moved unlock calls into finally blocks 2014-08-20 Jie Kang Renamed Resource Status Enum fields to better describe their meaning. CONNECT is now PRECONNECT, DOWNLOAD is now PREDOWNLOAD and STARTED is now PROCESSING. * netx/net/sourceforge/jnlp/cache/Resource.java: rename enum usages * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: same * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTest.java: same * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: same 2014-08-05 Jiri Vanek Massively improved offline abilities. Added Xoffline switch to force work without inet connection. * NEWS: updated * netx/net/sourceforge/jnlp/JNLPFile.java: (openURL) is now using properly cached file instead of direct online one. * netx/net/sourceforge/jnlp/Launcher.java: launcher now can run offline-only jnlp files if Xoffline specified. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: removed suspicious removal of http/https dirs in cache * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: misleading (getInputStream) method removed (initializeResource) check for connection before downlaodin (unless Xforceoffline specified). If environment is offline it do not attempt any url connections or writing to cache * netx/net/sourceforge/jnlp/resources/Messages.properties: added (BXoffline) description * netx/net/sourceforge/jnlp/runtime/Boot.java: added help and read for Xoffline * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: added flags of (offlineForced) and (onlineDetected) with getters and setters. Added utility method (detectOnline) to recognize whether environment is onliune by resovling inet addres of host of not file url. * netx/net/sourceforge/jnlp/services/XBasicService.java: (isOffline) now uses above implemented mechanism. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: now writes real url into desktop icon 2014-08-05 Andrew Azores Lukasz Dracz Refactored copy paste to use System Clipboard in PolicyEditor. Parsing refactored to use Strings instead of requiring a file. * netx/net/sourceforge/jnlp/resources/Messages.properties (PEClipboardError, PEInvalidPolicy, PEClipboardAccessError): added * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (renameCodebaseButtonAction, copyCodebaseButtonAction, pasteCodebaseButtonAction): changed functionality to call methods from PolicyEditorController that use system clipboard * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java (addPolicyEntry): added (openAndParsePolicyFile): throws new exception InvalidPolicyException (copyCodebaseToClipboard, getClipboardContentAsString, getPolicyEntryFromClipboard, getCodebaseFromClipboard, getPermissionsFromClipboard, getCustomPermissionsFromClipboard): new methods * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEntry.java (getCodebase, getPermissions, getCustomPermissions, fromString, validatePolicy): new overloaded methods * netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java all methods made synchronized (openAndParsePolicyFile): extracted and modified parsing logic (parsePolicyString): new method (clearPermissions): also clears Custom Permissions now * netx/net/sourceforge/jnlp/security/policyeditor/InvalidPolicyException.java: added new exception * netx/net/sourceforge/jnlp/security/policyeditor/CustomPermission.java (equals, hashCode): Override these methods to be able to compare custom permissions. New constructors for custom permission, one of the constructors takes only PermissionType, PermissionTarget and the other takes an additional PermissionActions * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPermissionTest.java, * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorParsingTest.java, * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java, * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorControllerTest.java, * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEntryTest.java, * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyFileModelTest.java: added new unit tests 2014-08-05 Andrew Azores Small bug fix (security hole) for previous PR1769 patch. This patch closes a hole where very specifically formulated partially signed applets could maintain fully signed privileges (all-permissions), even for their unsigned components. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeResources): ensure that the 'signing' field is properly set for partially signed applets and that applets with an external main class are properly detected. 2014-08-01 Andrew Azores Fixed support for signed applets which specify the Permissions attribute as "sandbox" in their manifests. These applets are now properly run sandboxed automatically, rather than requiring the user to click the "Sandbox" run button. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (JNLPClassLoader): manifest attributes checking and security settings moved inside initializeResources (initializePermissions): renamed (initializeReadJarPermissions). Redundant null-check removed (initializeResources): do not set entries in jarLocationSecurityMap until after prompting the user on whether to run the applet as well as performing manifest attribute checks. A new Collection (validJars) is used to hold available and valid JARs between discovering the JARs and applying any security settings to the them (initializeManifestAttributesChecker): new method (getJnlpFileCodebase): new method, extracted from initializeResources (SecurityDelegateImpl.setRunInSandbox): throw exception if already forced to run in sandbox, rather than if already prompted * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java (isLowSecurity): new method (checkAll): Extended Applet Security on Low disables all manifest checks except for Permissions (checkPermissionsAttribute): do not skip checking if Extended Applet Security is Low. Remove try/catch on setRunInSandbox call as this is now supported. (checkApplicationLibraryAllowableCodebaseAttribute): do not display dialog prompts on low security, allow the applet to run without prompt * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPFileTest.java (newSecurityAttributesTest): set JAR manifest to have Permissions: all-permissions, since this is a JNLP and JAR is signed and so 'sandbox' is not actually allowed * tests/test-extensions/net/sourceforge/jnlp/mock/DummyJNLPFile.java: properly initialize 'security' field rather than overriding getSecurity * tests/test-extensions/net/sourceforge/jnlp/mock/DummyJNLPFileWithJar.java: same * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionSigned.html: new tests * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionSigned.jnlp * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionSignedJNLPhref.html * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionUnsigned.html * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionUnsigned.jnlp * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesAllPermissionUnsignedJNLPhref.html * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxSigned.html * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxSigned.jnlp * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxSignedJNLPhref.html * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxUnsigned.html * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxUnsigned.jnlp * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedAppletManifestSpecifiesSandboxUnsignedJNLPhref.html * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedApplicationManifestSpecifiesAllPermissionSigned.jnlp * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedApplicationManifestSpecifiesAllPermissionUnsigned.jnlp * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedApplicationManifestSpecifiesSandboxSigned.jnlp * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/resources/PartiallySignedApplicationManifestSpecifiesSandboxUnsigned.jnlp * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/MANIFEST.MF.1 * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/MANIFEST.MF.2 * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/Makefile * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/PartiallySignedAppletManifestSpecifiesSandboxSigned.java * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/srcs/PartiallySignedAppletManifestSpecifiesSandboxUnsigned.java * tests/reproducers/custom/PartiallySignedAppletManifestSpecifiesSandbox/testcases/PartiallySignedAppletManifestSpecifiesSandboxTests.java * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedAppletManifestSpecifiesSandbox.html * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedAppletManifestSpecifiesSandboxApplet.jnlp * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedAppletManifestSpecifiesSandboxApplication.jnlp * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/resources/SignedAppletManifestSpecifiesSandboxJnlpHref.html * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/META-INF/MANIFEST.MF * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/srcs/SignedAppletManifestSpecifiesSandbox.java * tests/reproducers/signed/SignedAppletManifestSpecifiesSandbox/testcases/SignedAppletManifestSpecifiesSandboxTests.java 2014-08-01 Jiri Vanek * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: casts to (JNLPClassLoader) DID guarded by instanceof 2014-07-31 Andrew Azores Add URLPermission support to SecurityDesc. This is essentially Java 8 support, as URLPermission is new to Java 8 and required for many applets to continue working when a Java 8-compatible JVM is in use. * netx/net/sourceforge/jnlp/SecurityDesc.java (urlPermissionClass, urlPermissionConstructor): new static variables for storing references to URLPermission, if available, for reflective construction at runtime (getSandboxPermissions): adds URLPermissions to sandbox permissions set, if available (Java 8+) (getUrlPermissions): new method for getting URLPermissions for the current SecurityDesc (getHostWithSpecifiedPort, appendRecursiveSubdirToCodebaseHostString): new static helper methods for generating URLPermissions' constructor args * tests/netx/unit/net/sourceforge/jnlp/SecurityDescTest.java (testNotNullJnlpFile): cleanup refactor, no semantic change (testNullJnlpFile, testAppendRecursiveSubdirToCodebaseHostString, testAppendRecursiveSubdirToCodebaseHostString2, testAppendRecursiveSubdirToCodebaseHostString3, testAppendRecursiveSubdirToCodebaseHostStringWithPort, testAppendRecursiveSubdirToCodebaseHostStringWithNull, testGetHostWithSpecifiedPort, testGetHostWithSpecifiedPortWithFtpScheme, testGetHostWithSpecifiedPortWithUserInfo, testGetHostWithSpecifiedPOrtWithPort, testGetHostWithSpecifiedPortWithPath, testGetHostWithSpecifiedPortWithAll, testGetHostWithSpecifiedPortWithNull, testGetHost, testGetHostWithFtpScheme, testGetHostWithUserInfo, testGetHostWithPort, testGetHostWithPath, testGetHostWithAll, testGetHostNull, testGetHostWithAppendRecursiveSubdirToCodebaseHostString, testGetHostWithSpecifiedPortWithAppendRecursiveSubdirToCodebaseHostString): new test methods 2014-07-31 Andrew Azores Added "File - New" action to PolicyEditor * netx/net/sourceforge/jnlp/resources/Messages.properties (PETitle): PolicyEditor, not Policy Editor. (PETitleWithPath): new message used for PolicyEditor window title bar (PETitleWithChangesMade): same (PENewMenuItem): new message (PEAddCodebaseItem): added ellipsis (PEPasteCodebaseItem): same (PENewMenuItemMnemonic): new message (PEAddCodebaseItemAccelerator): C-S-n rather than just C-n (PENewMenuItemAccelerator): new message, C-n * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: added "New" item to "File" menu. (setFile): new method. (newButtonAction): new field (openButtonAction): "save changes made" dialog extracted into new method (promptOnSaveChangesMade): new method (setParentWindowTitle): new method (getWindowTitleForStatus): new method (getFile): new method (createMenuBar): added New item to File menu (removeCodebase): add setChangesMade call * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java (openAndParsePolicyFile): use setPerformingIO rather than direct access (savePolicyFile): same * netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java (setFile): allow null file to facilitate "new file" without a location set (saveFile): set new fileWatcher every time, not only if file was previously null 2014-07-30 Andrew Azores Lukasz Dracz * netx/net/sourceforge/jnlp/resources/Messages.properties (PEHelpMenu, PEAboutPolicyEditorItem, PEPolicyEditorHelpItem, PEAboutDialogTitle, PEAboutDialogContent, PEHelpDialogTitle, PEHelpDialogContent, PEHelpMenuMnemonic, PEAboutPolicyEditorItemMnemonic, PEPolicyEditorHelpItemMnemonic, PEAboutPolicyEditorCloseAccelerator):added * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (policyEditorHelpButtonAction, aboutPolicyEditorButtonAction): added and used to open dialogs (helpMenu, aboutPolicyEditorItem, policyEditorHelpItem): added * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorAboutDialog.java Implements a frame that uses a textpane which takes html within a scrollpane to show dialogs in. (close, setupLayout): added (CloseKeyListener): added class 2014-07-30 Jie Kang * NEWS: added mention of fixes to Java Console and itweb-settings UI as well as fix to method overloading resolution 2014-07-30 Andrew Azores * NEWS: added mention of PolicyEditor mnemonics and accelerators overhaul, PolicyEditor bug fix where "cancel" on the "save before exit" dialog would exit without saving changes 2014-07-30 Andrew Azores * NEWS: added mention of RH1121549 fix 2014-07-30 Andrew Azores Fixes for coverity issues discovered in RH1121549 * plugin/icedteanp/IcedTeaNPPlugin.cc (ITNP_New): print error message and return error if JVM fails to start. (NP_Initialize): fix missing argument to PLUGIN_ERROR when unable to create data directory * plugin/icedteanp/IcedTeaParseProperties.cc (get_log_dir): refactored to reduce duplicate code, use IcedTeaPluginUtils.create_dir, and enhanced warning messages * plugin/icedteanp/IcedTeaPluginUtils.cc (create_dir, is_directory): new functions * plugin/icedteanp/IcedTeaPluginUtils.h: same * plugin/icedteanp/IcedTeaScriptablePluginObject.cc (setProperty): do not erroneously redeclare java_result * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc (is_directory, create_dir): new tests. (file_exists): added assertion that directories satisfy file_exists 2014-07-28 Jie Kang Fixed TeeOutputStream to accept multi-byte encodings. * netx/net/sourceforge/jnlp/util/logging/TeeOutputStream.java: Now uses ByteArrayOutputStream instead of StringBuffer * tests/netx/unit/net/sourceforge/jnlp/util/logging/TeeOutputStreamTest.java: 2014-07-28 Jie Kang Made adjustments to the MethodOverloadResolver to follow LiveConnect specification when dealing with superclasses. * tests/reproducers/simple/JSToJFuncResol/testcases/JSToJFuncResolTest.java: Removed Known to Fail annotation on test case that is now fixed. * plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java Added distance calculation for comparing superclass resolutions. 2014-07-28 Jie Kang Fix to Java ConsoleOutputPane for lower resolutions. Addresses bug PR1859 where part of the pane is hidden and unnaccessible when clicking "Show Details". * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: 2014-07-28 Jie Kang Fix to Control Panel UI for lower resolutions. Addresses bug PR1856 where part of the dialog is hidden and unaccessible on lower resolutions such as 800 x 600. * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: 2014-07-22 Fridrich Strba * plugin/icedteanp/IcedTeaPluginUtils.cc (flush_pre_init_messages): Return NULL explicitly. 2014-07-14 Andrew Azores PolicyEditor mnemonics and accelerators overhaul * netx/net/sourceforge/jnlp/resources/Messages.properties (PECodebaseMenu, PERenameCodebaseItem, PECopyCodebaseItem, PEPasteCodebaseItem, PECopyCodebaseToClipboardItem, PEFileMenuMnemonic, PECodebaseMenuMnemonic PEViewMenuMnemonic, PEAddCodebaseItem, PERemoveCodebaseItem): removed "codebase" from item labels, "Edit" menu renamed "codebase" (PEAddCodebaseMnemonic, PEAddCodebaseItemMnemonic, PERemoveCodebaseMnemonic, PERemoveCodebaseItemMnemonic, PEOpenMenuItemMnemonic, PESaveMenuItemMnemonic, PEExitMenuItemMnemonic, PECustomPermissionsItemMnemonic, PECopyCodebaseItemMnemonic, PEPasteCodebaseItemMnemonic, PECopyCodebaseToClipboardItemMnemonic, PESaveAsMenuItemMnemonic, PERenameCodebaseItemMnemonic): updated mnemonics (PEAddCodebaseItemAccelerator, PERemoveCodebaseItemAccelerator, PEOpenMenuItemAccelerator, PESaveMenuItemAccelerator, PESaveAsMenuItemAccelerator, PEExitMenuItemAccelerator, PECustomPermissionsItemAccelerator, PECopyCodebaseItemAccelerator, PEPasteCodebaseItemAccelerator, PERenameCodebaseItemAccelerator, PECopyCodebaseToClipboardItemAccelerator): added accelerators * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (closeButtonAction): set in PolicyEditor constructor rather than setupPolicyEditorWindow (setupPolicyEditorWindow): do not set save/quit/esc actions (setAccelerators, setAccelerator, setAddCodebaseAccelerator, setRemoveCodebaseAccelerator): removed (setButtonMnemonic): simplified, takes a String expected to be a single character representing the mnemonic key directly, rather than a String parseable to an integer which represented the value of the mnemonic key (setMenuItemAccelerator): new method (createMenuBar): use new mnemonics and accelerators, add new Add/Remove items to Codebase menu, override JList default Control-C/Control-V copy/paste actions (setupLayout): groupCh MouseListener#mouseClicked logic extracted to toggleExpandedCheckboxGroupPanel, KeyListener added to allow expanding checkbox groups via keyboard with Enter or "Context Menu" (toggleExpandedCheckboxGroupPanel): new method 2014-07-11 Andrew Azores Fixed bug where the "Cancel" option on the "save changes before exiting" dialog would be ignored and the window close without saving * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (preparePolicyEditorWindow): default close operation NONE rather than dispose (setupPolicyEditorWindow): do not automatically dispose on window close 2014-07-08 Emmanuel Bourg * netx/policyeditor.1: Escaped the minus signs in the policyeditor manpage 2014-07-03 Jacob Wisor * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: Fix handling of UI controls (ConsoleOutputPane) Add set enabled state of headers JCheckBoxes with new setHeadersCheckBoxesEnabled() method depending on showHeaders' saved configuration selected state Add set enabled state of messages JCheckBox with new setMessagesCheckBoxesEnabled method depending on showMessage's selected state on initialization Add set enabled state of refresh JButton reciprocally to autorefresh JCheckBox's selected state on initialization (createDefaultAction) Add null check on argument of public method Add call to new setHeadersCheckBoxesEnabled() method with showHeaders' selected state when clicked Add call to new setMessagesCheckBoxesEnabled() method with showMessage's selected state when clicked Add set enabled state of refresh JButton reciprocally to autorefresh JCheckBox's selected state (initComponents) Add default ActionListener to autorefresh JCheckBox (setHeadersCheckBoxesEnabled) Add new method Sets enabled state of showUser, showOrigin, showLevel, showDate, showCode, showThread1, and showThread2 depending on parameter passed in (setMessagesCheckBoxesEnabled) Add new method Sets enabled state of showOut, showErr, showJava, showPlugin, showDebug, showInfo, showItw, and showApp depending on parameter passed in 2014-07-03 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java removed useless iterations of all resources against all. Kept only all against default. Preferred diamonds and for each against full declarations and old-style fors. 2014-06-30 Andrew Azores Runnables to be invoked on the EDT are invoked immediately if the current thread is already the EDT, rather than being queued for invocation later. invokeRunnableOrEnqueueLater replaces SwingUtilities.invokeLater to achieve this. * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (updateCheckboxes): uses invokeRunnableOrEnqueueAndWait (updateCheckboxesInvokeAndWait): removed (invokeRunnableOrEnqueueAndWait, invokeRunnableOrEnqueueLater): new methods 2014-06-26 Jacob Wisor * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: Formatting fixes & cleanup Made final classes, members, and variables final 2014-06-26 Jacob Wisor * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: Add new PL localized messages 2014-06-25 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (setupLayout): use SwingUtilities.getWindowAncestor() rather than manually searching 2014-06-24 Andrew Azores * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: removed hunk of old commented out code, updated comment on reason for JNLPRuntime.reloadPolicy() 2014-06-19 Jie Kang Refactored Live-Connect (java-js) test cases to fix race condition between JS and J-applet. Checked each test and marked tests known to fail correctly. Removed and replaced deprecated code usage. * tests/reproducers/simple/JSObjectFromEval/resources/JSObjectFromEval.html * tests/reproducers/simple/JSObjectFromEval/resources/JSObjectFromEval.js * tests/reproducers/simple/JSObjectWithoutToString/resources/JSObjectWithoutToString.html * tests/reproducers/simple/JSObjectWithoutToString/resources/JSObjectWithoutToString.js * tests/reproducers/simple/JSToJFuncParam/resources/JSToJFuncParam.html * tests/reproducers/simple/JSToJFuncParam/resources/JSToJava_FuncParam.js * tests/reproducers/simple/JSToJFuncParam/srcs/JSToJFuncParam.java * tests/reproducers/simple/JSToJFuncParam/testcases/JSToJFuncParamTest.java * tests/reproducers/simple/JSToJFuncResol/resources/JSToJFuncResol.html * tests/reproducers/simple/JSToJFuncResol/resources/JSToJava_FuncResol.js * tests/reproducers/simple/JSToJFuncResol/srcs/JSToJFuncResol.java * tests/reproducers/simple/JSToJFuncResol/testcases/JSToJFuncResolTest.java * tests/reproducers/simple/JSToJFuncReturn/resources/JSToJFuncReturn.html * tests/reproducers/simple/JSToJFuncReturn/resources/JSToJava_FuncReturn.js * tests/reproducers/simple/JSToJFuncReturn/srcs/JSToJFuncReturn.java * tests/reproducers/simple/JSToJFuncReturn/testcases/JSToJFuncReturnTest.java * tests/reproducers/simple/JSToJGet/resources/JSToJGet.html * tests/reproducers/simple/JSToJGet/resources/JSToJ_auxiliary.js * tests/reproducers/simple/JSToJGet/resources/JSToJava_Get.js * tests/reproducers/simple/JSToJGet/srcs/JSToJGet.java * tests/reproducers/simple/JSToJGet/testcases/JSToJGetTest.java * tests/reproducers/simple/JSToJSet/resources/JSToJSet.html * tests/reproducers/simple/JSToJSet/resources/JSToJava_Set.js * tests/reproducers/simple/JSToJSet/srcs/JSToJSet.java * tests/reproducers/simple/JSToJSet/testcases/JSToJSetTest.java * tests/reproducers/simple/JSToJTypeConv/resources/JSToJTypeConv.html * tests/reproducers/simple/JSToJTypeConv/resources/JSToJava_TypeConv.js * tests/reproducers/simple/JToJSString/resources/JToJSString.html * tests/reproducers/simple/JToJSString/resources/JToJSString.js * tests/reproducers/simple/JToJSString/resources/JToJSStringJnlpApplet.html * tests/reproducers/simple/JToJSString/resources/JSTest.js * tests/reproducers/simple/JavascriptFuncParam/resources/JavascriptFuncParam.html * tests/reproducers/simple/JavascriptFuncParam/srcs/JavascriptFuncParam.java * tests/reproducers/simple/JavascriptFuncParam/testcases/JavascriptFuncParamTest.java * tests/reproducers/simple/JavascriptFuncReturn/resources/JavascriptFuncReturn.html * tests/reproducers/simple/JavascriptFuncReturn/srcs/JavascriptFuncReturn.java * tests/reproducers/simple/JavascriptGet/resources/JavascriptGet.html * tests/reproducers/simple/JavascriptGet/resources/Javascript_Get.js * tests/reproducers/simple/JavascriptGet/srcs/JavascriptGet.java * tests/reproducers/simple/JavascriptSet/resources/JavascriptSet.html * tests/reproducers/simple/JavascriptSet/resources/Javascript_Set.js * tests/reproducers/simple/JavascriptSet/srcs/JavascriptSet.java * tests/reproducers/simple/JavascriptSet/testcases/JavascriptSetTest.java * tests/reproducers/simple/JavascriptURLProtocol/resources/JavascriptProtocol.html * tests/reproducers/simple/JavascriptURLProtocol/resources/JavascriptProtocol.js * tests/reproducers/simple/JavascriptFuncReturn/resources/Javascript_FuncReturn.js 2014-06-19 Jiri Vanek * NEWS: mentioned All JDKs ability, DE localization, JDK6 incompatibility and KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK 2014-06-19 Andrew Azores * NEWS: added PolicyEditor and TemporaryPermissions 1.6 news 2014-06-19 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/CustomPermission.java: added 2-arg constructor for permissions without actions * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPermissionTest.java (testToStringWithoutActions) renamed testToStringWithEmptyActions (testToStringWithNoActions) new test * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewerTest.java (PERMISSION) uses 2-arg constructor * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java (testAddCustomPermission) renamed testAddCustomPermissionEmptyActions (testClearCustomPermissions) renamed testClearCustomPermissionsEmptyActions (testAddCustomPermissionNoActions) new test (testClearCustomPermissionsNoActions) new test 2014-06-19 Kurt Miller Fixed PR1743 - Intermittant deadlock in PluginRequestProcessor * NEWS: added PR1743 * plugin/icedteanp/IcedTeaNPPlugin.cc: declaration of cond_message_available moved to PluginRequestProcessor class * plugin/icedteanp/IcedTeaNPPlugin.h: removed external cond_message_available search * plugin/icedteanp/IcedTeaPluginRequestProcessor.h: message_queue_mutex, syn_write_mutex and message_queue moved to PluginRequestProcessor clas. Constructor, destructor and newMessageOnBus declarationmoved to end of class. declared queueProcessorThread method. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: Removed declaration of static message_queue_mutex, syn_write_mutex, message_queue. (PluginRequestProcessor) constructor and destructor and (newMessageOnBus) are now using the fields from PluginRequestProcessor class. new method of (queue_wait_cleanup) to unlock mutex added. (queue_processor) is now calling queueProcessorThread. Implemented (queueProcessorThread), which uses setMember, call , eval and loadUrl rather then processor->, versions. If no message_parts are available, the cleanup is done only if message_queue is empty. 2014-06-18 Jacob Wisor * netx/net/sourceforge/jnlp/resources/Messages.properties (BOredirect) (CCannotClearCache, CFakedCache, CONSOLEClean, CVCPCleanCache) (CVCPCleanCacheTip): Fixed language in some messages * netx/net/sourceforge/jnlp/resources/Messages_de.properties: Add new DE localized messages 2014-06-17 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (openAndParsePolicyFile): check if listModel already contains an element before adding a potential duplicate (addNewCodebase): perform the check for if the codebase is a duplicate when actually adding the codebase to the listModel, rather than beforehand and updating the UI in an invokeLater, which can cause a race 2014-06-17 Andrew Azores Some PolicyEditor logic extracted into new class PolicyEditorController to allow different UIs to be built without invoking any main PolicyEditor UI * netx/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewer.java (updateCustomPermissions): give "true" as param for setChangesMade * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (policyFile, changesMade, performingIO): moved into PolicyEditorController. All policyFile references changed to use policyEditorController instead (policyEditorController): new field * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java: new class to provide implementation of and programmatic interface for major PolicyEditor actions, to allow other UIs to be built in the future * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java (setNewTempfile): while-loop for waiting for PolicyEditor IO to complete changed to do-while (testAddMultipleCodebases, testCodebaseTrailingSlashesDoNotMatch): editor.addNewCodebases has been removed, using editor.addNewCodebase and a loop instead (testAddCustomPermission, testClearCustomPermission): added assert messages 2014-06-13 Andrew Azores TemporaryPermissions generated via reflection rather than hard coded * netx/net/sourceforge/jnlp/resources/Messages.properties (STempPermNoFile, STempPermNoNetwork, STempPermNoExec, STempNoFileOrNetwork, STempNoExecOrNetwork, STempNoFileOrExec, STempNoFileOrNetworkOrExec, STempAllMedia, STempSoundOnly, STempClipboardOnly, STempPrintOnly, STempAllFileAndPropertyAccess, STempReadLocalFilesAndProperties, STempReflectionOnly): removed (STempNetwork, STempReadFilesAndProperties, STempWriteFilesAndProperties, STempReflectionAndExternal, STempAllMedia): new messages * netx/net/sourceforge/jnlp/resources/Messages_cs.properties (STempPermNoFile, STempPermNoNetwork, STempPermNoExec, STempNoFileOrNetwork, STempNoExecOrNetwork, STempNoFileOrExec, STempNoFileOrNetworkOrExec, STempAllMedia, STempSoundOnly, STempClipboardOnly, STempPrintOnly, STempAllFileAndPropertyAccess, STempReadLocalFilesAndProperties, STempReflectionOnly): removed * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java: rewrite to use reflection to generate permissions from PolicyEditorPermissions rather than exposing statically defined values * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java: refactor to use new TemporaryPermissions change * tests/netx/unit/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsTest.java: new tests for TemporaryPermissions 2014-06-12 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (showChangesSavedDialog, showCouldNotSaveDialog): fixed comment to explain an issue with JVM exiting, rather than GC 2014-06-12 Andrew Azores Reduced usage of weak references in PolicyEditor * netx/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewer.java (weakThis): removed in favour of CustomPolicyViewer.this * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (weakThis): used only in showChangesSavedDialog and showCouldNotSaveDialog, other uses changed to PolicyEditor.this 2014-06-11 Andrew Azores CustomPolicyViewer refactored - methods extracted for unit testing and no longer holds PolicyFileModel reference, instead using parent PolicyEditor's interface for interacting with the file model * netx/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewer.java: no longer holds PolicyFileModel reference, interacts through PolicyEditor parent instead (addButtonAction, removeButtonAction, closeButtonAction): use extracted methods (addCustomPermission): extracted method, no longer adds visual duplicates (removeCustomPermission, quit): extracted methods (getCopyOfCustomPermissions): new method (updateCustomPermissions): use parent rather than PolicyFileModel * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (clearCustomPermissions): new method * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java (testAddCustomPermission, testClearCustomPermissions): new tests * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewerTest.java: new test class 2014-06-06 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/CustomPermission.java (toString): fixed empty actions string appearing on basic permissions, which do not have actions * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPermissionTest.java: (testToStringWithoutActions): new test 2014-06-06 Andrew Azores PolicyEditor copy/paste/rename methods extracted and unit tests added * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (codebaseClipboard): renamed to editorPermissionsClipboard (customPermissionsClipboard): new field for copy/pasting custom permissions (copyCodebaseButtonAction, pasteCodebaseButtonAction, renameCodebaseButtonAction): refactor to use newly extracted methods (copyCodebase, pasteCodebase, renameCodebase): methods extracted from corresponding button action ActionListeners (setPermission, addCustomPermission): new methods * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java (testRenameCodebase): new test for renaming codebase action (testCopyPasteCodebase): new test for copying and pasting codebases 2014-06-05 Andrew Azores Added "Copy codebase to clipboard" action to PolicyEditor * netx/net/sourceforge/jnlp/resources/Messages.properties (PECopyCodebaseToClipboardItem): new message * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (copyCodebaseToClipboardButtonAction): new action for "Copy codebase to clipboard" button (createMenuBar): added "Copy codebase to clipboard" button to Edit menu (renameCodebaseButtionAction): prefill dialog with old codebase 2014-06-05 Andrew Azores Added Rename, Copy, and Paste actions for codebases in PolicyEditor * netx/net/sourceforge/jnlp/resources/Messages.properties (PEEditMenu, PERenameCodebaseItem, PECopyCodebaseItem, PEPasteCodebaseItem, PERenameCodebase, PEPasteCodebase, PEEditMenuMnemonic): new messages * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (codebaseClipboard): new field to facilitate copy/pasting codebases. (renameCodebaseButtonAction, copyCodebaseButtonAction, pasteCodebaseButtonAction): new ActionListener fields for new actions. (interactivelyAddCodebase): renamed to addNewCodebaseInteractive. (validateCodebase): new utility method for validating codebases. (addNewCodebase, addNewCodebaseInteractive): use validateCodebase. (createMenuBar): add Edit menu and items. 2014-06-04 Lukasz Dracz Fixed Time Zone difference failure in unit test CreatePluginHeaderTestOk * unit/net/sourceforge/jnlp/util/logging/JavaConsoleTest.java: Test suite would check for the time in CET against the user's time value converted into their local timezone. Created a Date variable that ensures time passed into PluginMessage and the one being checked are of the same time zone. 2014-06-03 Andrew Azores Added indicator method for if PolicyEditor is currently performing file IO. Unit tests wait for IO to complete before testing editor contents. * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (performingIO, isPerformingIO): new field and getter to indicate if file IO is currently being performed. (changesMade): made volatile * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java (setNewTempFile): call Thread.sleep while editor.isPerformingIO 2014-06-03 Andrew Azores PolicyEditor persists empty non-default codebase entries * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEntry.java (toString): return empty string only if the codebase both has no permissions assigned and is also the default "All Applets" codebase * netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java (savePolicyFile): release fileLock with try/finally 2014-06-03 Lukasz Dracz This test expects a Null pointer exception however does not have a flag specifying that the NullPointer Exception is expected * unit/net/sourceforge/jnlp/util/UrlUtilsTest.java (verifyNotNullUrlEqualsThrowsExceptionWhenSecondArgumentIsNull): added 'expected = NullPointerException.class' to Test annotation 2014-06-03 Andrew Azores Fix for PR1776, PolicyEditor attempting to save to null file location when exiting editor and answering Yes to save changes first. * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (quit): select file to save to using fileChooser if file is null (policyEditorWindowQuit): new helper method for PolicyEditorWindow and PolicyEditorFrame quit() 2014-06-03 Lukasz Dracz Changed Temporary Permissions from menu items to check box menu items * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java (TemporaryPermissionsListener.actionPerformed): Added behaviour to add or remove permissions from a new collection of permissions based on whether the item is checked or not (TemporaryPermissionsButton.TemporaryPermissionsButton): Added action listener and applied the new collection of permissions for when the sandbox button is pressed 2014-06-02 Andrew Azores PolicyEditor file I/O made asynchronous with a progress indicator * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (savePolicyFile, openAndParsePolicyFile): use SwingWorker to make IO asynchronous, also show a progress bar. (checkPolicyChangesWithDialog): handle Exceptions thrown by policyFile.hasChanged() and policyFile.getFile().getCanonicalPath(), rather than letting them bubble up * netx/net/sourceforge/jnlp/security/policyeditor/IndeterminateProgressDialog.java: new class 2014-06-02 Andrew Azores PolicyEditor file I/O and model logic extracted into a new class * netx/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewer.java: store PolicyFileModel as field. (updateCustomPermissions): new method * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (codebasePermissionsMap, customPermissionsMap, file, fileWatcher, savePolicyFile, openAndParsePolicyFile): Policy file model logic extracted into new PolicyFileModel class. (policyFile) new PolicyFileModel field. (addNewCodebase, getCodebases, getPermissions, getCustomPermissions, updateCheckboxes, updateCheckboxesImpl, updateCustomPermissions, resetCodebases, openAndParsePolicyFile, savePolicyFile, initializeMapForCodebase, checkPolicyChangesWithDialog): refactored to use PolicyFileModel * netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java: new class for modelling Policy files * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorParsingTest.java: update to use PolicyEditor's policyFile field * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java (testReturnedCustomPermissionsSetIsCopy): initial assertion of empty set added, final assertion of empty set rephrased (testReturnedCodebasesAreCopy) renamed testReturnedCodebasesIsCopy, rephrased and using assertEquals rather than assertTrue 2014-05-29 Jie Kang Added reproducer for PR1794: Bug where Java variables are not accessed correctly through Javascript. Attempt to access a string array results in undefined result. However, attempt to access a string results in receiving correct value of string. Tests html applet and jnlp-href applet * tests/reproducers/simple/JToJSString/testcases/JToJSStringTest.java: New reproducer for PR1794 * tests/reproducers/simple/JToJSString/resources/JToJSString.html: same * tests/reproducers/simple/JToJSString/resources/JToJSJnlpApplet.html: same * tests/reproducers/simple/JToJSString/resources/JToJSString.js: same * tests/reproducers/simple/JToJSString/resources/JToJSApplet.jnlp: same * tests/reproducers/simple/JToJSString/srcs/JToJSString.java: same 2014-05-23 Jiri Vanek Fixed cache tests * tests/reproducers/signed/CacheReproducer/testcases/CacheReproducerTest.java: changed condition on checking cache dir from not existing to being empty, 2014-05-23 Jiri Vanek Minor code enhancements: Enum for HEAD and GET, urlutils classes moved to UrlUtils * netx/net/sourceforge/jnlp/cache/CacheEntry.java: "*" imports replaced by full ones location, version and properties made final. (isCurrent) rewritten * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (urlEquals) and (notNullUrlEquals) and (compare) moved to UrlUtils. (getReadPermission) got javadoc. urlList, keep, remove colelctions redeclared to diamond * netx/net/sourceforge/jnlp/cache/Resource.java: adapted imports and calls to CacheUtil UrlUtils change. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (requestMethods) hidden into public inner enum of RequestMethods. prefetchTrackers, queue, downloadOptions, active, resources, listeners marked final and redeclared with diamond. (getUrlResponseCode) adapted to new enum, removed javadoc. (getUrlResponseCodeWithRedirectonResult) adapted to new enum * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: file group loader appContext weakWindows weakWindows made final and redeclared with diamond. Added override annotations. (shouldCreateShortcut) changed to switch. * netx/net/sourceforge/jnlp/util/UrlUtils.java: used multi catch where possible. urlEquals, notNullUrlEquals, compareNullableStrings moved from CacheUtils * tests/netx/unit/net/sourceforge/jnlp/cache/CacheUtilTest.java: adapted to CacheUtils->UrlUtils method movement. * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTest.java: assertNotEquals replaced by assertFalse and equals. Specific versions of JUnit have problems with notEquals. * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: Adapted to new enum. * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java: added testUrlEquals verifyNotNullUrlEqualsThrowsExceptionWhenBothArgumentsAreNull nverifyNotNullUrlEqualsThrowsExceptionWhenFirstArgumentIsNull verifyNotNullUrlEqualsThrowsExceptionWhenSecondArgumentIsNull notNullUrlValuesEqualsCaseSensitiveIssuesTest notNullUrlComapreWithPorts (known to fail), testCompareNullableStrings and testCompareNullableStrings tests * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: removed unused imports, used diamonds, removed dead code. * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: Adapted to new enum. 2014-05-23 Jiri Vanek Minor javadoc enhancements * netx/net/sourceforge/jnlp/cache/CacheEntry.java: added or filled some javadocs * netx/net/sourceforge/jnlp/cache/CacheUtil.java: same * netx/net/sourceforge/jnlp/cache/Resource.java: same * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: same * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: same * netx/net/sourceforge/jnlp/util/FileUtils.java: same * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: same 2014-05-22 Jie Kang * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (saveAsButtonAction): set changesMade to true to allow savePolicyFile to save (savePolicyFile): no longer immediately returns if changesMade is false (updateMd5WithDialog): use changesMade along with file MD5 sum changes to determine whether to continue saving to disk, added check for FileNotFound and displays warning message telling user what has happened, also privatized method and renamed method to checkPolicyChangesWithDialog * netx/net/sourceforge/jnlp/util/MD5SumWatcher.java: Removed unused imports. * netx/net/sourceforge/jnlp/resources/Message.properties (PEFileMissing): Added new warning message for PolicyEditor 2014-05-21 Jiri Vanek Fixed slipped test classlaoder fix * sts/reproducers/simple/JavawsAWTRobotFindsButton/testcases/JavawsAWTRobotFindsButtonTest.java (static init) used system classlaoder to laod image 2014-05-21 Jiri Vanek * netx/sun/applet/AppletViewerPanelAccess.java: addedd accidentally skipped createAppletThread method 2014-05-21 Jiri Vanek Making the previous chnage actualy take an effect. * Makefile.am: All tests runs using CLASSPATH varibale on line, separated by semicolon. I have no idea wy this was needing. 2014-05-21 Jiri Vanek All tests adapted to run from XBootclaspath (forced by extending package private rt.jar class) * Makefile.am: all sets of call of -Xbootclasspath in tests and coverage are now adding $CLASSPATH to boot classapth. Where CLASSPATH was not deffined, was added. * tests/netx/unit/net/sourceforge/jnlp/JNLPMatcherTest.java: and * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ComponentFinder.java: resources loaded from boot classloader 2014-05-21 Jiri Vanek Made it works (basicaly) on any JDK * Makefile.am: (NETX_PKGS) sun.applet added to recognized netx packages (netx-dist.stamp) sun directory included into packed list * acinclude.m4: removed (IT_CHECK_FOR_APPLETVIEWERPANEL_HOLE) check. Added IT_CHECK_FOR_SUN_APPLET_ACCESSIBILITY, which test existence of classes sun.applet.AppletPanel, sun.applet.AppletViewerPanel fields applet, documentURL, baseURL and methods run and runLoader. Addapted messge * configure.ac: call to IT_CHECK_FOR_APPLETVIEWERPANEL_HOLE replaced by call to IT_CHECK_FOR_SUN_APPLET_ACCESSIBILITY * /netx/net/sourceforge/jnlp/NetxPanel.java: now extends AppletViewerPanelAccess instead of AppletViewerPanel directly. Access to baseURL, applet and documentURL replaced by dedicated getters/setters * netx/sun/applet/AppletViewerPanelAccess.java: new class extending AppletViewerPanel and enabling access to applet, documentURL and baseURL. Backed by reflection. Also overriding run by usage of short copypasted code. * netx/sun/applet/package-info.java: new file with worning about usage of this package in itw * plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java: only call to super debug repalced by ITW's debugging call * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: used getters as in NetxPanel 2014-05-21 Andrew Azores * AUTHORS: added Lukasz Dracz and Jie Kang 2014-05-21 Jie Kang * netx/net/sourceforge/jnlp/resources/Messages.properties (PEGReadFileSystem): Changed from "Read to" to "Read from" 2014-05-20 Lukasz Dracz Jie Kang * netx/net/sourceforge/jnlp/cache/Resource.java: (location, localFile, requestVersion, downloadVersion, transferred, size, status) made fields private and added setters and getters, and all calling sites refactored * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: Calling sites refactored * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java: Calling sites refactored * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTest.java: (testGetLocation, testGetRequestVersion, testGetDownloadVersion, testTransferredIsZero, testIncrementTransferred, testSizeIsNegativeOne, testSetSize, testStatusIsCopied) added tests 2014-05-14 Andrew Azores * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: (testSelectByStatus) split into (testSelectByStatusOneMatchingResource, testSelectByStatusNoMatchingResource, testSelectByStatusExcludedResources, testSelectByStatusMixedResources, testSelectByFilterUninitialized) 2014-05-14 Omair Majid * netx/net/sourceforge/jnlp/util/JarFile.java: Rename ZIP_LOCAL_FILE_HEADER_SIGNATURE to ZIP_ENTRY_HEADER_SIGNATURE. Fix comments. 2014-05-14 Omair Majid * tests/test-extensions/net/sourceforge/jnlp/tools/CodeSignerCreator.java (KeyPair): New class. (createCert): Use KeyPair. 2014-05-14 Omair Majid * netx/net/sourceforge/jnlp/JNLPFile.java (JNLPFile(InputStream,ParserSettings)) (JNLPFile(InputStream,URL,ParserSettings)): Remove incorrect @throws IOException in javadoc. * netx/net/sourceforge/jnlp/SecurityDesc.java (fromHtmlString): Fix param name in javadoc. * netx/net/sourceforge/jnlp/util/FileUtils.java (showCouldNotOpenDialog): Remove incorrect @param filePath from javadoc. * netx/net/sourceforge/nanoxml/XMLParseException.java, * netx/net/sourceforge/nanoxml/XMLElement.java: Replace
    with

    . 2014-05-14 Andrew Azores * netx/net/sourceforge/jnlp/cache/Resource.java: (Status) new enum replacing int bitfield statuses. (transferred, size) made volatile for atomic read/write. (isSet, getStatusString, changeStatus) refactored for Status enum. (hasFlags, setStatusFlag, setStatusFlags, unsetStatusFlag, resetStatus, isInitialized) new methods. (hashCode) newly overridden since equals was already overridden. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: all references to Resource int bitfield status refactored. (selectByFilter) new method since UNINITIALIZED is no longer an actual flag in Resource Status, allows for filtering by uninitialized resources anyway. * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTest.java: refactored for Status enum * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: refactored for Status enum and selectByFilter 2014-05-13 Omair Majid * netx/net/sourceforge/jnlp/cache/CacheEntry.java (readCacheEntryInfo): New method. (CacheEntry): Call readCacheEntryInfo to get properties. * tests/netx/unit/net/sourceforge/jnlp/cache/CacheEntryTest.java (readCacheEntryInfo): New method. (createCacheFile): Rename to ... (createFile): New method. Adjust all callers. (verifyOriginalContentLengthIsSetCorrectly): Create instances of TestCacheEntry, not CacheEntry. 2014-05-12 Omair Majid * netx/net/sourceforge/jnlp/cache/CacheEntry.java: Add KEY_CONTENT_ORIGINAL_LENGTH and LENGTH_UNKNOWN. (getOriginalContentLength, setOriginalContentLength) (getLongKey(String,long)): New methods. (isCached): Check if the original content length is recorded and use it, if available, as the content length. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (downloadResource): If the content was compressed, store original content length in the cache entry. * tests/netx/unit/net/sourceforge/jnlp/cache/CacheEntryTest.java (testOriginalContentLengthIsSetCorrectly) (verifyCachedIfOriginalContentLengthsAreSame): New method. 2014-05-12 Omair Majid * netx/net/sourceforge/jnlp/cache/CacheEntry.java: Use constants for strings. (initialize): Remove. (getRemoteContentLength, setRemoteContentLength, getLastModified) (setLastModified, getLongKey, setLongKey): New method. * tests/netx/unit/net/sourceforge/jnlp/cache/CacheEntryTest.java: New file. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (initializeResource, downloadResource): Use CacheEntry.setRemoteContentLength and CacheEntry.setLastModified instead of CacheEntry.initialize. 2014-05-12 Jiri Vanek ALACA is now able to remember decisions. * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java: moved columns in table. Inserted alaca between 0 and 1 * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: Added handling of UNSET, fixed calls to (now) getAppletSecurityActions. Shifted columns * netx/net/sourceforge/jnlp/resources/Messages.properties: (SUnsignedAllowedBefore) and (SUnsignedRejectedBefore) now handles date (SAppletTitle) removed, was legacy (APPEXTSECguiTableModelTableColumnActionUA) and (APPEXTSECguiTableModelTableColumnActionMatchALACA) added. * netx/net/sourceforge/jnlp/resources/Messages_cs.properties:(SAppletTitle) removed, was legacy * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Added (getLocalisedTimeStamp) helper method. * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: Call to showMatchingALACAttributePanel dialogue now forwards whole file, not just title. * netx/net/sourceforge/jnlp/security/SecurityDialog.java: First extras to matchingAlaca retyped to JNLPFile * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: MInor javadoc fixes. (showMatchingALACAttributePanel) now have whole JNLP instead of just title. Added handling of saved/saving value * netx/net/sourceforge/jnlp/security/appletextendedsecurity/AppletSecurityActions.java: made to recognize second record as alaca one. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java: unsignedAppletAction changed to appletSecurityActions * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionStorage.java: Whole getMatchingItem family of methods get Integer id parameter, to recognize which record is the one they care about. If id is null, then they return first match, no meter of whether is "strong"(pernament) or week (just hint) * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: adapted to id in interface. Fixed bug with saving the entry. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java: Added handling of multiple actions, added column. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: implemented the id change. * netx/net/sourceforge/jnlp/security/dialogs/MatchingALACAttributePanel.java: removed to apptrustwarningpanel * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningDialog.java: made ALCA dialog aware * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: added generalized impl for title handling. * /netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/MatchingALACAttributePanel.java: new class, derived from dialogs, now extending AppTrustWarningPanel * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: removed custom handling of title. Added minSize. Added usage of stored date in text * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningDialog.java: removed, should be removed long ago when this dialogue was generalized. * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningPanel.java: removed custom handling of title. Added minSize. Added usage of stored date in text * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/AppletSecurityActionsTest.java: added test for iteration (testIterator) * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImplTest.java: adapted for need of id of attribute * tests/netx/unit/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanelTest.java: Adapted to dialog in constructor of UnsignedAppletTrustWarningPanel 2014-05-12 Andrew Azores * tests/netx/unit/net/sourceforge/jnlp/util/FileUtilsTest.java: new test class for FileUtils 2014-05-12 Andrew Azores * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (urlToPath) use StringBuilder, not StringBuffer * tests/netx/unit/net/sourceforge/jnlp/cache/CacheUtilTest.java: (testUrlEquals, testUrlToPath) new tests 2014-05-09 Andrew Azores * netx/net/sourceforge/jnlp/util/TimedHashMap.java: implements Map interface, added all missing methods. (timeStamps) removed, refactored to only be composed of one backing map rather than two. * tests/netx/unit/net/sourceforge/jnlp/util/TimedHashMapTest.java: new test methods added 2014-05-09 Andrew Azores * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (selectByFlag) made package-private * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: (testSelectByFlag) new test method * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTest.java: new test class 2014-05-09 Andrew Azores * netx/net/sourceforge/jnlp/util/TimedHashMap.java: (setExpiry) new method * tests/netx/unit/net/sourceforge/jnlp/util/TimedHashMapTest.java: new test class for TimedHashMap 2014-05-09 Jiri Vanek Internal implementation of ExecuteAppletAction now support multiple items * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java: Returning AppletSecurityActions instead of ExecuteAppletAction class * netx/net/sourceforge/jnlp/resources/Messages.properties: added APPEXTSECunsetAppletAction key. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/AppletSecurityActions.java: New file, to handle multiple actions hidden in one record. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteAppletAction.java: Added UNSET option, handled in (fromString) and (fromChar) and (toChar) and (toExpalnation) * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java: instead of ExecuteAppletAction type in fromString and constructor, using AppletSecurityActions * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: behaviour wrapped by AppletSecurityActions.fromAction(behaviour) * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/AppletSecurityActionsTest.java: New test for new file * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmationTest.java: added license header * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImplTest.java: Test adapted to new features, and to preserving old behavior. 2014-05-05 Jiri Vanek Links in AppTrustWarningPanel are now clickable. * netx/net/sourceforge/jnlp/resources/Messages.properties: (SUnsignedDetail) codebase and url changed to href. * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: infoLabel redeclared from JLabel to JEditorPane. Added hyperlinkListener. * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: publisher string allowed to use href. 2014-05-05 Jiri Vanek Properly disconnect all connected http connections * netx/net/sourceforge/jnlp/cache/CacheEntry.java: (isCurrent) is using lastModified of long rather then whole url connection. Callers adapted. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (getReadPermission) closed http connection. (isCurrent) retyped to use lastModified of long rather then whole connection. Removed workaround of it. Callers adapted. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (downloadResource) Closed http connection. * netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java: Closed http connection. * netx/net/sourceforge/jnlp/services/XBasicService.java: (isOffline) Closed http connection. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Closed http connections. * tests/test-extensions-tests/net/sourceforge/jnlp/ServerAccessTest.java: Adapted to URLconnection -> long signature changes. * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: Closed http connections. 2014-05-02 Omair Majid * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java: Switch to JDialog from JFrame. Rename frame to dialog and frameMutex to dialogMutex. Adjust all Callers. 2014-05-02 Omair Majid * netx/net/sourceforge/jnlp/cache/package-info.java, * netx/net/sourceforge/jnlp/runtime/package-info.java, * netx/net/sourceforge/jnlp/services/package-info.java: Fix package name by replacing 'netx' with 'net'. 2014-04-15 Jiri Vanek Reflect possibility of disabled manifest check to unit-test * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPFileTest.java: new field (attCheckValue) to store original value. (setPermissions) is enabling check and (resetPermissions) returning back to original 2014-04-14 Andrew Azores * netx/net/sourceforge/jnlp/resources/Messages.properties: (PEAccessThreads, PEAccessThreadsDetail, PEAccessThreadGroups, PEAccessThreadGroupsDetail) new messages * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java: (ACCESS_THREADS_PERMISSION, ACCESS_THREAD_GROUPS_PERMISSION) new permissions, added to reflection group. Use diamond operator. * netx/net/sourceforge/jnlp/security/policyeditor/PermissionTarget.java: (ACCESS_THREADS, ACCESS_THREAD_GROUPS) new targets * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java: (ACCESS_THREADS, ACCESS_THREAD_GROUPS) new permissions, added to reflection group. Minor formatting fixes. 2014-04-14 Jiri Vanek All manifest attributes can be disabled * netx/net/sourceforge/jnlp/config/Defaults.java: added new KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK configuration. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: Added KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK key * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: (isCheckEnabled) new method to check value of KEY_ENABLE_MANIFEST_ATTRIBUTES_CHECK (checkAll) is testing isCheckEnabled before checking individual attributes. 2014-04-14 Andrew Azores Use Swing generics, cleanup with diamond operator * netx/net/sourceforge/jnlp/controlpanel/CachePane.java * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java * netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java 2014-04-10 Andrew Azores Update PolicyEditor classes for Java 7 - Swing Generics, Diamond operator. Also some formatting fixes. * netx/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewer.java * netx/net/sourceforge/jnlp/security/policyeditor/PermissionActions.java * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEntry.java 2014-04-10 Andrew Azores * Makefile.am: (HAVE_JAVA7) removed * acinclude.m4: (IT_CHECK_JAVA_VERSION) new check for JDK version. (IT_CHECK_FOR_JDK) changed directories to search for JDK, notably adding alternatives-defined JDK location * configure.ac: (IT_CHECK_JAVA_VERSION) new check for JDK version * plugin/icedteanp/IcedTeaNPPlugin.cc: (HAVE_JAVA7) renamed and modified to HAVE_JAVA8 * netx/net/sourceforge/jnlp/security/VariableX509TrustManagerJDK6.java: removed 2014-04-07 Andrew Azores * Makefile.am: (IT_LANGUAGE_SOURCE_VERSION, IT_CLASS_TARGET_VERSION) bumped to 7, dropping JDK6 compatibility 2014-04-07 Andrew Azores * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: (showPartiallySignedWarningDialog) add missing shouldPromptUser check 2014-04-02 Omair Majid * netx/net/sourceforge/jnlp/util/ClasspathMatcher.java (quote): Rename to .. (convertWildcardToRegEx): New method. Adjust all callers. 2014-04-02 Jiri Vanek * NEWS: Added 1.6 section 2014-04-02 Jiri Vanek * configure.ac: bumped (AC_INIT) to 1.6pre 2014-04-02 Jiri Vanek * NEWS: Bumped date of 1.5 release to 2014 2014-04-01 Andrew Azores Fix Permissions manifest attribute check * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: (isNoneOrDefault) new method. (validateRequestedPermissionLevelMatchesManifestPermissions) new method. (checkPermissionsAttribute) rework to closer match spec and fix bug in not allowing signed applets to request sandbox permissions. 2014-04-01 Jiri Vanek * netx/net/sourceforge/jnlp/JNLPFile.java: hardcoded strings replaced by SecurityDesc.RequestedPermissionLevel values. * netx/net/sourceforge/jnlp/PluginBridge.java: likewise * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPFileTest.java: likewise * tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java: added new tests (testGetRequestedPermissionLevel1) - (testGetRequestedPermissionLevel7). Added (minimalJnlp) field. * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: added new (testGetRequestedPermissionLevel) test. * netx/net/sourceforge/jnlp/SecurityDesc.java: added (DEFAULT) into (RequestedPermissionLevel) and fixed typo in (J2EE) jnlpValue 2014-04-01 Andrew Azores * netx/net/sourceforge/jnlp/SecurityDesc.java: (RequestedPermissionLevel) new enum to describe the permission level requested in an applet's JNLP/HTML. (requestedPermissionLevel) new field. (SecurityDesc) new constructor with RequestedPermissionLevel added. (getRequestedPermissionLevel) new method. * netx/net/sourceforge/jnlp/JNLPFile.java: (getRequestedPermissionLevel) new method * netx/net/sourceforge/jnlp/Parser.java: (getSecurity) construct SecurityDescs with correct RequestedPermissionLevel * netx/net/sourceforge/jnlp/PluginBridge.java: (getRequestedPermissionLevel) new overridden method * netx/net/sourceforge/jnlp/PluginParameters.java: (getPermissions) new method 2014-04-01 Jiri Vanek * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: adapted to match newest state. (MissingPermissionsMainTitle) (MissingPermissionsInfo) (ALACAMissingMainTitle) (ALACAMissingInfo) (ALACAMatchingMainTitle) (ALACAMatchingInfo) removed codebase word, used text in all hrefs. 2014-04-01 Jiri Vanek Manual quotation in ClasspathMatcher regex replaced by Pattern.quote * netx/net/sourceforge/jnlp/util/ClasspathMatcher.java: (quote) is now using Pattern.quote instead manual \Q + original + \E 2014-04-01 Jiri Vanek Restricted CodebaseMatcher to not match aaexample.com by *.example.com expression but still match example.com - as in specification. * netx/net/sourceforge/jnlp/util/ClasspathMatcher.java: (domainToRegEx) consists of original regex connected by or with second one in case of *. start. (sourceToRegExString) part of the logic extracted to quote method. * tests/netx/unit/net/sourceforge/jnlp/util/ClasspathMatcherTest.java: (matchTest5) adapted. (wildCardSubdomainDoesNotMatchParentDomainPaths) new test, focusing on aaexample.com/example.com/aaa.example.com in *.example.com both path and domain. 2014-03-31 Omair Majid * netx/net/sourceforge/jnlp/resources/Messages.properties (MissingPermissionsMainTitle): Remove 'codebase' (MissingPermissionsInfo): Use simple link title. 2014-03-31 Omair Majid * netx/net/sourceforge/jnlp/resources/Messages.properties (ALACAMissingMainTitle, ALACAMissingInfo ALACAMatchingMainTitle) (ALACAMatchingInfo): Rephrase strings and replace full links with page names. * netx/net/sourceforge/jnlp/util/UrlUtils.java (setOfUrlsToHtmlList): Enclose list in 'ul' element. 2014-03-31 Jiri Vanek Allowed wrong match of the aaaexample.com by *.example.com expression as in specification. * netx/net/sourceforge/jnlp/util/ClasspathMatcher.java: uncommented handling of dot in (domainToRegEx). * tests/netx/unit/net/sourceforge/jnlp/util/ClasspathMatcherTest.java: (matchTest) uncommented and added tests of/for dot issue. 2014-03-31 Jiri Vanek Alexandr Kolouch Fixed cz_CS locales and adapted tests * netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties: added missing values * tests/reproducers/simple/LocalesTest/testcases/LocalesTestTest.java: Added few untranslatable items to white-list. (allResourcesAreReallyDifferent) now skip test on values of "std. err" "std. out" "Policy Editor" and "Java Reflection" 2014-03-31 Omair Majid * acinclude.m4 (IT_CHECK_XULRUNNER_MIMEDESCRIPTION_CONSTCHAR), (IT_CHECK_XULRUNNER_REQUIRES_C11): Use AC_LANG_SOURCE with code. 2014-03-31 Jiri Vanek Refactored check of heap space. Now recognize g/G and is based on regex * netx/net/sourceforge/jnlp/JREDesc.java: Added (heapPattern) constant. (checkHeapSize) now returns trimmed string and its logic is matching the heapPattern instead compelx structure. (init) set result of checkHeapSize as initialHeapSize and maximumHeapSize. * tests/netx/unit/net/sourceforge/jnlp/JREDescTest.java: tests for (checkHeapSize) and (init) of JREDesc. 2014-03-27 Andrew Azores Fix NPE when trying to open a new file, with changes made, and wanting to save these changes to a file * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (openButtonAction) display Save As file chooser if there is no file object yet and user wishes to save changes 2014-03-27 Andrew Azores Fix bug with checkboxes not correctly updating on open and with repeats of a codebase appearing when opening a file multiple times * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (resetCodebases) new method. (openAndParsePolicyFile) call resetCodebases at start. (PolicyEditor) call resetCodebases in constructor 2014-03-27 Andrew Azores Applets can be temporarily granted permission levels above fully sandboxed but below all-permission * netx/net/sourceforge/jnlp/resources/Messages.properties: (STempPermNoFile, STempPermNoNetwork, STempPermNoExec, STempPermNoFileOrNetwork, STempPermNoExecOrNetwork, STempPermNoFileOrExec, STempPermNoFileOrNetworkOrExec, STempAllMedia, STempSoundOnly, STempClipboardOnly, STempPrintOnly, STempAllFileAndPropertyAccess, STempReadLocalFilesAndProperties, STempReflectionOnly): new messages * netx/net/sourceforge/jnlp/security/SecurityDialog.java: (installPanel) pass SecurityDelegate to partially signed dialog * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: (showPartiallySignedWarningDialog) added SecutityDelegate param for message extras * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: (checkPartiallySignedWithUserIfRequired) added SecurityDelegate param * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: (createPolicyPermissionsMenu, PolicyEditorLaunchListener, PolicyEditorPopupListener) removed in favour of TemporaryPermissionsButton * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningDialog.java: (partiallySigned) SecurityDelegate param * netx/net/sourceforge/jnlp/security/policyeditor/PermissionActions.java: (DELETE, READLINK, FILE_ALL) new actions. (rawActions, rawString) can retrieve raw String representation of the action * netx/net/sourceforge/jnlp/security/policyeditor/PermissionTarget.java: (USER_HOME, TMPDIR) grant permissions to entire directory, not only children * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java: (DELETE_LOCAL_FILES, DELETE_TMP_FILES) new permissions. (Group.WriteFileSystem) added DELETE* permissions * nests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorParsingTest.java: update for change in PermissionTarget * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java: new class * netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java: new class 2014-03-27 Jiri Vanek Clenaup in PolicyEditor tests and MVC * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: MVC mixing method (updatecheckboxes) splited to invokelater and plain impls. * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/* : removed warnings and fixed wrong package declaration. * tests/test-extensions/net/sourceforge/jnlp/util/FileTestUtils.java: when filelaks are negative, take it as success. 2014-03-26 Andrew Azores Fix JOptionPane modality problems after making PolicyEditor itself modal * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: JOptionPane dialog parents set correctly to JDialog or JFrame rather than JPanel 2014-03-26 Jiri Vanek * netx/net/sourceforge/jnlp/resources/Messages.propertie: new keys (STOAsignedMsgFully) (STOAsignedMsgAndSandbox) (STOAsignedMsgPartiall) added * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: extracted hardocded values of (signedMsg) 2014-03-26 Jiri Vanek Added possibility to group permissions in PolicyEditor * netx/net/sourceforge/jnlp/resources/Messages.properties: added groups names * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (setLayout) added grouping panels and checkboxes. (JcheckBoxWithGroup) New inner class to work with groups. netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java: Added inner class (Groups) and deffinied (ReadFileSystem) (WriteFileSystem) (AccesUnowenedCode) (MediaAccess) 2014-03-26 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (savePolicyFile, openAndParsePolicyFile) made synchronous so that programmatically adding a new codebase has a well-defined order when performed immediately after starting a new PolicyEditor instance 2014-03-26 Andrew Azores Jiri Vanek PolicyEditor can be made modal. * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (PolicyEditorWindow) new interface to facilitate PolicyEditor as a Window rather than Panel. (PolicyEditorFrame, PolicyEditorDialog) PolicyEditorWindow implementations. (getPolicyEditorFrame, getPolicyEditorWindow) new methods to get frame or dialog implementations. (setComponentMnemonic) made static. (preparePolicyEditorWindow) common setup for frame and dialog implementations. * netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: refactor to use PolicyEditorWindow * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java same * netx/net/sourceforge/jnlp/util/FileUtils.java: (showReadOnlyDialog, showCouldNotOpenFileDialog, showCouldNotOpenFilePathDialog, showCouldNotOpenDialog) use Component rather than JFrame 2014-03-26 Andrew Azores Added many new permissions for PolicyEditor * netx/net/sourceforge/jnlp/resources/Messages.properties: (PEWriteProps, PEWritePropsDetail, PEWriteSystemFiles, PEWriteSystemFilesDetail, PEAWTPermission, PEAWTPermissionDetail, PERecordAudio, PERecordAudioDetail, PEReflection, PEReflectionDetail, PEClassLoader, PEClassLoaderDetail, PEClassInPackage, PEClassInPackageDetail, PEDeclaredMembers, PEDeclaredMembersDetail, PEExec, PEExecDetail, PEGetEnv, PEGetEnvDetail): new messages. (PEAudio, PEAudioDetail) renamed to PEPlayAudio{,Detail}. * netx/net/sourceforge/jnlp/security/policyeditor/PermissionActions.java: (EXECUTE) new action * netx/net/sourceforge/jnlp/security/policyeditor/PermissionTarget.java: (ALL_FILES, RECORD, REFLECT, GETENV, ACCESS_CLASS_IN_PACKAGE, DECLARED_MEMBERS, CLASSLOADER) new targets * netx/net/sourceforge/jnlp/security/policyeditor/PermissionType.java: (REFLECT_PERMISSION) new type * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java: (WRITE_PROPERTIES, WRITE_SYSTEM_FILES, JAVA_REFLECTION, GET_CLASSLOADER, ACCESS_CLASS_IN_PACKAGE, ACCESS_DECLARED_MEMBERS, EXEC_COMMANDS, GET_ENV, ALL_AWT, RECORD_AUDIO) new permissions. (AUDIO) renamed PLAY_AUDIO. 2014-03-24 Andrew Azores * netx/net/sourceforge/jnlp/runtime/ManifestsAttributesValidator.java: renamed to ManifestAttributesChecker. * netx/net/sourceforge/jnlp/runtime/ManifestAttributesChecker.java: (checkTrustedOnlyAttribute, checkCodebaseAttribute, checkPermissionsAttribute, checkApplicationLibraryAllowableCodebaseAttribute) made private. (checkAll) new method. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: reflect above changes 2014-03-24 Andrew Azores * netx/net/sourceforge/jnlp/runtime/ManifestsAttributesValidator.java: (checkTrustedOnlyAttrubute) works properly with sandboxing 2014-03-24 Jiri Vanek Client applications now log into new console. * netx/net/sourceforge/jnlp/resources/Messages.properties: added keys (COPitw) and (COPclientApp) for new checkboxes in console * netx/net/sourceforge/jnlp/runtime/Boot.java: added brackets to headless if * netx/net/sourceforge/jnlp/util/TeeOutputStream.java: moved to * netx/net/sourceforge/jnlp/util/logging/TeeOutputStream.java: and improved to log into new console. * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: added new checkboxes to filter out/in custom app/itw logs. copyAll buttons do not include custom app's logs in case of first click. * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java: Added testing data with custom app. (HTMLCOLOR_PURPLE) and (HTMLCOLOR_GREEN) as new colors for custom app. (filter) now handle client app. * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: (init) redirect stdout/err over teeOutputStream * /netx/net/sourceforge/jnlp/util/logging/OutputController.java: (consume) do not reprint if header is marked by isClientApp * netx/net/sourceforge/jnlp/util/logging/headers/Header.java: added field (isClientApp) 2014-03-24 Jiri Vanek * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: (visualCleanCache) consider exception in cache operation as not-scuess. * netx/net/sourceforge/jnlp/resources/Messages.properties: (CCannotClearCache) (CFakedCache) (CVCPCleanCacheTip) improved by fix it tips. 2014-03-24 Andrew Azores * NEWS: added mention of Trusted-only manifest attribute 2014-03-24 Andrew Azores Added ability to launch PolicyEditor from security prompts, with the current applet's codebase pre-selected in the editor. * netx/net/sourceforge/jnlp/resources/Messages.properties: (CertWarnPolicyTip, CertWarnPolicyEditor): new messages * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: can launch PolicyEditor from new options overflow button * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: same 2014-03-24 Andrew Azores * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: pass SecurityDelegate to ManifestsAttributesValidator * netx/net/sourceforge/jnlp/runtime/ManifestsAttributesValidator.java: (securityDelegate) new field, added to constructor. (checkTrustedOnlyAttribute, checkPermissionsAttribute) works with RunInSandbox. 2014-03-20 Andrew Azores Trusted-only manifest attribute implementation * netx/net/sourceforge/jnlp/resources/Messages.properties: (STrustedOnlyAttributeFailure) new message * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: added ManifestsAttributesValidator#checkTrustedOnlyAttribute() to constructor * netx/net/sourceforge/jnlp/runtime/ManifestsAttributesValidator.java: (checkTrustedOnlyAttribute) new method * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed-nosecurity.jnlp: new tests for Trusted-only attribute * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed-security.jnlp * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-signed.html * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigned-nosecurity.jnlp * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigned-security.jnlp * tests/reproducers/custom/TrustedOnlyAttribute/resources/TrustedOnlyAttribute-unsigned.html * tests/reproducers/custom/TrustedOnlyAttribute/srcs/MANIFEST.MF * tests/reproducers/custom/TrustedOnlyAttribute/srcs/Makefile * tests/reproducers/custom/TrustedOnlyAttribute/srcs/TrustedOnlyAttribute.java * tests/reproducers/custom/TrustedOnlyAttribute/testcases/TrustedOnlyAttributeTest.java 2014-03-20 Andrew Azores Passing a reference to SecurityDelegate to CertWarningPane, so that UI elements can be added later to allow the applet to be run Sandboxed + some temporary permissions * netx/net/sourceforge/jnlp/security/JNLPAppVerifier.java: (checkTrustWithUser) pass SecurityDelegate reference to SecurityDialogs.showCertWarningDialog * netx/net/sourceforge/jnlp/security/PluginAppVerifier.java: same * netx/net/sourceforge/jnlp/security/SecurityDialog.java: pass SecurityDelegate reference from extras into CertWarningPane constructor * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: (showCertWarningDialog) added SecurityDelegate parameter, add to extras array. * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java: (askUser) pass null for SecurityDelegate reference * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: (CertWarningPane) added SecurityDelegate constructor parameter and (securityDelegate) field 2014-03-20 Andrew Azores SecurityDelegate can be used to add permissions to JNLPClassLoader during run. This is useful for adding temporary extra permissions to an applet. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (SecurityDelegate addPermission, addPermissions) new methods. (SecurityDelegateImpl addPermission, addPermissions) implement previous. 2014-03-20 Jiri Vanek Clear cache function made more visible. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (okToClearCache) released never released lock. (clearCache) now recriated directory after cleaning. * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: Added delete all button. (restoreDisabled) and (disableButtons) are containing duplicated code. (invokeLaterDeleteAll) and (visualCleanCache) utility methods accessing CacheUtil.clearCache. * netx/net/sourceforge/jnlp/resources/Messages.properties: added (CVCPCleanCache) and (CVCPCleanCacheTip) keys * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java: added (cacheButton) * netx/net/sourceforge/jnlp/util/BasicExceptionDialog.java: also added (cacheButton) but also included some layout refactoring to have buttons in row. 2014-03-20 Jiri Vanek Methods validating manifests' attributes moved to separate class. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Cleaned imports. At (init) methods (checkCodebaseAttribute), (checkPermissionsAttribute) and (checkApplicationLibraryAllowableCodebaseAttribute) moved to ManifestsAttributesValidator. (guessCodeBase) generalized in UrlUtils. * netx/net/sourceforge/jnlp/runtime/ManifestsAttributesValidator.java: new class. Contains logic to validate manifests'attributes. * netx/net/sourceforge/jnlp/util/UrlUtils.java: added method (guessCodeBase) as generalization of JNLPClassLoader's guessCodeBase method. 2014-03-14 Andrew Azores Added new PartiallySigned Dialog to replace NotAllSignedWarningPane. Also includes a Sandbox button. * netx/net/sourceforge/jnlp/resources/Messages.properties: (APPEXTSecunsignedAppletActionSandbox, LPartiallySignedApplet, LPartiallySignedAppletUserDenied) new messages. (SNotAllSignedSummary, SNotAllSignedDetail, SNotAllSignedQuestion) keys renamed to SPartially* * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: (SNotAllSignedSummary, SNotAllSignedDetail, SNotAllSignedQuestion) keys renamed to SPartially* * netx/net/sourceforge/jnlp/resources/Messages_de.properties: same * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: same * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Logic added for displaying new PartiallySigned dialog. (showNotAllSignedDialog) removed. (getSigningState) new method. (promptUserOnPartialSigning, userPromptedForPartialSigning) new methods for SecurityDelegate. * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningDialog.java: (partiallySigned) new method * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: (chosenActionSetter) refactored to allow Sandbox action. (setupInfoPanel) applet title made overrideable by subclasses * netx/net/sourceforge/jnlp/security/SecurityDialog.java: (NOTALLSIGNED_WARNING) renamed PARTIALLYSIGNED_WARNING, display new dialog rather than old * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: (NOTALLSIGNED_WARNING) renamed PARTIALLYSIGNED_WARNING. (showNotAllSignedWarningDialog) removed. (showPartiallySignedWarningDialog) new method * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteAppletAction.java: Added Sandbox action * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: (checkPartiallySignedWithUserIfRequired) new method * tests/reproducers/custom/SignedAppletCodebaseLoading/testcases/SignedAppletCodebaseLoadingTests.java: test now passes since dialog will not appear if applet security is set to Low. KnownToFail removed. * tests/reproducers/custom/SignedAppletExternalMainClass/testcases/SignedAppletExternalMainClassTest.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java: new class * netx/net/sourceforge/jnlp/security/dialogs/NotAllSignedWarningPane.java: deleted in favour of PartiallySignedAppTrustWarningPanel 2014-03-14 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (addNewCodebase) ensure that checkboxes update. (removeCodebase, updateCheckboxes) ensure UI updates are done on EDT. 2014-03-14 Jiri Vanek Base implementation of Application-Library-Allowable-Codebase. Remember button not yet working. * netx/net/sourceforge/jnlp/JNLPFile.java: (ClasspathMatchers) (getApplicationLibraryAllowableCodebase) (getCodebase) (getCodeBaseMatchersAttribute) (getCodeBaseMatchersAttribute) (getCodeBaseMatchersAttribute) changed signature to include/not include path in returned matcher. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added keys (ALACAMissingMainTitle) (ALACAMissingInfo) (ALACAMatchingMainTitle) (ALACAMatchingInfo) for new dialogs. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Implemented (checkApplicationLibraryAllowableCodebaseAttribute). Used in (init) * netx/net/sourceforge/jnlp/security/SecurityDialog.java: made aware of new constants (MISSING_ALACA) and (MATCHING_ALACA) * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: new constants (MISSING_ALACA) and (MATCHING_ALACA). Implemented (showMissingALACAttributePanel) and (showMatchingALACAttributePanel) * netx/net/sourceforge/jnlp/security/dialogs/MatchingALACAttributePanel.java new dialog for Matching attribute * netx/net/sourceforge/jnlp/security/dialogs/MissingALACAttributePanel.java: new dialog for Missing attribute. * netx/net/sourceforge/jnlp/util/ClasspathMatcher.java: allowing user to choose whether to include paths in matching or not. * netx/net/sourceforge/jnlp/util/UrlUtils.java: new util methods (removeFileName) (setOfUrlsToHtmlList) (sanitizeLastSlash) and (equalsIgnoreLastSlash) to strip filename from url, toString for iterable of urls to string, and for operations with URLs independently on last slash * tests/netx/unit/net/sourceforge/jnlp/util/ClasspathMatcherTest.java: added tests for paths * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java: added tests for new methods 2014-03-13 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (savePolicyFile, updateMd5WithDialog) avoid NPE when saving to a new file 2014-03-13 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: adapted to permissions attribute 2014-03-13 Jiri Vanek Fixing rear deadlock issue * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: removed (probably) unnecessary synchronization of (refreshPaneBody). 2014-03-13 Jiri Vanek Fixed appearance of download indicator * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (init) attributes are allowed to access jars only once all resources are downloaded 2014-03-12 Jiri Vanek * configure.ac: added check for /bin/bash 2014-03-12 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (initializeMapForCodebase) returns boolean indicating if the given codebase already existed. (addNewCodebase) do not add codebases if they already exist 2014-03-12 Andrew Azores * netx/net/sourceforge/jnlp/resources/Messages.properties: (PEFileModified, PEFileModifiedDetail) new messages * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (fileWatcher, openAndParsePolicyFile, savePolicyFile) update to use MD5SumWatcher to check if the file has changed externally since being opened * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java: URLs changed to example.com 2014-03-12 Andrew Azores * netx/net/sourceforge/jnlp/resources/Messages.properties: (PECodebaseFlag) new message for policyeditor -help * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (HELP_MESSAGE) added -codebase flag * netx/policyeditor.1: updated -file and added -codebase and -help 2014-03-11 Andrew Azores * netx/net/sourceforge/jnlp/security/policyeditor/PermissionTarget.java: (TMPDIR) is java.io.tmpdir, not io.tmpdir 2014-03-11 Jiri Vanek New java console made localizable. * netx/net/sourceforge/jnlp/resources/Messages.properties: added new family of keys (COP) for new console * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: where reasonable, strings replaced by records in properties. * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: (rawData) and (outputs) made final. 2014-03-11 Jiri Vanek * netx/net/sourceforge/jnlp/resources/Messages.properties: added (CONSOLEClean) key for new button * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: (update) method enhanced for possibility to force refresh * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: added ButClean button. (updateModel) overlaoded with force attribute. 2014-03-11 Jiri Vanek * netx/policyeditor.1: Mentioned that it is more GUI then commandline tool 2014-03-11 Jiri Vanek Implemented Permissions manifest entry handling. * NEWS: mentioned Permissions attribute * netx/net/sourceforge/jnlp/JNLPFile.java: new enum (ManifestBoolean) introduced to replace true/false/null by TRUE/FALSE/UNDEFFINED. (isTrustedOnly), (isTrustedLibrary), (isSandboxForced) and (processBooleanAttribute) moved to use ManifestBoolean. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added (ButYes) (ButNo) (MissingPermissionsMainTitle) and (MissingPermissionsInfo) keys * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: is now checking (checkPermissionsAttribute) in (init). Implemented new (checkPermissionsAttribute) method to handle Permissions attribute * netx/net/sourceforge/jnlp/security/SecurityDialog.java: can handle (UNSIGNED_EAS_NO_PERMISSIONS_WARNING) * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: defined (UNSIGNED_EAS_NO_PERMISSIONS_WARNING ) and (showMissingPermissionsAttributeDialogue) * netx/net/sourceforge/jnlp/security/dialogs/MissingPermissionsAttributePanel.java: new class, implementation of missing permissions attribute panel. * netx/net/sourceforge/jnlp/security/dialogs/SecurityDialogPanel.java: changed (initialFocusComponent) from package private to descendant visible * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: and * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPFileTest.java: adapted to (ManifestBoolean) and to Permissions attribute handling at all. 2014-03-10 Omair Majid * netx/javaws.1, * netx/itweb-settings.1: Change "SYNOPSYS" to "SYNOPSIS". * NEWS: Add itweb-setings man page. 2014-03-10 Andrew Azores Added MD5SumWatcher utility class to detect when a file's contents have been changed on disk. * netx/net/sourceforge/jnlp/util/FileUtils.java: (getFileMD5Sum) new function * netx/net/sourceforge/jnlp/util/MD5SumWatcher.java: new class * tests/netx/unit/net/sourceforge/jnlp/util/MD5SumWatcherTest.java: new tests for MD5SumWatcher 2014-03-10 Andrew Azores * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissionsTest.java: (testActionsRegex, testTargetRegex, testRegexesAgainstBadPermissionNames): update after moving regexes from PolicyEditorPermissions into CustomPermission 2014-03-10 Andrew Azores PolicyEditor parsing enhancements, new tests, and bugfixes * NEWS: added entry for PolicyEditor * netx/net/sourceforge/jnlp/resources/Messages.properties: (PESaveAsMenuItemMnemonic, PEExitMenuItemMnemonic) changed mnemonic keys due to masking with ctrl rather than alt * netx/net/sourceforge/jnlp/security/policyeditor/CustomPermission.java: (ACTIONS_PERMISSION, TARGET_PERMISSION, fromString) use regexes to parse * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (file) keep reference to File rather than String filePath. (getPermissions) returns empty map rather than null. (setComponentMnemonic) new method. (getCustomPermissions) new function. (openAndParsePolicyFile) check for OpenFileResult FAILURE and NOT_FILE rather than null. (setupLayout) File, Save, SaveAs, and Exit items modifier mask changed to Ctrl rather than Alt * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java: (fromString) use regexes to parse, using CustomPermission as intermediate representation * netx/net/sourceforge/jnlp/util/FileUtils.java: (testDirectoryPermissions) add check for getCanonicalFile and null safeguarding. (testFilePermissions) add check for getCanonicalFile and return FAILURE rather than null * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPermissionTest.java: (testMissingQuotationMarks) new test * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java: (testReturnedCustomPermissionsSetIsCopy, testCodebaseTrailingSlashesDoNotMatch) new tests * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorParsingTest.java: new tests 2014-03-10 Omair Majid * Makefile.am (install-data-local): Install itweb-settings.1. * netx/itweb-settings.1: New file. 2014-03-10 Jiri Vanek Added getter for java-abrt-connector on demand whitelist of fields. * netx/net/sourceforge/jnlp/Launcher.java: (launch) saving (location.toExternalForm()) via JNLPRuntime.saveHistory * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (history) new static field with getter (getHistory) and "setter" (saveHistory) * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (handleInitializationMessage) saving (documentBase) via JNLPRuntime.saveHistory 2014-03-10 Jiri Vanek Actualized man page for javaws * netx/javaws.1: made sync with current state 2014-03-10 Jiri Vanek Fixed rhbz#1072013 * netx/net/sourceforge/jnlp/PluginBridge.java: The (fileLocation) of JNLPFile is now properly set in constructor if not existing. 2014-03-06 Andrew Azores * NEWS: added -version flag entry * netx/net/sourceforge/jnlp/resources/Messages.properties: (BOVersion) new message for command line -version flag * netx/net/sourceforge/jnlp/runtime/Boot.java: (main) added "-version" flag 2014-03-05 Jiri Vanek All security dialogs moved to appropriate package * netx/net/sourceforge/jnlp/security/AccessWarningPane.java: to * netx/net/sourceforge/jnlp/security/dialogs/AccessWarningPane.java: * netx/net/sourceforge/jnlp/security/AppletWarningPane.java: to * netx/net/sourceforge/jnlp/security/dialogs/AppletWarningPane.java: * netx/net/sourceforge/jnlp/security/CertWarningPane.java: to * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java * netx/net/sourceforge/jnlp/security/CertsInfoPane.java: to * netx/net/sourceforge/jnlp/security/dialogs/CertsInfoPane.java: * netx/net/sourceforge/jnlp/security/MoreInfoPane.java: to * netx/net/sourceforge/jnlp/security/dialogs/MoreInfoPane.java: * netx/net/sourceforge/jnlp/security/NotAllSignedWarningPane.java: to * netx/net/sourceforge/jnlp/security/dialogs/NotAllSignedWarningPane.java: * netx/net/sourceforge/jnlp/security/PasswordAuthenticationPane.java: to * netx/net/sourceforge/jnlp/security/dialogs/PasswordAuthenticationPane.java: * netx/net/sourceforge/jnlp/security/SecurityDialogPanel.java: to * netx/net/sourceforge/jnlp/security/dialogs/SecurityDialogPanel.java: * netx/net/sourceforge/jnlp/security/SingleCertInfoPane.java: to * netx/net/sourceforge/jnlp/security/dialogs/SingleCertInfoPane.java: * netx/net/sourceforge/jnlp/security/AppTrustWarningDialog.java: to * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningDialog.java: * netx/net/sourceforge/jnlp/security/AppTrustWarningPanel.java: to * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanel.java: * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningDialog.java: to * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningDialog.java: * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java: to * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/UnsignedAppletTrustWarningPanel.java: * tests/netx/unit/net/sourceforge/jnlp/security/AppTrustWarningPanelTest.java: to * tests/netx/unit/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/AppTrustWarningPanelTest.java: * tests/netx/unit/net/sourceforge/jnlp/util/ClasspathMatcherTest.java: necessary changes * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: necessary changes * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: necessary changes * netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java: necessary changes * netx/net/sourceforge/jnlp/security/SecurityDialog.java: necessary changes * netx/net/sourceforge/jnlp/security/KeyStores.java: necessary changes * netx/net/sourceforge/jnlp/security/HttpsCertVerifier.java: necessary changes * netx/net/sourceforge/jnlp/security/CertificateUtils.java: necessary changes 2014-03-05 Jiri Vanek * netx/net/sourceforge/jnlp/security/AppTrustWarningPanel.java: fixed layout so buttons do not disappear under radioboxes. * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java: added testable main method. 2014-03-05 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/security/AppTrustWarningPanelTest.java: removed unused imports * tests/netx/unit/net/sourceforge/jnlp/util/ClasspathMatcherTest.java: added test for plain * in ClasspathMatcher.ClasspathMatchers.compile() 2014-03-05 Matthias Klose * launcher/launchers.in: Use bash as shebang. 2014-03-04 Andrew Azores * netx/net/sourceforge/jnlp/resources/Messages.properties: (SAppletTitle) new message * netx/net/sourceforge/jnlp/security/AppTrustWarningPanel.java: (buttons) new list of UI buttons. (getAllowButton, getRejectButton, addComponents) made final. (createButtonPanel) uses list of buttons rather than hardcoded. (helpButton) action made configurable. 2014-03-03 Omair Majid PR857 * netx/net/sourceforge/jnlp/about/AboutDialog.java (run): Do not set look and feel. * netx/net/sourceforge/jnlp/runtime/Boot.java (main) : Set look and feel before displaying dialog. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Set look and feel before any UI is created. * netx/net/sourceforge/jnlp/security/SecurityDialog.java (init): Do not set look and feel. (setSystemLookAndFeel): Removed. * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java (createInstance): Do not set look and feel. * netx/net/sourceforge/jnlp/security/viewer/CertificateViewer.java (showCertificateViewer): Do not set look and feel. (setSystemLookAndFeel): Removed. 2014-03-03 Omair Majid PR1676 * netx/net/sourceforge/jnlp/SecurityDesc.java: Add permission to read/write useLegacyMergeSort. 2014-03-03 Andrew Azores UnsignedAppletTrustWarningPanel logic moved into new abstract parent class AppTrustWarningPanel for reusability. * netx/net/sourceforge/jnlp/security/AppTrustWarningDialog.java: new class * netx/net/sourceforge/jnlp/security/AppTrustWarningPanel.java: new class * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java: major refactor into subclass of AppTrustWarningPanel * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: (UnsignedWarningAction) references changed to AppSigningWarningAction * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningDialog.java: same * tests/netx/unit/net/sourceforge/jnlp/security/AppTrustWarningPanelTest.java: new tests for AppTrustWarningPanel * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteUnsignedApplet.java: renamed, changed all references * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteAppletAction.java: (ExecuteUnsignedApplet) renamed to this * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java: (ExecuteAppletAction) changed references * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: (ExecuteAppletAction) changed references * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java: (ExecuteAppletAction) changed references * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: (ExecuteAppletAction) changed references * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java: (ExecuteAppletAction) changed references * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: (ExecuteAppletAction) changed references 2014-02-28 Andrew Azores Added "Sandbox" button to CertWarning dialogs, allowing signed applets to be run with restricted permissions * netx/net/sourceforge/jnlp/resources/Messages.properties: (ButSandbox, LRunInSandboxError, LRunInSandboxErrorInfo, CertWarnRunTip, CertWarnSandboxTip, CertWarnCancelTip): new messages * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (createInstance) added check to not display unsigned warning dialog if the cert warning dialog has been presented and the applet is sandboxed. (checkTrustWithUser) updated for Run In Sandbox functionality. (setRunInSandbox, userPromptedForSandbox) new functions * netx/net/sourceforge/jnlp/security/AppVerifier.java: (checkTrustWithUser) added SecurityDelegate param * netx/net/sourceforge/jnlp/security/CertWarningPane.java: added Sandbox button * netx/net/sourceforge/jnlp/security/JNLPAppVerifier.java: (checkTrustWithUser) uses AppletAction enum type, calls JNLPClassLoader#setRunInSandbox if AppletAction is SANDBOX * netx/net/sourceforge/jnlp/security/PluginAppVerifier.java: same * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: added (AppletAction) enum type. (showCertWarning) returns AppletAction rather than boolean * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java: (askUser) refactor to use AppletAction rather than boolean * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: (checkTrustWithUser) added SecurityDelegate param * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: (testGetIntegerResponseAsAppletAction) new tests for converting Object references into AppletActions 2014-02-28 Andrew Azores * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (SecurityDelegate, SecurityDelegateImpl) new interface and implementation. Includes logic for Run In Sandbox, which is not yet used (initializeResources, setSecurity, activateJars, addNewJar) refactored to use SecurityDelegate 2014-02-27 Andrew Azores * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: treat signed applets which load from the codebase as partially signed, and fix regression with signed applets loading main-classes from codebase * tests/reproducers/custom/SignedAppletCodebaseLoading/resources/SignedAppletCodebaseLoading.html: new test to ensure that signed applets with codebase loading can run * tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/Makefile * tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/SignedAppletCodebaseLoading.java * tests/reproducers/custom/SignedAppletCodebaseLoading/srcs/SignedAppletCodebaseLoadingHelper.java * tests/reproducers/custom/SignedAppletCodebaseLoading/testcases/SignedAppletCodebaseLoadingTests.java * tests/reproducers/custom/SignedAppletExternalMainClass/resources/SignedAppletExternalMainClass.html: new test to ensure that signed applets with codebase-loaded main-classes can run * tests/reproducers/custom/SignedAppletExternalMainClass/srcs/Makefile * tests/reproducers/custom/SignedAppletExternalMainClass/srcs/SignedAppletExternalMainClass.java * tests/reproducers/custom/SignedAppletExternalMainClass/srcs/SignedAppletExternalMainClassHelper.java * tests/reproducers/custom/SignedAppletExternalMainClass/testcases/SignedAppletExternalMainClassTest.java 2014-02-21 Jiri Vanek * acinclude.m4: added (IT_CHECK_XULRUNNER_API_VERSION_CONSTCHAR) macro, Added (IT_CHECK_XULRUNNER_API_VERSION_C11) * configure.ac: added call of IT_CHECK_XULRUNNER_API_CONSTCHAR and IT_CHECK_XULRUNNER_API_VERSION_C11 * plugin/icedteanp/IcedTeaNPPlugin.cc: (NP_GetMIMEDescription) return type set-up by dependency on defined LEGACY_XULRUNNERAPI. This one is set by IT_CHECK_XULRUNNER_API_VERSION during configure. if defined, then old char* is used. New const char* is used otherwise. 2014-02-20 Andrew Azores New simplified PolicyEditor for editing Java policy files, particularly user-level JNLP policies. * Makefile.am: added policyeditor launcher targets * netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: (OpenFileResult, canOpenPolicyFile, testPolicyFileDirectory, showCouldNotOpenFileDialog, showReadOnlyDialog) moved into FileUtils. (PolicyPanel) added button for PolicyEditor. (launchSimplePolicyEditor) new function. (LaunchSimplePolicyEditorAction) new class, action for new button. * netx/net/sourceforge/jnlp/resources/Messages.properties: new messages for PolicyEditor * netx/net/sourceforge/jnlp/util/FileUtils.java: (OpenFileResult, testDirectoryPermissions, testFilePermissions, showReadOnlyDialog, showCouldNotOpenFileDialog) new functions * netx/net/sourceforge/jnlp/security/policyeditor/CustomPermission.java: new class * netx/net/sourceforge/jnlp/security/policyeditor/CustomPolicyViewer.java: new class * netx/net/sourceforge/jnlp/security/policyeditor/PermissionActions.java: new class * netx/net/sourceforge/jnlp/security/policyeditor/PermissionTarget.java: new class * netx/net/sourceforge/jnlp/security/policyeditor/PermissionType.java: new class * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: new class * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissions.java: new class * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEntry.java: new class * policyeditor.desktop.in: new launcher desktop file * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/CustomPermissionTest.java: new class * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PermissionActionsTest.java: new class * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PermissionTargetTest.java: new class * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PermissionTypeTest.java: new class * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorPermissionsTest.java: new class * tests/netx/unit/net/sourceforge/jnlp/security/policyeditor/PolicyEditorTest.java: new class 2014-02-19 Michal Vyskocil Put link flags to the end of gcc command line to prevent link failures Make sure that path to PUBLIC_KEYSTORE exists to prevent keytool fail * tests/softkiller/Makefile: put -lX11 to the end of command line * Makefile.am: if path to PUBLIC_KEYSTORE does not exists, make it 2014-02-13 Jiri Vanek Get rid of ConcurrentModificationException in Console output. * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java: (importList) now synchronise over original data, instead of (somtimes by) copy as, wrongly, before. 2014-02-13 Jiri Vanek Added possibility to follow redirects for javaws in demand by -allowredirect switch. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: added inner class (CodeWithRedirect), which stores server result and possible redirection target (getUrlResponseCode) is only wrapper around new (getUrlResponseCodeWithRedirectonResult) which returns (CodeWithRedirect). It fills url form Location header field if any. (findBestUrl) now follow 301,302,303,307,308 redirects if enabled and valid - otherwise new (RedirectionException) is thrown. * netx/net/sourceforge/jnlp/resources/Messages.properties: described -allowredirect by (BOredirect) key. * netx/net/sourceforge/jnlp/runtime/Boot.java: and * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: added handling of -allowredirect. New (allowRedirect) field. 2014-02-12 Jiri Vanek Fixed behaviour of href in jnlp file to correctly download another it if it is remote * netx/net/sourceforge/jnlp/Launcher.java: (fromUrl) if file is not local, and have href and href point elsewhere, then it is used as future jnlpfile * tests/reproducers/simple/GeneratedId/testcases/GeneratedIdTest.java: (launchRemoteChangedFileWithHref) adapted to new behaviour 2014-02-12 Jiri Vanek Implemented Codebase manifest entry handling. * netx/net/sourceforge/jnlp/JNLPFile.java: manifests names constants moved into ManifestsAttributes inner class.(getCallerAllowableCodebase) (getApplicationLibraryAllowableCodebase) (getCodebase) (getCodeBaseMatchersAttribute) (getCodeBaseMatchersAttribute) are now returning (ClasspathMatcher.ClasspathMatchers). added boolean access to (isTrustedOnly) (isTrustedLibrary). * netx/net/sourceforge/jnlp/resources/Messages.properties: added (CBCheckFile) (CBCheckNoEntry) (CBCheckUnsignedPass) (CBCheckUnsignedPass) (CBCheckOkSignedOk) (CBCheckOkSignedOk) (CBCheckOkSignedOk) keys to inform about Classpath validation * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: in Init call new method (checkCodebaseAttribute) which check the codebase manifest entry. * netx/net/sourceforge/jnlp/util/ClasspathMatcher.java: New class, responsible for matching Classpath like pattern with URL * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPFileTest.java: added tests to cover all newly accessible attributes from JNLPFile.ManifestsAttributes * tests/netx/unit/net/sourceforge/jnlp/util/ClasspathMatcherTest.java: mostly corner and must-fullfill cases tests. * tests/test-extensions/net/sourceforge/jnlp/util/FileTestUtils.java: (assertNoFileLeak) have timeout before actual countings. JVM needs time to propagate cleanup. * tests/reproducers/signed/CodeBaseManifestEntrySignedMatching/: * tests/reproducers/signed/CodeBaseManifestEntrySignedNotMatching/: * tests/reproducers/simple/CodeBaseManifestEntryUnsignedMatching/: *tests/reproducers/simple/CodeBaseManifestEntryUnsignedNotMatching/: New set of reproducers to test Codebases processing. All testcas are in (CodeBaseManifestEntrySignedMatching) so they can share code. 2014-02-11 Andrew Azores Partial revert of 7933143a1286, refactoring to move codebase-loading-enabling logic out of Launcher and into JNLPClassLoader. * netx/net/sourceforge/jnlp/Launcher.java: (createApplet, createAppletObject): handle enableCodebase again * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (enableCodebase): re-added, codebase enabling logic moved back out into Launcher 2014-02-05 Jiri Vanek Added salt to plugin-java pipes' directory (fixing RH1010958) * plugin/icedteanp/IcedTeaNPPlugin.cc: (cleanUpDir) new utility method to clean up pipes directory. (start_jvm_if_needed) is now returning error status and creating salt in directory name. (initialize_data_directory) now add salt to the name. * plugin/icedteanp/IcedTeaNPPlugin.h: changed declaration of (start_jvm_if_needed) 2014-02-04 Jacob Wisor Added missing PL localized messages * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: added RCantOpenFile RCantWriteFile RFileReadOnly RExpectedFile CPPolicyDetail CPPolicyTooltip CPPolicyEditorNotFound CPButPolicy CPHeadPolicy CPTabPolicy. Modified SSigUnverified SSigVerified SSignatureError 2014-02-04 Jacob Wisor Added missing DE localized messages * netx/net/sourceforge/jnlp/resources/Messages_de.properties: added RCantOpenFile RCantWriteFile RFileReadOnly RExpectedFile CPPolicyDetail CPPolicyTooltip CPPolicyEditorNotFound CPButPolicy CPHeadPolicy CPTabPolicy. Modified SSigUnverified SSigVerified SSignatureError 2014-01-31 Jacob Wisor * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java: (importList) Separate XHTML fix due to revision 884 2014-01-30 Jacob Wisor * Javadoc, XHTML conformance, and formatting cleanup 2014-01-30 Andrew Azores * NEWS: added entry for PolicyPanel * netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: added class-level Javadoc comment, made some local variables final, added reflective fallback case for JRE 6 PolicyTool location 2014-01-29 Andrew Azores Fix for regression due to PR1513 fix. ClassLoader was too optimistic about finding codebase main-classes and so the not-all-signed dialog would appear even for applets that were entirely broken and could not be loaded at all. * netx/net/sourceforge/jnlp/Launcher.java: (createApplet, createAppletObject) pass enableCodeBase to JNLPClassLoader * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (enableCodeBase) removed, now done by constructor argument. (checkNotAllSignedWithUser) minor refactor. (initializeResources) actually check if main-class is loadable from codebase when this is suspected, rather than assuming it will be there 2014-01-27 Andrew Azores MixedSigningApplet reproducer (PR1592) moved into custom reproducer. JNLP files generated per-test rather than premade. Many new tests added. * tests/reproducers/custom/MixedSigningApplet/resources/MixedSigningApplet.html: moved to custom reproducer * tests/reproducers/custom/MixedSigningApplet/resources/MixedSigningApplet.jnlp: moved to custom reproducer and now used as template by testcases file * tests/reproducers/custom/MixedSigningApplet/srcs/Makefile: new Makefile for custom reproducer * tests/reproducers/custom/MixedSigningApplet/srcs/MixedSigningAppletHelper.java * tests/reproducers/custom/MixedSigningApplet/srcs/MixedSigningAppletSigned.java * tests/reproducers/custom/MixedSigningApplet/testcases/MixedSigningAppletSignedTests.java: new tests added, JNLP files generated per-test rather than all prepackaged * tests/reproducers/signed/MixedSigningAppletSigned/srcs/MixedSigningAppletSigned.java: moved to custom reproducer * tests/reproducers/signed/MixedSigningAppletSigned/testcases/MixedSigningAppletSignedTests.java * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-1.jnlp * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-2.jnlp * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-3.jnlp * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-4.jnlp * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-5.jnlp * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-6.jnlp * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet.html * tests/reproducers/simple/MixedSigningApplet/srcs/MixedSigningAppletHelper.java 2014-01-27 Jiri Vanek Tuning of properties loading. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: added (resetToDefaults) methods to set default values to map. (loadSystemConfiguration) now throws ConfigurationException. Added more verbose error messages. The ioexception is now also cause of ConfigurationException if mandatory is on. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: now correctly fails to initiate if ConfigurationException appeared. Init of (configuration) now catch general exception, and fall back to default (instead of die fatally with NoClassDefFoundError). User is warned. * netx/net/sourceforge/jnlp/resources/Messages.properties: new key of (RFailingToDefault) added. 2014-01-24 Andrew Azores http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2014-January/025971.html * netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: added license header and javadocs. Launch PolicyTool by ProcessBuilder rather than calling PolicyTool.main directly, with reflective launch fallback method. * netx/net/sourceforge/jnlp/resources/Messages.properties: added message (CPPolicyEditorNotFound) 2014-01-23 Omair Majid * Makefile.am [ENABLE_DOCS] [JAVADOC_SUPPORTS_J_OPTIONS]: Don't specify perm gen size. 2014-01-23 Omair Majid * netx/net/sourceforge/jnlp/JNLPFile.java, * netx/net/sourceforge/jnlp/NetxPanel.java, * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java, * netx/net/sourceforge/jnlp/cache/CacheUtil.java, * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java, * netx/net/sourceforge/jnlp/config/DirectoryValidator.java, * netx/net/sourceforge/jnlp/config/Setting.java, * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java, * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java, * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java, * netx/net/sourceforge/jnlp/runtime/RhinoBasedPacEvaluator.java, * netx/net/sourceforge/jnlp/security/SecurityDialogs.java, * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java, * netx/net/sourceforge/jnlp/services/XSingleInstanceService.java, * netx/net/sourceforge/jnlp/util/FileUtils.java, * netx/net/sourceforge/jnlp/util/JarFile.java, * netx/net/sourceforge/nanoxml/XMLElement.java, * netx/net/sourceforge/nanoxml/XMLParseException.java, * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java: Fix incorrect parameter names, throws declerations and malformed html in javadocs. 2014-01-20 Jiri Vanek Added Christmas splashscreen extension. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java: base colors are derived from active extension. And extension is painted (if any) * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.java: same * netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ChristmasExtension.java: extension valid in Christmas time, painting falling stars and dimming colors. * netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ExtensionManager.java provider of extension. Know only the Christmas one right now. * netx/net/sourceforge/jnlp/splashscreen/parts/extensions/NoExtension.java: no op extension for no extension times * netx/net/sourceforge/jnlp/splashscreen/parts/extensions/SplashExtension.java: unfinished extension interface * tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashScreenTest.java: and * tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashScreenTest.java: adapted to current purposes 2014-01-20 Jiri Vanek Added support for system level linux logging * netx/net/sourceforge/jnlp/util/logging/OutputController.java: exclusive handling for system critical *java* messages when system logging is on. * netx/net/sourceforge/jnlp/util/logging/UnixSystemLog.java: implemented call to logger * plugin/icedteanp/IcedTeaPluginUtils.h: error messages logged to syslog * plugin/icedteanp/java/sun/applet/PluginDebug.java: default messages are now MESSAGE_DEBUG instead of ERROR_ALL * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.c: adapted to system logging 2014-01-17 Andrew Azores Added itweb-settings panel to explain custom policy files and allow launching a policy editor for user's policy file. * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: (createMainSettingsPanel, createPolicySettingsPanel) added PolicyPanel * netx/net/sourceforge/jnlp/resources/Messages.properties: new messages for PolicyPanel * netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: new panel to allow launching of external policy editor * tests/reproducers/simple/CustomPolicies/resources/CustomPolicies.html: new test to ensure custom user policy files work correctly * tests/reproducers/simple/CustomPolicies/resources/CustomPoliciesApplet.jnlp * tests/reproducers/simple/CustomPolicies/resources/CustomPoliciesApplication.jnlp * tests/reproducers/simple/CustomPolicies/resources/CustomPoliciesJnlpHref.html * tests/reproducers/simple/CustomPolicies/srcs/CustomPolicies.java * tests/reproducers/simple/CustomPolicies/testcases/CustomPoliciesTest.java 2014-01-17 Andrew Azores Fixes JS reproducer regression. http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2014-January/025764.html * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: (hasMethod) fixed regression from rev 757:ee92f55c69a3 2014-01-16 Jiri Vanek Reproducers stabilization by removing check for not presented general Exception or error. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: removed legacy debug call * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: as in subject, and same in others * tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java: * tests/reproducers/signed/ClasspathManifestTest/testcases/ClasspathManifestTest.java: * tests/reproducers/signed/ClipboardContentSigned/testcases/ClipboardContentSignedTests.java: * tests/reproducers/signed/InternalClassloaderWithDownloadedResource/testcases/InternalClassloaderWithDownloadedResourceTest.java: * tests/reproducers/signed/Spaces can be everywhere signed/testcases/SpacesCanBeEverywhereTestsSigned.java: * tests/reproducers/signed2/MultipleSignaturesTest/testcases/MultipleSignaturesTestTests.java: * tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java: * tests/reproducers/simple/JSToJSet/testcases/JSToJSetTest.java: * tests/reproducers/simple/LocalisedInformationElement/testcases/LocalisedInformationElementTest.java: * tests/reproducers/simple/ParametrizedJarUrl/testcases/ParametrizedJarUrlTests.java: * tests/reproducers/simple/Spaces can be everywhere/testcases/SpacesCanBeEverywhereTests.java: * tests/reproducers/simple/deadlocktest/testcases/DeadLockTestTest.java: * tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/testcases/EncodingTestTest.java: * tests/reproducers/simple/simpletest1/testcases/SimpleTest1Test.java: 2014-01-15 Jiri Vanek Fixed memory leak detector to correctly handle pre_init_messages queue. * plugin/icedteanp/IcedTeaPluginUtils.cc: implemented (reset_pre_init_messages) method. * plugin/icedteanp/IcedTeaPluginUtils.h: declared (reset_pre_init_messages). * tests/cpp-unit-tests/MemoryLeakDetector.h: (reset_global_state) called (reset_pre_init_messages). 2014-01-09 Andrew Azores * html-gen.sh: made more idiomatic and removed some bashisms 2014-01-06 Jiri Vanek Copy all button in console controls sorts by date by default. * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: added (sortCopyAll) checkbox. Logic from (copyPlainActionPerformed) and (copyRichActionPerformed) extracted to new (fillClipBoard) which also used correct call of ConsoleOutputPaneModel.importList based on (sortCopyAll) value. * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java: added abstraction for (importList) to allow sorting via parameter 2014-01-06 Jiri Vanek Removed dependence on sun.misc.BASE64Decoder * configure.ac: removed check for sun.misc.BASE64Decoder * netx/net/sourceforge/jnlp/PluginBridge.java : sun.misc.BASE64Decoder import replaced by net.sourceforge.jnlp.util.replacements.BASE64Decoder * netx/net/sourceforge/jnlp/util/replacements/BASE64Decoder.java: new file, in-tree copy from jdk7 * netx/net/sourceforge/jnlp/util/replacements/CharacterDecoder.java: likewise * tests/netx/unit/net/sourceforge/jnlp/util/replacements/BASE64DecoderTest.java: new tests for new files * tests/netx/unit/net/sourceforge/jnlp/util/replacements/BASE64EncoderTest.java: (getAndInvokeMethod), (encoded) and (sSrc) made public final. Corrected usage of (encoded2), added new test (testEmbededBase64EncoderAgainstEbededDecoder) to test with internal decoder. 2014-01-02 Andrew Azores Added ChangeLog revision hyperlinking to html-gen.sh * html-gen.sh: ChangeLog dates made hyperlinks to corresponding commits 2013-12-27 Andrew Azores Resolve deadlock issue in JNLPClassLoader. See http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2013-December/025546.html * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (loadClassLock) removed. (available, jarIndexes, classpaths, jarEntries, jarLocationSecurityMap) fields wrapped in Collections.synchronized*() to provide atomic read/write. Synchronized on while iterating over these collections. (loadClass) no longer uses implicit JNLPClassLoader instance lock nor dedicated loadClassLock object. 2013-12-20 Jiri Vanek Rewritten java console * netx/net/sourceforge/jnlp/Launcher.java: fatal error from lunch can reach console * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPane.java: new console, controls * netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java: data manager of new console. * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: removed old gui, now using multiple 1-n instances of ConsoleOutputPane with theirs models. (addMessage) now receive MessageWithHeader object instead body and header. * netx/net/sourceforge/jnlp/util/logging/headers/Header.java: have not null defaults * netx/net/sourceforge/jnlp/util/logging/headers/ObservableMessagesProvider.java: abstraction of datasource for new console * tests/netx/unit/net/sourceforge/jnlp/util/logging/JavaConsoleTest.java: adapted. 2013-12-20 Jiri Vanek fixed CacheLRUWrapperTest * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: (cacheDir) and (cacheOrder) made package private for testing purposes. * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: True testing cache file is now prepared, tested, and removed. the CacheLRUWrapper is using this testing repo. 2013-12-20 Jiri Vanek finished removal of legacy xulrunner api * acinclude.m4: (IT_CHECK_XULRUNNER_API_VERSION) removed * configure.ac: likewise 2013-12-20 Jiri Vanek singletons logic, logs and test cleanup/fixes * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: config singleton made properly synchronized via Holder pattern (DeploymentConfigurationHolder). * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: same, (JavaConsoleHolder). Console gui initialized on show, not on creation. Removed look and feel. (addMessage) gui update adapted. * netx/net/sourceforge/jnlp/util/logging/LogConfig.java: made private, singleton handled via LogConfigHolder. * netx/net/sourceforge/jnlp/util/logging/OutputController.java: mentioned issue with (getConfiguration), removed obsoleted (MessageWithLevel), (messageQue) retyped to , (consume) adapted. (consumerThread) made global variable, ist start moved to (startConsumer) which is called after initialisation of config singleton. Logs queing moved to (log) of (MessageWithHeader) signature. (FileLogHolder) and (SystemLogHolder) created for holder pattern synchronization. * netx/net/sourceforge/jnlp/util/logging/headers/Header.java: constructor and (getCaller) adaptation. * netx/net/sourceforge/jnlp/util/logging/headers/PluginHeader.java: fixed (toString) for preinit messages. * tests/netx/unit/net/sourceforge/jnlp/util/logging/JavaConsoleTest.java: removed erroneous stdout. * tests/test-extensions/net/sourceforge/jnlp/util/logging/NoStdOutErrTest.java: is no longer throwing exceptions (was causing errors in junit) and synchronized. 2013-12-17 Jiri Vanek JNLPRuntime.config changed to proper singleton. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: added field with getter rand setter to save loading exception. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (config) field is no longer initialized in static block, but on demand in (getConfig). (initialize) no longer load (config) nor exit on loading exception, but warn in case that it have loading exception. (initialize) call to KeyStores.setConfiguration is using (getConfig) instead (config). (initialize) call to BrowserAwareProxySelector constructor likewise. (getConfig) is initializing and loading (config), marking exception and sterr it in case of debug on. Made synchronized. * netx/net/sourceforge/jnlp/resources/Messages.properties: (RConfigurationError) enhanced to fit. * netx/net/sourceforge/jnlp/util/logging/LogConfig.java: no longer use own copy of (config) but using (JNLPRuntime.getConfig). 2013-12-15 Jiri Vanek Console made aware of plugin messages * NEWS : mentioned * netx/net/sourceforge/jnlp/util/logging/FileLog.java: call to log adapted to new Header. * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: (logOutput) and (logError) replaced by (addMessage). Added (createPluginReader) to process plugin debug pipe * netx/net/sourceforge/jnlp/util/logging/LogConfig.java: (getConfig) do config available untill JNLPRuntime config is proper singleton * netx/net/sourceforge/jnlp/util/logging/OutputController.java: (Level) static methods converted to members and enhanced. (getHeader) and (getCallerClass) moved to Headers. * netx/net/sourceforge/jnlp/util/logging/headers/Header.java: Structure to keep header as object instead of string. * netx/net/sourceforge/jnlp/util/logging/headers/JavaMessage.java: Structure to hold message and its header. * netx/net/sourceforge/jnlp/util/logging/headers/MessageWithHeader.java: Interface for JavaMessage and PluginMessage * netx/net/sourceforge/jnlp/util/logging/headers/PluginHeader.java: extended header to handle plugin's preinit and threads. * netx/net/sourceforge/jnlp/util/logging/headers/PluginMessage.java: implementation of MessageWithHeader which parse from String from plugin debug pipe. * plugin/icedteanp/IcedTeaNPPlugin.cc: added debug pipe (debug_pipe_name), synced via (debug_pipe_lock), controlled by (debug_to_appletviewer) and used by method (plugin_send_message_to_appletviewer_console). * plugin/icedteanp/IcedTeaNPPlugin.h: (debug_pipe_name) and (jvvm_up) declared extern. Utility methods (plugin_send_message_to_appletviewer_console) and (flush_plugin_send_message_to_appletviewer_console) declared and impelmented * plugin/icedteanp/IcedTeaPluginUtils.cc: print debug info enhanced for debug pipe * plugin/icedteanp/IcedTeaPluginUtils.h: (PLUGIN_MESSAGE) and (PLIGIN_ERROR) now log to debug pipe if enabled. * plugin/icedteanp/java/sun/applet/PluginMain.java: args reprinted, checked third parameter debug pipe if should. Started debug_pipe reader if should * tests/netx/unit/net/sourceforge/jnlp/util/logging/JavaConsoleTest.java: added tests for parsing the plugin message. 2013-12-13 Jiri Vanek Made again compatible with JDK6.All JLists, JComboBoxs, and DefaultComboBoxModels moved back to be not generics-like * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java * netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java 2013-12-13 Jiri Vanek itw itself warning cleanup: fixed rawtypes and unchecks, added braces and Override * netx/net/sourceforge/jnlp/JREDesc.java * netx/net/sourceforge/jnlp/Launcher.java * netx/net/sourceforge/jnlp/Node.java * netx/net/sourceforge/jnlp/Parser.java * netx/net/sourceforge/jnlp/PluginBridge.java * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java * netx/net/sourceforge/jnlp/controlpanel/CachePane.java * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java * netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java * netx/net/sourceforge/jnlp/security/CertWarningPane.java * netx/net/sourceforge/jnlp/security/CertsInfoPane.java * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java * netx/net/sourceforge/jnlp/services/ServiceUtil.java * netx/net/sourceforge/jnlp/splashscreen/impls/DefaultErrorSplashScreen2012.java * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubic.java * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/SplinesDefs.java * netx/net/sourceforge/jnlp/util/Reflect.java * netx/net/sourceforge/jnlp/util/ui/NonEditableTableModel.java * netx/net/sourceforge/nanoxml/XMLElement.java * plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java * tests/netx/unit/net/sourceforge/jnlp/ParserCornerCases.java 2013-12-13 Jiri Vanek unittests warning cleanup: fixed typechecks, rawtypes, redundant casts... * tests/junit-runner/CommandLine.java * tests/junit-runner/JunitLikeXmlOutputListener.java * tests/junit-runner/LessVerboseTextListener.java * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java * tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java * tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashUtilsTest.java * tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashUtilsTest.java * tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/DescriptionInfoItemTest.java * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java * tests/netx/unit/net/sourceforge/jnlp/util/XDesktopEntryTest.java * tests/netx/unit/net/sourceforge/jnlp/util/replacements/BASE64EncoderTest.java * tests/netx/unit/sun/applet/PluginAppletViewerTest.java * tests/test-extensions/net/sourceforge/jnlp/LoggingBottleneck.java * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java * tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java * tests/test-extensions/net/sourceforge/jnlp/awt/AWTHelper.java * tests/test-extensions/net/sourceforge/jnlp/awt/awtactions/KeyboardActions.java * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/RulesFolowingClosingListener.java * netx/net/sourceforge/jnlp/util/ScreenFinder.java: centering of screen fixed to work also in headless mode by returrning some defaults 2013-12-09 Jiri Vanek * Messages.properties: added "It will be granted unrestricted access to your computer." to (SSigUnverified) (SSigVerified) (SSignatureError) messages. 2013-12-05 Andrew Azores * netx/net/sourceforge/jnlp/resources/Messages.properties: add units to (TIFPCacheSize) 2013-12-03 Andrew Azores Tests for PR1592. * tests/reproducers/signed/MixedSigningAppletSigned/srcs/MixedSigningAppletSigned.java: new tests for per-JAR applet security * tests/reproducers/signed/MixedSigningAppletSigned/testcases/MixedSigningAppletSignedTests.java: same * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-1.jnlp: same * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-2.jnlp: same * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-3.jnlp: same * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-4.jnlp: same * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-5.jnlp: same * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet-6.jnlp: same * tests/reproducers/simple/MixedSigningApplet/resources/MixedSigningApplet.html: same * tests/reproducers/simple/MixedSigningApplet/srcs/MixedSigningAppletHelper.java: same 2013-12-03 Andrew Azores Fix/new feature for PR1592. Each JAR in partially signed applets is assigned its own security level, rather than forcing the entire applet to run sandboxed. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (initializeResources) each JAR in partially signed applets is assigned its own security descriptor. (signing) changed to three-valued enum. (checkNotAllSignedWithUser) new method * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: (isJarSigned) new method 2013-11-29 Jiri Vanek Better validation of crytical dirs with proper message on startup * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: small refactoring to match the new directory validator pattern. * netx/net/sourceforge/jnlp/config/DirectoryValidator.java: new class to verify if directory have necessary permissions (like creating subdirectories, read and write files created in). * netx/net/sourceforge/jnlp/resources/Messages.properties: patterns for validation results * netx/net/sourceforge/jnlp/runtime/Boot.java: headless determination moved as up as possible in (main) * tests/netx/unit/net/sourceforge/jnlp/config/DeploymentConfigurationTest.java: Few test testing what DirtectoryValidator should validate. 2013-11-29 Jiri Vanek Pipes moved into XDG_RUNTIME_DIR * plugin/icedteanp/IcedTeaNPPlugin.cc: (initialize_data_directory) logic responsible for tmp dir path moved into (getTmpPath) and (data_directory) initialized from (getRuntimePath) rather. * plugin/icedteanp/IcedTeaPluginUtils.cc: (getTmpPath) new function, provides path to tmp dir. (getRuntimePath) new function resolving XDG_RUNTIME_DIR value, returning (getTmpPath) as fallback. * plugin/icedteanp/IcedTeaPluginUtils.h: declared new two methods. 2013-11-29 Jiri Vanek Enabled file logging in plugin, user enabled to choose logs dir. * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java: added text-field to show/edit logs' destination. Added reset to default button. * netx/net/sourceforge/jnlp/resources/Messages.propertie: added proper keys for new controls (CPFilesLogsDestDir) and (CPFilesLogsDestDirResert). (DPEnableLogging) changed to "Enable debugging", as it is better. * netx/net/sourceforge/jnlp/util/logging/FileLog.java: Filename of logs changed to be human readable and to distinguish between c/java * plugin/icedteanp/IcedTeaNPPlugin.cc: made aware of console (plugin_debug_to_console) added stream to log into file (plugin_file_log) and holder of name (plugin_file_log_name) Added various new lines to end of erorr/debug messages. Stream flushed, not closed on plugin shutdown. * plugin/icedteanp/IcedTeaNPPlugin.h: extern above three fields. * plugin/icedteanp/IcedTeaParseProperties.cc: added functionality to provide set or default log dir (get_log_dir), added (is_java_console_enabled) to determine logging to console * plugin/icedteanp/IcedTeaParseProperties.h: used glib.h, declared above functions * plugin/icedteanp/IcedTeaPluginUtils.cc: added (initFileLog) function to open correctly named, in proper palce and with correct permissions file for logging (generateLogFileName) generate human readable file name, as java do. (printDebugStatus) to debug status of logging * plugin/icedteanp/IcedTeaPluginUtils.h: headers generated once, and reused declared above functions. * plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java: commented out useless "woken" debug message * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc: made plugin_debug_to_console aware. 2013-11-27 Andrew Azores Made JNLPClassLoaderDeadlock reproducer more reliable * tests/reproducers/custom/JNLPClassLoaderDeadlock/srcs/JNLPClassLoaderDeadlock_1.java: Removed "AutoOkClosingListener" magic string * tests/reproducers/custom/JNLPClassLoaderDeadlock/srcs/JNLPClassLoaderDeadlock_2.java: same * tests/reproducers/custom/JNLPClassLoaderDeadlock/testcases/JNLPClassLoaderDeadlockTest.java: Changed AutoOkClosingListener to RulesFolowingClosingListener 2013-11-26 Jiri Vanek Reverted "fix to ManifestedJar1Test cases", better manifestedjar tests, added srtict test * netx/net/sourceforge/jnlp/Parser.java: added indentation, fixes condition in strict base check * netx/net/sourceforge/jnlp/ResourcesDesc.java: revertedt recently added throw * tests/reproducers/simple/ManifestedJar1/testcases/ManifestedJar1Test.java: (manifestedJar1main2mainNoAppDesc) adapted and (manifestedJar1main2mainNoAppDescStrict) added 2013-11-26 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (getManifestAttribute) added check for null manifest to prevent npe. * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: added test for npe from getManifestAttribute * tests/test-extensions/net/sourceforge/jnlp/util/FileTestUtils.java: (createJarWithContents) enhanced to be able to create jar without manifest. 2013-11-25 Jiri Vanek * netx/net/sourceforge/jnlp/JNLPFile.java: (TITLE_NOT_FOUND) new constant holding the no title found string to be reused. (getTitleFromManifest) Now using that constant. * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java: adding window erro message moved to be debug only. * ests/reproducers/custom/remote/testcases/RemoteApplicationSettings.java: Added (clean) mechanism to filter out TITLE_NOT_FOUND * tests/reproducers/signed/ReadPropertiesBySignedHack/testcases/ReadPropertiesBySignedHackTest.java: * tests/reproducers/signed/ReadPropertiesSigned/testcases/ReadPropertiesSignedTest.java: * tests/reproducers/simple/AddShutdownHook/testcases/AddShutdownHookTest.java: * tests/reproducers/simple/AllStackTraces/testcases/AllStackTracesTest.java * tests/reproducers/simple/CreateClassLoader/testcases/CreateClassLoaderTest.java * tests/reproducers/simple/ReadEnvironment/testcases/ReadEnvironmentTest.java * tests/reproducers/simple/ReadProperties/testcases/ReadPropertiesTest.java * tests/reproducers/simple/RedirectStreams/testcases/RedirectStreamsTest.java * tests/reproducers/simple/ReplaceSecurityManager/testcases/ReplaceSecurityManagerTest.java * tests/reproducers/simple/SetContextClassLoader/testcases/SetContextClassLoaderTest.java * tests/reproducers/simple/simpletest2/testcases/SimpleTest2Test.java Removed checks for emty outputs 2013-11-25 Jiri Vanek * netx/net/sourceforge/jnlp/ResourcesDesc.java: (getMainJAR) throw an RuntimeException when more then one main jar is specified. Preventing app to start. * tests/reproducers/simple/ManifestedJar1/testcases/ManifestedJar1Test.java: (manifestedJar1main2mainNoAppDesc), (manifestedJar1nothing2nothingAppDesc) fixed and adapted to change. 2013-11-22 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/DefaultLaunchHandlerTest.java: (init) enable logging to streams if disabled. 2013-11-13 Andrew Azores * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: add parameterized type information to several return types and local variables. Refactor for-loops and Enumeration iterations into for-each-loops. 2013-11-13 Andrew Azores * netx/net/sourceforge/jnlp/util/BasicExceptionDialog.java: centers on-screen before appearing 2013-11-13 Jiri Vanek Added test-extension to silence stdout/err of itw when run from junit * tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java: now extends NoStdOutErrTest * tests/netx/unit/net/sourceforge/jnlp/ParserBasic.java: same * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: same * tests/test-extensions/net/sourceforge/jnlp/util/logging/NoStdOutErrTest.java: new class with (disableStds) BeforeClass method and (restoreStds) AfterClass method which are responsible for silence all itw messages from extending test. 2013-11-13 Jiri Vanek Enabled access to manifests' attributes from JNLPFile class Implemented http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#app_name * netx/net/sourceforge/jnlp/JNLPFile.java: Added (manifestsAttributes) field. Added (ManifestsAttributes) inner class, to encapsulate access to attributes. (getTitle) can handle manifests too. * netx/net/sourceforge/jnlp/PluginBridge.java: is following app_name recommendations. * netx/net/sourceforge/jnlp/ResourcesDesc.java: (getMainJAR) made more granular * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (init) inject itself to file's ManifestsAttributes. (checkForAttributeInJars) renamed field mainClassInThisJar to attributeInThisJar. Added getter for mainClass. * netx/net/sourceforge/jnlp/security/CertWarningPane.java: bracketing cleanup. * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPFileTest.java: new test to check new functionalites * tests/netx/unit/net/sourceforge/jnlp/runtime/ResourcesDescTest.java: same * tests/test-extensions/net/sourceforge/jnlp/mock/DummyJNLPFileWithJar.java: can set info * NEWS: mentioned first u45 attribute 2013-11-10 Jiri Vanek Fixed lock in awt threads. JavaConsole window is now disposed instead of hidden. * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: (lastSize) new global variable to remember last size of window.(contentPanel) moved from local to global scope. (initializeWindow) extracted from (initialize), is handling creation and filling of window. (showConsole) is now initializing window, and (hideConsole) is disposing it. Added override annotations and removed duplicate code. * netx/net/sourceforge/jnlp/util/logging/OutputController.java: messageQueConsumer thread is now named, and its wait, have timeout. 2013-11-10 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: removed suspicious return when (searchForMain) had null launchDesc 2013-11-07 Andrew Azores Reproducer test cleanup. Replaced ServerAccess.ProcessResult in favour of ProcessResult, and junit.framework.Assert in favour of org.junit.Assert. Other notable changes below. * tests/reproducers/simple/simpletest1/testcases/XDGspecificationTests.java: (removeXdgValues, setXdgValues) list 'rr' uses parameterized type. (getContentOfDirectory) list 'result' uses parameterized type * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: (ProcessResult) inner class removed. (getBrowserParams) list 'l' uses parameterized type * tests/reproducers/simple/LocalesTest/testcases/LocalesTestTest.java: (getChangedLocalesForSubproces) list 'rr' uses parameterized type * tests/reproducers/simple/LocalisedInformationElement/testcases/LocalisedInformationElementTest.java: same * tests/test-extensions/net/sourceforge/jnlp/ProcessWrapper.java: constructor for (String, List, String) lists 'urledArgs' and 'otherArgs' use parameterized type. (stdoutl, stderrl) use parameterized type. * tests/test-extensions/net/sourceforge/jnlp/ContentReader.java: (listeners) use parameterized type 2013-11-05 Jiri Vanek Java console resurrected and connected to new logging. * NEWS: mentioned console for plugin and javaws * Changelog: removed one wrong tab * netx/net/sourceforge/jnlp/config/Defaults.java: added DeploymentConfiguration.CONSOLE_SHOW_PLUGIN, and DeploymentConfiguration.CONSOLE_SHOW_JAVAWS. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: added and javadoc-ed CONSOLE_SHOW_PLUGIN,CONSOLE_SHOW_JAVAWS, DISABLE, SHOW, HIDE, KEY_CONSOLE_STARTUP_MODE. * netx/net/sourceforge/jnlp/resources/Messages.properties: localized console * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java : removed legacy STD*_FILE * netx/net/sourceforge/jnlp/util/BasicExceptionDialog.java: Added button to show console on demand. Added (getShowButton) method to share code with * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java: Added button to show console on demand and explaining line. * netx/net/sourceforge/jnlp/util/logging/JavaConsole.java: moved from plugin, and reworked. Especially get rid of perpetual loading of file. Made singleton. * netx/net/sourceforge/jnlp/util/logging/LogConfig.java: added (isLogToConsole) returning (JavaConsole.isEnabled) status. * netx/net/sourceforge/jnlp/util/logging/OutputController.java: added (Level.isError) and (Level.isOutput) methods to determine original channel, and can log to console. * plugin/icedteanp/java/sun/applet/JavaConsole.java: moved to netx * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java: (streamhandler) made private with setter * plugin/icedteanp/java/sun/applet/PluginMain.java : removed legacy STD*_FILE, added set of classloaders information provider to console. (handlePluginMessage) show and hide of console is checking it's status. (showConsole) and (hideConsole) moved to JavaConsole. 2013-11-05 Andrew Azores * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java: (addPermission) avoid NPE in JNLPClassLoader#getPermissions with debug enabled 2013-11-01 Jiri Vanek Synced headers between PLUGIN_DEBUG, PLUGIN_ERROR and javaside * netx/net/sourceforge/jnlp/util/logging/OutputController.java: (getHeader) added thread id and name to log header. * plugin/icedteanp/IcedTeaPluginUtils.h: (PLUGIN_DEBUG) (PLUGIN_ERROR) headers generation code moved to macro (CREATE_HEADER0). Both headers now contains pthread_self and g_thread_self. Fixed indentation. 2013-11-01 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: added tests for custom attributes (getCustomAtributes), (getCustomAtributesEmpty) and test to ensure order during searching for attributes in manifests (checkOrderWhenReadingAttributes). * tests/test-extensions/net/sourceforge/jnlp/mock/DummyJNLPFileWithJar.java: can now handle multiple source jars, and set main jar (new constructors), (jarFiles) and (jarDescs) redeclared to arrays. 2013-10-30 Jiri Vanek * netx/net/sourceforge/jnlp/JARDesc.java: made immutable (location)(version)(part)(lazy)(main)(nativeJar)(cacheable) made final 2013-10-29 Andrew Azores Fix PR1513, signed applets with external main-class support * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (initializeResources) ask for user approval rather than throwing LaunchException for signed applets with external main-class 2013-10-25 Jiri Vanek Plugin debug can now be controlled from itw_settings, in same way java side. For now ICEDTEAPLUGIN_DEBUG on the debug in same way as deployment.log itw-settings property. Individual logging streams are controlled by deployment.log.{headers,file,stdstreams,system} System and file are not yet fully done (same as java side in this moment). Streams are true, all others false by default. * plugin/icedteanp/IcedTeaNPPlugin.cc: initialized variables new bool variables (debug_initiated), (plugin_debug_headers), (plugin_debug_to_file), (plugin_debug_to_system) as false and (plugin_debug_to_streams) as true. * plugin/icedteanp/IcedTeaNPPlugin.h: above variables declared as extern * plugin/icedteanp/IcedTeaParseProperties.cc: initialization of (default_file_ITW_deploy_props_name) and (custom_jre_key) moved here from IcedTeaNPPlugin.h. New method (read_bool_property) and its more concrete shortcuts (is_debug_on) (is_debug_header_on) (is_logging_to_file) (is_logging_to_stds) (is_logging_to_system) implemented to access properties. * plugin/icedteanp/IcedTeaParseProperties.h: above methods declared. * plugin/icedteanp/IcedTeaPluginUtils.h: (PLUGIN_{ERROR,DEBUG}) methods adapted headers/debug/streams logic as described in title. Headers made more informative (like java side) * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc: TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_on) extended to TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_on_headers_off). TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_off) extended to TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_off_headers_off), and new tests TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_on_headers_on) TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_off_headers_on) (100x slower then without headers) 2013-10-25 Jiri Vanek all output messages redirected to PLUGIN_{DEBUG,ERROR} macros * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc: affected * plugin/icedteanp/IcedTeaNPPlugin.cc: affected * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: affected * plugin/icedteanp/IcedTeaPluginUtils.cc: affected * plugin/icedteanp/IcedTeaPluginUtils.h: affected * plugin/icedteanp/IcedTeaRunnable.cc: affected * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: affected * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc: added (TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_on)) and (TEST(PLUGIN_DEBUG_ERROR_PROFILING_debug_off)) which call new (doDebugErrorRun) and are measuring refactoring impacts. 2013-10-25 Jiri Vanek * netx/net/sourceforge/jnlp/util/logging/OutputController.java: (getCallerClass) now gets out also from sun.applet.PluginDebug class. 2013-10-24 Andrew Azores Fix array index out of bounds due to malformed plugin message (PR539) * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: (_getMember, _getString) append "null" to result when call is unsuccessful * tests/reproducers/simple/JSObjectWithoutToString/resources/JSObjectWithoutToString.html: new test to ensure failed calls to getMember and getString on JSObject do not produce malformed results * tests/reproducers/simple/JSObjectWithoutToString/resources/JSObjectWithoutToString.js: same * tests/reproducers/simple/JSObjectWithoutToString/srcs/JSObjectWithoutToString.java: same * tests/reproducers/simple/JSObjectWithoutToString/testcases/JSObjectWithoutToStringTest.java: same 2013-10-23 Jiri Vanek C-part of plugin is now also trying to follow XDG * plugin/icedteanp/IcedTeaParseProperties.cc: (user_properties_file) is now using XDG cached dir or its default variant in case that old file do not (should not!) exists 2013-10-22 Omair Majid * netx/net/sourceforge/jnlp/util/logging/LogConfig.java (resetLogConfig): New method. * tests/netx/unit/net/sourceforge/jnlp/util/logging/OutputControllerTest.java (setUp, tearDown): New method. 2013-10-22 Jiri Vanek More synchronized error/debug methods * plugin/icedteanp/IcedTeaNPPlugin.cc: all occurrences of PLUGIN_ERROR_TWO and PLUGIN_ERROR_THREE replaced by PLUGIN_ERROR. PLUGIN_ERROR itself moved to * plugin/icedteanp/IcedTeaPluginUtils.h: (PLUGIN_ERROR) new fuction, now uses ... arguments and printf with __VA_ARGS__ instead of g_printerr (PLUGIN_DEBUG) now prints to stdout, instead of stderr which is used by (PLUGIN_ERROR). 2013-10-21 Jiri Vanek Logic to extract main class attribute generalized to common methods. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (getMainClassName) is now calling (getManifestAttribute) (getManifestAttribute) new method, extract named attribute from url specified jar. Called by (checkForAttributeInJars) (checkForMain) is now calling (checkForAttributeInJars). Also logic of (checkForAttributeInJars) was taken from here. (checkForAttributeInJars) new method, read specific attribute from application jar(s) in specific order. 2013-10-20 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (isPluginDebug) made private to prevent confusion. * plugin/icedteanp/java/sun/applet/PluginDebug.java: (DEBUG) initialized from JNLPRuntime.isDebug instead of incorrect JNLPRuntime.isPluginDebug. 2013-10-17 Andrew Azores Back out changeset 420d72e5cee7 due to breaking LiveConnect feature. http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2013-October/024919.html * plugin/icedteanp/IcedTeaNPPlugin.cc: undo 420d72e5cee7 * plugin/icedteanp/IcedTeaPluginUtils.cc: undo 420d72e5cee7 * plugin/icedteanp/IcedTeaPluginUtils.h: undo 420d72e5cee7 * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: undo 420d72e5cee7 * plugin/icedteanp/IcedTeaScriptablePluginObject.h: undo 420d72e5cee7 * tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc: undo 420d72e5cee7 2013-10-16 Andrew Azores Resolve deadlock issue when multiple applets are loaded simultaneously (RH976833) * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (loadClassLock) private member for locking of loadClass method. (loadClass) synchronizes using new lock rather than instance intrinsic lock to avoid RH976833 deadlock * tests/reproducers/custom/JNLPClassLoaderDeadlock/testcases/JNLPClassLoaderDeadlockTest.java: new test for multiple applet deadlock condition * tests/reproducers/custom/JNLPClassLoaderDeadlock/resources/JNLPClassLoaderDeadlock.html: same * tests/reproducers/custom/JNLPClassLoaderDeadlock/srcs/JNLPClassLoaderDeadlock_1.java: same * tests/reproducers/custom/JNLPClassLoaderDeadlock/srcs/JNLPClassLoaderDeadlock_2.java: same * tests/reproducers/custom/JNLPClassLoaderDeadlock/srcs/Makefile: same 2013-10-11 Andrew Azores * netx/net/sourceforge/jnlp/security/SecurityDialog.java: (initDialog) centerDialog called in init rather than on windowOpened event 2013-10-09 Omair Majid * plugin/icedteanp/java/sun/applet/PluginProxySelector.java (computeKey): New method. (getFromBrowser, checkCache): Call computeKey. 2013-10-09 Omair Majid * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (requestPluginProxyInfo): Accept a String instead of URI. (convertUriSchemeForProxyQuery): Move to ... * plugin/icedteanp/java/sun/applet/PluginProxySelector.java (convertUriSchemeForProxyQuery): Here. (getFromBrowser): Call convertUriSchemeForProxyQuery. * tests/netx/unit/sun/applet/PluginAppletViewerTest.java (testConvertUriSchemeForProxyQuery), (assertQueryForBrowserProxyUsesHttpFallback), (assertQueryForBrowserProxyContainsNoDoubleSlashes), (assertQueryForBrowserProxyDoesNotChangeQuery): Move to ... * tests/netx/unit/sun/applet/PluginProxySelectorTest.java: Here. 2013-10-07 Andrew Azores DeploymentConfiguration properties reproducer fix * tests/reproducers/signed/DeploymentPropertiesAreExposed/testcases/DeploymentPropertiesAreExposedTest.java: update test to reflect changed log directory 2013-10-03 Andrew Azores PR1204 patch regression fix * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java: (getVersionedUrl) fix regression in previous PR1204 patch. Refactor to not take Resource parameter, use instance's field instead. (uriPartToString) new method * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java: new tests for ResourceUrlCreator.getVersionedUrl 2013-10-03 Jacob Wisor * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: Moved JButtons to members. (addComponents): Modified to make use of new NonEditableTableModel. Added ListSelectionListener to propertly handle enabling and disabling of operational JButtons when selecting a resource from the cache table. Moved inital populating of the cache table to CacheViewer's constructor until after the CachePane has been instatiated. Added a general purpose Comparator for all non-String columns in the table model. Added a TableCellRenderer with proper localized rendering of "Size" and "Last Modified" columns as well as the content of "Name" and "Path" columns. (createButtonPanel): Moved delete operation into new method invokeDeleteLater(), added mouse cursor busy indicator, and proper handling of enabling and disabling of operational JButtons when pushing the delete button. Moved refresh operation when pushing the refresh button into new method invokePopulateLater() and added proper handling of enabling and disabling of operational JButtons while refreshing. Replaced closing the cache viewer dialog via JDialog.dispose() when pushing the delete button by a post of the WindowEvent.WINDOW_CLOSING event to the CacheViewer dialog in order to effectively remove the newly introduced KeyEventDispatcher. (invokeDeleteLater): New method: Posts an event to the event queue deleting the currently selected resource. (invokePopulateLater): New method: Posts an event to the event queue repopulating the cache table. (populateTable): Added mouse cursor busy indicator. (generateData): Modified cache table's per row data model for proper rendering and sorting to: DirectoryNode, File, String, String, Long, Date. * netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java: (CacheViewer): Added null parameter check. Added a KeyEventDispatcher to enable closing the CacheViewer dialog on a KeyEvent.VK_ESCAPE key event. Replaced closing the cache viewer dialog via JDialog.dispose() by a post of the WindowEvent.WINDOW_CLOSING event to the CacheViewer dialog in order to effectively remove the newly introduced KeyEventDispatcher. * netx/net/sourceforge/jnlp/util/ui/NonEditableTableModel.java: Added a new table model that in effect is a javax.swing.table.DefaultTableModel except for no cell being editable. * netx/net/sourceforge/jnlp/util/ui/package-info.java: Added new package for UI common and recurrung UI tasks with documentation 2013-10-01 Omair Majid * netx/net/sourceforge/jnlp/browser/BrowserAwareProxySelector.java (BrowserAwareProxySelector): Split off browser-specific work into .. (initialize): New method. (initFromBrowserConfig): Delegate reading browser preferences to .. (parseBrowserPreferences): New method. (getFromBrowserConfiguration): Delegate to JNLPProxySelector.getFromArguments. * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java (getFromConfiguration): Move logic into getFromArguments; delegate to it. (getFromArguments): Renamed from getFromConfiguration. Handle optionally using the http host/port for socket addresses. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Call BrowserAwareProxySelector.initialize. * tests/netx/unit/net/sourceforge/jnlp/browser/BrowserAwareProxySelectorTest.java: New file. 2013-10-01 Omair Majid * plugin/icedteanp/java/sun/applet/PluginProxySelector.java (getFromBrowser): Move call to PluginAppletViewer.requestPluginProxyInfo into new method. (getProxyFromRemoteCallToBrowser): New method. * tests/netx/unit/sun/applet/PluginProxySelectorTest.java: New file. 2013-09-26 Andrew Azores Fix for PR1204. Absolute paths in resource URLs are correctly handled when appended to host URLs and URL query strings are not removed. * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java: (getVersionedUrlUsingQuery) renamed to getVersionedUrl, refactored construction of URL * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (requestPluginProxyInfo) extracted proxy URI logic. (processProxyUri) new method for finding proxy URIs, handles absolute resource paths correctly * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java: added tests for ResourceUrlCreator#getVersionedUrl * tests/netx/unit/sun/applet/PluginAppletViewerTest.java: added tests for PluginAppletViewer.processProxyUri * tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html: new reproducer checks that absolute paths and query strings in resource URLs are properly handled, and caching still works * tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp: same * tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java: same 2013-09-25 Andrew Azores * Makefile.am: clean up summary_unit.txt and summary_reproducers.txt for "clean" goal 2013-09-25 Jiri Vanek Added logging bottleneck * netx/net/sourceforge/jnlp/AbstractLaunchHandler.java: extracted system.out/err and printStackTrace in favour of outputController.log methods. Same all below * netx/net/sourceforge/jnlp/DefaultLaunchHandler.java * netx/net/sourceforge/jnlp/ExtensionDesc.java * netx/net/sourceforge/jnlp/GuiLaunchHandler.java * netx/net/sourceforge/jnlp/JNLPFile.java * netx/net/sourceforge/jnlp/JNLPMatcher.java * netx/net/sourceforge/jnlp/JNLPSplashScreen.java * netx/net/sourceforge/jnlp/Launcher.java * netx/net/sourceforge/jnlp/MalformedXMLParser.java * netx/net/sourceforge/jnlp/NetxPanel.java * netx/net/sourceforge/jnlp/Parser.java * netx/net/sourceforge/jnlp/PluginBridge.java * netx/net/sourceforge/jnlp/SecurityDesc.java * netx/net/sourceforge/jnlp/StreamEater.java * netx/net/sourceforge/jnlp/XmlParser.java * netx/net/sourceforge/jnlp/about/HTMLPanel.java * netx/net/sourceforge/jnlp/browser/BrowserAwareProxySelector.java * netx/net/sourceforge/jnlp/browser/FirefoxPreferencesFinder.java * netx/net/sourceforge/jnlp/browser/FirefoxPreferencesParser.java * netx/net/sourceforge/jnlp/cache/CacheDirectory.java * netx/net/sourceforge/jnlp/cache/CacheEntry.java * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java * netx/net/sourceforge/jnlp/cache/CacheUtil.java * netx/net/sourceforge/jnlp/cache/NativeLibraryStorage.java * netx/net/sourceforge/jnlp/cache/Resource.java * netx/net/sourceforge/jnlp/cache/ResourceTracker.java * netx/net/sourceforge/jnlp/config/Defaults.java * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java * netx/net/sourceforge/jnlp/controlpanel/CachePane.java * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java * netx/net/sourceforge/jnlp/controlpanel/DocumentAdapter.java * netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java * netx/net/sourceforge/jnlp/resources/Messages.properties * netx/net/sourceforge/jnlp/resources/Messages_cs.properties * netx/net/sourceforge/jnlp/resources/Messages_de.properties * netx/net/sourceforge/jnlp/resources/Messages_pl.properties * netx/net/sourceforge/jnlp/runtime/AppletAudioClip.java * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java * netx/net/sourceforge/jnlp/runtime/AppletInstance.java * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java * netx/net/sourceforge/jnlp/runtime/Boot.java * netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java * netx/net/sourceforge/jnlp/runtime/FakePacEvaluator.java * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java * netx/net/sourceforge/jnlp/runtime/JNLPPolicy.java * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java * netx/net/sourceforge/jnlp/runtime/PacEvaluatorFactory.java * netx/net/sourceforge/jnlp/runtime/RhinoBasedPacEvaluator.java * netx/net/sourceforge/jnlp/security/CertWarningPane.java * netx/net/sourceforge/jnlp/security/CertificateUtils.java * netx/net/sourceforge/jnlp/security/HttpsCertVerifier.java * netx/net/sourceforge/jnlp/security/KeyStores.java * netx/net/sourceforge/jnlp/security/SecurityDialog.java * netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java * netx/net/sourceforge/jnlp/security/SecurityUtil.java * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExtendedAppletSecurityHelp.java * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java * netx/net/sourceforge/jnlp/services/ServiceUtil.java * netx/net/sourceforge/jnlp/services/XBasicService.java * netx/net/sourceforge/jnlp/services/XPersistenceService.java * netx/net/sourceforge/jnlp/services/XPrintService.java * netx/net/sourceforge/jnlp/services/XSingleInstanceService.java * netx/net/sourceforge/jnlp/splashscreen/SplashUtils.java * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.java * netx/net/sourceforge/jnlp/splashscreen/parts/InformationElement.java * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java * netx/net/sourceforge/jnlp/tools/CertInformation.java * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java * netx/net/sourceforge/jnlp/util/BasicExceptionDialog.java * netx/net/sourceforge/jnlp/util/FileUtils.java * netx/net/sourceforge/jnlp/util/HttpUtils.java * netx/net/sourceforge/jnlp/util/ImageResources.java * netx/net/sourceforge/jnlp/util/PropertiesFile.java * netx/net/sourceforge/jnlp/util/Reflect.java * netx/net/sourceforge/jnlp/util/StreamUtils.java * netx/net/sourceforge/jnlp/util/TimedHashMap.java * netx/net/sourceforge/jnlp/util/UrlUtils.java * netx/net/sourceforge/jnlp/util/XDesktopEntry.java * netx/net/sourceforge/nanoxml/XMLElement.java * plugin/icedteanp/java/netscape/javascript/JSRunnable.java * plugin/icedteanp/java/sun/applet/JavaConsole.java * plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java * plugin/icedteanp/java/sun/applet/PluginDebug.java * plugin/icedteanp/java/sun/applet/PluginException.java * plugin/icedteanp/java/sun/applet/PluginMain.java * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java * plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java * plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java * plugin/icedteanp/java/sun/applet/PluginProxySelector.java * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java * tests/netx/unit/net/sourceforge/jnlp/DefaultLaunchHandlerTest.java * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java * tests/netx/unit/net/sourceforge/jnlp/util/HttpUtilsTest.java * tests/netx/unit/net/sourceforge/jnlp/util/XDesktopEntryTest.java * tests/reproducers/simple/simpletest1/testcases/XDGspecificationTests.java * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java * netx/net/sourceforge/jnlp/util/logging/FileLog.java: new file, derived from AppletLog. Now have responsibility to log to custom file. * netx/net/sourceforge/jnlp/util/logging/LogConfig.java: new file derived from Log * netx/net/sourceforge/jnlp/util/logging/OutputController.java: new bottleneck for logging * netx/net/sourceforge/jnlp/util/logging/PrintStreamLogger.java: logger to std.streams * netx/net/sourceforge/jnlp/util/logging/SingleStreamLogger.java: interface common to all new loggers * netx/net/sourceforge/jnlp/util/logging/UnixSystemLog.java: not yet implemented susytem log * netx/net/sourceforge/jnlp/util/logging/WinSystemLog.java: not yet implemented susytem log * tests/netx/unit/net/sourceforge/jnlp/util/logging/FileLogTest.java: new set of tests * tests/netx/unit/net/sourceforge/jnlp/util/logging/OutputControllerTest.java: new set of tests * tests/netx/unit/net/sourceforge/jnlp/util/logging/PrintStreamLoggerTest.java: new set of tests * netx/net/sourceforge/jnlp/AppletLog.java: removed * netx/net/sourceforge/jnlp/Log.java: rmeoved 2013-09-24 Omair Majid PR1474 * NEWS: Update with bug. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: Document KEY_PROXY_SAME. * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java (getFromConfiguration): Same proxy is not applicable to SOCKS. Always include SOCKS proxy if available. * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPProxySelectorTest.java (testHttpFallsBackToManualSocksProxy): New method. (testManualSameProxy): Remove test for socket protocol. 2013-09-23 Omair Majid * netx/net/sourceforge/jnlp/browser/BrowserAwareProxySelector.java (BrowserAwareProxySelector): Rename to... (BrowserAwareProxySelector(DeploymentConfiguration)): New method. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: Clarify possible values for KEY_PROXY_TYPE. * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java (JNLPProxySelector): Rename to... (JNLPProxySelector(DeploymentConfiguration)): New method. (parseConfiguration): Rename to... (parseConfiguration(DeploymentConfiguration)): New method. (inBypassList): Get host from URI instead of manual hacks. (getProxiesFromPacResult): Clarify return value. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Adjust for new BrowserAwareProxySelector constructor. * plugin/icedteanp/java/sun/applet/PluginMain.java (init): Adjust for new PluginProxySelector constructor. * plugin/icedteanp/java/sun/applet/PluginProxySelector.java (PluginProxySelector): New constructor. * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPProxySelectorTest.java: New file. 2013-09-20 Omair Majid * netx/net/sourceforge/jnlp/InformationDesc.java (InformationDesc): Remove JNLPFile argument. (getJNLPFile): Remove. * netx/net/sourceforge/jnlp/JNLPFile.java (getInformation): Adjust to new InformationDesc constructor. * netx/net/sourceforge/jnlp/Parser.java (getInformation): Likewise. * tests/netx/unit/net/sourceforge/jnlp/InformationDescTest.java: New file. 2013-09-19 Jana Fabrikova Added text only reports from reproducers and unit tests run * tests/report-styles/textreport.xls: style for generating summary output in summary_reproducers.txt and summary_unit.txt * Makefile.am: added generating the text reports in run-netx-dist-tests goal 2013-09-18 Jiri Vanek Removed java 1.3 comaptible (redundant) code from ParseException * netx/net/sourceforge/jnlp/ParseException.java: (ParseException) modified to support super call only, (getCause) and both (printStackTrace) removed 2013-09-16 Andrew Azores Fix ResourcesTest reproducer. * tests/test-extensions-tests/net/sourceforge/jnlp/ResourcesTest.java: fixed formatting, removed commented lines. (testBrowser): assertion that ~/.mozilla/plugins directory exists removed. Renamed (userPluginDir, defaultPluginDir, userPlugins, defaultPlugins) 2013-09-16 Omair Majid * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java (toList): Remove. (checkForMainFileLeakTest): Use Arrays.asList. * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmationTest.java (toList): Remove. (testToRelativePaths): Use Arrays.asList. 2013-09-16 Jiri Vanek * Makefile.am: returned modified (EXTRA_DIST) variable. It is enriched for netx-dist-tests-whitelist and NEW_LINE_IFS to enable reproducers tests in dist tarball. 2013-09-16 Deepak Bhole CVE-2012-4540, RH869040: Heap-based buffer overflow after triggering event attached to applet * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: Removed unnecessary heap allocations. 2013-09-13 Andrew Azores * tests/test-extensions/net/sourceforge/jnlp/tools/MessageProperties.java: new utility class to handle retrieving localized messages for reproducers * tests/reproducers/signed/CacheReproducer/testcases/CacheReproducerTest.java: refactored to use new MessageProperties class * tests/test-extensions-tests/net/sourceforge/jnlp/MessagePropertiesTest.java: tests for new MessageProperties class 2013-09-11 Jacob Wisor * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java Made temporary files location JFileChooser open at the currently specified location Made temporary files location JFileChooser display a helpful title Removed misleading "All Files" file filter from JFileChooser * netx/net/sourceforge/jnlp/resources/Messages.properties Added new message to resources for JFileChooser's choose button * netx/net/sourceforge/jnlp/resources/Messages_cs.properties Added new message to resources for JFileChooser's choose button Fixed a few inconsistent messages in resource files * netx/net/sourceforge/jnlp/resources/Messages_de.properties Added new message to resources for JFileChooser's choose button Fixed a few inconsistent messages in resource files * netx/net/sourceforge/jnlp/resources/Messages_pl.properties Added new message to resources for JFileChooser's choose button Fixed a few inconsistent messages in resource files 2013-09-09 Omair Majid * netx/net/sourceforge/jnlp/JNLPFile.java (getDownloadOptionsForJar): Rename to ... (getDownloadOptions): New method. Look up jnlp.packEnabled and jnlp.versionEnabled in any resources element. * netx/net/sourceforge/jnlp/PluginBridge.java (getDownloadOptionsForJar): Rename to ... (getDownloadOptions): New method. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeResources): Invoke file.getDownloadResources. (getDownloadOptionsForJar): Remove. * tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java (testDownloadOptionsAppliedEverywhere): New method. (testDownloadOptionsFilteredOut): New method. 2013-09-04 Andrew Azores * netx/net/sourceforge/jnlp/config/Defaults.java: (USER_CACHE_HOME) made public for use in CacheReproducer * tests/reproducers/signed/CacheReproducer/testcases/CacheReproducerTest: updated "could not clear cache" message and cache location. Other minor cleanup 2013-09-04 Andrew Azores * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: (getIntegerResponseAsBoolean) extracted integer response casting/handling logic into new method * tests/netx/unit/net/sourceforge/jnlp/security/SecurityDialogsTest.java: new unit test for SecurityDialogs#getIntegerReponseAsBoolean() 2013-09-04 Adam Domurad * netx/net/sourceforge/jnlp/Launcher.java: Fix applet context being null during applet init & start. 2013-08-29 Omair Majid * tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java (testPropertyRestrictions): New method. Check that properties in resources are are combined and filtered as appropriate. 2013-08-29 Omair Majid PR1058 * netx/net/sourceforge/jnlp/services/XFileOpenService.java (openMultiFileDialog): Create a privileged proxy for each FileContents instance and return an array of them. 2013-08-27 Adam Domurad Do not wait for applet initialization when binding Java applets for NPAPI. * plugin/icedteanp/IcedTeaNPPlugin.cc: Refactor to use lazy-initialized javascript applet binding. * plugin/icedteanp/IcedTeaPluginUtils.cc: Make use of new helper class, introduce (stringPrintf), introduce NPObjectRef. * plugin/icedteanp/IcedTeaPluginUtils.h: Same. * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: Allow IcedTeaScriptableJavaObject to be lazy-initialized, introduce lazy-initializing (get_scriptable_applet_object). * plugin/icedteanp/IcedTeaScriptablePluginObject.h: Same. * tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc: Adapt test to new helper class. 2013-08-23 Adam Domurad Spawn Java side during C++ unit tests. Many new tests. * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc (hasPackage): Minor cleanup. * plugin/icedteanp/IcedTeaNPPlugin.cc (initialize_data_directory): New, extracted function. (NP_Initialize): Calls extracted function. * plugin/icedteanp/IcedTeaNPPlugin.h: Expose more functions for testing purposes. * tests/cpp-unit-tests/IcedTeaNPPluginTest.cc (get_scriptable_package_object): Test binding of java package (get_scriptable_java_object): Test binding of java object * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc (NPIdentifierAsString): Update to create npidentifier properly. * tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc (getProperty): Test loading java.lang.Integer.MAX_VALUE from C++. * tests/cpp-unit-tests/MemoryLeakDetector.h (reset_global_state): Made public * tests/cpp-unit-tests/checked_allocations.h (SafeAllocator): New, typedef for allocator that avoids leak detection. * tests/cpp-unit-tests/browser_mock.cc (browsermock_setup_functions): Renamed to (browsermock_create_table). (browsermock_create_table): Now returns browser table, additional object release and identifier methods added. * tests/cpp-unit-tests/browser_mock.h: Update for rename. * tests/cpp-unit-tests/main.cc: Now clears state via (reset_global_state) * tests/cpp-unit-tests/IcedTeaJavaRequestProcessorTest.cc: New, contains unit tests that cover all of JavaRequestProcessor's methods. * tests/cpp-unit-tests/browser_mock_npidentifier.cc: Allocation-safe npidentifier mocking, adheres to NPAPI spec. * tests/cpp-unit-tests/browser_mock_npidentifier.h: Same. 2013-08-23 Adam Domurad * plugin/icedteanp/IcedTeaNPPlugin.cc: Refactor plugin data creation. * plugin/icedteanp/IcedTeaNPPlugin.h: Same. 2013-08-19 Adam Domurad * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Evaluate javascript when it shows up in a 'showDocument' call. * plugin/icedteanp/java/sun/applet/PluginMain.java: Install arbitrary 'javascript:' protocol handler. * tests/rproducers/simple/JavascriptURLProtocol/resources/JavascriptProtocol.html: Tests if javascript is run from a test applet using showDocument. * tests/reproducers/simple/JavascriptURLProtocol/resources/JavascriptProtocol.js: Same. * tests/reproducers/simple/JavascriptURLProtocol/srcs/JavascriptProtocol.java: Same. * tests/reproducers/simple/JavascriptURLProtocol/testcases/JavascriptProtocolTest.java: Same. 2013-08-15 Andrew Azores * netx/net/sourceforge/jnlp/ParserSettings.java: (globalParserSettings) static ParserSettings instance to store settings. (setGlobalParserSettingsFromArgs) Determine, store, and return globalParserSettings. (getGlobalParserSettings) return stored ParserSettings * netx/net/sourceforge/jnlp/PluginBridge.java: (extensionJars) stores list of JNLP extensions. (getResources) returns this list * netx/net/sourceforge/jnlp/runtime/Boot.java: minor refactor to use ParserSettings.setGlobalParserSettingsFromArgs() * tests/netx/unit/net/sourceforge/jnlp/ParserSettingsTest.java: ensure that ParserSettings.setGlobalParserSettingsFromArgs() works as intended * tests/reproducers/custom/ExtensionJnlpsInApplet/testcases/ExtensionJnlpsInAppletTest.java: tests browser launch of HTML file with embedded JNLP applet referencing extension JNLP * tests/reproducers/custom/ExtensionJnlpsInApplet/resources/ExtensionJnlpHelper.jnlp: same * tests/reproducers/custom/ExtensionJnlpsInApplet/resources/ExtensionJnlpTest.html: same * tests/reproducers/custom/ExtensionJnlpsInApplet/resources/ExtensionJnlpTestApplet.jnlp: same * tests/reproducers/custom/ExtensionJnlpsInApplet/srcs/ExtensionJnlpHelper.java: same * tests/reproducers/custom/ExtensionJnlpsInApplet/srcs/ExtensionJnlpTestApplet.java: same * tests/reproducers/custom/ExtensionJnlpsInApplet/srcs/Makefile: same 2013-08-13 Andrew Azores * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: no longer sends HTTP 400 BAD REQUEST messages * test/test-extensions-tests/net/sourceforge/jnlp/TinyHttpdImplTest.java: removed "bad request" test 2013-08-12 Andrew Azores * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: refactored * tests/test-extensions/net/sourceforge/jnlp/ServerLauncher.java: TinyHttpdImpl constructor changed, reflecting this here * tests/test-extensions-tests/net/sourceforge/jnlp/ServerAccessTest.java: removed TinyHttpdImpl tests * tests/test-extensions-tests/net/sourceforge/jnlp/TinyHttpdImplTest.java: new unit tests for TinyHttpdImpl and moved old tests out of ServerAccessTest 2013-08-01 Andrew Azores * .hgignore: ignore generated HTML files (from AboutDialog) 2013-07-30 Adam Domurad * plugin/icedteanp/IcedTeaPluginUtils.cc (NPIdentifierAsString): Leak-free utf8fromidentifier wrapper. * plugin/icedteanp/IcedTeaPluginUtils.h: Same. * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc: Update calls * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: Same. * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: Same. * plugin/icedteanp/IcedTeaScriptablePluginObject.h: Same. * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc (NPIdentifierAsString): New, tests utility function * tests/cpp-unit-tests/browser_mock.cc (mock_utf8fromidentifier): New, mocks NPAPI function 2013-07-30 Jiri Vanek * tests/reproducers/simple/simpletest1/resources/favicon.ico: new file should be served by test server in reproducers run and so prevent FNF exception * ChangeLog: fixed few entries below (added emty line between author and body) 2013-07-25 Andrew Azores * netx/net/sourceforge/jnlp/about/AboutDialog.java (AboutDialog, display): removed "throws IOException" * netx/net/sourceforge/jnlp/about/HTMLPanel.java (HTMLPanel): removed "throws IOException" and changed try/catch to catch IOException rather than Exception * netx/net/sourceforge/jnlp/controlpanel/AboutPanel.java: removed try/catch around AboutDialog.display() call * netx/net/sourceforge/jnlp/runtime/Boot.java (main): same * netx/net/sourceforge/jnlp/splashscreen/impls/DefaultSplashScreens2012Commons.java: same 2013-07-22 Andrew Azores * netx/net/sourceforge/jnlp/runtime/RhinoBasedPacEvaluator.java: (getProxiesWithoutCaching) added java.vm.name read permission to fix Rhino parsing and PAC proxy configuration 2013-07-18 Jiri Vanek IcedTea-Web is now following XDG .config and .cache specification(RH947647) * tests/reproducers/simple/simpletest1/testcases/XDGspecificationTests.java new file, test if XDG specification and trasnfer to it are followed correctly, * NEWS: mentioned new feature * Makefile.am: (PUBLIC_KEYSTORE) repalced by (PUBLIC_KEYSTORE_STUB) which is now holding only internal part of path.(exported-test-certs) (netx-dist-tests-import-cert-to-public) (netx-dist-tests-remove-cert-from-public) are now resolving XDG variable and setting real path of PUBLIC_KEYSTORE by resolved value and (PUBLIC_KEYSTORE) * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: changed to be public and recently_used strign extracted to (CACHE_INDEX_FILE_NAME) constant * netx/net/sourceforge/jnlp/config/Defaults.java: is now resovling and propagating XDG_CONFIG/CACHE_HOME specification. (USER_HOME) repalced by (USER_CACHE_HOME) and (USER_CONFIG_HOME). (move14AndOlderFilesTo15Structure) new method responsible for moving of old data to new locations. (move14AndOlderFilesTo15StructureCatched) the same but with catch block * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: * tests/netx/unit/net/sourceforge/jnlp/util/PropertiesFileTest.java: are now using (CACHE_INDEX_FILE_NAME) * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java: (main) * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: (main) * netx/net/sourceforge/jnlp/runtime/Boot.java: (main) * plugin/icedteanp/java/sun/applet/PluginMain.java: (main) are now calling DeploymentConfiguration.move14AndOlderFilesTo15StructureCatched asap. * netx/net/sourceforge/jnlp/util/FileUtils.java: various file manipulation methods moved inside here from test-extensions - (saveFile) (getContentOfStream) (loadFileAsString) - to avoid duplications * tests/test-extensions/net/sourceforge/jnlp/ProcessWrapper.java: for puposes of new test added constructor with string instead of URL * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: see FileUtils.java 2013-07-17 Jiri Vanek About dialogue made accessible from plugin * netx/net/sourceforge/jnlp/about/AboutDialog.java: (frame) re-declared to be Dialogue instead of JFrame and allowed to be modal if necessary. Caption internationalized. * netx/net/sourceforge/jnlp/splashscreen/impls/DefaultSplashScreens2012Commons.java: Added listener for upper right caption to show AboutDialog * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java: (drawBase) if enough space, adding about "button" * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java: added about button * tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashScreenTest.java: minor modifications related to this change 2013-07-17 Jiri Vanek about dialogue now available from itw-settings * netx/net/sourceforge/jnlp/controlpanel/AboutPanel.java: added button to launch about dialogue * netx/net/sourceforge/jnlp/resources/Messages.propertie: (CPAboutInfo) Adapted to be more accurate to select-able JVM 2013-07-17 Jiri Vanek Jacob Wisor added some missing de and pl strings * netx/net/sourceforge/jnlp/resources/Messages.properties: fixed about dialogue comment * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: removed keystore comment * netx/net/sourceforge/jnlp/resources/Messages_de.properties: * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: added AboutDialogueTabAbout AboutDialogueTabAuthors AboutDialogueTabChangelog AboutDialogueTabNews AboutDialogueTabGPLv2 localizations 2013-07-11 Andrew Azores * NEWS: added entry regarding new About Dialogue * netx/net/sourceforge/jnlp/about/AboutDialog.java: fixed localization of label on News tab 2013-07-11 Andrew Azores * Makefile.am (stamps/html-gen): moved plaintext-to-HTML logic into new shell script * html-gen.sh: contains plaintext-to-HTML logic previously found in Makefile.am. Added a sed expression to cause ChangeLog file listing entries to be underlined. 2013-07-06 Jiri Vanek Andrew Azores New about dialogue * Makefile.am (stamps/netx-html-gen): removed logic for extras.jar, added new stamp to create HTML for AboutDialog * netx/net/sourceforge/jnlp/about/AboutDialog.java: Moved out of extras into netx and renamed from Main. New Swing layout and uses HTML files generated in Makefile. * netx/net/sourceforge/jnlp/about/HTMLPanel.java: Moved out of extras into netx. Added ability to click hyperlinks. * netx/net/sourceforge/jnlp/runtime/Boot.java (main, getAboutFile, getJNLPFile, itwInfoMessage): changed way of launching About dialog to using new static display method rather than JNLP launch. Removed methods relating to JNLP launch. More informative and nicely formatted -headless information. * netx/net/sourceforge/jnlp/resources/Messages.properties (BAboutITW, BFileInfoAuthors, BFileInfoCopying, BFileInfoNews): added new messages for javaws -about -headless launch * netx/net/sourceforge/jnlp/resources/about.html: moved out of extras into netx. Added more content, changed formatting. * netx/net/sourceforge/jnlp/resources/about.jnlp: removed, no longer needed * netx/net/sourceforge/jnlp/resources/itw_logo.png: new image for About dialog. Modified version of javaws_splash.png * netx/net/sourceforge/jnlp/resources/jamIcon.jpg: moved out of extras into netx * extra/net/sourceforge/javaws/about/HTMLPanel.java: moved into netx * extra/net/sourceforge/javaws/about/Main.java: same * extra/net/sourceforge/javaws/about/resources/about.html: same * extra/net/sourceforge/javaws/about/resources/jamIcon.jpg: same * extra/net/sourceforge/javaws/about/resources/applications.html: removed * extra/net/sourceforge/javaws/about/resources/notes.html: removed 2013-06-28 Adam Domurad * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java (handleMessage): Fix potential NPE on 'GetValue' 2013-06-25 Jiri Vanek * acinclude.m4: (IT_CHECK_FOR_TAGSOUP) is now correctly setting HAVE_TAGSOUP when it is not found 2013-06-24 Jiri Vanek JNLP file is now re-downloading only if is local and have href * /netx/net/sourceforge/jnlp/Launcher.java: (launch) api cleared from (fromSource). (fromUrl) removed always re-downloading code and replaced by conditional. (launchBackground), (toFile), (BgRunner) removed. * netx/net/sourceforge/jnlp/runtime/Boot.java: following new (launch) * tests/reproducers/simple/GeneratedId/srcs/GeneratedId.java: just arguments reprinting application * tests/reproducers/simple/GeneratedId/testcases/GeneratedIdTest.java various tests based on href/no href x local/remote jnlp files * tests/reproducers/simple/GeneratedId/resources/GeneratedId.jnlp: base simple jnlp with someId argument * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: reprinting the get/head correctly and with echo * NEWS: mentioned PR1473 2013-06-21 Adam Domurad * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: Simplify IcedTeaScriptableJavaObject * plugin/icedteanp/IcedTeaScriptablePluginObject.h: Same 2013-06-21 Adam Domurad * plugin/icedteanp/IcedTeaScriptablePluginObject.cc: Move 'get_scriptable_java_package_object' and 'get_scriptable_java_object' into their correct respective classes. * plugin/icedteanp/IcedTeaScriptablePluginObject.h: Same. * plugin/icedteanp/IcedTeaNPPlugin.cc: Update references. * plugin/icedteanp/IcedTeaPluginUtils.cc: Same. * tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc: Same. 2013-06-21 Adam Domurad * plugin/icedteanp/IcedTeaScriptablePluginObject.cc (IcedTeaScriptablePluginObject::get_scriptable_java_package_object): Fix memory leak due to allocated NPClass. (IcedTeaScriptableJavaPackageObject::get_scriptable_java_object): Same. 2013-06-21 Adam Domurad * plugin/icedteanp/IcedTeaPluginUtils.cc: Add global state clearing utility functions. * plugin/icedteanp/IcedTeaPluginUtils.h: Same. * tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc: Test scriptable object creation and destruction. * tests/cpp-unit-tests/browser_mock.cc (mock_createobject): New, mocks NPAPI 'createobject'. * tests/cpp-unit-tests/MemoryLeakDetector.h: New, memory leak detection utility class. * tests/cpp-unit-tests/main.cc (ReportTestFinish): Print which tests resulted in memory leaks. 2013-06-21 Jiri Vanek Adam Domurad Omair Majid Added tagsup (optional dependence) as sanitizer for (possibly) invalid xml files * Makefile.am: (LAUNCHER_BOOTCLASSPATH) (PLUGIN_BOOTCLASSPATH) (NETX_CLASSPATH_ARG) (PLUGIN_COVERAGE_BOOTCLASSPATH) enriched for TAGSOUP_JAR * acinclude.m4: (IT_CHECK_FOR_TAGSOUP) new macro * configure.ac: used this new macro * tests/netx/unit/net/sourceforge/jnlp/ParserBasic.java: * netx/net/sourceforge/jnlp/JNLPCreator.java: (create) * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: * /netx/net/sourceforge/jnlp/JNLPFile.java: (JNLPFile) construcotrs * netx/net/sourceforge/jnlp/PluginBridge.java * netx/net/sourceforge/jnlp/Launcher.java: (main) all adapted to take ParserSettings instead of individual parameters * netx/net/sourceforge/jnlp/MalformedXMLParser.java: new file, bridge between tagsoup and our parser * netx/net/sourceforge/jnlp/XmlParser.java: new file, bridge to old parser * netx/net/sourceforge/jnlp/Parser.java: refactored to be able both with * netx/net/sourceforge/jnlp/ParserSettings.java: reworked to serve as gatherer for various individual parser flags * netx/net/sourceforge/jnlp/resources/Messages.propertie: (BOXml) new key describing -xml switch * tests/netx/unit/net/sourceforge/jnlp/ParserCornerCases.java: * tests/netx/unit/net/sourceforge/jnlp/ParserMalformedXml.java: * tests/netx/unit/net/sourceforge/jnlp/ParserTest.java: Tests adapted to newest state (both for included/excluded tagsoup) and new (testTagNotClosedNoTagSoup) (testUnquotedAttributesNoTagSoup) 2013-06-20 Jiri Vanek Removed out-of date support for jdk 1.5 and older * netx/net/sourceforge/jnlp/runtime/Boot.java: removed memories to Boot13 * netx/net/sourceforge/jnlp/runtime/Boot13.java: removed 2013-06-20 Jiri Vanek Made it work with OpenJDK build 25 * netx/net/sourceforge/jnlp/runtime/Boot.java: (main) Application context created as soon as possible * plugin/icedteanp/java/sun/applet/PluginMain.java:(main) Application context created as soon as possible * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Do not consume exception after setLookAndFeel. 2013-06-18 Andrew Azores * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: extracted some lines out of run() into new method urlToFilePath() * tests/test-extensions-tests/net/sourceforge/jnlp/ServerAccessTest.java: unit tests added for new urlToFilePath() 2013-06-06 Jiri Vanek Andrew Azores Handled semicolon in internal server * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: added stripHttpPathParams method to remove semicolon-delimited "tags" from end of JAR URLs * tests/test-extensions-tests/net/sourceforge/jnlp/ServerAccessTest.java: added test case for new method in TinyHttpdImpl * tests/reproducers/simple/StripHttpPathParams/resources/StripHttpPathParams.html: browser-launched applet test case for reproducer * tests/reproducers/simple/StripHttpPathParams/resources/StripHttpPathParams.jnlp: JNLP test case for reproducer * tests/reproducers/simple/StripHttpPathParams/srcs/StripHttpPathParams.java: reproducer * tests/reproducers/simple/StripHttpPathParams/testcases/StripHttpPathParamsTest.java: Testcase to above reproducer 2013-06-06 Jiri Vanek Made all tests running wit junit4.10 and higher * tests/junit-runner/CommandLine.java: (runMain) is no longer overriding and (runMainAndExit) is now calling System.exit rather then system.exit 2013-06-06 Jiri Vanek Silenced deployment.properties and zero size applet exceptions with tests * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: (findSystemConfigFile) and (loadProperties) now prints already cough exception only in debug mode * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (paint) now paints into 1 x 1 applet instead of 0 x 0 in case of 0 x 0 applet * tests/reproducers/simple/AppletTest/resources/appletZeroH.html: new file * tests/reproducers/simple/AppletTest/resources/appletZeroW.html: new file * tests/reproducers/simple/AppletTest/resources/appletZeroWH.html: new file - testing launchers with zero as width, height or both * tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java: added launchers and evaluations for three new htmls - (appletZeroWH) (appletZeroW) (appletZeroH) 2013-06-06 Jiri Vanek Jacob Wisor Enhanced manifest * netx.manifest.in: added Implementation-URL, Implementation-Vendor, Specification-Title, Specification-URL, Specification-Vendor and Specification-Version entries 2013-06-05 Adam Domurad Fix PR1465 * NEWS: Bug fix note * netx/net/sourceforge/jnlp/util/UrlUtils.java (isValidRFC2396Url): New, tests if valid URL by RFC2396 rules (normalizeUrl): Don't normalize if valid by RFC2396 * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: Adapt which URLs we expect to change when normalizing URLs * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java: (testIsValidRFC2396Url): New, tests isValidRFC2396Url (testNormalizeUrl): Add new test with valid RFC2396 URL 2013-06-04 Jiri Vanek * netx/net/sourceforge/jnlp/resources/Messages.properties: more detailed hint for CCannotClearCache 2013-06-04 Adam Domurad Remove unused files. * plugin/icedteanp/IcedTeaRunnable.cc: Removed. * plugin/icedteanp/IcedTeaRunnable.h: Removed. 2013-06-03 Adam Domurad * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Handle resizing more robustly by not blocking worker thread 2013-06-03 Adam Domurad * netx/net/sourceforge/jnlp/util/StreamUtils.java (copyStream): New, copies input stream to output stream * tests/netx/unit/net/sourceforge/jnlp/cache/NativeLibraryStorageTest.java: New, tests lookup of native libraries from folders and jars. * tests/test-extensions/net/sourceforge/jnlp/util/FileTestUtils.java: New, contains utilities for testing open file descriptors, creating temporary directories, and creating jars. * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: Replace jar creation methods with ones from FileTestUtils. 2013-06-03 Adam Domurad * netx/net/sourceforge/jnlp/cache/NativeLibraryStorage.java: New, stores and searches for native library files that are loaded from jars. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Move code that handled native jar caching to NativeLibraryStorage. 2013-05-29 Adam Domurad * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: Moved & renamed inner MockedOneJarJNLPFile to top-level DummyJNLPFileWithJar class. * tests/test-extensions/net/sourceforge/jnlp/mock/DummyJNLPFileWithJar.java: Moved & renamed from JNLPClassLoaderTest.MockedOneJarJNLPFile. 2013-05-29 Adam Domurad * netx/net/sourceforge/jnlp/resources/Messages.properties: "A serious exception occurred" -> "An exception occurred" 2013-05-20 Jiri Vanek Synchronized launchers to be from one source * Makefile.am: (edit_launcher_script) is now accepting variables (launcher.build/$(javaws)) no depends on launcher/launchers.in instead of launcher/javaws.in and is filling the variables for javaws (launcher.build/$(itweb_settings)) no depends on launcher/launchers.in instead of launcher/itweb_settings.in and is filling the variables for itweb_settings * launcher/itweb-settings.in: removed * launcher/javaws.in: removed * launcher/launchers.in: new file, substitution of removed (itweb-settings.in) and javaws.in. Mostly based on javaws.in, just (CLASSNAME) and (PROGRAM_NAME) and (BINARY_LOCATION) were made more general. 2013-05-20 Jiri Vanek Fixed possible deadlock for applet->js->applet call * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (REQUEST_TIMEOUT) new constant, 60s, to define timeout of applet->js call (waitForRequestCompletion) new method waiting to request to be done with timeout of REQUEST_TIMEOUT. (javascriptToString) using the waitForRequestCompletion instead of plain wait() * tests/reproducers/simple/AppletJsAppletDeadlock/resources/AppletJsAppletDeadlock.html and * tests/reproducers/simple/AppletJsAppletDeadlock/srcs/AppletJsAppletDeadlock.java reproducer * tests/reproducers/simple/AppletJsAppletDeadlock/testcases/AppletJsAppletDeadlockTest.java testcase 2013-05-17 Adam Domurad Fix PR854: Resizing an applet several times causes 100% CPU load * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (handleMessage): Replace buggy initialization wait. 2013-05-14 Jiri Vanek Jacob Wisor * netx/net/sourceforge/jnlp/resources/Messages.properties: (CPJVMitwExec) fixed invalid unicode character 2013-05-02 Jana Fabrikova * tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/AppletAWTRobotUsageSample.html: new resource, html page for displaying the applet in browser * tests/reproducers/simple/JavawsAWTRobotUsageSample/testcases/AppletAWTRobotUsageSampleTest.java: new testcase with 6 browser tests 2013-05-02 Jana Fabrikova * Makefile.am: Change in processing the goal (stamps/compile-reproducers-testcases.stamp) All .java files from reproducers testcases directory are compiled, all non-java files are copied into the TEST_EXTENSIONS_TESTS_DIR, i.e. tests.build/test-extensions-tests directory * tests/reproducers/simple/JavawsAWTRobotFindsButton/resources/javaws-awtrobot-finds-button.jnlp: jnlp file for displaying the applet * tests/reproducers/simple/JavawsAWTRobotFindsButton/srcs/JavawsAWTRobotFindsButton.java: the applet used in the reproducer * tests/reproducers/simple/JavawsAWTRobotFindsButton/testcases/JavawsAWTRobotFindsButtonTest.java: adding 2 tests: that an icon is loaded, and that the button is identified from the given icon and clicked by awt robot * tests/reproducers/simple/JavawsAWTRobotFindsButton/testcases/buttonA.png: the icon of the wanted button 2013-04-26 Jiri Vanek Jacob Wisor Added default, DE and PL localization's tweeks * netx/net/sourceforge/jnlp/resources/Messages.properties: * netx/net/sourceforge/jnlp/resources/Messages_de.properties: * netx/net/sourceforge/jnlp/resources/Messages_pl.properties 2013-05-02 Adam Domurad Ensure that PluginAppletviewer is resized in case of error. This fixes most of the cases of the error splash screen not appearing. * plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java (createPanel): Resize earlier, before erroring out. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (PluginAppletViewer): Set size, remove fixme. 2013-05-02 Adam Domurad * plugin/icedteanp/IcedTeaNPPlugin.cc: Remove only occurence of LEGACY_XULRUNNERAPI 2013-05-02 Adam Domurad Introduce PluginPipeMock utility methods. * tests/test-extensions/sun/applet/PluginPipeMockUtil.java: New, enapsulates PluginPipeMock initialization, cleanup. As well, contains utility methods. * tests/netx/unit/sun/applet/PluginAppletViewerTest.java: Use newly introduced utility methods. 2013-05-02 Adam Domurad * plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java (getBestOverloadMatch): Return null if a valid method was not found. * tests/netx/unit/sun/applet/MethodOverloadResolverTest.java (getResolvedMethod): New, gets ResolvedMethod from array of bundled class, string, and parameters (assertExpectedOverload): New variant that tests exact received values (testArrayToStringResolve): Tests array conversion to String (testArrayToArrayResolve): Tests array conversion to other arrays 2013-05-02 Adam Domurad * plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java (getCostAndCastedObject): Remove code that had no effect before refactoring. (getBestOverloadMatch): Move debug-only code to debug if-block. 2013-05-02 Jiri Vanek Added various tests related to portalbank.no fixes * netx/net/sourceforge/jnlp/cache/Resource.java: added fixme to warn before wrong url comparator * netx/net/sourceforge/jnlp/Version.java: removed useless main. Its purpose moved to new * tests/netx/unit/net/sourceforge/jnlp/VersionTest: some small tests to version class * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: added tests to (getUrlResponseCode) and (findBestUrl) * tests/netx/unit/net/sourceforge/jnlp/util/HttpUtilsTest.java: added tests for (consumeAndCloseConnectionSilently) and (consumeAndCloseConnection) * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest: added license header * tests/test-extensions/net/sourceforge/jnlp/ServerLauncher.java: and * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: added support for simulation of not working HEAD request. 2013-05-02 Jiri Vanek Fix for portalbank.no (trying get after failed head requests) * net/sourceforge/jnlp/cache/ResourceTracker : (findBestUrl) now trying GET after each error request of HEAD type. Changed and added debug messages. (getUrlResponseCode) closing of stream moved to separate method HttpUtils.consumeAndCloseConnectionSilently * net/sourceforge/jnlp/util/HttpUtils.java: new file designed for http utils. Now contains (consumeAndCloseConnection) and (consumeAndCloseConnectionSilently) which calls consumeAndCloseConnection but do not rethrow exception * netx/net/sourceforge/jnlp/util/StreamUtils.java: removed (consumeAndCloseInputStream) now improved and moved to HttpUtils 2013-05-02 Jana Fabrikova * tests/test-extensions/net/sourceforge/jnlp/awt/AWTHelper.java: refactoring - removing initStrGiven variable - now it only matters if the initStr is null or not. Modifying the following two methods: (charReaded) - if initStr is null the run method can not be started from charReaded and the presence of initStr is not checked in stdout. Method (getInitStrAsRule) returns rule that is always true if initStr is null. 2013-05-02 Jiri Vanek Renamed cz locales to be more general * netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties: renamed to * netx/net/sourceforge/jnlp/resources/Messages_cs.properties: new file * tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java: * tests/reproducers/simple/LocalesTest/testcases/LocalesTestTest.java Adapted to new cz locales filename. 2013-05-02 Jana Fabrikova * Makefile.am: the directory $(TEST_EXTENSIONS_SRCDIR) (i.e. test/test-extensions) added on classpath for running reproducers, unit tests, and test code coverage for reproducers and unittests using emma and jacoco, that is for the following 6 targets: (stamps/run-netx-dist-tests.stamp) (stamps/run-netx-unit-tests.stamp) (stamps/run-unit-test-code-coverage.stamp) with EMMA (stamps/run-unit-test-code-coverage-jacoco.stamp) (stamps/run-reproducers-test-code-coverage.stamp) with EMMA (stamps/run-reproducers-test-code-coverage-jacoco.stamp) * tests/test-extensions/net/sourceforge/jnlp/awt/AWTHelper.java: modifying the constructor, the default icon is taken from ComponentFinder instead of loading from file * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ComponentFinder.java: added a block of initialization code - the default icon * tests/netx/unit/net/sourceforge/jnlp/awt/imagesearch/ComponentFinderTest.java: unit test for the initialization code in ComponentFinder * tests/reproducers/simple/AWTCommonResourcesOnly/resources/marker.png: second copy of the default icon in a reproducer with resources only * tests/reproducers/simple/JavawsAWTRobotUsageSample/resources/javaws-awtrobot-usage-sample.jnlp: jnlp file for displaying the applet * tests/reproducers/simple/JavawsAWTRobotUsageSample/srcs/JavawsAWTRobotUsageSample.java: the applet * tests/reproducers/simple/JavawsAWTRobotUsageSample/testcases/JavawsAWTRobotUsageSampleTest.java: adding 6 testcases testing clicking with different mouse buttons on the applet * tests/test-extensions-tests/net/sourceforge/jnlp/awt/imagesearch/ComponentFinderTest.java: unit test for the initialization code in ComponentFinder * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/marker.png: first copy of the default icon, will be on classpath 2013-04-30 Adam Domurad * tests/netx/unit/sun/applet/MethodOverloadResolverTest.java: Add missing copyright header. * tests/netx/unit/sun/applet/PluginAppletSecurityContextTest.java: Same. * tests/netx/unit/sun/applet/PluginParameterParserTest.java: Same. 2013-04-29 Jiri Vanek More granular initialization of AwtHelper * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: added (executeBrowser) which can work upon fully constructed url * tests/test-extensions/net/sourceforge/jnlp/awt/AWTHelper.java: (captureScreenAndFindAppletByIconTryKTimes) split to three: (captureScreenAndFindAppletByIconTryKTimes) - unchanged, now using following (initialiseOnScreenshot) initialize from given buffered image, creating area (initialiseOnScreenshotAndArea) initialize from two given buffered images 2013-04-29 Jiri Vanek Improved performance of scanning images, added masking of images * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ImageSeeker.java: (findExactImage) now using masks and is iterating over rows (getMaskImage) new method to visualize mask (getMask) new method to create mask (getPixels) method to extract pixels from image to int array 2013-04-29 Jana Fabrikova * tests/test-extensions/net/sourceforge/jnlp/awt/AWTHelper.java: refactoring Point instead of Rectangle as icon position as markerPosition * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ComponentFinder.java: refactoring Point instead of Rectangle as icon position in several search methods 2013-04-29 Jana Fabrikova * tests/test-extensions/net/sourceforge/jnlp/awt/AWTHelper.java: fixing method (captureScreenAndFindAppletByIconTryKTimes), which should not throw AWTFrameworkException * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ComponentFinder.java: fixing the return values of several search methods * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ImageSeeker.java: fixing the return values of several search methods 2013-04-26 Jana Fabrikova * /tests/test-extensions/net/sourceforge/jnlp/closinglisteners/RulesFolowingClosingListener.java: added a getter method getRules * tests/test-extensions/net/sourceforge/jnlp/awt/AWTHelper.java: the most important class of AWTFramework, combines closing listener and possibility to use mouse and keyboard for input to tests * tests/test-extensions/net/sourceforge/jnlp/awt/AWTFrameworkException.java: exception that is raised in the framework whenever programmer did not provide enough information * tests/test-extensions/net/sourceforge/jnlp/awt/awtactions/KeyboardActions.java: class with utility keyboard methods * tests/test-extensions/net/sourceforge/jnlp/awt/awtactions/MouseActions.java: class with utility mouse methods * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ComponentFinder.java: class for finding components in a screenshot * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ComponentNotFoundException.java: exception that can be raised if an important component could not be found * tests/test-extensions/net/sourceforge/jnlp/awt/imagesearch/ImageSeeker.java: class for general image searching * tests/reproducers/simple/AWTCommonResourcesOnly/resources/marker.png: reproducer with resources only, contains the default icon marking applets 2013-04-26 Adam Domurad * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (getCacheFile): Use decodeUrlAsFile instead of toURI().getPath(). * netx/net/sourceforge/jnlp/util/UrlUtils.java (decodeUrlAsFile): New, tolerates ill-formed URLs. * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java: (testDecodeUrlAsFile): Test for (decodeUrlAsFile) 2013-04-26 Jiri Vanek Jacob Wisor Added polish localisation * netx/net/sourceforge/jnlp/resources/Messages_de.properties * netx/net/sourceforge/jnlp/resources/Messages.properties: minor fixes * netx/net/sourceforge/jnlp/resources/Messages_pl.properties: new localization nearly complete list of PL values * tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java Added PL as known translation * tests/reproducers/simple/LocalesTest/testcases/LocalesTestTest.java: Added tests to PL integration 2013-04-26 Jiri Vanek Alexandr Kolouch Improved and completed CZ localisation * netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties: Added missing items, some fixes 2013-04-26 Jiri Vanek Alexandr Kolouch Added CZ localization of itw-settings Xdesktop configuration file * itweb-settings.desktop.in: added Name[cs] and Name[cs] keys with values. 2013-04-26 Jiri Vanek Jacob Wisor Added DE and PL localization of itw-settings Xdesktop configuration file * itweb-settings.desktop.in: added Name[de], Name[pl], Comment[de], Comment[pl] keys with values. Added Keywords key with values. 2013-04-26 Jiri Vanek Silenced unittests * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImplTest.java: and * tests/netx/unit/sun/applet/PluginAppletViewerTest.java: System.out.println replaced by ServerAccess.logOutputReprint 2013-04-26 Jiri Vanek Fixed compilation under jdk6 * netx/net/sourceforge/jnlp/util/JarFile.java: is now implementing Closeable 2013-04-26 Jiri Vanek Fixed regressed unittest and "cause" * /netx/net/sourceforge/jnlp/NullJnlpFileException.java: fixed header * netx/net/sourceforge/jnlp/SecurityDesc.java: (SecurityDesc) is now throwing NullJnlpFileException in case of null jnlp file. * tests/netx/unit/net/sourceforge/jnlp/ParserBasic.java: is now using correct DummyJnlpFile * tests/netx/unit/net/sourceforge/jnlp/SecurityDescTest.java: new testfile. (testNotNullJnlpFile) (testNullJnlpFile) testing the behavior for null jnlp file and for existing jnlpfile. * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: (DummyJnlpFile) extracted to test-extensions and have removed incorrect have security (testNullFileSecurityDescApplet) and (testNullFileSecurityDesc) is now expecting NullJnlpFileException instead of results * tests/test-extensions/net/sourceforge/jnlp/mock/DummyJNLPFile.java: new reusable dummy jnlp file 2013-04-25 Adam Domurad Add accidentally not included files from "Tests & test extensions for mocking the plugin input & output pipes." 2013-04-25 Adam Domurad Fix a dead-lock that can cause (namely) Firefox to hang. * netx/net/sourceforge/jnlp/NetxPanel.java (appletAlive): Remove flag. (isAlive): Remove getter. (initialized): New, explicit initialization flag. (isInitialized): New, getter. (runLoader): Set initialization flag when done (whether errored or not). * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (waitForAppletInit): Wait on initialization flag from NetxPanel. (handleMessage): Remove redundant waiting for init. Respond properly to GetJavaObject in case of error/time-out. 2013-04-25 Adam Domurad * tests/netx/unit/net/sourceforge/jnlp/AsyncCallTest.java: Unit tests for AsyncCall test extension. 2013-04-25 Adam Domurad Tests & test extensions for mocking the plugin input & output pipes. * Makefile.am (stamps/test-extensions-compile.stamp): Make plugin classes available to test extensions * tests/test-extensions/net/sourceforge/jnlp/AsyncCall.java: New, helper for doing asynchronous calls with an optional timeout. * tests/netx/unit/sun/applet/PluginAppletViewerTest.java: New, uses PluginPipeMock to test the javascript requests to the plugin. * tests/test-extensions/sun/applet/mock/PluginPipeMock.java: New, helper for getting the plugin requests and mocking the replies. 2013-04-25 Jiri Vanek Locking disabled on windows machines * netx/net/sourceforge/jnlp/util/lockingfile/LockedFile.java: (lock) and (unlock) are no-op on windows. 2013-04-25 Jiri Vanek Splashscreen now strip commit id from released versions * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java: (stripCommitFromVersion) new method responsible for cutting (drawBase) now using stripCommitFromVersion before printing drawing version to splashscreen * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainterTest.java: (stripCommitFromVersion) new test for 2013-04-24 Adam Domurad * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Remove unnecessary line that can result in NPE 2013-04-23 Adam Domurad * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java: Added tests for decodeUrlQuietly, normalizeUrl, normalizeUrlQuietly. 2013-04-23 Adam Domurad * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: Remove no longer used constants. Remove (normalizeUrl). Update calls. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: Expand imports. Update calls. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: Ensure file://-protocol URLs are encoded. * netx/net/sourceforge/jnlp/util/UrlUtils.java: Add (normalizeUrl), and related utility methods. Allow for optionally encoding file:// URLs. 2013-04-23 Adam Domurad Ensure document-base is properly encoded. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (getCacheFile): Use URL#toUri().getPath() instead of URL#getFile(). * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (handleInitializationMessage): Don't decode document-base. 2013-04-23 Adam Domurad Reproducer for URL parameters (eg ?a=b) in document-base. * tests/reproducers/simple/URLParametersInDocumentBase/resources/URLParametersInDocumentBase.html: Page that loads applet. * tests/reproducers/simple/URLParametersInDocumentBase/srcs/URLParametersInDocumentBase.java: Applet that prints code-base & document-base. * tests/reproducers/simple/URLParametersInDocumentBase/testcases/URLParametersInDocumentBaseTests.java: Test-driver. 2013-04-23 Adam Domurad * netx/net/sourceforge/jnlp/NetxPanel.java (exitOnFailure): Remove always-false field. (NetxPanel): Remove overloaded constructor (runLoader): Do not swallow LaunchException's. Remove dead exitOnFailure code-path. Set applet status to APPLET_ERROR on exception. * plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java (createPanel): Update call to NetxPanel constructor. 2013-04-23 Adam Domurad * tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/AppContextHasJNLPClassLoader.html: Test AppContext context classloader from HTML applet * tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/AppContextHasJNLPClassLoader.jnlp: Test AppContext context classloader from JNLP application * tests/reproducers/signed/AppContextHasJNLPClassLoader/resources/AppContextHasJNLPClassLoaderForJNLPApplet.jnlp: Test AppContext context classloader from JNLP applet * tests/reproducers/signed/AppContextHasJNLPClassLoader/srcs/AppContextHasJNLPClassLoader.java: Print out context classloader for thread & AppContext, for current thread & Swing thread. * tests/reproducers/signed/AppContextHasJNLPClassLoader/testcases/AppContextHasJNLPClassLoaderTest.java: Test runner for AppContextHasJNLPClassLoader 2013-04-23 Adam Domurad Ensure JarFile handles do not leak. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Ensure close is called for each JarFile. 2013-04-23 Adam Domurad * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: New, JNLPClassLoader unit tests for (checkForMain), (getMainClassName), (activateNativeJar), and (isInvalidJar). Checks for file descriptor leaks. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (isInvalidJar): Change to default visibility for testing purposes. (checkForMain): Same. (getMainClassName): Same. 2013-04-23 Adam Domurad Rewrite of MethodOverloadResolver with detailed unittests. * plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java: Rewritten to reduce duplicated code, fix very subtle bugs in never-tested codepaths, obey spec properly. Introduced new helper types where Object[] arrays with special-meaning positions were passed around. * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java: Updated to work with newly introduced types / refactored overload resolver. * tests/netx/unit/sun/applet/MethodOverloadResolverTest.java: In-depth unit tests of hairy details of method overloading in JS<->Java. 2013-04-23 Omair Majid PR1299 * NEWS: Update with fix * netx/net/sourceforge/jnlp/browser/BrowserAwareProxySelector.java (initFromBrowserConfig): Fix typo in socks proxy setting key. 2013-04-19 Jiri Vanek testing server allowed from makefile * Makefile.am: (stamps/netx-dist-tests-prepare-reproducers.stamp) added stamps/netx-dist.stamp stamps/plugin.stamp dependence (stamps/test-extensions-compile.stamp) added stamps/netx-dist.stamp stamps/plugin.stamp dependence (stamps/compile-reproducers-testcases.stamp) added stamps/plugin.stamp dependence (run-test-server-on-44321) new target, starts server in deploy dir, on port 44321 (run-test-server-on-random-port) new target, starts server in deploy dir, on random port * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: (main) added better access to random port 2013-04-17 Jiri Vanek Added various self-describing tests for codebase * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-reader1-writer1.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-reader1-writer2.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-reader1.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-reader2.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-writer1.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet-writer2.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-reader1-writer1.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-reader1-writer2.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-reader1.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-reader2.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-writer1.html * tests/reproducers/simple/AppletSharedClassLoader/resources/LaunchSharedClassLoaderApplet2-writer2.html * tests/reproducers/simple/AppletSharedClassLoader/srcs/SharedClassLoaderApplet1.java * tests/reproducers/simple/AppletSharedClassLoader/srcs/SharedClassLoaderApplet2.java * tests/reproducers/simple/AppletSharedClassLoader/srcs/SharedSecret.java * tests/reproducers/simple/AppletSharedClassLoader/testcases/SharedClassLoaderApplet_WrittenCompleteCodeBaseTest.java * tests/reproducers/simple/AppletSharedClassLoader/testcases/SharedClassLoaderApplet_WrittenPartialStubCodeBaseTest.java * tests/reproducers/simple/AppletSharedClassLoader/testcases/SharedClassLoaderApplet_dotCodeBaseTest.java 2013-04-17 Adam Domurad Jiri Vanek CVE-2013-1926, RH916774: Class-loader incorrectly shared for applets with same relative-path. * netx/net/sourceforge/jnlp/PluginParameters.java (getCodeBase): Removed (getUniqueKey): Now takes absolute codebase * netx/net/sourceforge/jnlp/NetxPanel.java: Pass absolute codebase in getUniqueKey calls. * netx/net/sourceforge/jnlp/PluginBridge.java: Same. 2013-04-17 Jiri Vanek Fixed gifar vulnereability with automated testcase * netx/net/sourceforge/jnlp/util/JarFile.java: IcedTea-Web replacement for java.util.jar.JarFile.java with capability to verify if the jar starts as jar and not as something else (eg gif) * netx/net/sourceforge/jnlp/Launcher.java: migrated to new JarFile * netx/net/sourceforge/jnlp/resources/Messages.properties: added BXignoreheaders key with description to new -Xignoreheaders switch * netx/net/sourceforge/jnlp/runtime/Boot.java: added switch Xignoreheaders to allow to disable the header verification. * netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java: migrated to new JarFile * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: improved reporting of new JarFile exceptions * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: new field ignoreHeaders, informing about new JarFile whether to verify or not verify headers. By default verifying, so have value of false. * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: migrated to new JarFile * netx/net/sourceforge/jnlp/util/InvalidJarHeaderException.java: new not-checked exception to signify that jar is corrupted on headers level. * tests/reproducers/custom/GifarCreator/srcs/Makefile: makefile to join gif and jar to create gifar * tests/reproducers/signed/GifarBase/resources/gifarView_hacked.html: html with hacked gifar * tests/reproducers/signed/GifarBase/resources/gifarView_ok.html: html with valid gifs and jars * tests/reproducers/signed/GifarBase/resources/gifar_applet.jnlp: jnlp applet constructed from hacked gifar * tests/reproducers/signed/GifarBase/resources/gifar_application.jnlp: jnlp application constructed from hacked gifar * tests/reproducers/signed/GifarBase/srcs/GifarMain.java: Main method of reproducer * tests/reproducers/signed/GifarBase/testcases/GifarTestcases.java: Testing methods * tests/reproducers/signed/GifarBase/resources/happyNonAnimated.gif: binary file, image, gif, used to create hacked gifars 2013-04-17 Jiri Vanek removed java call to obtain jvm args for plugin * /plugin/icedteanp/IcedTeaNPPlugin.cc: (get_jvm_args) Java call replaced by call to recently added read_deploy_property_value function. 2013-04-12 Adam Domurad * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExtendedAppletSecurityHelp.java: Clean-up generated code. 2013-04-12 Adam Domurad Present more information in unsigned applet confirmation. * netx/net/sourceforge/jnlp/resources/Messages.properties (SRememberCodebase): Add codebase parameter. (SUnsignedDetail): Change layout, add documentbase parameter. * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java (setupInfoPanel): Pass documentbase to SUnsignedDetail. (createCheckBoxPanel): Ensure left-alignment. (createButtonPanel): Less spacing above button. 2013-04-12 Jiri Vanek Added help for extended applets security and settings * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel: (helpButtonActionPerformed) added code to open dialogue with help * netx/net/sourceforge/jnlp/resources/Messages.propertie: Included html help message * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java: added help button and logic to open help dialogue * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExtendedAppletSecurityHelp.java: Simple dialogue with JEditorPane with html help from properties and few navigation buttons * NEWS: mentioned extended appelts security 2013-04-12 Jiri Vanek Added dialogue to allow setting of custom JRE * launcher/itweb-settings.in: and * launcher/javaws.in: check for custom jre less strict * netx/net/sourceforge/jnlp/config/Defaults.java:made aware of deployment.jre.dir constant * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: added\ KEY_JRE_DIR= "deployment.jre.dir" constant, user file occurrences extracted to USER_DEPLOYMENT_PROPERTIES_FILE. * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: used validation of jdk when saving properties * netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java: added text-field to set JVM directory, friendly with logic and validation. * netx/net/sourceforge/jnlp/resources/Messages.properties: added messages to JVM selection and validation. * netx/net/sourceforge/jnlp/util/StreamUtils.java: (readStreamAsString) new utility method. * NEWS: mentioned select-able JVM 2013-04-11 Adam Domurad Remove legacy support for the old version of NPAPI. * plugin/icedteanp/IcedTeaNPPlugin.cc: Remove if directives for old version of NPAPI. * plugin/icedteanp/IcedTeaNPPlugin.h: Same * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: Same * plugin/icedteanp/IcedTeaPluginRequestProcessor.h: Same * plugin/icedteanp/IcedTeaPluginUtils.cc: Same * plugin/icedteanp/IcedTeaPluginUtils.h: Same * plugin/icedteanp/IcedTeaRunnable.h: Same * plugin/icedteanp/IcedTeaScriptablePluginObject.h: Same 2013-04-11 Adam Domurad Allow remembering applet confirmation for whole codebase. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added SRememberAppletOnly, SRememberCodebase messages * netx/net/sourceforge/jnlp/security/SecurityDialogs.java (showUnsignedWarningDialog): Use UnsignedWarningAction * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningDialog.java (UnsignedAppletTrustWarningDialog): Use UnsignedWarningAction * net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java: Introduce UnsignedWarningAction, add additional confirmation choices * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: Support remembering action for entire codebase. 2013-04-10 Jana Fabrikova * /tests/reproducers/simple/JSToJFuncResol/testcases/JSToJFuncResolTest.java: adding 11 testcases based on the interactive Liveconnect JS->Java overloaded function resolution tests, tests with JSObject were already included * /tests/reproducers/simple/JSToJFuncResol/srcs/JSToJFuncResol.java: the applet whose methods are invoked from JS during the tests * /tests/reproducers/simple/JSToJFuncResol/resources/JSToJava_FuncResol.js: the JavaScript code for calling the applet methods from JS * /tests/reproducers/simple/JSToJFuncResol/resources/jstoj-funcresol.jnlp: java network launch protocol file for displaying applet in the html page * /tests/reproducers/simple/JSToJFuncResol/resources/JSToJFuncResol.html: the html page with java applet embedded, displayed in browser during the tests 2013-04-10 Jana Fabrikova * /tests/reproducers/simple/JToJSFuncReturn/testcases/JToJSFuncReturnTest.java: adding 5 testcases based on the interactive Liveconnect JS->Java function return type tests * /tests/reproducers/simple/JToJSFuncReturn/srcs/JToJSFuncReturn.java: the applet that calls JS functions * tests/reproducers/simple/JToJSFuncReturn/resources/JToJS_FuncReturn.js: auxiliary JavaScript code * /tests/reproducers/simple/JToJSFuncReturn/resources/jtojs-funcreturn.jnlp: jnlp file for displaying applet in the html page * /tests/reproducers/simple/JToJSFuncReturn/resources/JToJSFuncReturn.html: the html page where the applet calling JS functions is embedded 2013-04-08 Jiri Vanek * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Epiphany.java: Removed good --sm-client-disable switch. No longer supported by epiphany 2013-04-04 Jiri Vanek Plugin is now honoring the custom jre * launcher/itweb-settings.in : * launcher/javaws.in: In case that custom jre do not exists, complains, and use default rather * plugin/icedteanp/IcedTeaNPPlugin.cc: (get_plugin_executable) and (get_plugin_rt_jar) now tries to return custom values before returning the default one. 2013-04-03 Jana Fabrikova * /test/reproducers/simple/JavascriptFuncParam/testcases/JavascriptFuncParamTest.java: added annotation KnownToFail in googleChrome and chromiumBrowser to the method (AppletJToJSFuncParam_JSObject_Test) * /test/reproducers/simple/JavascriptGet/testcases/JavascriptGetTest.java: added annotation KnownToFail in midori, epiphany, googleChrome and chromiumBrowser to the methods (AppletJToJSGet_1DArray_Test) and (AppletJToJSGet_2DArray_Test) 2013-04-03 Jana Fabrikova * /tests/test-extensions/net/sourceforge/jnlp/annotations/KnownToFailInBrowsers.java: the implementation of new annotation, which has an array of browsers of type Browsers[] named failsIn * /tests/junit-runner/JunitLikeXmlOutputListener.java: in method (testDone) the testcases that are known to fail in current browser are detected in addition to the tests that are k2f in all browsers * /tests/junit-runner/LessVerboseTextListener.java: added method (getK2FinB) reading the annotation, in method (printK2F) the testcases that are known to fail in current browser are detected in addition to the tests that are k2f in all browsers 2013-03-28 Adam Domurad * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java (normalizeUrlAndStripParams): Moved. * netx/net/sourceforge/jnlp/util/UrlUtils.java (normalizeUrlAndStripParams): New, moved from UnsignedAppletTrustConfirmation. * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmationTest.java (testNormalizeUrlAndStripParams): Moved. * tests/netx/unit/net/sourceforge/jnlp/util/UrlUtilsTest.java: New, has (testNormalizeUrlAndStripParams) from UnsignedAppletTrustConfirmationTest. 2013-03-22 Jiri Vanek Added code to parse properties and to find correct configuration files from c++ part of plugin * Makefile.am: IcedTeaParseProperties.cc added to be compiled with rest of plugin * plugin/icedteanp/IcedTeaParseProperties.cc: new file, contains implementation for searching for config files and to read value from them * plugin/icedteanp/IcedTeaParseProperties.h: public api for "library" * plugin/icedteanp/IcedTeaPluginUtils.cc: * plugin/icedteanp/IcedTeaPluginUtils.h: added new methods (trim) and (file_exists) * tests/cpp-unit-tests/IcedTeaParsePropertiesTest.cc: tests for library methods * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc: added tests for new methods 2013-03-28 Adam Domurad Don't interrupt worker/consumer threads (can prevent shutdown code from executing); instead use Object wait/notify methods. * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java (notifyHasWork): Replacement for thread interruption (waitForWork): Replacement for thread sleeping (run): Use waitForWork instead of Thread.sleep (notifyWorkerIsFree): Removed -- misleading method. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (message): Make volatile, as it should have always been. (notifyHasWork): Replacement for thread interruption (waitForWork): Replacement for thread sleeping (run): Use waitForWork instead of Thread.sleep (getPermissions): avoid potential NPE if code source location is missing (free): Remove reference to notifyWorkerIsFree. 2013-03-26 Adam Domurad Integration of unsigned applet confirmation dialogue. * netx/net/sourceforge/jnlp/PluginBridge.java (getArchiveJars): New, returns archive jars as list * netx/net/sourceforge/jnlp/resources/Messages.properties: Confirmation messages added to properties file * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getInstance): Initialization refactored into createInstance (createInstance): New, checks if unsigned applet is allowed, initializes classloader. (initializeResources): Don't consider no-jar applets signed. * netx/net/sourceforge/jnlp/security/SecurityDialogs.java (showUnsignedWarningDialog): Creates message with DialogType.UNSIGNED_WARNING * netx/net/sourceforge/jnlp/security/SecurityDialog.java (installPanel): Add case for DialogType.UNSIGNED_WARNING * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionStorage.java: Expose locking members from interface * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (handleInitializationMessage): Do nothing if applets have been disabled. * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningDialog.java: New, security dialog that asks for unsigned applet confirmation. * netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java: Implements the dialog contents for unsigned applet confirmation. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java: Updates and checks applet confirmation storage, creates warning dialog if required. * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmationTest.java: New, tests relative & normalized path creation helpers. 2013-03-26 Jiri Vanek Path validator fixed to be correctly multiplatform * netx/net/sourceforge/jnlp/config/BasicValueValidators.java : (FilePathValidator) now check absolute file by File.isAbsolute() instead of by plain "/". * tests/netx/unit/net/sourceforge/jnlp/config/BasicValueValidatorsTests.java : New file to test new functionality. 2013-03-25 Jana Fabrikova * tests/reproducers/simple/JavascriptFuncReturn/testcases/JavascriptFuncReturnTest.java adding 5 testcases for testing calling javascript functions with various return types from java * tests/reproducers/simple/JavascriptFuncReturn/resources/JavascriptFuncReturn.html the html page for displaying browser tests * tests/reproducers/simple/JavascriptFuncReturn/resources/Javascript_FuncReturn.js auxiliary javascript functions * tests/reproducers/simple/JavascriptFuncReturn/resources/javascript-funcreturn.jnlp jnlp file for embedding applet in the html page * tests/reproducers/simple/JavascriptFuncReturn/srcs/JavascriptFuncReturn.java the applet that calls javascript functions 2013-03-25 Jana Fabrikova * tests/reproducers/simple/JavascriptSet/testcases/JavascriptSetTest.java adding 21 testcases for testing setting javascript variables from java * tests/reproducers/simple/JavascriptSet/resources/JavascriptSet.html the html page for displaying browser tests * tests/reproducers/simple/JavascriptSet/resources/Javascript_Set.js auxiliary javascript functions * tests/reproducers/simple/JavascriptSet/resources/javascript-set.jnlp jnlp file for embedding applet in the html page * tests/reproducers/simple/JavascriptSet/srcs/JavascriptSet.java the applet that sets javascript variables 2013-03-25 Jana Fabrikova * tests/reproducers/simple/JavascriptGet/testcases/JavascriptGetTest.java adding 7 new testcases for reading JS values from Java * tests/reproducers/simple/JavascriptGet/resources/JavascriptGet.html the html page for displaying browser tests * tests/reproducers/simple/JavascriptGet/resources/Javascript_Get.js auxiliary javascript functions * tests/reproducers/simple/JavascriptGet/resources/javascript-get.jnlp jnlp file for embedding the applet in the html page * tests/reproducers/simple/JavascriptGet/srcs/JavascriptGet.java the applet that reads values from javascript 2013-03-25 Jana Fabrikova * tests/reproducers/simple/JavascriptFuncParam/testcases/JavascriptFuncParamTest.java adding 19 testcases for calling javascript functions from java with parameters of various types * tests/reproducers/simple/JavascriptFuncParam/resources/JavascriptFuncParam.html the html page for displaying browser tests * tests/reproducers/simple/JavascriptFuncParam/resources/javascript-funcparam.jnlp jnlp file for embedding the applet in html page * tests/reproducers/simple/JavascriptFuncParam/srcs/JavascriptFuncParam.java the applet that calls functions from javascript 2013-03-22 Adam Domurad * plugin/icedteanp/java/sun/applet/PluginParameterParser.java (isInt): Revert behaviour to catching NumberFormatException 2013-03-22 Adam Domurad * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (findClass): Print stacktrace for ClassFormatError 2013-03-22 Jiri Vanek * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: (isMatching) is now ignring archives if empty. * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImplTest.java: tests adapted and enriched for new archives processing. 2013-03-21 Jiri Vanek Launchers made aware of custom set JRE * launcher/itweb-settings.in: * launcher/javaws.in: are now scanning ~/.icedtea/deployment.properties and /etc/.java/.deploy/deployment.properties for deployment.jre.dir property. If found, then its java and rt.jar are used to launch applications. 2013-03-20 Jana Fabrikova * tests/reproducers/simple/JSToJGet/testcases/JSToJGetTest.java: adding few lines for not running test in Opera * tests/reproducers/simple/JSToJSet/testcases/JSToJSetTest.java: adding few lines for not running test in Opera * tests/reproducers/simple/JSToJFuncParam/testcases/JSToJFuncParamTest.java: adding few lines for not running test in Opera * tests/reproducers/simple/JSToJTypeConv/testcases/JSToJTypeConvTest.java: adding few lines for not running test in Opera 2013-03-20 Jiri Vanek All occurences of hardcoded paths to java repalced by call of functions * plugin/icedteanp/IcedTeaNPPlugin.cc: (appletviewer_executable) renamed to (appletviewer_default_executable). (appletviewer_default_rtjar) new variable to keep default rt.jar path. (get_plugin_executable) and (string get_plugin_rt_jar) new functions, returniong the default variables for now. 2013-03-19 Adam Domurad * Makefile.am (CPP_UNITTEST_EXECUTABLE): Add -lrt & -lpthread flags, which do not seem to be brought in on all systems. 2013-03-13 Jiri Vanek * NEWS: mentioned de translation * AUTHORS: added Jacob Wisor 2013-03-13 Jiri Vanek Jacob Wisor Fixed strange sentences in default locales bundle. * netx/net/sourceforge/jnlp/resources/Messages.properties: 2013-03-13 Jiri Vanek Added tests for German i18n * tests/reproducers/simple/LocalesTest/testcases/LocalesTestTest.java: Enhanced to test also German localization . * tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java: Enhanced to handle de messages and be prepared for locales with one language but different nations. 2013-03-13 Jiri Vanek Jacob Wisor Added initial German localization * netx/net/sourceforge/jnlp/resources/Messages_de.properties: New file with German properties 2013-03-05 Adam Domurad * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (closeStream): Remove. (verifySignedJNLP): Make use of StreamUtils instead. * netx/net/sourceforge/jnlp/utils/StreamUtils.java (closeSilently): New method. 2013-02-28 Jiri Vanek * netx/net/sourceforge/jnlp/config/SecurityValueValidator.java: modifed null check - no considered as correct value as being valid value in runtime. 2013-02-27 Jiri Vanek Added backend and settings for extended applet security * netx/net/sourceforge/jnlp/config/Defaults.java: deployment.security.level added to defaults with its validator * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: Added deployment.security.level (KEY_SECURITY_LEVEL)key and .appletTrustSettings (APPLET_TRUST_SETTINGS)filename with getters * netx/net/sourceforge/jnlp/config/SecurityValueValidator.java: Simple validator for value of deployment.security.level based on parsing in AppletSecurityLevel.fromString * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: Incorporated UnsignedAppletsTrustingListPanel panel * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java: Backend for main tables in UnsignedAppletsTrustingListPanel * netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java: GUI for manipulate the deployment.security.level values and content of .appletTrustSettings files * netx/net/sourceforge/jnlp/resources/Messages.properties: Added keys and values for new; user visible, strings * netx/net/sourceforge/jnlp/security/appletextendedsecurity/AppletSecurityLevel.java: Object representation of deployment.security.level value * netx/net/sourceforge/jnlp/security/appletextendedsecurity/AppletStartupSecuritySettings.java: Entrance singleton for current deployment.security.level policy and records. * netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteUnsignedApplet.java: Object representation of action upon record in .appletTrustSettings * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java: Object representation of one item in .appletTrustSettings .appletTrustSettings by itw (except settings part) * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionStorage.java Minimal set of functionality requested for accessing the * netx/net/sourceforge/jnlp/security/appletextendedsecurity/UrlRegEx.java Simple class which should help to distinguish between plain String and String keeping UrlRegex * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java: Extended implementation of UnsignedAppletActionStorageImpl which have additional "for settings" functionality * netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java: Object representation of.appletTrustSettings file. It Should be multi-thread/app safe and should be always actual. Based on LockingReaderWriter. * netx/net/sourceforge/jnlp/util/lockingfile/LockedFile.java: Utility class with functionality to lock file in muti-app/thread environment * netx/net/sourceforge/jnlp/util/lockingfile/LockingReaderWriter.java: Utility class with functionality to lock file during reading/writing in muti-app/thread environment * netx/net/sourceforge/jnlp/util/lockingfile/StorageIoException.java: Wrapper for common, but rare IOException extending RuntimeExceptionaround for LockingReaderWriter to avoid numerous declarations. * tests/netx/unit/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImplTest.java: Tests of main methods in UnsignedAppletActionStorageImplTest focused on matching * tests/netx/unit/net/sourceforge/jnlp/util/lockingfile/LockingReaderWriterTest.java: Tests of multithread read/write to LockingReaderWriter 2013-02-25 Adam Domurad * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (createInstance): Extract initialization logic from 'getInstance' into new 'createInstace' method. (getInstance): Call newly introduced createInstance method. 2013-02-25 Jiri Vanek Removed unused legacy-launcher sources * launcher/java.c: * launcher/java.h: * launcher/java_md.c: * launcher/java_md.h: * launcher/jli_util.c: * launcher/jli_util.h: * launcher/jni.h: * launcher/jni_md.h: * launcher/jvm.h: * launcher/jvm_md.h: * launcher/manifest_info.h: * launcher/parse_manifest.c: * launcher/splashscreen.h: * launcher/splashscreen_stubs.c: * launcher/version_comp.c: * launcher/version_comp.h: * launcher/wildcard.c: * launcher/wildcard.h: Happily removed 2013-02-21 Adam Domurad * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getPermissions): avoid potential NPE if code source location is missing 2013-02-14 Adam Domurad PR835: javaws leaks connections Uses HEAD requests if possible for testing URLs. Adds name to download threads. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (startThread): Add name to download thread (getResourceUrlResponseCode): Get or fake an HTTP response code. (findBestUrl): Use getResourceUrlResponseCode to first try a HEAD request. Fall-back to GET rquest. * netx/net/sourceforge/jnlp/utils/StreamUtils.java: New file, contains utility for consuming input stream. 2013-02-14 Adam Domurad * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: Support HEAD requests. 2013-02-13 Adam Domurad Fix PR580: http://www.horaoficial.cl/ loads improperly. Applets that must share a class-loader now load sequentially. * NEWS: Mention the fix. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getUniqueKeyLock): New, atomically grabs or creates a lock for the unique key. (getInstance): Ensure classloader initialization is locked by unique key. (decrementLoaderUseCount): Ensure classloader deinitialization is locked by unique key, get rid of no-longer used locks. 2013-02-13 Jiri Vanek Added test for hanging firefox by LaunchException and Improved AddShutdownHookTest * tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook.html: new file to launch applet with RuntimeException as result. * tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook_wrong.html: new file to launch applet with LaunchException as result. * tests/reproducers/simple/AddShutdownHook/srcs/AddShutdownHook.java: is now also applet. * tests/reproducers/simple/AddShutdownHook/testcases/AddShutdownHookTest.java: Added test (AddShutdownHookApplet)for applet, removed duplicate code by rules. * tests/reproducers/simple/AddShutdownHook/testcases/HangFirefoxTests.java: New test set which is launching exception throwing applet, and after exception is thrown then it tries jsut stdou-ing applet. Second applet have to be launched. 2013-02-12 Jana Fabrikova * /tests/reproducers/simple/JSToJFuncParam/testcases/JSToJFuncParamTest.java: adding 19 testcases - 18 based on the interactive Liveconnect JS->Java function parameter tests, 1 additional testcase for passing parameters of type JSObject (from JS to Java) * /tests/reproducers/simple/JSToJFuncParam/srcs/JSToJFuncParam.java: the applet whose methods are invoked from JS during the tests * /tests/reproducers/simple/JSToJFuncParam/resources/JSToJava_FuncParam.js: the JavaScript code for calling the applet methods from JS * /tests/reproducers/simple/JSToJFuncParam/resources/jstoj-funcparam.jnlp: JNLP file for displaying applet in the HTML page * /tests/reproducers/simple/JSToJFuncParam/resources/JSToJFuncParam.html: the html page with java applet embedded, displayed in browser during the tests 2013-02-12 Jana Fabrikova * /tests/reproducers/simple/JSToJTypeConv/testcases/JSToJTypeConvTest.java: adding 50 testcases based on the interactive Liveconnect JS->Java type conversion tests and 4 testcases for setting java boolean and Boolean variables to nonempty strings * /tests/reproducers/simple/JSToJTypeConv/srcs/JSToJTypeConv.java: the applet whose variables are set from JS during the tests * /tests/reproducers/simple/JSToJTypeConv/resources/JSToJava_TypeConv.js: the JavaScript code for setting the applet variables from JS * /tests/reproducers/simple/JSToJTypeConv/resources/jstoj-typeconv.jnlp: JNLP file for displaying applet in the html page * /tests/reproducers/simple/JSToJTypeConv/resources/JSToJTypeConv.html: the html page with java applet embedded, displayed in browser during the tests 2013-02-07 Adam Domurad Ensure applet destruction cannot in the middle of initialization. * netx/net/sourceforge/jnlp/NetxPanel.java (destroyApplet): wait for applet initialization missing 2013-02-06 Jana Fabrikova * /tests/reproducers/simple/JSToJSet/testcases/JSToJSetTest.java: adding 1 testcase setting applets variable of type JSObject from JS, adding KnownToFail anotation and @Bug annotation with id=PR1298 to (AppletJSToJSet_intArrayElement_Test) and (AppletJSToJSet_DoubleArrayElement_Test) methods * /tests/reproducers/simple/JSToJSet/resources/JSToJava_Set.js: adding the JSObject case to (doSetTests) function * /tests/reproducers/simple/JSToJSet/srcs/JSToJSet.java: adding the JSObject variable to the applet and modifying (printNewValueAndFinish) method in order to output new values of JSObject variable 2013-02-06 Jana Fabrikova * /tests/reproducers/simple/JSToJGet/resources/JSToJGet.html: adding 1 testcase reading applets variable of type JSObject from JS * /tests/reproducers/simple/JSToJGet/testcases/JSToJGetTest.java: adding 1 testcase reading applets variable of type JSObject from JS, small changes to evaluation of the applet's stdout methods, removing KnownToFail anotation from (AppletJSToJGet_DoubleFullArray_Test) method * /tests/reproducers/simple/JSToJGet/resources/JSToJ_auxiliary.js: removing parts of comment that are no longer true * /tests/reproducers/simple/JSToJGet/resources/JSToJava_Get.js: adding (test_get_JSObject) function also to the JS part of test * /tests/reproducers/simple/JSToJGet/srcs/JSToJGet.java: adding the JSObject variable to the applet 2013-02-06 Adam Domurad Name threads for easier debugging/tooling. Remove 2 erroneous VoidPluginCallRequest header comments. * netx/net/sourceforge/jnlp/NetxPanel.java: Provide name for thread that calls (run). * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Provide name for shutdown hook thread. * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java: Remove erroneous VoidPluginCallRequest comment. Provide name for ConsumerThread thread. * plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java: Provide name for worker thread. * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java: Remove erroneous VoidPluginCallRequest comment. Provide name for stream listener thread. 2013-02-03 Jiri Vanek Another renamed conflict file for case insensitive systems * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1E_x_2s.html Renamed to ParallelAppletsTest_1_x_2EE.html * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1EE_x_2s.html new file. * tests/reproducers/simple/CountingApplet1/testcases/ParallelAppletsTest.java: (testParallelAppletsTest1Ex2s) adapted to renaming 2013-01-31 Jiri Vanek Renamed conflict file for case insensitive systems * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2E.html: Renamed to ParallelAppletsTest_1_x_2EE.html * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2EE.html: new file. * tests/reproducers/simple/CountingApplet1/testcases/ParallelAppletsTest.java: (testParallelAppletsTest1x2E) adapted to renaming 2013-01-30 Jiri Vanek Add unit tests for locales and locales fixed * netx/net/sourceforge/jnlp/resources/Messages.properties: * netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties: Added missing, filled empty and removed dangling items * tests/netx/unit/net/sourceforge/jnlp/resources/MessagesPropertiesTest.java: New unittest for missing, empty, duplicate or dangling locales. 2013-01-30 Adam Domurad Fix for PR1292: Javaws does not resolve versioned jar names with periods correctly * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java (getUrl): Fix versioning of jar names that have periods, eg 'foo.bar.jar'. Make method static for testing. * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java: New, test version & pack URL encoding. * tests/reproducers/simple/VersionedJar__V1/resources/VersionedJarDisabled.jnlp: New, tries to use versioned jar with versioning not turned on. * tests/reproducers/simple/VersionedJar__V1/resources/VersionedJarEnabled.jnlp: New, tries to use versioned jar with versioning turned on. * tests/reproducers/simple/VersionedJar__V1/srcs/VersionedJar.java: New, prints simple message. * tests/reproducers/simple/VersionedJar__V1/testcases/VersionedJarTest.java: New, tests if VersionedJar has ran only with versioning turned on. 2013-01-30 Jiri Vanek * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java: Iteration over launchExceptionChain done by pointer/get instead by iterator to prevent ConcurrentModificationException. 2013-01-30 Jiri Vanek Splashscreen error report made more detailed by stored LaunchErrors * netx/net/sourceforge/jnlp/LaunchException.java: (LaunchExceptionWithStamp) new inner class for storing timestamp togetehr with error. (launchExceptionChain) new static list to capture LaunchErrors during runtime. * /netx/net/sourceforge/jnlp/resources/Messages.properties: * netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties: Added explanation string * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java: Is now displaying launchExceptionChain in its error report and is copying it to clipboard. * tests/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialogTest.java: (getTextTest) adapted calls of getText for new Date. 2013-01-28 Adam Domurad Fix PR1157: Applets can hang browser after fatal exception * NEWS: Add entry for PR1157 * netx/net/sourceforge/jnlp/NetxPanel.java (runLoader): Move dispatchAppletEvent into a 'finally' block. 2013-01-16 Deepak Bhole PR1260: IcedTea-Web should not rely on GTK * Makefile.am: Remove GTK includes and links * acinclude.m4: Remove check for GTK libs * plugin/icedteanp/IcedTeaJavaRequestProcessor.h: Removed gtk.h include and added unistd include (for usleep) which gtk.h brought in before * plugin/icedteanp/IcedTeaNPPlugin.cc: Remove GTK dialog shown when java is not found * plugin/icedteanp/IcedTeaNPPlugin.h: Removed gtk.h include 2013-01-16 Jiri Vanek Fixed set of paths to asm * configure.ac: (IT_FIND_OPTIONAL_JAR([asm], ASM,) path enhanced by objectweb-asm4/asm-all.jar. 2013-01-15 Adam Domurad Unit test for PluginAppletSecurityContext#toObjectIDString. Make PluginAppletSecurityContext more unit-testable. * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java: Don't initialize security manager in constructor. Fix a few Java->JS corner cases. * plugin/icedteanp/java/sun/applet/PluginMain.java: Create testing-only constructor for bypassing initialization of SecurityManager. * tests/netx/unit/sun/applet/PluginAppletSecurityContextTest.java: Unit test for all the corner cases of converting a Java object to a string that can be precisely identified. 2013-01-15 Adam Domurad Fix PR1198: JSObject passed incorrectly to Javascript * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc: Pass extra data for 'jsobject' object result messages. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: Same. * plugin/icedteanp/IcedTeaPluginUtils.cc: Add special casing of javascript references passed from java. * plugin/icedteanp/java/netscape/javascript/JSObjectUnboxPermission.java: New permission for unboxing a JSObject's internal reference. * plugin/icedteanp/java/netscape/javascript/JSObject.java (getInternalReference): New, package-private, retrieves internal reference (Must have proper permission). * plugin/icedteanp/java/netscape/javascript/JSUtil.java (getJSObjectInternalReference) New, utility for accessing JSObject#getInternalReference from outside the package. * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java: (toObjectIDString): New, creates a string that precisely identifies a Java object. (handleMessage): Replace a lot of duplicated functionality with 'toObjectIDString'. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Replace duplicated functionality with 'toObjectIDString'. * tests/reproducers/simple/JSObjectFromEval/srcs/JSObjectFromEval.java: Don't print out type passed (differs from browser to browser). * tests/reproducers/simple/JSObjectFromEval/testcases/JSObjectFromEvalTest.java: Don't check type passed (differs from browser to browser). Remove known-to-fail. Reformat. 2013-01-10 Jiri Vanek Download indicator made compact for more then one jar * NEWS: mentioned this feature * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java: (DownloadPanel) inner class were rewritten to support collapsed/detailed for more then one jar in queue. (frame) window is recreated each time state is changed (preventing errors on some X configurations) and is positioned to lower left corner of active screen. * netx/net/sourceforge/jnlp/resources/hideDownloadDetails.png * adding netx/net/sourceforge/jnlp/resources/showDownloadDetails.pn h Icons for "to collapsed state" and "to detailed state" 2013-01-10 Jiri Vanek All IcedTea-Web dialogues are centered to middle of active screen * NEWS: mentioned this feature * netx/net/sourceforge/jnlp/JNLPSplashScreen.java: * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java: * netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java: * netx/net/sourceforge/jnlp/security/SecurityDialog.java: * netx/net/sourceforge/jnlp/security/viewer/CertificateViewer.java: * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java: Dialogues in above classes made centering to active screen * netx/net/sourceforge/jnlp/util/ScreenFinder.java: New file, utility class which can find active monitor and center dialogue into it. 2013-01-09 Jiri Vanek First part of fix of recreating desktop icon * NEWS: mentioned PR725 * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: (addMenuAndDesktopEntries)added check for already existing icon * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: Added methods for digging the already existing icon from system (getShortcutTmpFile) tmpfile fo generating the desktop icon (getDesktopIconName) for getting filename from application title (findFreedesktopOrgDesktopPathCatch) public method to find final desktop file (findFreedesktopOrgDesktopPath) to get into ~/.config/user-dirs.dirs (getFreedesktopOrgDesktopPathFrom) to find XDG_DESKTOP_DIR value (filterQuotes) to handle simple quotations (evaluateLinuxVariables) to handle possible variables in XDG_DESKTOP_DIR value * tests/netx/unit/net/sourceforge/jnlp/util/XDesktopEntryTest.java: New tests focused on parsing of desktop location from stream (variables and quotations) 2013-01-09 Jiri Vanek Logging methods made synchronized * tests/test-extensions/net/sourceforge/jnlp/LoggingBottleneck.java: (processLogs) (getDefaultLoggingBottleneck) (writeXmlLog) (addToXmlLog) (modifyMethodWithForBrowser) (setLoggedBrowser) (logIntoPlaintextLog) made synchronised 2013-01-07 Deepak Bhole * netx/net/sourceforge/jnlp/resources/Messages.properties: Converted to Unix format. 2013-01-04 Adam Domurad * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java: Code-formatting fixes and cosmetic changes. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Same. * tests/reproducers/simple/JSObjectFromEval/srcs/JSObjectFromEval.java: Same. * tests/reproducers/simple/JSObjectFromEval/testcases/JSObjectFromEvalTest.java: Same. 2013-01-03 Adam Domurad Fix breakage in unit test CodeBaseClassLoaderTest.testParentClassLoaderIsAskedForClassesApplication * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (CodeBaseClassLoader#findClassNonRecursive): New, call into URLClassLoader#findClass (CodeBaseClassLoader#findClass): Delegate JNLPClassLoader#findClass (JNLPClassLoader#findClass): Call CodeBaseClassLoader#findClassNonRecursive * tests/reproducers/custom/AppletExtendsFromOutsideJar/srcs/AppletReferenceOutOfJar.java (init): Add applet finish message. * tests/reproducers/custom/AppletExtendsFromOutsideJar/testcases/AppletExtendsFromOutsideJarTests.java (testClassInAppletFolder): Close quickly on applet finish message. 2013-01-02 Jiri Vanek Fixed unittest for InformationElement. * tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/InformationElementTest.java: (createFromJNLP) now asserts NotNull instead of IsNull as result of "Minor fix for possible NPE (non fatal) during splashscreen creation" 2012-12-21 Adam Domurad * plugin/icedteanp/IcedTeaNPPlugin.cc: Remove need for 'goto' in (NP_Initialize). Check TMPDIR environment variable for possible data directory. Expose some previously static variables/functions for unit testing purposes. Reduce need for explicit allocations for strings 'data_directory' and 'appletviewer_executable'. * tests/cpp-unit-tests/IcedTeaNPPluginTest.cc: Add some basic tests for functions in IcedTeaNPPlugin.cc. 2012-12-21 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java (shouldCreateShortcut) added handling of xtrustall during asking for desktop icon creation 2012-12-21 Jiri Vanek Minor fix for possible NPE (non fatal) during splashscreen creation * netx/net/sourceforge/jnlp/resources/Messages.properties: * netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties: Added messages for user (SPLASHdefaultHomepage) (SPLASHerrorInInformation)(SPLASHmissingInformation). * netx/net/sourceforge/jnlp/splashscreen/parts/InformationElement.java (createFromJNLP) catch of NPE replaced by conditions with proper messages. 2012-12-21 Jiri Vanek Forgotten condition for AviationWeather first run: * tests/reproducers/custom/remote/testcases/RemoteApplicationSettings.java: (AviationWeather) added condition for first run when creation of FileManager is written to stderr. 2012-12-20 Saad Mohammad * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: Added test and changes to work better with PR909 fix. 2012-12-20 Saad Mohammad Fix PR909 - URL is invalid after normalization. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (normalizeUrl): Converts the URL to an URI object which handles all percent encodings. 2012-12-20 Adam Domurad * plugin/icedteanp/IcedTeaScriptablePluginObject.cc (IcedTeaScriptableJavaObject::deAllocate): Fix memory leak (IcedTeaScriptableJavaPackageObject::deAllocate): Fix memory leak 2012-12-20 Adam Domurad * tests/cpp-unit-tests/browser_mock.cc (mock_retainobject): New, mocks behaviour of NPAPI retainobject (mock_releaseobject): New, mocks behaviour of NPAPI releaseobject * tests/cpp-unit-tests/main.cc: Add warning of memory leak based on operator-new. * tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc: New, tests for memory leak in (IcedTeaScriptableJavaObject::deAllocate) and (IcedTeaScriptableJavaPackageObject::deAllocate) * tests/cpp-unit-tests/checked_allocations.h: Defines set that does not use operator-new, to prevent recursion in overloaded operator-new * tests/cpp-unit-tests/checked_allocations.cc: Operator new overload that has allocation-set for querying live allocations. 2012-12-20 Jiri Vanek Added and applied Remote annotation, added Remote tests: * tests/report-styles/jreport.xsl: and * tests/junit-runner/JunitLikeXmlOutputListener: and * tests/junit-runner/LessVerboseTextListener.java: added handling of Remote annotation * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: Tests downloading from classpath.org marked. * tests/reproducers/custom/remote/testcases/RemoteApplicationSettings.java: new file, handling url and evaluations of remote reproducers * tests/reproducers/custom/remote/testcases/RemoteApplicationTests.java: launcher for remote tests. * tests/test-extensions/net/sourceforge/jnlp/annotations/Remote.java: Implementation of Remote annotation 2012-12-18 Jiri Vanek Cleaned unit-tests: * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: (DummyJNLPFile) class extracted from its anonymous members to private named member. Get rid of repeated methods (testResourceLoad*Caching) and replace it by (testResourceCaching) with parameter of full name and boolean keeping its expected existence and branching null assert on it. Added tests (testClassResourceLoadSuccessCachingApplication) and (testClassResourceLoadSuccessCachingApplet). (testResourceCaching) made less vulnerable by found classes and more precise. All resources paths fixed and clarified (to be found or not) 2012-12-18 Jana Fabrikova * /tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: Added several new versions of method (executeBrowser) with lists of ContentReaderListeners as arguments. * /tests/test-extensions/net/sourceforge/jnlp/ProcessWrapper.java: Added new versions of the (constructor of ProcessWrapper) and methods (addStdOutListeners) and (addStdErrListeners) for adding ContentReaderListeners using List instead of one ContentReaderListener as argument. Added a new version of (constructor of ProcessWrapper) with less arguments that is used instead of calling the constructor with several arguments passed as null, thus causing ambiguity. * /tests/reproducers/simple/SingeInstanceServiceTest/testcases/SingleInstanceTest.java: Modified the call of (executeBrowser) method with null arguments into a call of new method without the null arguments -getting rid of an ambiguous call. 2012-12-11 Jiri Vanek Added jacoco code coverage support * Makefile.am: (JACOCO_*) bunch of new variables encapsulating jacoco files. (PLUGIN_COVERAGE_BOOTCLASSPATH) classpath to be used in plugin instead of normal one in coverage mode. (COVERABLE_PLUGIN_DIR) for compiling plugin with agent on. (jacoco-operator-source-files.txt) for storing files of reporting tool. All XSLTPROC command were done as non-fatal (stamps/compile-jacoco-operator.stamp) for compiling report operator. (stamps/run-unit-test-code-coverage-jacoco.stam) for cover unittests Set of (COVERABLE_PLUGIN_*) targets to compile plugin with agent on. (stamps/build-fake-plugin.stamp) top level target for fake plugin. (stamps/run-reproducers-test-code-coverage-jacoco.stamp) target for cover reproducers. (run-test-code-coverage-jacoco) for merged coverage (clean-unit-test-code-coverage-jacoco) and (clean-reproducers-test-code-coverage-jacoco) and (clean-test-code-coverage-jacoco) and (clean-test-code-coverage-tools-jacoco) cleaning targets. (run-reproducers-test-code-coverage-jacoco) and (run-unit-test-code-coverage-jacoco) as top level aliases. * configure.ac: added check for jacoco library and asm library * plugin/icedteanp/IcedTeaNPPlugin.cc removed duplicate code (plugin_start_appletviewe) removed duplicated code and added handling of java agent if defined. * tests/jacoco-operator/org/jacoco/operator/Main.java : New class, comamndline tool for merging results and for generating reports. * tests/jacoco-operator/org/jacoco/operator/MergeTask.java: New class. Utility class responsible for merging exec results to one exec file. * tests/jacoco-operator/org/jacoco/operator/ReportGenerator: New class. Utility method for gathering sources and builds and outputing xml and html reports. 2012-12-11 Adam Domurad * plugin/icedteanp/java/sun/applet/PluginParameterParser.java: Remove left-in System.out 2012-12-10 Saad Mohammad Add unit tests for PR1189. * tests/netx/unit/net/sourceforge/jnlp/PluginParametersTest.java: (testConstructorWithNoCodeAndObjectParam): Initialize PluginParameters without code/object parameters. (testConstructorWithOnlyJnlpHrefParam): Initialize PluginParameters with jnlp_href but no code/object parameters. 2012-12-10 Saad Mohammad Add reproducer for PR1189. * tests/reproducers/simple/AppletTagWithMissingCodeAttribute/resources/AppletTagWithMissingCodeAttribute.html: Simple webpage which contains an applet tag with no code attribute. * tests/reproducers/simple/AppletTagWithMissingCodeAttribute/resources/AppletTagWithMissingCodeAttribute.jnlp: Jnlp file that is used by the webpages using jnlp_href. * tests/reproducers/simple/AppletTagWithMissingCodeAttribute/testcases/AppletTagWithMissingCodeAttribute.java: Testcase that tests applets without code attribute in html pages. * tests/reproducers/simple/SimpleApplet/srcs/SimpleApplet.java: Simple applet class that outputs a string. 2012-12-10 Saad Mohammad Fix PR1189: Icedtea-plugin requires code attribute when using jnlp_href. * netx/net/sourceforge/jnlp/PluginParameters.java (PluginParameters): Updated if condition to prevent PluginParameterException from being thrown if applet tag contains jnlp_href but is missing code/object parameters. 2012-12-06 Adam Domurad * Makefile.am: Fix targets stamps/netx-unit-tests-compile.stamp and stamps/run-netx-unit-tests.stamp to not rely on installed directory. 2012-12-05 Saad Mohammad Added new option in itw-settings which allows users to set JVM arguments when plugin is initialized. * netx/net/sourceforge/jnlp/config/Defaults.java (getDefaults): Added defaults for DeploymentConfiguration.KEY_PLUGIN_JVM_ARGUMENTS. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: Added new property (KEY_PLUGIN_JVM_ARGUMENTS) which stores the value of JVM plugin arguments. * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: (createMainSettingsPanel): Added JVM settings to the list of tabs. (createJVMSettingsPanel): Returns a new JVMPanel object. * netx/net/sourceforge/jnlp/controlpanel/JVMPanel.java: JVM settings panel. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added a new items (CPJVMPluginArguments, CPHeadJVMSettings, CPTabJVMSettings). * plugin/icedteanp/IcedTeaNPPlugin.cc: (plugin_start_appletviewer): Adds JVM arguments to the commands line list. (get_jvm_args): Returns JVM arguments set in itw-settings. * plugin/icedteanp/IcedTeaPluginUtils.cc: (IcedTeaPluginUtilities::vectorStringToVectorGchar): New helper method which returns a vector of gchar* from the vector of strings passed. * plugin/icedteanp/IcedTeaPluginUtils.h: Declaration of IcedTeaPluginUtilities::vectorStringToVectorGchar. 2012-12-05 Pavel Tisnovsky * Makefile.am: Avoid warning message printed in clean target if softkiller is not compiled. 2012-12-04 Adam Domurad * netx/net/sourceforge/jnlp/resources/Messages.properties: "An serious exception have occured" -> "A serious exception occurred" 2012-12-04 Adam Domurad PluginAppletViewer refactoring. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (handleInitializationMessage): New, extracts initialization logic from PluginAppletViewer.handleMessage. * plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java: Moved into own file. 2012-12-04 Adam Domurad Remove the applet/embed/object tag parser from ITW. Send the applet parameters directly from the C++. * Makefile.am: Allow unit-testing for classes in plugin.jar. * netx/net/sourceforge/jnlp/NetxPanel.java: Use PluginParameters for attribute lookup * netx/net/sourceforge/jnlp/PluginBridge.java: Use PluginParameters for attribute lookup * netx/net/sourceforge/jnlp/resources/Messages.properties: Add message for missing code/object attributes. * netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties: Same. * plugin/icedteanp/IcedTeaNPPlugin.cc: Send escaped parameter name/values instead of applet tag. Remove some dead code. * plugin/icedteanp/IcedTeaNPPlugin.h: Rename applet_tag -> parameters_string. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Extract parsing code into its own class. * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc: Use CHECK_EQUALS instead of CHECK. * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: Update unit tests due to constructor changes. * netx/net/sourceforge/jnlp/PluginParameterException.java: New, thrown when code/object attributes are missing. * netx/net/sourceforge/jnlp/PluginParameters.java: New, Hashtable wrapper that handles plugin attribute/parameter lookups. * plugin/icedteanp/java/sun/applet/PluginParameterParser.java: New, creates PluginParameters from escaped name/values. * tests/cpp-unit-tests/PluginParametersTest.cc: New, C++ Unit tests for plugin parameter related functions * tests/netx/unit/net/sourceforge/jnlp/PluginParametersTest.java: New, unit tests for PluginParameters class. * tests/netx/unit/sun/applet/PluginParameterParserTest.java: New, unit tests for PluginParameterParser class. 2012-11-03 Jiri Vanek Fixed logging bottleneck * tests/test-extensions/net/sourceforge/jnlp/LoggingBottleneck.java: added and used function (clearChars) which filter characters going to xml from invalid ones. * tests/test-extensions/net/sourceforge/jnlp/ServerAccess: getting test method id by (getTestMethod) now relay on physical way to the class as the only real thing differing test class and framework class. 2012-12-03 Pavel Tisnovsky * Makefile.am: Added new target for compiling softkiller. * tests/softkiller/softkiller.c: Added browser softkiller. * tests/softkiller/Makefile: Added makefile used to build and clean browser softkiller. * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java: Uncommented code used to close windows. 2012-11-30 Adam Domurad Breaks up IcedTeaPluginUtilities::javaResultToNPVariant into multiple, more manageable parts. * plugin/icedteanp/IcedTeaPluginUtils.cc: Make three helper functions for the different cases. Two new helper functions for converting from std::string to NPString and NPVariant. * plugin/icedteanp/IcedTeaPluginUtils.h: Two new helper functions. * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc: Tests for the new NPString and NPVariant from std::string functions. 2012-11-30 Adam Domurad Added a simple mechanism for mocking functions in the browser function table. Can be expanded as needed. * tests/cpp-unit-tests/main.cc: Call setup function, warn on browser function based memory leak. * tests/cpp-unit-tests/browser_mock.cc: New, implements simple error-checking mocks of browser callbacks. * tests/cpp-unit-tests/browser_mock.h: New, interface to mocking functions. 2012-11-27 Jiri Vanek Better error reporting from applets * netx/net/sourceforge/jnlp/NetxPanel.java: (init) ErrorSplash is shown if fatal exception is cough * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (replaceSpalsh) is rather removing all then just its previous version * tests/reproducers/simple/AppletTest/srcs/AppletErrorTest.java: * tests/reproducers/simple/AppletTest/resources/errorAppletAutoTests.html Testcase for manual testing of various exceptions from applet 2012-11-27 Jiri Vanek * AUTHORS: added Jan Kmetko as current SplashScreen artwork author 2012-11-27 Jiri Vanek Fixed epiphany switch * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Epiphany.java: -new-tab fixed to --new-tab 2012-11-23 Jiri Vanek Firefox session-backup and stubs for softkiller, multiple listeners, processes handling moved to separate class. * tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java: Removed unwanted assert on termination * tests/test-extensions/net/sourceforge/jnlp/ContentReader.java: Added support for multiple listeners. * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java: (destroyProcess()), non static wrapper around former (destroyProcess (process)), introducing marks that process is being killed, added setter for reactigProcess. * tests/test-extensions/net/sourceforge/jnlp/ProcessWrapper.java: Wrapper around former ServerAccess.executeProcess set of methods. * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: all executeProcess/Javaws/Browser are now just api compatibility methods around ProcessWrapper. (executeProcess) main method moved to ProcessWrapper.execute. * tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java: made public and synchronized with ProcessAssasin's (destroyProcess) * tests/test-extensions/net/sourceforge/jnlp/browsertesting/Browser.java is now implementing ReactingProcess * tests/test-extensions/net/sourceforge/jnlp/browsertesting/ReactingProcess.java: new interface for communication with main events of ThreadedProcess lifecycle. * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java: is containing singleton of FirefoxProfilesOperator (FPO) and is responding to (beforeProcess) by FPO's (backupingProfiles), to (beforeKill) by calling ProcessAssasin's (closeWindows), and to (afterKill) by FPO's (restoreProfiles) * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/firefox/FirefoxProfilesOperator.java: New class to backup and restore firefox profiles. 2012-11-21 Adam Domurad * Makefile.am: Fix new clean targets not cleaning properly 2012-11-21 Adam Domurad Support for C++ unit testing with UnitTest++ for IcedTeaWeb. * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc: New, contains tests for utility functions. * tests/cpp-unit-tests/main.cc: New, contains unit test runner. * plugin/icedteanp/IcedTeaPluginUtils.h: Remove incorrect circular include dependency * plugin/icedteanp/IcedTeaRunnable.h: Add includes necessary for self-sustaining header. * Makefile.am: Add targets for unit test compilation and running, eg 'make run-cpp-unit-tests'. 2012-11-21 Adam Domurad Add the source code to UnitTest++ into the project. * tests/UnitTest++/COPYING: Part of UnitTest++ * tests/UnitTest++/Makefile: Part of UnitTest++ * tests/UnitTest++/README: Part of UnitTest++ * tests/UnitTest++/src/AssertException.cpp: Part of UnitTest++ * tests/UnitTest++/src/AssertException.h: Part of UnitTest++ * tests/UnitTest++/src/CheckMacros.h: Part of UnitTest++ * tests/UnitTest++/src/Checks.cpp: Part of UnitTest++ * tests/UnitTest++/src/Checks.h: Part of UnitTest++ * tests/UnitTest++/src/Config.h: Part of UnitTest++ * tests/UnitTest++/src/CurrentTest.cpp: Part of UnitTest++ * tests/UnitTest++/src/CurrentTest.h: Part of UnitTest++ * tests/UnitTest++/src/DeferredTestReporter.cpp: Part of UnitTest++ * tests/UnitTest++/src/DeferredTestReporter.h: Part of UnitTest++ * tests/UnitTest++/src/DeferredTestResult.cpp: Part of UnitTest++ * tests/UnitTest++/src/DeferredTestResult.h: Part of UnitTest++ * tests/UnitTest++/src/ExecuteTest.h: Part of UnitTest++ * tests/UnitTest++/src/MemoryOutStream.cpp: Part of UnitTest++ * tests/UnitTest++/src/MemoryOutStream.h: Part of UnitTest++ * tests/UnitTest++/src/Posix/SignalTranslator.cpp: Part of UnitTest++ * tests/UnitTest++/src/Posix/SignalTranslator.h: Part of UnitTest++ * tests/UnitTest++/src/Posix/TimeHelpers.cpp: Part of UnitTest++ * tests/UnitTest++/src/Posix/TimeHelpers.h: Part of UnitTest++ * tests/UnitTest++/src/ReportAssert.cpp: Part of UnitTest++ * tests/UnitTest++/src/ReportAssert.h: Part of UnitTest++ * tests/UnitTest++/src/Test.cpp: Part of UnitTest++ * tests/UnitTest++/src/Test.h: Part of UnitTest++ * tests/UnitTest++/src/TestDetails.cpp: Part of UnitTest++ * tests/UnitTest++/src/TestDetails.h: Part of UnitTest++ * tests/UnitTest++/src/TestList.cpp: Part of UnitTest++ * tests/UnitTest++/src/TestList.h: Part of UnitTest++ * tests/UnitTest++/src/TestMacros.h: Part of UnitTest++ * tests/UnitTest++/src/TestReporter.cpp: Part of UnitTest++ * tests/UnitTest++/src/TestReporter.h: Part of UnitTest++ * tests/UnitTest++/src/TestReporterStdout.cpp: Part of UnitTest++ * tests/UnitTest++/src/TestReporterStdout.h: Part of UnitTest++ * tests/UnitTest++/src/TestResults.cpp: Part of UnitTest++ * tests/UnitTest++/src/TestResults.h: Part of UnitTest++ * tests/UnitTest++/src/TestRunner.cpp: Part of UnitTest++ * tests/UnitTest++/src/TestRunner.h: Part of UnitTest++ * tests/UnitTest++/src/TestSuite.h: Part of UnitTest++ * tests/UnitTest++/src/TimeConstraint.cpp: Part of UnitTest++ * tests/UnitTest++/src/TimeConstraint.h: Part of UnitTest++ * tests/UnitTest++/src/TimeHelpers.h: Part of UnitTest++ * tests/UnitTest++/src/UnitTest++.h: Part of UnitTest++ * tests/UnitTest++/src/XmlTestReporter.cpp: Part of UnitTest++ * tests/UnitTest++/src/XmlTestReporter.h: Part of UnitTest++ 2012-11-21 Adam Domurad * plugin/icedteanp/IcedTeaNPPlugin.cc (consume_plugin_message): Free two buffers returned from NPN_GetValueForURL function. 2012-11-20 Jiri Vanek * Makefile.am: (stamps/run-netx-dist-tests.stamp) and (stamps/run-netx-unit-tests.stamp) Swapped logs and report xslt operations 2012-11-20 Jana Fabrikova * tests/reproducers/simple/JSToJGet/testcases/JSToJGetTest.java: added @KnownToFail annotations to the tests, which are showing unimplemented/broken features of js-plugin communication. 2012-11-13 Adam Domurad Reproducer for PR1198, JSObject#eval creates invalid JS object. * tests/reproducers/simple/JSObjectFromEval/resources/JSObjectFromEval.html: Loads applet + JS for test * tests/reproducers/simple/JSObjectFromEval/resources/JSObjectFromEval.js: Calls java code to test JSObject#eval * tests/reproducers/simple/JSObjectFromEval/srcs/JSObjectFromEval.java: Provides java<->JS wrappers for JSObject methods * tests/reproducers/simple/JSObjectFromEval/testcases/JSObjectFromEvalTest.java: Tests if JSObject#eval creates valid JSObject. 2012-11-13 Saad Mohammad Fix PR1166: Embedded JNLP File is not supported in applet tag. * configure.ac: Checks for sun.misc.BASE64Decoder. * NEWS: Added entry for PR1166. * netx/net/sourceforge/jnlp/JNLPFile.java (JNLPFile): New constructor which accepts inputstream of jnlp file and a specified codebase. * netx/net/sourceforge/jnlp/Parser.java (Parser): If parsing of codebase fails, it will overwrite the codebase with the one passed in through parameters. * netx/net/sourceforge/jnlp/PluginBridge.java: (PluginBridge) Supports embedded jnlp file. (decodeBase64String) Decodes Base64 strings to byte array. 2012-11-13 Saad Mohammad Added unit tests for PR1166. * tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java: Tests the JNLPFile constructor that accepts an InputStream and an alternative codebase. * tests/netx/unit/net/sourceforge/jnlp/ParserTest.java: Tests if the constructor handles the alternative codebase parameter correctly. * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: Tests if BASE64 strings are decoded correctly and if PluginBridge is constructed with an embedded jnlp. 2012-11-13 Saad Mohammad Added reproducer for PR1166. * tests/reproducers/simple/EmbeddedJnlpInApplet/resources/EmbeddedJnlp.jnlp: Launching jnlp file that is used by jnlp_href in applet tag * tests/reproducers/simple/EmbeddedJnlpInApplet/resources/EmbeddedJnlpInAppletNoCodebase.html: Applet with an embedded jnlp file with no codebase specified * tests/reproducers/simple/EmbeddedJnlpInApplet/resources/EmbeddedJnlpInAppletWithDotCodebase.html: Applet with an embedded jnlp file with codebase set as a 'dot' * tests/reproducers/simple/EmbeddedJnlpInApplet/resources/JnlpInApplet.html: Applet with jnlp_href file. * tests/reproducers/simple/EmbeddedJnlpInApplet/srcs/EmbeddedJnlp.java: Simple class that outputs strings. * tests/reproducers/simple/EmbeddedJnlpInApplet/testcases/EmbeddedJnlpInAppletTest.java: Testcase that tests embedded jnlps in html pages. 2012-11-08 Saad Mohammad * NEWS: Added entry for PR1027 - DownloadService is not supported by IcedTea-Web. 2012-11-08 Saad Mohammad Added reproducer for DownloadService. * tests/reproducers/signed/DownloadService/resources/DownloadService.jnlp: Launching jnlp file that contains extension jnlp and jars marked with part names. * tests/reproducers/signed/DownloadService/resources/DownloadServiceExtension.jnlp: DownloadService extension jnlp file with jars marked with part names. * tests/reproducers/signed/DownloadService/srcs/DownloadServiceRunner.java: A simple class that uses DownloadService to complete tasks and outputs the results. * tests/reproducers/signed/DownloadService/testcases/DownloadServiceTest.java: Testcase for DownloadService. 2012-11-08 Saad Mohammad Core implementation of DownloadService. * netx/net/sourceforge/jnlp/cache/CacheUtil.java (getCacheParentDirectory): Returns the parent directory of the cached resource. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (getLoaders): Returns all loaders that this loader uses, including itself (addNewJar): Adds a new jar to the classloader with specified UpdatePolicy. (removeJars): Remove jars from the filesystem. (initializeNewJarDownload): Downloads and initializes jars into the current loader. (manageExternalJars): Manages jars which are not mentioned in the JNLP file. * netx/net/sourceforge/jnlp/runtime/LocateJnlpClassLoader.java: (getLoaderByJnlpFile): Returns the classloader of the jnlp file specified. (getLoaderByResourceUrl): Returns the classloader that contains the specified jar. * netx/net/sourceforge/jnlp/runtime/ManageJnlpResources.java: (findJars): Returns jars from the JNLP file with the specified partname. (removeCachedJars): Removes jar from cache. (downloadJars): Downloads jars identified by part name. (loadExternalResouceToCache): Download and initalize resources which are not mentioned in the jnlp file. (removeExternalCachedResource): Removes resources from cache which are not mentioned in the jnlp file. (isExternalResourceCached): Determines if the resource that is not mentioned in the jnlp file is cached and returns a boolean with the result. * netx/net/sourceforge/jnlp/services/XDownloadService.java: Core implementation of DownloadService. 2012-11-02 Jiri Vanek Alexandr Kolouch Added cz_CS locales with test * AUTHORS: added translator, mr. Kolouch * NEWS: mentioned localization * netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties: file itself with translation * tests/reproducers/simple/LocalesTest/testcases/LocalesTestTest.java: Test which is testing whether and how locales are applied. 2012-11-02 Jiri Vanek Splashscreen integrated to javaws and plugin * Makefile.am: (edit_launcher_script) added JAVAWS_SPLASH_LOCATION substitution for installed javaws_splash.png. (install-exec-loca) added installation of javaws_splash.png. * NEWS: mentioned splashscreen * launcher/javaws.in: added SPLASH_LOCATION, as path to image with "java" splash which s then shown until internal vector one appear. * netx/net/sourceforge/jnlp/GuiLaunchHandler.java: splashScreen made volatile, (launchInitialized) splashscreen is created and shown * netx/net/sourceforge/jnlp/JNLPSplashScreen.java: (setSplashImageURL) splash bg image is loaded from given url or default is used if not found or not specified by jnlp/applet. (correctSize) width is calculated from bg image or default is used when no image set. Splash is centered to primary monitor. * netx/net/sourceforge/jnlp/Launcher.java: (launchApplet) and (launchApplication) enriched by handling of splashs. (launchError) overloaded and is now handling forwarding of errors to splash. All relevant calls of launchError enriched by appletInstance. * netx/net/sourceforge/jnlp/NetxPanel.java: is now implementing SplashController.This is done by setting and wrapping of splashController variable. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: is now handling splashscreen for applets in browsers. (framePanel) is now providing panel to be processed (PluginAppletViewer) is now invoking SplashCreator. (replaceSplash) new method which replace splashscreen with error splashscreen. (removeSplash) new method to remove splash when loading is done. (update) is added to call paint directly (SplashCreator) new internal runnable to create splash * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2.html: second jar made XslowX to track two FIXME introduced in this patch - Launcher's createApplet and PluginAppletViewer's framePanel. * netx/javaws_splash.png: Binary image to be shown before java is launched * tests/reproducers/simple/simpletest1/resources/netxPlugin.png: Binary image to ne used for testing custom splashscreens 2012-10-31 Jana Fabrikova * tests/reproducers/simple/JSToJGet/testcases/JSToJGetTest.java: Modifying the testcase output to a simpler text. * tests/reproducers/simple/JSToJSet/testcases/JSToJSetTest.java: Modifying the testcase output to a simpler text. 2012-10-29 Omair Majid * tests/reproducers/signed/DeploymentPropertiesAreExposed/resources/DeploymentPropertiesAreExposed.jnlp, * tests/reproducers/signed/DeploymentPropertiesAreExposed/srcs/Test.java, * tests/reproducers/signed/DeploymentPropertiesAreExposed/testcases/DeploymentPropertiesAreExposedTest.java: New files. 2012-10-29 Omair Majid PR1186 * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: (load(boolean)): Delegate to load(File,File,boolean). (load(File,File,boolean)): New method. (copyTo): New method. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (initialize): Copy configuration to system properties. * tests/netx/unit/net/sourceforge/jnlp/config/DeploymentConfigurationTest.java: New File. 2012-10-29 Jana Fabrikova * tests/reproducers/simple/JSToJSet Added reproducer for testing LiveConnect - setting Java members from JavaScript side 2012-10-26 Jiri Vanek Added clipboard reproducers (PR708) * tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy1.jnlp: Jnlp to invoke manual copying to clipboard on signed app, please note the delayed death of application * tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedCopy2.jnlp: Jnlp to invoke jtextfield like copying signed app, please note the delayed death of application * tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste1.jnlp: Jnlp to invoke manual pasting on signed application * tests/reproducers/signed/ClipboardContentSigned/resources/ClipboardContentSignedPaste2.jnlp: Jnlp to invoke jtextfield like pasting on signed application * tests/reproducers/signed/ClipboardContentSigned/srcs/ClipboardContentSigned.java: Application which is trying to access clipboard by various ways. * tests/reproducers/signed/ClipboardContentSigned/testcases/ClipboardContentSignedTests.java: Automated tests for four above jnlps. * tests/reproducers/simple/ClipboardContent/resources/ClipboardContentCopy1.jnlp: Jnlp to invoke manual copying to clipboard on unsigned app, please note the delayed death of application * tests/reproducers/simple/ClipboardContent/resources/ClipboardContentCopy2.jnlp: Jnlp to invoke jtextfield like copying unsigned app, please note the delayed death of application * tests/reproducers/simple/ClipboardContent/resources/ClipboardContentPaste1.jnlp: Jnlp to invoke manual pasting on unsigned application * tests/reproducers/simple/ClipboardContent/resources/ClipboardContentPaste2.jnlp: Jnlp to invoke jtextfield like pasting on unsigned application * tests/reproducers/simple/ClipboardContent/srcs/ClipboardContent.java: Application which is trying to access clipboard by various ways. * tests/reproducers/simple/ClipboardContent/testcases/ClipboardContentTests.java: Automated tests for first and third of above four jnlps. The tests of second and fourth is disabled due to necessary manual interaction * tests/test-extensions/net/sourceforge/jnlp/tools/WaitingForStringProcess.java: Utility class for process waiting for some string for another string * tests/test-extensions/net/sourceforge/jnlp/tools/ClipboardHelpers.java Utility class for copying/pasting text to/from clipboard * tests/test-extensions/net/sourceforge/jnlp/tools/AsyncJavaws.java Utility class for launching javaws in separate thread. 2012-10-23 Jiri Vanek KnownToFail texts are now bold in html report * tests/report-styles/jreport.xsl: all text outputs of test="@known-to-fail=true" conditions are marked with . 2012-10-19 Adam Domurad * tests/reproducers/custom/AdditionalJarsInMetaInfIndexList/testcases/AdditionalJarsInMetaInfIndexListTests.java (SignedMetaInfIndexListTest): Add @KnownToFail annotation 2012-10-19 Jiri Vanek Renamed reproducers-related variables and targets * Makefile.am: NETX_TEST_DIR - new parent directory variable for tests NETX_UNIT_TEST_DIR - is now using this variable JNLP_TESTS_ENGINE_SRCDIR -> TEST_EXTENSIONS_SRCDIR JNLP_TESTS_ENGINE_TESTS_SRCDIR -> TEST_EXTENSIONS_TESTS_SRCDIR JNLP_TESTS_SRCDIR -> REPRODUCERS_TESTS_SRCDIR JNLP_TESTS_ENGINE_DIR -> TEST_EXTENSIONS_DIR JNLP_TESTS_ENGINE_TESTS_DIR -> TEST_EXTENSIONS_TESTS_DIR new variable TEST_EXTENSIONS_COMPATIBILITY_SYMLINK still pointing to $(TESTS_DIR)/netx/jnlp_testsengine $(TESTS_DIR)/jnlp_testsengine now points to $(TESTS_DIR)/test-extensions JNLP_TESTS_SERVER_DEPLOYDIR -> REPRODUCERS_TESTS_SERVER_DEPLOYDIR JNLP_TESTS_DIR -> REPRODUCERS_BUILD_DIR netx-dist-tests-source-files.txt -> test-extensions-source-files.txt stamps/netx-dist-tests-compile.stamp -> stamps/test-extensions-compile.stamp stamps/netx-dist-tests-tests-compile.stamp -> stamps/test-extensions-tests-compile.stamp stamps/netx-dist-tests-compile-testcases.stamp -> stamps/compile-reproducers-testcases.stamp stamps/netx-dist-tests-copy-resources.stamp -> stamps/copy-reproducers-resources.stamp * tests/reproducers/custom/AdditionalJarsInMetaInfIndexList/srcs/Makefile: and * tests/reproducers/custom/AppletExtendsFromOutsideJar/srcs/Makefile: and * tests/reproducers/custom/AppletFolderInArchiveTag/srcs/Makefile: and * tests/reproducers/custom/UnsignedContentInMETAINF/srcs/Makefile: following above renaming 2012-10-19 Adam Domurad Revised multiple signatures test to check for new message. Added more accurate reproducer for PR822. * tests/reproducers/signed2/MultipleSignaturesTest/srcs/somecrazytestpackage/MultipleSignaturesTest.java: Made class take a classname parameter so different out-of-package classes could be executed. * tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest.html: Added main-class parameter. * tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest1.jnlp: Same. * tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest1_requesting.jnlp: Same. * tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest2.jnlp: Same. * tests/reproducers/signed2/MultipleSignaturesTest/testcases/MultipleSignaturesTestTests.java (multipleSignaturesTestHtmlAppletUsesPermissions): New, tests if fully signed HTML applets with varied signers can (as they should) execute with full permissions. Reproduces PR822. (multipleSignaturesTestJnlpApplicationRequesting): Check for mismatching signers JNLP failure message. Remove known-to-fail & inaccurate bug annotation. * tests/reproducers/signed2/MultipleSignaturesTestSamePackage/testcases/MultipleSignaturesTestTestsSamePackage.java (multipleSignaturesTestSamePackageJnlpApplicationRequesting): Check for mismatching signers JNLP failure message. Remove known-to-fail & inaccurate bug annotation. 2012-10-19 Adam Domurad Reproduces PR822: Applets fail to load if jars have different signers. Tests for applets & JNLPs with multiple signers per jar. * tests/reproducers/signed/ReadPropertiesSigned/srcs/ReadPropertiesSigned.java: Modified to end with standard applet finish message. * tests/reproducers/simple/ReadProperties/srcs/ReadProperties.java: * tests/reproducers/custom/MultipleSignaturesPerJar/README: Explains dependence on ReadPropertiesSigned. * tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJarMatching.html: HTML applet test with a common signer. * tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJarMatching.jnlp: JNLP test with a common signer. * tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJarMismatching.html: HTML applet test without a common signer. * tests/reproducers/custom/MultipleSignaturesPerJar/resources/MultipleSignaturesPerJarMismatching.jnlp: JNLP test without a common signer. * tests/reproducers/custom/MultipleSignaturesPerJar/srcs/Makefile: Custom makefile used to sign a jar with multiple signers. * tests/reproducers/custom/MultipleSignaturesPerJar/srcs/somecrazytestpackage/MultipleSignaturesPerJarMain.java: Accesses ReadPropertiesSigned from another package with different signers. * tests/reproducers/custom/MultipleSignaturesPerJar/testcases/MultipleSignaturesPerJarTests.java: Test driver. 2012-10-19 Adam Domurad New message for signer mismatch in JNLP applications. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added message 'The JNLP application is not fully signed by a single cert.' * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Message thrown when JNLP's jcv.allJarsSigned() is true but not jcv.isFullySigned(); 2012-10-19 Adam Domurad Fixes JCV#isTriviallySigned(). Reproducer 'EmptySignedJar' passes again. * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: Remove problematic 'triviallySigned' variable and instead determine whether triviallySigned on the fly. Consider jars with 0 signable entries as SIGNED_OK. * tests/netx/unit/net/sourceforge/jnlp/tools/JarCertVerifierTest.java: Update no-signers unit test. 2012-10-19 Adam Domurad * netx/net/sourceforge/jnlp/security/AppVerifier.java: Use interface types for declared types where applicable. * netx/net/sourceforge/jnlp/security/PluginAppVerifier.java: Same. * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: Same. 2012-10-19 Adam Domurad * netx/net/sourceforge/jnlp/security/AppVerifier.java: Use interface types for declared types where applicable. * netx/net/sourceforge/jnlp/security/PluginAppVerifier.java: Same. * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: Same. 2012-10-19 Danesh Dadachanji Rework JarCertVerifier certificate management to handle multiple certificates and use different algorithms to verify JNLPs and Applets. * netx/net/sourceforge/jnlp/resources/Messages.properties: Removed SHasUnsignedEntry. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Set JCV instance to final but uninitialized. (JNLPClassLoader): Initialized JCV with runtime dependent verifier. (addNewJar), (initializeResources), (verifySignedJNLP): Replaced use of local JarCertVerifier variable with the instance variable. Added calls to isFullySigned wherever signer verification is done. (activateJars): No longer verifies nested jars. These receive the same security permissions as their parent jar, regardless of the nested jar's signing. (checkTrustWithUser): Removed JCV param, reimplemented to wrap around JCV's checkTrustWithUser method. (verifyJars): Removed. * netx/net/sourceforge/jnlp/security/AppVerifier.java: New strategy pattern interface that specifies verification methods required regardless of the runtime. * netx/net/sourceforge/jnlp/security/JNLPAppVerifier.java: * netx/net/sourceforge/jnlp/security/PluginAppVerifier.java: New strategy pattern classes used to determine which algorithms to use depending on the runtime. * netx/net/sourceforge/jnlp/security/CertVerifier.java: Added CertPath param to all the methods. (noSigningIssues): Removed. * netx/net/sourceforge/jnlp/security/CertWarningPane.java: * netx/net/sourceforge/jnlp/security/CertsInfoPane.java: * netx/net/sourceforge/jnlp/security/MoreInfoPane.java: Updated calls to the verifier's methods with the new CertPath param. All are set to null so far. * netx/net/sourceforge/jnlp/security/HttpsCertVerifier.java: Added CertPath param to all the methods. It's mostly ignored though. * netx/net/sourceforge/jnlp/tools/CertInformation.java: New class to represent all the information about a signer with with respect to all of the entries it has signed for the app. * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: Completely reworked to use CertInformation and AppVerifier functionality. (getCertPath), (getCertInformation), (checkTrustWithUser), (getJarSignableEntries), (getTotalJarEntries): New method. (noSigningIssues), (anyJarsSigned): Removed. (verifyResult): Renamed enum to VerifyResult (JarCertVerifier): New constructor used to set AppVerifier instance. (getAlreadyTrustPublisher), (getRootInCacerts): Now uses strategy pattern. (hasSigningIssues), (getDetails), (checkTrustedCerts), (checkCertUsage): Now uses cert info class. (getCerts): Renamed to getCertsList. (isFullySignedByASingleCert): renamed to isFullySigned and to use the strategy pattern. (add): New public method that resets some instance vars and calls verifyJars. (verifyJars): Modifier changed to private, above method should be used. Also skips jars that have been verified before. (verifyJar): Removed actual verification code, only reads jars into the JVM. (verifyJarEntryCerts): New method. Does actual verification of jars. (getPublisher), (getRoot): Use hacky currentlyUsed variable as the signer. * tests/netx/unit/net/sourceforge/jnlp/tools/JarCertVerifierTest.java: Unit test JCV's verifyJarEntryCerts method. * tests/test-extensions/net/sourceforge/jnlp/tools/CodeSignerCreator.java: Unit test helper that creates CodeSigner instances. 2012-10-16 Adam Domurad * tests/reproducers/simple/AppletTakesLastParam/srcs/AppletTakesLastParam.java: Add 'standard' applet closing message. * tests/reproducers/simple/AppletTakesLastParam/testcases/AppletTakesLastParamTests.java: Clean-up code and add automatic applet closing on finish. 2012-10-15 Jana Fabrikova * tests/reproducers/simple/JSToJGet/testcases/JSToJGetTest.java: Modified the testcases - more readable method calls. 2012-10-05 Omair Majid PR1145 * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getAccessControlContextForClassLoading): Do not catch ClassCircularityError. (findLoadedClassAll): Call findLoadedClass without any special permissions. 2012-10-03 Jana Fabrikova * tests/reproducers/simple/JSToJGet: Added a new reproducer for the first LiveConnect test - getting members from Java side. 2012-10-02 Martin Olsson * plugin/icedteanp/IcedTeaNPPlugin.cc: Typo fix. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: Typo fix. 2012-09-26 Jana Fabrikova * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringMatchClosingListener.java: Added forgotten package name. 2012-09-25 Jiri Vanek Added rules listeners * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/CountingClosingListener.java: Base class for closing listeners which is containing complete output in each time. * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/Rule.java: Class with rule definition for RulesFolowingClosingListener * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/RulesFolowingClosingListener.java: ClosingListener consisted from rules which all have to match for close action * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringRule.java: Implementation of rule based on string * tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java: * tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java: Refactored to use Above iisteners. 2012-09-24 Jiri Vanek Added basic closing listener implementation * tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned.html: removed unnecessary XslowX * tests/reproducers/signed/AppletTestSigned/resources/AppletTestSigned2.html: added missing XslowX * tests/reproducers/signed/AppletTestSigned/srcs/AppletTestSigned.java: added standard closing sentence * tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java: used auto*closing listeners * tests/test-extensions/net/sourceforge/jnlp/ClosingListener.java: interface for identifying closing listeners * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java: added possibility to set timeout n the fly * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: (executeBrowser) added shortcut for autoclosing listeners, (setUpClosingListener) method for setting properties of ClosingListener (executeBrowser) add logic to handle ClosingListeners * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoAllClosingListener.java: listener closing on "APPLET FINISHED" string * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoErrorClosingListener.java: listener closing on "xception" match * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/AutoOkClosingListener.java: listener closing on both xception and finished string. * tests/test-extensions/net/sourceforge/jnlp/closinglisteners/StringBasedClosingListener.java: Base forefather for Auto*ClosingListener 2012-09-24 Jiri Vanek Jana Fabrikova Reproducers are now correctly compiled against liveconect(plugin.jar) * Makefile.am: (stamps/netx-dist-tests-prepare-reproducers.stamp) added one more dependency: stamps/liveconnect-dist.stamp added one more directory on cp: $(abs_top_builddir)/liveconnect 2012-09-17 Deepak Bhole PR1161: X509VariableTrustManager does not work correctly with OpenJDK7 * Makefile.am: If building with JDK 6, don't build VariableX509TrustManagerJDK7. * NEWS: Updated. * acinclude.m4: In addition to setting VERSION_DEFS, also set HAVE_JAVA7 if building with JDK7. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Use new getSSLSocketTrustManager() method to get the trust manager. (getSSLSocketTrustManager): New method. Depending on runtime JRE version, returns the appropriate trust manager. * netx/net/sourceforge/jnlp/security/HttpsCertVerifier.java: Removed unused tm variable. * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java: No longer extends com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager. (checkClientTrusted): Renamed to checkTrustClient and removed overloaded implementations. (checkServerTrusted): Renamed to checkTrustServer. Also, modified to accept socket and engine (may be null). Assume that CN is mismatched by default, rather than matched. If explicitly trusted, bypass other checks, including CN mismatch. (checkAllManagers): Modified to accept socket and engine. Modified to work for both JDK6 and JDK7. (getAcceptedIssuers): Make protected (called by others in package). * netx/net/sourceforge/jnlp/security/VariableX509TrustManagerJDK6.java: New class -- X509TrustManager for JDK6. * netx/net/sourceforge/jnlp/security/VariableX509TrustManagerJDK7.java: New class -- X509TrustManager for JDK7. 2012-09-07 Saad Mohammad Added signed jnlp tests for applications with multiple jar resources. * tests/reproducers/signed/MultiJar-NoSignedJnlp/resources/MainJarWithoutSignedJnlp.jnlp: Launching jnlp file that's main jar does not have a signed jnlp file, but other jar resources do. * tests/reproducers/signed/MultiJar-NoSignedJnlp/srcs/SimpleApplication.java: A class that uses reflection to access resources from different jars. * tests/reproducers/signed/MultiJar-SignedJnlpApplication/resources/MainJarWithMatchingSignedJnlpApplication.jnlp: Launching jnlp file that's main jar matches the signed jnlp application file. * tests/reproducers/signed/MultiJar-SignedJnlpApplication/resources/MainJarWithUnmatchingSignedJnlpApplication.jnlp: Launching jnlp file that's main jar does not match the signed jnlp application file. * tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/JNLP-INF/APPLICATION.jnlp: Signed JNLP application file for MultiJar-SignedJnlpApplication. * tests/reproducers/signed/MultiJar-SignedJnlpApplication/srcs/SignedJnlpApplication.java: A class that uses reflection to access resources from different jars. * tests/reproducers/signed/MultiJar-SignedJnlpApplication/testcases/MultiJarSignedJnlpTest.java: Testcase that tests the launch and validation of signed jnlp files for application that have multiple jar resources. * tests/reproducers/signed/MultiJar-SignedJnlpTemplate/resources/MainJarWithMatchingSignedJnlpTemplate.jnlp: Launching jnlp file that's main jar matches the signed jnlp application template file. * tests/reproducers/signed/MultiJar-SignedJnlpTemplate/resources/MainJarWithUnmatchingSignedJnlpTemplate.jnlp: Launching jnlp file that's main jar does not match the signed jnlp application template file. * tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/JNLP-INF/APPLICATION_TEMPLATE.jnlp: Signed JNLP application template file for MultiJar-SignedJnlpTemplate.jar * tests/reproducers/signed/MultiJar-SignedJnlpTemplate/srcs/SignedJnlpTemplate.java: A class that uses reflection to access resources from different jars. 2012-09-07 Jiri Vanek Added strict test * tests/reproducers/simple/simpletest1/testcases/SimpleTest1Test.java: Removed deprecated ServerAccess.ProcessResult (testSimpletest1lunchOk) extracted asserting code (checkLaunched) family of methods to evaluate output of application (createStrictFile) method to prepare file which will pass strict checking (testSimpletest1lunchOkStrictJnlp) new test, ensuring that even strict file can be read without strict option (testSimpletest1lunchNotOkJnlpStrict) new test ensuring that strictly read no-strict file will fail (testSimpletest1lunchOkStrictJnlpStrict) new test ensuring that strictly read strict file will pass 2012-09-06 Jiri Vanek Fixing several typos from previous push * tests/test-extensions/net/sourceforge/jnlp/ServerLauncher.java: (getUrlUponThisInstance) Javadoc, replaced Ctreate with Create. * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: (run) Fixed indentation. * tests/reproducers/simple/ParametrizedJarUrl/testcases/ParametrizedJarUrlTests.java: Refactored createCodeBAse to createCodeBase. 2012-09-05 Jiri Vanek Fixing several errors which were causing incorrect behaviour causing correct reproduction of PR905 * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrlSigned.htm Using different jar for reproducing * tests/reproducers/simple/ParametrizedJarUrl/testcases/ParametrizedJarUrlTests.java Added tests for hardcoded codebase (same and different) enhanced original PR905 reproducers * tests/test-extensions/net/sourceforge/jnlp/LoggingBottleneck.java: added flush for logs * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: cleaned and enhanced getUrl* methods. * tests/test-extensions/net/sourceforge/jnlp/ServerLauncher.java: delegated socket * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: fixed processing of question mark. 2012-09-05 Jiri Vanek * tests/reproducers/signed/CountingAppletSigned/srcs/CountingAppletSigned.java: Signed applet painting to canvas and periodically printing out counted messages * tests/reproducers/signed2/AppletTestSigned2/srcs/AppletTestSigned2: Second simple signed applet for testing two different simple ones parallel * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1E_x_2s.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_1.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2E.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2e.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1_x_2sk.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1e_x_2s.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1k_x_2.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1s_x_2.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1s_x_2s.html: * tests/reproducers/simple/CountingApplet1/resources/ParallelAppletsTest_1s_x_2ss.html: Various combinations of plain, signed, crashing, exception throwing and exiting applets on single web-page * tests/reproducers/simple/CountingApplet1/srcs/CountingApplet1.java: Simple applet painting to canvas and periodically printing out counted messages * tests/reproducers/simple/CountingApplet1/testcases/ParallelAppletsTest.java: testcases launching above html files. * tests/reproducers/simple/CountingApplet2/srcs/CountingApplet2.java: Second simple applet painting to canvas and periodically printing out counted messages * tests/reproducers/simple/simpletest2/srcs/SimpleTest2.java: Enhanced exception throwing reproducer. 2012-09-04 Jiri Vanek Danesh Dadachanji Single instance support for jnlp-href and tests * netx/net/sourceforge/jnlp/services/XSingleInstanceService.java: (initializeSingleInstance) fixed code for catching running instance (checkSingleInstanceRunning) Added handling of parameters. * netx/net/sourceforge/jnlp/Launcher.java: (launchApplication), (launchApplet) Added debug output that instance is already running. (getApplet) added check for services and debug output * netx/net/sourceforge/jnlp/resources/Messages.properties: added (LSingleInstanceExists) entry for exception. tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTest.jnlp * tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTestWS.jnlp: * tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTest_clasical.html: * tests/reproducers/simple/SingleInstanceServiceTest/resources/SingleInstanceTest_jnlpHref.html: Applet and application in jnlp or html launching files. * tests/reproducers/simple/SingleInstanceServiceTest/srcs/SingleInstanceChecker.java SingleInstance implementing applet/application * tests/reproducers/simple/SingleInstanceServiceTest/testcases/SingleInstanceTest.java Testfile for launching for above jnlps/htmls as testcases. 2012-08-27 Adam Domurad Fixes PR920, duplicate loading of classes in certain cases * NEWS: Added entry: Fixes PR920 * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Remove recursive/non-recursive distinction. Add parent JNLPClassLoader to parent chain. 2012-08-27 Adam Domurad Reproduces problem behind PR920, class is in a jar is loaded twice when used by both a class within the jar, and also used by a class outside the jar extending that class. * tests/reproducers/custom/AppletExtendsFromOutsideJar/README: Describes test * tests/reproducers/custom/AppletExtendsFromOutsideJar/resources/AppletExtendsFromOutsideJar.html: Runs applet with main class outside jar * A tests/reproducers/custom/AppletExtendsFromOutsideJar/srcs/AppletReferenceInSameJar.java: References class Referenced inside same jar * tests/reproducers/custom/AppletExtendsFromOutsideJar/srcs/AppletReferenceOutOfJar.java: References class Referenced outside the jar * tests/reproducers/custom/AppletExtendsFromOutsideJar/srcs/Makefile: Packages Reference, AppletReferenceInSameJar into a jar, AppletReferenceOutOfJar outside it * tests/reproducers/custom/AppletExtendsFromOutsideJar/srcs/Referenced.java: Class that is referenced twice, loaded twice in failing behaviour * tests/reproducers/custom/AppletExtendsFromOutsideJar/testcases/AppletExtendsFromOutsideJarTests.java: Drives AppletExtendsFromOutsideJar.html 2012-08-27 Adam Domurad Tests whether a main class can be found in a jar specified in META-INF/INDEX.LIST. This test is done with both signed and unsigned jars. The failure with signed jars encapsulates PR1112. * tests/reproducers/custom/AdditionalJarsInMetaInfIndexList/resources/AdditionalJarsInMetaInfIndexListSigned.jnlp: * tests/reproducers/custom/AdditionalJarsInMetaInfIndexList/resources/AdditionalJarsInMetaInfIndexListUnsigned.jnlp: JNLP files for the signed and unsigned varions of the test * tests/reproducers/custom/AdditionalJarsInMetaInfIndexList/srcs/LoadedViaMetaInfIndexList.java: Main class that is within a jar loaded via * tests/reproducers/custom/AdditionalJarsInMetaInfIndexList/srcs/Makefile: Prepares a jar with INDEX.LIST pointing to another jar that has the main-class. Copies of these jars and made and signed. * tests/reproducers/custom/AdditionalJarsInMetaInfIndexList/testcases/AdditionalJarsInMetaInfIndexListTests.java: Test driver, tests if main-class has run. 2012-08-27 Adam Domurad Tests custom policy definition in such a way that has been known to cause ClassCircularityError's. Reproducer for PR1145. * tests/reproducers/signed/CustomPolicy/resources/CustomPolicy.jnlp: * tests/reproducers/signed/CustomPolicy/srcs/CustomPolicy.java: Sets custom policy and performs a privileged operation with no given privileges. * tests/reproducers/signed/CustomPolicy/testcases/CustomPolicyTests.java: Tests that an access control exception was caught, and that the program exits correctly. 2012-08-27 Deepak Bhole * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getAccessControlContextForClassLoading): Catch ClassCircularityErrors and ignore them (thus denying permission to caller). 2012-08-27 Jiri Vanek Added tests for PR822 - multiple signatures on classpath * Makefile.am: listed signed2 directory * tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest.html: * tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest1.jnlp: * tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest1_requesting.jnlp: * tests/reproducers/signed2/MultipleSignaturesTest/resources/MultipleSignaturesTest2.jnlp: * tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignaturesTest1_SamePackage.jnlp: * tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignaturesTest1_SamePackage_requesting.jnlp: * tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignaturesTest2_SamePackage.jnlp: * tests/reproducers/signed2/MultipleSignaturesTestSamePackage/resources/MultipleSignaturesTest_SamePackage.html: various variations of multiple signtarues jnlp/html, in/out package, same/different/ signature * tests/reproducers/signed2/MultipleSignaturesTestSamePackage/srcs/MultipleSignaturesTestSamePackage.java: simple class just with call to second jar * tests/reproducers/signed2/MultipleSignaturesTest/srcs/somecrazytestpackage/MultipleSignaturesTest.java: simple class just with call to second jar, but in package * tests/reproducers/signed2/MultipleSignaturesTest/testcases/MultipleSignaturesTestTests.java: * tests/reproducers/signed2/MultipleSignaturesTestSamePackage/testcases/MultipleSignaturesTestTestsSamePackage.java various testcases tro above resources * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: "-verbose " fixed to "-verbose" 2012-08-27 Jiri Vanek Fixed long term failing unit-test, fixed NPE from ClassLoader * netx/net/sourceforge/jnlp/NullJnlpFileException.java: new class to distinguish plain NPE from null jnlp file. * netx/net/sourceforge/jnlp/SecurityDesc.java: (getSandBoxPermissions) added throw of NullJnlpFileException in case of null jnlp file. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (findClass) added Override annotation, add catch of NullJnlpFileException and re-throw of CNF exception. * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: (testResourceLoadSuccessCaching) (testResourceLoadFailureCaching) (testParentClassLoaderIsAskedForClasses) - internal JNLPFile's (getSecurity) null in SecurityDesc constructorrepalced by this. (testNullFileSecurityDesc) new test to ensure NPE in null JNLPFile case. 2012-08-22 Jiri Vanek Added tests for PR905 - parameters in jnlp/html application/applet resources * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrl.html: html file to launch applet, requested archive jar have parameter * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrl1.jnlp: jnlp file to launch application, requested archive jar have parameter * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrl2.jnlp: jnlp file to launch application, requested jnlp have parameter * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrlSigned.html: html file to launch signed applet, requested archive jar have parameter * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrlSigned1.jnlp: jnlp file to launch signed application, requested archive jar have parameter * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarUrlSigned2.jnlp: jnlp file to launch signed application, requested jnlp have parameter * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrl2.jnlp * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrl.jnlp * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrlSigned2.jnlp * tests/reproducers/simple/ParametrizedJarUrl/resources/ParametrizedJarAppletUrlSigned.jnlp variations launching applets from jnlp * tests/reproducers/simple/ParametrizedJarUrl/testcases/ParametrizedJarUrlTests.java: testaceses of above ParametrizedJarUrl/jnlps+htmls namely - (parametrizedAppletTestSignedTest) , (testParametrizedJarUrl2), (testParametrizedJarUrlSigned2): passing calls /partially/ with parameter. Those test are passing. (parametrizedAppletTestSignedFirefoxTest) call with parameter upon signed applet in browser, failing and so is representing PR905 2012-08-21 Jiri Vanek * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java: (sigInt), (sigKill), (sigTerm) new methods for various killing of processes by kill. (kill) new method, launching kill process. (destroyProcess ) is now calling sigInt instead of unwrapped sigTerm. 2012-08-21 Jiri Vanek * launcher/javaws.in: java is now launched by exec 2012-08-19 Thomas Meyer * netx/net/sourceforge/jnlp/JNLPFile.java: * netx/net/sourceforge/jnlp/LaunchHandler.java: * netx/net/sourceforge/jnlp/PluginBridge.java: * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java: * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: * netx/net/sourceforge/jnlp/runtime/RhinoBasedPacEvaluator.java: Fix javadoc warnings. * plugin/icedteanp/java/sun/applet/PluginObjectStore.java (contains): Fix a small bug that prevents the only user of this method (PluginAppletSecurity line 1064) to work correctly. 2012-08-18 Jiri Vanek added encodings reproducer (PR1108) * tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡: new reproducer * tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/srcs/encodingTest.java: main class/main applet class and method of new encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡.jar * tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/testcases/encodingTestTest.java: testcases for jnlps of this reproducers * tests/reproducers/simple/encodingTestsФšХ ФŒХ˜ХНУУУУ‰ФšУ‰Х˜ХЄУУšХЎУУ“УХ ФŽХНХЙХ‡/resources: four utf-8 and four iso-8859-2 jnlp files and one utf-8 and one iso-8859-2 html files * tests/reproducers/simple/simpletest1/srcs/simpletest1.java: now prints its args out * tests/test-extensions-tests/net/sourceforge/jnlp/ResourcesTest.java: correctly swaped error and output listener in its test 2012-08-17 Adam Domurad Fixes PR588, cookies set in the java cookie jar are now stored properly * plugin/icedteanp/IcedTeaNPPlugin.cc (set_cookie_info): New, uses setvalueforurl (consume_plugin_message): Additional message added allowing set_cookie_info to be used from the java side. * plugin/icedteanp/java/sun/applet/PluginCookieManager.java: Now overrides put method, results in set_cookie_info calls in C++ * plugin/icedteanp/java/sun/applet/PluginMain.java: Passes PluginStreamHandler to PluginCookieManager to allow C++ side communication 2012-08-17 Adam Domurad Reproducers for PR588, sets persistent and session cookies in the cookie jar and tries to read them with various means. * tests/reproducers/signed/SavingCookies/resources/CheckCookie.html: Print the cookie store contents * tests/reproducers/signed/SavingCookies/resources/CheckCookieAndGotoClear.html: Print the cookie store contents, and then go to ClearPersistentCookie.html with showDocument * tests/reproducers/signed/SavingCookies/resources/ClearPersistentCookie.html: Clear the test cookie so it does not interfere with further tests * tests/reproducers/signed/SavingCookies/resources/SavePersistentCookie.html: Create a persistent cookie * tests/reproducers/signed/SavingCookies/resources/SavePersistentCookieAndGotoCheck.html: Create a persistent cookie and check it with showDocument * tests/reproducers/signed/SavingCookies/resources/SaveSessionCookie.html: Create a session cookie * tests/reproducers/signed/SavingCookies/resources/SaveSessionCookieAndGotoCheck.html: Create a session cookie and check it with showDocument * tests/reproducers/signed/SavingCookies/srcs/CheckingCookies.java: Checks the contents of the cookie store. Depending on the test, this may go to another page upon completion. * tests/reproducers/signed/SavingCookies/srcs/SavingCookies.java: Store cookies in the java cookie store. Depending on the test, this may go to another page upon completion. * tests/reproducers/signed/SavingCookies/testcases/SavingCookiesTests.java Test driver for testing persistent and session cookies in different ways 2012-08-18 Jiri Vanek * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: added VERBOSE_OPTION constant with -verbose value for javaws launching. 2012-08-17 Jiri Vanek * tests/reproducers/simple/deadlocktest/testcases/DeadLockTestTest.java: (testDeadLockTestTerminatedBody) removed tests for killed-process and termination of remaining javas put on correct place. * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: (executeBrowser) stout and stderr listeners forwarded to next method in correct order. 2012-08-14 Danesh Dadachanji Classpaths in jars' manifests are only considered when the applet is run without using jnlp_href and a JNLP file. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (activateJars): Add conditional check for use of jnlp_href. * tests/reproducers/signed/Classpath.Manifest.Test.Helper/srcs/CheckForClasspath.java: Applet whose jar is stored in a subdir under the test engine server. * tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestAppletTest.html: * tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestAppletTest.jnlp: * tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestApplicationTest.jnlp: * tests/reproducers/signed/ClasspathManifestTest/resources/ClasspathManifestJNLPHrefTest.html: * tests/reproducers/signed/ClasspathManifestTest/srcs/ClasspathManifest.java: * tests/reproducers/signed/ClasspathManifestTest/srcs/META-INF/MANIFEST.MF: * tests/reproducers/signed/ClasspathManifestTest/testcases/ClasspathManifestTest.java: Test if manifest entry is searched for classpath only when in the plugin is run without using jnlp_href. 2012-08-14 Adam Domurad Reproducer for allowing unsigned content in META-INF/ folder. Derives from ReadPropertiesSigned test's signed jar. * tests/reproducers/custom/UnsignedContentInMETAINF/resources/UnsignedContentInMETAINF.jnlp: New, runs a modified version of ReadPropertiesSigned.jar (UnsignedContentInMETAINF.jar) * tests/reproducers/custom/UnsignedContentInMETAINF/srcs/META-INF/unsigned_file_in_metainf: New, placed into a modified version of ReadPropertiesSigned.jar (UnsignedContentInMETAINF.jar) so that there is unsigned content in the META-INF/ folder. * tests/reproducers/custom/UnsignedContentInMETAINF/srcs/Makefile: New, creates a modified version of ReadPropertiesSigned.jar, named UnsignedContentInMETAINF.jar, and places unsigned content inside its META-INF/ folder * tests/reproducers/custom/UnsignedContentInMETAINF/testcases/UnsignedContentInMETAINF.java: Test driver for jnlp file 2012-08-14 Adam Domurad Unit test for method in JCV, isMetaInfFile() * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: Made isMetaInfFile package-private for testing purposes. * tests/netx/unit/net/sourceforge/jnlp/tools/JarCertVerifierTest.java: New, tests isMetaInfFile 2012-08-06 Jiri Vanek Added splashscreen implementation * netx/net/sourceforge/jnlp/GuiLaunchHandler.java: calling JNLPSplashScreen constructor with file ratehr then null. * netx/net/sourceforge/jnlp/InformationDesc.java: ONE_LINE changed from "oneline" to "one-line", added citation why. (getDescriptionStrict) new method returning exact value or null without fall-back. * netx/net/sourceforge/jnlp/JNLPSplashScreen.java: Added header, default values and useless string replaced by JnlpFile. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added SPLASH family of keys. * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java: (getSplashControler) new method returning its SplashControler. * netx/net/sourceforge/jnlp/runtime/Boot.java: Constants (name) and (version) made public. * netx/net/sourceforge/jnlp/splashscreen/SplashController.java: New interface for each class which wants its splasshcreen controlled by SplashUtils. * netx/net/sourceforge/jnlp/splashscreen/SplashErrorPanel.java: New interface for each class which wants to serve as error-showing splashscreen. * netx/net/sourceforge/jnlp/splashscreen/SplashPanel.java: New interface for each class which wants to serve as splashscreen. * netx/net/sourceforge/jnlp/splashscreen/SplashUtils.java: Factory methods for simplified splashscreens creation. * netx/net/sourceforge/jnlp/splashscreen/impls/DefaultErrorSplashScreen2012.java: Full implementation of SplashErrorPanel to be used as default error splashscreen. * netx/net/sourceforge/jnlp/splashscreen/impls/DefaultSplashScreen2012.java: Full implementation of SplashPanel to be used as default splashscreen. * netx/net/sourceforge/jnlp/splashscreen/impls/DefaultSplashScreens2012Commons.java: Class for gathering same logic in DefaultErrorSplashScreen2012 and DefaultSplashScreen2012. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java: Class responsible for paint main graphic in DefaultSplashScreen2012. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ControlCurve.java: Painting forefather for primitives drawing curves. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/Cubic.java: Class with cubic calculation. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.java: Class responsible for paint main graphic in DefaultErrorSplashScreen2012. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/MovingText.java: Class responsible for metal-shining web label. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubic.java: Painting primitive for drawing cubic-splines. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubicClosed.java: Painting primitive for drawing self-closed cubic-splines. * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextOutlineRenderer.java: Class for rendering text from given texture, * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextWithWaterLevel.java: Class for rendering Iced label slowly filled with watter * netx/net/sourceforge/jnlp/splashscreen/parts/BasicComponentErrorSplashScreen.java: Common forefather for all error splashscreens which would like to be an component too. * netx/net/sourceforge/jnlp/splashscreen/parts/BasicComponentSplashScreen.java: Common forefather for all splashscreens which would like to be an component too. * netx/net/sourceforge/jnlp/splashscreen/parts/DescriptionInfoItem.java: Description item of InformationElement * netx/net/sourceforge/jnlp/splashscreen/parts/InfoItem.java: Individual items in InformationElement * netx/net/sourceforge/jnlp/splashscreen/parts/InformationElement.java: Wrapper around jnlp's information element. * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java: Custom error dialogue with direct access to exception and icedtea-web page * tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashScreenTest.java: Test for final composition of ErrorSplashScreen2012, including main method for manual testing * tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashScreenTest.java: Test for final composition of SplashScreen2012, including main method for manual testing * tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashUtilsTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainterTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ControlCurveTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/CubicTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainterTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/MovingTextTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubicClosedTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/NatCubicTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/SplinesDefsTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextOutlineRendererTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/TextWithWaterLevelTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/BasicComponentErrorSplashScreenTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/BasicComponentSplashScreenTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/DescriptionInfoItemTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/InfoItemTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/InformationElementTest.java: * tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialogTest.java: Unit-test classes always testing the class with corresponding name 2012-08-13 Jiri Vanek * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: (executeProcessUponURL)Fixed wrong call in previous commit which was causing null process name. * tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java: Removed unused import. 2012-08-13 Jiri Vanek Reproducers of PR955 * tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement1.jnlp: * tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement2.jnlp: * tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement3.jnlp: * tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement4.jnlp: Test jnlp files with various combinations of locales, reproducers of PR955. * tests/reproducers/simple/LocalisedInformationElement/resources/LocalisedInformationElement_noLoc.jnlp Jnlp file with which is not affected by PR955 and is helping to catch error in LOCALE changing hack * tests/reproducers/simple/LocalisedInformationElement/srcs/LocalisedInformationElement.java: Reproducer main class, after loading prints out default locale. * tests/reproducers/simple/LocalisedInformationElement/testcases/LocalisedInformationElementTest.java: Testcases launching above jnlps under various locales. * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: Added set of methods allowing passing of custom variables to ThreadedProcess. * tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java: Added processing of custom variables. 2012-08-10 Adam Domurad * plugin/icedteanp/IcedTeaNPPlugin.cc (consume_plugin_message): New, called by consume_message, handles cookie and proxy info retrieval, and setting cookie info (consume_message): Call consume_plugin_message for "plugin ..." messages 2012-08-08 Danesh Dadachanji Fix PR955: regression: SweetHome3D fails to run * NEWS: Added entry for PR955 * netx/net/sourceforge/jnlp/JNLPFile.java: New enum Match that represents the level of precision to use when matching locales. (localMatches): Renamed to localeMatches, added matchLevel paramater and updated conditionals to handle the level of precision specified by it. (getVendor): New method that returns an information's vendor text. (getInformation): Added override methods for getTitle and getVendor that are used by the anonymous class to filter by locale. All three methods now go through all levels of precision to search for the best fitted locale. (getResources), (getResourcesDescs): Updated to check if any level of precision matches when searching for locales. (parse): Added call to checkForTitleVendor. * netx/net/sourceforge/jnlp/Parser.java (checkForTitleVendor): New method to check for availability of localized title and vendor from the information tags. Throws ParseException. (getInfo): Replace loop with foreach loop. (getInformationDesc): Remove check for present title and vendor. (getLocale): Variant returned can now use everything after the eigth element of the locale's string. * netx/net/sourceforge/jnlp/resources/Messages.properties: Update missing title and vendor messages to mention localization. * tests/reproducers/simple/InformationTitleVendorParser/testcases/InformationTitleVendorParserTest.java: Update output string as per new changes to Messages internationalizations. * tests/netx/unit/net/sourceforge/jnlp/JNLPFileTest.java: New unit test that checks the localesMatches method in JNLPFile. * tests/netx/unit/net/sourceforge/jnlp/MockJNLPFile.java: New class used to create a mock JNLPFile object. * tests/netx/unit/net/sourceforge/jnlp/ParserTest.java: New unit test that checks that the return of getTitle and getVendor have localized information. 2012-08-07 Thomas Meyer * plugin/icedteanp/IcedTeaNPPlugin.cc: only export NP_GetMIMEDescription, NP_GetValue, NP_Initialize and NP_Shutdown. This should fix PR472. 2012-08-07 Saad Mohammad Added license header to files without one. * netx/net/sourceforge/jnlp/AppletLog.java: * netx/net/sourceforge/jnlp/JNLPMatcherException.java: * netx/net/sourceforge/jnlp/Log.java: * netx/net/sourceforge/jnlp/Node.java: * netx/net/sourceforge/jnlp/UpdateDesc.java: * netx/net/sourceforge/jnlp/cache/IllegalResourceDescriptorException.java: * netx/net/sourceforge/jnlp/security/SecurityDialogMessage.java: Added license header. 2012-08-07 Adam Domurad Fixes PR1106, plugin crashing with firefox + archlinux/gentoo * plugin/icedteanp/IcedTeaNPPlugin.cc (initialize_browser_functions): Account for the fact that browserTable->size can be larger than sizeof(NPNetscapeFuncs) 2012-08-01 Saad Mohammad Fix PR1049: Extension jnlp's signed jar with the content of only META-INF/* is considered unsigned. * NEWS: Added entry for PR1049. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeResources): Removes the display of the security dialog for loaders with only empty jars. * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: (JarCertVerifier): Tracks whether all jars verified are empty jars. (hasAllEmptyJars): Returns true if all jars verified are empty jars. (verifyJars): Checks whether signable entries and certificates are found and decides if all jars are empty jars. (isFullySignedByASingleCert): If all jars are emptyJars, returns true. * tests/reproducers/signed/EmptySignedJar/resources/EmptySignedJarInLaunchingJnlp.jnlp: Launching jnlp with the resource of an empty jar and an extension jnlp containing the main jar. * tests/reproducers/signed/EmptySignedJar/resources/EmptySignedJarInExtensionJnlp.jnlp: Launching jnlp with the resource of the main jar and an extension jnlp containing the empty jar. * tests/reproducers/signed/EmptySignedJar/resources/EmptySignedJarExtension.jnlp: Extension jnlp containing only an empty jar. * tests/reproducers/signed/EmptySignedJar/srcs/META-INF/empty_file: Empty file within META-INF; required to create EmptySignedJar.jar by the test engine. * tests/reproducers/signed/EmptySignedJar/testcases/EmptySignedJarTest.java: Testcase that tests jnlp files with empty jars. * tests/reproducers/signed/SignedJarResource/resources/SignedJarResource.jnlp: Launches SignedJarResource class directly. 2012-07-31 Danesh Dadachanji Minor fix to overly restrictive unit test. * tests/netx/unit/net/sourceforge/jnlp/JNLPMatcherTest.java (testIsMatchDoesNotHangOnLargeData): Increase timeout to 5 seconds. 2012-07-24 Adam Domurad CVE-2012-3422, RH840592: Potential read from an uninitialized memory location. * plugin/icedteanp/IcedTeaNPPlugin.cc (get_cookie_info): Only attempt to perform this operation if there is a valid plugin instance (get_proxy_info): Only attempt to perform this operation if there is a valid plugin instance 2012-07-31 Danesh Dadachanji * Makefile.am: Fix call to keytool that is missing its absolute path. 2012-07-31 Jiri Vanek Peter Hatina Introduced configure option --with-gtk=2|3|default to be able to compile against different version of GTK+ (2.x or 3.x). * NEWS: mentioned bug fix * acinclude.m4: (ITW_GTK_CHECK_VERSION) macro for getting GTK+ version (ITW_GTK_CHECK) macro for checking GTK+ version 2012-07-24 Adam Domurad * plugin/icedteanp/IcedTeaPluginUtils.cc (IcedTeaPluginUtilities::strSplit): Replace usage of " " with proper delimiter 2012-07-18 Danesh Dadachanji Fix RH838417, Fix RH838559: Disambiguate signed applet security prompt from certificate warning. * NEWS: Added entries for RH838417 and RH838559. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added SWarnFullPermissionsIgnorePolicy and updated SHttpsUnverified. * netx/net/sourceforge/jnlp/security/CertWarningPane.java: Display SWarnFullPermissionsIgnorePolicy if the cert is from a jar and is either unverified or has a signing error. Also added warning.png to HTTPS dialogs. 2012-07-18 Thomas Meyer * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (handleMessage): Fix possible endless loop while waiting for the applet object instance to get created. 2012-07-11 Jiri Vanek try to close browser before kill it * tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java: * tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java: * tests/reproducers/simple/CheckServices/testcases/CheckServicesTests.java (evaluateSignedApplet) addapted to properly closed browser * tests/reproducers/simple/CheckServices/srcs/CheckServices.java: removed fixme section as it shuld work now * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java (destroyProcess) new method, launching kill with SIGTERM before clasical process.destroy() * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: removed Set terminated, should be removed long ago 2012-07-10 Adam Domurad Refactor JNLPFile#launchType into its own interface type (as opposed to Object), LaunchDesc. * netx/net/sourceforge/jnlp/AppletDesc.java: Add override annotation to getMainClass(). * netx/net/sourceforge/jnlp/ApplicationDesc.java: Same as above * netx/net/sourceforge/jnlp/InstallerDesc.java: Same as above * netx/net/sourceforge/jnlp/JNLPFile.java: Make launchType a LaunchDesc object. Update getLaunchInfo() accordingly. * netx/net/sourceforge/jnlp/LaunchDesc.java: New launch description. * netx/net/sourceforge/jnlp/Parser.java (getLauncher): Return type changed to LaunchDesc * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Replace occurences of instanceof with respect to launchType. 2012-07-09 Deepak Bhole * configure.ac: Bumped release number to 1.4pre 2012-07-09 Saad Mohammad * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeExtensions): Checks and assigns the main-class name prior to the for loop. 2012-07-09 Martin Olsson * plugin/icedteanp/IcedTeaPluginUtils.cc: Change calls from g_free to free when allocated with calloc. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (PluginRequestProcessor::call): Make sure args_array doesnt hold garbage when freed. (_loadURL): Change calls from g_free to free when allocated with calloc. 2012-07-09 Adam Domurad Ignore invalid jar files in applets, like the oracle plugin does. * netx/net/sourceforge/jnlp/cache/IllegalResourceDescriptorException.java: New exception type for ResourceTracker to throw instead of IllegalArgumentException * netx/net/sourceforge/jnlp/cache/IllegalResourceDescriptorException.java: Throws IllegalArgumentDescriptorException instead of IllegalArgumentException. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (isInvalidJar): New, checks for ZipException in new JarFile(...) (shouldFilterInvalidJars): New, checks if we are in an applet (initializeResources): if 'shouldFilterInvalidJars()' is true and a jar is not a valid jar file, the jar is filtered out and normal execution continues. 2012-07-03 Saad Mohammad * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (JNLPClassLoader): New constructor that accepts an additional parameter containing the main class name. (getInstance): Accepts mainName as parameter to override application's main class name (initializeExtensions): Passes in the name of the application's main class when creating a new JNLPClassLoader instance. (initializeResources): If the loader owns no jars, it will consider itself as signed if all of the extension loaders are signed. Also, if the extension jars have the main class, it will set foundMainJar to true. (initializeResources): If the main class was not found, check if it was found within the extension jars. (checkForMain): Uses the overwritten main class name (if set) when searching for the main within the jars. (hasMainJar): Returns true if this loader holds the main jar. (hasMainInExtensions): Returns true if extension loaders have the main jar * tests/jnlp_tests/signed/ExtensionJnlp/resources/UsesSignedJarExtension.jnlp: * tests/jnlp_tests/signed/ExtensionJnlp/resources/UsesSignedJnlpExtension.jnlp: * tests/jnlp_tests/signed/ExtensionJnlp/resources/UsesSignedJnlpJarAndSignedJarExtension.jnlp: Launching jnlps that use extension jnlp as its resource. * tests/jnlp_tests/signed/ExtensionJnlp/resources/UsesSignedJar.jnlp: Launching jnlp that directly launches SignedJarResource class. * tests/jnlp_tests/signed/ExtensionJnlp/resources/UsesSignedJnlp.jnlp: Launching jnlp that directly launches SignedJnlpResource class. * tests/jnlp_tests/signed/ExtensionJnlp/testcases/ExtensionJnlpTest.java: Testcase that tests the launching of jnlp files containing extension jnlps as resource. * tests/jnlp_tests/signed/SignedJarResource/resources/SignedJarExtension.jnlp: Component jnlp file that is used as an extension resource. * tests/jnlp_tests/signed/SignedJarResource/srcs/SignedJarResource.java: A simple java class that outputs a string. * tests/jnlp_tests/signed/SignedJnlpResource/resources/UnmatchingSignedJnlpExtension.jnlp: Component jnlp file that is used as an extension resource and does not match the signed jnlp file. * tests/jnlp_tests/signed/SignedJnlpResource/resources/MatchingSignedJnlpExtension.jnlp: Component jnlp file that is used as an extension resource and matches the signed jnlp file. * tests/jnlp_tests/signed/SignedJnlpResource/srcs/JNLP-INF/APPLICATION_TEMPLATE.jnlp: Signed jnlp file. * tests/jnlp_tests/signed/SignedJnlpResource/srcs/SignedJnlpResource.java: A simple java class that outputs a string. 2012-07-02 Jiri Vanek Added missing headers * tests/reproducers/simple/CreateClassLoader/resources/CreateClassLoader.jnlp: * tests/reproducers/simple/ReadEnvironment/resources/ReadEnvironment.jnlp: * tests/reproducers/simple/ReadProperties/resources/ReadProperties1.jnlp: * tests/reproducers/simple/ReadProperties/resources/ReadProperties2.jnlp: * tests/reproducers/simple/RedirectStreams/resources/RedirectStreams.jnlp: * tests/reproducers/simple/ReplaceSecurityManager/resources/ReplaceSecurityManager.jnlp: * tests/reproducers/simple/SetContextClassLoader/resources/SetContextClassLoader.jnlp: * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: * tests/test-extensions/net/sourceforge/jnlp/annotations/Bug.java: * tests/test-extensions/net/sourceforge/jnlp/annotations/KnownToFail.java: * tests/test-extensions/net/sourceforge/jnlp/annotations/NeedsDisplay.java: * tests/test-extensions/net/sourceforge/jnlp/annotations/TestInBrowsers.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/Browser.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/BrowserFactory.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/BrowserTest.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/BrowserTestRunner.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/Browsers.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Chrome.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Chromium.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Epiphany.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/LinuxBrowser.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Midory.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/MozillaFamilyLinuxBrowser.java: * tests/test-extensions/net/sourceforge/jnlp/browsertesting/browsers/Opera.java: added license headers 2012-07-02 Jiri Vanek Makefile adapted to recent (three changelog items) refactoring * Makefile.am: (JNLP_TESTS_ENGINE_SRCDIR) now points correctly to test-extensions. (JNLP_TESTS_ENGINE_TESTS_SRCDIR) new variable for test-extensions-tests. (JNLP_TESTS_SRCDIR) now points to reproducers. (JNLP_TESTS_ENGINE_TESTS_DIR) new variable for built JNLP_TESTS_ENGINE_TESTS_SRCDIR (netx-dist-tests-tests-source-files.txt) new target for list of content of JNLP_TESTS_ENGINE_TESTS_SRCDIR. (stamps/netx-dist-tests-tests-compile.stamp) new target for compiling netx-dist-tests-tests-source-files.txt (netx-dist-tests-source-files.tx) now depends on stamps/netx-dist-tests-tests-compile.stamp ($(REPRODUCERS_CLASS_NAMES)) target is now working in JNLP_TESTS_ENGINE_TESTS_DIR instead of JNLP_TESTS_ENGINE_DIR (stamps/run-netx-dist-tests.stamp): added JNLP_TESTS_ENGINE_TESTS_DIR to classpath (stamps/run-unit-test-code-coverage.stamp), (stamps/run-reproducers-test-code-coverage.stamp) added JNLP_TESTS_ENGINE_TESTS_DIR to classpath and JNLP_TESTS_ENGINE_TESTS_SRCDIR to sources path 2012-07-02 Jiri Vanek All tests from test-extensions extracted to test-extensions-tests. All inner classes in test-extensions extracted as outer classes * tests/test-extensions/net/sourceforge/jnlp/ResourcesTest.java: moved to test-extensions-tests * tests/test-extensions-tests/net/sourceforge/jnlp/ResourcesTest.java: new file, copied from test-extensions * tests/test-extensions-tests/net/sourceforge/jnlp/ServerAccessTest.java: all tests from original ServerAccess.java * tests/test-extensions/net/sourceforge/jnlp/ContentReader.java: * tests/test-extensions/net/sourceforge/jnlp/LogItem.java: * tests/test-extensions/net/sourceforge/jnlp/LoggingBottleneck.java: * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java: * tests/test-extensions/net/sourceforge/jnlp/ProcessResult.java: * tests/test-extensions/net/sourceforge/jnlp/ServerLauncher.java: * tests/test-extensions/net/sourceforge/jnlp/TestsLogs.java: * tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java: * tests/test-extensions/net/sourceforge/jnlp/TinyHttpdImpl.java: new files, extracted classes from ServerAccess * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: extracted tests and inner classes 2012-07-02 Jiri Vanek hg move tests/netx/jnlp_testsengine/ tests/test-extensions 2012-07-02 Jiri Vanek hg move tests/jnlp_tests/ tests/reproducers 2012-06-29 Jiri Vanek Fixed resource tests and Browsers.none behavior * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ResourcesTest.java: Added slash into all executeBrowsers urls. Added midori and epiphany to simple proxies test. * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserTestRunner.java: Corrected handling of Browsers.none together with -Dmodified.browsers.run switch 2012-06-28 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (findClass): Invoke CodeBaseClassLoader.findClass with a flag to avoid infinite recursion. (CodeBaseClassLoader.findClass(String)): Delegate to ... (CodeBaseClassLoader.findClass(String,boolean)): New method. * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java (testParentClassLoaderIsAskedForClasses): New method. 2012-06-28 Jiri Vanek Correctly backup all log files re-writable by emma during code-coverage * Makefile.am: (EMMA_MODIFIED_FILES) new variable with list of files to backup/restore. (stamps/run-unit-test-code-coverage.stamp) and (stamps/run-reproducers-test-code-coverage.stamp) are now iterating over EMMA_MODIFIED_FILES instead of enumerating them 2012-06-28 Jiri Vanek Removed repeated re-runing of tests during coverage, stamped pac tests * Makefile.am: (check-pac-functions) moved to target aliases and replaced by stamps/check-pac-functions.stamp. (clean-netx-unit-tests) added removing of stamps/check-pac-functions.stamp (stamps/exported-test-certs.stamp): no longer depends on netx-dist-tests-remove-cert-from-public, logic of it have to be copy-pasted from here. (stamps/run-unit-test-code-coverage.stamp): no longer depends on check, but was added direct dependences 2012-06-28 Adam Domurad Allow for folders in archive tag. * netx/net/sourceforge/jnlp/PluginBridge.java: (PluginBridge) Changes jar -> archive, parse contents with addArchiveEntries. (addArchiveEntries) New method. Adds entries ending with / to the list of folders. (getCodeBaseFolders) Returns the folders collected by addArchiveEntries * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (initializeResources) If ran as plugin, add archive tag folders to the code base loader. 2012-06-27 Adam Domurad Tests folders in archive tag * tests/jnlp_tests/custom/AppletFolderInArchiveTag/testcases/AppletFolderInArchiveTagTests.java: Runs html file in browser * tests/jnlp_tests/custom/AppletFolderInArchiveTag/srcs/Makefile: packages compiled source files in folder * tests/jnlp_tests/custom/AppletFolderInArchiveTag/srcs/AppletFolderInArchiveTag.java: Simple output to confirm it is running * tests/jnlp_tests/custom/AppletFolderInArchiveTag/resources/AppletFolderInArchiveTag.html: Has folder in its archive tag that contains a class file 2012-06-26 Jiri Vanek Added slipped midori and epiphany to recognized browsers. * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserFactory.java: (BrowserFactory) added slipped cases for creating Epiphany and Midori singletons 2012-06-26 Jiri Vanek * Makefile.am: Most crucial variables exported to be used by custom Makefiles (CUSTOM_REPRODUCERS): new variable to hold custom name (ALL_NONCUSTOM_REPRODUCERS): new variable for gathering all except custom reproducers (ALL_REPRODUCERS): now contains also custom ones (stamps/junit-jnlp-dist-dirs): now depends also on junit-jnlp-dist-custom.txt (junit-jnlp-dist-custom.txt): new target scanning for directories in jnlp_tests/custom and saving them as list for future purposes. (stamps/netx-dist-tests-prepare-reproducers.stamp): and ( stamps/change-dots-to-paths.stamp):iterate through ALL_NONCUSTOM_REPRODUCERS instead of ALL__REPRODUCERS (stamps/process-custom-reproducers.stamp) : new target for iterating by junit-jnlp-dist-custom.txt through jnlp_tests/custom/srcs* and launching make prepare-reproducer in each. (clean-custom-reproducers): same as above but launching make clean-reproducer (run-netx-dist-tests) now depends on stamps/process-custom-reproducers.stamp (clean-netx-dist-tests): now depends on clean-custom-reproducers and is removing stamps/netx-dist-tests-copy-resources.stamp (stamps/netx-dist-tests-copy-resources.stamp): new target extracting copying of resources from stamps/netx-dist-tests-compile-testcases.stamp * tests/jnlp_tests/README: described this mechanism a bit 2012-06-26 Jiri Vanek Reproducer for classes which should be loaded before verification but are not * tests/jnlp_tests/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-applet-hack.jnlp jnlp launcher of applet variant with injecting new url to classlaoder * tests/jnlp_tests/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-applet-new.jnlp jnlp launcher of applet variant with custom classlaoder * tests/jnlp_tests/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-hack.html html launcher of applet variant with injecting new url to classlaoder * tests/jnlp_tests/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-hack.jnlp jnlp launcher of application variant with injecting new url to classlaoder * tests/jnlp_tests/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-new.html html launcher of applet variant with custom classlaoder * tests/jnlp_tests/signed/InternalClassloaderWithDownloadedResource/resources/InternalClassloaderWithDownloadedResource-new.jnlp jnlp launcher of application variant with custom classlaoder * tests/jnlp_tests/signed/InternalClassloaderWithDownloadedResource/srcs/InternalClassloaderWithDownloadedResource.java: Both application and applet reproducing behavior of this bug * tests/jnlp_tests/signed/InternalClassloaderWithDownloadedResource/testcases/InternalClassloaderWithDownloadedResourceTest.java: Testcase launching jnlp application, jnlp applet and html applet 2012-06-26 Jiri Vanek Last hope for not downloaded resources to be verified * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (getCodeSourceSecurity): will now try to download and verify resource which was downloaded outside of netx. (alreadyTried) set for memory of once tried resources to not try again 2012-06-25 Adam Domurad Small comment cleanup to classes with missing or wrong descriptions. * plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java: Comment at top fixed * plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java: Same * plugin/icedteanp/java/sun/applet/PluginException.java: Same * plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java: Same * netx/net/sourceforge/jnlp/PluginBridge.java: Add class description. * plugin/icedteanp/java/sun/applet/PluginCallRequest.java: Removed FIXME that had already been fixed. 2012-06-25 Adam Domurad Allow passing of plugin tables and browser tables in NP_Initialize that are not the expected length but still large enough for our purposes. * plugin/icedteanp/IcedTeaNPPlugin.cc (initialize_browser_functions): New function to check size of passed browser function table, and initialize 'browser_functions' global variable. (initialize_plugin_table): New function to check size of passed plugin function table, and initialize proper plugin callbacks. (NP_Initialize): Make use of initialization helper functions, get rid of old size tests and error if the helper functions fail. 2012-06-20 Adam Domurad * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java (verifyJar): two for loops made into for-each loops 2012-06-19 Jiri Vanek various test for browser engine * tests/jnlp_tests/simple/AppletTest/resources/appletAutoTests.html: fixed missing parenthesis * tests/jnlp_tests/simple/AppletTest/resources/appletAutoTests2.html: new test excluding XslowX for applets * tests/jnlp_tests/simple/AppletTest/testcases/AppletTestTests: (doubleChrome) test for ensuring that two chrome browsers launched behind themselves will not cause errors as they were without criticalFixes patch (AppletInBrowserTest) and (AppletInBrowserTestXslowX) testing methods for all browser * tests/jnlp_tests/simple/AppletTest/testcases/AppletBaseURLTest: * tests/jnlp_tests/simple/AppletTest/testcases/CheckServicesTests: * tests/jnlp_tests/simple/AppletTest/testcases/AppletReadsInvalidJarTests: Included @TestInBrowser instead of plain executeBrowser * tests/jnlp_tests/simple/deadlocktest/srcs/DeadlockTest.java: improved to print sometimes something out * tests/jnlp_tests/simple/deadlocktest/testcases/DeadLockTestTest.java: (testDeadLockTestTerminatedBody) enhanced to ensure that not so much is lost when process is terminated, but showing that something can be lost (which is correct) * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ResourcesTest.java: (testNonExisitngBrowserWillNotDeadlock) testing taht when no browser is set, then no deadlock happens as happen before criticalFixes's deadlyException (testUnexistingProcessWillFailRecognizedly) is actually testing deadlyException (testNonExisitngBrowserWillNotCauseMess) some but with annotation which was also harming output of tool little bit without TestInBrowsersAnnotation fixed. (testBrowsers2) is testing all browsers configuration without annotation and (testBrowser3) do the same configuration tests annotation driven (testBrowser) body of above two methods. Is testing whether used browsers are correctly linked with latest build (testBrowsers1) is testing parsing of -D variable (testListeners) annotated that needs display * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: annotated with Bug annotation 2012-06-19 Jiri Vanek introduced possibility to run comfortably applets+html reproducers * Makefile.am: used BROWSER_TESTS_MODIFICATION variable to pass global switch from configure * acinclude.m4: (IT_SET_GLOBAL_BROWSERTESTS_BHAVIOUR) new method handling --with-browser-tests * configure.ac: used IT_SET_GLOBAL_BROWSERTESTS_BHAVIOUR switch and passing BROWSER_TESTS_MODIFICATION variable to Makefile. * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: (currentBrowser) variable holding injected browser for ServerAccess instance (loggedBrowser) static variable keeping id of (currentBrowser) for static logging purposes (modifyMethodWithForBrowser) new function changing the name of method to "method - browser" for logging purposes (getBrowserLocation) - returning path to process to be launched when browser requested (getBrowserParams) - gathering set default's browser settings (set/getCurrentBrowsers) - set browser by id/return id of set browser (set/getCurrentBrowser) - set browser instance /returns instance of current browser (executeBrowser) family of methods now cooperate with above methods for default set browser (executeBrowser(Browser) family to work with implicit browser * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/annotations/TestInBrowsers.java: annotation for determining which browser(s) to use with annotated method * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/Browser.java: interface for dealing with various browsers * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserFactory.java: singleton for mapping configured browsers x requested browser x browsers proxies * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserTest.java: Forefather of all testcases which have methods to do tests iniside browser. Is allowing correct annotation -> proxy trasnver to VirtualServer for selected method and is requesting custom runner from junit framework * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/BrowserTestRunner.java: custom test Ruuner which is responsible for translating annotation and run the method mutlipletimes for each requested browser and to name it properly * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/Browsers.java: enumeration of abstract browsers and theirs sets or subsets. * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/*: individual browsers proxies and theirs abstractions,namely: * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Opera.java: * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Firefox.java: * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Chrome.java: * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Chromium.java: * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Midori.java: * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/Epiphany.java: proxies for browsers as name suggests * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/LinuxBrowser.java: abstract forefather for all browsers implementing Browser interface. Is setting /usr/bin as bin path, libjavaplugin.so as default plugin library name, intorducing stubs for methods (eg 32/64 bit libs) * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/browsertesting/browsers/MozillaFamilyLinuxBrowser: forefather for all browsers except Opera. Is unifying .mozilla/plugins directories 2012-06-15 Jiri Vanek * tests/jnlp_tests/simple/AppletTest/resources/appletAutoTests.html: Added quotes around parameters of html applet tag. * tests/jnlp_tests/simple/deadlocktest/testcases/DeadLockTestTest.java: Output verification is counting with repeated and probably unfinished outputs. * tests/jnlp_tests/simple/deadlocktest/srcs/DeadlockTest.java Is now printing out sentence in intervals to avoid destroy-consume as much as possible * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: Added bug annotation with threads on distro-pkg-dev 2012-06-15 Adam Domurad Fixed two memory leaks * plugin/icedteanp/IcedTeaNPPlugin.cc (consume_message): Call to g_strsplit matched with call to g_strfreev. * plugin/icedteanp/IcedTeaPluginUtils.cc (post): Removed copy of string, which assumed consumer freed string (which was not true and not always possible) 2012-06-11 Danesh Dadachanji PR855: AppletStub getDocumentBase() doesn't return full URL * NEWS: Added PR855 entry. * plugin/icedteanp/IcedTeaNPPlugin.cc (plugin_get_documentbase): Assign documentbase_copy directly to href's value instead of iterating through the segments to remove the file from the path. * tests/jnlp_tests/simple/AppletBaseURLTest/srcs/AppletBaseURL.java: * tests/jnlp_tests/simple/AppletBaseURLTest/testcases/AppletBaseURLTest.java: * tests/jnlp_tests/simple/AppletBaseURLTest/resources/AppletBaseURLTest.html: * tests/jnlp_tests/simple/AppletBaseURLTest/resources/AppletBaseURLTest.jnlp: * tests/jnlp_tests/simple/AppletBaseURLTest/resources/AppletJNLPHrefBaseURLTest.html: New reproducer that checks the URLS that document and codebase point are correct. 2012-06-13 Danesh Dadachanji Update CheckServices reproducer to handle browser testcase. * tests/jnlp_tests/simple/CheckServices/testcases/CheckServicesTests.java: Added browser test and annotation, refactored asserts into helper method. * tests/jnlp_tests/simple/CheckServices/resources/CheckPluginServices.html: New browser test file that runs applet using jnlp_href. 2012-06-13 Jiri Vanek * tests/junit-runner/JunitLikeXmlOutputListener.java: Introduced TEST_IGNORED_ATTRIBUTE to mark test as ignored if should be. * tests/report-styles/jreport.xsl: Applied correct text and style for tests with attribute ignored. 2012-06-12 Adam Domurad Fixes PR722, javaws failing to run with unsigned content in META-INF/ * NEWS: Added entry: Fixes PR722 * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: Changed isSignatureRelated => isMetaInfFile. Now all files under META-INF/ are disregarded in checking the jar signage. 2012-06-11 Jiri Vanek Implemented xml logging backend * Makefile.am: (stamps/run-netx-unit-tests.stamp) and (stamps/run-netx-dist-tests.stamp) removed redirection of streams as logging is now done in ServerAccess tests extensions added xsltproc execution above generated xml log xsltproc generating results html files is now receiving result of above as parameter * tests/report-styles/jreport.xsl: log parameter is now accepted, and if set, then all tests are linking into specified file to show the log * tests/report-styles/report.css: added styles for new links * tests/report-styles/index.js: new functions to work for result of below sheet * tests/report-styles/logs.xsl: new file, sheet to convert xml log to html file * tests/report-styles/output.css: new file, styles of above html file * tests/jnlp_tests/simple/deadlocktest/testcases/DeadLockTestTest.java: * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ResourcesTest.java: * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: Tests', server's and ProcessAssasin's logs are now redirected to bottleneck * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: (LOGS_REPRINT) flag for debugging purposes, will enable reprinting to stdout/err again (DEFAULT_LOG_FILE ) default name of xml output (DEFAULT_STDERR_FILE)(DEFAULT_STDOUT_FILE)(DEFAULT_STDLOGS_FILE) default values of plain text output files (*ELEMENT) and( (*ATTRIBUTE) variables keeping repeated names of xml output parts (writeXmlLog) method called from Sytsem.hook to save xml log (addToXmlLog) method to record item to xml structure (TestsLogs) and (LogItem) inner classes to keep logging information (log) is now reprinting message with id to std out/err dependently on (LOGS_REPRINT) but always to internal streams, possilbe exception is thrown (logException) new method, shortcut to log exception in same way as message (getTestMethod) now can handle methods inside ServerAccess class too 2012-06-11 Adam Domurad * NEWS: Added mention of fixing PR518 2012-06-07 Saad Mohammad Allows the user to configure browser paths and/or disable browsers. * acinclude.m4 (IT_FIND_BROWSER): Checks if the browser is set to be disabled, or if the path provided is valid. Otherwise, it locates the default path to the browser if found on the system. * configure.ac: Uses IT_FIND_BROWSER to find/configure browsers. 2012-06-06 Deepak Bhole * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getAccessControlContextForClassLoading): Iterate over codebase URLs only if codeBaseLoader is not null. 2012-06-05 Deepak Bhole PR861: Allow loading from non codebase hosts. Allow code to connect to hosting server. * netx/net/sourceforge/jnlp/SecurityDesc.java (getSandBoxPermissions): Only add host if it is not empty. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getPermissions): Add SocketPermission for code source host. (findLoadedClassAll): Call super methods privileged so that connection to non codebase hosts can be made. (findClass): Same. (findResourcesBySearching): Same. Also use privileged context for enum operations because the enum is defined on the fly by URLClassLoader and checks for hosting server connectivity via next(). (getAccessControlContextForClassLoading): New method. Returns a control context for classloader operations like find/load/etc. (CodeBaseClassLoader::findClass): Call super methods privileged so that connection to non codebase hosts can be made. (CodeBaseClassLoader::findResource): Same. 2012-06-05 Jiri Vanek * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/annotations/KnownToFail.java New file. Annotation for marking failing tests. * tests/report-styles/jreport.xsl: * tests/junit-runner/LessVerboseTextListener.java: * tests/junit-runner/JunitLikeXmlOutputListener.java: Added counting and printing of @KnownToFail annotations if presented. * tests/jnlp_tests/simple/Spaces can be everywhere/testcases/SpacesCanBeEverywhereTests.java: (SpacesCanBeEverywhereRemoteTests1) (SpacesCanBeEverywhereRemoteTests2) (SpacesCanBeEverywhereRemoteTests3) * tests/netx/unit/net/sourceforge/jnlp/JNLPMatcherTest.java: (testTemplateCDATA) (testApplicationCDATA) * tests/netx/unit/net/sourceforge/jnlp/ParserCornerCases.java: (testCDataFirstChild) (testCDataSecondChild) (testCommentInAttributes) * tests/netx/unit/net/sourceforge/jnlp/ParserMalformedXml.java: (testMalformedArguments) (testTagNotClosed) (testUnquotedAttributes) marked as KnownToFail 2012-06-05 Jiri Vanek isDateInRange renamed to isDateInRange_internallForIcedTeaWebTesting * netx/net/sourceforge/jnlp/runtime/pac-funcs.js: and * tests/netx/pac/pac-funcs-test.js: (isDateInRange): Renamed to isDateInRange_internallForIcedTeaWebTesting. (isDateInRange_internallForIcedTeaWebTesting): New function 2012-06-04 Saad Mohammad Added signed jnlp file tests. * tests/jnlp_tests/signed/SignedJnlpApplication/resources/SignedJnlpApplication1.jnlp: Launching jnlp file that matches the signed jnlp application file. * tests/jnlp_tests/signed/SignedJnlpApplication/resources/SignedJnlpApplication2.jnlp: * tests/jnlp_tests/signed/SignedJnlpApplication/resources/SignedJnlpApplication3.jnlp: Launching jnlp file that does not match the signed jnlp application file. * tests/jnlp_tests/signed/SignedJnlpApplication/srcs/JNLP-INF/APPLICATION.jnlp: Signed jnlp application file. * tests/jnlp_tests/signed/SignedJnlpApplication/srcs/SignedJnlpApplication.java: A simple java class that outputs a string. * tests/jnlp_tests/signed/SignedJnlpApplication/testcases/SignedJnlpApplicationTest.java: Testcase that tests the launching of applications with a signed jnlp application file. * tests/jnlp_tests/signed/SignedJnlpTemplate/resources/SignedJnlpTemplate1.jnlp: Launching jnlp file that matches the signed jnlp application template file. * tests/jnlp_tests/signed/SignedJnlpTemplate/resources/SignedJnlpTemplate2.jnlp: * tests/jnlp_tests/signed/SignedJnlpTemplate/resources/SignedJnlpTemplate3.jnlp: Launching jnlp file that does not match the signed jnlp application template file. * tests/jnlp_tests/signed/SignedJnlpTemplate/srcs/JNLP-INF/APPLICATION_TEMPLATE.jnlp: Signed jnlp application template file. * tests/jnlp_tests/signed/SignedJnlpTemplate/srcs/SignedJnlpTemplate.java: A simple java class that outputs a string. * tests/jnlp_tests/signed/SignedJnlpTemplate/testcases/SignedJnlpTemplateTest.java: Testcase that tests the launching of applications with a signed jnlp application template file. * tests/jnlp_tests/simple/UnsignedJnlpApplication/resources/UnsignedJnlpApplication1.jnlp: Launching jnlp file that matches the unsigned jnlp application file. * tests/jnlp_tests/simple/UnsignedJnlpApplication/resources/UnsignedJnlpApplication2.jnlp: * tests/jnlp_tests/simple/UnsignedJnlpApplication/resources/UnsignedJnlpApplication3.jnlp: Launching jnlp file that does not match the unsigned jnlp application file. * tests/jnlp_tests/simple/UnsignedJnlpApplication/srcs/JNLP-INF/APPLICATION.jnlp: Unsigned jnlp application file. * tests/jnlp_tests/simple/UnsignedJnlpApplication/srcs/UnsignedJnlpApplication.java: A simple java class that outputs a string. * tests/jnlp_tests/simple/UnsignedJnlpApplication/testcases/UnsignedJnlpApplicationTest.java: Testcase that tests the launching of applications with an unsigned jnlp application file. * tests/jnlp_tests/simple/UnsignedJnlpTemplate/resources/UnsignedJnlpTemplate1.jnlp: Launching jnlp file that matches the unsigned jnlp application template file. * tests/jnlp_tests/simple/UnsignedJnlpTemplate/resources/UnsignedJnlpTemplate2.jnlp: * tests/jnlp_tests/simple/UnsignedJnlpTemplate/resources/UnsignedJnlpTemplate3.jnlp: Launching jnlp file that does not match the unsigned jnlp application template file. * tests/jnlp_tests/simple/UnsignedJnlpTemplate/srcs/JNLP-INF/APPLICATION_TEMPLATE.jnlp: Unsigned jnlp application template file. * tests/jnlp_tests/simple/UnsignedJnlpTemplate/srcs/UnsignedJnlpTemplate.java: A simple java class that outputs a string. * tests/jnlp_tests/simple/UnsignedJnlpTemplate/testcases/UnsignedJnlpTemplateTest.java: Testcase that tests the launching of applications with an unsigned jnlp application template file. * tests/jnlp_tests/signed/SignedJnlpCaseTestOne/resources/SignedJnlpCaseTestOne1.jnlp: Launching jnlp file that matches the signed jnlp application file. * tests/jnlp_tests/signed/SignedJnlpCaseTestOne/resources/SignedJnlpCaseTestOne2.jnlp: Launching jnlp file that does not match the signed jnlp application file. * tests/jnlp_tests/signed/SignedJnlpCaseTestOne/srcs/JNLP-INF/aPpLiCaTioN.jnlp: Signed jnlp application file. * tests/jnlp_tests/signed/SignedJnlpCaseTestOne/srcs/SignedJnlpCase.java: A simple java class that outputs a string. * tests/jnlp_tests/signed/SignedJnlpCaseTestOne/testcases/SignedJnlpCaseOneTest.java: Testcase that tests the case-sensitivity of the signed jnlp application's filename. * tests/jnlp_tests/signed/SignedJnlpCaseTestTwo/resources/SignedJnlpCaseTestTwo1.jnlp: Launching jnlp file that matches the signed jnlp application template file. * tests/jnlp_tests/signed/SignedJnlpCaseTestTwo/resources/SignedJnlpCaseTestTwo2.jnlp: Launching jnlp file that does not match the signed jnlp application template file. * tests/jnlp_tests/signed/SignedJnlpCaseTestTwo/srcs/JNLP-INF/aPpLiCaTiOn_tEmPlAte.jnlp: Signed jnlp application template file. * tests/jnlp_tests/signed/SignedJnlpCaseTestTwo/srcs/SignedJnlpCase.java: A simple java class that outputs a string. * tests/jnlp_tests/signed/SignedJnlpCaseTestTwo/testcases/SignedJnlpCaseTwoTest.java: Testcase that tests the case-sensitivity of the signed jnlp application template's filename. 2012-06-04 Danesh Dadachanji Fix to handle absolute paths passed into jnlp_href's value. * netx/net/sourceforge/jnlp/PluginBridge.java (PluginBridge): Uses context of codebase to evaluate jnlp_href's value. Uses JNLPCreator's create method to make new JNLPFile variables. New constructor that wraps around the original one, creating a new JNLPCreator to use. * netx/net/sourceforge/jnlp/JNLPCreator.java: New strategy pattern class to be used to wrap around the creation of a JNLPFile. Replace this creator when unit testing to skip running parsing code. * tests/netx/unit/net/sourceforge/jnlp/PluginBridgeTest.java: New class to unit test getEvaluatedJNLPHref. 2012-06-04 Adam Domurad Added self to AUTHORS. This patch fixes PR518, ensures null termination of strings based off of NPVariant results. * plugin/icedteanp/IcedTeaPluginUtils.h: Added declaration of NPVariantAsString * plugin/icedteanp/IcedTeaPluginUtils.cc (NPVariantAsString): New. Converts an NPVariant to a std::string, assumes it is a valid NPString. (isObjectJSArray): Now uses NPVariantAsString, minor cleanup. * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc (plugin_get_documentbase): Now uses NPVariantAsString. * plugin/icedteanp/IcedTeaNPPlugin.cc (NPVariantToString): Now uses NPVariantAsString, minor cleanup. 2012-06-01 Deepak Bhole PR863: Error passing strings to applet methods in Chromium * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc (createJavaObjectFromVariant): Account for length of the characters. * plugin/icedteanp/IcedTeaNPPlugin.cc (plugin_get_documentbase): Same. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (_eval): Print the string's c_str rather than utf8characters. * plugin/icedteanp/IcedTeaPluginUtils.cc (printNPVariant): Account for length of the characters. (NPVariantToString): Same. (isObjectJSArray): Same. 2012-05-30 Jiri Vanek Enabled multiple certificates and extracted variables * Makefile.am: EXPORTED_TEST_CERT by EXPORTED_TEST_CERT_PREFIX and EXPORTED_TEST_CERT_SUFFIX for further composition SIGNED_REPRODUCERS new variable for iterating through signed reproducers SIMPLE_REPRODUCERS new variable for iterating through simple reproducers ALL_REPRODUCER new variable for iterating through all reproducers (junit-jnlp-dist-signed.txt) replaced by (stamps/junit-jnlp-dist-signed.stamp) which generates junit-jnlp-dist-signedX.txt for each directory with signed reproducers (stamps/netx-dist-tests-prepare-reproducers.stamp) (stamps/change-dots-to-paths.stamp) (stamps/netx-dist-tests-compile-testcases.stamp) (run-netx-dist-codecoverage): extracted variables (clean-netx-dist-tests): iterates through all the list and removes them (stamps/netx-dist-tests-sign-some-reproducers.stamp): now iterate through SIGNED_REPRODUCERS and creates special certificate for each member. Each jar from this directory is then signed by corresponding certificate (netx-dist-tests-remove-cert-from-public): iterates through all certificates (stamps/netx-dist-tests-import-cert-to-public): exports each certificate created during tests preparations ($(EXPORTED_TEST_CERT)) replaced by stamps/exported-test-certs.stamp which create for each of SIGNED_REPRODUCERS individual certificate (tests/jnlp_tests/README): mentioned possibility of multiple certificate 2012-05-29 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (getPermissions): New rethrow of exceptions and following condition make more accurate. 2012-05-29 Jiri Vanek Get rid of repeated sout/serr in reproducers testcases/unit tests and introduce bottleneck for loging. * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: (PROCESS_LOG) static flag for enabling/disabling automatic logging of statically executed processes. (logErrorReprint) (logOutputReprint) (logNoReprint) new methods, to call logging bottleneck. (log) main logging bottleneck, reprint message to according stream with calling test-class and test-method as suffix. (getTestMethod) new method to analyze calling test-method. (executeProcess) enhanced for conditional automatic logging of start of process and outputs of process. * tests/jnlp_tests/signed/AppletTestSigned/testcases/AppletTestSignedTests.java: * tests/jnlp_tests/signed/CacheReproducer/testcases/CacheReproducerTest.java: * tests/jnlp_tests/signed/MissingJar/testcases/MissingJarTest.java: * tests/jnlp_tests/signed/ReadPropertiesSigned/testcases/ReadPropertiesSignedTest.java: * tests/jnlp_tests/signed/Spaces can be everywhere signed/testcases/SpacesCanBeEverywhereTestsSigned.java: * tests/jnlp_tests/simple/AccessClassInPackage/testcases/AccessClassInPackageTest.java: * tests/jnlp_tests/simple/AddShutdownHook/testcases/AddShutdownHookTest.java: * tests/jnlp_tests/simple/AllStackTraces/testcases/AllStackTracesTest.java: * tests/jnlp_tests/simple/AppletTest/testcases/AppletTestTests.java: * tests/jnlp_tests/simple/CheckServices/testcases/CheckServicesTests.java: * tests/jnlp_tests/simple/CreateClassLoader/testcases/CreateClassLoaderTest.java: * tests/jnlp_tests/simple/InformationTitleVendorParser/testcases/InformationTitleVendorParserTest.java: * tests/jnlp_tests/simple/ManifestedJar1/testcases/ManifestedJar1Test.java: * tests/jnlp_tests/simple/ReadEnvironment/testcases/ReadEnvironmentTest.java: * tests/jnlp_tests/simple/ReadProperties/testcases/ReadPropertiesTest.java: * tests/jnlp_tests/simple/RedirectStreams/testcases/RedirectStreamsTest.java: * tests/jnlp_tests/simple/ReplaceSecurityManager/testcases/ReplaceSecurityManagerTest.java: * tests/jnlp_tests/simple/SetContextClassLoader/testcases/SetContextClassLoaderTest.java: * tests/jnlp_tests/simple/Spaces can be everywhere/testcases/SpacesCanBeEverywhereTests.java: * tests/jnlp_tests/simple/deadlocktest/testcases/DeadLockTestTest.java: * tests/jnlp_tests/simple/simpletest1/testcases/SimpleTest1Test.java: * tests/jnlp_tests/simple/simpletest2/testcases/SimpleTest2Test.java: * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: * tests/netx/unit/net/sourceforge/jnlp/util/replacements/BASE64EncoderTest.java: all System.out replaced by ServerAccess.logOutputReprint and System.err replaced by ServerAccess.logErrorReprint 2012-05-25 Adam Domurad Changed for-loops over iterators and indices to for-each loops if they were sufficient and clearer. * netx/net/sourceforge/jnlp/JNLPFile.java: Changed for-loops that could be expressed more clearly as for-each loops. * netx/net/sourceforge/jnlp/PluginBridge.java: Same * netx/net/sourceforge/jnlp/ResourcesDesc.java: Same * netx/net/sourceforge/jnlp/cache/CacheUtil.java: Same * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java: Same * netx/net/sourceforge/jnlp/cache/Resource.java: Same * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: Same * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java: Same * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: Same * plugin/icedteanp/java/netscape/javascript/JSObject.java: Same * plugin/icedteanp/java/sun/applet/JavaConsole.java: Same * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Same 2012-05-23 Adam Domurad Removed instances of snprintf where buffer size was not known. Added buffer size constant for allocating buffers for numeric conversions. * plugin/icedteanp/IcedTeaNPPlugin.cc: Removed usage of snprintf for simple blanking of strings. Buffer size was misguided previously. Used NUM_STR_BUFFER_SIZE constant to replace magic numbers/ * plugin/icedteanp/IcedTeaPluginUtils.cc: Made NPVariantToString(NPVariant variant, std::string* result) use two space indentation. Used NUM_STR_BUFFER_SIZE constant to replace magic numbers. * plugin/icedteanp/IcedTeaPluginUtils.h: Added constant, NUM_STR_BUFFER_SIZE. 2012-05-24 Danesh Dadachanji Fix use of src dir instead of build dir when whitelisting. * Makefile.am (REPRODUCERS_CLASS_WHITELIST): Use abs_top_srcdir instead of abs_top_builddir. 2012-05-23 Martin Olsson * plugin/icedteanp/IcedTeaPluginUtils.cc: Tiny fixup for changeset 383; don't do free(stack_variable). 2012-05-20 Jiri Vanek Reproducers engine enhanced for jars in subdirectories by "." naming convention * Makefile.am: (stamps/change-dots-to-paths.stamp) new target to copy jars with dots (.jar omitted) to the java-like package/directory structure in jnlp_test_server (EXPORTED_TEST_CERT) now depends on stamps/change-dots-to-paths.stamp (clean-netx-dist-tests) removes stamps/change-dots-to-paths.stamp too. 2012-05-24 Jiri Vanek Introduced whitelist for reproducers * netx-dist-tests-whitelist: new file, contains regular expressions (separated by space) for expr to select testcases which only will be run. By default set to all by expression .* * Makefile.am: (REPRODUCERS_CLASS_NAMES) When class with testcases is going to be included in list, it is at first check for match in whitelist. If there is no match, will not be included. 2012-05-24 Martin Olsson * plugin/icedteanp/IcedTeaPluginUtils.cc: Fix two typos. 2012-05-23 Deepak Bhole * AUTHORS: Added Martin Olsson to list. 2012-05-23 Martin Olsson * plugin/icedteanp/IcedTeaNPPlugin.cc: Use g_mutex_free instead of g_free to free appletviewer_mutex (fixes crash). 2012-05-23 Deepak Bhole * ChangeLog: Converted spaces to tabs in an older entry 2012-05-23 Jiri Vanek * netx/net/sourceforge/jnlp/resources/Messages.properties: fixed error in PBadNonrelativeUrl 2012-05-23 Jiri Vanek Added more debugging outputs * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (getCodeSourceSecurity): added output message when no SecurityDesc is found for some url/resource * netx/net/sourceforge/jnlp/resources/Messages.properties: added LNoSecInstance and LCertFoundIn values * netx/net/sourceforge/jnlp/security/KeyStores.java: (getPathToKeystore): new method, able to search for file used for creating of KeyStore if possible * netx/net/sourceforge/jnlp/security/CertificateUtils.java: (inKeyStores) using getPathToKeystore for debug output 2012-05-23 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (getPermissions): Any exception from this method is consumed somewhere. I have cough exception, reprint it in debug mode and re-throw (to be lost). Main condition in this method had several possible NullPointer exceptions. Separated and thrown before this condition. 2012-05-23 Jiri Vanek Enhanced about dialog * extra/net/sourceforge/javaws/about/Main.java: Main frame and Main tab renamed from "About NetX" to "About IcedTea-Web and NetX". * extra/net/sourceforge/javaws/about/resources/about.html: mentioned IcedTea-Web. * extra/net/sourceforge/javaws/about/resources/notes.html: List of authors synchronized with AUTHORS, mentioned classpath's IcedTea-Web as homepage of IcedTea-web. 2012-05-23 Jiri Vanek Fixed error in reproducers source preparation * Makefile.am: (stamps/netx-dist-tests-prepare-reproducers.stamp) removed inappropriately used quotes when copying notSrcFiles. Source files now copied only if src dir exists in reproducer 2012-05-22 Adam Domurad Changed allocation of small, fixed-size buffers to stack-based allocations. Changed occurences of sprintf to the safer function snprintf, added buffer information. While unlikely to change functionality, snprintf adds an extra check to prevent buffer overflows. * plugin/icedteanp/IcedTeaNPPlugin.cc: Allocation of small buffers using malloc changed to stack allocation & changed sprintf calls to buffer-size aware snprintf calls. * plugin/icedteanp/IcedTeaPluginUtils.cc: Same as above. 2012-05-22 Jiri Vanek * tests/jnlp_tests/signed/ReadPropertiesSigned/testcases/ReadPropertiesSignedTest.java: * tests/jnlp_tests/simple/AddShutdownHook/testcases/AddShutdownHookTest.java: * tests/jnlp_tests/simple/AllStackTraces/testcases/AllStackTracesTest.java: * tests/jnlp_tests/simple/CreateClassLoader/testcases/CreateClassLoaderTest.java: * tests/jnlp_tests/simple/ReadEnvironment/testcases/ReadEnvironmentTest.java: * tests/jnlp_tests/simple/ReadProperties/testcases/ReadPropertiesTest.java: * tests/jnlp_tests/simple/RedirectStreams/testcases/RedirectStreamsTest.java: * tests/jnlp_tests/simple/ReplaceSecurityManager/testcases/ReplaceSecurityManagerTest.java: * tests/jnlp_tests/simple/SetContextClassLoader/testcases/SetContextClassLoaderTest.java: All exact matches upon AccessControlException replaced by regular expression matching both jdk7 and jdk6 syntax 2012-05-21 Jiri Vanek * Makefile.am: mzilla-filesystem linking targets now counts also with midori and epiphany. Extracted duplicated entries to variables * configure.ac: added check for midori and epiphany 2012-05-21 Jiri Vanek Added detection of installed browsers and added targets to create symbolic links from install dir to browsers' plugin directories. Primarily for testing purposes * Makefile.am: (stamps/user-links.stamp) with alias (links) - new target for creating symlinks for all users. One must be root to execute this target. (stamps/global-links.stamp) with alias (user-links) - new target for creating symlinks for logged user only. Because opera is missing this feature, quite useless for testing or dependence targets, but good for live user. (restore-global-links): target for restoring original global links. One must be root again (restore-user-links): target for restoring user's links * configure.ac: added basic check whether and which browsers are installed 2012-05-18 Jiri Vanek Fixed behavior when encoded/characters needed encoding included in url * NEWS: mentioned PR811 * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (urlEquals) Enhanced to be able compare encoded/decoded urls correctly. (notNullUrlEquals) new method to separate comparing of individual parts of url from null checks * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (addResource) is now encoding url if needed. (normalizeUrl) new method to encode path in url of all except file protocol. (normalizeChunk) New method for encoding of atomic piece. 2012-05-18 Jiri Vanek More tests for Spaces and characters in urls * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: and * netx/net/sourceforge/jnlp/cache/CacheUtil.java: for unit-tests purposes (cacheDir) make to point to tmp dir when no DeploymentConfiguration exists. * tests/jnlp_tests/signed/Spaces can be everywhere signed/: couple of new test doing the same as simple "Spaces can be everywhere" but are signed * tests/jnlp_tests/simple/Spaces can be everywhere/: added new test-cases and html/jnlp test files to try more combinations of encodable characters x launches * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceTrackerTest.java: unittest for url encoder behavior * tests/netx/unit/net/sourceforge/jnlp/cache/CacheUtilTest.java: unittest for urlEquals function 2012-05-17 Adam Domurad Fixed uses of == to compare String objects to .equals where appropriate. Noted a non-obvious use of == to compare a 'magic' String reference. * netx/net/sourceforge/jnlp/JNLPFile.java: Changed calls that compare String contents from == to .equals * plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java: Same * plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java: Same * netx/net/sourceforge/jnlp/Version.java: Added comment explaining why == was used vs .equals 2012-05-14 Jiri Vanek * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: System.out replaced with System.err 2012-05-14 Jiri Vanek * tests/junit-runner/JunitLikeXmlOutputListener.java: fixed indentation and spacing 2012-05-11 Thomas Meyer * tests/netx/unit/net/sourceforge/jnlp/util/PropertiesFileTest.java: Add some unit tests for the PropertiesFile class * tests/netx/unit/net/sourceforge/jnlp/cache/CacheLRUWrapperTest.java: Add some unit tests for the CacheLRUWrapper class * netx/net/sourceforge/jnlp/util/PropertiesFile.java: Use last modification timestamp of the underlying file to lazy load properties. (load): Only reload file, if the file modification timestamp has changed. (store): Actually fsync() the file to disk. * netx/net/sourceforge/jnlp/services/XPersistenceService.java (create): Fix coding style * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java (load): Only check data when the recently_used file was reloaded. 2012-05-02 Jiri Vanek Introduced new annotations Bug (to connect test/reproducer with documentation) and NeedsDisplay which tells the launching engine that this particular test needs Display. Based on ptisnovs's ideas and jtreg experiences * Makefile.am: (JUNIT_RUNNER_JAR), (stamps/run-netx-unit-tests.stamp) and (stamps/run-unit-test-code-coverage.stamp) are now dependent on (stamps/netx-dist-tests-compile) and classpaths inside them have been enriched for JNLP_TESTS_ENGINE_DIR which contains definitions of those annotations * tests/jnlp_tests/simple/CheckServices/testcases/CheckServicesTests.java: and * tests/jnlp_tests/simple/ManifestedJar1/testcases/ManifestedJar1Test.java: and * tests/jnlp_tests/simple/Spaces can be everywhere/testcase/SpacesCanBeEverywhereTests.java: filled Bug annotations * tests/junit-runner/JunitLikeXmlOutputListener.java: made to understand Bug annotation * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/annotations/NeedsDisplay.java: and * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/annotations/Bug.java: annotations definitions * tests/report-styles/jreport.xsl: made nice links from bug annotation prepared by JunitLikeXmlOutputListener 2012-04-24 Omair Majid * Makefile.am (RUNTIME): Add resources.jar. (stamps/run-unit-test-code-coverage.stamp) [WITH_EMMA]: Add resouces.jar to classpath. (stamps/run-reproducers-test-code-coverage.stamp) [WITH_EMMA]: Include resources.jar in classpath. (stamps/bootstrap-directory.stamp): Create a link to resources.jar in BOOT_DIR. 2012-04-19 Omair Majid PR918: java applet windows uses a low resulution black/white icon * NEWS: Update with fix. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Remove windowIcon. (initialize): Do not call loadWindowIcon. (getWindowIcon): Remove. (setWindowIcon): Remove. (loadWindowIcon): Remove. * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java (checkTopLevelWindow): Do not set the icon for all top level windows. Use the default java icon instead. * netx/net/sourceforge/jnlp/util/ImageResources.java: New file. Provides access to icons. * netx/net/sourceforge/jnlp/JNLPSplashScreen.java (JNLPSplashScreen), * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java (getListener), * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java (AdvancedProxySettingsDialog), * netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java (CacheViewer), * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java (ControlPanel), * netx/net/sourceforge/jnlp/security/SecurityDialog.java (SecurityDialog), * netx/net/sourceforge/jnlp/security/viewer/CertificateViewer.java (CertificateViewer), * netx/net/sourceforge/jnlp/util/BasicExceptionDialog.java (show), * plugin/icedteanp/java/sun/applet/JavaConsole.java (initialize): Explicitly load icons. * tests/netx/unit/net/sourceforge/jnlp/util/ImageResourcesTest.java: Test for ImageResources class. 2012-04-18 Jiri Vanek Allowed signed applets in automatic reproducers tests * tests/jnlp_tests/signed/AppletTestSigned/resources/AppletTestSigned.html: html file for launching signed applet. Its style is different from the one for calling unsigned applets - red. * tests/jnlp_tests/signed/AppletTestSigned/resources/AppletTestSigned.jnlp: jnlp file for launched signed applet * tests/jnlp_tests/signed/AppletTestSigned/srcs/AppletTestSigned.java body of signed applet * tests/jnlp_tests/signed/AppletTestSigned/testcases/AppletTestSignedTests.java: (AppletTestSignedTest): testing method to launch signed applet in javaws (AppletTestSignedFirefoxTest): testing method to launch signed applet in browser * Makefile.am: PUBLIC_KEYSTORE_PASS, EXPORTED_TEST_CERT, TEST_CERT_ALIAS, PUBLIC_KEYSTORE PUBLIC_KEYSTORE_PASS: new global variables holding keystores' credentials (clean-local): clean-bootstrap-directory moved to be last one, as keytool is necessary for removing certificate (EXPORTED_TEST_CERT): new target exporting certificate from testing keystore (stamps/netx-dist-tests-import-cert-to-public): new target to import certificate to PUBLIC_KEYSTORE (netx-dist-tests-remove-cert-from-public): new target removing testing certificate from PUBLIC_KEYSTORE (clean-netx-dist-tests): now depends on netx-dist-tests-remove-cert-from-public and is removing EXPORTED_TEST_CERT file 2012-04-17 Jiri Vanek Rewritten DeadLockTestTest to stop failing in more then 1/2 of cases All assassinated processes were hanging as zombies, killed forcibly by kill -9 now. * /tests/jnlp_tests/simple/deadlocktest/testcases/DeadLockTestTest.java: (countJavaInstances) now return pids of found javas. (killDiff) new method killing zombie javas forcibly. 2012-04-11 Jiri Vanek * Makefile.am: EMMA_JAVA_ARGS, new variable for adjusting emma runs. Currently set to -Xmx2G. (stamps/run-unit-test-code-coverage.stamp), (stamps/run-reproducers-test-code-coverage.stamp), (run-test-code-coverage): Use EMMA_JAVA_ARGS in theirs emma runs. 2012-06-04 Jiri Vanek Thomas Meyer * makefile.am: (stamps/run-netx-dist-tests.stamp) and (run-reproducers-test-code-coverage.stamp) now using $(javaws) variable instead of plaintext javaws * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: (checkData) new method checking for sanity of cache entries (load) now checks for data sanity after loading, and stores without corrupted items if necessary (Comparator.compare) for sorting lru items. Now redundant checking for sanity removed * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (getCacheFile) don't call lruHandler.store twice for new cache entries (getCacheFileIfExist) removed iteration and cleaning mechanism * netx/net/sourceforge/jnlp/resources/Messages.properties: modified cache messages * tests/jnlp_tests/signed/CacheReproducer/testcases/CacheReproducerTest.java Added test for checking corrupted path in entry and all tests adapted for exception thrown only in debug mode 2012-04-04 Danesh Dadachanji Change the name of JarSigner to JarCertVerifier to make it more relevant to the purpose of the file. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java * netx/net/sourceforge/jnlp/tools/KeyStoreUtil.java: Replace all instances, paramaters and references of JarSigner by JarCertVerifier. * netx/net/sourceforge/jnlp/security/CertWarningPane.java * netx/net/sourceforge/jnlp/security/CertsInfoPane.java * netx/net/sourceforge/jnlp/security/MoreInfoPane.java * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: Replaced all paramaters, references and variable names of JarSigner to CertVerifier to match the variable object type. * netx/net/sourceforge/jnlp/security/SecurityDialog.java (getJarSigner): Renamed to getCertVerifier as it returns the certVerfier instance. * netx/net/sourceforge/jnlp/tools/JarSigner.java: Renamed to JarCertVerifier. * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java: The rename of JarSigner. 2012-04-05 Jiri Vanek Fixing issue when process was not launched at all and when was killed but left behind living/hanging, fixing mime-types * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: (getContentOfStream) this method overloaded with possibility to specify encoding (I needed to set it to ASCII in one test) (deadlyException) field introduced in ThreadedProcess to record exception caused by impassibility of launching the process. And so process have been null without any sign why. (TinyHttpdImpl) now correctly returns known mime types (ProcessAssasin) can now skip or smoothly (and finally correctly) destroy its process, and all his logging messages were done null-proof (as deadlyException now allows) Asynchronous (ContentReader) have been silenced when complaining about closed streams by Assassin. 2012-04-03 Danesh Dadachanji Change all vendors in JNLP test suite to IcedTea and homepage href's to a link to IcedTea-Web's wiki page. * tests/jnlp_tests/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedJAVAXJNLP.jnlp * tests/jnlp_tests/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedNETSF.jnlp * tests/jnlp_tests/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedSELF.jnlp * tests/jnlp_tests/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedSUNSEC.jnlp * tests/jnlp_tests/signed/CacheReproducer/resources/CacheReproducer1.jnlp * tests/jnlp_tests/signed/CacheReproducer/resources/CacheReproducer1_1.jnlp * tests/jnlp_tests/signed/CacheReproducer/resources/CacheReproducer2.jnlp * tests/jnlp_tests/signed/CacheReproducer/resources/CacheReproducer2_1.jnlp * tests/jnlp_tests/signed/MissingJar/resources/MissingJar.jnlp * tests/jnlp_tests/signed/MissingJar/resources/MissingJar2.jnlp * tests/jnlp_tests/signed/MissingJar/resources/MissingJar3.jnlp * tests/jnlp_tests/signed/MissingJar/resources/MissingJar4.jnlp * tests/jnlp_tests/signed/ReadPropertiesBySignedHack/resources/ReadPropertiesBySignedHack.jnlp * tests/jnlp_tests/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned1.jnlp * tests/jnlp_tests/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned2.jnlp * tests/jnlp_tests/signed/SimpletestSigned1/resources/SimpletestSigned1.jnlp * tests/jnlp_tests/simple/AccessClassInPackage/resources/AccessClassInPackageJAVAXJNLP.jnlp * tests/jnlp_tests/simple/AccessClassInPackage/resources/AccessClassInPackageNETSF.jnlp * tests/jnlp_tests/simple/AccessClassInPackage/resources/AccessClassInPackageSELF.jnlp * tests/jnlp_tests/simple/AccessClassInPackage/resources/AccessClassInPackageSUNSEC.jnlp * tests/jnlp_tests/simple/AddShutdownHook/resources/AddShutdownHook.jnlp * tests/jnlp_tests/simple/AllStackTraces/resources/AllStackTraces.jnlp * tests/jnlp_tests/simple/AppletTest/resources/AppletTest.jnlp * tests/jnlp_tests/simple/CheckServices/resources/CheckServices.jnlp * tests/jnlp_tests/simple/CreateClassLoader/resources/CreateClassLoader.jnlp * tests/jnlp_tests/simple/InformationTitleVendorParser/resources/TitleParser.jnlp * tests/jnlp_tests/simple/InformationTitleVendorParser/resources/TitleVendorParser.jnlp * tests/jnlp_tests/simple/InformationTitleVendorParser/resources/VendorParser.jnlp * tests/jnlp_tests/simple/ManifestedJar1/resources/ManifestedJar-1main2mainAppDesc.jnlp * tests/jnlp_tests/simple/ManifestedJar1/resources/ManifestedJar-1main2mainNoAppDesc.jnlp * tests/jnlp_tests/simple/ManifestedJar1/resources/ManifestedJar-1main2nothingNoAppDesc.jnlp * tests/jnlp_tests/simple/ManifestedJar1/resources/ManifestedJar-1mainHaveAppDesc.jnlp * tests/jnlp_tests/simple/ManifestedJar1/resources/ManifestedJar-1mainNoAppDesc.jnlp * tests/jnlp_tests/simple/ManifestedJar1/resources/ManifestedJar-1noAppDesc.jnlp * tests/jnlp_tests/simple/ManifestedJar1/resources/ManifestedJar-1noAppDescAtAll.jnlp * tests/jnlp_tests/simple/ManifestedJar1/resources/ManifestedJar-1nothing2nothingAppDesc.jnlp * tests/jnlp_tests/simple/ManifestedJar1/resources/ManifestedJar-1nothing2nothingNoAppDesc.jnlp * tests/jnlp_tests/simple/ReadEnvironment/resources/ReadEnvironment.jnlp * tests/jnlp_tests/simple/ReadProperties/resources/ReadProperties1.jnlp * tests/jnlp_tests/simple/ReadProperties/resources/ReadProperties2.jnlp * tests/jnlp_tests/simple/RedirectStreams/resources/RedirectStreams.jnlp * tests/jnlp_tests/simple/ReplaceSecurityManager/resources/ReplaceSecurityManager.jnlp * tests/jnlp_tests/simple/SetContextClassLoader/resources/SetContextClassLoader.jnlp * tests/jnlp_tests/simple/Spaces can be everywhere/resources/Spaces can be everywhere1.jnlp * tests/jnlp_tests/simple/Spaces can be everywhere/resources/Spaces can be everywhere2.jnlp * tests/jnlp_tests/simple/Spaces can be everywhere/resources/SpacesCanBeEverywhere1.jnlp * tests/jnlp_tests/simple/deadlocktest/resources/deadlocktest.jnlp * tests/jnlp_tests/simple/deadlocktest/resources/deadlocktest_1.jnlp * tests/jnlp_tests/simple/simpletest1/resources/simpletest1.jnlp * tests/jnlp_tests/simple/simpletest1/resources/simpletestCustomSplash.jnlp * tests/jnlp_tests/simple/simpletest1/resources/simpletestMegaSlow.jnlp * tests/jnlp_tests/simple/simpletest1/resources/simpletestSlow.jnlp * tests/jnlp_tests/simple/simpletest1/resources/simpletestSlowBrokenCustomSplash.jnlp * tests/jnlp_tests/simple/simpletest1/resources/simpletestSlowSlowCustomSplash.jnlp * tests/jnlp_tests/simple/simpletest2/resources/simpletest2.jnlp: Replaced the specified vendor with IcedTea and homepage with a link to IcedTea-Web's wiki. 2012-04-03 Omair Majid * netx/net/sourceforge/jnlp/runtime/pac-funcs.js: Replace incorrect use of getYear() with getFullYear(). (inYearMonthDateRange): Add missing conditional case. * tests/netx/pac/pac-funcs-test.js (runTest): New function. (runTests): Call runTest. (incDate): Deal with month/year wrapping around. (decDate): Removed. (testDateRange, testDateRange2, testDateRange3): Handle wrapping of month and days. 2012-04-03 Jiri Vanek Tests virtual server thread marked as daemon by default * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: All (ServerLauncher) instances returned by methods were marked as daemon by default. Possibility to change and api were kept. 2012-03-30 Danesh Dadachanji Certificate start dates are not being checked, they are still verified even if the date has yet not been reached. * netx/net/sourceforge/jnlp/tools/JarSigner.java (verifyJar): If the start date is in the future, set notYetValidCert to true. 2012-03-21 Omair Majid * tests/netx/unit/net/sourceforge/jnlp/JNLPMatcherTest.java (testIsMatchDoesNotHangOnLargeData): New method. 2012-03-21 Lars Herschke PR898: signed applications with big jnlp-file doesn't start * netx/net/sourceforge/jnlp/JNLPMatcher.java (JNLPMatcher): Handle large files correctly. 2012-03-19 Danesh Dadachanji Fix failing unit test missing title/vendor tags in the JNLP stream. * tests/netx/unit/net/sourceforge/jnlp/ParserCornerCases.java (testNestedComments): Added title and vendor tags to malformedJnlp. 2012-03-19 Jiri Vanek * tests/jnlp_tests/signed/CacheReproducer/testcases/CacheReproducerTest.java: as javaws have now integrated splash, I have changed this test to lunch javaws -Xclearcache with -headless to skip this logo (although it is not fatal fr testrun itself) * tests/jnlp_tests/simple/AppletTest/resources/appletAutoTests.html: this html file is lunched during tests run in browser and stdout of lunched applet is examined. Is lunched with slow resources to test spalshscreen * tests/jnlp_tests/simple/AppletTest/resources/appletViewTest.html: this test html file is dedicated to manual lunch and let user to look how the applet (with slow loading) is loaded and how looks splashscreen in small mode and in large mode * tests/jnlp_tests/simple/AppletTest/testcases/AppletTestTests.java: test is enriched for lunching the html file with applet in browser and is examining output of this file. Browser must be always terminated as there is no way how to close from inside * tests/jnlp_tests/simple/simpletest1/resources/netxPlugin.png: image to let user observe that user-defined splashscreen is still working even when internal splashscreen is enabled * tests/jnlp_tests/simple/simpletest1/resources/simpletestCustomSplash.jnlp: this and all jnlp files below are just for manual lunching and for watching various lunches of splash screen - slow loading of resources and with custom splash * tests/jnlp_tests/simple/simpletest1/resources/simpletestMegaSlow.jnlp: slow loading of resource and (XslowX)jnlp also * tests/jnlp_tests/simple/simpletest1/resources/simpletestSlow.jnlp: slow loading of resource * tests/jnlp_tests/simple/simpletest1/resources/simpletestSlowBrokenCustomSplash.jnlp: slow loading of resource with broken user's splash (our internal will be used) * tests/jnlp_tests/simple/simpletest1/resources/simpletestSlowSlowCustomSplash.jnlp: slow loading of custom splash screen and resource * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: Main server launcher was modified to support lunching of browser, stdout listteners and for slowing download of resources to provide time for watching splash screen (main) was rewritten to provide free port OR run server in-D specified directory on custom or default port - very useful for debuging reproducers (getIndependentInstance) can now run also on specified port and (or) directory (USED_BROWSER_COMMAND) new constant handling value of -D property to set browser = "used.browser.command"; (getBrowserLocation) new method to provide specified (by used.browser.command -D property) or default browser location (firefox) (ensureServer) test is testing weather XslowXmodifier is working (executeBrowser) set of overloaded functions to lunch browser (TinyHttpdImpl) was enriched for XslowX modifier. When resource starts with this, is returned slowly - splited to 10 parts with 1s delay betwen sending each of them. Although it is throwing BrokenPipe exception, is working fine. (splitArray) new function to split array of byte to n arrays of bytes, which when concated do the same array (splitArrayTestN) set of tests for splitArray (ContentReader) now can also have lsteners for catching outputs n runtime. * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ContentReaderListener.java: Listener for catching chars and lines form processes outputs * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ResourcesTest.java: added (testListeners) to test listeners behaviour 2012-03-16 Danesh Dadachanji Applications using JNLP files without a title or vendor section still run, despite them being required elements. * netx/net/sourceforge/jnlp/Parser.java: (getInformationDesc): If title or vendor are not found in info, a new ParseException is thrown. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added PNoTitleElement and PNoVendorElement * tests/jnlp_tests/simple/InformationTitleVendorParser/resources/InformationParser.jnlp, * tests/jnlp_tests/simple/InformationTitleVendorParser/resources/TitleParser.jnlp, * tests/jnlp_tests/simple/InformationTitleVendorParser/resources/TitleVendorParser.jnlp, * tests/jnlp_tests/simple/InformationTitleVendorParser/resources/VendorParser.jnlp, * tests/jnlp_tests/simple/InformationTitleVendorParser/testcases/TitleVendorParserTest.java: New test that runs JNLPs in a combination of missing information, title and vendor tags, checking for the appropriate exceptions. 2012-03-14 Deepak Bhole Omair Majid PR895: IcedTea-Web searches for missing classes on each loadClass or findClass * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (CodeBaseClassLoader): Added new map to track resources that are not found. (findClass): If resource was not found before, return immediately. If resource was not found for the first time, record it in the new map. (findResouces): Same. (findResource): Same. * tests/netx/unit/net/sourceforge/jnlp/runtime/CodeBaseClassLoaderTest.java: Test case for PR895 from Omair Majid. 2012-03-14 Omair Majid Print exceptions to terminal when running in gui mode too. * netx/net/sourceforge/jnlp/AbstractLaunchHandler.java: New file. * netx/net/sourceforge/jnlp/DefaultLaunchHandler.java: Extend AbstractLaunchHandler. (DefaultLaunchHandler): New method. (printMessage): Moved to parent class. * netx/net/sourceforge/jnlp/GuiLaunchHandler.java: Extend AbstractLaunchHandler. (GuiLauchHandler): New method. (launchError): Print the error too. (launchWarning,validationError): Call parent's printMessage. * netx/net/sourceforge/jnlp/LaunchException.java: Use standard java exception chaining. This removes compatibility with pre-java 1.3 class libraries. (LaunchException(JNLPFile,Exception,String,String,String,String)): Pass cause to parent so exceptions are chanined properly. (LaunchException(String,Throwable),LaunchException(Throwable)): Call parent's constructor. (printStackTrace(PrintStream),printStackTrace(PrintWriter),getCause): Removed. Use parent's implementation instead. (getCauses): Removed. * netx/net/sourceforge/jnlp/LaunchHandler.java (validationError): Rename argument to clarify meaing. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Redirect output of all handlers to System.err. * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java (PluginAppletSecurityContext): Likewise. * tests/netx/unit/net/sourceforge/jnlp/DefaultLaunchHandlerTest.java, * tests/netx/unit/net/sourceforge/jnlp/LaunchExceptionTest.java: New file. Contains tests. 2012-03-12 Danesh Dadachanji Adding test for regression of JNLP API accessibility in constructor methods of applets. * Makefile.am: Added classes.jar to classpath when compiling jnlp_tests. * tests/jnlp_tests/simple/CheckServices/resources/CheckServices.jnlp: * tests/jnlp_tests/simple/CheckServices/srcs/CheckServices.java: * tests/jnlp_tests/simple/CheckServices/testcases/CheckServicesTests.java: New test file added. Tests ServiceManager is setup correctly when called from applet constructors. 2012-03-12 Danesh Dadachanji Update tests that are missing title/vendor tag in their JNLPs. * tests/jnlp_tests/signed/CacheReproducer/resources/CacheReproducer1.jnlp, * tests/jnlp_tests/signed/CacheReproducer/resources/CacheReproducer1_1.jnlp, * tests/jnlp_tests/signed/CacheReproducer/resources/CacheReproducer2.jnlp, * tests/jnlp_tests/signed/CacheReproducer/resources/CacheReproducer2_1.jnlp, * tests/jnlp_tests/signed/MissingJar/resources/MissingJar.jnlp, * tests/jnlp_tests/signed/MissingJar/resources/MissingJar2.jnlp, * tests/jnlp_tests/signed/MissingJar/resources/MissingJar3.jnlp, * tests/jnlp_tests/signed/MissingJar/resources/MissingJar4.jnlp, * tests/jnlp_tests/signed/ReadPropertiesBySignedHack/resources/ReadPropertiesBySignedHack.jnlp, * tests/jnlp_tests/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned1.jnlp, * tests/jnlp_tests/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned2.jnlp, * tests/jnlp_tests/simple/AddShutdownHook/resources/AddShutdownHook.jnlp, * tests/jnlp_tests/simple/AllStackTraces/resources/AllStackTraces.jnlp * tests/jnlp_tests/simple/CreateClassLoader/resources/CreateClassLoader.jnlp, * tests/jnlp_tests/simple/ReadEnvironment/resources/ReadEnvironment.jnlp, * tests/jnlp_tests/simple/ReadProperties/resources/ReadProperties1.jnlp, * tests/jnlp_tests/simple/ReadProperties/resources/ReadProperties2.jnlp, * tests/jnlp_tests/simple/RedirectStreams/resources/RedirectStreams.jnlp, * tests/jnlp_tests/simple/ReplaceSecurityManager/resources/ReplaceSecurityManager.jnlp, * tests/jnlp_tests/simple/SetContextClassLoader/resources/SetContextClassLoader.jnlp, * tests/netx/unit/net/sourceforge/jnlp/templates/template8.jnlp: Added missing title/vendor tags that make them fail with this changeset. 2012-03-05 Jiri Vanek Added test for main-class in manifest for jnlp * Makefile.am: (prepare-reproducers.stamp) fixed manifest handling. Till now was manifest copied as any other non java file, and so was rewritten by jar tool * tests/jnlp_tests/simple/ManifestedJar2/srcs: secondary jar file which should have manifest and so should help ManifestedJar1 with testing * tests/jnlp_tests/simple/ManifestedJar2/resources/META-INF/MANIFEST.MF: manifest for ManifestedJar2.jar * tests/jnlp_tests/simple/ManifestedJar1/srcs: main testing jar * tests/jnlp_tests/simple/ManifestedJar2/resources/META-INF/MANIFEST.MF: manifest for ManifestedJar1.jar * tests/jnlp_tests/simple/ManifestedJar1/testcases/ManifestedJar1Test.java: testing class for this reproducers * tests/jnlp_tests/simple/ManifestedJar1/resources/: nine reproducers jnlps 2012-03-06 Jiri Vanek Improved reflection test: * tests/jnlp_tests/simple/AccessClassInPackage/testcases/AccessClassInPackageTest.java: This testcase was extended for three more unsigned reflection tries and four signed * tests/jnlp_tests/simple/AccessClassInPackage/srcs/AccessClassInPackage.java: now accepting class to be findByName as argument. Four new jnlp files in signed a four in simple are then passing those argument * tests/jnlp_tests/simple/AccessClassInPackage/resources/AccessClassInPackageSUNSEC.jnlp: * tests/jnlp_tests/simple/AccessClassInPackage/resources/AccessClassInPackageNETSF.jnlp: * tests/jnlp_tests/simple/AccessClassInPackage/resources/AccessClassInPackageJAVAXJNLP.jnlp: * tests/jnlp_tests/simple/AccessClassInPackage/resources/AccessClassInPackageSELF.jnlp: * tests/jnlp_tests/simple/AccessClassInPackage/resources/AccessClassInPackage.jnlp: removed * tests/jnlp_tests/signed/AccessClassInPackageSigned/srcs/AccessClassInPackageSigned.java signed variation of AccessClassInPackage, tescase is also in AccessClassInPackage * tests/jnlp_tests/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedSELF.jnlp * tests/jnlp_tests/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedNETSF.jnlp * tests/jnlp_tests/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedSUNSEC.jnlp * tests/jnlp_tests/signed/AccessClassInPackageSigned/resources/AccessClassInPackageSignedJAVAXJNLP.jnlp 2012-02-29 Deepak Bhole * configure.ac: Bumped version to 1.3pre 2012-02-29 Deepak Bhole * netx/net/sourceforge/jnlp/security/CertificateUtils.java (inKeyStores): Only check for certificate equality. 2012-02-28 Deepak Bhole * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (checkForMain): Also check manifest file of main jar. (getMainClassName): New method. Looks in a jar manifest to see if there is a Main-Class specified. 2012-02-28 Deepak Bhole * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (_eval): Return 0 id to Java side if eval fails. (_call): Return 0 id to Java side if call fails. 2012-02-27 Matthias Klose * acinclude.m4 (IT_CHECK_PLUGIN_DEPENDENCIES): Use the mozilla-plugin pkgconfig module if the libxul module is not available. 2012-02-27 Matthias Klose * acinclude.m4 (IT_FIND_JAVA): Set VERSION_DEFS. * Makefile.am ($(PLUGIN_DIR)/%.o): Pass $(VERSION_DEFS) * IcedTeaNPPlugin.cc (PLUGIN_MIME_DESC): Define in terms of HAVE_JAVA7. 2012-02-27 Thomas Meyer Deepak Bhole PR820: IcedTea-Web 1.1.3 crashing Firefox when loading Citrix XenApp * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc (createJavaObjectFromVariant): If variant is a generic object array, create a JSObject on Java side instead of JSObject array. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (newMessageOnBus): Run finalize on main thread. (eval): Create Java object in _eval (call): Create Java object in _call. (setMember): Create Java object in _setMember. (sendMember): Create Java object in _getMember. (sendString): Create Java object in _getString. (_setMember): Process result and create Java object if needed. (_getMember): Same. (_eval): Same. (_call): Same. (_getString): Same. 2012-02-22 Danesh Dadachanji Add ability to check for jnlp_href use outside of PluginBridge. * netx/net/sourceforge/jnlp/PluginBridge.java (PluginBridge): New boolean useJNLPHref is set if jnlp_href is used. (useJNLPHref): New getter method, returns boolean useJNLPHref. 2012-02-10 Danesh Dadachanji Fix path to NEW_LINE_IFS for when one builds outside of src directory. * Makefile.am: Use top src directory instead of top build directory for NEW_LINE_IFS 2012-02-06 Danesh Dadachanji Fixed regression in running webstart applets from JNLP files. * netx/net/sourceforge/jnlp/Launcher.java (createApplet): Added call to set applet variable in the AppletInstance's AppletEnvironment. * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java (setApplet): New method, set AppletEnvironment's applet variable only once. 2012-02-02 Danesh Dadachanji * netx/net/sourceforge/jnlp/LaunchException.java: Fix message to handle null description 2012-02-01 Danesh Dadachanji * netx/net/sourceforge/jnlp/LaunchException.java: Add description parameter to the message the exception stores. 2012-02-01 Jiri Vanek Fix for PR844 * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: (getLRUSortedEntries) instead of error throwing own LRU exception. Also catches more then NumberFormatException (clearLRUSortedEntries) new method - making soft clearing of cache public (clearCache) now return true if cache was cleared, false otherwise (or exception) * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (getCacheFileIfExist) does three tires to load cache. If ifrst fails, then recently_used file is emptied both in memory and on disc. When second attemmpt fails, then LRU cache is forcibly cleared. if clearing fails, then error is thrown. If it pass, then one more try to load entries is allowed. When third attempt fails, then error is thrown. * /netx/net/sourceforge/jnlp/cache/LruCacheException.java: new file, for purpose of catching this particular exception * netx/net/sourceforge/jnlp/util/PropertiesFile.java: (store) tries to mkdirs to its path. It is better then to fail when no cache directory exists. * tests/jnlp_tests/signed/CacheReproducer: new reproducr trying severals way of corupted cache on several types of jnlp files. Is signed because of reflection used. * tests/jnlp_tests/signed/SimpletestSigned1: signed hello world to be used in CacheReproducer tests. * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: timeout for processes doubled, as clear cache methods sometimes took more then original allowed. 2012-01-27 Deepak Bhole PR852: Classloader not being flushed after last applet from a site is closed * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Added variable to count usage for a given ClassLoader instance. (getInstance): Decrement use count for a loader after it is merged with another. Increment loader use count before returning. (incrementLoaderUseCount): New method. Increments loader use count. (decrementLoaderUseCount): New method. Decrements loader use count. * java/sun/applet/PluginAppletViewer.java (appletClose): Decrement loader use count when applet is closed. 2012-01-25 Jiri Vanek Added test for -Xnofork option and for applet launching by jnlp * tests/jnlp_tests/simple/deadlocktest/resources/deadlocktest_1.jnlp: new file By specifying new max heap size, should invoke jvm to fork when launched * tests/jnlp_tests/simple/deadlocktest/srcs/DeadlockTest.java: improved indentation, added debug output that main method was lunched * tests/jnlp_tests/simple/deadlocktest/testcases/DeadLockTestTest.java: small refactoring, add lunching of deadlocktest_1.jnlp with and without -Xnofork, and counting java instances during runtime * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java (ThreadedProcess.run) fixed situation, when process ended, but not all the output was read by its stdout/stderr readers (ContentReader.run) enabled exception printing to stderr. * tests/jnlp_tests/simple/AppletTest/ : test for loading applets by jnlp file 2012-01-06 Danesh Dadachanji Use the JNLP file's information section for the Name and Publisher labels of access dialogs, if available. * netx/net/sourceforge/jnlp/PluginBridge.java: (PluginBridge): Assigned info variable to JNLP file's information section (if one is used), otherwise to a new, empty ArrayList. (getInformation): Removed method, superclass method should be used instead. * netx/net/sourceforge/jnlp/resources/Messages.properties: Adding SUnverified. * a/netx/net/sourceforge/jnlp/security/AccessWarningPane.java: (addComponents): Append unverified note to the publisher label. 2012-01-09 Deepak Bhole PR838: IcedTea plugin crashes with chrome browser when javascript is executed * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (eval): Added a check to ensure that the result pointer is valid before attempting to create an NPVariant from it. 2012-01-05 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeResources): Only throw exceptions about the main class not being found when the jnlp file can have a main class. (addToCodeBaseLoader): Dont try to process null URLs. 2011-12-15 Jiri Vanek * configure.ac: added search for xsltproc program and setting WITH_XSLTPROC variable * Makefile.am: xsltproc result is no longer ignored, command itself is in conditional block 2011-12-22 Thomas Meyer * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc(sendMember): Use correct response parameter when returning array member vs member itself. 2011-12-21 Thomas Meyer RH586194: Unable to connect to connect with Juniper VPN client * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc(sendMember): Use createJavaObjectFromVariant to create the resulting object on Java side, rather than always creating a JSObject. 2011-12-21 Jiri Vanek * acinclude.m4: added definition of IT_CHECK_XULRUNNER_API_VERSION, which tries to compile small program against new xulrunner api * configure.ac: added call of IT_CHECK_XULRUNNER_API_VERSION * plugin/icedteanp/IcedTeaNPPlugin.cc: (NP_GetMIMEDescription) return type set-up by dependency on defined LEGACY_XULRUNNERAPI. This one is set by IT_CHECK_XULRUNNER_API_VERSION during configure. if defined, then old char* is used. New const char* is used otherwise. 2011-12-19 Danesh Dadachanji Fix for BasicService being used in applet constructors but not having access to ApplicationInstance variable. * netx/net/sourceforge/jnlp/Launcher.java: (createApplet): Moved applet initialization below loader.setApplication, appletInstance is now initialized with applet param as null. * netx/net/sourceforge/jnlp/runtime/AppletInstance.java: (setApplet): New method, allows setting of AppletInstance's applet only once. 2011-12-16 Deepak Bhole Patch from Thomas Meyer * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: Fixed function name in comment for sendMember. 2011-12-08 Omair Majid * netx/net/sourceforge/jnlp/Launcher.java (launchApplication): Print arguments being passed to the application's main method in debug mode. 2011-12-05 Danesh Dadachanji Update UI for AccessWarningPane * netx/net/sourceforge/jnlp/security/AccessWarningPane.java: Use question.png instead of warning.png for access dialogs. 2011-11-28 Jiri Vanek Added code-coverage generation targets * configure.ac: added search for optional emma.jar * makefile.am: added UNIT_CLASS_NAMES and REPRODUCERS_CLASS_NAMES variables to store tests clases for reuse in emmarun. Both also moved to separate target (run-netx-unit-tests): made dependent on reused stamped version (run-netx-dist-tests): made dependent on reused stamped version (stamps/run-netx-dist-tests): stamped rusable version of run-netx-dist-tests (run-unit-test-code-coverage) targets to generate report from unit-tests. Result binary and xml file and html report in tests.build/netx/unit (run-reproducers-test-code-coverage) targets to generate report from reproducers-test. Result binary file, xml and html report in tests.build/netx/jnlp_testsengine (run-test-code-coverage): merges binary results from unit and reproducers (clean-unit-test-code-coverage) conditionaly removes html,xml report and es and ec files from tests.build/netx/unit (clean-reproducers-test-code-coverage) condtionlay removes html and xml report and es file from tests.build/netx/jnlp_testsengine (clean-test-code-coverage) conditionlay removes merged html, xml es and em files from tests.build (clean-netx-tests) now depends also on clean-test-code-coverage 2011-11-11 Jiri Vanek Added reproducer for PR804 and PR8011 * tests/jnlp_tests/simple/Spaces can be everywhere/resources/Spaces can be everywhere1.jnlp: new jnlp file with space in name and with jar in resources which name does not contain spaces * tests/jnlp_tests/simple/Spaces can be everywhere/resources/Spaces can be everywhere2.jnlp: new jnlp file with space in name and with jar in resources which name contains spaces * tests/jnlp_tests/simple/Spaces can be everywhere/resources/SpacesCanBeEverywhere1.jnlp: jnlp file without space in name but with jar in resources which name contains spaces * tests/jnlp_tests/simple/Spaces can be everywhere/srcs/SpacesCanBeEverywhere.java: new file containig simple main method of "Spaces can be everywhere.jar" jar * tests/jnlp_tests/simple/Spaces can be everywhere/testcases/SpacesCanBeEverywhereTests.java testcase for this reproducer. It is lunching each of this jnlp once locally from filesystem and once remotely from server. Please note that except it's own jar, this reproducer is also using simpletest1.jar 2011-11-11 Jiri Vanek Fixed reproducers engine to handle spaces in files and in urls * Makefile.am: (stamps/netx-dist-tests-prepare-reproducers.stamp) (stamps/netx-dist-tests-sign-some-reproducers.stamp) (stamps/netx-dist-tests-compile-testcases.stamp): added call to NEW_LINE_IFS to use line breake temporarily as parameter separator while loading files from list and correct quoting * NEW_LINE_IFS: new file, small separate script used in makefile as inline script which backup original IFS variable and then set it to pure new line. It is in separate file because it is reused and I do not know another way how to save a new line variable in makefile. Restore to original vlaue is handled in Makefile * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ResourcesTest.java: (testResourcesExists) filename is encoded to correct URL before requested from server * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: "-headless" string extracted to variable HEADLES_OPTION (executeProcess) and (ThreadedProcess) enhanced for variable dir to specify working directory. Backward compatibility kept (TinyHttpdImpl) now expects url on requests, so all requests are now decoded by java.net.URLDecoder 2011-11-10 Jiri Vanek Added tests which covers corner cases or rhino support function dateRange Enabled testWeekdayRange test * tests/netx/pac/pac-funcs-test.js: (testWeekdayRange) - added mising runTests call (incDate) (decDate) (monthToStr) moved level up from function scope to be shareable (testDateRange2) new method, tests last days of months. (testDateRange3) new method, tests first days of months * netx/net/sourceforge/jnlp/runtime/pac-funcs.js: (dateRange) logic of this method moved to isDateInRange. This one now serve just as api using current date (isDateInRange) logic of dateRange, can calculate ranges against any date 2011-10-31 Omair Majid PR808: javaws is unable to start when missing jars are enumerated before main jar * NEWS: Update. * netx/net/sourceforge/jnlp/tools/JarSigner.java (verifyJars): Continue with other jars if the first jar can't be used. 2011-10-28 Deepak Bhole RH742515, CVE-2011-3377: IcedTea-Web: second-level domain subdomains and suffix domain SOP bypass * NEWS: Updated * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java (checkPermission): Remove special case for SocketPermission. 2011-10-27 Deepak Bhole PR778: Jar download and server certificate verification deadlock * ChangeLog: Removed extra whitespace from previous entries * NEWS: Updated * netx/net/sourceforge/jnlp/GuiLaunchHandler.java (launchInitialized): Moved as much code as possible out of the invokeLater block. 2011-10-25 Omair Majid PR804: javaws launcher incorrectly handles file names with spaces * NEWS: Update. * launcher/javaws.in: Use bash arrays to store arguments to handle filenames with spaces correctly. 2011-10-24 Jiri Vanek Added reproducer for - PR788: Elluminate Live! is not working * tests/jnlp_tests/signed/MissingJar/resources/MissingJar.jnlp * tests/jnlp_tests/signed/MissingJar/resources/MissingJar2.jnlp * tests/jnlp_tests/signed/MissingJar/resources/MissingJar3.jnlp * tests/jnlp_tests/signed/MissingJar/resources/MissingJar4.jnlp four testcases's jnlp files. Differs by order and by used resoure tags * tests/jnlp_tests/signed/MissingJar/srcs/MissingJar.java very simple main jar, just printing message when initialized * tests/jnlp_tests/signed/MissingJar/testcases/MissingJarTest.java testing file of reproducer, launchiing above four jnlp files, each in individual test 2011-10-17 Jiri Vanek PR564: NetX depends on sun.misc.BASE64Encoder * configure.ac: removed IT564 comment, removed check for sun.misc.BASE64Encoder * netx/net/sourceforge/jnlp/security/CertificateUtils.java : sun.misc.BASE64Encoder; replaced (just changed import) by internal implementation from net.sourceforge.jnlp.util.replacements.BASE64Encoder; * netx/net/sourceforge/jnlp/util/replacements/BASE64Encoder.java: * netx/net/sourceforge/jnlp/util/replacements/CharacterEncoder.java: New files, internal implementation of BASE64Encoder, copied from OpenJDK * tests/netx/unit/net/sourceforge/jnlp/util/replacements/BASE64EncoderTest.java New file, to test internal base64encoder implementation 2011-10-03 Jiri Vanek * tests/jnlp_tests/signed/ReadPropertiesBySignedHack/resources/ReadPropertiesBySignedHack.jnlp * tests/jnlp_tests/signed/ReadPropertiesBySignedHack/srcs/ReadPropertiesBySignedHack.java * tests/jnlp_tests/signed/ReadPropertiesBySignedHack/testcases/ReadPropertiesBySignedHackTest.java * tests/jnlp_tests/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned1.jnlp * tests/jnlp_tests/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned2.jnlp * tests/jnlp_tests/signed/ReadPropertiesSigned/srcs/ReadPropertiesSigned.java * tests/jnlp_tests/signed/ReadPropertiesSigned/testcases/ReadPropertiesSignedTest.java Direcory signed was somehow missing from my commit from 2011-09-22. Now it have been added with all its original files 2011-09-29 Omair Majid PR618: Can't install OpenDJ, JavaWebStart fails with Input stream is null error. * NEWS: Update. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getResource): Rename to ... (findResource): New method. (findResources): If resource can not be found, search in lazy resources. (findResourcesBySearching): New method. 2011-09-28 Omair Majid * netx/net/sourceforge/jnlp/AppletDesc.java (getMainClass): Clarify the return value in javadoc. * netx/net/sourceforge/jnlp/Launcher.java (createApplet, createAppletObject): Do not replace '/' with '.'. * netx/net/sourceforge/jnlp/PluginBridge.java (PluginBridge): Ensure that the class name is in the dot-separated from. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (checkForMain): Ensure that the name is an exact match. 2011-09-28 Deepak Bhole PR794: IcedTea-Web does not work if a Web Start app jar has a Class-Path element in the manifest. * netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java (retrieve): Blank out the Class-Path elements in manifest. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (activateJars): Only load Class-Path elements if this is an applet. (addNewJar): Add the right permissions for the cached jar file and verify signatures. 2011-09-26 Lars Herschke * netx/net/sourceforge/jnlp/resources/Messages.properties: Add CVExportPasswordMessage, CVImportPasswordMessage and CVPasswordTitle. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Initialize SSLContext with the user's client certificates. * netx/net/sourceforge/jnlp/security/CertificateUtils.java (addPKCS12ToKeyStore, addPKCS12ToKeyStore, dumpPKCS12): New methods. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java (getPasswords): New method. (ImportButtonListener.actionPerformed): Import client certificates in PKCS12 format. (ExportButtonListener.actionPerformed): Export client certificates in PKCS12 format. 2011-09-23 Omair Majid RH738814: Access denied at ssl handshake * netx/net/sourceforge/jnlp/security/SecurityDialogs.java (showCertWarningDialog): Add a javadoc comment. * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java (askUser): Wrap the call to showCertWarningDialog in a doPrivileged block. 2011-09-22 Omair Majid PR788: Elluminate Live! is not working * NEWS: Update. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (checkForMain): If localFile is null (JAR couldn't be downloaded), try to continue, rather than allowing the exception to cause an abort. 2011-09-21 Omair Majid PR766: javaws fails to parse an node that contains CDATA * netx/net/sourceforge/nanoxml/XMLElement.java (sanitizeInput): Do not remove CDATA sections along with comments. 2011-09-20 Omair Majid * tests/netx/unit/net/sourceforge/jnlp/ParserCornerCases.java (testCdata, testCdataNested, testCDataFirstChild, testCDataSecondChild) (testCommentInElements2, testDoubleDashesInComments): New methods * tests/netx/unit/net/sourceforge/jnlp/application/application0.jnlp, * tests/netx/unit/net/sourceforge/jnlp/templates/template0.jnlp: Change PR789: typo in jrunscript.sh * jrunscript.in: Use = instead of ==. 2011-09-22 Jiri Vanek * tests/jnlp_tests/signed/ReadPropertiesBySignedHack/resources/ReadPropertiesBySignedHack.jnlp: jnlp file to lunch ReadPropertiesBySignedHack, notice please dependenci on ReadProperties.jar from simple reproducers * tests/jnlp_tests/signed/ReadPropertiesBySignedHack/srcs/ReadPropertiesBySignedHack.java: this reproducers verify, that even reflection-by enabled XtrustAll will not allow to lunch unsigned code * tests/jnlp_tests/signed/ReadPropertiesBySignedHack/testcases/ReadPropertiesBySignedHackTest.java: testcase for this reproducer 2011-09-22 Jiri Vanek * tests/jnlp_tests/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned1.jnlp: * tests/jnlp_tests/signed/ReadPropertiesSigned/resources/ReadPropertiesSigned2.jnlp: * tests/jnlp_tests/signed/ReadPropertiesSigned/testcases/ReadPropertiesSignedTest.java: * tests/jnlp_tests/signed/ReadPropertiesSigned/srcs/ReadPropertiesSigned.java: those four files are example of signed reproducer * tests/jnlp_tests/simple/ReadProperties/srcs/ReadProperties.java: now prints out got variable for comparsion with above created signed example 2011-09-22 Jiri Vanek Added signed reproducers engine * Makefile.am: added variable KEYSTORE_NAME (stamps/junit-jnlp-dist-dirs): creates stamp and depend on next two targets (junit-jnlp-dist-simple.txt): creates list of simple reproducers, extracted from stamps/junit-jnlp-dist-dirs (junit-jnlp-dist-signed.txt): creates list of signed reproducers (stamps/netx-dist-tests-prepare-reproducers.stamp): now traverse over signed and simple (stamps/netx-dist-tests-sign-some-reproducers.stamp): depends on netx-dist-tests-prepare-reproducers, traverse through signed reproducers and sign them (stamps/netx-dist-tests-compile-testcases.stamp): now traverse over signed and simple (stamps/bootstrap-directory.stamp): creates symlinks/stubs to jarsigner and keytool (clean-netx-dist-tests):remove new stamps, signed and simple list and keysstore * acinclude.m4: declared to proceed IT_FIND_KEYTOOL and IT_FIND_JARSIGNER macro * configure.ac: declared macros to check for keytool and jarsigner * tests/jnlp_tests/README: mentioned signed directory 2011-09-22 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/Boot.java: (main): added logic to handle -Xtrustall option * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: declared private static boolean trustAll=false; with public getter and pkg.private setter * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (checkTrustWithUser): modified, when XtrustAll declared, then user is not asked and certificate is trusted * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java: (askUser): modified, when XtrustAll declared, then user is not asked and certificate is trusted 2011-09-15 Jiri Vanek * tests/jnlp_tests/: all current reproducers (AccessClassInPackage AddShutdownHook AllStackTraces CreateClassLoader deadlocktest ReadEnvironment ReadProperties RedirectStreams ReplaceSecurityManager SetContextClassLoader simpletest1 simpletest2) junit's asserts are enchanted for reason, so junit assertion exception message is much clearer. 2011-09-13 Deepak Bhole PR782: Support building against npapi-sdk as well Patch from MichaХ‚ GУГrny < mgorny at gentoo dot org > * acinclude.m4: Build against npapi-sdk. 2011-09-13 Deepak Bhole * ChangeLog: Fixed formatting issues in previous entry. 2011-09-01 Jiri Vanek Added functionality to allow icedtea web to be buildable with rhel5 libraries. * configure.ac: added IT_CHECK_GLIB_VERSION check. * acinclude.m4: added IT_CHECK_GLIB_VERSION definition block to test. version of glib installed and add LEGACY_GLIB define macro into variable DEFS if version is <2.16. * plugin/icedteanp/IcedTeaNPPlugin.cc: added replacements for incompatible functions (g_strcmp0 and find_first_item_in_hash_table)if LEGACY_GLIB is defined. Added define sections for use this function instead of glib ones. Duplicated code moved into function getFirstInTableInstance(GHashTble* table). * Makefile.am: ($(PLUGIN_DIR)/%.o): using DEFS setted by configure for compilation 2011-08-29 Deepak Bhole RH734081: Javaws cannot use proxy settings from Firefox Based on patch from Lukas Zachar * netx/net/sourceforge/jnlp/browser/FirefoxPreferencesFinder.java (find): Only process Profile sections. Do not throw an exception if a Default= line is not found since it is not guaranteed to exist. 2011-08-24 Deepak Bhole RH718693: MindTerm SSH Applet doesn't work * plugin/icedteanp/java/netscape/security/PrivilegeManager.java: New file. Stub class, not needed with IcedTea-Web. 2011-08-23 Deepak Bhole PR769: IcedTea-Web plugin does not work with some ssl sites with OpenJDK7 * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java (checkServerTrusted): Account for a null hostname that the overloaded implementation may pass. 2011-08-23 Omair Majid * configure.ac: Add check for new non-standard classes sun.net.www.protocol.jar.URLJarFile and sun.net.www.protocol.jar.URLJarFileCallBack. 2011-08-23 Omair Majid * Makefile.am: Remove JRE. Replace uses with SYSTEM_JRE_DIR instead. Also replace uses of SYSTEM_JDK_DIR/jre with SYSTEM_JRE_DIR. * acinclude.m4 (IT_CHECK_FOR_JRE): New macro. (IT_FIND_JAVA): Require IT_CHECK_FOR_JRE. Use java binary from within the JRE. 2011-08-22 Saad Mohammad * netx/net/sourceforge/jnlp/JNLPFile.java: (parse): After the file has been parsed, it calls checkForSpecialProperties() to check if the resources contain any special properties. (checkForSpecialProperties): Scans through resources and checks if it contains any special properties. (requiresSignedJNLPWarning): Returns a boolean after determining if a signed JNLP warning should be displayed. (setSignedJNLPAsMissing): Informs JNLPFile that a signed JNLP file is missing in the main jar. * netx/net/sourceforge/jnlp/SecurityDesc.java: (getJnlpRIAPermissions): Returns all the names of the basic JNLP system properties accessible by RIAs. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added LSignedJNLPFileDidNotMatch and SJNLPFileIsNotSigned. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (initializeResources): Locates the jar file that contains the main class and verifies if a signed JNLP file is also located in that jar. This also checks 'lazy' jars if the the main class was not found in 'eager' jars. If the main jar was not found, a LaunchException is thrown which terminates the launch of the application. (checkForMain): A method that goes through each jar and checks to see if it has the main class. If the main class is found, it calls verifySignedJNLP() to verify if a valid signed JNLP file is also found in the jar. (verifySignedJNLP): A method that checks if the jar file contains a valid signed JNLP file. (closeStream): Closes a stream. (loadClassExt): Added a try/catch block when addNextResource() is called. (addNextResource): If the main jar has not been found, checkForMain() is called to check if the jar contains the main class, and verifies if a signed JNLP file is also located. * netx/net/sourceforge/jnlp/security/MoreInfoPane.java: (addComponents): Displays the signed JNLP warning message if necessary. * netx/net/sourceforge/jnlp/security/SecurityDialog.java: (SecurityDialog): Stores the value of whether a signed JNLP warning should be displayed. (showMoreInfoDialog): Passes in the associated JNLP file when creating a SecurityDialog object. (requiresSignedJNLPWarning): Returns a boolean after determining if a signed JNLP warning should be displayed. 2011-08-17 Danesh Dadachanji Update UI for SecurityDialog * netx/net/sourceforge/jnlp/resources/question.png: New icon added. * netx/net/sourceforge/jnlp/security/CertWarningPane.java: (addComponents): When certs are verified, question.png is used as the icon and SAlwaysTrustPublisher is automatically selected. * netx/net/sourceforge/jnlp/security/SecurityDialog.java: (initDialog): Changed the title of a CERT_WARNING dialog. 2011-08-17 Danesh Dadachanji AUTHORS: Adding myself and Denis Lila. Removing the extra email from Andrew Hughes. 2011-08-11 Danesh Dadachanji PR742: IcedTea-Web checks certs only upto 1 level deep before declaring them untrusted. * NEWS: Updated. * netx/net/sourceforge/jnlp/tools/JarSigner.java: (checkTrustedCerts): All certs along certPath are now checked for trust. 2011-08-09 Deepak Bhole PR771: IcedTea-Web certificate verification code does not use the right API * netx/net/sourceforge/jnlp/security/CertificateUtils.java (inKeyStores): Use Certificate.verify to correctly verify a certificate against a public key in the store. 2011-08-09 Saad Mohammad PR765: JNLP file with all resource jars marked as 'lazy' fails to validate signature and stops the launch of application * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (initializeResources): Initializes the first jar file if all resources are marked as lazy jars 2011-08-03 Saad Mohammad * netx/net/sourceforge/jnlp/JNLPMatcher.java: (JNLPMatcher): Removed NullPointerException from being thrown, caught and then thrown again via JNLPMatcherException. This was replaced by throwing a checked exception [JNLPMatcherException] directly. (JNLPMatcher): Removed unused code [getters] (JNLPMatcher): Closed Input/Output streams that were opened. (isMatch): Removed caching of return value (closeInputStream): Added this method to close input streams (closeOutputStream): Added this method to close output streams * netx/net/sourceforge/jnlp/Node.java: Removed getAttributeNames() method from the commented section 2011-08-03 Deepak Bhole PR768: Signed applets/Web Start apps don't work with OpenJDK7 and up * netx/net/sourceforge/jnlp/tools/JarSigner.java (verifyJar): Put entry in cert hashtable only if the entry is expected to be signed. 2011-08-02 Jiri Vanek * Makefile.am: (stamps/netx-dist-tests-prepare-reproducers.stamp): now are compiled files correctly compiled from directory structure. Also not java files are copied with expected directory structure and jarred together with classes. 2011-07-26 Jiri Vanek * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: String containing "localhost" have been declared as final constant. (SERVER_NAME) have been moved instant Server instance so each server can have it name without affecting others (getUrl()) added - can return URL of server singleton. Implementation of this method is inside server, so each server can return its own useful URL. (saveFile()) is now public. Added identification for ThreadedProcess based on commandlineArgs and its run is now slowed by Thread.sleep (ServerLuncher) inner class is now public (it was bug to not be as we have getIndependentInstance of it method ) and renamed to ServerLauncher Enchanted wrapping of executeProcess 2011-07-21 Deepak Bhole PR749: sun.applet.PluginStreamHandler#handleMessage(String) really slow Original patch from: Ricardo MartУ­n Camarero * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java (readPair): New function. (handleMessage): Use readPair to incrementally tokenize message, rather than using String.split(). 2011-07-19 Saad Mohammad * netx/net/sourceforge/jnlp/JNLPMatcher.java: Created this class to compare signed JNLP file with the launching JNLP file. When comparing, it has support for both method of signing of a JNLP file: APPLICATION_TEMPLATE.JNLP and APPLICATION.JNLP. * netx/net/sourceforge/jnlp/JNLPMatcherException.java: Added a custom exception: JNLPMatcherException. Thrown if verifying signed JNLP files fails. * netx/net/sourceforge/jnlp/Node.java: Created a method that retrieves the attribute names of the Node and stores it in private string [] member. The method returns the attribute names. * tests/netx/unit/net/sourceforge/jnlp/JNLPMatcherTest.java: This is a test case that tests the functionality of JNLPMatcher. It tests the algorithm with a variety of template and application JNLP files. * tests/netx/unit/net/sourceforge/jnlp/launchApp.jnlp: Launching JNLP file: This is the launching JNLP file used to compare with templates and application JNLP files in JNLPMatcherTest.java * tests/netx/unit/net/sourceforge/jnlp/templates/template0.jnlp: Test Template JNLP file: Contains CDATA. * tests/netx/unit/net/sourceforge/jnlp/templates/template1.jnlp: Test Template JNLP file: An exact duplicate of the launching JNLP file. * tests/netx/unit/net/sourceforge/jnlp/templates/template2.jnlp: Test Template JNLP file: Contains wildchars as attribute/element values. * tests/netx/unit/net/sourceforge/jnlp/templates/template3.jnlp: Test Template JNLP file: Different order of elements/attributes (same value) * tests/netx/unit/net/sourceforge/jnlp/templates/template4.jnlp: Test Template JNLP file: Contains wildchars as values of ALL elements and attribute. * tests/netx/unit/net/sourceforge/jnlp/templates/template5.jnlp: Test Template JNLP file: Contains comments. * tests/netx/unit/net/sourceforge/jnlp/templates/template6.jnlp: Test Template JNLP file: Contains different attribute and element values. * tests/netx/unit/net/sourceforge/jnlp/templates/template7.jnlp: Test Template JNLP file: Contains additional children in element. * tests/netx/unit/net/sourceforge/jnlp/templates/template8.jnlp: Test Template JNLP file: Contains fewer children in element. * tests/netx/unit/net/sourceforge/jnlp/templates/template9.jnlp: Test Template JNLP file: All values are different from the launching JNLP file. * tests/netx/unit/net/sourceforge/jnlp/application/application0.jnlp: Test Application JNLP file: Contains CDATA. * tests/netx/unit/net/sourceforge/jnlp/application/application1.jnlp: Test Application JNLP file: An exact duplicate of the launching JNLP file. * tests/netx/unit/net/sourceforge/jnlp/application/application2.jnlp: Test Application JNLP file: Different order of element/attributes (same value). * tests/netx/unit/net/sourceforge/jnlp/application/application3.jnlp: Test Application JNLP file: Contains comments. * tests/netx/unit/net/sourceforge/jnlp/application/application4.jnlp: Test Application JNLP file: Contains wildchars as attribute/element values. * tests/netx/unit/net/sourceforge/jnlp/application/application5.jnlp: Test Application JNLP file: Contains a different attribute (codebase) value. * tests/netx/unit/net/sourceforge/jnlp/application/application6.jnlp: Test Application JNLP file: Contains additional children in element. * tests/netx/unit/net/sourceforge/jnlp/application/application7.jnlp: Test Application JNLP file: Contains fewer children in element. * tests/netx/unit/net/sourceforge/jnlp/application/application8.jnlp: Test Application JNLP file: All values are different from the launching JNLP file. * Makefile.am: (run-netx-unit-tests): Copies resources(non java files) to test.build before running the unit tests. 2011-06-22 Jiri Vanek * tests/report-styles/jreport.xsl: part with classes statistics is now collapsible 2011-06-21 Jiri Vanek * tests/jnlp_tests/simple: AccessClassInPackage, ReplaceSecurityManager, AddShutdownHook, ReadEnvironment, SetContextClassLoader, AllStackTraces, ReadProperties, CreateClassLoader, RedirectStreams tests 2011-06-21 Jiri Vanek * Makefile.am: (run-netx-dist-tests): no depends on copying of styles (clean-netx-dist-tests): depends also on removing of styles 2011-06-17 Jiri Vanek * tests/jnlp_tests: directory for reproducers * tests/jnlp_tests/advanced: reproducers which must care about deploying and compiling thmselves * tests/jnlp_tests/simple: reproducers compiled, jared and deployed automatically * tests/jnlp_tests/simple/name/srcs|testcases|resources/: sourcefiles, resources and testaces for simple reproducers * tests/jnlp_tests/simple/deadlocktest: test for tracing not-killable javaws * tests/jnlp_tests/simple/simpletest1: tutorial test * tests/jnlp_tests/simple/simpletest2: tutorial test with exception * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ResourcesTest.java: tests for server basic functionality * tests/netx/jnlp_testsengine/net/sourceforge/jnlp/ServerAccess.java: implementation of server to produce jnlps and resources. Implementation of helpers to run javaws process. * Makefile.am: new variables pointing to structure above; (junit-jnlp-dist-dirs.txt): prepare destination directory structure (stamps/netx-dist-tests-prepare-reproducers.stamp):compile tescascases of simple reproducers (netx-dist-tests-source-files.txt): lookup for server and helping classes (stamps/netx-dist-tests-compile.stamp): compile server and helping classes (stamps/netx-dist-tests-compile-testcases.stamp): compile, jar and deploy all simple testcases and their resources (run-netx-dist-tests): after make install run junit testsuite upon reproducers on virtual server (clean-netx-tests): added dependence on clean-netx-dist-tests (clean-netx-dist-tests): deleting of reproducers 2011-06-16 Jiri Vanek * tests/report-styles/index.js: fast navigation functions * tests/report-styles/report.css: styles for transformed result * tests/report-styles/jreport.xsl: template for human-readable xml->html transformation. * Makefile.am: New variable for report-styles directory; ($(TESTS_DIR)/$(REPORT_STYLES_DIRNAME)): goal for copying styles and javascripts; (run-netx-unit-tests): added nonfaling xsltproc transformation of sheet and unit-tests' xml report to index_unit.html; (clean-netx-unit-tests): now depends also on clean_tests_reports; (clean_tests_reports): new goal to remove report styles directory and indexs html files. 2011-07-14 Omair Majid RH718170, CVE-2011-2514: Java Web Start security warning dialog manipulation * netx/net/sourceforge/jnlp/services/XExtendedService.java (openFile): Create XContents based on a copy of the File object to prevent overloaded File classes from mangling the name. (XFileContents): Create a separate copy of File object for local use. 2011-07-14 Omair Majid RH718164, CVE-2011-2513: Home directory path disclosure to untrusted applications * netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java: New file. * netx/net/sourceforge/jnlp/util/UrlUtils.java: New file. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: jarLocationSecurityMap now contains originating urls, not cache urls. (initializeResources): Add remote url to map instead of local url. (activateJars): Add remote url to the classloader's urls. Add mapping for remote to local url. Put remote url in jarLocationSecurityMap. (loadClass): Add remote url to the classloader's urls. Add mapping for remote to local url. (getCodeSourceSecurity): Update javadoc to note that the url must be remote. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Set the callback for URLJarFile. 2011-06-14 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: (ControlPanel): Removed line that prevents resizing. (createMainSettingsPanel): Detect the minimum size of panels instead of fixed size. * netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java: (addComponents): Changed to update size when tool is being resized. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java addComponents): Changed to a layout that will resize itself. 2011-06-10 Denis Lila * netx/net/sourceforge/jnlp/GuiLaunchHandler.java: (mutex): New mutex for synchronizing splashScreen. (closeSplashScreen): New method to hide and dispose splashScreen. (launchStarting): Call closeSplashScreen instead of doing it inline. (launchInitialized): Sync splashScreen creation. (validationError, launchError): Call closeSplashScreen. 2011-06-10 Denis Lila * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java: (frameMutex): New mutex to synchronize accesses to "frame". (getListener): Make almost all of it synchronized on frameMutex. (disposeListener): Sync hider's body around frameMutex and call dispose on the frame so that the awt threads die when they should. (addProgressPanel): Sync "frame" usage. 2011-06-08 Saad Mohammad * AUTHORS: Updated * netx/net/sourceforge/jnlp/services/ServiceUtil.java (checkAccess): Moved the process of checking if the application is a trusted application to a new method called isSigned(). * netx/net/sourceforge/jnlp/services/XPersistenceService.java (checkLocation): Allows trusted application to have access to PersistenceService data from different hosts. It uses ServiceUtil.isSigned() to determine if the current application is a trusted application. 2011-06-08 Andrew Su * NEWS: Updated. * netx/net/sourceforge/jnlp/JNLPFile.java: (JNLPFile): Calls new constructor. (JNLPFile): New constructor to take an option for forcing a codebase. (JNLPFile): Call parse with extra parameter. (parse): Use the given codebase passed in if we did not find one. * netx/net/sourceforge/jnlp/Parser.java: (Parser): Calls new constructor. (Parser): New constructor which takes in a codebase as a last option. * netx/net/sourceforge/jnlp/PluginBridge.java: (PluginBridge): Calls new JNLPFile's constructor with current codebase 2011-06-08 Andrew Su * netx/net/sourceforge/jnlp/PluginBridge.java: (jars): Changed to use HashSet instead of String[]. (PluginBridge): Updated to work with HashSet instead of String[] (getResources): Likewise. 2011-06-08 Deepak Bhole PR721: IcedTeaPlugin.so cannot run g_main_context_iteration on a different thread unless a different GMainContext *context is used * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc (postAndWaitForResponse): Added logic for tracking when the processor is running from a plugin main thread, and logic to process main thread specific messages queued thereafter until function exit. * plugin/icedteanp/IcedTeaNPPlugin.cc: (itnp_plugin_thread_id): New variable. Tracks plugin main thread ID. (pluginAsyncCallMutex): New variable. Mutex to lock async call queue. (NP_Initialize): Initialize the itnp_plugin_thread_id variable and make ithe make pluginAsyncCallMutex recursive. (NP_Shutdown): Destroy pluginAsyncCallMutex. * plugin/icedteanp/IcedTeaNPPlugin.h: (CHROMIUM_WORKAROUND): Remove macro. (itnp_plugin_thread_id): New variable. Tracks plugin main thread ID. (pluginAsyncCallMutex): New variable. Mutex to lock async call queue. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (eval): Remove chromium workaround. (call): Same. (sendString): Same. (setMember): Same. (sendMember): Same. (loadURL): Same. * plugin/icedteanp/IcedTeaPluginRequestProcessor.h: Moved async_call_thread_data to IcedTeaPluginUtils.h. * plugin/icedteanp/IcedTeaPluginUtils.cc (pendingPluginThreadRequests): New variable. Queue to track events waiting for async execution on plug-in thread. (callAndWaitForResult): New function. Calls a method on plug-in thread and waits for the execution to complete. (postPluginThreadAsyncCall): New function. Posts a method call to the async execution queue and calls NPN_PluginThreadAsynCall. (processAsyncCallQueue): New function. Called from the plug-in thread, this function empties the event queue of functions waiting for plug-in thread execution. * plugin/icedteanp/IcedTeaPluginUtils.h (plugin_thread_call): New struct to hold async call data. (async_call_thread_data): Struct moved from IcedTeaPluginRequestProcessor. (processAsyncCallQueue): New function. (postPluginThreadAsyncCall): Same. (callAndWaitForResult): Same. * plugin/icedteanp/IcedTeaScriptablePluginObject.cc (get_scriptable_java_object): Use IcedTeaPluginUtilities::callAndWaitForResult to post async callback for _createAndRetainJavaObject. 2011-05-31 Omair Majid * netx/net/sourceforge/jnlp/JNLPSplashScreen.java: Subclass JDialog, not JFrame. 2011-05-30 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: (addComponent): Add check to see if specified cache directory is writable. 2011-05-30 Andrew Su * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (downloadResource): Check whether file to be downloaded is current. 2011-05-30 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java: (properties): Removed property. (addComponents): Removed checkbox. * netx/net/sourceforge/jnlp/resources/Messages.properties: Removed translation string for DPLifeCycleExceptions. 2011-05-27 Deepak Bhole PR723: AccessControlException while downloading resource * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (Downloader): Make class private. (Downloader::run): Call processResource via doPrivileged since resources may get added at run time from application code via JNLPClassLoader::addNewJar(). 2011-05-27 Deepak Bhole PR735: Firefox 4 sometimes freezes if the applet calls showDocument() * plugin/icedteanp/IcedTeaNPPlugin.cc (consume_message): Defer handling to url load request to the queue processor. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (PluginRequestProcessor::newMessageOnBus): Handle new LoadURL command. (PluginRequestProcessor::loadURL): New method. Loads the specified url in the given target. (queue_processor): Process the LoadURL command. (_loadURL): New async callback function to handle LoadURL commands. * plugin/icedteanp/IcedTeaPluginRequestProcessor.h: Add _loadURL and loadURL method declerations. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (showDocument): Send the url load command in the standard "instance X reference Y " format. 2011-05-27 Deepak Bhole * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (appletClose): Call dispose from the swing thread. Also, don't try to stop the threadgroup. 2011-05-27 Deepak Bhole * Backed out 0256de6a4bf6 2011-05-27 Omair Majid * NEWS: Update. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getClassPathsFromManifest): Check for possible nulls and empty strings. 2011-05-26 Andrew Su * NEWS: Update. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (cleanCache): Split conditional for delete. 2011-05-20 Andrew Su * NEWS: Update. 2011-05-20 Andrew Su * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: (CacheLRUWrapper): New constructor to create file. (lock): Removed creation of file here. 2011-05-17 Jiri Vanek * tests/junit-runner/JunitLikeXmlOutputListener: This listener exports results of junit in xml which "follows junit-output schema". Extended for date, duration and some statististics for future purpose * Makefile.am (run-netx-unit-tests): backuping stdout/stderr of tests * tests/junit-runner/CommandLine.java: registered JunitLikeXmlOutputListener 2011-05-10 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: (addComponents):Created a new comparator for sorting by file size and date. 2011-05-09 Jiri Vanek * tests/junit-runner/CommandLine.java:r added skipping of inner classes and one jnlp file from sources package. 2011-05-03 Denis Lila * netx/net/sourceforge/jnlp/NetxPanel.java: Add imports. (uKeyToTG): Change to HashMap. (TGMapMutex): New mutex to synchronize uKeyToTG. (getThreadGroup): Synchronize on TGMapMutex. (NetxPanel): Only create a new thread group if one doesn't already exist for the computed uKey. 2011-05-02 Deepak Bhole * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (appletClose): Do not try to stop threads, now that the loader is shared and the thread group for applets on a page is identical. Call dispose from invokeAndWait. (appletSystemExit): Exit the VM when called. 2011-04-28 Denis Lila * netx/net/sourceforge/jnlp/NetxPanel.java: Remove unused import; add imports. (uKey, uKeyToTG, appContextCreated): New members. (getThreadGroup, createNewAppContext): New methods. (runLoader): Pass uKey to PluginBridge's constructor. (run): Remove. No longer needed. (NetxPanel): Initialize uKey. If it is a new key, make a new thread group for it and save it in the hash map. (createAppletThread): Use getFutureTG instead of creating a thread group on the spot. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (createPanel): Initialize and frame the panel in a separate thread. * netx/net/sourceforge/jnlp/Launcher.java: Remove unused import. (createApplet, createApplication, createThreadGroup): Replace AppThreadGroup with ThreadGroup. Remove all calls to setApplication. * netx/net/sourceforge/jnlp/PluginBridge.java: (PluginBridge): Remove the uniqueKey initialization logic. Set uniqueKey to the uKey parameter. * netx/net/sourceforge/jnlp/runtime/AppThreadGroup.java: Remove file. 2011-04-28 Omair Majid * Makefile.am (javaws, itweb_settings): New variables. (edit_launcher_script, all-local, install-exe-local) (uninstall-local, clean-launchers, javaws.desktop) (itweb-settings.desktop): Replace all uses of javaws and itweb-settings with the new variables. (launcher.build/javaws): Replace with ... (launcher.build/$(javaws)): New target. (launcher.build/itweb-settings): Replace with... (launcher.build/$(itweb-settings)): New target. 2011-04-21 Deepak Bhole * configure.ac: Bumped version to 1.2pre 2011-04-21 Deepak Bhole * plugin/icedteanp/IcedTeaNPPlugin.cc (consume_message): Use NPN_GetURLNotify (non-blocking) instead of NPN_GetURL (blocking) so that the plugin is free to process additional requests. * ChangeLog: Fixed spacing issues in previous entry. 2011-04-20 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: (createButtonPanel): Changed to update the recently_used file to reflect the deletion. Added method updateRecentlyUsed to anonymous ActionListener class which will do the actual updating. 2011-04-20 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Add new private variable classpathsInManifest. (activateJars): When adding jar index, also add Class-Path entries from the Manifest file in the jar. (loadClass): Search for jars specified in classpaths before looking for entries in jar index. (addNewJar): New method refactored from loadClass. 2011-04-20 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java (getApplication(Class[],int)): Renamed to ... (getApplication(Thread,Class[],int)): New method. Check the thread's context ClassLoader as well as parents of the classloader. (getJnlpClassLoader): New method. (getApplication, checkExit): Update to work with new method signatures. 2011-04-20 Omair Majid * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java (PluginAppletSecurityContext): Set the launch handler to the stdout/stderr based one. 2011-04-20 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: (generateData): Skip through the identifier for cached item. 2011-04-20 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/CachePane.java: (createButtonPanel): Added check to delete button for whether plugin or javaws is not running before proceeding with delete. 2011-04-20 Andrew Su * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (cleanCache): Added check for removing files that are over set max limit. (removeUntrackedDirectories): Removed method. Replaced by removeSetOfDirectories. (removeSetOfDirectories): New method. Removes a given set of directories. 2011-04-20 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: (addComponents): Uncommented lines of code to reintroduce components to handle setting cache size limit. 2011-04-20 Andrew Su * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (getCacheFile): Store lru after modifying. 2011-04-18 Andrew Su * netx/net/sourceforge/jnlp/cache/CacheEntry.java: (markForDelete): New method. Adds an entry to info file specifying that this file should be delete. (lock): New method. Locks the info file. (unlock): New method. Unlocks the info file. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (cacheDir, lruHandler, propertiesLockPool): New private static fields. (clearCache): Changed to use static field. (getCacheFile): Changed to call getCacheFileIfExist and makeNewCacheFile where appropriate. (getCacheFileIfExist): New method. Get the file of requested item. (makeNewCacheFile): New method. Create a new location to store cache file. (pathToURLPath): New method. Convert the file path to the url path. (cleanCache): New method. Search for redundant entries and remove them. (removeUntrackedDirectories): New method. Remove all untracked directories. (lockFile): New method. Locks the given property file. (unlockFile): New method. Unlocks the property file if we locked before. * netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java: New class. Provides wrappers for handling cache's LRU. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (downloadResource): Ensure that we only allow downloading the specified file once. (initializeResource): Added creation of new location to store an updated or new file. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (JNLPClassLoader): Reordered the calls since we should check permission after we have the files ready. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (markNetxRunning): Added call to CacheUtil.cleanCache() when adding shutdown hooks. * netx/net/sourceforge/jnlp/util/FileUtils.java: (getFileLock): New method. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: (getContentsAsReader): Changed call from using urlToPath to getCacheFile, since the directories are no longer in that location. 2011-04-18 Denis Lila * netx/net/sourceforge/jnlp/Launcher.java: Remove unused import. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Add annotation to suppress warning. (loadClass): Make synchronized. 2010-04-14 Andrew John Hughes * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java, (PluginAppletPanelFactory.createPanel(PluginStreamHandler, int,long,int,int,URL,Hashtable)): Remove duplication of wait for panel.isAlive(). (PluginAppletViewer.panelLock): New lock used to track panel creation. (PluginAppletViewer.panelLive): Condition queue for panel creation. (PluginAppletViewer.appletsLock): New lock used to track additions to the applets map. (PluginAppletViewer.appletAdded): Condition queue for applet addition. (PluginAppletViewer.statusLock): New lock for status changes. (PluginAppletViewer.initComplete): Condition queue for initialisation completion. (PluginAppletViewer.framePanel(int,long,NetxPanel)): Replace synchronized block with use of appletsLock and notification on appletAdded condition queue. (AppletEventListener.appletStateChanged(AppletEvent)): Signal the panelLive condition queue that the panel is live. (PluginAppletViewer.handleMessage(int,int,String)): Wait on appletAdded condition queue for applet to be added to the applets map. (PluginAppletViewer.updateStatus(Int,PAV_INIT_STATUS)): Signal when a status change occurs using the initComplete condition queue. (PluginAppletViewer.waitForAppletInit(NetxPanel)): Wait on the panelLive condition queue until the panel is created. (PluginAppletViewer.handleMessage(int,String)): Wait on the initComplete condition queue until initialisation is complete. Wait on the panelLive signal until panel is created. (waitTillTimeout(ReentrantLock,Condition,long)): Convert to use ReentrantLock and Condition. Add assertion to check the lock is held. Avoid conversion between milliseconds and nanoseconds. 2011-04-18 Deepak Bhole * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (PluginAppletPanelFactory::createPanel): Make the NetxPanel variable final. Resize frame to work around problem whereby AppletViewerPanel doesn't always set the right size initially. 2011-04-18 Deepak Bhole RH691259: Midori sends a SIGSEGV with the IcedTea NP Plugin * plugin/icedteanp/IcedTeaNPPlugin.cc (NP_Initialize): Rather than returning immediately if already initialized, return after function tables are reset. 2010-04-11 Andrew John Hughes * configure.ac: Check Gentoo install location for JUnit 4. 2011-04-13 Deepak Bhole * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (createPanel): use Object.wait() to wait, rather than pariodic sleep. (APPLET_TIMEOUT): Updated to be in nanoseconds. (framePanel): Synchronize put and notify threads waiting on the applets map instance. (appletStateChanged): Notify all threads waiting on the panel that just changed state. (handleMessage): Use the new waitTillTimeout function to wait, rather than periodically waking up. Improved timeout error string sent back. (updateStatus): Synchronize put and notify all threads waiting on status map. (waitForAppletInit): Use the new waitTillTimeout function to wait, rather than periodically waking up. (waitTillTimeout): New function. For a given non-null object, waits until the specified timeout, or, if an interrupt was thrown during wait, returns immediately. 2011-04-14 Denis Lila * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java Remove unused imports, added various SuppressWarnings annotations. (createPanel): Return NetxPanel from doPriviledged. Remove dead code. (PluginParseRequest): Remove - unused. (defaultSaveFile, label, statusMsgStream, requests, handle): Remove unused. (panel): Make NetxPanel. (identifier, appletPanels): Privatize. (appletPanels): Change type to NetxPanel. (applets, status): Use ConcurrentHashMaps. (framePanel, PluginAppletViewer): Remove unused PrintStream argument. (forceredraw): Remove - unused. (getApplets): Use generics. (appletClose): Fix style to match our convention. (destroyApplet): Use pav instead of calling get many times. (splitSeparator): Remove. Replace uses by String.split(). 2011-04-13 Andrew Su * netx/net/sourceforge/jnlp/cache/CacheDirectory.java: Added final modifier to class declaration. (CacheDirectory): New private constructor. 2011-04-12 Denis Lila * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (applets, status): Make concurrent. (PluginAppletViewer): Synchronize appletPanels addElement. (destroyApplet): Remove applets.containsKey because it and the get that followed it were not atomic. (appletPanels): Privatize. (getApplet, getApplets): Synchronize iteration. 2011-04-08 Omair Majid * README: Update to add notes on rhino and junit. 2011-04-07 Deepak Bhole * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (constructor): Make window close event call destroy applet which can be safely called multiple times, unlike appletClose. 2011-04-06 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsPane.java: (addComponents): Changed all port fields to use document which prevents input of non-valid port numbers. * netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java: (addComponents): likewise. (getPortNumberDocument): New method. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added CPInvalidPort and CPInvalidPortTitle. 2011-04-05 Denis Lila * plugin/icedteanp/java/netscape/javascript/JSObject.java: Replaced every instance of PluginDebug.debug(a + b + c...) with PluginDebug.debug(a, b, c...). 2011-04-05 Denis Lila * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: Remove unused imports, add import. (downloadOptions): Make ConcurrentHashMap. 2011-04-05 Denis Lila * plugin/icedteanp/IcedTeaNPPlugin.cc (plugin_start_appletviewer): Replace hardcoded indices with a variable; roll up free calls in a loop; fix whitespace; set classpath to ICEDTEA_WEB_JRE/lib/rt.jar. * launcher/javaws.in: Set class path to JRE/lib/rt.jar. * Makefile.am: Replace @JRE@ with $(JRE) in edit_launcher_script. 2011-04-01 Denis Lila * plugin/icedteanp/java/sun/applet/PluginDebug.java: (debug): Use StringBuilder to build the string. 2011-03-31 Omair Majid * netx/net/sourceforge/jnlp/Launcher.java: Add parserSettings and extra. (setParserSettings): New method. (setInformationToMerge): New method. (launch(JNLPFile,Container)): Call mergeExtraInformation. (launch(URL,boolean)): New method. (mergeExtraInformation): New method. (addProperties, addParameters, addArguments): Moved here from Boot.java (fromUrl): New method. * netx/net/sourceforge/jnlp/ParserSettings.java: New file. * netx/net/sourceforge/jnlp/resources/Messages.properties: Remove BArgNA, BParamNA. * netx/net/sourceforge/jnlp/runtime/Boot.java (run): Do not parse JNLP file. Pass ParserSettings and other command line additions to launcher. (getFile): Rename to... (getFileLocation): New method. (addProperties, addParameters, addArguments): Move to Launcher.java. 2011-03-31 Denis Lila * plugin/icedteanp/java/netscape/javascript/JSObject.java: Fix comments, remove unused imports. (equals): Remove. It was breaking the reflexivity in the equals contract. 2011-03-31 Denis Lila * plugin/icedteanp/java/sun/applet/PluginObjectStore.java: Add citation of Effective Java, 2nd edition. 2011-03-31 Denis Lila * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java (store): Make private and remove fixme to make private. * plugin/icedteanp/java/sun/applet/PluginObjectStore.java (PluginObjectStore): Make it a singleton using enum. (objects, counts, identifiers, lock, wrapped, nextUniqueIdentifier, checkNeg): Made instance methods/members. (getInstance): New static method. 2011-03-31 Denis Lila * plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java * plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java * plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java * plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java * plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java * plugin/icedteanp/java/sun/applet/PluginObjectStore.java * plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java * plugin/icedteanp/java/sun/applet/PluginProxySelector.java * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java * plugin/icedteanp/java/sun/applet/RequestQueue.java * plugin/icedteanp/java/sun/applet/VoidPluginCallRequest.java: Change all instances of PluginDebug.debug(arg1 + arg2 + ...) to PluginDebug.debug(arg1, arg2, ...). * plugin/icedteanp/java/sun/applet/PluginDebug.java: Change debug from "void debug(String)" to "void debug(Object...)". 2011-03-31 Denis Lila * plugin/icedteanp/java/sun/applet/PluginObjectStore.java (wrapped, lock): New static variables. (getNextID, checkNeg): New functions. (reference): Using getNextID and synchronized. (dump): Improve iteration and synchronized. (unreference, getObject, getIdentifier, contains(Object), contains(int)): Synchronized. 2011-03-31 Omair Majid Add unit tests for the parser * Makefile.am: Add TESTS_DIR,TESTS_SRCDIR, NETX_UNIT_TEST_DIR, and NETX_UNIT_TEST_SRCDIR, JUNIT_RUNNER_DIR, JUNIT_RUNNER_SRCDIR, and JUNIT_RUNNER_JAR. Conditionally define RHINO_TESTS and UNIT_TESTS. (clean-local): Use RHINO_TESTS and UNIT_TESTS. (clean-tests): Depend on clean-netx-tests. Delete directory. (junit-runner-source-files.txt, $(JUNIT_RUNNER_JAR)), (next-unit-tests-sources-files.txt stamps/netx-unit-tests-compile.stamp), (run-netx-unit-tests, clean-netx-tests, clean-junit-runner) (clean-netx-unit-tests): New targets. * configure.ac: Add new optional dependency on junit. * tests/junit-runner/CommandLine.java, * tests/junit-runner/LessVerboseTextListener.java, * tests/junit-runner/README, * tests/netx/unit/net/sourceforge/jnlp/ParserBasicTests.java, * tests/netx/unit/net/sourceforge/jnlp/ParserCornerCaseTests.java, * tests/netx/unit/net/sourceforge/jnlp/ParserMalformedXmlTests.java, * tests/netx/unit/net/sourceforge/jnlp/basic.jnlp: New files. 2011-03-30 Omair Majid * Makefile.am: Fix comment explaining reasons for setting JDK_UPDATE_VERSION. 2011-03-30 Omair Majid * netx/net/sourceforge/jnlp/resources/Messages.properties: Fix typo in RCantRename. 2011-03-30 Omair Majid * Makefile.am: Document reason for using bootclasspath. 2011-03-30 Omair Majid * netx/javaws.1: Fix FILES section to point to ~/.icedtea/deployment.properties. 2011-03-30 Omair Majid * netx/net/sourceforge/jnlp/LaunchHandler.java (launchInitialized, launchStarting): New methods. * netx/net/sourceforge/jnlp/DefaultLaunchHandler.java (launchInitialized, launchStarting): New methods. No-op implementation. (printMessage): Make it static. * netx/net/sourceforge/jnlp/GuiLaunchHandler.java: New file. (launchCompleted, launchError, launchStarting, launchInitialized), (launchWarning, validationError): New methods. * netx/net/sourceforge/jnlp/Launcher.java (launchApplication): Invoke handler.launchInitialized and handler.launchStarting instead of showing a splash screen directly. * netx/net/sourceforge/jnlp/resources/Messages.properties: Add ButShowDetails, ButHideDetails and Error. * netx/net/sourceforge/jnlp/runtime/Boot.java (run): Do not exit on error. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Set handler to GuiLaunchHandler if not running in headless mode. * netx/net/sourceforge/jnlp/util/BasicExceptionDialog.java: New file. (exceptionToString, show): New methods. 2011-03-29 Denis Lila * netx/net/sourceforge/jnlp/JNLPFile.java (getInformation): Remove redundant if. 2010-03-29 Andrew John Hughes * plugin/docs/npplugin_liveconnect_design.html: Replace binary PDF documentation with editable HTML. * plugin/docs/npplugin_liveconnect_design.pdf: Removed. 2011-03-28 Omair Majid * launcher/javaws.in: Split out -J arguments and pass it to the JVM. 2011-03-28 Deepak Bhole * netx/net/sourceforge/jnlp/PluginBridge.java (PluginBridge): Construct unique key based on a combination of codebase, cache_archive, java_archive, and archive. This automatically ensures are loaders are shared only when appropriate. 2011-03-25 Denis Lila * netx/net/sourceforge/jnlp/PluginBridge.java (codeBaseLookup): new member and getter for it. (PluginBridge): set codeBaseLookup. * netx/net/sourceforge/jnlp/Launcher.java: (createApplet, createAppletObject): call enableCodeBase() if and only if the enableCodeBase argument is true. 2011-03-24 Omair Majid * Makefile.am (EXTRA_DIST): Add $(top_srcdir)/tests. 2011-03-24 Omair Majid * netx/net/sourceforge/jnlp/resources/Messages.properties: Add RBrowserLocationPromptTitle, RBrowserLocationPromptMessage and RBrowserLocationPromptMessageWithReason. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (isWindows): New method. Moved from XBasicService. (isUnix): New method. * netx/net/sourceforge/jnlp/services/XBasicService (initialize): Call initializeBrowserCommand. (initializeBrowserCommand): New method. (posixCommandExists): New method. (isWindows): Moved to JNLPRuntime. 2011-03-23 Denis Lila * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (findResource, findResources): New functions. Return nothing if name.startsWith("META-INF"). Otherwise delegate to superclass. 2011-03-21 Matthias Klose * launcher/itweb-settings.in: Use /bin/sh as interpreter. * launcher/javaws.in: Likewise. 2011-03-14 Andrew Su * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (markNetxRunning): Handle case for when shared locks are not allowed on the system. 2011-03-14 Andrew Su * netx/net/sourceforge/jnlp/Launcher.java: (fileLock): Removed private static field. (launch): Mark NetX as running before launching apps. (launchApplication): Removed call to markNetxRunning() and removed shutdown hook for calling markNetxStopped(). (markNetxRunning): Removed method. (markNetxStopped): Removed method. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (okToClearCache): Removed closing of channel. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (fileLock): New private static field. (markNetxRunning): New method to indicate NetX is running. (markNetxStopped): New method to indicate NetX has stopped. 2011-03-16 Jiri Vanek * extras/net/sourceforge/jnlp/about/Main.java: removed hyperlinkUpdate and HyperlinkListener, as it can not work without all-permissions. Also all createAndShowGUI was shorten for call from net.sourceforge.jnlp package. Html resources were redirected to javaws * netx/net/sourceforge/jnlp/resources/about.jnlp: removed 2011-03-16 Jiri Vanek * netx/net/sourceforge/jnlp/runtime/Boot.java: getAboutFile changed to return path to local about.jnlp instead to inner-from-jar * extras/net/sourceforge/jnlp/: refactored to extras/net/sourceforge/javaws/, as /net/sourceforge/jnlp/ package must be run with all-permissions. * netx/net/sourceforge/jnlp/resources/about.jnlp: codebase changed to "." 2011-03-15 Denis Lila * netx/net/sourceforge/jnlp/Launcher.java (markNetxRunning): Throw exception if directories can't be created. * netx/net/sourceforge/jnlp/cache/CacheDirectory.java (cleanParent): Print error message if file can't be deleted. * netx/net/sourceforge/jnlp/cache/CacheUtil.java (getCacheFile): Throw exception if directories can't be created. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java (save): Throw exception if directories can't be created. * netx/net/sourceforge/jnlp/controlpanel/CachePane.java (createButtonPanel): Print error message if file can't be deleted. * netx/net/sourceforge/jnlp/resources/Messages.properties Added messages. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initializeStreams): Throw exception if directories can't be created. * netx/net/sourceforge/jnlp/services/XPersistenceService.java (create, get): Throw exception if directories can't be created. (delete): Print error message if file can't be deleted. * netx/net/sourceforge/jnlp/util/FileUtils.java (createRestrictedFile): Throw exception if file permissions can't be changed. (createParentDir, deleteWithErrMesg): new functions. 2011-03-15 Omair Majid * Makefile.am (LAUNCHER_BOOTCLASSPATH, PLUGIN_BOOTCLASSPATH) (javaws.desktop, itweb-settings.desktop): Remove DESTDIR. 2011-03-10 Mark Wielaard * tests/netx/pac/pac-funcs-test.js (testIsResolvable): Change single host name icedtea to NotIcedTeaHost to make sure it really isn't resolvable. 2011-03-10 Omair Majid Replace native launchers with shell scripts * NEWS: Update. * Makefile.am (LAUNCHER_BOOTCLASSPATH): Remove leading -J. (LAUNCHER_SRCDIR), (LAUNCHER_OBJECTS), (NETX_LAUNCHER_OBJECTS), (CONTROLPANEL_LAUNCHER_OBJECTS), (LAUNCHER_FLAGS), (LAUNCHER_LINK): Remove. (edit_launcher_script): New function. (all-local): Depend on new launcher targets. (clean-local): Depend on clean-launchers. (.PHONY): Add clean-launchers. (install-exec-local): Use new launcher paths. (clean-launchers): New target. ($(NETX_DIR)/launcher/%.o), ($(NETX_DIR)/launcher/controlpanel/%.o), ($(NETX_DIR)/launcher/javaws), ($(NETX_DIR)/launcher/controlpanel/itweb-settings): Remove. (launcher.build/javaws): New launcher. (launcher.build/itweb-settings): Likewise. * launcher/itweb-settings.in, * launcher/javaws.in: New file. * netx/net/sourceforge/jnlp/Launcher.java (launchExternal), * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java (CommandLine): Use new system properties to find paths and program names. 2011-03-10 Omair Majid * acinclude.m4 (IT_FIND_RHINO_JAR): Remove. 2011-03-10 Omair Majid * tests/netx/pac/pac-funcs-test.js (main): Make test summary output more jtreg-like. (runTests): Change test output format to be more jtreg-like. 2011-03-09 Denis Lila * netx/net/sourceforge/jnlp/Parser.java (getJAR): Remove unused variable. * netx/net/sourceforge/jnlp/cache/Resource.java (connection): Remove unused member. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (lock): Initialize to Object() instead of Integer(0). Also, make final. * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java (SettingsPanel): Make static class. * netx/net/sourceforge/jnlp/event/ApplicationEvent.java (application): Make member transient. * netx/net/sourceforge/jnlp/event/DownloadEvent.java (tracker, resource): Make members transient. * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java (appletInstance): Remove unused member. (parameters): Add parameters to its type (a map). * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java Remove unused import. (getNativeDir): Improve random int computation. (CodeBaseClassLoader): Make it a static class. * netx/net/sourceforge/jnlp/JNLPFile.java (JNLPFile): Improve random positive int computation. * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java (activeApplication): Remove unused member. (checkExit): Remove dead code resulting from activeApplication always being null. * netx/net/sourceforge/jnlp/security/NotAllSignedWarningPane.java Remove unused import. (addComponents): Remove unused variable. * netx/net/sourceforge/jnlp/security/SecurityDialogPanel.java (SetValueHandler): Make it a static class. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java (CertificateType): Make it a static class. * netx/net/sourceforge/jnlp/services/ServiceUtil.java (checkAccess): Replace new Boolean with Boolean.valueOf. * netx/net/sourceforge/jnlp/tools/JarSigner.java (storeHash): Remove unused member. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java (getContentsAsReader): Remove unused variable pathToJavaws. 2011-03-09 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/SecuritySettingsPanel.java: (addComponents): Fix typo. 2011-03-08 Omair Majid * acinclude.m4 (IT_FIND_OPTIONAL_JAR): New macro. * configure.ac: Do not call IT_FIND_RHINO. Use IT_FIND_OPTIONAL_JAR instead. 2011-03-08 Denis Lila * netx/net/sourceforge/jnlp/runtime/RhinoBasedPacEvaluator.java (getProxies): Add result to cache, not cachedResult. 2011-03-08 Denis Lila * netx/net/sourceforge/jnlp/browser/FirefoxPreferencesFinder.java (find): Close input stream. * netx/net/sourceforge/jnlp/browser/FirefoxPreferencesParser.java (parse): Close input stream. * netx/net/sourceforge/jnlp/runtime/RhinoBasedPacEvaluator.java (getPacContents, getHelperFunctionContents): Close input stream. * netx/net/sourceforge/jnlp/security/CertWarningPane.java (CheckBoxListener.actionPerformed): Close output stream. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java (ImportButtonListener.actionPerformed): Close output stream. 2011-03-08 Andrew Su * netx/net/sourceforge/jnlp/util/PropertiesFile.java: (load): Closed streams after opening them. (store): Likewise. 2011-03-08 Denis Lila * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (getRequestIdentifier): Fix race condition by synchronizing on mutex. (requestIdentityCounter): Now a long. 2011-03-07 Omair Majid * acinclude.m4 (IT_FIND_RHINO_JAR): Set RHINO_AVAILABLE to true or false appropriately. * build.properties.in: New file. * jrunscript.in: New file. * configure.ac: Add build.properties and jrunscript to AC_CONFIG_FILES. * Makefile.am (.PHONY): Remove clean-jrunscript. (build.properties): Remove target. (stamps/netx.stamp): Remove dependency on build.properties. (clean-netx): Do not delete build.properties. (jrunscript): Remove target. (check-pac-functions): Remove dependency on jrunscript. (clean-tests): Remove dependency on clean-jrunscript. (clean-jrunscript): Remove target. 2011-03-07 Omair Majid * NEWS: Update. * acinclude.m4 (IT_OBTAIN_HG_REVISIONS): Use hg id instead of hg tip. 2011-03-07 Omair Majid * plugin/icedteanp/IcedTeaNPPlugin.cc: Add plugin_debug_suspend. (plugin_start_appletviewer): If plugin_debug_suspend is true, start jvm in suspend mode. 2011-03-07 Omair Majid * NEWS: Update. * Makefile.am (RHINO_RUNTIME): Define to point to rhino jars, or empty. (RUNTIME, LAUNCHER_BOOTCLASSPATH, PLUGIN_BOOTCLASSPATH): Include RHINO_RUNTIME. (PHONY): Add check-pac-functions, clean-jrunscript and clean-tests. (check-local): New target. Depends on check-pac-functions. (check-pac-functions): New target. (jrunscript): New target. (clean-tests): New target. (clean-jrunscript): New target. (netx-source-files.txt): Remove rhino related files if not building with rhino. (build.properties): New target. (stamps/netx.stamp): Depend on build.properties and copy new files to build location. (clean-netx): Remove build.properties. (stamps/bootstrap-directory.stamp): Add java to bootstrap programs. * acinclude.m4 (IT_FIND_RHINO_JAR): New macro. * configure.ac: Invoke IT_FIND_RHINO_JAR. * netx/net/sourceforge/jnlp/browser/BrowserAwareProxySelector.java: Add browserProxyAutoConfig. (initFromBrowserConfig): Initialize browserProxyAutoConfig if needed. (getFromBrowserPAC): Use browserProxyAutoConfig to find proxies. * netx/net/sourceforge/jnlp/resources/Messages.properties: Replace RPRoxyPacNotImplemented with RPRoxyPacNotSupported. * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java: Add pacEvaluator. (parseConfiguration): Initialize pacEvaluator if needed. (getFromPAC): Use pacEvaulator to find proxies. (getProxiesFromPacResult): New method. Converts a proxy string to a list or proxies. * netx/net/sourceforge/jnlp/runtime/PacEvaluator.java: New file. Defines a Java interface for a PAC evaluator. * netx/net/sourceforge/jnlp/runtime/FakePacEvaluator.java: New file. Dummy implementation of a PAC evaluator. * netx/net/sourceforge/jnlp/runtime/RhinoBasedPacEvaluator.java: New file. A rhino-based PAC evaluator. * netx/net/sourceforge/jnlp/runtime/PacEvaluatorFactory.java: New file. A factory for creating the right PAC evaulator. * netx/net/sourceforge/jnlp/runtime/pac-funcs.js: New file. Defines helper functions needed while evaluating PAC files. * tests/netx/pac/pac-funcs-test.js: New file. Tests the PAC helper functions. 2011-03-07 Denis Lila * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java: (prepopulateMethod) removed unused object o. * plugin/icedteanp/java/sun/applet/PluginCallRequest.java: Made all the members private. * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java: Removed unused imports. (MAX_PARALLEL_INITS, MAX_WORKERS, PRIORITY_WORKERS, readQueue, workers, streamHandler, consumerThread, registerPriorityWait(String), unRegisterPriorityWait(String)): made private. (initWorkers, as, processedIds, unRegisterPriorityWait(Long), addToInitWorkers): removed - unused. (getPriorityStrIfPriority): made static; replaced while with for-each. (notifyWorkerIsFree): removed synchronized section - useless. (ConsumerThread.run): removed call to addToInitWorkers. * plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java: Removed explicit member initializations to the default values; fixed typo. (PluginMessageHandlerWorker): Removed SecurityManager argument - unused. * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java: Removed unused imports. (consumer, shuttingDown): made private. (pav, writeQueue, getMessage, messageAvailable): removed - unused. (PluginStreamHandler): removed pav initialization. * plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java: Removed FIXME comment. 2011-03-07 Denis Lila * netx/net/sourceforge/jnlp/JNLPFile.java: (getResourcesDescs): added comment. (getDownloadOptionsForJar): removed commented out code. * netx/net/sourceforge/jnlp/PluginBridge.java (getResourcesDescs): added comment. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (downloadResource): added comment. 2011-03-04 Denis Lila * netx/net/sourceforge/jnlp/JNLPFile.java: (getDownloadOptionsForJar): Moved here from JNLPClassLoader.java. * netx/net/sourceforge/jnlp/PluginBridge.java (usePack, useVersion): added. (PluginBridge): initializing usePack and useVersion. (getDownloadOptionsForJar): return the download options. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getDownloadOptionsForJar): logic moved to JNLPFile.java and its subclasses. Now just calling file.getDownloadOptionsForJar. * NEWS: Updated with fix of PR658. 2011-03-04 Denis Lila * netx/net/sourceforge/jnlp/cache/ResourceTracker.java (downloadResource): changed the order in which pack200+gz compression and gzip compression are checked. * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java (getUrl): if usePack is true, append ".pack.gz" to the file name, instead of replacing ".jar" with ".pack.gz". 2011-03-04 Deepak Bhole * NEWS: Updated. * netx/net/sourceforge/jnlp/PluginBridge.java (PluginBridge): Use documentbase as a uniquekey so that the classloader may be shared by applets from the same page. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Added new CodeBaseClassLoader class to load codebase (from path instead of a file) classes. (getInstance): Try to match file locations only for Web Start apps. For plugin, merge the new loader into current one. (enableCodeBase): Use the new addToCodeBaseLoader method. (findLoadedClassAll): Search the codebase loader if the class was not found in the file loaders. (findClass): Likewise. (getResource): Likewise. (findResources): Likewise. (merge): Merge codebase loaders. (addToCodeBaseLoader): New method. Adds a given url to the codebase loader if it is a path. (CodeBaseClassLoader): New inner class. Extends URLClassLoader to expose its protected methods like addURL. * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java (getApplication): Accomodate the fact that the classloader for a class may be a CodeBaseClassLoader. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (run): Likewise. 2011-03-03 Deepak Bhole * plugin/icedteanp/IcedTeaNPPlugin.cc (plugin_send_initialization_message): New method. Sends initialization information to the Java side. (ITNP_SetWindow): Call the new plugin_send_initialization_message function. (get_scriptable_object): Same. 2011-03-03 Deepak Bhole * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (eval): Proceed with _eval only if instance is valid. (call): Proceed with _call only if instance is valid. Moved declaration of result_variant_jniid, result_variant args_array and thread_data to the top. (sendString): Proceed with _getString only if instance is valid. Remove thread count incrementer. (setMember): Proceed with _setMember only if instance is valid. Remove thread count incrementer. (sendMember): Proceed with _getMember only if instance is valid. 2011-03-03 Deepak Bhole * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (PluginRequestProcessor): Remove initialization of tc_mutex (~PluginRequestProcessor): Remove destruction of tc_mutex (sendString): Removed thread count incrementer code. (setMember): Same. (sendMember): Same. * plugin/icedteanp/IcedTeaPluginRequestProcessor.h: Removed tc_mutex and thread_count variables. 2011-03-02 Omair Majid Fix PR612. * NEWS: Update with fix. * netx/net/sourceforge/jnlp/SecurityDesc.java: Add PropertyPermissions for browser and browser.* to sandboxPermissions. 2011-03-02 Omair Majid * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java (handleSetCommand): Fix warning message. * netx/net/sourceforge/jnlp/resources/Messages.properties: Add CLWarningUnknownProperty. 2011-03-01 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPPolicy.java (isSystemJar): Check for nulls. 2011-03-01 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java (createMainSettingsPanel): Commented out unimplemented feature. * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java (addComponents): Commented out unimplemented feature. 2011-02-28 Omair Majid * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java (printResetHelp): Indicate that "all" is a valid argument. (handleResetCommand): Deal with "all" instead of a property name by reseting all properties. 2011-02-28 Denis Lila * plugin/icedteanp/java/sun/applet/PluginMain.java (redirectStreams, streamHandler, securityContext) make them local. (theVersion): make it private. (PluginMain): make it private. Empty the body. (main): Do all the work that used to be in PluginMain. (connect): make it static, and now it returns a PluginStreamHandler instead of setting a static variable. (messageAvailable, getMessage): Remove. 2011-02-28 Omair Majid * netx/net/sourceforge/jnlp/resources/Messages.properties: Add Password, Username and SAuthenticationPrompt. * netx/net/sourceforge/jnlp/security/JNLPAuthenticator.java (getPasswordAuthentication): Show password prompt using the secure thread. * netx/net/sourceforge/jnlp/security/PasswordAuthenticationPane.java (PasswordAuthenticationPane): Initialize variables. (initialize): For consistency, rename to.. (addComponents): New method. Set the appropriate return value when user takes an action. (askUser): Remove. (main): Remove. * netx/net/sourceforge/jnlp/security/SecurityDialog.java (initDialog): Add extra case for AUTHENTICATION dialog type. (installPanel): Likewise. * netx/net/sourceforge/jnlp/security/SecurityDialogs.java (DialogType): Add AUTHENTICATION. (showAuthenicationPrompt): New method. Shows a password authentication prompt. 2011-02-28 Omair Majid Rename files * netx/net/sourceforge/jnlp/security/PasswordAuthenticationDialog.java: Rename to ... * netx/net/sourceforge/jnlp/security/PasswordAuthenticationPane.java: New file. * netx/net/sourceforge/jnlp/security/SecurityWarningDialog.java: Rename to... * netx/net/sourceforge/jnlp/security/SecurityDialog.java: New file. * netx/net/sourceforge/jnlp/security/SecurityWarning.java: Rename to... * netx/net/sourceforge/jnlp/security/SecurityDialogs.java: New file. * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java, * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java, * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java, * netx/net/sourceforge/jnlp/security/AccessWarningPane.java, * netx/net/sourceforge/jnlp/security/AppletWarningPane.java, * netx/net/sourceforge/jnlp/security/CertWarningPane.java, * netx/net/sourceforge/jnlp/security/CertsInfoPane.java, * netx/net/sourceforge/jnlp/security/JNLPAuthenticator.java, * netx/net/sourceforge/jnlp/security/MoreInfoPane.java, * netx/net/sourceforge/jnlp/security/NotAllSignedWarningPane.java, * netx/net/sourceforge/jnlp/security/SecurityDialogMessage.java, * netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java, * netx/net/sourceforge/jnlp/security/SecurityDialogPanel.java, * netx/net/sourceforge/jnlp/security/SingleCertInfoPane.java, * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java, * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java, * netx/net/sourceforge/jnlp/services/ServiceUtil.java, * netx/net/sourceforge/jnlp/services/XClipboardService.java, * netx/net/sourceforge/jnlp/services/XExtendedService.java, * netx/net/sourceforge/jnlp/services/XFileOpenService.java, * netx/net/sourceforge/jnlp/services/XFileSaveService.java: Update class names to the new classes. 2011-02-25 Omair Majid * Makefile.am (stamps/netx-dist.stamp): Do not add extra files to classes.jar. 2011-02-25 Omair Majid * netx/net/sourceforge/jnlp/resources/Manifest.mf: Remove unused file. 2011-02-23 Omair Majid * Makefile.am: Add missing slash to JRE. 2011-02-23 Omair Majid RH677772: NoSuchAlgorithmException using SSL/TLS in javaws * NEWS: Update with bugfix. * netx/net/sourceforge/jnlp/runtime/JNLPPolicy.java: Add new field jreExtDir. (JNLPPolicy): Initialize jreExtDir. (getPermissions): Grant AllPermissions if the CodeSourse is a system jar. (isSystemJar): New method. * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java (checkPermission): Remove special casing of SecurityPermission("putProviderProperty.SunJCE") and SecurityPermission("accessClassInPackage.sun.security.internal.spec"). (inTrustedCallChain): Remove. 2011-02-22 Omair Majid Mark Greenwood Fix PR638 * NEWS: Update with fix. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (loadClass): Throw ClassNotFoundException instead of returning null. * AUTHORS: Update. 2011-02-22 Omair Majid * Makefile.am (uninstall-local): Fix typo in PACKAGE_NAME. 2011-02-22 Omair Majid * netx/net/sourceforge/jnlp/resources/Messages.properties: Add RNoAboutJnlp. * netx/net/sourceforge/jnlp/runtime/Boot.java: Remove NETX_ABOUT_FILE. (getAboutFile): Look for about.jnlp using the classloader. (getFile): Use localized error message string. 2011-02-22 Omair Majid DJ Lucas * Makefile.am (install-data-local): Use $(mandir) for man page dir. (uninstall-local): Use $(mandir) for man page dir. * AUTHORS: Update. 2011-02-22 Omair Majid Install icedtea-web into a FHS-compliant location * Makefile.am: Add new vars JRE, LAUNCHER_BOOTCLASSPATH and PLUGIN_BOOTCLASSPATH. (install-exec-local): Install files to FHS-compliant location; do not create links. (install-data-local): Likewise. (uninstall-local): Update file paths to delete. ($(PLUGIN_DIR)/%.o): Pass PLUGIN_BOOTCLASSPATH and ICEDTEA_WEB_JRE. ($(NETX_DIR)/launcher/%.o): Pass LAUNCHER_BOOTCLASSPATH and ICEDTEA_WEB_JRE. ($(NETX_DIR)/launcher/controlpanel/%.o): Likewise. * launcher/java_md.c (GetIcedTeaWebJREPath): New method. (CreateExecutionEnvironment): Call GetIcedTeaWebJREPath. * plugin/icedteanp/IcedTeaNPPlugin.cc (plugin_start_appletviewer): Add PLUGIN_BOOTCLASSPATH to the command. (NP_Initialize): Use ICEDTEA_WEB_JRE to initialize filename. 2011-02-18 Omair Majid Remove pluginappletviewer binary * Makefile.am (ICEDTEAPLUGIN_TARGET): Remove dependency on pluginappletviewer. (PLUGIN_LAUNCHER_OBJECTS): Remove. (install-exec-local): Do not install pluginappletviewer. (uninstall-local): Do not remove pluginappletviewer. ($(PLUGIN_DIR)/launcher/%.o): Remove. ($(PLUGIN_DIR)/launcher/pluginappletviewer): Remove. (clean-IcedTeaPlugin): Dont clean plugin launcher files. 2011-02-15 Omair Majid * netx/net/sourceforge/jnlp/util/TimedHashMap.java: Do not extend HashMap to provide a more type-safe and consistent interface. Use System.nanoTime for a more monotonic clock. 2011-02-15 Omair Majid * plugin/icedteanp/java/sun/applet/PluginProxySelector.java (TimedHashMap): Moved to... * netx/net/sourceforge/jnlp/util/TimedHashMap.java: New file. 2011-02-11 Omair Majid RH677332, CVE-2011-0706: IcedTea multiple signers privilege escalation * NEWS: Updated. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeResources): Assign appropriate security descriptor based on code signing. 2011-02-11 Deepak Bhole Fix S6983554, CVE-2010-4450: Launcher incorrect processing of empty library path entries * NEWS: Updated. * launcher/java_md.c: Ignore empty LD_LIBRARY_PATH. 2011-02-11 Omair Majid * netx/net/sourceforge/jnlp/PluginBridge.java (getResourcesDescs): New method implemented to override behaviour in JNLPFile class. 2011-02-11 Omair Majid * netx/net/sourceforge/jnlp/JNLPFile.java (getResourceDescs): Renamed to... (getResourcesDescs): New method. (getResourceDescs): Renamed to... (getResourcesDescs): New method. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getDownloadOptionsForJar): Call renamed method. 2011-02-10 Omair Majid Fix RH669942; Add support for packEnabled and versionEnabled. * NEWS: Update with bugfix. * netx/net/sourceforge/jnlp/DownloadOptions.java: New file. * netx/net/sourceforge/jnlp/JNLPFile.java (openURL): Use null for DownloadOptions. (getResourceDescs): New method. (getResourceDescs(Locale,String,String)): New method. * netx/net/sourceforge/jnlp/Launcher.java (launchApplication): Add image to downloader with null DownloadOptions. * netx/net/sourceforge/jnlp/cache/CacheUtil.java (getCachedResource): Add resource with null DownloadOptions. * netx/net/sourceforge/jnlp/cache/Resource.java: Add new field downloadLocation. (Resource): Initialize downloadLocation. (getDownloadLocation): New method. (setDownloadLocation): New method. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: Add new field downloadOptions. (addResource(URL,Version,UpdatePolicy)): Renamed to... (addResource(URL,Version,DownloadOptions,UpdatePolicy)): New method. (downloadResource): Add support for explicit downloading of packed jars as well as content-encoded packed jars. (initializeResource): Invokde findBestUrl to find the best url. Set that as the download location for the resource. (getVersionedResourceURL): Remove. (findBestUrl): New method. Use ResourceUrlCreator to get a list of all possible urls that can be used to download this resource. Try them one by one until one works and return that. * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java: New file. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeResources): Add resource with appropriate download options. (activateJars): Likewise. (loadClass): Likewise. (getDownloadOptionsForJar): New method. 2011-02-10 Deepak Bhole * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Restrict access to net.sourceforge.jnlp.* classes by untrusted classes. 2011-02-09 Omair Majid * netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java (addComponents): Fix the listener attached to the port field to update the right config option. 2011-02-08 Omair Majid * netx/net/sourceforge/jnlp/browser/BrowserAwareProxySelector.java (initFromBrowserConfig): Do not try to create a URL from null. (getFromBrowser): Only print informational messages in debug mode. 2011-02-01 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (activateJars): Add the nested jar to ResourceTracker. Use JarSigner.verifyJars instead of JarSigner.verifyJar. * netx/net/sourceforge/jnlp/tools/JarSigner.java (verifyJar): Make private to indicate nothing should be using this directly. 2011-01-24 Deepak Bhole RH672262, CVE-2011-0025: IcedTea jarfile signature verification bypass * rt/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeResources): Prompt user only if there is a single certificate that signs all jars in the jnlp file, otherwise treat as unsigned. * rt/net/sourceforge/jnlp/security/CertVerifier.java: Rename getCerts to getCertPath and make it return a CertPath. * rt/net/sourceforge/jnlp/security/CertsInfoPane.java: Rename certs variable to certPath and change its type to CertPath. (buildTree): Use new certPath variable. (populateTable): Same. * rt/net/sourceforge/jnlp/security/HttpsCertVerifier.java: Rename getCerts to getCertPath and make it return a CertPath. * rt/net/sourceforge/jnlp/tools/JarSigner.java: Change type for certs variable to be a hashmap that stores certs and the number of entries they have signed. (totalSignableEntries): New variable to track how many signable entries have been encountered. (getCerts): Updated method to return certs from new hashmap. (isFullySignedByASingleCert): New method. Returns if there is a single cert that signs all the entries in the jars specified in the jnlp file. (verifyJars): Move verifiedJars and unverifiedJars out of the for loop so that the data is not lost when the next jar is processed. After verifying each jar, see if there is a single signer, and prompt the user if there is such an untrusted signer. (verifyJar): Increment totalSignableEntries for each signable entry encountered and the count for each cert when it signs an entry. Move checkTrustedCerts() out of the function into verifyJars(). 2011-01-28 Omair Majid * Makefile.am: Move ICEDTEA_REV, ICEDTEA_PKG to acinclude.m4. Use FULL_VERSION. (stamps/netx-dist.stamp): Depend on netx.manifest. Use this file as the jar file manifest. * acinclude.m4 (IT_SET_VERSION): New macro. Defines FULL_VERSION. * configure.ac: Add netx.manifest to AC_CONFIG_FILES. Invoke IT_SET_VERSION. * netx.manifest.in: New file. * netx/net/sourceforge/jnlp/runtime/Boot.java: Set name and version using information from the manifest file. 2011-01-27 Omair Majid * netx/net/sourceforge/jnlp/resources/Messages.properties: Add RPRoxyPacNotImplemented, RProxyFirefoxNotFound, and RProxyFirefoxOptionNotImplemented. * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java: Make abstract. (getFromBrowser): Remove implementation; make abstract. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Set BrowserAwareProxySelector as the proxy selector. * netx/net/sourceforge/jnlp/browser/BrowserAwareProxySelector.java: New file. This class extends JNLPProxySelector and searches the browser's configuration to load additional proxy settings from. * netx/net/sourceforge/jnlp/browser/FirefoxPreferencesFinder.java: New file. This class looks into the browser configration to find the preferences file for the default firefox profile. * netx/net/sourceforge/jnlp/browser/FirefoxPreferencesParser.java: New file. Parses the browser's preferences and makes it available through a simpler interface. 2011-01-27 Omair Majid * AUTHORS: Update to include Jon A Maxwell. * extra/net/sourceforge/jnlp/about/resources/notes.html: Include everyone from AUTHORS. 2011-01-25 Omair Majid * netx/net/sourceforge/jnlp/resources/default.jnlp: Remove. 2011-01-24 Omair Majid * netx/net/sourceforge/jnlp/Launcher.java: Exit with error code * netx/net/sourceforge/jnlp/NetxPanel.java: Likewise. 2011-01-20 Andrew Su * netx/net/sourceforge/jnlp/AppletLog.java: Restrict log files to owner accessible only. 2011-01-20 Andrew Su Removing dead/commented/unused code. * plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java: Removed unused imports. * plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java: (getMatchingMethod): Removed unused variable. (getMatchingConstructor): Removed unused variable. * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java: Removed unused imports. (Signature): Removed commented code. (handleMessage): Removed commented code. (getAccessControlContext): Remove commented code. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (getCachedImage): Removed commented code. (makeReader): Removed unused method. (parse): Removed unused variables. Removed dead code. * plugin/icedteanp/java/sun/applet/PluginCallRequest.java: Removed unused imports. * plugin/icedteanp/java/sun/applet/PluginDebug.java: Removed unused imports. * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java: Removed unused imports. (getReference): Removed unused method. (isInInit): Removed unused method. (dumpWorkerStatus): Removed unused method. * plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java: Removed unused variable. (PluginMessageHandlerWorker): Removed unused variable. (plugin/icedteanp/java/sun/applet/PluginObjectStore.java): Removed unused imports. (reference): Removed commented code. (unreference): Removed commented code. * plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java: Removed unused import. * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java: Removed unused imports. Removed unused variable. (PluginStreamHandler): Removed unnecessary comments. Removed commented code. (startProcessing): Removed unused variables. Removed commented code. (write): Removed commented code. 2011-01-20 Deepak Bhole PR619: Improper finalization by the plugin can crash the browser * plugin/icedteanp/java/netscape/javascript/JSObject.java (finalize): Proceed with finalization only if JSObject is valid. 2011-01-17 Andrew Su * netx/net/sourceforge/jnlp/NetxPanel.java: (showAppletException): Override, adds logging to file then proceed with showAppletException in sun.applet.AppletPanel. * netx/net/sourceforge/jnlp/AppletLog.java: New class. * netx/net/sourceforge/jnlp/Log.java: New class. 2011-01-14 Andrew Su * Makefile.am: Added net.sourceforge.jnlp.config and net.sourceforge.jnlp.runtime to NETX_PKGS. 2011-01-12 Omair Majid * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java (main): Set look and feel. Set config object to use with KeyStores. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Set config object to use with KeyStores. * netx/net/sourceforge/jnlp/security/KeyStores.java: Add new member config. (setConfiguration): New method. Sets the value of config after security check. (getKeyStoreLocation): Use config object instead of querying JNLPRuntime. 2011-01-12 Omair Majid * netx/net/sourceforge/jnlp/JNLPFile: Add missing generic type to info. (getInformation): Remove redundant cast. 2011-01-12 Omair Majid * netx/javax/jnlp/UnavailableServiceException.java: Remove unused imports. * netx/net/sourceforge/jnlp/AppletDesc.java: Likewise. * netx/net/sourceforge/jnlp/ApplicationDesc.java: Likewise. * netx/net/sourceforge/jnlp/ComponentDesc.java: Likewise. * netx/net/sourceforge/jnlp/DefaultLaunchHandler.java: Likewise. * netx/net/sourceforge/jnlp/IconDesc.java: Likewise. * netx/net/sourceforge/jnlp/InformationDesc.java: Likewise. * netx/net/sourceforge/jnlp/InstallerDesc.java: Likewise. * netx/net/sourceforge/jnlp/JARDesc.java: Likewise. * netx/net/sourceforge/jnlp/JREDesc.java: Likewise. * netx/net/sourceforge/jnlp/Launcher.java: Likewise. * netx/net/sourceforge/jnlp/PackageDesc.java: Likewise. * netx/net/sourceforge/jnlp/ParseException.java: Likewise. * netx/net/sourceforge/jnlp/PluginBridge.java: Likewise. * netx/net/sourceforge/jnlp/PropertyDesc.java: Likewise. * netx/net/sourceforge/jnlp/ResourcesDesc.java: Likewise. * netx/net/sourceforge/jnlp/Version.java: Likewise. * netx/net/sourceforge/jnlp/cache/CacheEntry.java: Likewise. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: Likewise. * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java: Likewise. * netx/net/sourceforge/jnlp/cache/DownloadIndicator.java: Likewise. * netx/net/sourceforge/jnlp/cache/UpdatePolicy.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel /AdvancedProxySettingsDialog.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel /AdvancedProxySettingsPane.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel /TemporaryInternetFilesPanel.java: Likewise. * netx/net/sourceforge/jnlp/event/ApplicationEvent.java: Likewise. * netx/net/sourceforge/jnlp/event/DownloadEvent.java: Likewise. * netx/net/sourceforge/jnlp/runtime/AppThreadGroup.java: Likewise. * netx/net/sourceforge/jnlp/runtime/AppletAudioClip.java: Likewise. * netx/net/sourceforge/jnlp/runtime/AppletInstance.java: Likewise. * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: Likewise. * netx/net/sourceforge/jnlp/runtime/Boot13.java: Likewise. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Likewise. * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java: Likewise. * netx/net/sourceforge/jnlp/security/CertsInfoPane.java: Likewise. * netx/net/sourceforge/jnlp/security/SecurityUtil.java: Likewise. * netx/net/sourceforge/jnlp/services/XBasicService.java: Likewise. * netx/net/sourceforge/jnlp/services/XDownloadService.java: Likewise. * netx/net/sourceforge/jnlp/services/XExtensionInstallerService.java: Likewise. * netx/net/sourceforge/jnlp/services/XFileContents.java: Likewise. * netx/net/sourceforge/jnlp/services/XFileOpenService.java: Likewise. * netx/net/sourceforge/jnlp/services/XFileSaveService.java: Likewise. * netx/net/sourceforge/jnlp/services/XPersistenceService.java: Likewise. * netx/net/sourceforge/jnlp/util/PropertiesFile.java: Likewise. * netx/net/sourceforge/jnlp/util/Reflect.java: Likewise. 2011-01-04 Omair Majid * netx/net/sourceforge/jnlp/security/KeyStores.java (getKeyStoreLocation): Fix typo. Return the user-level certificate store correctly. 2011-01-04 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPPolicy.java: Add systemJnlpPolicy and userJnlpPolicy. (JNLPPolicy): Initialize the new policies. (getPermissions): Consult the extra policies as well to determine the resulting permissions to be granted. (getPolicyFromConfig): New method. Create a new Policy instance to delegate to for system- and user-level policies. 2011-01-04 Omair Majid * netx/net/sourceforge/jnlp/SecurityDesc.java: Add customTrustedPolicy. (SecurityDesc): Initialize customTrustedPolicy. (getCustomTrustedPolicy): New method. Get custom policy file from configuration and use it to initialize a custom configuration. (getPermissions): If trusted application and customTrustedPolicy is not null, delegate to otherwise return AllPermissions. * netx/net/sourceforge/jnlp/config/Defaults.java (getDefaults): Use constant for property. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: Add new constant KEY_SECURITY_TRUSTED_POLICY. * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java (installEnvironment): Pass cs as a parameter to SecurityDesc.getPermissions. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getPermissions): Likewise. 2011-01-04 Omair Majid * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: Remove JNLPRuntime import. Remove configBrowserCommand. (createMainSettingsPanel): Remove call to loadConfiguration. (loadConfiguration): Remove method. Setting the browser command should be handled by the appropriate panel. (main): Remove call to JNLPRuntime.initialize and just create a new DeploymentConfiguration object. Clarify TODO comment. 2011-01-04 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (installShutdownHooks): Only print when not null. 2011-01-04 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/SecuritySettingsPanel.java: (addComponents): Hide unsupported options. 2010-12-23 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java: (showAdvancedProxySettingsDialog): Removed call to setSystemLookAndFeel(). (setSystemLookAndFeel): Method removed. 2010-12-23 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java: (showAdvancedProxySettingsDialog): Removed creation of swing thread. * netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java: (showCacheDialog): Removed throwing of exception. * netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java: (addComponents): Removed try catch block. * /netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: (addComponents): Removed creation of swing thread and try catch block. 2010-12-22 Deepak Bhole RH665104: OpenJDK Firefox Java plugin loses a cookie * plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java (parseReturn): Skip one less space so that the first cookie is not skipped. * NEWS: Updated. 2010-12-21 Andrew Su * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsPane.java, netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java: (addComponents): Replaced key listeners and mouse listeners for text fields with document adapter. * netx/net/sourceforge/jnlp/controlpanel/DocumentAdapter.java: New class. * netx/net/sourceforge/jnlp/controlpanel/MiddleClickListener.java: Removed. 2010-12-20 Andrew Su Added a cache viewer for the control panel. * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java: (addComponents): Changed buttons to open cache viewer. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added text used by the cache viewer. * netx/net/sourceforge/jnlp/cache/CacheDirectory.java, netx/net/sourceforge/jnlp/cache/DirectoryNode.java, netx/net/sourceforge/jnlp/controlpanel/CachePane.java, netx/net/sourceforge/jnlp/controlpanel/CacheViewer.java: New classes. 2010-12-20 Omair Majid * Makefile.am ($(NETX_DIR)/launcher/controlpanel/%.o): Set program name, and launch net.sourceforge.jnlp.controlpanel.CommandLine. * netx/net/sourceforge/jnlp/config/Defaults.java (getDefaults): Set descriptions to Unknown rather than the name. Set source to localized form of internal. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java (getProperty): Check for nulls. (setProperty): Add unknown as description and source for new properties. (checkAndFixConfiguration): Fix translation constants. (parsePropertiesFile): Use unknown as description. * netx/net/sourceforge/jnlp/controlpanel/CommandLine.java: New file (CommandLine): New method. (handleHelpCommand): Likewise. (printListHelp): Likewise. (handleListCommand): Likewise. (printGetHelp): Likewise. (handleGetCommand): Likewise. (printSetHelp): Likewise. (handleSetCommand): Likewise. (printResetHelp): Likewise. (handleResetCommand): Likewise. (printInfoHelp): Likewise. (handleInfoCommand): Likewise. (printCheckHelp): Likewise. (handleCheckCommand): Likewise. (handle): Likewise. (main): Likewise. * netx/net/sourceforge/jnlp/resources/Messages.properties: Add Usage, Unknown, RConfigurationFatal, DCIncorrectValue, DCSourceInternal, DCUnknownSettingWithName, VVPossibleValues, CLNoInfo, CLValue, CLValueSource, CLDescription, CLUnknownCommand CLUnknownProperty, CLNoIssuesFound, CLIncorrectValue, CLListDescription, CLGetDescription, CLSetDescription, CLResetDescription, CLInfoDescription, CLCheckDescription and CLHelpDescription. Remove DCErrorInSetting and DCUnknownSettingWithVal. 2010-12-17 Omair Majid * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java (ControlPanel): Create and add the topPanel. (createTopPanel): New method. Creates a JPanel to display the description on top of the Control Panel. (createNotImplementedPanel): Use the same way to load resource as createTopPanel to avoid null pointer exceptions. * netx/net/sourceforge/jnlp/resources/Messages.properties: Add CPMainDescriptionShort and CPMainDescriptionLong. 2010-12-17 Omair Majid * netx/net/sourceforge/jnlp/security/SecurityWarning.java (shouldPromptUser): Use full privileges when checking configuration. This value is not security-sensitive and the method is private. * netx/net/sourceforge/jnlp/services/ServiceUtil.java (shouldPromptUser): Likewise. 2010-12-16 Omair Majid RH663680, CVE-2010-4351: * NEWS: List issue. * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java: Make sure SecurityException is thrown if necessary. 2010-12-15 Omair Majid * Makefile.am (install-exec-local): Install plugin.jar as data. If $(prefix)/jre/bin exists, then install symlinks to real javaws and itweb-settings binaries under it. ($(NETX_DIR)/launcher/%.o): Set system property java.icedtea-web.bin to point to the installed location of the javaws binary. * netx/net/sourceforge/jnlp/Launcher.java (launchExternal): Use the system property java.icedtea-web.bin to locate javaws binary. 2010-12-15 Andrew Su * /netx/net/sourceforge/jnlp/resources/Messages.properties: Changed messages for about and JRE. 2010-12-14 Andrew John Hughes * Makefile.am: (LAUNCHER_OBJECTS): Add jli_util.o, parse_manifest.o, version_comp.o, wildcard.o. (LAUNCEHR_FLAGS): Add -DEXPAND_CLASSPATH_WILDCARDS as used in build of libjli in OpenJDK. (LAUNCHER_LINK): Don't link to libjli. * launcher/jli_util.c, * launcher/parse_manifest.c, * launcher/version_comp.c, * launcher/wildcard.c: Add source files from OpenJDK6 to match header files already used. 2010-12-13 Omair Majid * netx/net/sourceforge/jnlp/config/ValueValidator.java: New file. * netx/net/sourceforge/jnlp/config/BasicValueValidators.java: New file. Provides methods to get some common validators. * netx/net/sourceforge/jnlp/config/ConfiguratonValidator.java: New file. Provides methods to validate a configuration. * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: Moved to config subpackage instead and split off into Setting.java, DeploymentConfiguration.java and Defaults.java. * netx/net/sourceforge/jnlp/config/DeploymentConfiguration.java: Renamed version of original DeploymentConfiguration. (load): Delegate to load. (load(boolean)): Load configuration and optionally fix any issues found. (checkAndFixConfiguration): New method. Validate all settings and set them to default values if problems found. * netx/net/sourceforge/jnlp/config/Setting.java: New file. Based on ConfigValue which was originally a part of DeploymentConfiguration. * netx/net/sourceforge/jnlp/config/Defaults.java: New file. Contains the default configuration settings. Originally from DeploymentConfiguration.java's loadDefaultProperties. * netx/net/sourceforge/jnlp/resources/Messages.properties: Add new messages. * netx/net/sourceforge/jnlp/Launcher.java: Fix imports. * netx/net/sourceforge/jnlp/SecurityDesc.java: Likewise. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel /AdvancedProxySettingsDialog.java: Likewise * netx/net/sourceforge/jnlp/controlpanel /AdvancedProxySettingsPane.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java: Likewise * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel/MiddleClickListener.java: Likewise * netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel/SecuritySettingsPanel.java: Likewise. * netx/net/sourceforge/jnlp/controlpanel /TemporaryInternetFilesPanel.java:Likewise. * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: Likewise. * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java: Likewise. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Likewise. * netx/net/sourceforge/jnlp/security/KeyStores.java: Likewise. * netx/net/sourceforge/jnlp/security/SecurityWarning.java: Likewise. * netx/net/sourceforge/jnlp/services/ServiceUtil.java: Likewise. * netx/net/sourceforge/jnlp/services/SingleInstanceLock.java: Likewise. * netx/net/sourceforge/jnlp/services/XBasicService.java: Likewise * netx/net/sourceforge/jnlp/services/XPersistenceService.java: Likewise. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java: Likewise. * plugin/icedteanp/java/sun/applet/JavaConsole.java: Likewise. * plugin/icedteanp/java/sun/applet/PluginMain.java: Likewise. 2010-12-13 Omair Majid * netx/net/sourceforge/jnlp/Parser.java (getInformationDesc): Fix whitespace in title, vendor and description elements. (getRelatedContent): Fix whitespace in title and description elements. (getSpanText(Node)): Delegate to ... (getSpanText(Node,boolean)): New method. Return the text in an element, optionally fixing whitespace. 2010-12-10 Omair Majid * netx/net/sourceforge/jnlp/tools/JarSigner.java: Remove unused variables collator, VERSION, IN_KEYSTORE, IN_SCOPE, privateKey, store, keystore, nullStream, token, jarfile, alias, storepass, protectedPath, storetype, providerName, providers, providerArgs, keypass, sigfile, sigalg, digestalg, signedjar, tsaUrl, tsaAlias, verify, debug, signManifest and externalSF. (getPublisher): Remove unnecessary cast. (getRoot): Likewise. 2010-12-08 Deepak Bhole PR597: Entities are parsed incorrectly in PARAM tag in applet plugin * plugin/icedteanp/IcedTeaNPPlugin.cc (encode_string): New function. Takes a string and replaces certain special characters with html escapes. (plugin_create_applet_tag): Use the new encode_string function to encode argn and argv right away, rather than encoding the whole tag. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (handleMessage): Move decoding out so that it is done after parsing. (decodeString): New function. Decodes the given string such that html escapes are replaced by the original special characters. (scanTag): Decode parameter name and value before adding it to attribute array. * NEWS: Updated. 2010-12-08 Omair Majid * configure.ac: Add check for sun.misc.HexDumpEncoder * netx/net/sourceforge/jnlp/security/CertsInfoPane.java: Import sun.misc.HexDumpEncoder. Remove import of net.sourceforge.jnlp.tools.* * netx/net/sourceforge/jnlp/tools/CharacterEncoder.java: Remove file. * netx/net/sourceforge/jnlp/tools/HexDumpEncoder.java: Remove file. 2010-12-08 Omair Majid * netx/net/sourceforge/jnlp/JNLPFile.java (getSupportedVersions): Remove method. * netx/net/sourceforge/jnlp/Parser.java: Remove supportedVersions. (Parser(JNLPFile,URL,Node,boolean,boolean)): Remove check for supported version. (getSupportedVersions): Remove method. * netx/net/sourceforge/jnlp/resources/Messages.properties: Remove PSpecUnsupported. 2010-12-08 Omair Majid * netx/net/sourceforge/jnlp/tools/JarRunner.java: Remove unused class. * netx/net/sourceforge/jnlp/tools/JarSignerResources.java: Remove unused class. 2010-12-07 Andrew John Hughes * netx/net/sourceforge/jnlp/InformationDesc.java, (InformationDesc(JNLPFile,Locale)): Correct @param tag. * netx/net/sourceforge/jnlp/JARDesc.java: (JARDesc(URL,Version,String,boolean,boolean,boolean,boolean)): Correct typo and add missing @param tag for cacheable. * netx/net/sourceforge/jnlp/JREDesc.java: (JREDesc(Version,URL,String,String,String,List)): Correct typo in @param tag. * netx/net/sourceforge/jnlp/Launcher.java: (Launcher(boolean)): Correct broken @param tag. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (addDownloadListener(DownloadListener)): Remove broken @param tags. Add correct one. (removeDownloadListener(DownloadListener)): Add missing @param tag. * netx/net/sourceforge/jnlp/security/KeyStores.java: (getKeyStoreLocation(Level,Type)): Add content to @param and @return tags. (toTranslatableString(Level,Type)): Likewise. * netx/net/sourceforge/jnlp/security/PasswordAuthenticationDialog.java: (askUser(String,int,String,String)): Correct typo in @param tag. * netx/net/sourceforge/jnlp/security/SecurityDialogPanel.java: (createSetValueListener(SecurityWarningDialog,int)): Add content to @return tag. * netx/net/sourceforge/jnlp/security/SecurityWarningDialog.java: (showCertInfoDialog(CertVerifier,SecurityWarningDialog)): Remove broken @param tag and add correct ones. (showSingleCertInfoDialog(X509Certificate,JDialog)): Add content to @param tags. * netx/net/sourceforge/jnlp/tools/CharacterEncoder.java: Remove broken @see tags from import from OpenJDK. * netx/net/sourceforge/jnlp/util/FileUtils.java: Fix bad whitespace. (sanitizeFileName(String)): Fix @param tag. * netx/net/sourceforge/nanoxml/XMLElement.java: Fix example in class documentation. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java, (waitForAppletInit(NetxPanel)): Fix @param tag. 2010-12-08 Omair Majid * netx/net/sourceforge/jnlp/tools/KeyTool.java: Remove unused class. 2010-12-07 Andrew Su * MiddleClickListener.java: Added copyright header. Corrected typo in javadoc. 2010-12-07 Omair Majid * Makefile.am (PLUGIN_VERSION): Change to IcedTea-Web ($(PLUGIN_DIR)/%.o): Define PLUGIN_NAME and PACKAGE_URL. * configure.ac (AC_INTIT): Add url. * plugin/icedteanp/IcedTeaNPPlugin.cc (PLUGIN_NAME): Removed. (PLUGIN_FULL_NAME): New definition. (PLUGIN_DESC): Add link to IcedTea-Web wiki page. (NP_GetValue): Return PLUGIN_FULL_NAME instead of PLUGIN_NAME. 2010-12-06 Deepak Bhole Fixed indentation and spacing for all .java files * .settings/org.eclipse.jdt.core.prefs: New file. Contains code style preference settings for Eclipse. * .settings/org.eclipse.jdt.ui.prefs: Same. 2010-12-03 Andrew John Hughes * netx/net/sourceforge/jnlp/cache/CacheUtil.java, (getCachedResource(URL,Version,UpdatePolicy)): Revert change to use toURI() for now. See http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-December/011270.html * netx/net/sourceforge/jnlp/cache/ResourceTracker.java, (getCacheURL(URL)): Likewise. * netx/net/sourceforge/jnlp/runtime/Boot.java, (getFile()): Use toURI.toURL() to avoid broken escaping. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (initializeResources()): Likewise. 2010-12-01 Andrew John Hughes * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (getCachedResource(URL,Version,UpdatePolicy)): Use toURI().toURL() to avoid broken escaping. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (getCacheURL(URL)): Likewise. * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: (destroy()): Suppress deprecated warning from use of thread.stop(). Only use when interrupt() has already been tried. * netx/net/sourceforge/jnlp/runtime/Boot.java: (getFile()): Use toURI.toURL() to avoid broken escaping. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: (initializeResources()): Likewise. * netx/net/sourceforge/jnlp/security/PasswordAuthenticationDialog.java: (askUser(String,int,String,String)): Use getPassword() to retrieve a character array directly. Fix overrunning line. * netx/net/sourceforge/jnlp/tools/JarSigner.java: Remove unused IdentityScope variable, scope. * netx/net/sourceforge/nanoxml/XMLElement.java: (scanWhitespace(StringBuffer)): Don't fallthrough. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: Fix warnings where std::string is used in printf rather than char* by invoking c_str on these strings. * plugin/icedteanp/java/netscape/javascript/JSException.java: (JSException()): Mark with @Deprecated annotation. (JSException(String)): Likewise. (JSException(String,String,int,String,int)): Likewise. * plugin/icedteanp/java/netscape/javascript/JSObject.java: (JSObject(String)): Remove redundant cast. (getWindow(Applet)): Likewise. * plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java: (contexts): Initialise properly with generic typing. * plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java: (getMatchingMethod(Object[]): Add missing generic type to Class instances. (getMatchingConstructor(Object[])): Likewise. (getCostAndCastedObject(Object,Class)): Likewise. (getMatchingMethods(Class,String,int)): Likewise. (getMatchingConstructors(Class,int)): Likewise. (getNum(String,Class)): Likewise. * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java: (parseCall(String,ClassLoader,Class)): Use c.cast rather than (V). (handleMessage(int,String,AccessControlContext,String)): Add missing generic type to Class instances. Remove redundant casts. (prepopulateField(int,String)): Add missing generic type to Class instance. * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (createPanel(PluginStreamHandler,int,long,URL,Hashtable)): Add missing generic types on Hashtable and PrivilegedAction. (initEventQueue(AppletPanel)): Add missing generic type to PrivilegedAction. (splitSeparator(String,String)): Use an ArrayList rather than Vector to avoid locking and use generic types. (requests): Initialise properly with generic typing. (applets): Likewise. (appletStateChanged(AppletEvent)): Use setSize and getPreferredSize. (handleMessage(int,String)): Remove redundant casts. (audioClips): Add generic types. (getAudioClip): Remove redundant cast. (imageRefs): Add generic types. (getCachedImageRef(URL)): Remove redundant cast. (appletPanels): Add generic types. (getApplets()): Likewise. (getStream(String)): Mark with @Override. (getStreamKeys()): Likewise. (systemParam): Add generic types. (printTag(PrintStream,Hashtable)): Likewise. Remove redundant casts. (updateAtts()): Use getSize() and getInsets(). Use Integer.valueOf(). (appletReload()): Add generic types to PrivilegedAction. (scanIdentifier(int[],Reader)): Use StringBuilder to avoid unnecessary locking. (skipComment(int[],Reader)): Likewise. (scanTag(int[],Reader)): Likewise. Add generic types. (parse(int,long,String,String,Reader,URL)): Use PrivilegedExceptionAction to avoid catching and rethrowing the exception manually. Add generic types. (parse(int,long,String,String,Reader,URL,PrintStream,PluginAppletPanelFactory)): Add generic types. Remove unnecessary casts. Fix overlong lines. * plugin/icedteanp/java/sun/applet/PluginMain.java: (init()): Add generic types. Remove unnecessary cast. * plugin/icedteanp/java/sun/applet/PluginObjectStore.java: (objects): Initialise properly with generic typing. (counts): Likewise. (identifiers): Likewise. * plugin/icedteanp/java/sun/applet/PluginProxySelector.java: (get(Object)): Suppress unchecked warning arising from cast to K. 2010-12-02 Omair Majid * Makefile.am (EXTRA_DIST): Add itweb-settings.desktop.in. (all-local): Add itweb-settings.desktop. (clean-desktop-files): Remove itweb-settings.desktop. (itweb-settings.desktop): New target. * itweb-settings.desktop.in: New file. 2010-12-01 Andrew John Hughes * acinclude.m4: (IT_CHECK_FOR_APPLETVIEWERPANEL_HOLE): New check to ensure sun.applet.AppletViewerPanel is public (via the patch in IcedTea, applet_hole.patch). * configure.ac: Invoke the above macro. Don't call IT_CHECK_FOR_CLASS for the same class (the above macro handles this too). * README: Mention this limitation. 2010-12-01 Andrew Su * NEWS: Added controlpanel for modifying deployments.properties * Makefile.am: (CONTROLPANEL_LAUNCHER_OBJECTS): Objects used to compile binary control panel. (all-local): Add $(NETX_DIR)/launcher/controlpanel/itw-settings. (install-exec-local): Install the control panel binary. (uninstall-local): Removes the compiled control panel binary. ($(NETX_DIR)/launcher/controlpanel/%.o): Create the launcher objects. ($(NETX_DIR)/launcher/controlpanel/itw-settings): Link the objects to make the launcher. * netx/net/sourceforge/jnlp/controlpanel/AboutPanel.java, * netx/net/sourceforge/jnlp/controlpanel/ComboItem.java, * netx/net/sourceforge/jnlp/controlpanel/ControlPanel.java, * netx/net/sourceforge/jnlp/controlpanel/DebuggingPanel.java, * netx/net/sourceforge/jnlp/controlpanel/DesktopShortcutPanel.java, * netx/net/sourceforge/jnlp/controlpanel/JREPanel.java, * netx/net/sourceforge/jnlp/controlpanel/NamedBorderPanel.java, * netx/net/sourceforge/jnlp/controlpanel/MiddleClickListener.java, * netx/net/sourceforge/jnlp/controlpanel/SecuritySettingsPanel.java, * netx/net/sourceforge/jnlp/controlpanel/TemporaryInternetFilesPanel.java, * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsDialog.java, * netx/net/sourceforge/jnlp/controlpanel/AdvancedProxySettingsPane.java, * netx/net/sourceforge/jnlp/controlpanel/NetworkSettingsPanel.java,: New classes. All methods are new as well. * netx/net/sourceforge/jnlp/resources/Messages.properties: Added messages used by control panel. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: Changed to not display a close button if null parent frame. 2010-11-30 Andrew John Hughes * Makefile.am: (liveconnect): Add NETX_DIR first on the bootclasspath so the plugin can be built against 1.7 and 1.8 branch releases of IcedTea6. 2010-11-26 Andrew John Hughes Make distcheck work. * Makefile.am: (EXTRA_DIST): Use relative paths for netx and the plugin. (clean-local): Remove empty stamps directory. (install-exec-local): Use install to install programs and data with the correct permissions. (install-data-local): Likewise. (uninstall-local): Remove documentation. (netx): Use ${INSTALL_DATA} to add resources so that read-only files aren't copied. (extra-files): Likewise. ($(NETX_DIR)/launcher/javaws): Don't create empty launcher directory. (clean-docs): Remove empty docs directory. (clean-bootstrap-directory): Remove empty bootstrap directory. 2010-11-29 Deepak Bhole * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (createPanel): Call the new framePanel() method with the proper handle. (framePanel): New method, renamed from reFrame. Changed to now do one-time framing of panel into the plugin. (handleMessage): Don't re-frame the panel. Panel is now framed only once. (destroyApplet): Dispose the frame right away, and try to remove the panel if possible. If not, handleMessage() will do it when the panel is ready/removable. 2010-11-25 Andrew John Hughes * Makefile.am: (JDK_UPDATE_VERSION): Document. (NETX_PKGS): NetX packages for documentation. (PLUGIN_PKGS): Same for the plugin. (JAVADOC_OPTS): Common options passed to javadoc. (JAVADOC_MEM_OPTS): Memory options passed to JVM if possible (taken from the previous OpenJDK build). (all-local): Depend on docs.stamp. (clean-local): Add clean-docs. (.PHONY): Add clean-docs, clean-plugin-docs, clean-netx-docs. (install-exec-local): Install the documentation if enabled. (docs): Meta-dependency for netx-docs and plugin-docs. (clean-docs): Likewise but for clean targets. (netx-docs): Build documentation for the NetX API. (clean-netx-docs): Remove the NetX docs. (plugin-docs): Build documentation for the plugin API. (clean-plugin-docs): Likewise. (bootstrap-directory): Link to javadoc binary. * acinclude.m4: (IT_FIND_JAVADOC): Find a javadoc binary, first checking user input, then the JDK and the path for 'javadoc' and 'gjdoc'. Also sets JAVADOC_SUPPORTS_J_OPTIONS if it does. * configure.ac: Call IT_FIND_JAVADOC. 2010-11-25 Omair Majid * Makefile.am (stamps/liveconnect.stamp): Set a bootclasspath to avoid using an older netx.jar during compilation. 2010-11-24 Omair Majid * netx/net/sourceforge/jnlp/util/FileUtils.java (createRestrictedDirectory): New method. Creates a directory with reduced permissions. (createRestrictedFile(File,boolean)): New method. Creates a file with reduced permissions. (createRestrictedFile(File,boolean,boolean): New method. Creates a file or a directory with reduced permissions. * netx/net/sourceforge/jnlp/Launcher.java (markNetxRunning): Do not grant unnecessary file permissions. * netx/net/sourceforge/jnlp/runtime/Boot.java: Remove umask from help message. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (activateNative): Create file with proper permissions. (getNativeDir): Create directory with proper permissions. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initializeStreams): Create files with proper permissions. * netx/net/sourceforge/jnlp/security/CertWarningPane.java (CheckBoxListener.actionPerformed): Likewise. * netx/net/sourceforge/jnlp/security/KeyStores.java (createKeyStoreFromFile): Likewise. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java (ImportButtonListener.actionPerformed): Likewise. (RemoveButtonListener.actionPerformed): Likewise. * netx/net/sourceforge/jnlp/services/SingleInstanceLock.java (createWithPort): Likewise. (getLockFile): Likewise. * netx/net/sourceforge/jnlp/services/XExtendedService.java (openFile): Likewise. * netx/net/sourceforge/jnlp/services/XPersistenceService.java (create): Likewise. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java (installDesktopLauncher): Likewise. * netx/net/sourceforge/jnlp/resources/Messages.properties: Add CantCreateFile, RCantCreateDir and RCantRename. Remove BNoBase and BOUmask. 2010-11-24 Deepak Bhole Fix PR593: Increment of invalidated iterator in IcedTeaPluginUtils (patch from barbara.xxx1975@libero.it) * plugin/icedteanp/IcedTeaPluginUtils.cc (invalidateInstance): Act on the pointer directly, rather than via members. * NEWS: Updated. 2010-11-24 Deepak Bhole Fix PR552: Support for FreeBSD's pthread implementation (patch from jkim@freebsd.org) * plugin/icedteanp/IcedTeaNPPlugin.cc (NP_Shutdown): Do pthread_join after cancel to avoid destroying mutexes or condition variables in use. * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc (PluginRequestProcessor): Initialize mutexes dynamically. (queue_cleanup): New method. Destroy dynamically created mytexes. (queue_processor): Initialize wait_mutex and push cleanup on exit. Clean up after processing stops. 2010-11-24 Andrew John Hughes * NEWS: Bring in changes from IcedTea6 1.10 NEWS (now redundant there) and apply same structure as in IcedTea6. 2010-11-24 Omair Majid CVE-2010-3860 IcedTea System property information leak via public static * netx/net/sourceforge/jnlp/runtime/Boot.java: Remove basedir option. Add NETX_ABOUT_FILE. (run): Remove call to JNLPRuntime.setBaseDir. (getAboutFile): Use the constant in this file, not JNLPRuntime. (getBaseDir): Remove obsolete method. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Remove baseDir, USER, HOME_DIR, NETXRC_FILE, NETX_DIR, SECURITY_DIR, CERTFICIATES_FILE, JAVA_HOME_DIR, NETX_ABOUT_FILE. (initialize): Do not set baseDir. (getBaseDir): Remove method. (setBaseDir): Likewise. (getDefaultBaseDir): Likewise. (getProperties): Likewise. * netx/net/sourceforge/jnlp/security/SecurityUtil.java (getTrustedCertsFilename): Delegate to KeyStores.getKeyStoreLocation. * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java (PluginAppletSecurityContext): Remove call to obsolete method. 2010-11-24 Omair Majid Fix PR592. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java (getContentsAsReader): Sanitize information before adding to desktop file. (sanitize): New method. Ensure that there are no newlines in input. 2010-11-24 Omair Majid * netx/net/sourceforge/jnlp/resources/Messages.properties: Add CVCertificateType. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: Use CVCertificateType instead of hardcoded string. 2010-11-24 Omair Majid * netx/net/sourceforge/jnlp/SecurityDesc.java: Add grantAwtPermissions. (SecurityDesc): Set grantAwtPermissions. (getSandboxPermissions): Use grantAwtPermissions to determine whether to grant permissions. 2010-11-24 Matthias Klose * Makefile.am (javaws.desktop): Search javaws.desktop.in in $(srcdir). 2010-11-24 Matthias Klose * Makefile.am (LAUNCHER_LINK): Don't explicitely link with -lc, link with -pthread instead of -lpthread. (LAUNCHER_FLAGS): Add -pthread. 2010-11-24 Chris Coulson * Makefile.am (pluginappletviewer, javaws): Fix linking with --as-needed. 2010-11-23 Omair Majid * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: Add KEY_PROXY_TYPE, KEY_PROXY_SAME, KEY_PROXY_AUTO_CONFIG_URL, KEY_PROXY_BYPASS_LIST, KEY_PROXY_BYPASS_LOCAL, KEY_PROXY_HTTP_HOST, KEY_PROXY_HTTP_PORT, KEY_PROXY_HTTPS_HOST, KEY_PROXY_HTTPS_PORT, KEY_PROXY_FTP_HOST, KEY_PROXY_FTP_PORT, KEY_PROXY_SOCKS4_HOST, KEY_PROXY_SOCKS4_PORT, and KEY_PROXY_OVERRIDE_HOSTS. (loadDefaultProperties): Use the new constants. * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java: New class. (JNLPProxySelector): New method. (parseConfiguration): New method. Initializes this object by querying the configuration. (getHost): New method. (getPort): New method. (connectFailed): New method. (select): New method. Returns a list of appropriate proxies to use for a given uri. (inBypassList): New method. Return true if the host in the URI should be bypassed for proxy purposes. (isLocalHost): New method. (getFromConfiguration): New method. Finds a proxy based on configuration. (getFromPAC): New method. (getFromBrowser): New method. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Install proxy selector and authenticator. * plugin/icedteanp/java/sun/applet/PluginMain.java (init): Do not install authenticator. (CustomAuthenticator): Moved to... * netx/net/sourceforge/jnlp/security/JNLPAuthenticator.java: Here. * plugin/icedteanp/java/sun/applet/PasswordAuthenticationDialog.java Moved to... * netx/net/sourceforge/jnlp/security /PasswordAuthenticationDialog.java: Here. * plugin/icedteanp/java/sun/applet/PluginProxySelector.java: Extend JNLPProxySelector. (select): Renamed to... (getFromBrowser): New method. 2010-11-19 Omair Majid * Makefile.am (EXTRA_DIST): Replace javaws.desktop with javaws.desktop.in. (all-local): Add javaws.desktop. (clean-local): Add dependency on clean-desktop-files. (.PHONY): Add clean-desktop- files. (clean-desktop-files): New target. (javaws.desktop): New target. Use the absolute path to javaws binary in the Exec= line to create the javaws.desktop file. * javaws.desktop: Renamed to... * javaws.desktop.in: New file. Does not contain Encoding key. Value for Icon does not contain extension. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java (JAVA_ICON_NAME): Set to icon name without the extension. 2010-11-18 Omair Majid * netx/net/sourceforge/jnlp/SecurityDesc.java: Remove window banner permissions from sandboxPermissions and j2eePermissions. (getSandBoxPermissions): Dynamically add window banner permissions if allowed by configuration. * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: Add KEY_SECURITY_PROMPT_USER, KEY_SECURITY_ALLOW_HIDE_WINDOW_WARNING, KEY_SECURITY_PROMPT_USER_FOR_JNLP, and KEY_SECURITY_INSTALL_AUTHENTICATOR. (loadDefaultProperties): Use the new constants. * netx/net/sourceforge/jnlp/security/SecurityWarning.java (showAccessWarningDialog): Check if the user should be prompted before prompting the user. (showNotAllSignedWarningDialog): Likewise. (showCertWarningDialog): Likewise. (showAppletWarning): Likewise. (shouldPromptUser): New method. Check if configuration allows showing user prompts. * netx/net/sourceforge/jnlp/services/ServiceUtil.java (checkAccess(AccessType,Object...)): Clarify javadocs. (checkAccess(ApplicationInstance,AccessType,Object...)): Clarify javadocs. Only prompt the user if showing JNLP prompts is ok. (shouldPromptUser): New method. Returns true if configuration allows for showing JNLP api prompts. * plugin/icedteanp/java/sun/applet/PluginMain.java (init): Only install custom authenticator if allowed by configuration. 2010-11-18 Omair Majid * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: Add KEY_ENABLE_LOGGING. (loadDefaultProperties): Use KEY_ENABLE_LOGGING. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Add redirectStreams, STDERR_FILE and STDOUT_FILE. (initialize): Call initializeStreams. (initializeStreams): New method. Redirects or duplicates stdout and stderr to the logging files as required. (setRedirectStreams): New method. Sets whether stdout/stderr streams should be redirected. * plugin/icedteanp/java/sun/applet/PluginMain.java: (PluginMain): Move code for creating logging files into JNLPRuntime. Call JNLPRuntime.setRedirectStreams to redirect streams. (TeeOutputStream): Move to its own class. * netx/net/sourceforge/jnlp/util/TeeOutputStream.java: Moved from PluginMain into this new class. 2010-11-18 Omair Majid * NEWS: Update with new interfaces * netx/javax/jnlp/DownloadService2.java: New interface. (ResourceSpec): New class. (ResourceSpec.ResourceSpec): New method. (ResourceSpec.getExpirationDate): New method. (ResourceSpec.getLastModified): New method. (ResourceSpec.getSize): New method. (ResourceSpec.getType): New method. (ResourceSpec.getUrl): New method. (ResourceSpec.getVersion): New method. (getCachedResources): New method. (getUpdateAvaiableReosurces): New method. * netx/javax/jnlp/IntegrationService.java: New interface. (hasAssociation): New method. (hasDesktopShortcut): New method. (hasMenuShortcut): New method. (removeAssociation): New method. (removeShortcuts): New method. (requestAssociation): New method. (requestShortcut): New method. 2010-11-16 Andrew Su * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: Corrected typo in one of the default values. 2010-11-11 Omair Majid * netx/net/sourceforge/jnlp/runtime/Boot.java (main): Move trust manager initialization code into JNLPRuntime.initialize. * plugin/icedteanp/java/sun/applet/PluginMain.java (init): Likewise. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Set the default SSL TrustManager here. * netx/net/sourceforge/jnlp/security/CertWarningPane.java (CheckBoxListener.actionPerformed): Add this certificate into user's trusted certificate store. * netx/net/sourceforge/jnlp/tools/KeyTool.java (addToKeyStore(File,KeyStore)): Move to CertificateUtils. (addToKeyStore(X509Certificate,KeyStore)): Likewise. (dumpCert): Likewise. * netx/net/sourceforge/jnlp/security/CertificateUtils.java: New class. (addToKeyStore(File,KeyStore)): Moved from KeyTool. (addToKeyStore(X509Certificate,KeyStore)): Likewise. (dumpCert): Likewise. (inKeyStores): New method. * netx/net/sourceforge/jnlp/security/HttpsCertVerifier.java (getRootInCacerts): Check all available CA store to check if root is in CA certificates. * netx/net/sourceforge/jnlp/security/KeyStores.java (getKeyStore(Level,Type,boolean)): Add security check. (getClientKeyStores): New method. * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java (VariableX509TrustManager): Initialize multiple CA, certificate and client trust managers. (checkClientTrusted): Check all the client TrustManagers if certificate is trusted. (checkAllManagers): Check multiple CA certificates and trusted certificates to determine if the certificate chain can be trusted. (isExplicitlyTrusted): Check with multiple TrustManagers. (getAcceptedIssuers): Gather results from multiple TrustManagers. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java (ImportButtonListener): Use CertificateUtils instead of KeyTool. * netx/net/sourceforge/jnlp/tools/JarSigner.java (checkTrustedCerts): Use multiple key stores to check if certificate is directly trusted and if the root is trusted. 2010-11-09 Omair Majid * netx/net/sourceforge/jnlp/resources/Messages.properties: Add ButAllow, ButClose, ButCopy, ButMoreInformation, ButProceed, ButRun, AlwaysAllowAction, Continue, Field, From, Name, Publisher, Value, Version, SNoAssociatedCertificate, SAlwaysTrustPublisher, SHttpsUnverified, SNotAllSignedSummary, SNotAllSignedDetail, SNotAllSignedQuestion, SCertificateDetails, SIssuer, SSerial, SMD5Fingerprint, SSHA1Fingerprint, SSignature, SSignatureAlgorithm, SSubject, SValidity, CVCertificateViewer, CVDetails, CVIssuedTo, CVExport, CVImport, CVIssuedBy, IssuedTo, CVRemove, CVRemoveConfirmMessage,CVRemoveConfirmTitle, CVUser, CVSystem, KS, KSCerts, KSJsseCerts, KSCaCerts, KSJsseCaCerts, and KSClientCerts. * netx/net/sourceforge/jnlp/security/AccessWarningPane.java (addComponents): Use localized strings. * netx/net/sourceforge/jnlp/security/CertWarningPane.java (addComponents): Likewise. * netx/net/sourceforge/jnlp/security/CertsInfoPane.java (parseCert): Likewise. (addComponents): Likewise. * netx/net/sourceforge/jnlp/security/MoreInfoPane.java (addComponents): Likewise. * netx/net/sourceforge/jnlp/security/NotAllSignedWarningPane.java (addComponents): Likewise. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java: Likewise. (addComponents): Likewise. (CertificateType.toString): Likewise. (RemoveButtonListener.actionPerformed): Likewise. 2010-11-05 Omair Majid * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: Add KEY_BROWSER_PATH. (loadDefaultProperties): Use KEY_BROWSER_PATH. * netx/net/sourceforge/jnlp/services/XBasicService.java (initialize): Use the browser command from the configuration. Save updates to configuration as well. 2010-11-05 Omair Majid * netx/net/sourceforge/jnlp/ShortcutDesc.java: Change prefixes from SHORTCUT_ to CREATE_. * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java (addMenuAndDesktopEntries): Call shouldCreateShortcut to find out if shortcut should be created. Remove call to checkAccess which does nothing as the entire stack contains trusted classes. (shouldCreateShortcut): New method. Use the configuration to find out if a shorcut should be created, and possibly prompt the user. * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: Add KEY_CREATE_DESKTOP_SHORTCUT. (loadDefaultProperties): Use KEY_CREATE_DESKTOP_SHORTCUT. 2010-11-08 Omair Majid * Makefile.am (JDK_UPDATE_VERSION): Define variable. 2010-11-04 Omair Majid * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: Add KEY_USER_TRUSTED_CA_CERTS, KEY_USER_TRUSTED_JSSE_CA_CERTS, KEY_USER_TRUSTED_CERTS, KEY_USER_TRUSTED_JSSE_CERTS, KEY_USER_TRUSTED_CLIENT_CERTS, KEY_SYSTEM_TRUSTED_CA_CERTS, KEY_SYSTEM_TRUSTED_JSSE_CA_CERTS, KEY_SYSTEM_TRUSTED_CERTS, KEY_SYSTEM_TRUSTED_JSSE_CERTS, KEY_SYSTEM_TRUSTED_CLIENT_CERTS (loadDefaultProperties): Use the defined constants. * netx/net/sourceforge/jnlp/security/KeyStores.java: New class. (getPassword): New method. Return the default password used for KeyStores. (getKeyStore(Level,Type)): New method. Returns the appropriate KeyStore. (getKeyStore(Level,Type,String)): Likewise. (getCertKeyStores): New method. Return all the trusted certificate KeyStores. (getCAKeyStores): New method. Return all the trusted CA certificate KeyStores. (getKeyStoreLocation): New method. Return the location of the appropriate KeyStore. (toTranslatableString): New method. Return a string that can be used to create a human-readable name for the KeyStore. (toDisplayableString): New method. Return a human-readable name for the KeyStore. (createKeyStoreFromFile): New method. Creates a new KeyStore object, initializing it from the given file if possible. * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java (CertificatePane): Create two JTables. Populate the tables when done creating the user interface. (initializeKeyStore): Use the correct keystore. (addComponents): Do not read KeyStore. Create more interface elements to show the new possible KeyStores. Mark some buttons to be disabled when needed. (repopulateTable): Renamed to... (repopulateTables): New method. Read KeyStore and use the contents to create the user and system tables. (CertificateType): New class. (CertificateTypeListener): New class. Listens to JComboBox change events. (TabChangeListener): New class. Listens to new tab selections. (ImportButtonListener): Import certificates to the appropriate KeyStore. (ExportButtonListener): Find the certificate from the right table. (RemoveButtonListener): Find the certificate from the right table and right the KeyStore. (DetailsButtonListener): Find the certificate from the right table. * netx/net/sourceforge/jnlp/security/viewer/CertificateViewer.java (showCertficaiteViewer): Initialize the JNLPRuntime so the configuration gets loaded. * netx/net/sourceforge/jnlp/tools/KeyTool.java (addToKeyStore(File,KeyStore)): New method. Adds certificate from the file to the KeyStore. (addToKeyStore(X509Certificate,KeyStore)): New method. Adds a certificate to a KeyStore. 2010-11-04 Deepak Bhole * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java (update): Override method and implement double-buffering. 2010-10-28 Andrew John Hughes * Makefile.am: (NETX_BOOTSTRAP_CLASSES): Removed. (PLUGIN_BOOTSTRAP_CLASSES): Likewise. (NETX_SUN_CLASSES): Likewise. (PLUGIN_SUN_CLASSES): Likewise. * acinclude.m4: (IT_CHECK_FOR_CLASS): Require detection of javac and java. Put test class in sun.applet to get access to some internal classes. Change test to use forName for the same reason. I expect to be able to revert this when usage of sun.applet is fixed. (IT_FIND_JAVA): Ported from IcedTea6. Change to prioritise 'java' over 'gij'. * configure.ac: Add IT_CHECK_FOR_CLASS checks for classes which are required but not found in JDKs other than Oracle-based ones. Also check for java.* classes missing from current versions of gcj but which may appear there in future. 2010-11-03 Omair Majid * netx/net/sourceforge/jnlp/Launcher.java (markNetxRunning): Get file name from configuration. (markNetxStopped): Likewise. * netx/net/sourceforge/jnlp/cache/CacheUtil.java (clearCache): Get cache directory from configuration. (okToClearCache): Get netx_running file from configuration. (getCacheFile): Get cache directory from configuration. (urlToPath): Change semantics to take in the full path of the directory instead of a directory under runtime. * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: Change DEPLOYMENT_DIR to ".icedtea". Add constants KEY_USER_CACHE_DIR, KEY_USER_PERSISTENCE_CACHE_DIR, KEY_SYSTEM_CACHE_DIR, KEY_USER_LOG_DIR, KEY_USER_TMP_DIR, KEY_USER_LOCKS_DIR, and KEY_USER_NETX_RUNNING_FILE. (load): Use DEPLOYMENT_DIR instead of hardcoded string. (loadDefaultProperties): Add LOCKS_DIR. Replace strings with constants. Add new default values for persistence cache directory, single instance locks directory and the netx_running file. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Remove unneeded TMP_DIR, LOCKS_DIR and NETX_RUNNING_FILE * netx/net/sourceforge/jnlp/services/SingleInstanceLock.java (getLockFile): Get locks directory from configuration. * netx/net/sourceforge/jnlp/services/XPersistenceService.java (toCacheFile): Get persistence cache directory from configuration. * netx/net/sourceforge/jnlp/util/XDesktopEntry.java (getContentsAsReader): Get cache directory from configuration. (installDesktopLauncher): Get temporary directory from configuration. Make parent directories if required. * plugin/icedteanp/java/sun/applet/JavaConsole.java (initialize): Get log directory from configuration and create the error and output files under it. * plugin/icedteanp/java/sun/applet/PluginMain.java: PLUGIN_STDERR_FILE and PLUGIN_STDOUT_FILE are now just filesnames. (PluginMain): Use configuration for finding the log directory. Initialize JNLPRuntime before creating the stderr and stdout logs. 2010-11-01 Omair Majid * Makefile.am (clean-IcedTeaPlugin): Only delete launcher directory if it exists. 2010-11-01 Deepak Bhole PR542: Plugin fails with NPE on http://www.openprocessing.org/visuals/iframe.php?visualID=2615 * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeResources): If cacheFile is null (JAR couldn't be downloaded), try to continue, rather than allowing the exception to cause an abort. * NEWS: Updated. 2010-11-01 Deepak Bhole * plugin/docs: Added new docs folder that contains plugin documentation. * plugin/docs/MessageBusArchitecture.png: Diagram of the JS <-> Java message handling architectrure. * plugin/docs/OverallArchitecture.png: Diagram of the overall plugin architecture. * plugin/docs/java-js-wf.png: Sequence diagram showing an example LiveConnect call from an applet to JavaScript/Browser. * plugin/docs/js-java-wf.png: Sequence diagram showing an example LiveConnect call from JavaScript/Browser to an applet. * plugin/docs/npplugin_liveconnect_design.pdf: Slides with notes on the above diagrams. 2010-10-29 Omair Majid * netx/net/sourceforge/jnlp/JNLPFile.java: Add component. (getLaunchInfo): Modify javadoc to indicate that it does not return the ComponentDesc. (getComponent): Return component instead of launchType. (isComponent): Check if component is not null. (parse): Find and set component descriptor. * netx/net/sourceforge/jnlp/Parser.java (getLauncher): Remove all checks for component-desc. Allow having none of application-desc, applet-desc and installer-desc. (getComponent): Check for more than one component-desc element. Read and parse the component-desc. 2010-10-28 Omair Majid * netx/net/sourceforge/jnlp/security/SecurityWarningDialog.java (showMoreInfoDialog): Make dialog modal. (showCertInfoDialog): Likewise. (showSingleCertInfoDialog): Likewise. (initDialog): Use setModality instead of setModal. 2010-10-27 Deepak Bhole * plugin/icedteanp/IcedTeaNPPlugin.cc (plugin_create_applet_tag): Escape the entire applet tag, not just the params. 2010-10-27 Omair Majid * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java (load): Do a security check at start. A security exception later on may accidentally reveal a filename or a system property. (save): Likewise. 2010-10-26 Omair Majid * netx/net/sourceforge/jnlp/Launcher.java (doPerApplicationAppContextHacks): New method. Create a new ParserDelegate to intialize the per AppContext dtd used by Swing HTML controls. (TgThread.run): Call doPerApplicationAppContextHacks. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize): Call doMainAppContextHacks. (doMainAppContextHacks): New method. Create a new ParserDelegate to initialize the per AppContext dtd used by Swing HTML controls. 2010-10-26 Omair Majid * netx/net/sourceforge/jnlp/Launcher.java (launchApplication): Mark main method as accessible before invoking it. 2010-10-26 Omair Majid * netx/net/sourceforge/jnlp/Parser.java: Add 1.1, 1.2, 1.3 and 1.4 to supportedVersions. 2010-10-26 Omair Majid * netx/net/sourceforge/jnlp/runtime/Translator.java (R(String)): New method. 2010-10-26 Deepak Bhole * netx/net/sourceforge/jnlp/PluginBridge.java: Trim whitespace from jar names in the constructor. 2010-10-26 Deepak Bhole * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Replace all status.put calls with calls to updateStatus(). (createPanel): Create a frame with a 0 handle. Use the new waitForAppletInit function to wait until applet is ready. (reFrame): Re-order code so that the panel is never parentless. (handleMessage): Re-wrote message processing to handle destroy calls correctly, checking for them more often to prevent a frame from popping up if the tab/page is closed before loading finishes. Decode special characters in the message. (updateStatus): New function. Updates the status for the given instance if applicable. (destroyApplet): New function. Destroys a given applet and frees related resources. (waitForAppletInit): New function. Blocks until applet is initialized. (parse): Remove part that decoded the params. Decoding is now done earlier in handleMessage(). * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java: (getPriorityStrIfPriority): Mark destroy messages as priority. (bringPriorityMessagesToFront): Scans the queue for priority messages and brings them to the front. (run): If the queue is not empty and there are no workers left, run bringPriorityMessagesToFront() and retry. 2010-10-26 Andrew Su * Makefile.am: Split rm -rf into rm -f and rmdir for launcher directory. 2010-10-25 Omair Majid * netx/net/sourceforge/jnlp/ShortcutDesc.java: Add SHORTCUT_NEVER, SHORTCUT_ALWAYS, SHORTCUT_ASK_USER, SHORTCUT_ASK_USER_IF_HINTED, SHORTCUT_ALWAYS_IF_HINTED, SHORTCUT_DEFAULT. * netx/net/sourceforge/jnlp/resources/Messages.properties: Add RConfigurationError. * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java: New file. (ConfigValue): New class. Holds a configuration value. (DeploymentConfiguration): New method. (load): New method. (getProperty): Likewise. (getAllPropertyNames): Likewise. (setProperty): Likewise. (loadDefaultProperties): Likewise. (findSystemConfigFile): Likewise. (loadSystemConfiguration): Likewise. (loadProperties): Likewise. (save): Likewise. (parsePropertiesFile): Likewise. (mergeMaps): Likewise. (dumpConfiguration): Likewise. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: (initialize): Load configuration. (getConfiguration): Return the configuration. 2010-10-25 Omair Majid * net/sourceforge/jnlp/ExtensionDesc.java: Import Translator.R and use that. * net/sourceforge/jnlp/JNLPFile.java: Import Translator.R. (R): Remove. * net/sourceforge/jnlp/JREDesc.java: Import Translator.R. (checkHeapSize): Use R instead of JNLPRuntime.getMessage. * net/sourceforge/jnlp/Launcher.java: Import Translator.R. (R): Remove. * net/sourceforge/jnlp/Parser.java: Import Translator.R (R(String)): Remove. (R(String,Object)): Remove. (R(String,Object,Object)): Remove. (R(String,Object,Object,Object)): Remove. * net/sourceforge/jnlp/cache/CacheEntry.java: Import Translator.R (CacheEntry): Use R instead of JNLPRuntime.getMessage. * net/sourceforge/jnlp/cache/CacheUtil.java: Import Translator.R (R(String)): Remove. (R(String,Object)): Remove. * net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java: Import Translator.R and use that instead of JNLPRuntime.getMessage. * net/sourceforge/jnlp/runtime/Boot.java: Import Translator.R. (R(String)): Remove. (R(String, Object)): Remove. (run): Use R instead of JNLPRuntime.getMessage. * net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Import Translator.R. (R): Remove. * net/sourceforge/jnlp/runtime/JNLPSecurityManager.java: Import Translator.R. Use it instead of JNLPRuntime.getMeesage. (R): Remove. * net/sourceforge/jnlp/security/AccessWarningPane.java: Import Translator.R. * net/sourceforge/jnlp/security/CertWarningPane.java: Likewise. * net/sourceforge/jnlp/security/HttpsCertVerifier.java: Import Translator.R. (R(String)): Remove. (R(String,String,String)): Remove. * net/sourceforge/jnlp/security/MoreInfoPane.java: Import Translator.R. * net/sourceforge/jnlp/security/SecurityDialogPanel.java (R(String)): Remove. (R(String,Object)): Remove. * net/sourceforge/jnlp/services/ServiceUtil.java (R): Remove. * net/sourceforge/jnlp/services/SingleInstanceLock.java: Import Translator.R (R(String)): Remove. (R(String,Object)): Remove. * net/sourceforge/jnlp/tools/JarSigner.java: Import Translator.R. (R): Remove. * net/sourceforge/jnlp/runtime/Translator.java: New file (R(String,Object...)): New method. 2010-10-25 Andrew Su * Makefile.am: (clean-IcedTeaPlugin): Remove launcher folder first. (clean-plugin): Removed called to remove launcher folder 2010-10-22 Omair Majid * netx/net/sourceforge/jnlp/NetxPanel.java (runLoader): Do not initialize JNLPRuntime here. (createAppletThreads): Initialize JNLPRuntim here. * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: Switch from SecurityWarningDialog.AccessType to SecurityWarning.AccessType. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (getInstance(JNLPFile,UpdatePolicy)): Switch to SecurityWarning. (initializeResources): Likewise. (checkTrustWithUser): Likewise. * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java: Add securityDialogMesasgeHandler. (initialize): Set System look and feel. Start security thread. (startSecurityThread): New method. Starts a thread to show security dialogs. (getSecurityDialogHandler): Returns the securityDialogMessageHandler. * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java: Switch from SecurityWarningDialog.AccessType to SecurityWarning.AccessType. (checkAwtEventQueueAccess): New method. Skeleton code for allowing EventQueue acccess to applets. * netx/net/sourceforge/jnlp/security/AccessWarningPane.java: Switch from SecurityWarningDialog.AccessType to SecurityWarning.AccessType. * netx/net/sourceforge/jnlp/security/CertWarningPane.java: Likewise. * netx/net/sourceforge/jnlp/security/SecurityWarningDialog.java: Move DialogType and AccessType to SecurityWarning. (SecurityWarningDialog(DialogType,AccessType,JNLPFile,CertVerifier, X509Certificate,Object[])): New method. The catch-all construction. (SecurityWarningDialog(DialogType,AccessType,JNLPFile): Delegate to the new constructor. (SecurityWarningDialog(DialogType,AccessType,JNLPFile,CertVerifier)): Likewise. (SecurityWarningDialog(DialogType,AccessType,CertVerifier)): Likewise. (SecurityWarningDialog(DialogType,AccessType,JNLPFile,Object[])): Likewise. (SecurityWarningDialog(DialogType,X509Certificate)): Likewise. (showAccessWarningDialog(AccessType,JNLPFile)): Move to SecurityWarning class. (showAccessWarningDialog(AccessType,JNLPFile,Object[])): Likewise. (showNotAllSignedWarningDialog(JNLPFile)): Likewise. (showCertWarningDialog(AccessType,JNLPFile,CertVerifier)): Likewise. (showAppletWarning): Likewise. (initDialog): Make dialog non modal and remove window closing listener. (getValue): Make public. (dispose): New method. Notify listeners. (notifySelectionMade): New method. Notify listeners that user has made a decision. (addActionListener): New method. Add a listener to be notified when user makes a decision about this security warning. * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java: Switch from SecurityWarningDialog.AccessType to SecurityWarning.AccessType. * netx/net/sourceforge/jnlp/services/ServiceUtil.java: Likewise. * netx/net/sourceforge/jnlp/services/XClipboardService.java: Likewise. * netx/net/sourceforge/jnlp/services/XExtendedService.java: Likewise. * netx/net/sourceforge/jnlp/services/XFileOpenService.java: Likewise. * netx/net/sourceforge/jnlp/services/XFileSaveService.java: Likewise. * netx/net/sourceforge/jnlp/security/SecurityDialogMessage.java: New class. * netx/net/sourceforge/jnlp/security/SecurityDialogMessageHandler.java: New class. (run): New method. Runs the security message loop. (handleMessage): New method. Handles a SecurityDialogMessage to show a security warning. (postMessage): New method. Posts a message to sthe security message queue. * netx/net/sourceforge/jnlp/security/SecurityWarning.java: New class. Move AccessType and DialogType from SecurityWarningDialog to here. (showAccessWarningDialog): Moved from SecurityWarningDialog to here. (showAccessWarningDialog): Moved from SecurityWarningDialog to here. Modified to post messages to the security queue instead of showing a SecurityWarningDialog directly. (showNotAllSignedWarningDialog): Likewise. (showCertWarningDialog): Likewise. (showAppletWarning): Likewise. (getUserReponse): New method. Posts a message to the security thread and blocks until it gets a response from the user. 2010-10-20 Andrew John Hughes * netx/javax/jnlp/ServiceManager.java: (lookupTable): Add generic types. * netx/net/sourceforge/jnlp/AppletDesc.java: (parameters): Likewise. (AppletDesc(String,String,URL,int,int,Map)): Likewise. (getParameters()): Likewise. * netx/net/sourceforge/jnlp/ApplicationDesc.java: (getArguments()): Remove redundant cast. (addArgument(String)): Add generic typing. * netx/net/sourceforge/jnlp/ExtensionDesc.java: (extToPart): Add generic types. (eagerExtParts): Likewise. * netx/net/sourceforge/jnlp/InformationDesc.java: (info): Likewise. (getIcons(Object)): Add generic typing. (getAssociations()): Likewise. (getRelatedContents()): Likewise. (getItem(Object)): Likewise. (getItems(Object)): Likewise. (addItem(String,Object)): Likewise. * netx/net/sourceforge/jnlp/JNLPFile.java: (resources): Likewise. (InformationDesc.getItems(Object)): Likewise. (getResources(Class)): Likewise. * netx/net/sourceforge/jnlp/LaunchException.java: (getCauses()): Likewise. * netx/net/sourceforge/jnlp/Launcher.java: (launchApplication(JNLPFile)): Likewise. * netx/net/sourceforge/jnlp/NetxPanel.java: (NetxPanel(URL,Hashtable)): Likewise. (NetxPanel(URL,Hashtable,boolean)): Likewise. * netx/net/sourceforge/jnlp/Node.java: (getChildNodes()): Likewise. * netx/net/sourceforge/jnlp/Parser.java: (getResources(Node,boolean)): Likewise. (getInfo(Node)): Likewise. (getInformationDesc(Node)): Likewise. (getApplet(Node)): Likewise. (getApplication(Node)): Likewise. (splitString(String)): Likewise. (getLocales(Node)): Likewise. (getChildNodes(Node,String)): Likewise. * netx/net/sourceforge/jnlp/PluginBridge.java: Fix variable naming and add generic types. (cacheJars): Changed from cache_jars. (cacheExJars): Changed from cache_ex-jars. (atts): Add generic typing. (PluginBridge(URL,URL,String,String,int,int,Hashtable)): Likewise. (getInformation(Locale)): Likewise. (getResources(Locale,String,String)): Likewise. (getJARs()): Avoid excessive copying; filtering already performed by getResources in JNLPFile. * netx/net/sourceforge/jnlp/ResourcesDesc.java: (resources): Add generic typing. (getJREs()): Likewise. (getJARs()): Likewise. (getJARs(String)): Likewise. (getExtensions()): Likewise. (getPackages()): Likewise. (getPackages(String)): Likewise. (getProperties()): Likewise. (getPropertiesMap()): Likewise. (getResources(Class)): Make generic. * netx/net/sourceforge/jnlp/Version.java: (matches(Version)): Add generic types. (matchesAny(Version)): Likewise. (matchesSingle(String)): Likewise. (matches(String,String)): Likewise. (equal(List,List)): Likewise. (greater(List,List)): Likewise. (compare(String,String)): Use Integer.valueOf. (normalize(List,int)): Add generic types, using a List of lists rather than an array of lists. (getVersionStrings()): Add generic types. (getParts()): Likewise. * netx/net/sourceforge/jnlp/cache/CacheUtil.java: (waitForResources(ApplicationInstance,ResourceTracker, URL,String)): Likewise. * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java: (getListener(ApplicatonInstance,String,URL)): Use setVisible instead of show(). (disposeListener(DownloadServiceListener)): Use setVisible instead of hide(). (DownloadPanel.urls): Add generic typing. (DownloadPanel.panels): Likewise. (DownloadPanel.update(URL,String,long,long,int)): Fix formatting. Add generic types. * netx/net/sourceforge/jnlp/cache/Resource.java: (resources): Add generic typing. (trackers): Likewise. (getResource(URL,Version,UpdatePolicy)): Use generic types. (getTracker()): Likewise. (addTracker(ResourceTracker)): Likewise. (fireDownloadEvent()): Likewise. * netx/net/sourceforge/jnlp/cache/ResourceTracker.java: (prefetchTrackers): Add generic typing. (queue): Likewise. (active): Likewise. (resources): Likewise. (listeners): Likewise. (fireDownloadEvent(Resource)): Remove unneeded cast. (getPrefetch()): Use generic typing. (selectByFlag(List,int,int)): Likewise. (getResource(URL)): Likewise. * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java: (weakClips): Add generic types. (destroy()): Use generic typing. (getApplets()): Likewise. (getStreamKeys()): Likewise. * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java: (weakWindows): Add generic types. (installEnvironment()): Likewise. (destroy()): Remove redundant cast. * netx/net/sourceforge/jnlp/runtime/Boot.java: Extend PrivilegedAction. (run()): Add generic typing. (getOptions(String)): Likewise. * netx/net/sourceforge/jnlp/runtime/Boot13.java: (main(String[]): Likewise. * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: Fix formatting. (urlToLoader): Add generic types. (resourcePermissions): Likewise. (available): Likewise. (jarEntries): Likewise. (getInstance(JNLPFile,UpdatePolicy)): Remove redundant cast. (getInstance(URL,String,Version,UpdatePolicy)): Likewise. (initializeExtensions()): Add generic types. (initializePermissions()): Likewise. (initializeResources()): Likewise. (getPermissions(CodeSource)): Likewise. (fillInPartJars(List)): Likewise. (activateJars(List)): Likewise. (loadClass(String)): Likewise. Suppress warnings due to sun.misc.JarIndex usage. (findResources(String)): Mark as overriding. Add generic types. (getExtensionName()): Add @Deprecated annotation. (getExtensionHREF()): Likewise. * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java: (weakWindows): Add generic typing. (weakApplications): Likewise. (getApplication(Window)): Remove redundant casts. Add w, which is window cast to Window. * netx/net/sourceforge/jnlp/services/ServiceUtil.java: (invoke(Object,Method,Object[])): Use generic types. * netx/net/sourceforge/jnlp/services/XPersistenceService.java: (getNames(URL)): Likewise. * netx/net/sourceforge/jnlp/tools/JarSigner.java: (verifyJars(List,ResourceTracker)): Remove redundant cast. * netx/net/sourceforge/jnlp/util/WeakList.java: Redesign as a generic type. (refs): Add generic types. (deref(WeakReference)): Likewise. (get(int)): Likewise. (set(int,Object)): Likewise. (add(int,E)): Likewise. (remove()): Likewise. (hardList()): Likewise. * netx/net/sourceforge/nanoxml/XMLElement.java: (attributes): Add generic typing. (children): Likewise. (entities): Likewise. (XMLElement()): Use generic types. (XMLElement(Hashtable): Likewise. (resolveEntity(StringBuffer)): Remove redundant cast. 2010-10-20 Omair Majid * AUTHORS: Add Francis Kung, Andrew Su, Joshua Sumali, Mark Wielaard and Man Lung Wong. Add link to forked Netx project. 2010-10-20 Matthias Klose * AUTHORS: Add myself. 2010-10-20 Andrew Su * PluginBridge.java: (PluginBridge): Added parsing for jnlp_href, and reading the jnlp file for applet parameters. 2010-10-20 Matthias Klose * Makefile.am (stamps/extra-class-files.stamp): Fix -sourcepath. 2010-10-20 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeResources): Do not perform url encoding on the file url. Stay consistent with the unencoded urls used in getPermissions. 2010-10-20 Omair Majid * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (JNLPClassLoader): Call installShutdownHooks. (installShutdownHooks): New method. Installs a shutdown hook to recursively delete the contents of nativeDir. (activateNative): Only create a nativeDir if there are native libraries. 2010-10-19 Deepak Bhole * Makefile.am: ($(NETX_DIR)/launcher/javaws): Use $(NETX_DIR). 2010-10-19 Deepak Bhole * Makefile.am: (NETX_DIR): New variable representing the NetX build dir. (NETX_LAUNCHER_OBJECTS): Prefix with $(NETX_DIR). (LAUNCHER_LINK): Fixed escaping of ORIGIN to the rpath argument. (all-local): Fix javaws launcher path. (install-exec-local): Likewise, and use $(NETX_DIR) for NetX classes.jar. (clean-plugin): Remove launcher. (liveconnect): Use NETX_DIR in classpath. (netx): Use NETX_DIR throughout. (netx-dist): Likewise. (clean-netx): Likewise. ($(NETX_DIR)/launcher/%.o)): Likewise. * launcher/jni_md.h: Imported from OpenJDK. 2010-10-20 Matthias Klose * Makefile.am: Fix build with builddir != srcdir. 2010-10-19 Andrew John Hughes * Makefile.am: (PLUGIN_LAUNCHER_OBJECTS): Do prefixing once. (NETX_LAUNCHER_OBJECTS): Likewise for NetX. (pluginappletviewer): Use PLUGIN_LAUNCHER_OBJECTS. (javaws): Use NETX_LAUNCHER_OBJECTS. * configure.ac: Re-enable foreign (I want to use GNU make!) * README: Use gmake not make. 2010-10-19 Andrew John Hughes * .hgignore, * Makefile.am, * acinclude.m4, * autogen.sh, * configure.ac, * extra/net/sourceforge/jnlp/about/HTMLPanel.java, * extra/net/sourceforge/jnlp/about/Main.java, * extra/net/sourceforge/jnlp/about/resources/about.html, * extra/net/sourceforge/jnlp/about/resources/applications.html, * extra/net/sourceforge/jnlp/about/resources/notes.html, * javac.in, * javaws.desktop: Imported from IcedTea6. * launcher/java.c, * launcher/java.h, * launcher/java_md.c, * launcher/java_md.h, * launcher/jli_util.h, * launcher/jni.h, * launcher/jvm.h, * launcher/jvm_md.h, * launcher/manifest_info.h, * launcher/splashscreen.h, * launcher/splashscreen_stubs.c, * launcher/version_comp.h, * launcher/wildcard.h: Imported from OpenJDK. * netx/javaws.1, * netx/javax/jnlp/BasicService.java, * netx/javax/jnlp/ClipboardService.java, * netx/javax/jnlp/DownloadService.java, * netx/javax/jnlp/DownloadServiceListener.java, * netx/javax/jnlp/ExtendedService.java, * netx/javax/jnlp/ExtensionInstallerService.java, * netx/javax/jnlp/FileContents.java, * netx/javax/jnlp/FileOpenService.java, * netx/javax/jnlp/FileSaveService.java, * netx/javax/jnlp/JNLPRandomAccessFile.java, * netx/javax/jnlp/PersistenceService.java, * netx/javax/jnlp/PrintService.java, * netx/javax/jnlp/ServiceManager.java, * netx/javax/jnlp/ServiceManagerStub.java, * netx/javax/jnlp/SingleInstanceListener.java, * netx/javax/jnlp/SingleInstanceService.java, * netx/javax/jnlp/UnavailableServiceException.java, * netx/net/sourceforge/jnlp/AppletDesc.java, * netx/net/sourceforge/jnlp/ApplicationDesc.java, * netx/net/sourceforge/jnlp/AssociationDesc.java, * netx/net/sourceforge/jnlp/ComponentDesc.java, * netx/net/sourceforge/jnlp/DefaultLaunchHandler.java, * netx/net/sourceforge/jnlp/ExtensionDesc.java, * netx/net/sourceforge/jnlp/IconDesc.java, * netx/net/sourceforge/jnlp/InformationDesc.java, * netx/net/sourceforge/jnlp/InstallerDesc.java, * netx/net/sourceforge/jnlp/JARDesc.java, * netx/net/sourceforge/jnlp/JNLPFile.java, * netx/net/sourceforge/jnlp/JNLPSplashScreen.java, * netx/net/sourceforge/jnlp/JREDesc.java, * netx/net/sourceforge/jnlp/LaunchException.java, * netx/net/sourceforge/jnlp/LaunchHandler.java, * netx/net/sourceforge/jnlp/Launcher.java, * netx/net/sourceforge/jnlp/MenuDesc.java, * netx/net/sourceforge/jnlp/NetxPanel.java, * netx/net/sourceforge/jnlp/Node.java, * netx/net/sourceforge/jnlp/PackageDesc.java, * netx/net/sourceforge/jnlp/ParseException.java, * netx/net/sourceforge/jnlp/Parser.java, * netx/net/sourceforge/jnlp/PluginBridge.java, * netx/net/sourceforge/jnlp/PropertyDesc.java, * netx/net/sourceforge/jnlp/RelatedContentDesc.java, * netx/net/sourceforge/jnlp/ResourcesDesc.java, * netx/net/sourceforge/jnlp/SecurityDesc.java, * netx/net/sourceforge/jnlp/ShortcutDesc.java, * netx/net/sourceforge/jnlp/StreamEater.java, * netx/net/sourceforge/jnlp/UpdateDesc.java, * netx/net/sourceforge/jnlp/Version.java, * netx/net/sourceforge/jnlp/cache/CacheEntry.java, * netx/net/sourceforge/jnlp/cache/CacheUtil.java, * netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java, * netx/net/sourceforge/jnlp/cache/DownloadIndicator.java, * netx/net/sourceforge/jnlp/cache/Resource.java, * netx/net/sourceforge/jnlp/cache/ResourceTracker.java, * netx/net/sourceforge/jnlp/cache/UpdatePolicy.java, * netx/net/sourceforge/jnlp/cache/package.html, * netx/net/sourceforge/jnlp/event/ApplicationEvent.java, * netx/net/sourceforge/jnlp/event/ApplicationListener.java, * netx/net/sourceforge/jnlp/event/DownloadEvent.java, * netx/net/sourceforge/jnlp/event/DownloadListener.java, * netx/net/sourceforge/jnlp/event/package.html, * netx/net/sourceforge/jnlp/package.html, * netx/net/sourceforge/jnlp/resources/Manifest.mf, * netx/net/sourceforge/jnlp/resources/Messages.properties, * netx/net/sourceforge/jnlp/resources/about.jnlp, * netx/net/sourceforge/jnlp/resources/default.jnlp, * netx/net/sourceforge/jnlp/runtime/AppThreadGroup.java, * netx/net/sourceforge/jnlp/runtime/AppletAudioClip.java, * netx/net/sourceforge/jnlp/runtime/AppletEnvironment.java, * netx/net/sourceforge/jnlp/runtime/AppletInstance.java, * netx/net/sourceforge/jnlp/runtime/ApplicationInstance.java, * netx/net/sourceforge/jnlp/runtime/Boot.java, * netx/net/sourceforge/jnlp/runtime/Boot13.java, * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java, * netx/net/sourceforge/jnlp/runtime/JNLPPolicy.java, * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java, * netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java, * netx/net/sourceforge/jnlp/runtime/package.html, * netx/net/sourceforge/jnlp/security/AccessWarningPane.java, * netx/net/sourceforge/jnlp/security/AppletWarningPane.java, * netx/net/sourceforge/jnlp/security/CertVerifier.java, * netx/net/sourceforge/jnlp/security/CertWarningPane.java, * netx/net/sourceforge/jnlp/security/CertsInfoPane.java, * netx/net/sourceforge/jnlp/security/HttpsCertVerifier.java, * netx/net/sourceforge/jnlp/security/MoreInfoPane.java, * netx/net/sourceforge/jnlp/security/NotAllSignedWarningPane.java, * netx/net/sourceforge/jnlp/security/SecurityDialogPanel.java, * netx/net/sourceforge/jnlp/security/SecurityUtil.java, * netx/net/sourceforge/jnlp/security/SecurityWarningDialog.java, * netx/net/sourceforge/jnlp/security/SingleCertInfoPane.java, * netx/net/sourceforge/jnlp/security/VariableX509TrustManager.java, * netx/net/sourceforge/jnlp/security/viewer/CertificatePane.java, * netx/net/sourceforge/jnlp/security/viewer/CertificateViewer.java, * netx/net/sourceforge/jnlp/services/ExtendedSingleInstanceService.java, * netx/net/sourceforge/jnlp/services/InstanceExistsException.java, * netx/net/sourceforge/jnlp/services/ServiceUtil.java, * netx/net/sourceforge/jnlp/services/SingleInstanceLock.java, * netx/net/sourceforge/jnlp/services/XBasicService.java, * netx/net/sourceforge/jnlp/services/XClipboardService.java, * netx/net/sourceforge/jnlp/services/XDownloadService.java, * netx/net/sourceforge/jnlp/services/XExtendedService.java, * netx/net/sourceforge/jnlp/services/XExtensionInstallerService.java, * netx/net/sourceforge/jnlp/services/XFileContents.java, * netx/net/sourceforge/jnlp/services/XFileOpenService.java, * netx/net/sourceforge/jnlp/services/XFileSaveService.java, * netx/net/sourceforge/jnlp/services/XJNLPRandomAccessFile.java, * netx/net/sourceforge/jnlp/services/XPersistenceService.java, * netx/net/sourceforge/jnlp/services/XPrintService.java, * netx/net/sourceforge/jnlp/services/XServiceManagerStub.java, * netx/net/sourceforge/jnlp/services/XSingleInstanceService.java, * netx/net/sourceforge/jnlp/services/package.html, * netx/net/sourceforge/jnlp/tools/CharacterEncoder.java, * netx/net/sourceforge/jnlp/tools/HexDumpEncoder.java, * netx/net/sourceforge/jnlp/tools/JarRunner.java, * netx/net/sourceforge/jnlp/tools/JarSigner.java, * netx/net/sourceforge/jnlp/tools/JarSignerResources.java, * netx/net/sourceforge/jnlp/tools/KeyStoreUtil.java, * netx/net/sourceforge/jnlp/tools/KeyTool.java, * netx/net/sourceforge/jnlp/util/FileUtils.java, * netx/net/sourceforge/jnlp/util/PropertiesFile.java, * netx/net/sourceforge/jnlp/util/Reflect.java, * netx/net/sourceforge/jnlp/util/WeakList.java, * netx/net/sourceforge/jnlp/util/XDesktopEntry.java, * netx/net/sourceforge/nanoxml/XMLElement.java, * netx/net/sourceforge/nanoxml/XMLParseException.java, * plugin/icedteanp/IcedTeaJavaRequestProcessor.cc, * plugin/icedteanp/IcedTeaJavaRequestProcessor.h, * plugin/icedteanp/IcedTeaNPPlugin.cc, * plugin/icedteanp/IcedTeaNPPlugin.h, * plugin/icedteanp/IcedTeaPluginRequestProcessor.cc, * plugin/icedteanp/IcedTeaPluginRequestProcessor.h, * plugin/icedteanp/IcedTeaPluginUtils.cc, * plugin/icedteanp/IcedTeaPluginUtils.h, * plugin/icedteanp/IcedTeaRunnable.cc, * plugin/icedteanp/IcedTeaRunnable.h, * plugin/icedteanp/IcedTeaScriptablePluginObject.cc, * plugin/icedteanp/IcedTeaScriptablePluginObject.h, * plugin/icedteanp/java/netscape/javascript/JSException.java, * plugin/icedteanp/java/netscape/javascript/JSObject.java, * plugin/icedteanp/java/netscape/javascript/JSObjectCreatePermission.java, * plugin/icedteanp/java/netscape/javascript/JSProxy.java, * plugin/icedteanp/java/netscape/javascript/JSRunnable.java, * plugin/icedteanp/java/netscape/javascript/JSUtil.java, * plugin/icedteanp/java/netscape/security/ForbiddenTargetException.java, * plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java, * plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java, * plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java, * plugin/icedteanp/java/sun/applet/JavaConsole.java, * plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java, * plugin/icedteanp/java/sun/applet/PasswordAuthenticationDialog.java, * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java, * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java, * plugin/icedteanp/java/sun/applet/PluginCallRequest.java, * plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java, * plugin/icedteanp/java/sun/applet/PluginClassLoader.java, * plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java, * plugin/icedteanp/java/sun/applet/PluginCookieManager.java, * plugin/icedteanp/java/sun/applet/PluginDebug.java, * plugin/icedteanp/java/sun/applet/PluginException.java, * plugin/icedteanp/java/sun/applet/PluginMain.java, * plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java, * plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java, * plugin/icedteanp/java/sun/applet/PluginObjectStore.java, * plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java, * plugin/icedteanp/java/sun/applet/PluginProxySelector.java, * plugin/icedteanp/java/sun/applet/PluginStreamHandler.java, * plugin/icedteanp/java/sun/applet/RequestQueue.java, * plugin/icedteanp/java/sun/applet/TestEnv.java, * plugin/icedteanp/java/sun/applet/VoidPluginCallRequest.java, * plugin/tests/LiveConnect/DummyObject.java, * plugin/tests/LiveConnect/OverloadTestHelper1.java, * plugin/tests/LiveConnect/OverloadTestHelper2.java, * plugin/tests/LiveConnect/OverloadTestHelper3.java, * plugin/tests/LiveConnect/PluginTest.java, * plugin/tests/LiveConnect/build, * plugin/tests/LiveConnect/common.js, * plugin/tests/LiveConnect/index.html, * plugin/tests/LiveConnect/jjs_eval_test.js, * plugin/tests/LiveConnect/jjs_func_parameters_tests.js, * plugin/tests/LiveConnect/jjs_func_rettype_tests.js, * plugin/tests/LiveConnect/jjs_get_tests.js, * plugin/tests/LiveConnect/jjs_set_tests.js, * plugin/tests/LiveConnect/jsj_func_overload_tests.js, * plugin/tests/LiveConnect/jsj_func_parameters_tests.js, * plugin/tests/LiveConnect/jsj_func_rettype_tests.js, * plugin/tests/LiveConnect/jsj_get_tests.js, * plugin/tests/LiveConnect/jsj_set_tests.js, * plugin/tests/LiveConnect/jsj_type_casting_tests.js, * plugin/tests/LiveConnect/jsj_type_conversion_tests.js: Initial import from IcedTea6. * AUTHORS, * COPYING * INSTALL, * NEWS, * README: New documentation. icedtea-web-1.8/PaxHeaders.7406/COPYING0000644000000000000000000000013213441742745014256 xustar0030 mtime=1552401893.023832856 30 atime=1552402157.208253545 30 ctime=1552410887.009183686 icedtea-web-1.8/COPYING0000644000175000002070000004312213441742745015070 0ustar00jvanekmock00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. icedtea-web-1.8/PaxHeaders.7406/AUTHORS0000644000000000000000000000013213441742745014273 xustar0030 mtime=1552401893.019832864 30 atime=1552402157.207253548 30 ctime=1552410887.007183691 icedtea-web-1.8/AUTHORS0000644000175000002070000000345213441742745015107 0ustar00jvanekmock00000000000000The following people have made contibutions to this project. Please keep this list in alphabetical order. Lillian Angel Andrew Azores Deepak Bhole Laurent BourgУЈs Adam Buchta Ricardo MartУ­n Camarero Marcin Cieslak Danesh Dadachanji Adam Domurad Lukasz Dracz Thomas Fitzsimmons Olesya Gerasimenko MichaХ‚ GУГrny Mark Greenwood Tereza Hlavackova Lars Herschke Peter Hatina Andrew John Hughes Jie Kang Alex Kashchenko Matthias Klose Alexandr Kolouch Jan Kmetko Francis Kung Denis Lila DJ Lucas Omair Majid Jon A. Maxwell Thomas Meyer Kurt Miller Saad Mohammad Martin Olsson Stefan Ring Ville SkyttУЄ Fridrich Strba Andrew Su Joshua Sumali Joel Tesdall Michal Vala Jiri Vanek TomУЁХЁ Votava Mark Wielaard Jacob Wisor Man Lung Wong This project also includes code from the following projects: OpenJDK Netx icedtea-web-1.8/PaxHeaders.7406/netx.manifest.in0000644000000000000000000000013213441742745016336 xustar0030 mtime=1552401893.044832812 30 atime=1552410879.355201592 30 ctime=1552410887.005183695 icedtea-web-1.8/netx.manifest.in0000644000175000002070000000054213441742745017147 0ustar00jvanekmock00000000000000Implementation-Title: @PACKAGE_NAME@ Implementation-Version: @FULL_VERSION@ Implementation-URL: @PACKAGE_URL@ Implementation-Vendor: IcedTea Specification-Title: JSR56: Java Network Launching Protocol and API Specification-URL: http://jcp.org/aboutJava/communityprocess/mrel/jsr056 Specification-Vendor: Java Community Process Specification-Version: 6.0 icedtea-web-1.8/PaxHeaders.7406/jrunscript.in0000644000000000000000000000013213441742745015756 xustar0030 mtime=1552401893.022832858 30 atime=1552410879.366201566 30 ctime=1552410887.004183698 icedtea-web-1.8/jrunscript.in0000644000175000002070000000025213441742745016565 0ustar00jvanekmock00000000000000#!/bin/bash if [ x"@RHINO_JAR@" = x ] ; then echo "jrunscript requires rhino support" exit 1 fi @JAVA@ -cp "@RHINO_JAR@" org.mozilla.javascript.tools.shell.Main $@ icedtea-web-1.8/PaxHeaders.7406/build.properties.in0000644000000000000000000000013213441742745017045 xustar0030 mtime=1552401893.022832858 30 atime=1552410879.379201536 30 ctime=1552410887.002183702 icedtea-web-1.8/build.properties.in0000644000175000002070000000007013441742745017652 0ustar00jvanekmock00000000000000# build-time settings rhino.available=@RHINO_AVAILABLE@ icedtea-web-1.8/PaxHeaders.7406/Makefile.in0000644000000000000000000000013213441764276015273 xustar0030 mtime=1552410814.813352605 30 atime=1552410879.344201618 30 ctime=1552410887.001183705 icedtea-web-1.8/Makefile.in0000644000175000002070000036015713441764276016117 0ustar00jvanekmock00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @ENABLE_DOCS_TRUE@@HAVE_JAVA9_TRUE@am__append_1 = -source $(IT_LANGUAGE_SOURCE_VERSION) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = netx.manifest jrunscript build.properties CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/build.properties.in \ $(srcdir)/jrunscript.in $(srcdir)/netx.manifest.in AUTHORS \ COPYING ChangeLog INSTALL NEWS README compile config.guess \ config.sub install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ARCHFLAG = @ARCHFLAG@ ARCH_PREFIX = @ARCH_PREFIX@ ASM_AVAILABLE = @ASM_AVAILABLE@ ASM_JAR = @ASM_JAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_BASH = @BIN_BASH@ BROWSER_TESTS_MODIFICATION = @BROWSER_TESTS_MODIFICATION@ BUILD_ARCH_DIR = @BUILD_ARCH_DIR@ CARGO = @CARGO@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHROME = @CHROME@ CHROMIUM = @CHROMIUM@ COM_SUN_JNDI_TOOLKIT_URL_URLUTIL = @COM_SUN_JNDI_TOOLKIT_URL_URLUTIL@ COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER = @COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ECJ = @ECJ@ ECJ_JAR = @ECJ_JAR@ EPIPHANY = @EPIPHANY@ EXEEXT = @EXEEXT@ FIREFOX = @FIREFOX@ FULL_VERSION = @FULL_VERSION@ GCJ = @GCJ@ GLIB2_V_216_CFLAGS = @GLIB2_V_216_CFLAGS@ GLIB2_V_216_LIBS = @GLIB2_V_216_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ HAMCREST_AVAILABLE = @HAMCREST_AVAILABLE@ HAMCREST_JAR = @HAMCREST_JAR@ HEXDUMPENCODER = @HEXDUMPENCODER@ HG = @HG@ ICEDTEA_REVISION = @ICEDTEA_REVISION@ INSTALL = @INSTALL@ INSTALL_ARCH_DIR = @INSTALL_ARCH_DIR@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ITW_LIBS = @ITW_LIBS@ JACOCO_AVAILABLE = @JACOCO_AVAILABLE@ JACOCO_JAR = @JACOCO_JAR@ JAR = @JAR@ JARSIGNER = @JARSIGNER@ JAR_ACCEPTS_STDIN_LIST = @JAR_ACCEPTS_STDIN_LIST@ JAR_KNOWS_ATFILE = @JAR_KNOWS_ATFILE@ JAR_KNOWS_J_OPTIONS = @JAR_KNOWS_J_OPTIONS@ JAVA = @JAVA@ JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ JAVADOC_KNOWS_J_OPTIONS = @JAVADOC_KNOWS_J_OPTIONS@ JAVA_NET_COOKIEHANDLER = @JAVA_NET_COOKIEHANDLER@ JAVA_NET_COOKIEMANAGER = @JAVA_NET_COOKIEMANAGER@ JAVA_NET_HTTPCOOKIE = @JAVA_NET_HTTPCOOKIE@ JAVA_UTIL_JAR_PACK200 = @JAVA_UTIL_JAR_PACK200@ JRE_ARCH_DIR = @JRE_ARCH_DIR@ JUNIT_AVAILABLE = @JUNIT_AVAILABLE@ JUNIT_JAR = @JUNIT_JAR@ KCOV = @KCOV@ KEYTOOL = @KEYTOOL@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MIDORI = @MIDORI@ MKDIR_P = @MKDIR_P@ MODULARJDK_ARGS_DIR = @MODULARJDK_ARGS_DIR@ MOZILLA_CFLAGS = @MOZILLA_CFLAGS@ MOZILLA_LIBS = @MOZILLA_LIBS@ MOZILLA_VERSION_COLLAPSED = @MOZILLA_VERSION_COLLAPSED@ MSLINKS_JAR = @MSLINKS_JAR@ OBJEXT = @OBJEXT@ OPERA = @OPERA@ PACK200 = @PACK200@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKGVERSION = @PKGVERSION@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RHINO_AVAILABLE = @RHINO_AVAILABLE@ RHINO_JAR = @RHINO_JAR@ RUSTC = @RUSTC@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SUN_APPLET_APPLETIMAGEREF = @SUN_APPLET_APPLETIMAGEREF@ SUN_AWT_WEMBEDDEDFRAME = @SUN_AWT_WEMBEDDEDFRAME@ SUN_AWT_X11_XEMBEDDEDFRAME = @SUN_AWT_X11_XEMBEDDEDFRAME@ SUN_MISC_JARINDEX = @SUN_MISC_JARINDEX@ SUN_MISC_LAUNCHER = @SUN_MISC_LAUNCHER@ SUN_NET_WWW_PROTOCOL_HTTP_HANDLER = @SUN_NET_WWW_PROTOCOL_HTTP_HANDLER@ SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE = @SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE@ SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK = @SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK@ SUN_SECURITY_ACTION_GETPROPERTYACTION = @SUN_SECURITY_ACTION_GETPROPERTYACTION@ SUN_SECURITY_UTIL_HOSTNAMECHECKER = @SUN_SECURITY_UTIL_HOSTNAMECHECKER@ SUN_SECURITY_UTIL_SECURITYCONSTANTS = @SUN_SECURITY_UTIL_SECURITYCONSTANTS@ SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION = @SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION@ SUN_SECURITY_X509_X500NAME = @SUN_SECURITY_X509_X500NAME@ SYSTEM_JDK_DIR = @SYSTEM_JDK_DIR@ SYSTEM_JRE_DIR = @SYSTEM_JRE_DIR@ TAGSOUP_JAR = @TAGSOUP_JAR@ USING_ECJ = @USING_ECJ@ VERSION = @VERSION@ VERSION_DEFS = @VERSION_DEFS@ WIXGEN_AVAILABLE = @WIXGEN_AVAILABLE@ WIXGEN_JAR = @WIXGEN_JAR@ WIX_TOOLSET_DIR = @WIX_TOOLSET_DIR@ XSLTPROC = @XSLTPROC@ ZIP = @ZIP@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bashcompdir = @bashcompdir@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Functions to compose path/classpath EMPTY := SPACE := $(EMPTY) $(EMPTY) MODULARJDK_ARGS_FILE = itw-modularjdk.args # javaws is program name, JAVAWS is used executable name. in 99.9% those are equals. # in unsupported case (no rust, and enforced shell launchers), it will become javaws.sh. # similar case is for other two binaries. JAVAWS = $(javaws)$(DESKTOP_SUFFIX) ITWEB_SETTINGS = $(itweb_settings)$(DESKTOP_SUFFIX) POLICYEDITOR = $(policyeditor)$(DESKTOP_SUFFIX) LAUNCHERS = $(NATIVE_LAUNCHERS) $(SHELL_LAUNCHERS) DESKTOP_FILES = javaws.desktop itweb-settings.desktop policyeditor.desktop DESKTOP_IN_FILES = javaws.desktop.in itweb-settings.desktop.in policyeditor.desktop.in # end of linking variables # Build directories # note this is *space* separated list, as composeclasspath is called on them in classpath usage JUNIT_RUNTIME := $(JUNIT_JAR) $(HAMCREST_JAR) # support for javaws -html needs plugin.jar on classpath. rest of javaws works of course without it. # plugin jar is split into plugin.jar and jsobject.jar so it can run with modular (9+) jdk @ENABLE_PLUGINJAR_TRUE@PLUGIN_JAR = $(datadir)/$(PACKAGE_NAME)/plugin.jar @ENABLE_PLUGINJAR_TRUE@JSOBJECT_JAR = $(datadir)/$(PACKAGE_NAME)/jsobject.jar NETX_JAR = $(datadir)/$(PACKAGE_NAME)/javaws.jar SPLASH_PNG = $(datadir)/$(PACKAGE_NAME)/javaws_splash.png MODULARJDK_ARGS_LOCATION = $(DESTDIR)$(MODULARJDK_ARGS_DIR)/$(MODULARJDK_ARGS_FILE) @HAVE_MSLINKS_FALSE@@HAVE_TAGSOUP_FALSE@NETX_EXCLUDE_SRCS = net.sourceforge.jnlp.MalformedXMLParser.java net.sourceforge.jnlp.util.WindowsDesktopEntry.java @HAVE_MSLINKS_FALSE@@HAVE_TAGSOUP_TRUE@NETX_EXCLUDE_SRCS = net.sourceforge.jnlp.util.WindowsDesktopEntry.java @HAVE_MSLINKS_TRUE@@HAVE_TAGSOUP_FALSE@NETX_EXCLUDE_SRCS = net.sourceforge.jnlp.MalformedXMLParser.java # Conditional defintions @HAVE_MSLINKS_TRUE@@HAVE_TAGSOUP_TRUE@NETX_EXCLUDE_SRCS = @ENABLE_NATIVE_PLUGIN_FALSE@CPPUNIT_IMPL = run-cpp-unit-tests-impl-placeholder @ENABLE_NATIVE_PLUGIN_TRUE@CPPUNIT_IMPL = run-cpp-unit-tests-impl @ENABLE_NATIVE_PLUGIN_FALSE@CPPUNIT_CLEAN_IMPL = clean-cpp-unit-tests-placeholder @ENABLE_NATIVE_PLUGIN_TRUE@CPPUNIT_CLEAN_IMPL = clean-cpp-unit-tests-impl @ENABLE_NATIVE_PLUGIN_FALSE@CPPUNIT_FRAMEWORK_CLEAN_IMPL = clean-unittest++-placeholder @ENABLE_NATIVE_PLUGIN_TRUE@CPPUNIT_FRAMEWORK_CLEAN_IMPL = clean-unittest++-impl @CP_SUPPORTS_REFLINK_TRUE@REFLINK = --reflink=auto @SRC_DIR_HARDLINKABLE_FALSE@SRC_DIR_LINK = $(REFLINK) @SRC_DIR_HARDLINKABLE_TRUE@SRC_DIR_LINK = -l @ENABLE_DOCS_TRUE@JAVADOC_OPTS = -use -keywords -encoding UTF-8 \ @ENABLE_DOCS_TRUE@ -splitIndex -bottom ' Submit \ @ENABLE_DOCS_TRUE@ a bug or feature' $(am__append_1) @ENABLE_DOCS_TRUE@@JAVADOC_SUPPORTS_J_OPTIONS_TRUE@JAVADOC_MEM_OPTS = -J-Xmx1024m -J-Xms128m # if you create netx-dist-tests-whitelist in top directory, and place "expr match" regexes # (separate by one of IFS's values (most commonly space)) into it, you can control reproducers which compile or/xor run. # if you need declare space in your regex, use \s as described in "expr match" documentation ECHO_WHITELIST = if [ -f $(REPRODUCERS_CLASS_WHITELIST) ] ; then cat $(REPRODUCERS_CLASS_WHITELIST) ; else echo ".*" ; fi @ENABLE_WHITELIST_FALSE@COMPILE_WHITELIST_FILTER = .* @ENABLE_WHITELIST_TRUE@COMPILE_WHITELIST_FILTER = `$(ECHO_WHITELIST)` @ENABLE_WHITELIST_FALSE@RUN_WHITELIST_FILTER = `$(ECHO_WHITELIST)` @ENABLE_WHITELIST_TRUE@RUN_WHITELIST_FILTER = .* @WITH_RHINO_FALSE@RHINO_TESTS = @WITH_RHINO_TRUE@RHINO_TESTS = stamps/check-pac-functions.stamp @WITH_JUNIT_FALSE@JUNIT_TESTS = @WITH_JUNIT_TRUE@JUNIT_TESTS = stamps/run-netx-unit-tests.stamp #end of exported autoconf copies # binary names javaws := $(shell echo javaws | sed '@program_transform_name@') itweb_settings := $(shell echo itweb-settings | sed '@program_transform_name@') policyeditor := $(shell echo policyeditor | sed '@program_transform_name@') @WINDOWS_OR_INCLUDE_BATS_FALSE@fix_CRLF = # convert Unix newlines (LF) to DOS format: @WINDOWS_OR_INCLUDE_BATS_TRUE@fix_CRLF = -e "s/\$$/\r/" # the launcher needs to know $(bindir) and $(datadir) which can be different at # make-time from configure-time edit_launcher_script = sed \ -e "s|[@]LAUNCHER_BOOTCLASSPATH[@]|$(LAUNCHER_BOOTCLASSPATH)|g" \ -e "s|[@]JAVAWS_SPLASH_LOCATION[@]|$(SPLASH_PNG)|g" \ -e "s|[@]JAVA[@]|$(JAVA)|g" \ -e "s|[@]JRE[@]|$(SYSTEM_JRE_DIR)|g" \ -e "s|[@]MAIN_CLASS[@]|$${MAIN_CLASS}|g" \ -e "s|[@]BIN_LOCATION[@]|$${BIN_LOCATION}|g" \ -e "s|[@]NETX_JAR[@]|$(NETX_JAR)|g" \ -e "s|[@]PLUGIN_JAR[@]|$(PLUGIN_JAR)|g" \ -e "s|[@]JSOBJECT_JAR[@]|$(JSOBJECT_JAR)|g" \ -e "s|[@]MSLINKS_JAR[@]|$(MSLINKS_JAR)|g" \ -e "s|[@]TAGSOUP_JAR[@]|$(TAGSOUP_JAR)|g" \ -e "s|[@]RHINO_JAR[@]|$(RHINO_JAR)|g" \ -e "s|[@]PROGRAM_NAME[@]|$${PROGRAM_NAME}|g" \ -e "s|[@]MODULARJDK_ARGS_LOCATION[@]|$(MODULARJDK_ARGS_LOCATION)|g" # Plugin # IcedTeaPlugin.so. # Separate compile and link invocations to ensure intermediate object # is listed before -l options. See: # http://developer.mozilla.org/en/docs/XPCOM_Glue @ENABLE_NATIVE_PLUGIN_TRUE@PLUGIN_SRC = IcedTeaNPPlugin.cc IcedTeaScriptablePluginObject.cc \ @ENABLE_NATIVE_PLUGIN_TRUE@ IcedTeaJavaRequestProcessor.cc IcedTeaPluginRequestProcessor.cc \ @ENABLE_NATIVE_PLUGIN_TRUE@ IcedTeaPluginUtils.cc IcedTeaParseProperties.cc @ENABLE_NATIVE_PLUGIN_TRUE@PLUGIN_OBJECTS = IcedTeaNPPlugin.o IcedTeaScriptablePluginObject.o \ @ENABLE_NATIVE_PLUGIN_TRUE@ IcedTeaJavaRequestProcessor.o IcedTeaPluginRequestProcessor.o \ @ENABLE_NATIVE_PLUGIN_TRUE@ IcedTeaPluginUtils.o IcedTeaParseProperties.o all: all-am .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): netx.manifest: $(top_builddir)/config.status $(srcdir)/netx.manifest.in cd $(top_builddir) && $(SHELL) ./config.status $@ jrunscript: $(top_builddir)/config.status $(srcdir)/jrunscript.in cd $(top_builddir) && $(SHELL) ./config.status $@ build.properties: $(top_builddir)/config.status $(srcdir)/build.properties.in cd $(top_builddir) && $(SHELL) ./config.status $@ tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-local check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-exec-local install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: check-am install-am install-strip .PHONY: all all-am all-local am--refresh check check-am check-local \ clean clean-generic clean-local cscopelist-am ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-local .PRECIOUS: Makefile @WINDOWS_TRUE@ export CLASSPATH_SEPARATOR = ; @WINDOWS_FALSE@ export CLASSPATH_SEPARATOR = : define joinsegments $(subst $(SPACE),$(CLASSPATH_SEPARATOR),$(strip $1)) endef define composeclasspath $(if $(call joinsegments,$1),-classpath "$(call joinsegments,$1)",) endef # Source directories @WINDOWS_TRUE@ export TOP_BUILD_DIR := $(shell cygpath -p -m "$(abs_top_builddir)") @WINDOWS_TRUE@ export TOP_SRC_DIR := $(shell cygpath -p -m "$(abs_top_srcdir)") @WINDOWS_TRUE@ export prefix := $(shell cygpath -p -m "$(prefix)") @WINDOWS_TRUE@ export CPA="-v" @WINDOWS_FALSE@ export TOP_BUILD_DIR = $(abs_top_builddir) @WINDOWS_FALSE@ export TOP_SRC_DIR = $(abs_top_srcdir) @WINDOWS_FALSE@ export CPA="-av" @WINDOWS_FALSE@ WIN_LAUNCHERS= @WINDOWS_OR_INCLUDE_BATS_TRUE@ WIN_LAUNCHERS=launcher.build/$(javaws).bat launcher.build/$(itweb_settings).bat launcher.build/$(policyeditor).bat @WINDOWS_OR_INCLUDE_BATS_FALSE@ WIN_LAUNCHERS= @ENABLE_SHELL_LAUNCHERS_TRUE@ SHELL_LAUNCHERS=$(WIN_LAUNCHERS) launcher.build/$(MODULARJDK_ARGS_FILE) launcher.build/$(javaws).sh launcher.build/$(itweb_settings).sh launcher.build/$(policyeditor).sh @ENABLE_SHELL_LAUNCHERS_FALSE@ SHELL_LAUNCHERS= @ENABLE_NATIVE_LAUNCHERS_TRUE@ NATIVE_LAUNCHERS=launcher.build/$(MODULARJDK_ARGS_FILE) launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor) @ENABLE_NATIVE_LAUNCHERS_TRUE@ DESKTOP_SUFFIX= @ENABLE_NATIVE_LAUNCHERS_FALSE@ NATIVE_LAUNCHERS= @ENABLE_NATIVE_LAUNCHERS_FALSE@ DESKTOP_SUFFIX=.sh export WIN_INSTALLER_DIR = $(TOP_BUILD_DIR)/win-installer.build export WIN_INSTALLER_SRC_DIR = $(TOP_SRC_DIR)/win-installer export NETX_DIR = $(TOP_BUILD_DIR)/netx.build export DOCS_DIR=$(TOP_BUILD_DIR)/icedtea-web-docs/$(FULL_VERSION) export NETX_SRCDIR = $(TOP_SRC_DIR)/netx export NETX_RESOURCE_DIR=$(NETX_SRCDIR)/net/sourceforge/jnlp/resources export ICONS_DEST_DIR=$(DESTDIR)$(datadir)/pixmaps export BASH_CMPL_DEST_DIR=$(DESTDIR)@bashcompdir@ export WIN_ALL_DEPS=$(DESTDIR)$(prefix)/win-deps-all export WIN_RUN_DEPS=$(DESTDIR)$(prefix)/win-deps-runtime export LINUX_BIN_DIST_DEPS=$(DESTDIR)$(prefix)/linux-deps-runtime export REPORT_STYLES_DIRNAME=report-styles export TESTS_SRCDIR=$(TOP_SRC_DIR)/tests export TESTS_DIR=$(TOP_BUILD_DIR)/tests.build export NETX_UNIT_TEST_SRCDIR=$(TESTS_SRCDIR)/netx/unit export NETX_TEST_DIR=$(TESTS_DIR)/netx export NETX_UNIT_TEST_DIR=$(NETX_TEST_DIR)/unit export JUNIT_RUNNER_DIR=$(TESTS_DIR)/junit-runner export JUNIT_RUNNER_SRCDIR=$(TESTS_SRCDIR)/junit-runner export JACOCO_OPERATOR_DIR=$(TESTS_DIR)/jacoco-operator export JACOCO_OPERATOR_SRCDIR=$(TESTS_SRCDIR)/jacoco-operator export TEST_EXTENSIONS_SRCDIR=$(TESTS_SRCDIR)/test-extensions export TEST_EXTENSIONS_TESTS_SRCDIR=$(TESTS_SRCDIR)/test-extensions-tests export REPRODUCERS_TESTS_SRCDIR=$(TESTS_SRCDIR)/reproducers export TEST_EXTENSIONS_DIR=$(TESTS_DIR)/test-extensions export CPP_UNITTEST_FRAMEWORK_SRCDIR=$(TESTS_SRCDIR)/UnitTest++ export CPP_UNITTEST_SRCDIR=$(TESTS_SRCDIR)/cpp-unit-tests export CPP_UNITTEST_DIR=$(TESTS_DIR)/cpp-unit-tests export TEST_EXTENSIONS_COMPATIBILITY_SYMLINK=$(TESTS_DIR)/netx/jnlp_testsengine export TEST_EXTENSIONS_TESTS_DIR=$(TESTS_DIR)/test-extensions-tests export REPRODUCERS_TESTS_SERVER_DEPLOYDIR=$(TESTS_DIR)/reproducers_test_server_deploydir export REPRODUCERS_BUILD_DIR=$(TESTS_DIR)/reproducers.classes export PRIVATE_KEYSTORE_NAME=teststore.ks export PRIVATE_KEYSTORE_PASS=123456789 export EXPORTED_TEST_CERT_PREFIX=icedteatests export EXPORTED_TEST_CERT_SUFFIX=crt export TEST_CERT_ALIAS=icedteaweb export PUBLIC_KEYSTORE_STUB=icedtea-web/security/trusted.certs export PUBLIC_KEYSTORE_PASS=changeit export JUNIT_RUNNER_JAR=$(TOP_BUILD_DIR)/junit-runner.jar export UNIT_CLASS_NAMES = $(TOP_BUILD_DIR)/unit_class_names export REPRODUCERS_CLASS_NAMES = $(TOP_BUILD_DIR)/reproducers_class_names export REPRODUCERS_CLASS_WHITELIST = $(TOP_SRC_DIR)/netx-dist-tests-whitelist export COVERAGE_JAVA_ARGS=-Xmx2G export COVERAGE_MODIFIED_FILES=tests-output.xml ServerAccess-logs.xml stdout.log stderr.log all.log export EMMA_BACKUP_SUFFIX=_noEmma export EMMA_SUFFIX=_withEmma export META_MANIFEST = META-INF/MANIFEST.MF export SIGNED_REPRODUCERS=signed signed2 export SIMPLE_REPRODUCERS=simple export CUSTOM_REPRODUCERS=custom export ALL_NONCUSTOM_REPRODUCERS=$(SIMPLE_REPRODUCERS) $(SIGNED_REPRODUCERS) export ALL_REPRODUCERS=$(ALL_NONCUSTOM_REPRODUCERS) $(CUSTOM_REPRODUCERS) export JACOCO_PATH:=$(shell dirname "$(JACOCO_JAR)") export JACOCO_AGENT=org.jacoco.agent.jar export JACOCO_ANT=org.jacoco.ant.jar export JACOCO_REPORT=org.jacoco.report.jar export JACOCO_AGENTRT=org.jacoco.agent.rt.jar export JACOCO_CORE=org.jacoco.core.jar export JACOCO_JAVAWS_RESULTS=$(TEST_EXTENSIONS_DIR)/jacoco_javaws.exec export JACOCO_PLUGIN_RESULTS=$(TEST_EXTENSIONS_DIR)/jacoco_plugin.exec # space separated fragments for composeclasspath export JACOCO_CLASSPATH=$(JACOCO_PATH)/$(JACOCO_CORE) $(JACOCO_PATH)/$(JACOCO_AGENT) $(JACOCO_PATH)/$(JACOCO_REPORT) $(JACOCO_PATH)/$(JACOCO_AGENTRT) $(JACOCO_PATH)/$(JACOCO_ANT) $(ASM_JAR) export JACOCO_AGENT_SWITCH_BODY=-javaagent:$(JACOCO_PATH)/$(JACOCO_AGENTRT) export JACOCO_BASE_EXCLUDE=org.junit.*:junit.* export JACOCO_ADVANCED_EXCLUDE=:*jacoco*:java.lang.*:java.reflect.*:java.util.*:sun.reflect.*:javax.swing.* export JACOCO_AGENT_SWITCH="$(JACOCO_AGENT_SWITCH_BODY)=excludes=$(JACOCO_BASE_EXCLUDE)$(JACOCO_ADVANCED_EXCLUDE),inclbootstrapclasses=true" export JACOCO_AGENT_JAVAWS_SWITCH=\"$(JACOCO_AGENT_SWITCH),destfile=$(JACOCO_JAVAWS_RESULTS)\" export JACOCO_AGENT_PLUGIN_SWITCH=\"$(JACOCO_AGENT_SWITCH),destfile=$(JACOCO_PLUGIN_RESULTS)\" export JACOCO_OPERATOR_EXEC=$(SYSTEM_JRE_DIR)/bin/java $(COVERAGE_JAVA_ARGS) -cp $(call joinsegments, $(JACOCO_OPERATOR_DIR) $(JACOCO_CLASSPATH) .) org.jacoco.operator.Main # linking variables export PLUGIN_LINK_NAME=libjavaplugin.so export MOZILLA_LOCAL_PLUGINDIR=${HOME}/.mozilla/plugins export MOZILLA_GLOBAL64_PLUGINDIR=/usr/lib64/mozilla/plugins export MOZILLA_GLOBAL32_PLUGINDIR=/usr/lib/mozilla/plugins export OPERA_GLOBAL64_PLUGINDIR=/usr/lib64/opera/plugins export OPERA_GLOBAL32_PLUGINDIR=/usr/lib/opera/plugins export BUILT_PLUGIN_LIBRARY=IcedTeaPlugin.so export CPP_UNITTEST_FRAMEWORK_BUILDDIR=$(CPP_UNITTEST_DIR)/UnitTest++ export CPP_UNITTEST_FRAMEWORK_LIB_NAME=libUnitTest++.a export CPP_UNITTEST_FRAMEWORK_LIB=$(CPP_UNITTEST_FRAMEWORK_BUILDDIR)/$(CPP_UNITTEST_FRAMEWORK_LIB_NAME) export CPP_UNITTEST_EXECUTABLE=$(CPP_UNITTEST_DIR)/IcedTeaPluginUnitTests export MOZILLA_LOCAL_BACKUP_FILE=${HOME}/$(PLUGIN_LINK_NAME).origU export MOZILLA_GLOBAL_BACKUP_FILE=${HOME}/$(PLUGIN_LINK_NAME).origMG export OPERA_GLOBAL_BACKUP_FILE=${HOME}/$(PLUGIN_LINK_NAME).origOG export MOZILLA_FAMILY_TEST= "$(FIREFOX)" != "" -o "$(CHROMIUM)" != "" -o "$(CHROME)" != "" -o "$(MIDORI)" != "" -o "$(EPIPHANY)" != "" # Flags export IT_CFLAGS=$(CFLAGS) $(ARCHFLAG) export IT_JAVAC_SETTINGS=-g -encoding utf-8 $(JAVACFLAGS) $(MEMORY_LIMIT) $(PREFER_SOURCE) export IT_LANGUAGE_SOURCE_VERSION=8 export IT_CLASS_TARGET_VERSION=8 export IT_JAVACFLAGS=$(IT_JAVAC_SETTINGS) -source $(IT_LANGUAGE_SOURCE_VERSION) -target $(IT_CLASS_TARGET_VERSION) # # We need the jars in bootclasspath for a couple of reasons # - we use classes (in the sun.applet package) loaded by the bootclassloader # using another classloader to load classes from the same package causes an # IllegalAccessException # - we want full privileges # export UNIFIED_CLASSPATH_SEGMENTS=$(NETX_JAR) $(PLUGIN_JAR) $(JSOBJECT_JAR) $(RHINO_JAR) $(TAGSOUP_JAR) $(MSLINKS_JAR) export UNIFIED_JACOCO_CLASSPATH_SEGMENTS=$(UNIFIED_CLASSPATH_SEGMENTS) $(JACOCO_CLASSPATH) export UNIFIED_CLASSPATH=$(call joinsegments, $(UNIFIED_CLASSPATH_SEGMENTS)) export UNIFIED_JACOCO_CLASSPATH=$(call joinsegments, $(UNIFIED_JACOCO_CLASSPATH_SEGMENTS)) export UNIFIED_BOOTCLASSPATH=-Xbootclasspath/a:$(UNIFIED_CLASSPATH) # note javaws, itwebsettings and policyeditor (== LAUNCHER_BOOTCLASSPATH) must be always able to compile and run *without* plugin export LAUNCHER_BOOTCLASSPATH=$(UNIFIED_BOOTCLASSPATH) export PLUGIN_BOOTCLASSPATH='"$(UNIFIED_BOOTCLASSPATH)"' export PLUGIN_COVERAGE_BOOTCLASSPATH='"-Xbootclasspath/a:$(UNIFIED_JACOCO_CLASSPATH)"' # Fake update version to work with the Deployment Toolkit script used by Oracle # http://download.oracle.com/javase/tutorial/deployment/deploymentInDepth/depltoolkit_index.html export JDK_UPDATE_VERSION=50 # Sources list export PLUGIN_TEST_SRCS = $(TOP_SRC_DIR)/plugin/tests/LiveConnect/*.java export NETX_PKGS = javax.jnlp net.sourceforge.nanoxml net.sourceforge.jnlp \ net.sourceforge.jnlp.about \ net.sourceforge.jnlp.cache net.sourceforge.jnlp.config \ net.sourceforge.jnlp.controlpanel net.sourceforge.jnlp.event \ net.sourceforge.jnlp.runtime net.sourceforge.jnlp.security \ net.sourceforge.jnlp.security.viewer net.sourceforge.jnlp.services \ net.sourceforge.jnlp.tools net.sourceforge.jnlp.util \ sun.applet @ENABLE_PLUGINJAR_TRUE@export ICEDTEAPLUGIN_TARGET = stamps/liveconnect-dist.stamp @ENABLE_PLUGINJAR_TRUE@export PLUGIN_DIR=$(TOP_BUILD_DIR)/plugin/icedteanp @ENABLE_PLUGINJAR_TRUE@export PLUGIN_SRCDIR=$(TOP_SRC_DIR)/plugin/icedteanp @ENABLE_PLUGINJAR_TRUE@export JSOBJECT_DIRS = netscape @ENABLE_PLUGINJAR_TRUE@export SUN_APPLET_DIRS = sun/applet @ENABLE_PLUGINJAR_TRUE@export PLUGIN_PKGS = sun.applet netscape.security netscape.javascript @ENABLE_PLUGINJAR_TRUE@export LIVECONNECT_SRCS = $(PLUGIN_SRCDIR)/java @ENABLE_PLUGINJAR_TRUE@export LIVECONNECT_DIR = $(JSOBJECT_DIRS) $(SUN_APPLET_DIRS) #overriding ICEDTEAPLUGIN_TARGET @ENABLE_NATIVE_PLUGIN_TRUE@export ICEDTEAPLUGIN_TARGET = $(PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) stamps/liveconnect-dist.stamp @ENABLE_NATIVE_PLUGIN_TRUE@export ICEDTEAPLUGIN_CLEAN = clean-IcedTeaPlugin #this is for plugin testcoverage @ENABLE_NATIVE_PLUGIN_TRUE@export COVERABLE_PLUGIN_DIR=$(TESTS_DIR)/icedteanp-build-with-jacoco export PLUGIN_VERSION = IcedTea-Web $(FULL_VERSION) export EXTRA_DIST = $(MODULARJDK_ARGS_FILE) $(top_srcdir)/netx $(top_srcdir)/plugin javaws.png $(DESKTOP_IN_FILES) $(top_srcdir)/completion \ shell-launcher rust-launcher $(top_srcdir)/tests html-gen.sh NEW_LINE_IFS $(top_srcdir)/metadata.in $(top_srcdir)/win-installer # reproducers `D`shortcuts export DTEST_SERVER=-Dtest.server.dir=$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) export DJAVAWS_BUILD=-Djavaws.build.bin=$(DESTDIR)$(bindir)/$(JAVAWS) export DBROWSERS=-Dused.browsers=$(FIREFOX):$(CHROMIUM):$(CHROME):$(OPERA):$(MIDORI):$(EPIPHANY) export REPRODUCERS_DPARAMETERS= $(DTEST_SERVER) $(DJAVAWS_BUILD) $(DBROWSERS) $(BROWSER_TESTS_MODIFICATION) # end of `D`shortcuts #exported autoconf copies export EXPORTED_JAVAC=$(SYSTEM_JDK_DIR)/bin/javac export EXPORTED_JAR=$(SYSTEM_JDK_DIR)/bin/jar export EXPORTED_KEYTOOL=$(SYSTEM_JDK_DIR)/bin/keytool export EXPORTED_JARSIGNER=$(SYSTEM_JDK_DIR)/bin/jarsigner export EXPORTED_PACK200=$(SYSTEM_JDK_DIR)/bin/pack200 # Top-Level Targets # ================= all-local: stamps/netx-dist.stamp stamps/plugin.stamp stamps/docs.stamp \ $(LAUNCHERS) $(DESKTOP_FILES) check-local: $(RHINO_TESTS) $(JUNIT_TESTS) clean-local: clean-netx clean-plugin clean-liveconnect \ clean-native-ecj clean-launchers clean-desktop-files clean-docs clean-generated-docs clean-metadata clean-icedteaweb-completion clean-tests clean-bootstrap-directory clean-win-installer if [ -e stamps ] ; then \ rmdir stamps ; \ fi .PHONY: clean-IcedTeaPlugin clean-add-netx clean-add-netx-debug clean-add-plugin clean-add-plugin-debug \ clean-bootstrap-directory clean-native-ecj clean-desktop-files clean-netx-docs clean-docs clean-plugin-docs clean-generated-docs clean-icedteaweb-completion\ clean-tests check-local clean-launchers stamps/check-pac-functions.stamp stamps/run-netx-unit-tests.stamp clean-netx-tests \ clean-junit-runner clean-netx-unit-tests clean-metadata win-installer clean-win-installer install-exec-local: ${mkinstalldirs} $(DESTDIR)$(bindir) $(DESTDIR)$(datadir)/$(PACKAGE_NAME)/ $(DESTDIR)$(libdir) $(ICONS_DEST_DIR) $(BASH_CMPL_DEST_DIR) @ENABLE_NATIVE_PLUGIN_TRUE@ ${INSTALL_PROGRAM} $(PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) $(DESTDIR)$(libdir) @ENABLE_PLUGINJAR_TRUE@ ${INSTALL_DATA} $(TOP_BUILD_DIR)/liveconnect/lib/classes-applet.jar $(DESTDIR)$(PLUGIN_JAR) @ENABLE_PLUGINJAR_TRUE@ ${INSTALL_DATA} $(TOP_BUILD_DIR)/liveconnect/lib/classes-jsobject.jar $(DESTDIR)$(JSOBJECT_JAR) ${INSTALL_DATA} $(NETX_DIR)/lib/classes.jar $(DESTDIR)$(NETX_JAR) ${INSTALL_DATA} $(NETX_SRCDIR)/javaws_splash.png $(DESTDIR)$(SPLASH_PNG) ${INSTALL_DATA} $(TOP_SRC_DIR)/javaws.png $(ICONS_DEST_DIR)/ mkdir -p $(DESTDIR)$(MODULARJDK_ARGS_DIR) cp launcher.build/$(MODULARJDK_ARGS_FILE) $(MODULARJDK_ARGS_LOCATION) @ENABLE_NATIVE_LAUNCHERS_TRUE@ ${INSTALL_PROGRAM} launcher.build/$(javaws) $(DESTDIR)$(bindir) @ENABLE_NATIVE_LAUNCHERS_TRUE@ ${INSTALL_PROGRAM} launcher.build/$(itweb_settings) $(DESTDIR)$(bindir) @ENABLE_NATIVE_LAUNCHERS_TRUE@ ${INSTALL_PROGRAM} launcher.build/$(policyeditor) $(DESTDIR)$(bindir) @ENABLE_SHELL_LAUNCHERS_TRUE@ ${INSTALL_PROGRAM} launcher.build/$(javaws).sh $(DESTDIR)$(bindir) @ENABLE_SHELL_LAUNCHERS_TRUE@ ${INSTALL_PROGRAM} launcher.build/$(itweb_settings).sh $(DESTDIR)$(bindir) @ENABLE_SHELL_LAUNCHERS_TRUE@ ${INSTALL_PROGRAM} launcher.build/$(policyeditor).sh $(DESTDIR)$(bindir) @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ ${INSTALL_PROGRAM} launcher.build/$(javaws).bat $(DESTDIR)$(bindir) @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ ${INSTALL_PROGRAM} launcher.build/$(itweb_settings).bat $(DESTDIR)$(bindir) @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ ${INSTALL_PROGRAM} launcher.build/$(policyeditor).bat $(DESTDIR)$(bindir) ${INSTALL_DATA} $(TOP_BUILD_DIR)/completion/itweb-settings.bash $(BASH_CMPL_DEST_DIR)/ ${INSTALL_DATA} $(TOP_BUILD_DIR)/completion/javaws.bash $(BASH_CMPL_DEST_DIR)/ ${INSTALL_DATA} $(TOP_BUILD_DIR)/completion/policyeditor.bash $(BASH_CMPL_DEST_DIR)/ # all generated manpages are installed in swarm # all windows depndences are copied for windows build, and known one are copied/removed as necessary # the makefile variables are used in favor of global variables, but maybe they will need to get mixed together install-data-local: printvarsfile ${mkinstalldirs} -d $(DESTDIR)$(mandir) cp -r "$(DOCS_DIR)/man/"* $(DESTDIR)$(mandir)/ @ENABLE_DOCS_TRUE@ ${mkinstalldirs} $(DESTDIR)$(htmldir) @ENABLE_DOCS_TRUE@ (cd ${TOP_BUILD_DIR}/docs/netx; \ @ENABLE_DOCS_TRUE@ for files in $$(find . -type f); \ @ENABLE_DOCS_TRUE@ do \ @ENABLE_DOCS_TRUE@ ${INSTALL_DATA} -D $${files} $(DESTDIR)$(htmldir)/netx/$${files}; \ @ENABLE_DOCS_TRUE@ done) @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ (cd ${TOP_BUILD_DIR}/docs/plugin; \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ for files in $$(find . -type f); \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ do \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ ${INSTALL_DATA} -D $${files} $(DESTDIR)$(htmldir)/plugin/$${files}; \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ done) @WINDOWS_OR_INCLUDE_BATS_TRUE@ mkdir -p $(WIN_ALL_DEPS) @WINDOWS_OR_INCLUDE_BATS_TRUE@ mkdir -p $(WIN_RUN_DEPS) @WINDOWS_OR_INCLUDE_BATS_TRUE@ JARSVARS=` ( set -o posix ; set ) | sed "s/.*=//" | grep \\.jar$$ | grep \\.jar.exe$$ ` ; \ @WINDOWS_OR_INCLUDE_BATS_TRUE@ JARSMAKE=` cat $(TOP_BUILD_DIR)/printvarsfile | sed "s/.*=//" | grep \\.jar$$ ` ; \ @WINDOWS_OR_INCLUDE_BATS_TRUE@ for JAR in $$JARSMAKE ; do \ @WINDOWS_OR_INCLUDE_BATS_TRUE@ if [ -f $ $$JAR ] ; then \ @WINDOWS_OR_INCLUDE_BATS_TRUE@ cp -v $$JAR $(WIN_ALL_DEPS)/ ; \ @WINDOWS_OR_INCLUDE_BATS_TRUE@ fi ; \ @WINDOWS_OR_INCLUDE_BATS_TRUE@ done ; @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -f $(WIN_ALL_DEPS)/jar ; @WINDOWS_OR_INCLUDE_BATS_TRUE@ for JAR in `ls $(DESTDIR)$(datadir)/$(PACKAGE_NAME)/*.jar` ; do \ @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -fv $(WIN_ALL_DEPS)/`basename $$JAR` ; \ @WINDOWS_OR_INCLUDE_BATS_TRUE@ done; @WINDOWS_OR_INCLUDE_BATS_TRUE@@WITH_RHINO_TRUE@ filteredName=`basename $(RHINO_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ @WINDOWS_OR_INCLUDE_BATS_TRUE@@WITH_RHINO_TRUE@ cp -v $(RHINO_JAR) $(WIN_RUN_DEPS)/$$filteredName @HAVE_TAGSOUP_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ filteredName=`basename $(TAGSOUP_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ @HAVE_TAGSOUP_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ cp -v $(TAGSOUP_JAR) $(WIN_RUN_DEPS)/$$filteredName @HAVE_MSLINKS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ filteredName=`basename $(MSLINKS_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ @HAVE_MSLINKS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ cp -v $(MSLINKS_JAR) $(WIN_RUN_DEPS)/$$filteredName #no npapi plugin at all! linux-bin-dist: install rm -f $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) mkdir -p $(LINUX_BIN_DIST_DEPS) @WITH_RHINO_TRUE@ filteredName=`basename $(RHINO_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ @WITH_RHINO_TRUE@ cp -v $(RHINO_JAR) $(LINUX_BIN_DIST_DEPS)/$$filteredName @HAVE_TAGSOUP_TRUE@ filteredName=`basename $(TAGSOUP_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ @HAVE_TAGSOUP_TRUE@ cp -v $(TAGSOUP_JAR) $(LINUX_BIN_DIST_DEPS)/$$filteredName cp $(NETX_DIR)/lib/src.zip $(DESTDIR)$(prefix)/netx.src.zip @ENABLE_PLUGINJAR_TRUE@ cp $(TOP_BUILD_DIR)/liveconnect/lib/src.zip $(DESTDIR)$(prefix)/plugin.src.zip @ENABLE_DOCS_TRUE@ cp -r $(DOCS_DIR)/html $(DESTDIR)$(prefix)/icedtea-web-docs if [ ! -e $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ] ; then cp $(MODULARJDK_ARGS_LOCATION) $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ; fi (cd $(DESTDIR)$(prefix)/.. && $(ZIP) -qr $(TOP_BUILD_DIR)/$(distdir).linux.bin.zip `basename $(DESTDIR)$(prefix)` ); win-bin-dist: win-only-image (cd $(DESTDIR)$(prefix)/.. && $(ZIP) -qr $(TOP_BUILD_DIR)/$(distdir).win.bin.zip `basename $(DESTDIR)$(prefix)` ); # strips cygwin and other linux-like blobs. keeping only windows-usefull stuff @WINDOWS_TRUE@win-only-image: install uninstall-linux-only remove-empty-linux-only-dirs @WINDOWS_TRUE@ rm -rf $(WIN_ALL_DEPS) @WINDOWS_TRUE@ if [ ! -e $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ] ; then cp $(MODULARJDK_ARGS_LOCATION) $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ; fi @ENABLE_DOCS_TRUE@@WINDOWS_TRUE@ cp -r $(DOCS_DIR)/html $(DESTDIR)$(prefix)/icedtea-web-docs @WINDOWS_TRUE@ cp $(NETX_DIR)/lib/src.zip $(DESTDIR)$(prefix)/netx.src.zip @ENABLE_PLUGINJAR_TRUE@@WINDOWS_TRUE@ cp $(TOP_BUILD_DIR)/liveconnect/lib/src.zip $(DESTDIR)$(prefix)/plugin.src.zip @WINDOWS_TRUE@clean-win-installer: @WINDOWS_TRUE@ rm -rf $(WIN_INSTALLER_DIR) @WINDOWS_TRUE@$(WIN_INSTALLER_DIR)/itw-installer.json: clean-win-installer @WINDOWS_TRUE@ mkdir $(WIN_INSTALLER_DIR) @WINDOWS_TRUE@ sed \ @WINDOWS_TRUE@ -e "s|../win-installer|$(WIN_INSTALLER_SRC_DIR)|g" \ @WINDOWS_TRUE@ -e s/[@]PACKAGE_VERSION[@]/$(PACKAGE_VERSION)/g $(WIN_INSTALLER_SRC_DIR)/installer.json.in > $@ @WINDOWS_TRUE@win-installer: win-only-image $(WIN_INSTALLER_DIR)/itw-installer.json @WINDOWS_TRUE@ "$(JAVA)" -jar "$(WIXGEN_JAR)" "$(DESTDIR)$(prefix)" -c $(WIN_INSTALLER_DIR)/itw-installer.json -o $(WIN_INSTALLER_DIR)/itw-installer.wxs @WINDOWS_TRUE@ cd $(WIN_INSTALLER_DIR) && "$(WIX_TOOLSET_DIR)"/candle.exe /nologo itw-installer.wxs @WINDOWS_TRUE@ cd $(WIN_INSTALLER_DIR) && "$(WIX_TOOLSET_DIR)"/light.exe /nologo -ext WixUIExtension itw-installer.wixobj # note that this is called only from windows specific target (hidden otherwise) remove-empty-linux-only-dirs: echo "*************************************************************************" ; \ echo "* If run without prefix or on non-windows machine, may harm your system *" ; \ echo "*************************************************************************" ; \ MAN_DIRS_TO_CHECK_AND_CLEAN="de/man1 pl/man1 cs/man1 de pl cs man1 " ; \ for manDirName in $$MAN_DIRS_TO_CHECK_AND_CLEAN ; do \ dirCandidate=$(DESTDIR)$(mandir)/$$manDirName ; \ if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ; \ done dirCandidate=$(DESTDIR)$(mandir)/$$manDirName ; \ if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ; DEFAULT_CMPL_DIRS_TO_CHECK_AND_CLEAN="$(BASH_CMPL_DEST_DIR) `dirname $(BASH_CMPL_DEST_DIR)` $$(dirname $$(dirname $(BASH_CMPL_DEST_DIR)))" ; \ for cmplDirName in $$DEFAULT_CMPL_DIRS_TO_CHECK_AND_CLEAN ; do \ dirCandidate=$$cmplDirName ; \ if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ; \ done dirCandidate=$(DESTDIR)$(libdir)/ ; \ if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ; # all generated manpages must be removed one by one # shell (only shell!) launchers must go away uninstall-linux-only: KNOWN_MANS="icedtea-web.1 icedtea-web-plugin.1 itweb-settings.1 javaws.1 policyeditor.1" ; \ KNOWN_DIRS="man1 de/man1 pl/man1 cs/man1" ; \ for file in $$KNOWN_MANS ; do \ for dir in $$KNOWN_DIRS ; do \ rm -f $(DESTDIR)$(mandir)/$$dir/$$file ; \ done ; \ done rm -f $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) rm -f $(DESTDIR)$(bindir)/$(javaws).sh rm -f $(DESTDIR)$(bindir)/$(itweb_settings).sh rm -f $(DESTDIR)$(bindir)/$(policyeditor).sh rm -f $(BASH_CMPL_DEST_DIR)/itweb-settings.bash rm -f $(BASH_CMPL_DEST_DIR)/javaws.bash rm -f $(BASH_CMPL_DEST_DIR)/policyeditor.bash uninstall-local: uninstall-linux-only rm -f $(DESTDIR)$(PLUGIN_JAR) rm -f $(DESTDIR)$(JSOBJECT_JAR) rm -f $(DESTDIR)$(NETX_JAR) rm -r $(DESTDIR)$(SPLASH_PNG) rm -r $(ICONS_DEST_DIR)/javaws.png rm -rf $(DESTDIR)$(htmldir) @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -rf $(WIN_ALL_DEPS) @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -rf $(WIN_RUN_DEPS) @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -f $(DESTDIR)$(bindir)/$(javaws).bat @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -f $(DESTDIR)$(bindir)/$(itweb_settings).bat @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -f $(DESTDIR)$(bindir)/$(policyeditor).bat @ENABLE_NATIVE_PLUGIN_TRUE@$(PLUGIN_DIR)/%.o: $(PLUGIN_SRCDIR)/%.cc @ENABLE_NATIVE_PLUGIN_TRUE@ mkdir -p $(PLUGIN_DIR) && \ @ENABLE_NATIVE_PLUGIN_TRUE@ cd $(PLUGIN_DIR) && \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(CXX) $(CXXFLAGS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(DEFS) $(VERSION_DEFS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DJDK_UPDATE_VERSION="\"$(JDK_UPDATE_VERSION)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPLUGIN_NAME="\"IcedTea-Web Plugin\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DJAVAWS_BIN="\"$(bindir)/$(JAVAWS)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DJAVAWS_NAME="\"$(javaws)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPLUGIN_VERSION="\"$(PLUGIN_VERSION)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPACKAGE_URL="\"$(PACKAGE_URL)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DMOZILLA_VERSION_COLLAPSED="$(MOZILLA_VERSION_COLLAPSED)" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DICEDTEA_WEB_JRE="\"$(SYSTEM_JRE_DIR)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPLUGIN_BOOTCLASSPATH=$(PLUGIN_BOOTCLASSPATH) \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DNETX_JAR="\"$(NETX_JAR)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPLUGIN_JAR="\"$(PLUGIN_JAR)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DJSOBJECT_JAR="\"$(JSOBJECT_JAR)\""\ @ENABLE_NATIVE_PLUGIN_TRUE@ $(GLIB_CFLAGS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(MOZILLA_CFLAGS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ -fvisibility=hidden \ @ENABLE_NATIVE_PLUGIN_TRUE@ -fPIC -o $@ -c $< @ENABLE_NATIVE_PLUGIN_TRUE@$(PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY): $(addprefix $(PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) @ENABLE_NATIVE_PLUGIN_TRUE@ cd $(PLUGIN_DIR) && \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(CXX) $(CXXFLAGS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(PLUGIN_OBJECTS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(GLIB_LIBS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(MOZILLA_LIBS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ -shared -o $@ # Start of CPP Unit test targets # Note that UnitTest++ has its own makefile, however this is avoided because it creates an in-source build. @ENABLE_NATIVE_PLUGIN_TRUE@$(CPP_UNITTEST_FRAMEWORK_LIB): $(CPP_UNITTEST_FRAMEWORK_SRCDIR) @ENABLE_NATIVE_PLUGIN_TRUE@ mkdir -p $(CPP_UNITTEST_FRAMEWORK_BUILDDIR) && \ @ENABLE_NATIVE_PLUGIN_TRUE@ pushd $(CPP_UNITTEST_FRAMEWORK_SRCDIR) && \ @ENABLE_NATIVE_PLUGIN_TRUE@ for cppfile in $$(find $(CPP_UNITTEST_FRAMEWORK_SRCDIR) -name '*.cpp') ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ do \ @ENABLE_NATIVE_PLUGIN_TRUE@ objfile="$(CPP_UNITTEST_FRAMEWORK_BUILDDIR)/$$(basename $${cppfile%.cpp}).o" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(CXX) $(CXXFLAGS) -c $$cppfile -o $$objfile || exit 1 ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ done ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ ar cr $(CPP_UNITTEST_FRAMEWORK_LIB) $(CPP_UNITTEST_FRAMEWORK_BUILDDIR)/*.o ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ popd @ENABLE_NATIVE_PLUGIN_TRUE@clean-unittest++-impl: @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f $(CPP_UNITTEST_FRAMEWORK_BUILDDIR)/*.o @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f $(CPP_UNITTEST_FRAMEWORK_LIB) @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e $(CPP_UNITTEST_FRAMEWORK_BUILDDIR) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ rmdir $(CPP_UNITTEST_FRAMEWORK_BUILDDIR) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi @ENABLE_NATIVE_PLUGIN_TRUE@stamps/cpp-unit-tests-compile.stamp: $(CPP_UNITTEST_FRAMEWORK_LIB) $(CPP_UNITTEST_SRCDIR) $(addprefix $(PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) @ENABLE_NATIVE_PLUGIN_TRUE@ mkdir -p $(CPP_UNITTEST_DIR) && \ @ENABLE_NATIVE_PLUGIN_TRUE@ pushd $(CPP_UNITTEST_SRCDIR) && \ @ENABLE_NATIVE_PLUGIN_TRUE@ for cppfile in $$(find $(CPP_UNITTEST_SRCDIR) -name '*.cc') ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ do \ @ENABLE_NATIVE_PLUGIN_TRUE@ objfile="$(CPP_UNITTEST_DIR)/$$(basename $${cppfile%.cc}).o" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "Compiling $$cppfile to $$objfile"; \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(CXX) $(CXXFLAGS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(DEFS) $(VERSION_DEFS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DJDK_UPDATE_VERSION="\"$(JDK_UPDATE_VERSION)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPLUGIN_NAME="\"IcedTea-Web Plugin\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DJAVAWS_BIN="\"$(bindir)/$(JAVAWS)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DJAVAWS_NAME="\"$(javaws)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPLUGIN_VERSION="\"$(PLUGIN_VERSION)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPACKAGE_URL="\"$(PACKAGE_URL)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DMOZILLA_VERSION_COLLAPSED="$(MOZILLA_VERSION_COLLAPSED)" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DICEDTEA_WEB_JRE="\"$(SYSTEM_JRE_DIR)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPLUGIN_BOOTCLASSPATH=$(PLUGIN_BOOTCLASSPATH) \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DNETX_JAR="\"$(NETX_JAR)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DPLUGIN_JAR="\"$(PLUGIN_JAR)\"" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -DJSOBJECT_JAR="\"$(JSOBJECT_JAR)\""\ @ENABLE_NATIVE_PLUGIN_TRUE@ $(GLIB_CFLAGS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(MOZILLA_CFLAGS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ "-I$(CPP_UNITTEST_FRAMEWORK_SRCDIR)/src" \ @ENABLE_NATIVE_PLUGIN_TRUE@ "-I$(PLUGIN_SRCDIR)" \ @ENABLE_NATIVE_PLUGIN_TRUE@ -o $$objfile -c $$cppfile || exit 1 ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ done ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ popd ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ mkdir -p stamps ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ touch $@ @ENABLE_NATIVE_PLUGIN_TRUE@$(CPP_UNITTEST_EXECUTABLE): $(CPP_UNITTEST_FRAMEWORK_LIB) stamps/cpp-unit-tests-compile.stamp @ENABLE_NATIVE_PLUGIN_TRUE@ cd $(CPP_UNITTEST_DIR) && \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(CXX) $(CXXFLAGS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(addprefix $(PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(CPP_UNITTEST_DIR)/*.o \ @ENABLE_NATIVE_PLUGIN_TRUE@ -lrt \ @ENABLE_NATIVE_PLUGIN_TRUE@ -lpthread \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(GLIB_LIBS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(MOZILLA_LIBS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(CPP_UNITTEST_FRAMEWORK_LIB)\ @ENABLE_NATIVE_PLUGIN_TRUE@ $(BUILT_CPP_UNIT_TEST_FRAMEWORK) -o $@ @ENABLE_NATIVE_PLUGIN_TRUE@clean-cpp-unit-tests-impl: @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f stamps/cpp-unit-tests-compile.stamp @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f $(CPP_UNITTEST_EXECUTABLE) @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f $(CPP_UNITTEST_DIR)/*.o @ENABLE_NATIVE_PLUGIN_TRUE@run-cpp-unit-tests-impl: $(CPP_UNITTEST_EXECUTABLE) @ENABLE_NATIVE_PLUGIN_TRUE@ $(CPP_UNITTEST_EXECUTABLE) # End of CPP Unit test targets @ENABLE_NATIVE_PLUGIN_TRUE@clean-IcedTeaPlugin: @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f $(PLUGIN_DIR)/*.o @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f $(PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) @ENABLE_NATIVE_PLUGIN_TRUE@ if [ $(TOP_SRC_DIR) != $(TOP_BUILD_DIR) ]; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e $(TOP_BUILD_DIR)/plugin/icedteanp ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ rmdir $(TOP_BUILD_DIR)/plugin/icedteanp ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ rmdir $(TOP_BUILD_DIR)/plugin ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi clean-unittest++-placeholder: clean-cpp-unit-tests-placeholder: echo "plugin disabled" run-cpp-unit-tests-impl-placeholder: echo "plugin disabled" clean-unittest++: $(CPPUNIT_FRAMEWORK_CLEAN_IMPL) clean-cpp-unit-tests: $(CPPUNIT_CLEAN_IMPL) run-cpp-unit-tests: $(CPPUNIT_IMPL) stamps/plugin.stamp: $(ICEDTEAPLUGIN_TARGET) mkdir -p stamps touch stamps/plugin.stamp clean-plugin: $(ICEDTEAPLUGIN_CLEAN) rm -f stamps/plugin.stamp liveconnect-source-files.txt: @WINDOWS_TRUE@ echo "Using WEmbeddedFrame" ; \ @WINDOWS_TRUE@ sed "s;sun.awt.X11.XEmbeddedFrame;sun.awt.windows.WEmbeddedFrame;" -i $(LIVECONNECT_SRCS)/$(SUN_APPLET_DIRS)/PluginAppletViewer.java ; \ @WINDOWS_TRUE@ sed "s;XEmbeddedFrame;WEmbeddedFrame;" -i $(LIVECONNECT_SRCS)/$(SUN_APPLET_DIRS)/PluginAppletViewer.java ; \ @WINDOWS_TRUE@ sed "s;super(handle, true);super(handle);" -i $(LIVECONNECT_SRCS)/$(SUN_APPLET_DIRS)/PluginAppletViewer.java ; @WINDOWS_FALSE@ echo "Using XEmbeddedFrame" ; if test "x${LIVECONNECT_DIR}" != x; then \ find $(LIVECONNECT_SRCS) -name '*.java' | sort > $@ ; \ fi ; \ touch $@ stamps/liveconnect.stamp: liveconnect-source-files.txt stamps/netx.stamp if test "x${LIVECONNECT_DIR}" != x; then \ mkdir -p $(TOP_BUILD_DIR)/liveconnect && \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(TOP_BUILD_DIR)/liveconnect \ $(call composeclasspath,$(NETX_DIR) $(MSLINKS_JAR) $(TAGSOUP_JAR) $(RHINO_JAR)) \ -sourcepath $(LIVECONNECT_SRCS) \ @liveconnect-source-files.txt ; \ fi mkdir -p stamps touch $@ # although sun and netscape packages were compiled together, we pack and install them as two jars, to follow java.desktop and jdk.jsobject jdk9 modules # the all together jar is kept for usage in tests. Feel free to remove and refactor stamps/liveconnect-dist.stamp: stamps/liveconnect.stamp if test "x${LIVECONNECT_DIR}" != x; then \ (cd $(TOP_BUILD_DIR)/liveconnect ; \ mkdir -p lib ; \ $(SYSTEM_JDK_DIR)/bin/jar cf lib/classes.jar $(LIVECONNECT_DIR) ; \ $(SYSTEM_JDK_DIR)/bin/jar cf lib/classes-applet.jar $(SUN_APPLET_DIRS) ; \ $(SYSTEM_JDK_DIR)/bin/jar cf lib/classes-jsobject.jar $(JSOBJECT_DIRS) ; \ cp -pPR $(SRC_DIR_LINK) $(LIVECONNECT_SRCS) src; \ find src -type f -exec chmod 640 '{}' ';' -o -type d -exec chmod 750 '{}' ';'; \ cd src ; \ $(ZIP) -qr $(TOP_BUILD_DIR)/liveconnect/lib/src.zip $(LIVECONNECT_DIR) ) ; \ fi mkdir -p stamps touch $@ clean-liveconnect: rm -rf $(TOP_BUILD_DIR)/liveconnect rm -f stamps/liveconnect-dist.stamp rm -f liveconnect-source-files.txt rm -f stamps/liveconnect.stamp # NetX netx-source-files.txt: find $(NETX_SRCDIR) -name '*.java' | sort > $@ ; \ for src in $(NETX_EXCLUDE_SRCS) ; \ do \ sed -i "/$${src}/ d" $@ ; \ done @WITH_RHINO_FALSE@ sed -i '/RhinoBasedPacEvaluator/ d' $@ # if 'sed' will be missing on machine, use old IFS hack as on other places # the 'sed' cycles is changing some custom version like 1.6.2 fedora23.4 to simple 1.6 # if changed, keep in mind that also 1.7 should bubble to 1.7 # also 1.7pre or 1.7preHASH should end up like 1.7 $(TOP_BUILD_DIR)/metadata: $(top_srcdir)/metadata.in mkdir -p $(TOP_BUILD_DIR)/metadata-work ; \ METAFILES=`ls $(top_srcdir)/metadata.in` ; \ SEDDED_VERSION=`echo "$(FULL_VERSION)" | sed 's/[^0-9]\+/ /g'` ; \ x=0; for i in $$SEDDED_VERSION ; do \ let x++; \ if [ $$x -eq 1 ] ; then V1=$$i; fi; \ if [ $$x -eq 2 ] ; then V2=$$i; fi; \ done; \ XVERSION=$$V1.$$V2; \ for F in $$METAFILES ; do \ cat $(top_srcdir)/metadata.in/$$F | sed "s;%{name};$(PACKAGE_NAME);g" | sed "s;%{version};$$XVERSION;g" > $(TOP_BUILD_DIR)/metadata-work/$$F ; \ done ; \ mv $(TOP_BUILD_DIR)/metadata-work $(TOP_BUILD_DIR)/metadata ; check-metadata: $(TOP_BUILD_DIR)/metadata xmllint --noout $(TOP_BUILD_DIR)/metadata/* ; \ if [ $$? -eq 0 ] ; then \ echo "Passed: well formed" ; \ else \ echo "FAILED: well formed" ; \ fi ; \ xmllint --noout --schema http://maven.apache.org/xsd/maven-4.0.0.xsd $(TOP_BUILD_DIR)/metadata/*.pom ; \ if [ $$? -eq 0 ] ; then \ echo "Passed: valid poms" ; \ else \ echo "FAILED: valid poms" ; \ fi ; \ appstream-util validate $(TOP_BUILD_DIR)/metadata/*.appdata.xml $(TOP_BUILD_DIR)/metadata/*.metainfo.xml ; \ if [ $$? -eq 0 ] ; then \ echo "Passed: valid software descriptors" ; \ else \ echo "FAILED: valid software descriptors" ; \ fi ; # very strange results: # appstreamcli validate $(TOP_BUILD_DIR)/metadata/*.appdata.xml $(TOP_BUILD_DIR)/metadata/*.metainfo.xml $(TOP_BUILD_DIR)/completion/itweb-settings.bash: $(TOP_SRC_DIR)/completion/itweb-settings.bash.in stamps/netx.stamp OPTIONS_COMMAND="$(SYSTEM_JRE_DIR)/bin/java -cp $(NETX_DIR) net.sourceforge.jnlp.OptionsDefinitions" ; \ OPTIONS=`$$OPTIONS_COMMAND itweb-settings`; \ echo $$OPTIONS ; \ cat $(TOP_SRC_DIR)/completion/itweb-settings.bash.in | \ sed "s/@OPTIONS@/$${OPTIONS}/" > $@ ; $(TOP_BUILD_DIR)/completion/javaws.bash: $(TOP_SRC_DIR)/completion/javaws.bash.in stamps/netx.stamp OPTIONS_COMMAND="$(SYSTEM_JRE_DIR)/bin/java -cp $(NETX_DIR) net.sourceforge.jnlp.OptionsDefinitions" ; \ OPTIONS=`$$OPTIONS_COMMAND javaws` ; \ echo $$OPTIONS ; \ cat $(TOP_SRC_DIR)/completion/javaws.bash.in | \ sed "s/@OPTIONS@/$${OPTIONS}/" > $@ ; $(TOP_BUILD_DIR)/completion/policyeditor.bash: $(TOP_SRC_DIR)/completion/policyeditor.bash.in stamps/netx.stamp OPTIONS_COMMAND="$(SYSTEM_JRE_DIR)/bin/java -cp $(NETX_DIR) net.sourceforge.jnlp.OptionsDefinitions" ; \ OPTIONS=`$$OPTIONS_COMMAND policyeditor` ; \ echo $$OPTIONS ; \ cat $(TOP_SRC_DIR)/completion/policyeditor.bash.in | \ sed "s/@OPTIONS@/$${OPTIONS}/" > $@ ; stamps/generate-docs.stamp: stamps/netx.stamp mkdir -p "$(DOCS_DIR)" ; \ HTML_DOCS_TARGET_DIR="$(DOCS_DIR)/html" ; \ PLAIN_DOCS_TARGET_DIR="$(DOCS_DIR)/plain" ; \ MAN_DOCS_TARGET_DIR="$(DOCS_DIR)/man" ; \ AUTHORS_FILE_TARGET="$(TOP_SRC_DIR)/AUTHORS" ; \ mkdir "$$HTML_DOCS_TARGET_DIR" ; \ mkdir "$$PLAIN_DOCS_TARGET_DIR" ; \ mkdir "$$MAN_DOCS_TARGET_DIR" ; \ HTML_DOCS_INDEX="$$HTML_DOCS_TARGET_DIR/index.html" ; \ TP_COMMAND="$(SYSTEM_JRE_DIR)/bin/java -cp $(NETX_DIR) net.sourceforge.jnlp.util.docprovider.TextsProvider" ; \ TP_TAIL="false $(FULL_VERSION)" ; \ LANG_BACKUP=$$LANG ; \ echo "$(PLUGIN_VERSION)" > "$$HTML_DOCS_INDEX" ; \ echo "

    $(PLUGIN_VERSION) docs:

    " >> "$$HTML_DOCS_INDEX" ; \ for LANG_ID in en_US.UTF-8 cs_CZ.UTF-8 pl_PL.UTF-8 de_DE.UTF-8 ; do \ ID=`echo "$$LANG_ID" | head -c 2` ; \ ENCOD=`echo "$$LANG_ID" | tail -c 6 -` ; \ export LANG=$$LANG_ID; \ mkdir "$$HTML_DOCS_TARGET_DIR/$$ID" ; \ echo "
  • $$LANG_ID
  • " >> "$$HTML_DOCS_INDEX" ; \ $$TP_COMMAND html "$$HTML_DOCS_TARGET_DIR/$$ID" $$TP_TAIL "-authorFile=$$AUTHORS_FILE_TARGET" ; \ mkdir "$$PLAIN_DOCS_TARGET_DIR/$$ID" ; \ $$TP_COMMAND plain "$$PLAIN_DOCS_TARGET_DIR/$$ID" 160 $$TP_TAIL "-authorFile=$$AUTHORS_FILE_TARGET" ; \ if [ $$ID = "en" ] ; then \ MAN_DESC="$$MAN_DOCS_TARGET_DIR/man1" ; \ else \ MAN_DESC="$$MAN_DOCS_TARGET_DIR/$$ID/man1" ; \ fi ; \ mkdir -p "$$MAN_DESC" ; \ $$TP_COMMAND man $$ENCOD "$$MAN_DESC" $$TP_TAIL "-authorFile=$$AUTHORS_FILE_TARGET" ; \ $$TP_COMMAND htmlIntro "$(NETX_DIR)/net/sourceforge/jnlp/resources/about_$$ID.html" $$TP_TAIL; \ done ; \ export LANG=$$LANG_BACKUP ; \ echo "" >> $$HTML_DOCS_INDEX ; \ touch $@ stamps/netx-html-gen.stamp: (cd $$NETX_SRCDIR/..; \ mkdir -p html-gen; \ cp AUTHORS NEWS COPYING ChangeLog html-gen/; \ export HTML_GEN_DEBUG=true; \ ${SHELL} html-gen.sh 140; \ unset HTML_GEN_DEBUG) ${INSTALL_DATA} $(NETX_SRCDIR)/../html-gen/*.html $(NETX_RESOURCE_DIR) rm -r $(NETX_SRCDIR)/../html-gen/ mkdir -p stamps touch $@ stamps/netx.stamp: netx-source-files.txt stamps/netx-html-gen.stamp mkdir -p $(NETX_DIR) $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(NETX_DIR) \ -sourcepath $(NETX_SRCDIR) \ $(call composeclasspath, $(MSLINKS_JAR) $(TAGSOUP_JAR) $(RHINO_JAR)) \ @netx-source-files.txt (cd $(NETX_RESOURCE_DIR); \ for files in $$(find . -type f); \ do \ ${INSTALL_DATA} -D $${files} \ $(NETX_DIR)/net/sourceforge/jnlp/resources/$${files}; \ done) cp $(CPA) $(NETX_SRCDIR)/net/sourceforge/jnlp/runtime/pac-funcs.js \ $(NETX_DIR)/net/sourceforge/jnlp/runtime cp $(CPA) build.properties $(NETX_DIR)/net/sourceforge/jnlp/ mkdir -p stamps touch $@ stamps/netx-dist.stamp: stamps/netx.stamp $(TOP_BUILD_DIR)/netx.manifest stamps/generate-docs.stamp $(TOP_BUILD_DIR)/completion/itweb-settings.bash $(TOP_BUILD_DIR)/completion/javaws.bash $(TOP_BUILD_DIR)/completion/policyeditor.bash $(TOP_BUILD_DIR)/metadata (cd $(NETX_DIR) ; \ mkdir -p lib ; \ $(SYSTEM_JDK_DIR)/bin/jar cfm lib/classes.jar \ $(TOP_BUILD_DIR)/netx.manifest javax/jnlp net sun; \ cp -pPR $(SRC_DIR_LINK) $(NETX_SRCDIR) src; \ find src -type f -exec chmod 640 '{}' ';' -o -type d -exec chmod 750 '{}' ';'; \ cd src ; \ $(ZIP) -qr $(NETX_DIR)/lib/src.zip javax net sun) mkdir -p stamps touch $@ clean-netx: rm -rf $(NETX_DIR) rm -f stamps/netx-dist.stamp rm -f netx-source-files.txt rm -f stamps/netx.stamp rm -f stamps/netx-html-gen.stamp rm -f $(NETX_RESOURCE_DIR)/{NEWS,AUTHORS,COPYING,ChangeLog}.html clean-desktop-files: rm -f javaws.desktop rm -f itweb-settings.desktop rm -f policyeditor.desktop # launcher run args: launcher.build/$(MODULARJDK_ARGS_FILE): $(srcdir)/$(MODULARJDK_ARGS_FILE) mkdir -p launcher.build cp $(srcdir)/$(MODULARJDK_ARGS_FILE) launcher.build/$(MODULARJDK_ARGS_FILE) # todo, handling of suffixes # there is curently harecoded sh, so it can somehow basically work # see the DESKTOP_SUFFIX for final tuning @ENABLE_NATIVE_LAUNCHERS_TRUE@launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor): rust-launcher/src/main.rs rust-launcher/Cargo.toml @ENABLE_NATIVE_LAUNCHERS_TRUE@ export ITW_TMP_REPLACEMENT=$(TESTS_DIR)/rust_tests_tmp ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ mkdir -p $$ITW_TMP_REPLACEMENT; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ filename=`basename $@` ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ type=$${filename%.*} ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ srcs=$(TOP_SRC_DIR)/rust-launcher ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ outs=$(TOP_BUILD_DIR)/launcher.in.$$type ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ mkdir -p launcher.build ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ cp -r $$srcs $$outs ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ pushd $$outs ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export JAVA=$(JAVA) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export JRE=$(SYSTEM_JRE_DIR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export SPLASH_PNG=$(SPLASH_PNG) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export ITW_LIBS=$(ITW_LIBS) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export PLUGIN_JAR=$(PLUGIN_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export NETX_JAR=$(NETX_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export JSOBJECT_JAR=$(JSOBJECT_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export TAGSOUP_JAR=$(TAGSOUP_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export RHINO_JAR=$(RHINO_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export MSLINKS_JAR=$(MSLINKS_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export MODULARJDK_ARGS_LOCATION=$(MODULARJDK_ARGS_LOCATION) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ unset MAIN_CLASS ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ unset BIN_LOCATION ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ unset PROGRAM_NAME ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ if [ $$filename = $(javaws) ] ; then \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export BIN_LOCATION=$(bindir)/$(javaws) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export PROGRAM_NAME=$(javaws) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ fi ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ if [ $$filename = $(itweb_settings) ] ; then \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export MAIN_CLASS=net.sourceforge.jnlp.controlpanel.CommandLine ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export BIN_LOCATION=$(bindir)/$(itweb_settings) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export PROGRAM_NAME=$(itweb_settings) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ fi ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ if [ $$filename = $(policyeditor) ] ; then \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export MAIN_CLASS=net.sourceforge.jnlp.security.policyeditor.PolicyEditor ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export BIN_LOCATION=$(bindir)/$(policyeditor) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export PROGRAM_NAME=$(policyeditor) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ fi ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ $(CARGO) test ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ r=$$? ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ $(CARGO) build --release ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ popd ;\ @ENABLE_NATIVE_LAUNCHERS_TRUE@ cp -v $$outs/target/release/launcher $@ ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ if [ $$r -ne 0 ] ; then \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ mv $@ $@.broken ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ fi; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ exit $$r # https://github.com/SimonKagstrom/kcov/ # build is not part of upstream, declaring @ENABLE_NATIVE_LAUNCHERS_TRUE@rust-code-coverage: @ENABLE_NATIVE_LAUNCHERS_TRUE@ kcov="none" ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ if [ -f $(KCOV)/kcov ] ; then \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ kcov=$(KCOV)/kcov ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ elif [ -f $(KCOV)/bin/kcov ] ; then \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ kcov=$(KCOV)/bin/kcov ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ elif [ -f $(KCOV)/build/kcov ] ; then \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ kcov=$(KCOV)/build/kcov ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ elif [ -f $(KCOV)/build/src/kcov ] ; then \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ kcov=$(KCOV)/build/src/kcov ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ else \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ mkdir $(KCOV)/build ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ pushd $(KCOV)/build ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ cmake .. ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ make ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ popd ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ kcov=$(KCOV)/build/src/kcov ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ fi ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export ITW_TMP_REPLACEMENT=$(TESTS_DIR)/rust_tests_tmp ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ mkdir -p $$ITW_TMP_REPLACEMENT; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ srcs=$(TOP_SRC_DIR)/rust-launcher ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ outs=$(TOP_BUILD_DIR)/launcher.in.codecoverage ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ rm -rvf $$outs ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ cp -r $$srcs $$outs ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ pushd $$outs ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export JAVA=$(JAVA) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export JRE=$(SYSTEM_JRE_DIR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export SPLASH_PNG=$(SPLASH_PNG) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export ITW_LIBS=$(ITW_LIBS) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export PLUGIN_JAR=$(PLUGIN_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export NETX_JAR=$(NETX_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export JSOBJECT_JAR=$(JSOBJECT_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export TAGSOUP_JAR=$(TAGSOUP_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export RHINO_JAR=$(RHINO_JAR) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export MODULARJDK_ARGS_LOCATION=$(MODULARJDK_ARGS_LOCATION) ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export BIN_LOCATION=$(bindir)/none ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ export PROGRAM_NAME=test ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ $(CARGO) test --no-run ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ popd ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ rm -fv $(TOP_BUILD_DIR)/launcher.in.codecoverage/target/debug/launcher-*.d ; \ @ENABLE_NATIVE_LAUNCHERS_TRUE@ $$kcov $$outs $(TOP_BUILD_DIR)/launcher.in.codecoverage/target/debug/launcher-* @ENABLE_SHELL_LAUNCHERS_TRUE@launcher.build/$(javaws).sh: shell-launcher/launchers.sh.in @ENABLE_SHELL_LAUNCHERS_TRUE@ mkdir -p launcher.build @ENABLE_SHELL_LAUNCHERS_TRUE@ MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@ BIN_LOCATION=$(bindir)/$(javaws).sh ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@ PROGRAM_NAME=$(javaws) ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@ $(edit_launcher_script) < $< > $@ @ENABLE_SHELL_LAUNCHERS_TRUE@launcher.build/$(itweb_settings).sh: shell-launcher/launchers.sh.in @ENABLE_SHELL_LAUNCHERS_TRUE@ mkdir -p launcher.build @ENABLE_SHELL_LAUNCHERS_TRUE@ MAIN_CLASS=net.sourceforge.jnlp.controlpanel.CommandLine ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@ BIN_LOCATION=$(bindir)/$(itweb_settings).sh ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@ PROGRAM_NAME=$(itweb_settings) ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@ $(edit_launcher_script) < $< > $@ @ENABLE_SHELL_LAUNCHERS_TRUE@launcher.build/$(policyeditor).sh: shell-launcher/launchers.sh.in @ENABLE_SHELL_LAUNCHERS_TRUE@ mkdir -p launcher.build @ENABLE_SHELL_LAUNCHERS_TRUE@ MAIN_CLASS=net.sourceforge.jnlp.security.policyeditor.PolicyEditor ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@ BIN_LOCATION=$(bindir)/$(policyeditor).sh ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@ PROGRAM_NAME=$(policyeditor) ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@ $(edit_launcher_script) < $< > $@ # TODO get rid of this copypaste @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@launcher.build/$(javaws).bat: shell-launcher/launchers.bat.in @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ mkdir -p launcher.build @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ BIN_LOCATION=$(bindir)/$(javaws) ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ PROGRAM_NAME=$(javaws) ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ $(edit_launcher_script) $(fix_CRLF) < $< > $@ # TODO get rid of this copypaste @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@launcher.build/$(itweb_settings).bat: shell-launcher/launchers.bat.in @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ mkdir -p launcher.build @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ MAIN_CLASS=net.sourceforge.jnlp.controlpanel.CommandLine ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ BIN_LOCATION=$(bindir)/$(itweb_settings) ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ PROGRAM_NAME=$(itweb_settings) ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ $(edit_launcher_script) $(fix_CRLF) < $< > $@ # TODO get rid of this copypaste @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@launcher.build/$(policyeditor).bat: shell-launcher/launchers.bat.in @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ mkdir -p launcher.build @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ MAIN_CLASS=net.sourceforge.jnlp.security.policyeditor.PolicyEditor ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ BIN_LOCATION=$(bindir)/$(policyeditor) ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ PROGRAM_NAME=$(policyeditor) ;\ @ENABLE_SHELL_LAUNCHERS_TRUE@@WINDOWS_OR_INCLUDE_BATS_TRUE@ $(edit_launcher_script) $(fix_CRLF) < $< > $@ clean-launchers: rm -f launcher.build/$(MODULARJDK_ARGS_FILE) @ENABLE_NATIVE_LAUNCHERS_TRUE@ rm -f launcher.build/$(javaws) @ENABLE_NATIVE_LAUNCHERS_TRUE@ rm -f launcher.build/$(itweb_settings) @ENABLE_NATIVE_LAUNCHERS_TRUE@ rm -f launcher.build/$(policyeditor) @ENABLE_NATIVE_LAUNCHERS_TRUE@ rm -rf launcher.in* @ENABLE_NATIVE_LAUNCHERS_TRUE@ rm -rf $(TESTS_DIR)/rust_tests_tmp @ENABLE_SHELL_LAUNCHERS_TRUE@ rm -f launcher.build/$(javaws).sh @ENABLE_SHELL_LAUNCHERS_TRUE@ rm -f launcher.build/$(itweb_settings).sh @ENABLE_SHELL_LAUNCHERS_TRUE@ rm -f launcher.build/$(policyeditor).sh @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -f launcher.build/$(javaws).bat @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -f launcher.build/$(itweb_settings).bat @WINDOWS_OR_INCLUDE_BATS_TRUE@ rm -f launcher.build/$(policyeditor).bat if [ -e launcher.build ] ; then \ rmdir launcher.build ; \ fi javaws.desktop: javaws.desktop.in sed "s#PATH_TO_JAVAWS#$(bindir)/$(JAVAWS)#" < $(srcdir)/javaws.desktop.in > javaws.desktop itweb-settings.desktop: $(srcdir)/itweb-settings.desktop.in sed "s#PATH_TO_ITWEB_SETTINGS#$(bindir)/$(ITWEB_SETTINGS)#" \ < $(srcdir)/itweb-settings.desktop.in > itweb-settings.desktop policyeditor.desktop: $(srcdir)/policyeditor.desktop.in sed "s#PATH_TO_POLICYEDITOR#$(bindir)/$(POLICYEDITOR)#" \ < $(srcdir)/policyeditor.desktop.in > policyeditor.desktop # documentation stamps/docs.stamp: stamps/netx-docs.stamp stamps/plugin-docs.stamp touch stamps/docs.stamp clean-docs: clean-netx-docs clean-plugin-docs if [ -e ${TOP_BUILD_DIR}/docs ] ; then \ rmdir ${TOP_BUILD_DIR}/docs ; \ fi rm -f stamps/docs.stamp stamps/netx-docs.stamp: @ENABLE_DOCS_TRUE@ $(SYSTEM_JDK_DIR)/bin/javadoc $(JAVADOC_MEM_OPTS) $(JAVADOC_OPTS) \ @ENABLE_DOCS_TRUE@ -d ${TOP_BUILD_DIR}/docs/netx -sourcepath $(NETX_SRCDIR) \ @ENABLE_DOCS_TRUE@ -doctitle 'IcedTea-Web: NetX API Specification' \ @ENABLE_DOCS_TRUE@ -windowtitle 'IcedTea-Web: NetX ' \ @ENABLE_DOCS_TRUE@ -header 'IcedTea-Web
    NetX
    ' \ @ENABLE_DOCS_TRUE@ $(call composeclasspath, $(MSLINKS_JAR) $(TAGSOUP_JAR) $(RHINO_JAR)) \ @ENABLE_DOCS_TRUE@ $(NETX_PKGS) mkdir -p stamps touch stamps/netx-docs.stamp clean-netx-docs: rm -rf ${TOP_BUILD_DIR}/docs/netx rm -f stamps/netx-docs.stamp stamps/plugin-docs.stamp: @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ $(SYSTEM_JDK_DIR)/bin/javadoc $(JAVADOC_MEM_OPTS) $(JAVADOC_OPTS) \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ -d ${TOP_BUILD_DIR}/docs/plugin -sourcepath "$(NETX_SRCDIR)$(CLASSPATH_SEPARATOR)$(LIVECONNECT_SRCS)" \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ -doctitle 'IcedTea-Web: Plugin API Specification' \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ -windowtitle 'IcedTea-Web: Plugin ' \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ -header 'IcedTea-Web
    Plugin
    ' \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ $(call composeclasspath, $(MSLINKS_JAR) $(TAGSOUP_JAR) $(RHINO_JAR)) \ @ENABLE_DOCS_TRUE@@ENABLE_PLUGINJAR_TRUE@ $(PLUGIN_PKGS) mkdir -p stamps touch stamps/plugin-docs.stamp clean-plugin-docs: rm -rf ${TOP_BUILD_DIR}/docs/plugin rm -f stamps/plugin-docs.stamp clean-generated-docs: rm -rf "$(DOCS_DIR)" rm -f stamps/generate-docs.stamp clean-icedteaweb-completion: rm -f $(TOP_BUILD_DIR)/completion/itweb-settings.bash rm -f $(TOP_BUILD_DIR)/completion/javaws.bash rm -f $(TOP_BUILD_DIR)/completion/policyeditor.bash clean-metadata: rm -rf $(TOP_BUILD_DIR)/metadata # check # ========================== clean-tests: clean-netx-tests clean-cpp-unit-tests clean-unittest++ if [ -e $(CPP_UNITTEST_DIR) ] ; then \ rmdir $(CPP_UNITTEST_DIR) ; \ fi if [ -e $(TESTS_DIR) ]; then \ rmdir $(TESTS_DIR) ; \ fi stamps/check-pac-functions.stamp: ./jrunscript $(TOP_SRC_DIR)/tests/netx/pac/pac-funcs-test.js \ $$(readlink -f $(TOP_SRC_DIR)/netx/net/sourceforge/jnlp/runtime/pac-funcs.js) ; \ mkdir -p stamps && \ touch $@ junit-runner-source-files.txt: find $(JUNIT_RUNNER_SRCDIR) -name '*.java' | sort > $@ jacoco-operator-source-files.txt: find $(JACOCO_OPERATOR_SRCDIR) -name '*.java' | sort > $@ $(JUNIT_RUNNER_JAR): junit-runner-source-files.txt stamps/test-extensions-compile.stamp mkdir -p $(JUNIT_RUNNER_DIR) && \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(JUNIT_RUNNER_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(TEST_EXTENSIONS_DIR)) \ @junit-runner-source-files.txt && \ $(SYSTEM_JDK_DIR)/bin/jar cf $@ -C $(JUNIT_RUNNER_DIR) . stamps/junit-jnlp-dist-dirs: junit-jnlp-dist-simple.txt stamps/junit-jnlp-dist-signed.stamp junit-jnlp-dist-custom.txt mkdir -p $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) mkdir -p $(REPRODUCERS_BUILD_DIR) touch $@ junit-jnlp-dist-custom.txt: rm -f $(abs_top_builddir)/$@ ; \ cd $(REPRODUCERS_TESTS_SRCDIR)/$(CUSTOM_REPRODUCERS)/ ; \ for x in $(COMPILE_WHITELIST_FILTER) ; do \ find . -maxdepth 1 -mindepth 1 | sed "s/.\/*//" | grep $$x >> $(abs_top_builddir)/$@ || true ; \ done junit-jnlp-dist-simple.txt: rm -f $(abs_top_builddir)/$@ ; \ cd $(REPRODUCERS_TESTS_SRCDIR)/simple/ ; \ for x in $(COMPILE_WHITELIST_FILTER) ; do \ find . -maxdepth 1 -mindepth 1 | sed "s/.\/*//" | grep $$x >> $(abs_top_builddir)/$@ || true ; \ done stamps/junit-jnlp-dist-signed.stamp: types=($(SIGNED_REPRODUCERS)) ; \ for which in "$${types[@]}" ; do \ rm -f $(abs_top_builddir)/junit-jnlp-dist-$$which.txt ; \ pushd $(REPRODUCERS_TESTS_SRCDIR)/$$which/ ; \ for x in $(COMPILE_WHITELIST_FILTER) ; do \ find . -maxdepth 1 -mindepth 1 | sed "s/.\/*//" | grep $$x >> $(abs_top_builddir)/junit-jnlp-dist-$$which.txt ; \ done ; \ popd ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/netx-dist-tests-prepare-reproducers.stamp: stamps/junit-jnlp-dist-dirs stamps/liveconnect-dist.stamp stamps/netx-dist.stamp stamps/plugin.stamp types=($(ALL_NONCUSTOM_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ echo "processing: $$dir" ; \ mkdir -p "$(REPRODUCERS_BUILD_DIR)/$$dir" ; \ if [ -e "$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/srcs/" ]; then \ d=`pwd` ; \ cd "$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/srcs/" ; \ srcFiles=`find . -mindepth 1 -type f -name "*.java" | sed "s/.\/*//"` ; \ notSrcFiles=`find . -mindepth 1 -type f \! -name "*.java" | sed "s/.\/*//"` ; \ $(SYSTEM_JDK_DIR)/bin/javac -cp $(NETX_DIR)/lib/classes.jar\$(CLASSPATH_SEPARATOR)$(TOP_BUILD_DIR)/liveconnect -d "$(REPRODUCERS_BUILD_DIR)/$$dir/" $$srcFiles ; \ if [ -n "$$notSrcFiles" ] ; then \ cp -R --parents $$notSrcFiles "$(REPRODUCERS_BUILD_DIR)/$$dir/" ; \ fi ; \ cd "$(REPRODUCERS_BUILD_DIR)/$$dir/" ; \ if [ -f $(META_MANIFEST) ]; \ then \ $(SYSTEM_JDK_DIR)/bin/jar cfm "$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/$$dir.jar" $(META_MANIFEST) * ; \ else \ $(SYSTEM_JDK_DIR)/bin/jar cf "$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/$$dir.jar" * ; \ fi; \ AN="Application-Name:" ; \ grep $$AN $(META_MANIFEST) 2>/dev/null >/dev/null ; \ GREP_R=$$?; \ if [ ! -f $(META_MANIFEST) -o $$GREP_R -ne 0 ]; \ then \ export TMP_MANIFEST=`mktemp` ; \ echo "$$AN $$dir" > $$TMP_MANIFEST ; \ if which cygpath &> /dev/null ; then \ export TMP_MANIFEST=$$(cygpath -p -m "$$TMP_MANIFEST") ; \ fi ; \ $(SYSTEM_JDK_DIR)/bin/jar ufm "$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/$$dir.jar" $$TMP_MANIFEST ; \ rm -f $$TMP_MANIFEST ; \ fi ; \ cd "$$d" ; \ fi; \ done ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/netx-dist-tests-sign-some-reproducers.stamp: stamps/netx-dist-tests-prepare-reproducers.stamp export keystore=$(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME); \ types=($(SIGNED_REPRODUCERS)) ; \ for which in "$${types[@]}" ; do \ tcaw=$(TEST_CERT_ALIAS)_$$which ; \ $(SYSTEM_JRE_DIR)/bin/keytool -genkey -alias $$tcaw -keystore $$keystore -keypass $(PRIVATE_KEYSTORE_PASS) -storepass $(PRIVATE_KEYSTORE_PASS) -dname "cn=$$tcaw, ou=$$tcaw, o=$$tcaw, c=$$tcaw" ; \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ signedReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${signedReproducers[@]}" ; do \ $(SYSTEM_JDK_DIR)/bin/jarsigner -keystore $$keystore -storepass $(PRIVATE_KEYSTORE_PASS) -keypass $(PRIVATE_KEYSTORE_PASS) "$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/$$dir.jar" $$tcaw ; \ done ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/change-dots-to-paths.stamp: stamps/netx-dist-tests-sign-some-reproducers.stamp pushd $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ types=($(ALL_NONCUSTOM_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ if test "$${dir:0:1}" = "." ; then \ echo "reproducer $$dir starts with dot. It is forbidden" ; \ exit 5; \ fi; \ if test "$${dir:(-1)}" = "." ; then \ echo "reproducer $$dir ends with dot. It is forbidden" ; \ exit 5; \ fi; \ q=`expr index "$$dir" .`; \ r=$$? ; \ if [ $$r = 0 ]; then \ slashed_dir="./$${dir//.//}" ; \ path="`dirname $$slashed_dir`" ; \ file="`basename $$slashed_dir`.jar" ; \ echo "copying $$dir.jar to $$path as $$file" ; \ mkdir --parents $$path ; \ cp $$dir".jar" "$$path"/"$$file" ; \ fi ; \ done ; \ done ; \ popd ; \ mkdir -p stamps && \ touch $@ #this always tries to remove previous testcert #the code is copypasted from netx-dist-tests-remove-cert-from-public, because #with depending to not stamped target we always have to rerun reproducers targets stamps/exported-test-certs.stamp: stamps/change-dots-to-paths.stamp types=($(SIGNED_REPRODUCERS)) ; \ PUBLIC_KEYSTORE=$$XDG_CONFIG_HOME ; \ if test "x$$PUBLIC_KEYSTORE" = x; then \ PUBLIC_KEYSTORE=${HOME}/.config ; \ fi ;\ export PUBLIC_KEYSTORE=$$PUBLIC_KEYSTORE/$(PUBLIC_KEYSTORE_STUB); \ if which cygpath &> /dev/null ; then \ export PUBLIC_KEYSTORE=$$(cygpath -p -m "$$PUBLIC_KEYSTORE") ; \ fi ; \ keystoredir=`dirname $$PUBLIC_KEYSTORE`; \ [ ! -d $$keystoredir ] && mkdir -p $$keystoredir; \ for which in "$${types[@]}" ; do \ $(SYSTEM_JDK_DIR)/bin/keytool -delete -alias $(TEST_CERT_ALIAS)_$$which -keystore $$PUBLIC_KEYSTORE -storepass $(PUBLIC_KEYSTORE_PASS) ; \ done ; types=($(SIGNED_REPRODUCERS)) ; \ for which in "$${types[@]}" ; do \ $(SYSTEM_JDK_DIR)/bin/keytool -export -alias $(TEST_CERT_ALIAS)_$$which -file $(EXPORTED_TEST_CERT_PREFIX)_$$which.$(EXPORTED_TEST_CERT_SUFFIX) -storepass $(PRIVATE_KEYSTORE_PASS) -keystore $(PRIVATE_KEYSTORE_NAME) ; \ done ; mkdir -p stamps && \ touch $@ stamps/netx-dist-tests-import-cert-to-public: stamps/exported-test-certs.stamp types=($(SIGNED_REPRODUCERS)) ; \ PUBLIC_KEYSTORE=$$XDG_CONFIG_HOME ; \ if test "x$$PUBLIC_KEYSTORE" = x; then \ PUBLIC_KEYSTORE=${HOME}/.config ; \ fi ;\ export PUBLIC_KEYSTORE=$$PUBLIC_KEYSTORE/$(PUBLIC_KEYSTORE_STUB); \ if which cygpath &> /dev/null ; then \ export PUBLIC_KEYSTORE=$$(cygpath -p -m "$$PUBLIC_KEYSTORE") ; \ fi ; \ keystoredir=`dirname $$PUBLIC_KEYSTORE`; \ [ ! -d $$keystoredir ] && mkdir -p $$keystoredir; \ for which in "$${types[@]}" ; do \ yes | $(SYSTEM_JDK_DIR)/bin/keytool -import -alias $(TEST_CERT_ALIAS)_$$which -keystore $$PUBLIC_KEYSTORE -storepass $(PUBLIC_KEYSTORE_PASS) -file $(EXPORTED_TEST_CERT_PREFIX)_$$which.$(EXPORTED_TEST_CERT_SUFFIX) ;\ done ; mkdir -p stamps && \ touch $@ netx-dist-tests-remove-cert-from-public: types=($(SIGNED_REPRODUCERS)) ; \ PUBLIC_KEYSTORE=$$XDG_CONFIG_HOME ; \ if test "x$$PUBLIC_KEYSTORE" = x; then \ PUBLIC_KEYSTORE=${HOME}/.config ; \ fi ;\ export PUBLIC_KEYSTORE=$$PUBLIC_KEYSTORE/$(PUBLIC_KEYSTORE_STUB); \ if which cygpath &> /dev/null ; then \ export PUBLIC_KEYSTORE=$$(cygpath -p -m "$$PUBLIC_KEYSTORE") ; \ fi ; \ keystoredir=`dirname $$PUBLIC_KEYSTORE`; \ [ ! -d $$keystoredir ] && mkdir -p $$keystoredir; \ for which in "$${types[@]}" ; do \ $(SYSTEM_JDK_DIR)/bin/keytool -delete -alias $(TEST_CERT_ALIAS)_$$which -keystore $$PUBLIC_KEYSTORE -storepass $(PUBLIC_KEYSTORE_PASS) ; \ done ; -rm -rf stamps/netx-dist-tests-import-cert-to-public test-extensions-source-files.txt: find $(TEST_EXTENSIONS_SRCDIR) -name '*.java' | sort > $@ stamps/test-extensions-compile.stamp: stamps/netx-dist.stamp stamps/plugin.stamp stamps/junit-jnlp-dist-dirs test-extensions-source-files.txt mkdir -p $(TEST_EXTENSIONS_DIR); mkdir -p $(NETX_TEST_DIR); ln -s $(TEST_EXTENSIONS_DIR) $(TEST_EXTENSIONS_COMPATIBILITY_SYMLINK); $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(TEST_EXTENSIONS_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar) \ @test-extensions-source-files.txt && \ mkdir -p stamps && \ touch $@ test-extensions-tests-source-files.txt: for x in $(COMPILE_WHITELIST_FILTER) ; do \ find $(TEST_EXTENSIONS_TESTS_SRCDIR) -name '*.java' | grep $$x | sort > $@ ; \ done stamps/test-extensions-tests-compile.stamp: stamps/junit-jnlp-dist-dirs test-extensions-tests-source-files.txt stamps/test-extensions-compile.stamp mkdir -p $(TEST_EXTENSIONS_TESTS_DIR); for x in `cat $(TOP_BUILD_DIR)/test-extensions-tests-source-files.txt` ; do \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(TEST_EXTENSIONS_TESTS_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(NETX_DIR)/lib/classes.jar $(TEST_EXTENSIONS_DIR)) \ $$x ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/compile-reproducers-testcases.stamp: stamps/netx-dist.stamp stamps/plugin.stamp stamps/junit-jnlp-dist-dirs \ test-extensions-source-files.txt stamps/test-extensions-compile.stamp stamps/test-extensions-tests-compile.stamp types=($(ALL_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ TESTCASEPATH="$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/testcases" ; \ if [ -d "$$TESTCASEPATH" ]; then \ echo "compiling" $$dir ; \ pushd "$$TESTCASEPATH" ; \ REGEX=".*\\.java$$" ; \ JAVAFILES=`find . | grep "$$REGEX"` ; \ NONJAVA_RESOURCES=`find . | grep -v "$$REGEX"` ; \ echo $$JAVAFILES ; \ echo $$NONJAVA_RESOURCES ; \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(TEST_EXTENSIONS_TESTS_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(NETX_DIR)/lib/classes.jar $(TEST_EXTENSIONS_DIR)) $$JAVAFILES ; \ if [ -n "$$NONJAVA_RESOURCES" ]; then \ cp --parents $$NONJAVA_RESOURCES $(TEST_EXTENSIONS_TESTS_DIR)/ ; \ fi ; \ popd ; \ fi ; \ done ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/copy-reproducers-resources.stamp: stamps/junit-jnlp-dist-dirs types=($(ALL_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ cp -R "$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/resources/"* $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/ ; \ done ; \ done ; \ mkdir -p stamps && \ touch $@ $(REPRODUCERS_CLASS_NAMES): whiteListed=$(RUN_WHITELIST_FILTER); \ cd $(TEST_EXTENSIONS_TESTS_DIR) ; \ class_names= ; \ for test in `find -type f` ; do \ class_name=`echo $$test | sed -e 's|\.class$$||' -e 's|^\./||'` ; \ class_name=`echo $$class_name | sed -e 's|/|.|g' ` ; \ INCLUDE="NO" ; \ for x in $$whiteListed ; do \ q=`expr match "$$class_name" "$$x"`; \ r=$$? ; \ if [ $$r = 0 ]; then \ echo "$$class_name will be included in reproducers testcases because of $$x pattern in $(REPRODUCERS_CLASS_WHITELIST). Matching was $$q"; \ INCLUDE="YES" ; \ fi; \ done; \ if [ "$$INCLUDE" = "YES" ]; then \ class_names="$$class_names $$class_name" ; \ else \ echo "$$class_name had no match in $(REPRODUCERS_CLASS_WHITELIST). Excluding"; \ fi; \ done ; \ echo $$class_names > $(REPRODUCERS_CLASS_NAMES) stamps/run-netx-dist-tests.stamp: stamps/netx-dist.stamp stamps/plugin.stamp stamps/docs.stamp \ $(LAUNCHERS) $(DESKTOP_FILES) \ stamps/netx.stamp stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp\ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) $(REPRODUCERS_CLASS_NAMES) stamps/process-custom-reproducers.stamp cd $(TEST_EXTENSIONS_DIR) ; \ class_names=`cat $(REPRODUCERS_CLASS_NAMES)` ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_TESTS_DIR) $(TEST_EXTENSIONS_SRCDIR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(REPRODUCERS_DPARAMETERS) \ -Xbootclasspath/a:$$CLASSPATH CommandLine $$class_names @WITH_XSLTPROC_TRUE@ -$(XSLTPROC) --stringparam logs logs_reproducers.html $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/jreport.xsl $(TEST_EXTENSIONS_DIR)/tests-output.xml > $(TESTS_DIR)/index_reproducers.html @WITH_XSLTPROC_TRUE@ -$(XSLTPROC) $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/logs.xsl $(TEST_EXTENSIONS_DIR)/ServerAccess-logs.xml > $(TESTS_DIR)/logs_reproducers.html @WITH_XSLTPROC_TRUE@ -$(XSLTPROC) $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/textreport.xsl $(TEST_EXTENSIONS_DIR)/tests-output.xml > $(TESTS_DIR)/summary_reproducers.txt touch $@ stamps/process-custom-reproducers.stamp: stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp\ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) $(REPRODUCERS_CLASS_NAMES) . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ customReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-custom.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${customReproducers[@]}" ; do \ pushd $(REPRODUCERS_TESTS_SRCDIR)/$(CUSTOM_REPRODUCERS)/$$dir/srcs; \ $(MAKE) prepare-reproducer ; \ popd ; \ done ; \ mkdir -p stamps && \ touch $@ clean-custom-reproducers: junit-jnlp-dist-custom.txt . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ customReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-custom.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${customReproducers[@]}" ; do \ pushd $(REPRODUCERS_TESTS_SRCDIR)/custom/$$dir/srcs; \ $(MAKE) clean-reproducer ; \ popd ; \ done ; \ rm -f stamps/process-custom-reproducers.stamp #for global-links you must be root, for opera there do not exists user-links #although this targets will indeed create symbolic links to enable #icedtea-web plugin inside browser it is intended for testing purposes @ENABLE_NATIVE_PLUGIN_TRUE@stamps/user-links.stamp: stamps/netx-dist.stamp stamps/plugin.stamp \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(LAUNCHERS) stamps/netx.stamp $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) @ENABLE_NATIVE_PLUGIN_TRUE@ if [ $(MOZILLA_FAMILY_TEST) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ mv -f $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) $(MOZILLA_LOCAL_BACKUP_FILE) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) backed up as $(MOZILLA_LOCAL_BACKUP_FILE)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ else \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) doesn't exists, nothing to be backed up to $(MOZILLA_LOCAL_BACKUP_FILE)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ pushd $(MOZILLA_LOCAL_PLUGINDIR) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ ln -s $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) $(PLUGIN_LINK_NAME) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) linked as $$PWD/$(PLUGIN_LINK_NAME)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ popd ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ touch $@ @ENABLE_NATIVE_PLUGIN_TRUE@restore-user-links: @ENABLE_NATIVE_PLUGIN_TRUE@ if [ $(MOZILLA_FAMILY_TEST) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e $(MOZILLA_LOCAL_BACKUP_FILE) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ mv -f $(MOZILLA_LOCAL_BACKUP_FILE) $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(MOZILLA_LOCAL_BACKUP_FILE) restored as $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ else \ @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(MOZILLA_LOCAL_BACKUP_FILE) do not exists, nothing to be restored. $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) removed" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e stamps/user-links.stamp ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f stamps/user-links.stamp ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi @ENABLE_NATIVE_PLUGIN_TRUE@stamps/global-links.stamp: stamps/netx-dist.stamp stamps/plugin.stamp $(LAUNCHERS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ stamps/netx.stamp $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) @ENABLE_NATIVE_PLUGIN_TRUE@ if [ $(MOZILLA_FAMILY_TEST) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ dir="$(MOZILLA_GLOBAL32_PLUGINDIR)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ arch=`arch` ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ "$$arch" = "x86_64" ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ dir="$(MOZILLA_GLOBAL64_PLUGINDIR)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e "$$dir"/$(PLUGIN_LINK_NAME) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ mv -f "$$dir"/$(PLUGIN_LINK_NAME) $(MOZILLA_GLOBAL_BACKUP_FILE) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$$dir/$(PLUGIN_LINK_NAME) backed up as $(MOZILLA_GLOBAL_BACKUP_FILE)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ else \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$$dir/$(PLUGIN_LINK_NAME) do not exists, nothing to be backed up to $(MOZILLA_GLOBAL_BACKUP_FILE)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ pushd "$$dir" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ ln -s $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) $(PLUGIN_LINK_NAME) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) linked as $$PWD/$(PLUGIN_LINK_NAME)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ popd ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; @ENABLE_NATIVE_PLUGIN_TRUE@ if [ "$(OPERA)" != "" ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ dir="$(OPERA_GLOBAL32_PLUGINDIR)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ arch=`arch` ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ "$$arch" = "x86_64" ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ dir="$(OPERA_GLOBAL64_PLUGINDIR)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e "$$dir"/$(PLUGIN_LINK_NAME) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ mv -f "$$dir"/$(PLUGIN_LINK_NAME) $(OPERA_GLOBAL_BACKUP_FILE) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$$dir/$(PLUGIN_LINK_NAME) backed up as $(OPERA_GLOBAL_BACKUP_FILE) "; \ @ENABLE_NATIVE_PLUGIN_TRUE@ else \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$$dir/$(PLUGIN_LINK_NAME) do not exists, nothing to be backed up to $(OPERA_GLOBAL_BACKUP_FILE) "; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ pushd "$$dir" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ ln -s $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) $(PLUGIN_LINK_NAME) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) linked as $$PWD/$(PLUGIN_LINK_NAME)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ popd ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ touch $@ @ENABLE_NATIVE_PLUGIN_TRUE@restore-global-links: @ENABLE_NATIVE_PLUGIN_TRUE@ if [ $(MOZILLA_FAMILY_TEST) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ dir="$(MOZILLA_GLOBAL32_PLUGINDIR)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ arch=`arch` ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ "$$arch" = "x86_64" ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ dir="$(MOZILLA_GLOBAL64_PLUGINDIR)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e $(MOZILLA_GLOBAL_BACKUP_FILE) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ mv -f $(MOZILLA_GLOBAL_BACKUP_FILE) "$$dir"/$(PLUGIN_LINK_NAME) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(MOZILLA_GLOBAL_BACKUP_FILE) restored as $$dir/$(PLUGIN_LINK_NAME)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ else \ @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f "$$dir"/$(PLUGIN_LINK_NAME) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(MOZILLA_GLOBAL_BACKUP_FILE) do not exists, nothing to be restored. $$dir/$(PLUGIN_LINK_NAME) removed" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; @ENABLE_NATIVE_PLUGIN_TRUE@ if [ "$(OPERA)" != "" ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ dir="$(OPERA_GLOBAL32_PLUGINDIR)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ arch=`arch` ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ "$$arch" = "x86_64" ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ dir="$(OPERA_GLOBAL64_PLUGINDIR)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e $(OPERA_GLOBAL_BACKUP_FILE) ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ mv -f $(OPERA_GLOBAL_BACKUP_FILE) "$$dir"/$(PLUGIN_LINK_NAME) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(OPERA_GLOBAL_BACKUP_FILE) restored as $$dir/$(PLUGIN_LINK_NAME)" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ else \ @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f "$$dir"/$(PLUGIN_LINK_NAME) ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ echo "$(OPERA_GLOBAL_BACKUP_FILE) do not exist, nothing to be restored. $$dir/$(PLUGIN_LINK_NAME) removed" ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi ; @ENABLE_NATIVE_PLUGIN_TRUE@ if [ -e stamps/global-links.stamp ] ; then \ @ENABLE_NATIVE_PLUGIN_TRUE@ rm -f stamps/global-links.stamp ; \ @ENABLE_NATIVE_PLUGIN_TRUE@ fi netx-unit-tests-source-files.txt: find $(NETX_UNIT_TEST_SRCDIR) -name '*.java' | sort > $@ stamps/netx-unit-tests-compile.stamp: stamps/netx.stamp \ netx-unit-tests-source-files.txt stamps/test-extensions-compile.stamp mkdir -p $(NETX_UNIT_TEST_DIR) && \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(NETX_UNIT_TEST_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(NETX_DIR)/lib/classes.jar $(MSLINKS_JAR) $(TEST_EXTENSIONS_DIR) $(TAGSOUP_JAR)) \ @netx-unit-tests-source-files.txt && \ mkdir -p stamps && \ touch $@ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME): mkdir $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) cp $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/*.css $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME)/ cp $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/*.js $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME)/ $(UNIT_CLASS_NAMES): cd $(NETX_UNIT_TEST_DIR) ; \ class_names= ; \ for test in `find -type f` ; do \ class_name=`echo $$test | sed -e 's|\.class$$||' -e 's|^\./||'` ; \ class_name=`echo $$class_name | sed -e 's|/|.|g' ` ; \ class_names="$$class_names $$class_name" ; \ done ; \ echo $$class_names > $(UNIT_CLASS_NAMES); stamps/run-netx-unit-tests.stamp: stamps/netx-unit-tests-compile.stamp $(JUNIT_RUNNER_JAR) \ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) $(UNIT_CLASS_NAMES) filename=" " ; \ cd $(NETX_UNIT_TEST_SRCDIR) ; \ for file in `find . -type f \! -iname "*.java"`; do\ filename=`echo $$file `; \ cp --parents $$filename $(NETX_UNIT_TEST_DIR) ; \ done ; \ cd $(NETX_UNIT_TEST_DIR) ; \ class_names=`cat $(UNIT_CLASS_NAMES)` ; \ CLASSPATH="$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(JUNIT_RUNTIME) $(MSLINKS_JAR) $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) . $(TEST_EXTENSIONS_SRCDIR) $(TAGSOUP_JAR))" ; \ $(SYSTEM_JRE_DIR)/bin/java "-Xbootclasspath/a:$$CLASSPATH" CommandLine $$class_names @WITH_XSLTPROC_TRUE@ -$(XSLTPROC) --stringparam logs logs_unit.html $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/jreport.xsl $(NETX_UNIT_TEST_DIR)/tests-output.xml > $(TESTS_DIR)/index_unit.html @WITH_XSLTPROC_TRUE@ -$(XSLTPROC) $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/logs.xsl $(NETX_UNIT_TEST_DIR)/ServerAccess-logs.xml > $(TESTS_DIR)/logs_unit.html @WITH_XSLTPROC_TRUE@ -$(XSLTPROC) $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/textreport.xsl $(NETX_UNIT_TEST_DIR)/tests-output.xml > $(TESTS_DIR)/summary_unit.txt mkdir -p stamps && \ touch $@ stamps/compile-jacoco-operator.stamp: jacoco-operator-source-files.txt @WITH_JACOCO_TRUE@ mkdir -p $(JACOCO_OPERATOR_DIR) && \ @WITH_JACOCO_TRUE@ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ @WITH_JACOCO_TRUE@ -d $(JACOCO_OPERATOR_DIR) \ @WITH_JACOCO_TRUE@ $(call composeclasspath, $(JACOCO_CLASSPATH)) \ @WITH_JACOCO_TRUE@ @jacoco-operator-source-files.txt ; @WITH_JACOCO_FALSE@ echo "Sorry, jacoco coverage report generator cant be compiled without jacoco installed. Try installing jacoco or specify with-jacoco value" ; @WITH_JACOCO_FALSE@ exit 5 touch $@ #warning, during this target tests.build/netx/unit/tests-output.xml is backup and rewriten (but not coresponding html file) #xml results run with jacoco agent however, can be wrong, co the new tests-output.xml is then renamed and orginal one restored stamps/run-unit-test-code-coverage-jacoco.stamp: stamps/netx-unit-tests-compile.stamp $(JUNIT_RUNNER_JAR) \ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) $(UNIT_CLASS_NAMES) stamps/compile-jacoco-operator.stamp @WITH_JACOCO_TRUE@ filename=" " ; \ @WITH_JACOCO_TRUE@ cd $(NETX_UNIT_TEST_SRCDIR) ; \ @WITH_JACOCO_TRUE@ for file in `find . -type f \! -iname "*.java"`; do\ @WITH_JACOCO_TRUE@ filename=`echo $$file `; \ @WITH_JACOCO_TRUE@ cp --parents $$filename $(NETX_UNIT_TEST_DIR) ; \ @WITH_JACOCO_TRUE@ done ; \ @WITH_JACOCO_TRUE@ cd $(NETX_UNIT_TEST_DIR) ; \ @WITH_JACOCO_TRUE@ for file in $(COVERAGE_MODIFIED_FILES) ; do \ @WITH_JACOCO_TRUE@ mv $(NETX_UNIT_TEST_DIR)/$$file $(NETX_UNIT_TEST_DIR)/"$$file""$(EMMA_BACKUP_SUFFIX)" ; \ @WITH_JACOCO_TRUE@ done ;\ @WITH_JACOCO_TRUE@ class_names=`cat $(UNIT_CLASS_NAMES)` ; \ @WITH_JACOCO_TRUE@ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) $(JACOCO_CLASSPATH) . $(TEST_EXTENSIONS_SRCDIR) $(MSLINKS_JAR) $(TAGSOUP_JAR)) ; \ @WITH_JACOCO_TRUE@ $(SYSTEM_JRE_DIR)/bin/java $(JACOCO_AGENT_SWITCH) -Xbootclasspath/a:$$CLASSPATH CommandLine $$class_names ; \ @WITH_JACOCO_TRUE@ for file in $(COVERAGE_MODIFIED_FILES) ; do \ @WITH_JACOCO_TRUE@ mv $(NETX_UNIT_TEST_DIR)/$$file $(NETX_UNIT_TEST_DIR)/"$$file""$(EMMA_SUFFIX)" ; \ @WITH_JACOCO_TRUE@ mv $(NETX_UNIT_TEST_DIR)/"$$file""$(EMMA_BACKUP_SUFFIX)" $(NETX_UNIT_TEST_DIR)/$$file ; \ @WITH_JACOCO_TRUE@ done ; \ @WITH_JACOCO_TRUE@ $(JACOCO_OPERATOR_EXEC) \ @WITH_JACOCO_TRUE@ report --die-soon --html-output coverage --xml-output coverage.xml --input-file jacoco.exec \ @WITH_JACOCO_TRUE@ --input-srcs $(NETX_SRCDIR) $(PLUGIN_SRCDIR)/java $(NETX_UNIT_TEST_SRCDIR) $(JUNIT_RUNNER_SRCDIR) $(TEST_EXTENSIONS_SRCDIR) \ @WITH_JACOCO_TRUE@ --input-builds $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(NETX_UNIT_TEST_DIR) $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) \ @WITH_JACOCO_TRUE@ --title "IcedTea-Web unit-tests codecoverage" ; @WITH_JACOCO_FALSE@ echo "Sorry, coverage report cant be run without jacoco installed. Try installing jacoco or specify with-jacoco value" ; @WITH_JACOCO_FALSE@ exit 5 touch $@ $(COVERABLE_PLUGIN_DIR): mkdir -p $(COVERABLE_PLUGIN_DIR); $(COVERABLE_PLUGIN_DIR)/%.o: $(PLUGIN_SRCDIR)/%.cc cd $(COVERABLE_PLUGIN_DIR) && \ $(CXX) $(CXXFLAGS) \ $(DEFS) $(VERSION_DEFS) \ -DJDK_UPDATE_VERSION="\"$(JDK_UPDATE_VERSION)\"" \ -DPLUGIN_NAME="\"IcedTea-Web Plugin with jacoco coverage agent\"" \ -DJAVAWS_BIN="\"$(bindir)/$(JAVAWS)\"" \ -DJAVAWS_NAME="\"$(javaws)\"" \ -DPLUGIN_VERSION="\"$(PLUGIN_VERSION)\"" \ -DPACKAGE_URL="\"$(PACKAGE_URL)\"" \ -DMOZILLA_VERSION_COLLAPSED="$(MOZILLA_VERSION_COLLAPSED)" \ -DICEDTEA_WEB_JRE="\"$(SYSTEM_JRE_DIR)\"" \ -DPLUGIN_BOOTCLASSPATH=$(PLUGIN_COVERAGE_BOOTCLASSPATH) \ -DCOVERAGE_AGENT=$(JACOCO_AGENT_PLUGIN_SWITCH) \ -DNETX_JAR="\"$(NETX_JAR)\"" \ -DPLUGIN_JAR="\"$(PLUGIN_JAR)\"" \ -DJSOBJECT_JAR="\"$(JSOBJECT_JAR)\""\ $(GLIB_CFLAGS) \ $(MOZILLA_CFLAGS) \ -fvisibility=hidden \ -fPIC -o $@ -c $< $(COVERABLE_PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY): $(addprefix $(COVERABLE_PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) cd $(COVERABLE_PLUGIN_DIR) && \ $(CXX) $(CXXFLAGS) \ $(PLUGIN_OBJECTS) \ $(GLIB_LIBS) \ $(MOZILLA_LIBS) \ -shared -o $@ stamps/build-fake-plugin.stamp: $(COVERABLE_PLUGIN_DIR) $(addprefix $(PLUGIN_SRCDIR)/,$(PLUGIN_SRC)) $(addprefix $(COVERABLE_PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) stamps/liveconnect-dist.stamp $(COVERABLE_PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) touch $@ #warning, during this target tests.build/netx/jnlp_testsengine/tests-output.xml is backup and rewriten (but not coresponding html file) #xml results run with jacoco agent, however, can be wrong, co the new tests-output.xml is then renamed and orginal one restored stamps/run-reproducers-test-code-coverage-jacoco.stamp: stamps/run-netx-dist-tests.stamp $(REPRODUCERS_CLASS_NAMES) \ stamps/compile-jacoco-operator.stamp stamps/build-fake-plugin.stamp @WITH_JACOCO_TRUE@ cd $(TESTS_DIR) ; \ @WITH_JACOCO_TRUE@ for file in $(COVERAGE_MODIFIED_FILES) ; do \ @WITH_JACOCO_TRUE@ mv $(TEST_EXTENSIONS_DIR)/$$file $(TEST_EXTENSIONS_DIR)/"$$file""$(EMMA_BACKUP_SUFFIX)" ; \ @WITH_JACOCO_TRUE@ done ;\ @WITH_JACOCO_TRUE@ echo "backuping $(JAVAWS) in $(DESTDIR)$(bindir)" ; \ @WITH_JACOCO_TRUE@ javaws_backup=$(DESTDIR)$(bindir)/javaws_backup ; \ @WITH_JACOCO_TRUE@ mv $(DESTDIR)$(bindir)/$(JAVAWS) $$javaws_backup ; \ @WITH_JACOCO_TRUE@ echo "patching $(JAVAWS)" ; \ @WITH_JACOCO_TRUE@ nw_bootclasspath="-Xbootclasspath/a:$(UNIFIED_JACOCO_CLASSPATH)" ; \ @WITH_JACOCO_TRUE@ cat $$javaws_backup | sed "s|COMMAND.k.=\"..JAVA.\"|COMMAND[k]=\"\\$$\\{JAVA\\}\" ; k=1 ; COMMAND[k]=$(JACOCO_AGENT_JAVAWS_SWITCH)|" | sed "s,$(LAUNCHER_BOOTCLASSPATH),$$nw_bootclasspath," > $(DESTDIR)$(bindir)/$(JAVAWS) ; \ @WITH_JACOCO_TRUE@ chmod 777 $(DESTDIR)$(bindir)/$(JAVAWS) ; \ @WITH_JACOCO_TRUE@ echo "backuping plugin in $(DESTDIR)/$(libdir)$(BUILT_PLUGIN_LIBRARY)" ; \ @WITH_JACOCO_TRUE@ plugin_backup=$(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY)_backup ; \ @WITH_JACOCO_TRUE@ mv $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) $$plugin_backup ; \ @WITH_JACOCO_TRUE@ echo "fakeing plugin" ; \ @WITH_JACOCO_TRUE@ cp $(COVERABLE_PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) ; \ @WITH_JACOCO_TRUE@ testcases_srcs=( ) ; \ @WITH_JACOCO_TRUE@ k=0 ; \ @WITH_JACOCO_TRUE@ types=($(ALL_REPRODUCERS)); \ @WITH_JACOCO_TRUE@ for which in "$${types[@]}" ; do \ @WITH_JACOCO_TRUE@ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ @WITH_JACOCO_TRUE@ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ @WITH_JACOCO_TRUE@ IFS="$$IFS_BACKUP" ; \ @WITH_JACOCO_TRUE@ for dir in "$${simpleReproducers[@]}" ; do \ @WITH_JACOCO_TRUE@ testcases_srcs[k]="$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/testcases/" ; \ @WITH_JACOCO_TRUE@ k=$$((k+1)) ; \ @WITH_JACOCO_TRUE@ done ; \ @WITH_JACOCO_TRUE@ done ; \ @WITH_JACOCO_TRUE@ cd $(TEST_EXTENSIONS_DIR) ; \ @WITH_JACOCO_TRUE@ class_names=`cat $(REPRODUCERS_CLASS_NAMES)` ; \ @WITH_JACOCO_TRUE@ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_DIR) $(JACOCO_CLASSPATH) $(TEST_EXTENSIONS_TESTS_DIR) $(TEST_EXTENSIONS_SRCDIR)) ; \ @WITH_JACOCO_TRUE@ $(SYSTEM_JRE_DIR)/bin/java $(JACOCO_AGENT_SWITCH) $(REPRODUCERS_DPARAMETERS) \ @WITH_JACOCO_TRUE@ -Xbootclasspath/a:$$CLASSPATH CommandLine $$class_names ; \ @WITH_JACOCO_TRUE@ if [ -f $(JACOCO_JAVAWS_RESULTS) ] ; then \ @WITH_JACOCO_TRUE@ jacoco_javaws_results=$(JACOCO_JAVAWS_RESULTS) ; \ @WITH_JACOCO_TRUE@ $(JACOCO_OPERATOR_EXEC) \ @WITH_JACOCO_TRUE@ report --die-soon --html-output coverage-javaws --xml-output coverage-javaws.xml --input-file $(JACOCO_JAVAWS_RESULTS) \ @WITH_JACOCO_TRUE@ --input-srcs $(NETX_SRCDIR) \ @WITH_JACOCO_TRUE@ --input-builds $(NETX_DIR)/lib/classes.jar \ @WITH_JACOCO_TRUE@ --title "IcedTea-Web javaws reproducers codecoverage" ; \ @WITH_JACOCO_TRUE@ fi; \ @WITH_JACOCO_TRUE@ if [ -f $(JACOCO_PLUGIN_RESULTS) ] ; then \ @WITH_JACOCO_TRUE@ jacoco_plugin_results=$(JACOCO_PLUGIN_RESULTS) ; \ @WITH_JACOCO_TRUE@ $(JACOCO_OPERATOR_EXEC) \ @WITH_JACOCO_TRUE@ report --die-soon --html-output coverage-plugin --xml-output coverage-plugin.xml --input-file $(JACOCO_PLUGIN_RESULTS) \ @WITH_JACOCO_TRUE@ --input-srcs $(NETX_SRCDIR) $(PLUGIN_SRCDIR)/java \ @WITH_JACOCO_TRUE@ --input-builds $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar \ @WITH_JACOCO_TRUE@ --title "IcedTea-Web plugin reproducers codecoverage" ; \ @WITH_JACOCO_TRUE@ fi; \ @WITH_JACOCO_TRUE@ $(JACOCO_OPERATOR_EXEC) \ @WITH_JACOCO_TRUE@ merge --die-soon --input-files jacoco.exec $$jacoco_javaws_results $$jacoco_plugin_results --output-file jacoco-merged-reproducers.exec ; \ @WITH_JACOCO_TRUE@ $(JACOCO_OPERATOR_EXEC) \ @WITH_JACOCO_TRUE@ report --html-output coverage --xml-output coverage.xml --input-file jacoco-merged-reproducers.exec \ @WITH_JACOCO_TRUE@ --input-srcs $(NETX_SRCDIR) $(PLUGIN_SRCDIR)/java $(JUNIT_RUNNER_SRCDIR) $(TEST_EXTENSIONS_SRCDIR) $(TEST_EXTENSIONS_TESTS_SRCDIR) "$${testcases_srcs[@]}" \ @WITH_JACOCO_TRUE@ --input-builds $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) $(TEST_EXTENSIONS_TESTS_DIR) \ @WITH_JACOCO_TRUE@ --title "IcedTea-Web reproducers-tests codecoverage" ; \ @WITH_JACOCO_TRUE@ echo "restoring $(JAVAWS) in $(DESTDIR)$(bindir)" ; \ @WITH_JACOCO_TRUE@ rm -f $(DESTDIR)$(bindir)/$(javaws); \ @WITH_JACOCO_TRUE@ mv $$javaws_backup $(DESTDIR)$(bindir)/$(JAVAWS); \ @WITH_JACOCO_TRUE@ echo "restoring plugin in $(DESTDIR)/$(libdir)$(BUILT_PLUGIN_LIBRARY)" ; \ @WITH_JACOCO_TRUE@ mv $$plugin_backup $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) ; \ @WITH_JACOCO_TRUE@ for file in $(COVERAGE_MODIFIED_FILES) ; do \ @WITH_JACOCO_TRUE@ mv $(TEST_EXTENSIONS_DIR)/$$file $(TEST_EXTENSIONS_DIR)/"$$file""$(EMMA_SUFFIX)" ; \ @WITH_JACOCO_TRUE@ mv $(TEST_EXTENSIONS_DIR)/"$$file""$(EMMA_BACKUP_SUFFIX)" $(TEST_EXTENSIONS_DIR)/$$file ; \ @WITH_JACOCO_TRUE@ done ; @WITH_JACOCO_FALSE@ echo "Sorry, coverage report cant be run without jacoco installed. Try installing jacoco or specify with-jacoco value" ; @WITH_JACOCO_FALSE@ exit 5 touch $@ run-test-code-coverage-jacoco: stamps/run-unit-test-code-coverage-jacoco.stamp stamps/run-reproducers-test-code-coverage-jacoco.stamp @WITH_JACOCO_TRUE@ cd $(TESTS_DIR) ; \ @WITH_JACOCO_TRUE@ k=0 ; \ @WITH_JACOCO_TRUE@ types=($(ALL_REPRODUCERS)); \ @WITH_JACOCO_TRUE@ for which in "$${types[@]}" ; do \ @WITH_JACOCO_TRUE@ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ @WITH_JACOCO_TRUE@ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ @WITH_JACOCO_TRUE@ IFS="$$IFS_BACKUP" ; \ @WITH_JACOCO_TRUE@ for dir in "$${simpleReproducers[@]}" ; do \ @WITH_JACOCO_TRUE@ testcases_srcs[k]="$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/testcases/" ; \ @WITH_JACOCO_TRUE@ k=$$((k+1)) ; \ @WITH_JACOCO_TRUE@ done ; \ @WITH_JACOCO_TRUE@ done ; \ @WITH_JACOCO_TRUE@ class_names=`cat $(REPRODUCERS_CLASS_NAMES)` ; \ @WITH_JACOCO_TRUE@ $(JACOCO_OPERATOR_EXEC) \ @WITH_JACOCO_TRUE@ merge --die-soon --input-files $(TEST_EXTENSIONS_DIR)/jacoco-merged-reproducers.exec $(NETX_UNIT_TEST_DIR)/jacoco.exec --output-file jacoco-merged.exec; \ @WITH_JACOCO_TRUE@ $(JACOCO_OPERATOR_EXEC) \ @WITH_JACOCO_TRUE@ report --html-output coverage --xml-output coverage.xml --input-file jacoco-merged.exec \ @WITH_JACOCO_TRUE@ --input-srcs $(NETX_SRCDIR) $(PLUGIN_SRCDIR)/java $(JUNIT_RUNNER_SRCDIR) $(TEST_EXTENSIONS_SRCDIR) $(TEST_EXTENSIONS_TESTS_SRCDIR) "$${testcases_srcs[@]}" \ @WITH_JACOCO_TRUE@ --input-builds $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) $(TEST_EXTENSIONS_TESTS_DIR) \ @WITH_JACOCO_TRUE@ --input-srcs $(NETX_UNIT_TEST_SRCDIR) \ @WITH_JACOCO_TRUE@ --input-builds $(NETX_UNIT_TEST_DIR) \ @WITH_JACOCO_TRUE@ --title "IcedTea-Web complete codecoverage" ; @WITH_JACOCO_FALSE@ echo "Sorry, coverage report cant be run without jacoco installed. Try installing jacoco or specify with-jacoco value" ; @WITH_JACOCO_FALSE@ exit 5 run-test-server-on-44321: stamps/netx.stamp stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp cd $(TEST_EXTENSIONS_DIR) ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_TESTS_DIR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(REPRODUCERS_DPARAMETERS) \ -Xbootclasspath/a:$$CLASSPATH net.sourceforge.jnlp.ServerAccess run-test-server-on-random-port: stamps/netx.stamp stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp cd $(TEST_EXTENSIONS_DIR) ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_TESTS_DIR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(REPRODUCERS_DPARAMETERS) \ -Xbootclasspath/a:$$CLASSPATH net.sourceforge.jnlp.ServerAccess randomport run-test-server-on-itwtestsport: stamps/netx.stamp stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp cd $(TEST_EXTENSIONS_DIR) ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_TESTS_DIR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(REPRODUCERS_DPARAMETERS) \ -Xbootclasspath/a:$$CLASSPATH net.sourceforge.jnlp.ServerAccess $$ITWTESTSPORT clean-netx-tests: clean-netx-unit-tests clean-junit-runner clean-netx-dist-tests clean-test-code-coverage-jacoco if [ -e $(TESTS_DIR)/netx ]; then \ rmdir $(TESTS_DIR)/netx ; \ fi clean-junit-runner: rm -f junit-runner-source-files.txt rm -rf $(JUNIT_RUNNER_DIR) rm -f $(JUNIT_RUNNER_JAR) clean-netx-unit-tests: clean_tests_reports rm -f netx-unit-tests-source-files.txt rm -rf $(NETX_UNIT_TEST_DIR) rm -f $(UNIT_CLASS_NAMES) rm -f stamps/check-pac-functions.stamp rm -f stamps/run-netx-unit-tests.stamp rm -f stamps/netx-unit-tests-compile.stamp clean_tests_reports: rm -rf $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME)/ rm -f $(TESTS_DIR)/*.html rm -f $(TESTS_DIR)/summary_unit.txt rm -f $(TESTS_DIR)/summary_reproducers.txt clean-netx-dist-tests: clean_tests_reports netx-dist-tests-remove-cert-from-public clean-custom-reproducers rm -f test-extensions-source-files.txt rm -f test-extensions-tests-source-files.txt rm -f $(TEST_EXTENSIONS_COMPATIBILITY_SYMLINK) rm -rf $(TEST_EXTENSIONS_TESTS_DIR) rm -rf $(REPRODUCERS_BUILD_DIR) rm -rf $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) rm -rf $(TEST_EXTENSIONS_DIR) rm -f stamps/junit-jnlp-dist-dirs rm -f stamps/test-extensions-compile.stamp rm -f stamps/test-extensions-tests-compile.stamp rm -f stamps/netx-dist-tests-prepare-reproducers.stamp rm -f stamps/compile-reproducers-testcases.stamp rm -f stamps/copy-reproducers-resources.stamp rm -f stamps/netx-dist-tests-sign-some-reproducers.stamp rm -f stamps/change-dots-to-paths.stamp rm -f junit-jnlp-dist-simple.txt rm -f junit-jnlp-dist-custom.txt rm -f netx-dist-tests-tests-source-files.txt types=($(SIGNED_REPRODUCERS)) ; \ for which in "$${types[@]}" ; do \ rm -f junit-jnlp-dist-$$which.txt ; \ rm -f $(EXPORTED_TEST_CERT_PREFIX)_$$which.$(EXPORTED_TEST_CERT_SUFFIX) ; \ done ; rm -f stamps/exported-test-certs.stamp rm -f stamps/junit-jnlp-dist-signed.stamp rm -f $(REPRODUCERS_CLASS_NAMES) rm -f $(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME) rm -f stamps/run-netx-dist-tests.stamp clean-unit-test-code-coverage-jacoco: if [ -e stamps/run-unit-test-code-coverage-jacoco.stamp ]; then \ rm -rf $(NETX_UNIT_TEST_DIR)/coverage ; \ rm -f $(NETX_UNIT_TEST_DIR)/coverage.xml ; \ rm -f $(NETX_UNIT_TEST_DIR)/jacoco.exec ; \ rm -f $(NETX_UNIT_TEST_DIR)/tests-output_withEmma.xml ; \ rm -f stamps/run-unit-test-code-coverage-jacoco.stamp ; \ fi clean-reproducers-test-code-coverage-jacoco: if [ -e stamps/run-reproducers-test-code-coverage-jacoco.stamp ]; then \ rm -rf $(TEST_EXTENSIONS_DIR)/coverage-javaws ; \ rm -f $(TEST_EXTENSIONS_DIR)/coverage-javaws.xml ; \ rm -f $(TEST_EXTENSIONS_DIR)/jacoco_javaws.exec ; \ rm -rf $(TEST_EXTENSIONS_DIR)/coverage-plugin ; \ rm -f $(TEST_EXTENSIONS_DIR)/coverage-plugin.xml ; \ rm -f $(TEST_EXTENSIONS_DIR)/jacoco_plugin.exec ; \ rm -rf $(TEST_EXTENSIONS_DIR)/coverage ; \ rm -f $(TEST_EXTENSIONS_DIR)/coverage.xml ; \ rm -f $(TEST_EXTENSIONS_DIR)/jacoco-merged-reproducers.exec ; \ rm -f $(TEST_EXTENSIONS_DIR)/tests-output_withEmma.xml ; \ rm -f stamps/run-reproducers-test-code-coverage-jacoco.stamp ; \ fi clean-test-code-coverage-jacoco: clean-unit-test-code-coverage-jacoco clean-reproducers-test-code-coverage-jacoco clean-test-code-coverage-tools-jacoco if [ -e $(TESTS_DIR)/coverage.xml ]; then \ rm -rf $(TESTS_DIR)/coverage ; \ rm -f $(TESTS_DIR)/jacoco-merged.exec; \ fi clean-test-code-coverage-tools-jacoco: rm -rf $(JACOCO_OPERATOR_DIR) rm -rf $(COVERABLE_PLUGIN_DIR) rm -f stamps/compile-jacoco-operator.stamp; rm -f jacoco-operator-source-files.txt rm -f stamps/build-fake-plugin.stamp # plugin tests @ENABLE_NATIVE_PLUGIN_TRUE@stamps/plugin-tests.stamp: $(PLUGIN_TEST_SRCS) stamps/plugin.stamp @ENABLE_NATIVE_PLUGIN_TRUE@ mkdir -p plugin/tests/LiveConnect @ENABLE_NATIVE_PLUGIN_TRUE@ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ @ENABLE_NATIVE_PLUGIN_TRUE@ -d plugin/tests/LiveConnect \ @ENABLE_NATIVE_PLUGIN_TRUE@ -classpath liveconnect/lib/classes.jar \ @ENABLE_NATIVE_PLUGIN_TRUE@ $(PLUGIN_TEST_SRCS) ; @ENABLE_NATIVE_PLUGIN_TRUE@ $(SYSTEM_JDK_DIR)/bin/jar cf plugin/tests/LiveConnect/PluginTest.jar \ @ENABLE_NATIVE_PLUGIN_TRUE@ plugin/tests/LiveConnect/*.class ; @ENABLE_NATIVE_PLUGIN_TRUE@ cp -pPR $(SRC_DIR_LINK) $(TOP_SRC_DIR)/plugin/tests/LiveConnect/*.{js,html} \ @ENABLE_NATIVE_PLUGIN_TRUE@ plugin/tests/LiveConnect ; @ENABLE_NATIVE_PLUGIN_TRUE@ echo "Done. Now launch \"firefox file://`pwd`/index.html\"" ; @ENABLE_NATIVE_PLUGIN_TRUE@ mkdir -p stamps @ENABLE_NATIVE_PLUGIN_TRUE@ touch stamps/plugin-tests.stamp printvarsfile: $(MAKE) printvars > $@ printvars: $(foreach v, $(.VARIABLES), $(info $(v)=$($(v)))) # Target Aliases # =============== add-netx: stamps/add-netx.stamp add-netx-debug: stamps/add-netx-debug.stamp netx: stamps/netx.stamp netx-dist: stamps/netx-dist.stamp plugin: stamps/plugin.stamp plugin-tests: stamps/plugin-tests.stamp check-pac-functions: stamps/check-pac-functions.stamp run-netx-unit-tests: stamps/run-netx-unit-tests.stamp links: stamps/global-links.stamp user-links: stamps/user-links.stamp run-netx-dist-tests: stamps/run-netx-dist-tests.stamp run-unit-test-code-coverage-jacoco: stamps/run-unit-test-code-coverage-jacoco.stamp run-reproducers-test-code-coverage-jacoco: stamps/run-reproducers-test-code-coverage-jacoco.stamp # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: icedtea-web-1.8/PaxHeaders.7406/aclocal.m40000644000000000000000000000013213441764275015065 xustar0030 mtime=1552410813.800354976 30 atime=1552410814.797352643 30 ctime=1552410886.999183709 icedtea-web-1.8/aclocal.m40000644000175000002070000015767213441764275015717 0ustar00jvanekmock00000000000000# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 11 (pkg-config-0.29.1) dnl Copyright ТЉ 2004 Scott James Remnant . dnl Copyright ТЉ 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES # Copyright (C) 2002-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_COND_IF -*- Autoconf -*- # Copyright (C) 2008-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_COND_IF # _AM_COND_ELSE # _AM_COND_ENDIF # -------------- # These macros are only used for tracing. m4_define([_AM_COND_IF]) m4_define([_AM_COND_ELSE]) m4_define([_AM_COND_ENDIF]) # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) # --------------------------------------- # If the shell condition COND is true, execute IF-TRUE, otherwise execute # IF-FALSE. Allow automake to learn about conditional instantiating macros # (the AC_CONFIG_FOOS). AC_DEFUN([AM_COND_IF], [m4_ifndef([_AM_COND_VALUE_$1], [m4_fatal([$0: no such condition "$1"])])dnl _AM_COND_IF([$1])dnl if test -z "$$1_TRUE"; then : m4_n([$2])[]dnl m4_ifval([$3], [_AM_COND_ELSE([$1])dnl else $3 ])dnl _AM_COND_ENDIF([$1])dnl fi[]dnl ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) icedtea-web-1.8/PaxHeaders.7406/configure.ac0000644000000000000000000000013213441742745015511 xustar0030 mtime=1552401893.019832864 30 atime=1552410814.361353664 30 ctime=1552410886.998183712 icedtea-web-1.8/configure.ac0000644000175000002070000002661013441742745016326 0ustar00jvanekmock00000000000000AC_INIT([icedtea-web],[1.8],[distro-pkg-dev@openjdk.java.net], [icedtea-web], [http://icedtea.classpath.org/wiki/IcedTea-Web]) AM_INIT_AUTOMAKE([1.9 tar-pax foreign]) AC_CONFIG_FILES([Makefile netx.manifest]) AM_MAINTAINER_MODE([enable]) # Older automake doesn't generate these correctly abs_top_builddir=`pwd -P` AC_SUBST(abs_top_builddir) abs_top_srcdir=`dirname $0` cd $abs_top_srcdir abs_top_srcdir=`pwd` cd $abs_top_builddir AC_SUBST(abs_top_srcdir) AC_CANONICAL_HOST IT_SET_ARCH_SETTINGS IT_CP_SUPPORTS_REFLINK IT_CAN_HARDLINK_TO_SOURCE_TREE AC_MSG_CHECKING([whether to build documentation]) AC_ARG_ENABLE([docs], [AS_HELP_STRING([--disable-docs], [Disable generation of documentation])], [ENABLE_DOCS="${enableval}"], [ENABLE_DOCS='yes']) AM_CONDITIONAL([ENABLE_DOCS], [test x$ENABLE_DOCS = xyes]) AC_MSG_RESULT(${ENABLE_DOCS}) AC_MSG_CHECKING([whether to filter by whitelisting on directory name when processing, compiling and running reproducers]) AC_ARG_ENABLE([whitelist-processing], [AS_HELP_STRING([--enable-whitelist-processing], [Enable whitelist filter on directory name when processing, compiling and running reproducers. Otherwise filter on testcase name when running reproducers])], [ENABLE_WHITELIST="${enableval}"], [ENABLE_WHITELIST='no']) AM_CONDITIONAL([ENABLE_WHITELIST], [test x$ENABLE_WHITELIST = xyes]) AC_MSG_RESULT(${ENABLE_WHITELIST}) AC_PATH_PROG([BIN_BASH], [bash],, [/bin]) if test x"$BIN_BASH" = x ; then AC_MSG_ERROR([/bin/bash is used in runtime and for about generation. Dying sooner rather then later]) fi IT_CHECK_MODULARJDK_ARGS AC_MSG_CHECKING([whether build legacy shell launchers]) AC_ARG_ENABLE([shell-launchers], [AS_HELP_STRING([--enable-shell-launchers], [Enable build of legacy shell launchers])], [ENABLE_SHELL_LAUNCHERS="${enableval}"], [ENABLE_SHELL_LAUNCHERS='no']) AM_CONDITIONAL([ENABLE_SHELL_LAUNCHERS], [test x$ENABLE_SHELL_LAUNCHERS = xyes]) AC_MSG_RESULT(${ENABLE_SHELL_LAUNCHERS}) AC_PATH_PROG([RUSTC], [rustc],,) if test x"$RUSTC" = x ; then if test x${ENABLE_SHELL_LAUNCHERS} = xno ; then AC_MSG_ERROR([rust is used to compile launchers. No go]) else echo "rust is used to compile launchers, is missing but you have enable-shell-launchers as yes, continuing with UNMAINTAINED shell launchers only" fi else AC_PATH_PROG([CARGO], [cargo],,) if test x"$CARGO" = x ; then if test x${ENABLE_SHELL_LAUNCHERS} = xno ; then AC_MSG_ERROR([cargo is used to call rustc for launchers. No go]) else echo "cargo is used to manage launchers sources, is missing but you have enable-shell-launchers as yes, continuing with UNMAINTAINED shell launchers only" fi fi fi AM_CONDITIONAL([ENABLE_NATIVE_LAUNCHERS], [test ! x"$RUSTC" = x -a ! x"$CARGO" = x]) build_linux=no build_windows=no case "${host_os}" in linux*) build_linux=yes ;; cygwin*) build_windows=yes ;; *) AC_MSG_ERROR(["OS $host_os is not supported"]) ;; esac AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"]) AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"]) # the images built with this switch on linux, are not exactly windows friendly (see removed jars in make log, which are made in favor of clean linux build) AC_MSG_CHECKING([whether to include also bat lunchers during linux build]) AC_ARG_ENABLE([bats-on-linux], [AS_HELP_STRING([--enable-bats-on-linux], [enable generation of windows legacy bat launchers during linux build with legacy shell launchers. This is for subjects, who wish to do an custom build for windows and linuxes/mac users together. Preparation of rest of the ITW then require a bit of love. This switch is not exactly supported option.])], [WINDOWS_OR_INCLUDE_BATS="${enableval}"], [WINDOWS_OR_INCLUDE_BATS='no']) AM_CONDITIONAL([WINDOWS_OR_INCLUDE_BATS], [test "x$WINDOWS_OR_INCLUDE_BATS" = "xyes" -o "$build_windows" = "yes" ]) AC_MSG_RESULT(${WINDOWS_OR_INCLUDE_BATS}) IT_CHECK_WITH_KCOV AC_MSG_CHECKING([how to search for libraries in native launchers]) AC_ARG_WITH([itw-libs], [AS_HELP_STRING([--with-itw-libs], [set way of searching system for jar depndencies - BUNDLED, for portable build (in application space); DISTRIBUTION, for linux (in installed path); BOTH, for both usages (should be for testing only])], [ITW_LIBS="${withval}"], [ITW_LIBS='none']) if test "x$build_windows" = xyes ; then if test x"$ITW_LIBS" = xnone -o x"$ITW_LIBS" = x; then ITW_LIBS="BUNDLED" echo -n "On Windows, presetting missing --with-itw-libs ITW_LIBS to $ITW_LIBS. " echo -n "On Windows, DISTRIBUTION nor BOTH do not have much sense... " fi fi AC_MSG_RESULT(${ITW_LIBS}) AC_SUBST(ITW_LIBS) if test x"$ITW_LIBS" = xnone -o x"$ITW_LIBS" = x; then AC_MSG_ERROR([missing --with-itw-libs; mandatory on linux. Use BUNDLED, DISTRIBUTION or BOTH. use BOTH with care. ]) fi if test ! "$ITW_LIBS" = BUNDLED -a ! "$ITW_LIBS" = DISTRIBUTION -a ! "$ITW_LIBS" = BOTH; then AC_MSG_ERROR([incorrect --with-itw-libs; mandatory are BUNDLED, DISTRIBUTION or BOTH ]) fi IT_CHECK_WITH_GCJ FIND_TOOL([ZIP], [zip]) FIND_JAVAC FIND_JAR FIND_ECJ_JAR IT_CHECK_JAVA_VERSION IT_FIND_JAVADOC IT_FIND_KEYTOOL IT_FIND_JARSIGNER IT_FIND_PACK200 IT_SET_VERSION IT_CHECK_XULRUNNER_VERSION IT_CHECK_PLUGINJAR if test "$enable_native_plugin" = yes -a ! "$enable_pluginjar" = yes ; then AC_MSG_ERROR([$enable_native_plugin/$enable_pluginjar you can not build native_plugin without pluginjar]) fi dnl PR46074 (gcc) - Missing java.net cookie code required by IcedTea plugin dnl IT563 - NetX uses sun.security code dnl IT605 - NetX depends on sun.misc HexDumpEncoder or sun.security.util.HexDumpEncoder dnl IT570 - NetX depends on sun.applet.AppletViewPanel dnl IT571 - NetX depends on com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager.java dnl IT573 - Plugin depends on sun.awt,X11.XEmbeddedFrame.java dnl IT575 - Plugin depends on com.sun/jndi.toolkit.url.UrlUtil dnl IT576 - Plugin depends on sun.applet.AppletImageRef dnl IT578 - Remove need for patching AppletPanel for Plugin/Webstart if test x"$HAVE_JAVA9" = xyes ; then JAVA_BASE=java.base JAVA_DESKTOP=java.desktop JAVA_NAMING=java.naming fi IT_CHECK_FOR_CLASS(JAVA_UTIL_JAR_PACK200, [java.util.jar.Pack200], [some.pkg], []) IT_CHECK_FOR_CLASS(JAVA_NET_COOKIEMANAGER, [java.net.CookieManager], [some.pkg], []) IT_CHECK_FOR_CLASS(JAVA_NET_HTTPCOOKIE, [java.net.HttpCookie], [some.pkg], []) IT_CHECK_FOR_CLASS(JAVA_NET_COOKIEHANDLER, [java.net.CookieHandler], [some.pkg], []) # in jdk9, those classes are using internal apis, must be enabled via module cheats IT_CHECK_FOR_CLASS(SUN_SECURITY_UTIL_SECURITYCONSTANTS, [sun.security.util.SecurityConstants], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(SUN_SECURITY_UTIL_HOSTNAMECHECKER, [sun.security.util.HostnameChecker], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(SUN_SECURITY_X509_X500NAME, [sun.security.x509.X500Name], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(SUN_SECURITY_ACTION_GETPROPERTYACTION, [sun.security.action.GetPropertyAction], [some.pkg], [$JAVA_BASE]) # the classname cant be substitued by variable, as it is substituted to inner class if test x"$HAVE_JAVA9" = xyes ; then IT_CHECK_FOR_CLASS(HEXDUMPENCODER, [sun.security.util.HexDumpEncoder], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(SUN_MISC_JARINDEX, [jdk.internal.util.jar.JarIndex], [some.pkg], [$JAVA_BASE]) else IT_CHECK_FOR_CLASS(HEXDUMPENCODER, [sun.misc.HexDumpEncoder], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(SUN_MISC_JARINDEX, [sun.misc.JarIndex], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(SUN_MISC_LAUNCHER, [sun.misc.Launcher], [some.pkg], [$JAVA_BASE]) fi IT_CHECK_FOR_CLASS(SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION, [sun.security.validator.ValidatorException], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER, [com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE, [sun.net.www.protocol.jar.URLJarFile], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK, [sun.net.www.protocol.jar.URLJarFileCallBack], [some.pkg], [$JAVA_BASE]) if test "x$build_linux" = xyes ; then IT_CHECK_FOR_CLASS(SUN_AWT_X11_XEMBEDDEDFRAME, [sun.awt.X11.XEmbeddedFrame], [some.pkg], [$JAVA_DESKTOP]) fi if test "x$build_windows" = xyes ; then IT_CHECK_FOR_CLASS(SUN_AWT_WEMBEDDEDFRAME, [sun.awt.windows.WEmbeddedFrame], [some.pkg], [$JAVA_DESKTOP]) fi IT_CHECK_FOR_CLASS(COM_SUN_JNDI_TOOLKIT_URL_URLUTIL, [com.sun.jndi.toolkit.url.UrlUtil], [some.pkg], [$JAVA_NAMING]) IT_CHECK_FOR_CLASS(SUN_NET_WWW_PROTOCOL_HTTP_HANDLER, [sun.net.www.protocol.http.Handler], [some.pkg], [$JAVA_BASE]) IT_CHECK_FOR_CLASS(SUN_APPLET_APPLETIMAGEREF, [sun.applet.AppletImageRef], [sun.applet], [$JAVA_DESKTOP]) IT_CHECK_FOR_SUN_APPLET_ACCESSIBILITY IT_CHECK_GLIB_VERSION IT_CHECK_XULRUNNER_MIMEDESCRIPTION_CONSTCHAR IT_CHECK_XULRUNNER_REQUIRES_C11 # # Find optional depedencies # AC_CHECK_PROGS([XSLTPROC],[xsltproc],[], []) # browser to be linked/tested # Example: IT_FIND_BROWSER([browser-name],[variable-to-store-path],[default-run-command-if-different-from-the-browser-name]) IT_FIND_BROWSER([firefox],[FIREFOX]) IT_FIND_BROWSER([chrome],[CHROME],[google-chrome]) IT_FIND_BROWSER([chromium],[CHROMIUM],[chromium-browser]) IT_FIND_BROWSER([opera],[OPERA]) IT_FIND_BROWSER([midori],[MIDORI]) IT_FIND_BROWSER([epiphany],[EPIPHANY]) IT_SET_GLOBAL_BROWSERTESTS_BEHAVIOUR AM_CONDITIONAL([WITH_XSLTPROC], [test x"$XSLTPROC" != x ]) IT_FIND_OPTIONAL_JAR([rhino], RHINO, [/usr/share/java/js.jar /usr/share/rhino-1.6/lib/js.jar]) IT_FIND_OPTIONAL_JAR([junit], JUNIT, [/usr/share/java/junit4.jar /usr/share/junit-4/lib/junit.jar]) IT_FIND_OPTIONAL_JAR([hamcrest], HAMCREST, [/usr/share/java/hamcrest/all.jar /usr/share/java/hamcrest-core.jar]) IT_FIND_OPTIONAL_JAR([jacoco], JACOCO, [/usr/share/java/jacoco/org.jacoco.core.jar]) IT_FIND_OPTIONAL_JAR([asm], ASM, [/usr/share/java/objectweb-asm4/asm-all.jar /usr/share/java/objectweb-asm4/asm-all-4.0.jar /usr/share/java/objectweb-asm/asm-all.jar]) IT_CHECK_FOR_TAGSOUP IT_CHECK_FOR_MSLINKS if test "x$build_windows" = xyes ; then IT_CHECK_FOR_WIX fi IT_FIND_OPTIONAL_JAR([wixgen], WIXGEN, [/usr/share/java/wixgen.jar $WIX_TOOLSET_DIR/wixgen.jar $WIX_TOOLSET_DIR/../wixgen.jar]) echo -n "checking for MSI deps... " if test "x$WIX_TOOLSET_DIR" = "x" ; then if test "x$WIXGEN_JAR" = "x" ; then echo "No WiX tools, nor wixgen jar, correct - build on linux or on windows witout MSI" else echo "No WiX tools, but wixgen jar - wixgen jar will do its job, but is useless. No MSI can be generated" fi else if test "x$WIXGEN_JAR" = "x" ; then echo "WiX tools, but no wixgen jar, fatal. You need wixgen.jar from https://github.com/akashche/wixgen" exit 1 else echo "WiX tools and wixgen jar - build on windows with MSI generation support" fi fi PKG_CHECK_VAR(bashcompdir, [bash-completion], [completionsdir], , bashcompdir="${sysconfdir}/bash_completion.d") AC_SUBST(bashcompdir) AC_CONFIG_FILES([jrunscript], [chmod u+x jrunscript]) AC_CONFIG_FILES([build.properties]) # this is nasty hack to make GCC trully optional echo -n "destroying gcc config? ... " if test "x${enable_native_plugin}" = "xno" ; then am__fastdepCC_TRUE="#" am__fastdepCC_FALSE="#" am__fastdepCC="#" am__fastdepCXX_TRUE="#" am__fastdepCXX_FALSE="#" am__fastdepCXX="#" echo "destroyed!" else echo "no" fi AC_OUTPUT icedtea-web-1.8/PaxHeaders.7406/acinclude.m40000644000000000000000000000013213441742745015414 xustar0030 mtime=1552401893.024832854 30 atime=1552410814.194354054 30 ctime=1552410886.997183714 icedtea-web-1.8/acinclude.m40000644000175000002070000007752513441742745016244 0ustar00jvanekmock00000000000000AC_DEFUN_ONCE([IT_CAN_HARDLINK_TO_SOURCE_TREE], [ AC_CACHE_CHECK([if we can hard link rather than copy from ${abs_top_srcdir}], it_cv_hardlink_src, [ if cp -l ${abs_top_srcdir}/README tmp.$$ >&AS_MESSAGE_LOG_FD 2>&1; then it_cv_hardlink_src=yes; else it_cv_hardlink_src=no; fi rm -f tmp.$$ ]) AM_CONDITIONAL([SRC_DIR_HARDLINKABLE], test x"${it_cv_hardlink_src}" = "xyes") ]) AC_DEFUN_ONCE([IT_CP_SUPPORTS_REFLINK], [ AC_CACHE_CHECK([if cp supports --reflink], it_cv_reflink, [ touch tmp.$$ if cp --reflink=auto tmp.$$ tmp2.$$ >&AS_MESSAGE_LOG_FD 2>&1; then it_cv_reflink=yes; else it_cv_reflink=no; fi rm -f tmp.$$ tmp2.$$ ]) AM_CONDITIONAL([CP_SUPPORTS_REFLINK], test x"${it_cv_reflink}" = "xyes") ]) AC_DEFUN_ONCE([IT_CHECK_FOR_JDK], [ AC_MSG_CHECKING([for a JDK home directory]) AC_ARG_WITH([jdk-home], [AS_HELP_STRING([--with-jdk-home], [jdk home directory \ (default is first predefined JDK found)])], [ if test "x${withval}" = xyes then SYSTEM_JDK_DIR= elif test "x${withval}" = xno then SYSTEM_JDK_DIR= else SYSTEM_JDK_DIR=${withval} fi ], [ SYSTEM_JDK_DIR= ]) if test -z "${SYSTEM_JDK_DIR}"; then AM_COND_IF([WINDOWS], [ # does not work, use which instead # AC_CHECK_PROGS([SYSTEM_JAVA_IN_PATH], [java.exe]) SYSTEM_JAVA_IN_PATH=$(which javac 2>&AS_MESSAGE_LOG_FD) if test x"${SYSTEM_JAVA_IN_PATH}" != x ; then SYSTEM_JDK_DIR=$(dirname $(dirname ${SYSTEM_JAVA_IN_PATH})) fi ] , [ for dir in /etc/alternatives/java_sdk \ /usr/lib/jvm/java-1.9.0-openjdk \ /usr/lib/jvm/icedtea9 \ /usr/lib/jvm/java-9-openjdk \ /usr/lib/jvm/java-1.8.0-openjdk \ /usr/lib/jvm/icedtea8 \ /usr/lib/jvm/java-8-openjdk \ /usr/lib/jvm/java-icedtea \ /usr/lib/jvm/java-openjdk \ /usr/lib/jvm/openjdk \ /usr/lib/jvm/cacao \ /usr/lib/jvm/jamvm ; do if test -d $dir; then SYSTEM_JDK_DIR=$dir break fi done ]) fi if ! test -d "${SYSTEM_JDK_DIR}"; then AC_MSG_ERROR("A JDK home directory could not be found. ${SYSTEM_JDK_DIR}") else AM_COND_IF([WINDOWS], [ SYSTEM_JDK_DIR=$(cygpath -m ${SYSTEM_JDK_DIR}) AC_MSG_RESULT(${SYSTEM_JDK_DIR}) ], [ READ=`readlink -f ${SYSTEM_JDK_DIR}` AC_MSG_RESULT(${SYSTEM_JDK_DIR} (link to ${READ})) ]) fi AC_SUBST(SYSTEM_JDK_DIR) ]) AC_DEFUN_ONCE([IT_CHECK_FOR_JRE], [ AC_REQUIRE([IT_CHECK_FOR_JDK]) AC_MSG_CHECKING([for a JRE home directory]) AC_ARG_WITH([jre-home], [AS_HELP_STRING([--with-jre-home], [jre home directory \ (default is the JRE under the JDK)])], [ SYSTEM_JRE_DIR=${withval} ], [ SYSTEM_JRE_DIR= ]) if test -z "${SYSTEM_JRE_DIR}" ; then SYSTEM_JRE_DIR_EIGHT_AND_LESS="${SYSTEM_JDK_DIR}/jre" SYSTEM_JRE_DIR_MODULAR="${SYSTEM_JDK_DIR}" # try jdk8 or older compliant if test -d "${SYSTEM_JRE_DIR_EIGHT_AND_LESS}" -a -e "${SYSTEM_JRE_DIR_EIGHT_AND_LESS}/bin/java" -a -e "${SYSTEM_JRE_DIR_EIGHT_AND_LESS}/lib/rt.jar" ; then SYSTEM_JRE_DIR="${SYSTEM_JRE_DIR_EIGHT_AND_LESS}" fi # still not found? if test -z "${SYSTEM_JRE_DIR}" ; then # try modular, jdk9 or higher compliant if test -d "${SYSTEM_JRE_DIR_MODULAR}" -a -f "${SYSTEM_JRE_DIR_MODULAR}/bin/java" -a -e "${SYSTEM_JRE_DIR_MODULAR}/lib/modules" ; then SYSTEM_JRE_DIR="${SYSTEM_JRE_DIR_MODULAR}" fi fi fi if ! test -d "${SYSTEM_JRE_DIR}"; then AC_MSG_ERROR("A JRE home directory could not be found. ${SYSTEM_JRE_DIR}") else READ=`readlink -f ${SYSTEM_JRE_DIR}` AC_MSG_RESULT(${SYSTEM_JRE_DIR} (link to ${READ})) fi AC_SUBST(SYSTEM_JRE_DIR) ]) AC_DEFUN_ONCE([FIND_JAVAC], [ AC_REQUIRE([IT_CHECK_FOR_JDK]) JAVAC=${SYSTEM_JDK_DIR}/bin/javac IT_FIND_JAVAC IT_FIND_ECJ IT_USING_ECJ AC_SUBST(JAVAC) ]) AC_DEFUN([IT_FIND_ECJ], [ AC_ARG_WITH([ecj], [AS_HELP_STRING(--with-ecj,bytecode compilation with ecj)], [ if test "x${withval}" != x && test "x${withval}" != xyes && test "x${withval}" != xno; then IT_CHECK_ECJ(${withval}) else if test "x${withval}" != xno; then IT_CHECK_ECJ fi fi ], [ IT_CHECK_ECJ ]) if test "x${JAVAC}" = "x"; then if test "x{ECJ}" != "x"; then JAVAC="${ECJ} -nowarn" fi fi ]) AC_DEFUN([IT_CHECK_ECJ], [ if test "x$1" != x; then if test -f "$1"; then AC_MSG_CHECKING(for ecj) ECJ="$1" AC_MSG_RESULT(${ECJ}) else AC_PATH_PROG(ECJ, "$1") fi else AC_PATH_PROG(ECJ, "ecj") if test -z "${ECJ}"; then AC_PATH_PROG(ECJ, "ecj-3.1") fi if test -z "${ECJ}"; then AC_PATH_PROG(ECJ, "ecj-3.2") fi if test -z "${ECJ}"; then AC_PATH_PROG(ECJ, "ecj-3.3") fi fi ]) AC_DEFUN([IT_FIND_JAVAC], [ AC_ARG_WITH([javac], [AS_HELP_STRING(--with-javac,bytecode compilation with javac)], [ if test "x${withval}" != x && test "x${withval}" != xyes && test "x${withval}" != xno; then IT_CHECK_JAVAC(${withval}) else if test "x${withval}" != xno; then IT_CHECK_JAVAC fi fi ], [ IT_CHECK_JAVAC ]) ]) AC_DEFUN([IT_CHECK_JAVAC], [ if test "x$1" != x; then if test -f "$1"; then AC_MSG_CHECKING(for javac) JAVAC="$1" AC_MSG_RESULT(${JAVAC}) else AC_PATH_PROG(JAVAC, "$1") fi else AC_PATH_PROG(JAVAC, "javac") fi ]) AC_DEFUN([FIND_JAR], [ AC_REQUIRE([IT_CHECK_FOR_JDK]) AC_MSG_CHECKING([for jar]) AC_ARG_WITH([jar], [AS_HELP_STRING(--with-jar,specify location of Java archive tool (jar))], [ JAR="${withval}" ], [ JAR=${SYSTEM_JDK_DIR}/bin/jar ]) if ! test -f "${JAR}"; then AC_PATH_PROG(JAR, "${JAR}") fi if test -z "${JAR}"; then AC_PATH_PROG(JAR, "gjar") fi if test -z "${JAR}"; then AC_PATH_PROG(JAR, "jar") fi if test -z "${JAR}"; then AC_MSG_ERROR("No Java archive tool was found.") fi AC_MSG_RESULT(${JAR}) AC_MSG_CHECKING([whether jar supports @ argument]) touch _config.txt cat >_config.list <&AS_MESSAGE_LOG_FD 2>&1; then JAR_KNOWS_ATFILE=1 AC_MSG_RESULT(yes) else JAR_KNOWS_ATFILE= AC_MSG_RESULT(no) fi AC_MSG_CHECKING([whether jar supports stdin file arguments]) if cat _config.list | $JAR cf@ _config.jar >&AS_MESSAGE_LOG_FD 2>&1; then JAR_ACCEPTS_STDIN_LIST=1 AC_MSG_RESULT(yes) else JAR_ACCEPTS_STDIN_LIST= AC_MSG_RESULT(no) fi rm -f _config.list _config.jar AC_MSG_CHECKING([whether jar supports -J options at the end]) if $JAR cf _config.jar _config.txt -J-Xmx896m >&AS_MESSAGE_LOG_FD 2>&1; then JAR_KNOWS_J_OPTIONS=1 AC_MSG_RESULT(yes) else JAR_KNOWS_J_OPTIONS= AC_MSG_RESULT(no) fi rm -f _config.txt _config.jar AC_SUBST(JAR) AC_SUBST(JAR_KNOWS_ATFILE) AC_SUBST(JAR_ACCEPTS_STDIN_LIST) AC_SUBST(JAR_KNOWS_J_OPTIONS) ]) AC_DEFUN([FIND_ECJ_JAR], [ AC_REQUIRE([FIND_JAVAC]) AC_MSG_CHECKING([for an ecj JAR file]) AC_ARG_WITH([ecj-jar], [AS_HELP_STRING(--with-ecj-jar,specify location of the ECJ jar)], [ if test -f "${withval}"; then ECJ_JAR="${withval}" fi ], [ ECJ_JAR= ]) if test -z "${ECJ_JAR}"; then for jar in /usr/share/java/eclipse-ecj.jar \ /usr/share/java/ecj.jar \ /usr/share/eclipse-ecj-3.{2,3,4,5}/lib/ecj.jar; do if test -e $jar; then ECJ_JAR=$jar break fi done if test -z "${ECJ_JAR}"; then ECJ_JAR=no fi fi AC_MSG_RESULT(${ECJ_JAR}) if test "x${JAVAC}" = x && test "x${ECJ_JAR}" = "xno" ; then AC_MSG_ERROR([cannot find a Java compiler or ecj JAR file, try --with-javac, --with-ecj or --with-ecj-jar]) fi AC_SUBST(ECJ_JAR) ]) # # IT_FIND_OPTIONAL_JAR # -------------------- # Find an optional jar required for building and running # # $1 : jar/feature name # $2 : used to set $2_JAR and WITH_$2 # $3 (optional) : used to specify additional file paths for searching # # Sets $2_JAR to the jar location (or blank if not found) # Defines WITH_$2 if jar is found # Sets $2_AVAILABLE to "true" if jar is found (or "false" if not) # AC_DEFUN([IT_FIND_OPTIONAL_JAR], [ AC_MSG_CHECKING([for $1 jar]) AC_ARG_WITH([$1], [AS_HELP_STRING(--with-$1,specify location of the $1 jar)], [ case "${withval}" in yes) $2_JAR=yes ;; no) $2_JAR=no ;; *) if test -f "${withval}"; then $2_JAR="${withval}" elif test -z "${withval}"; then $2_JAR=yes else AC_MSG_RESULT([not found]) AC_MSG_ERROR("The $1 jar ${withval} was not found.") fi ;; esac ], [ $2_JAR=yes ]) it_extra_paths_$1="$3" if test "x${$2_JAR}" = "xyes"; then for path in ${it_extra_paths_$1}; do if test -f ${path}; then $2_JAR=${path} break fi done fi if test x"${$2_JAR}" = "xyes"; then if test -f "/usr/share/java/$1.jar"; then $2_JAR=/usr/share/java/$1.jar fi fi if test x"${$2_JAR}" = "xyes"; then $2_JAR=no fi AM_COND_IF([WINDOWS], [ if test x"${$2_JAR}" != "xno"; then $2_JAR=$(cygpath -m ${$2_JAR}) fi ]) AC_MSG_RESULT(${$2_JAR}) AM_CONDITIONAL(WITH_$2, test x"${$2_JAR}" != "xno") # Clear $2_JAR if it doesn't contain a valid filename if test x"${$2_JAR}" = "xno"; then $2_JAR= fi if test -n "${$2_JAR}" ; then $2_AVAILABLE=true else $2_AVAILABLE=false fi AC_SUBST($2_JAR) AC_SUBST($2_AVAILABLE) ]) AC_DEFUN_ONCE([IT_CHECK_NATIVE_PLUGIN], [ AC_MSG_CHECKING([whether to build the browser plugin]) AC_ARG_ENABLE([native_plugin], [AS_HELP_STRING([--disable-native-plugin], [Disable compilation of browser plugin])], [enable_native_plugin="${enableval}"], [ AM_COND_IF([WINDOWS], [enable_native_plugin="no"], [enable_native_plugin="yes"]) ]) AC_MSG_RESULT(${enable_native_plugin}) ]) AC_DEFUN_ONCE([IT_CHECK_PLUGINJAR], [ AC_MSG_CHECKING([whether to build plugin jar for javaws -html]) AC_ARG_ENABLE([pluginjar], [AS_HELP_STRING([--disable-pluginjar], [Disable compilation of plugin.jar for javaws -html])], [enable_pluginjar="${enableval}"], [enable_pluginjar="yes"]) AC_MSG_RESULT(${enable_pluginjar}) AM_CONDITIONAL(ENABLE_PLUGINJAR, test "x${enable_pluginjar}" = "xyes") ]) AC_DEFUN_ONCE([IT_CHECK_NATIVE_PLUGIN_DEPENDENCIES], [ dnl Check for plugin support headers and libraries. dnl FIXME: use unstable AC_REQUIRE([IT_CHECK_NATIVE_PLUGIN]) if test "x${enable_native_plugin}" = "xyes" ; then AC_PROG_CC AC_PROG_CXX PKG_CHECK_MODULES(GLIB, glib-2.0) AC_SUBST(GLIB_CFLAGS) AC_SUBST(GLIB_LIBS) PKG_CHECK_MODULES(MOZILLA, npapi-sdk, [ AC_CACHE_CHECK([for xulrunner version], [xulrunner_cv_collapsed_version],[ # XXX: use NPAPI versions instead xulrunner_cv_collapsed_version=20000000 ]) ], [ PKG_CHECK_MODULES(MOZILLA, mozilla-plugin) ]) AC_SUBST(MOZILLA_CFLAGS) AC_SUBST(MOZILLA_LIBS) fi AM_CONDITIONAL(ENABLE_NATIVE_PLUGIN, test "x${enable_native_plugin}" = "xyes") ]) AC_DEFUN_ONCE([IT_CHECK_XULRUNNER_VERSION], [ AC_REQUIRE([IT_CHECK_NATIVE_PLUGIN_DEPENDENCIES]) if test "x${enable_native_plugin}" = "xyes" then AC_CACHE_CHECK([for xulrunner version], [xulrunner_cv_collapsed_version],[ if pkg-config --modversion libxul >/dev/null 2>&1 then xulrunner_cv_collapsed_version=`pkg-config --modversion libxul | awk -F. '{power=6; v=0; for (i=1; i <= NF; i++) {v += $i * 10 ^ power; power -=2}; print v}'` elif pkg-config --modversion mozilla-plugin >/dev/null 2>&1 then xulrunner_cv_collapsed_version=`pkg-config --modversion mozilla-plugin | awk -F. '{power=6; v=0; for (i=1; i <= NF; i++) {v += $i * 10 ^ power; power -=2}; print v}'` else AC_MSG_FAILURE([cannot determine xulrunner version]) fi]) AC_SUBST(MOZILLA_VERSION_COLLAPSED, $xulrunner_cv_collapsed_version) fi ]) AC_DEFUN_ONCE([IT_CHECK_FOR_TAGSOUP], [ AC_MSG_CHECKING([for tagsoup]) AC_ARG_WITH([tagsoup], [AS_HELP_STRING([--with-tagsoup], [tagsoup.jar])], [ TAGSOUP_JAR=${withval} ], [ TAGSOUP_JAR= ]) if test -z "${TAGSOUP_JAR}"; then for dir in /usr/share/java /usr/local/share/java ; do if test -f $dir/tagsoup.jar; then TAGSOUP_JAR=$dir/tagsoup.jar break fi done fi AM_COND_IF([WINDOWS], [ TAGSOUP_JAR=$(cygpath -m ${TAGSOUP_JAR}) ]) AC_MSG_RESULT(${TAGSOUP_JAR}) if test -z "${TAGSOUP_JAR}"; then AC_MSG_RESULT(***********************************************) AC_MSG_RESULT(* Warning you are building without tagsoup *) AC_MSG_RESULT(* Some jnlps and most htmls will be malformed *) AC_MSG_RESULT(***********************************************) fi AC_SUBST(TAGSOUP_JAR) AM_CONDITIONAL([HAVE_TAGSOUP], [test x$TAGSOUP_JAR != xno -a x$TAGSOUP_JAR != x ]) ]) AC_DEFUN_ONCE([IT_CHECK_FOR_MSLINKS], [ AC_MSG_CHECKING([for mslinks]) AC_ARG_WITH([mslinks], [AS_HELP_STRING([--with-mslinks], [mslinks.jar])], [ MSLINKS_JAR=${withval} ], [ MSLINKS_JAR= ]) if test -z "${MSLINKS_JAR}"; then for dir in /usr/share/java /usr/local/share/java ; do if test -f $dir/mslinks.jar; then MSLINKS_JAR=$dir/mslinks.jar break fi done fi AM_COND_IF([WINDOWS], [ MSLINKS_JAR=$(cygpath -m ${MSLINKS_JAR}) ]) AC_MSG_RESULT(${MSLINKS_JAR}) AM_COND_IF([WINDOWS], [ if test -z "${MSLINKS_JAR}"; then AC_MSG_RESULT(**********************************************) AC_MSG_RESULT(* Warning you are building without mslinks *) AC_MSG_RESULT(* Your windows desktop integration will fail *) AC_MSG_RESULT(**********************************************) fi ]) AC_SUBST(MSLINKS_JAR) AM_CONDITIONAL([HAVE_MSLINKS], [test x$MSLINKS_JAR != xno -a x$MSLINKS_JAR != x ]) ]) dnl Generic macro to check for a Java class dnl Takes the name of the class as an argument. The macro name dnl is usually the name of the class with '.' dnl replaced by '_' and all letters capitalised. dnl e.g. IT_CHECK_FOR_CLASS([JAVA_UTIL_SCANNER],[java.util.Scanner]) dnl Test class has to be in sun.applet for some internal classes AC_DEFUN([IT_CHECK_FOR_CLASS],[ AC_REQUIRE([IT_FIND_JAVAC]) AC_REQUIRE([IT_FIND_JAVA]) AC_CACHE_CHECK([if $2 is available from $3 (module "$4")], it_cv_$1, [ # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$4" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo $3 | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS [/* [#]line __oline__ "configure" */ package $3; import $2; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("$2")); } } ] EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&AS_MESSAGE_LOG_FD 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&AS_MESSAGE_LOG_FD 2>&1; then it_cv_$1=yes; else it_cv_$1=no; fi else it_cv_$1=no; fi ]) rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_$1}" = "xno"; then AC_MSG_ERROR([$2 not found.]) fi AC_SUBST([$1], [${it_cv_$1}]) AC_PROVIDE([$0])dnl ]) AC_DEFUN_ONCE([IT_CHECK_FOR_MERCURIAL], [ AC_PATH_TOOL([HG],[hg]) AC_SUBST([HG]) ]) AC_DEFUN_ONCE([IT_OBTAIN_HG_REVISIONS], [ AC_REQUIRE([IT_CHECK_FOR_MERCURIAL]) ICEDTEA_REVISION="none"; if which ${HG} >&AS_MESSAGE_LOG_FD 2>&1; then AC_MSG_CHECKING([for IcedTea Mercurial revision ID]) if test -e ${abs_top_srcdir}/.hg ; then ICEDTEA_REVISION="r`(cd ${abs_top_srcdir}; ${HG} id -i)`" ; fi ; AC_MSG_RESULT([${ICEDTEA_REVISION}]) AC_SUBST([ICEDTEA_REVISION]) fi; AM_CONDITIONAL([HAS_ICEDTEA_REVISION], test "x${ICEDTEA_REVISION}" != xnone) ]) AC_DEFUN_ONCE([IT_GET_PKGVERSION], [ AC_MSG_CHECKING([for distribution package version]) AC_ARG_WITH([pkgversion], [AS_HELP_STRING([--with-pkgversion=PKG], [Use PKG in the version string in addition to "IcedTea"])], [case "$withval" in yes) AC_MSG_ERROR([package version not specified]) ;; no) PKGVERSION=none ;; *) PKGVERSION="$withval" ;; esac], [PKGVERSION=none]) AC_MSG_RESULT([${PKGVERSION}]) AM_CONDITIONAL(HAS_PKGVERSION, test "x${PKGVERSION}" != "xnone") AC_SUBST(PKGVERSION) ]) AC_DEFUN_ONCE([IT_CHECK_GLIB_VERSION],[ PKG_CHECK_MODULES([GLIB2_V_216],[glib-2.0 >= 2.16],[],[AC_DEFINE([LEGACY_GLIB])]) ]) AC_DEFUN_ONCE([IT_CHECK_XULRUNNER_MIMEDESCRIPTION_CONSTCHAR], [ AC_MSG_CHECKING([for legacy xulrunner api]) AC_LANG_PUSH(C++) CXXFLAGS_BACKUP="$CXXFLAGS" CXXFLAGS="$CXXFLAGS"" ""$MOZILLA_CFLAGS" AC_COMPILE_IFELSE([ AC_LANG_SOURCE([[#include const char* NP_GetMIMEDescription () {return (char*) "yap!";}]]) ],[ AC_MSG_RESULT(no) ],[ AC_MSG_RESULT(yes) AC_DEFINE([LEGACY_XULRUNNERAPI]) ]) CXXFLAGS="$CXXFLAGS_BACKUP" AC_LANG_POP(C++) ]) AC_DEFUN_ONCE([IT_CHECK_XULRUNNER_REQUIRES_C11], [ AC_MSG_CHECKING([for xulrunner enforcing C++11 standard]) AC_LANG_PUSH(C++) CXXFLAGS_BACKUP="$CXXFLAGS" CXXFLAGS="$CXXFLAGS"" ""$MOZILLA_CFLAGS" AC_COMPILE_IFELSE([ AC_LANG_SOURCE([[#include #include void setnpptr (NPVariant *result) { VOID_TO_NPVARIANT(*result);}]]) ],[ AC_MSG_RESULT(no) CXXFLAGS="$CXXFLAGS_BACKUP" ],[ AC_MSG_RESULT(yes) CXXFLAGS="$CXXFLAGS_BACKUP -std=c++11" ]) AC_LANG_POP(C++) ]) AC_DEFUN([IT_CHECK_WITH_GCJ], [ AC_MSG_CHECKING([whether to compile ecj natively]) AC_ARG_WITH([gcj], [AS_HELP_STRING(--with-gcj,location of gcj for natively compiling ecj)], [ GCJ="${withval}" ], [ GCJ="no" ]) AC_MSG_RESULT([${GCJ}]) if test "x${GCJ}" = xyes; then AC_PATH_TOOL([GCJ],[gcj]) fi AC_SUBST([GCJ]) ]) AC_DEFUN([IT_USING_ECJ],[ AC_CACHE_CHECK([if we are using ecj as javac], it_cv_ecj, [ if $JAVAC -version 2>&1| grep '^Eclipse' >&AS_MESSAGE_LOG_FD ; then it_cv_ecj=yes; else it_cv_ecj=no; fi ]) USING_ECJ=$it_cv_ecj AC_SUBST(USING_ECJ) AC_PROVIDE([$0])dnl ]) AC_DEFUN([FIND_TOOL], [AC_PATH_TOOL([$1],[$2]) if test x"$$1" = x ; then AC_MSG_ERROR([$2 program not found in PATH]) fi AC_SUBST([$1]) ]) AC_DEFUN([IT_SET_ARCH_SETTINGS], [ case "${host_cpu}" in x86_64) BUILD_ARCH_DIR=amd64 INSTALL_ARCH_DIR=amd64 JRE_ARCH_DIR=amd64 ARCHFLAG="-m64" ;; i?86) BUILD_ARCH_DIR=i586 INSTALL_ARCH_DIR=i386 JRE_ARCH_DIR=i386 ARCH_PREFIX=${LINUX32} ARCHFLAG="-m32" ;; alpha*) BUILD_ARCH_DIR=alpha INSTALL_ARCH_DIR=alpha JRE_ARCH_DIR=alpha ;; arm*) BUILD_ARCH_DIR=arm INSTALL_ARCH_DIR=arm JRE_ARCH_DIR=arm ;; mips) BUILD_ARCH_DIR=mips INSTALL_ARCH_DIR=mips JRE_ARCH_DIR=mips ;; mipsel) BUILD_ARCH_DIR=mipsel INSTALL_ARCH_DIR=mipsel JRE_ARCH_DIR=mipsel ;; powerpc) BUILD_ARCH_DIR=ppc INSTALL_ARCH_DIR=ppc JRE_ARCH_DIR=ppc ARCH_PREFIX=${LINUX32} ARCHFLAG="-m32" ;; powerpc64) BUILD_ARCH_DIR=ppc64 INSTALL_ARCH_DIR=ppc64 JRE_ARCH_DIR=ppc64 ARCHFLAG="-m64" ;; sparc) BUILD_ARCH_DIR=sparc INSTALL_ARCH_DIR=sparc JRE_ARCH_DIR=sparc ARCH_PREFIX=${LINUX32} ARCHFLAG="-m32" ;; sparc64) BUILD_ARCH_DIR=sparcv9 INSTALL_ARCH_DIR=sparcv9 JRE_ARCH_DIR=sparc64 ARCHFLAG="-m64" ;; s390) BUILD_ARCH_DIR=s390 INSTALL_ARCH_DIR=s390 JRE_ARCH_DIR=s390 ARCH_PREFIX=${LINUX32} ARCHFLAG="-m31" ;; s390x) BUILD_ARCH_DIR=s390x INSTALL_ARCH_DIR=s390x JRE_ARCH_DIR=s390x ARCHFLAG="-m64" ;; sh*) BUILD_ARCH_DIR=sh INSTALL_ARCH_DIR=sh JRE_ARCH_DIR=sh ;; *) BUILD_ARCH_DIR=`uname -m` INSTALL_ARCH_DIR=$BUILD_ARCH_DIR JRE_ARCH_DIR=$INSTALL_ARCH_DIR ;; esac AC_SUBST(BUILD_ARCH_DIR) AC_SUBST(INSTALL_ARCH_DIR) AC_SUBST(JRE_ARCH_DIR) AC_SUBST(ARCH_PREFIX) AC_SUBST(ARCHFLAG) ]) AC_DEFUN_ONCE([IT_FIND_JAVA], [ AC_REQUIRE([IT_CHECK_FOR_JRE]) AC_MSG_CHECKING([for a Java virtual machine]) AC_ARG_WITH([java], [AS_HELP_STRING(--with-java, specify location of the Java 1.8 or better VM)], [ JAVA="${withval}" ], [ JAVA="${SYSTEM_JRE_DIR}/bin/java" ]) if ! test -f "${JAVA}"; then AC_PATH_PROG(JAVA, "${JAVA}") fi if test -z "${JAVA}"; then AC_PATH_PROG(JAVA, "java") fi if test -z "${JAVA}"; then AC_MSG_ERROR("A 1.8+-compatible Java VM is required.") fi AC_MSG_RESULT(${JAVA}) AC_SUBST(JAVA) ]) AC_DEFUN_ONCE([IT_CHECK_JAVA_VERSION], [ AC_REQUIRE([IT_FIND_JAVA]) AC_MSG_CHECKING([JDK version]) JAVA_VERSION=`$JAVA -version 2>&1 | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f1` if test "${JAVA_VERSION}" -eq "1"; then JAVA_VERSION=`$JAVA -version 2>&1 | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f2` fi AC_MSG_RESULT($JAVA_VERSION) if test "${JAVA_VERSION}" -eq "8"; then HAVE_JAVA8="yes" elif test "$JAVA_VERSION" -ge "9"; then HAVE_JAVA9="yes" fi if test -z "$HAVE_JAVA8" -a -z "$HAVE_JAVA9"; then AC_MSG_ERROR([JDK8 or newer is required, detected was: $JAVA_VERSION]) fi if ! test -z "$HAVE_JAVA8"; then VERSION_DEFS="-DHAVE_JAVA8" fi if ! test -z "$HAVE_JAVA9"; then VERSION_DEFS="-DHAVE_JAVA9" fi AC_SUBST(VERSION_DEFS) AM_CONDITIONAL([HAVE_JAVA8], test x"${HAVE_JAVA8}" = "xyes") AM_CONDITIONAL([HAVE_JAVA9], test x"${HAVE_JAVA9}" = "xyes") ]) AC_DEFUN_ONCE([IT_FIND_KEYTOOL], [ AC_REQUIRE([IT_CHECK_FOR_JDK]) AC_MSG_CHECKING([for keytool]) AC_ARG_WITH([keytool], [AS_HELP_STRING(--with-keytool,specify location of keytool for signed part of run-netx-dist)], [ if test "${withval}" = "yes" ; then KEYTOOL=${SYSTEM_JDK_DIR}/bin/keytool else KEYTOOL="${withval}" fi ], [ KEYTOOL=${SYSTEM_JDK_DIR}/bin/keytool ]) if ! test -f "${KEYTOOL}"; then AC_PATH_PROG(KEYTOOL, keytool) fi if ! test -f "${KEYTOOL}"; then KEYTOOL="" fi if test -z "${KEYTOOL}" ; then AC_MSG_WARN("keytool not found so signed part of run-netx-dist will fail") fi AC_MSG_RESULT(${KEYTOOL}) AC_SUBST(KEYTOOL) ]) AC_DEFUN_ONCE([IT_FIND_PACK200], [ AC_REQUIRE([IT_CHECK_FOR_JDK]) AC_MSG_CHECKING([for pack200]) AC_ARG_WITH([pack200], [AS_HELP_STRING(--with-pack200,specify location of pack200 for custom part of run-netx-dist)], [ if test "${withval}" = "yes" ; then PACK200=${SYSTEM_JDK_DIR}/bin/pack200 else PACK200="${withval}" fi ], [ PACK200=${SYSTEM_JDK_DIR}/bin/pack200 ]) if ! test -f "${PACK200}"; then AC_PATH_PROG(PACK200, pack200) fi if ! test -f "${PACK200}"; then PACK200="" fi if test -z "${PACK200}" ; then AC_MSG_WARN("pack200 not found so custom part of run-netx-dist will fail") fi AC_MSG_RESULT(${PACK200}) AC_SUBST(PACK200) ]) AC_DEFUN_ONCE([IT_FIND_JARSIGNER], [ AC_REQUIRE([IT_CHECK_FOR_JDK]) AC_MSG_CHECKING([for jarsigner]) AC_ARG_WITH([jarsigner], [AS_HELP_STRING(--with-jarsigner,specify location of jarsigner for signed part od run-netx-dist)], [ if test "${withval}" = "yes" ; then JARSIGNER=${SYSTEM_JDK_DIR}/bin/jarsigner else JARSIGNER="${withval}" fi ], [ JARSIGNER=${SYSTEM_JDK_DIR}/bin/jarsigner ]) if ! test -f "${JARSIGNER}"; then AC_PATH_PROG(JARSIGNER, jarsigner,"") fi if ! test -f "${JARSIGNER}"; then JARSIGNER="" fi if test -z "${JARSIGNER}"; then AC_MSG_WARN("jarsigner not found so signed part of run-netx-dist will fail") fi AC_MSG_RESULT(${JARSIGNER}) AC_SUBST(JARSIGNER) ]) AC_DEFUN([IT_FIND_JAVADOC], [ AC_REQUIRE([IT_CHECK_FOR_JDK]) AC_MSG_CHECKING([for javadoc]) AC_ARG_WITH([javadoc], [AS_HELP_STRING(--with-javadoc,specify location of Java documentation tool (javadoc))], [ JAVADOC="${withval}" ], [ JAVADOC=${SYSTEM_JDK_DIR}/bin/javadoc ]) if ! test -f "${JAVADOC}"; then AC_PATH_PROG(JAVADOC, "${JAVADOC}") fi if test -z "${JAVADOC}"; then AC_PATH_PROG(JAVADOC, "javadoc") fi if test -z "${JAVADOC}"; then AC_PATH_PROG(JAVADOC, "gjdoc") fi if test -z "${JAVADOC}" && test "x$ENABLE_DOCS" = "xyes"; then AC_MSG_ERROR("No Java documentation tool was found.") fi AC_MSG_RESULT(${JAVADOC}) AC_MSG_CHECKING([whether javadoc supports -J options]) CLASS=pkg/Test.java mkdir tmp.$$ cd tmp.$$ mkdir pkg cat << \EOF > $CLASS [/* [#]line __oline__ "configure" */ package pkg; public class Test { /** * Does stuff. * * * @param args arguments from cli. */ public static void main(String[] args) { System.out.println("Hello World!"); } } ] EOF if $JAVADOC -J-Xmx896m pkg >&AS_MESSAGE_LOG_FD 2>&1; then JAVADOC_KNOWS_J_OPTIONS=yes else JAVADOC_KNOWS_J_OPTIONS=no fi cd .. rm -rf tmp.$$ AC_MSG_RESULT([${JAVADOC_KNOWS_J_OPTIONS}]) AC_SUBST(JAVADOC) AC_SUBST(JAVADOC_KNOWS_J_OPTIONS) AM_CONDITIONAL([JAVADOC_SUPPORTS_J_OPTIONS], test x"${JAVADOC_KNOWS_J_OPTIONS}" = "xyes") ]) dnl Checks that sun.applet.AppletViewerPanel is available dnl and public (via the patch in IcedTea6, applet_hole.patch) dnl Can be removed when that is upstream or unneeded AC_DEFUN([IT_CHECK_FOR_SUN_APPLET_ACCESSIBILITY],[ AC_REQUIRE([IT_FIND_JAVAC]) AC_REQUIRE([IT_FIND_JAVA]) AC_CACHE_CHECK([if selected classes, fields and methods from sun.applet are accessible via reflection], it_cv_applet_hole, [ CLASS=TestAppletViewer.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$ cd tmp.$$ cat << \EOF > $CLASS [/* [#]line __oline__ "configure" */ import java.lang.reflect.*; public class TestAppletViewer { public static void main(String[] args) throws Exception { Class ap = Class.forName("sun.applet.AppletPanel"); Class avp = Class.forName("sun.applet.AppletViewerPanel"); Field f1 = ap.getDeclaredField("applet"); Field f2 = avp.getDeclaredField("documentURL"); Method m1 = ap.getDeclaredMethod("run"); Method m2 = ap.getDeclaredMethod("runLoader"); Field f3 = avp.getDeclaredField("baseURL"); } } ] EOF if $JAVAC -cp . $JAVACFLAGS -nowarn $CLASS >&AS_MESSAGE_LOG_FD 2>&1; then if $JAVA -classpath . $BYTECODE >&AS_MESSAGE_LOG_FD 2>&1; then it_cv_applet_hole=yes; else it_cv_applet_hole=no; fi else it_cv_applet_hole=no; fi ]) rm -f $CLASS *.class cd .. rmdir tmp.$$ if test x"${it_cv_applet_hole}" = "xno"; then AC_MSG_ERROR([Some of the checked items is not avaiable. Check logs.]) fi AC_PROVIDE([$0])dnl ]) AC_DEFUN_ONCE([IT_SET_VERSION], [ AC_REQUIRE([IT_OBTAIN_HG_REVISIONS]) AC_REQUIRE([IT_GET_PKGVERSION]) AC_MSG_CHECKING([what version string to use]) if test "x${ICEDTEA_REVISION}" != xnone; then ICEDTEA_REV="+${ICEDTEA_REVISION}" fi if test "x${PKGVERSION}" != "xnone"; then ICEDTEA_PKG=" (${PKGVERSION})" fi FULL_VERSION="${PACKAGE_VERSION}${ICEDTEA_REV}${ICEDTEA_PKG}" AC_MSG_RESULT([${FULL_VERSION}]) AC_SUBST([FULL_VERSION]) ]) dnl Allows you to configure (enable/disable/set path to) the browser dnl REQUIRED Parameters: dnl [browser name, variable to store path, default command to run browser (if not provided, assume it's the same as the browser name] AC_DEFUN([IT_FIND_BROWSER], [ AC_ARG_WITH([$1], [AS_HELP_STRING(--with-$1,specify the location of $1)], [ if test "${withval}" = "no" || test "${withval}" = "yes" || test "${withval}" = "" ; then $2="" elif test -f "${withval}" ; then $2="${withval}" else AC_MSG_CHECKING([for $1]) AC_MSG_RESULT([not found]) AC_MSG_FAILURE([invalid location specified to $1: ${withval}]) fi ], [ withval="yes" ]) if test -f "${$2}"; then AC_MSG_CHECKING([for $1]) AC_MSG_RESULT([${$2}]) elif test "${withval}" != "no"; then if test $# -gt 2; then AC_PATH_TOOL([$2], [$3], [], []) else AC_PATH_TOOL([$2], [$1], [], []) fi else AC_MSG_CHECKING([for $1]) AC_MSG_RESULT([no]) fi ]) AC_DEFUN_ONCE([IT_SET_GLOBAL_BROWSERTESTS_BEHAVIOUR], [ AC_MSG_CHECKING([how browser test will be run]) AC_ARG_WITH([browser-tests], [AS_HELP_STRING([--with-browser-tests], [yes - as defined (default), no - all browser tests will be skipped, one - all "mutiple browsers" test will behave as "one" test, all - all browser tests will be run for all set browsers])], [ BROWSER_SWITCH=${withval} ], [ BROWSER_SWITCH="yes" ]) D_PARAM_PART="-Dmodified.browsers.run" case "$BROWSER_SWITCH" in "yes" ) BROWSER_TESTS_MODIFICATION="" ;; "no" ) BROWSER_TESTS_MODIFICATION="$D_PARAM_PART=ignore" ;; "one" ) BROWSER_TESTS_MODIFICATION="$D_PARAM_PART=one" ;; "all" ) BROWSER_TESTS_MODIFICATION="$D_PARAM_PART=all" ;; *) AC_MSG_ERROR([unknown valkue of with-browser-tests ($BROWSER_SWITCH), so not use (yes) or set yes|no|one|all]) esac AC_MSG_RESULT(${BROWSER_SWITCH}) AC_SUBST(BROWSER_TESTS_MODIFICATION) ]) AC_DEFUN_ONCE([IT_CHECK_FOR_WIX], [ AC_MSG_CHECKING([for a WiX Toolset directory]) AC_ARG_WITH([wix], [AS_HELP_STRING([--with-wix], [WiX Toolset directory (candle.exe, light.exe)])], [ WIX_TOOLSET_DIR=${withval} ]) if test x"${WIX_TOOLSET_DIR}" = x; then SYSTEM_CANDLE_IN_PATH="$(which candle.exe 2>&AS_MESSAGE_LOG_FD)" if test -f "${SYSTEM_CANDLE_IN_PATH}" ; then WIX_TOOLSET_DIR="$(dirname "$(cygpath -m "${SYSTEM_CANDLE_IN_PATH}")")" fi fi if ! test -d "${WIX_TOOLSET_DIR}"; then AC_MSG_WARN("A WiX Toolset directory could not be found. ${WIX_TOOLSET_DIR}") AC_MSG_WARN(["You can build itw, but can not generate MSI"]) AC_MSG_WARN(["you can get WiX tools at http://wixtoolset.org/"]) else AC_MSG_RESULT(${WIX_TOOLSET_DIR}) AC_SUBST(WIX_TOOLSET_DIR) fi ]) AC_DEFUN([IT_CHECK_WITH_KCOV], [ AC_MSG_CHECKING([whether enable rust code coverage]) AC_ARG_WITH([kcov], [AS_HELP_STRING(--with-kcov,location of kcov directory)], [ KCOV="${withval}" ], [ KCOV="no" ]) AC_MSG_RESULT([${KCOV}]) if ! test "x${KCOV}" = "xno" ; then if ! test -d "${KCOV}" ; then AC_MSG_ERROR("kcov schould point to direcotry or - default - no") fi fi AC_SUBST([KCOV]) ]) AC_DEFUN([IT_CHECK_MODULARJDK_ARGS], [ AC_MSG_CHECKING([where to place file with modular switches]) AC_ARG_WITH([modularjdk-file], [AS_HELP_STRING(--with-modularjdk-file,directory where file with arguments for modualr jdk willbe installed)], [ MODULARJDK_ARGS_DIR="${withval}" ], [ MODULARJDK_ARGS_DIR="${bindir}" ]) AC_MSG_RESULT([${MODULARJDK_ARGS_DIR}]) AC_SUBST([MODULARJDK_ARGS_DIR]) ]) icedtea-web-1.8/PaxHeaders.7406/configure0000644000000000000000000000013213441764276015132 xustar0030 mtime=1552410814.461353429 30 atime=1552410879.398201492 30 ctime=1552410886.995183719 icedtea-web-1.8/configure0000755000175000002070000133546613441764276015767 0ustar00jvanekmock00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for icedtea-web 1.8. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: distro-pkg-dev@openjdk.java.net about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='icedtea-web' PACKAGE_TARNAME='icedtea-web' PACKAGE_VERSION='1.8' PACKAGE_STRING='icedtea-web 1.8' PACKAGE_BUGREPORT='distro-pkg-dev@openjdk.java.net' PACKAGE_URL='http://icedtea.classpath.org/wiki/IcedTea-Web' ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS bashcompdir WIXGEN_AVAILABLE WIXGEN_JAR WITH_WIXGEN_FALSE WITH_WIXGEN_TRUE WIX_TOOLSET_DIR HAVE_MSLINKS_FALSE HAVE_MSLINKS_TRUE MSLINKS_JAR HAVE_TAGSOUP_FALSE HAVE_TAGSOUP_TRUE TAGSOUP_JAR ASM_AVAILABLE ASM_JAR WITH_ASM_FALSE WITH_ASM_TRUE JACOCO_AVAILABLE JACOCO_JAR WITH_JACOCO_FALSE WITH_JACOCO_TRUE HAMCREST_AVAILABLE HAMCREST_JAR WITH_HAMCREST_FALSE WITH_HAMCREST_TRUE JUNIT_AVAILABLE JUNIT_JAR WITH_JUNIT_FALSE WITH_JUNIT_TRUE RHINO_AVAILABLE RHINO_JAR WITH_RHINO_FALSE WITH_RHINO_TRUE WITH_XSLTPROC_FALSE WITH_XSLTPROC_TRUE BROWSER_TESTS_MODIFICATION EPIPHANY MIDORI OPERA CHROMIUM CHROME FIREFOX XSLTPROC GLIB2_V_216_LIBS GLIB2_V_216_CFLAGS SUN_APPLET_APPLETIMAGEREF SUN_NET_WWW_PROTOCOL_HTTP_HANDLER COM_SUN_JNDI_TOOLKIT_URL_URLUTIL SUN_AWT_WEMBEDDEDFRAME SUN_AWT_X11_XEMBEDDEDFRAME SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION SUN_MISC_LAUNCHER SUN_MISC_JARINDEX HEXDUMPENCODER SUN_SECURITY_ACTION_GETPROPERTYACTION SUN_SECURITY_X509_X500NAME SUN_SECURITY_UTIL_HOSTNAMECHECKER SUN_SECURITY_UTIL_SECURITYCONSTANTS JAVA_NET_COOKIEHANDLER JAVA_NET_HTTPCOOKIE JAVA_NET_COOKIEMANAGER JAVA_UTIL_JAR_PACK200 ENABLE_PLUGINJAR_FALSE ENABLE_PLUGINJAR_TRUE MOZILLA_VERSION_COLLAPSED ENABLE_NATIVE_PLUGIN_FALSE ENABLE_NATIVE_PLUGIN_TRUE MOZILLA_LIBS MOZILLA_CFLAGS GLIB_LIBS GLIB_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC FULL_VERSION PKGVERSION HAS_PKGVERSION_FALSE HAS_PKGVERSION_TRUE HAS_ICEDTEA_REVISION_FALSE HAS_ICEDTEA_REVISION_TRUE ICEDTEA_REVISION HG PACK200 JARSIGNER KEYTOOL JAVADOC_SUPPORTS_J_OPTIONS_FALSE JAVADOC_SUPPORTS_J_OPTIONS_TRUE JAVADOC_KNOWS_J_OPTIONS JAVADOC HAVE_JAVA9_FALSE HAVE_JAVA9_TRUE HAVE_JAVA8_FALSE HAVE_JAVA8_TRUE VERSION_DEFS JAVA SYSTEM_JRE_DIR ECJ_JAR JAR_KNOWS_J_OPTIONS JAR_ACCEPTS_STDIN_LIST JAR_KNOWS_ATFILE JAR USING_ECJ ECJ JAVAC SYSTEM_JDK_DIR ZIP GCJ ITW_LIBS KCOV WINDOWS_OR_INCLUDE_BATS_FALSE WINDOWS_OR_INCLUDE_BATS_TRUE WINDOWS_FALSE WINDOWS_TRUE LINUX_FALSE LINUX_TRUE ENABLE_NATIVE_LAUNCHERS_FALSE ENABLE_NATIVE_LAUNCHERS_TRUE CARGO RUSTC ENABLE_SHELL_LAUNCHERS_FALSE ENABLE_SHELL_LAUNCHERS_TRUE MODULARJDK_ARGS_DIR BIN_BASH ENABLE_WHITELIST_FALSE ENABLE_WHITELIST_TRUE ENABLE_DOCS_FALSE ENABLE_DOCS_TRUE SRC_DIR_HARDLINKABLE_FALSE SRC_DIR_HARDLINKABLE_TRUE CP_SUPPORTS_REFLINK_FALSE CP_SUPPORTS_REFLINK_TRUE ARCHFLAG ARCH_PREFIX JRE_ARCH_DIR INSTALL_ARCH_DIR BUILD_ARCH_DIR host_os host_vendor host_cpu host build_os build_vendor build_cpu build abs_top_srcdir abs_top_builddir MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_docs enable_whitelist_processing with_modularjdk_file enable_shell_launchers enable_bats_on_linux with_kcov with_itw_libs with_gcj with_jdk_home with_javac with_ecj with_jar with_ecj_jar with_jre_home with_java with_javadoc with_keytool with_jarsigner with_pack200 with_pkgversion enable_native_plugin enable_dependency_tracking enable_pluginjar with_firefox with_chrome with_chromium with_opera with_midori with_epiphany with_browser_tests with_rhino with_junit with_hamcrest with_jacoco with_asm with_tagsoup with_mslinks with_wix with_wixgen ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GLIB_CFLAGS GLIB_LIBS MOZILLA_CFLAGS MOZILLA_LIBS GLIB2_V_216_CFLAGS GLIB2_V_216_LIBS bashcompdir' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures icedtea-web 1.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/icedtea-web] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of icedtea-web 1.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-maintainer-mode disable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-docs Disable generation of documentation --enable-whitelist-processing Enable whitelist filter on directory name when processing, compiling and running reproducers. Otherwise filter on testcase name when running reproducers --enable-shell-launchers Enable build of legacy shell launchers --enable-bats-on-linux enable generation of windows legacy bat launchers during linux build with legacy shell launchers. This is for subjects, who wish to do an custom build for windows and linuxes/mac users together. Preparation of rest of the ITW then require a bit of love. This switch is not exactly supported option. --disable-native-plugin Disable compilation of browser plugin --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-pluginjar Disable compilation of plugin.jar for javaws -html Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-modularjdk-file directory where file with arguments for modualr jdk willbe installed --with-kcov location of kcov directory --with-itw-libs set way of searching system for jar depndencies - BUNDLED, for portable build (in application space); DISTRIBUTION, for linux (in installed path); BOTH, for both usages (should be for testing only --with-gcj location of gcj for natively compiling ecj --with-jdk-home jdk home directory (default is first predefined JDK found) --with-javac bytecode compilation with javac --with-ecj bytecode compilation with ecj --with-jar specify location of Java archive tool (jar) --with-ecj-jar specify location of the ECJ jar --with-jre-home jre home directory (default is the JRE under the JDK) --with-java specify location of the Java 1.8 or better VM --with-javadoc specify location of Java documentation tool (javadoc) --with-keytool specify location of keytool for signed part of run-netx-dist --with-jarsigner specify location of jarsigner for signed part od run-netx-dist --with-pack200 specify location of pack200 for custom part of run-netx-dist --with-pkgversion=PKG Use PKG in the version string in addition to "IcedTea" --with-firefox specify the location of firefox --with-chrome specify the location of chrome --with-chromium specify the location of chromium --with-opera specify the location of opera --with-midori specify the location of midori --with-epiphany specify the location of epiphany --with-browser-tests yes - as defined (default), no - all browser tests will be skipped, one - all "mutiple browsers" test will behave as "one" test, all - all browser tests will be run for all set browsers --with-rhino specify location of the rhino jar --with-junit specify location of the junit jar --with-hamcrest specify location of the hamcrest jar --with-jacoco specify location of the jacoco jar --with-asm specify location of the asm jar --with-tagsoup tagsoup.jar --with-mslinks mslinks.jar --with-wix WiX Toolset directory (candle.exe, light.exe) --with-wixgen specify location of the wixgen jar Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config MOZILLA_CFLAGS C compiler flags for MOZILLA, overriding pkg-config MOZILLA_LIBS linker flags for MOZILLA, overriding pkg-config GLIB2_V_216_CFLAGS C compiler flags for GLIB2_V_216, overriding pkg-config GLIB2_V_216_LIBS linker flags for GLIB2_V_216, overriding pkg-config bashcompdir value of completionsdir for bash-completion, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . icedtea-web home page: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF icedtea-web configure 1.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by icedtea-web $as_me 1.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='icedtea-web' VERSION='1.8' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a pax tar archive" >&5 $as_echo_n "checking how to create a pax tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_pax-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=posix -chf - "'"$$tardir"' am__tar_="$_am_tar --format=posix -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x pax -w "$$tardir"' am__tar_='pax -L -x pax -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H pax -L' am__tar_='find "$tardir" -print | cpio -o -H pax -L' am__untar='cpio -i -H pax -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_pax}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_pax+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_pax=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_pax" >&5 $as_echo "$am_cv_prog_tar_pax" >&6; } # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_config_files="$ac_config_files Makefile netx.manifest" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Older automake doesn't generate these correctly abs_top_builddir=`pwd -P` abs_top_srcdir=`dirname $0` cd $abs_top_srcdir abs_top_srcdir=`pwd` cd $abs_top_builddir # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac case "${host_cpu}" in x86_64) BUILD_ARCH_DIR=amd64 INSTALL_ARCH_DIR=amd64 JRE_ARCH_DIR=amd64 ARCHFLAG="-m64" ;; i?86) BUILD_ARCH_DIR=i586 INSTALL_ARCH_DIR=i386 JRE_ARCH_DIR=i386 ARCH_PREFIX=${LINUX32} ARCHFLAG="-m32" ;; alpha*) BUILD_ARCH_DIR=alpha INSTALL_ARCH_DIR=alpha JRE_ARCH_DIR=alpha ;; arm*) BUILD_ARCH_DIR=arm INSTALL_ARCH_DIR=arm JRE_ARCH_DIR=arm ;; mips) BUILD_ARCH_DIR=mips INSTALL_ARCH_DIR=mips JRE_ARCH_DIR=mips ;; mipsel) BUILD_ARCH_DIR=mipsel INSTALL_ARCH_DIR=mipsel JRE_ARCH_DIR=mipsel ;; powerpc) BUILD_ARCH_DIR=ppc INSTALL_ARCH_DIR=ppc JRE_ARCH_DIR=ppc ARCH_PREFIX=${LINUX32} ARCHFLAG="-m32" ;; powerpc64) BUILD_ARCH_DIR=ppc64 INSTALL_ARCH_DIR=ppc64 JRE_ARCH_DIR=ppc64 ARCHFLAG="-m64" ;; sparc) BUILD_ARCH_DIR=sparc INSTALL_ARCH_DIR=sparc JRE_ARCH_DIR=sparc ARCH_PREFIX=${LINUX32} ARCHFLAG="-m32" ;; sparc64) BUILD_ARCH_DIR=sparcv9 INSTALL_ARCH_DIR=sparcv9 JRE_ARCH_DIR=sparc64 ARCHFLAG="-m64" ;; s390) BUILD_ARCH_DIR=s390 INSTALL_ARCH_DIR=s390 JRE_ARCH_DIR=s390 ARCH_PREFIX=${LINUX32} ARCHFLAG="-m31" ;; s390x) BUILD_ARCH_DIR=s390x INSTALL_ARCH_DIR=s390x JRE_ARCH_DIR=s390x ARCHFLAG="-m64" ;; sh*) BUILD_ARCH_DIR=sh INSTALL_ARCH_DIR=sh JRE_ARCH_DIR=sh ;; *) BUILD_ARCH_DIR=`uname -m` INSTALL_ARCH_DIR=$BUILD_ARCH_DIR JRE_ARCH_DIR=$INSTALL_ARCH_DIR ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if cp supports --reflink" >&5 $as_echo_n "checking if cp supports --reflink... " >&6; } if ${it_cv_reflink+:} false; then : $as_echo_n "(cached) " >&6 else touch tmp.$$ if cp --reflink=auto tmp.$$ tmp2.$$ >&5 2>&1; then it_cv_reflink=yes; else it_cv_reflink=no; fi rm -f tmp.$$ tmp2.$$ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_reflink" >&5 $as_echo "$it_cv_reflink" >&6; } if test x"${it_cv_reflink}" = "xyes"; then CP_SUPPORTS_REFLINK_TRUE= CP_SUPPORTS_REFLINK_FALSE='#' else CP_SUPPORTS_REFLINK_TRUE='#' CP_SUPPORTS_REFLINK_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can hard link rather than copy from ${abs_top_srcdir}" >&5 $as_echo_n "checking if we can hard link rather than copy from ${abs_top_srcdir}... " >&6; } if ${it_cv_hardlink_src+:} false; then : $as_echo_n "(cached) " >&6 else if cp -l ${abs_top_srcdir}/README tmp.$$ >&5 2>&1; then it_cv_hardlink_src=yes; else it_cv_hardlink_src=no; fi rm -f tmp.$$ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_hardlink_src" >&5 $as_echo "$it_cv_hardlink_src" >&6; } if test x"${it_cv_hardlink_src}" = "xyes"; then SRC_DIR_HARDLINKABLE_TRUE= SRC_DIR_HARDLINKABLE_FALSE='#' else SRC_DIR_HARDLINKABLE_TRUE='#' SRC_DIR_HARDLINKABLE_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build documentation" >&5 $as_echo_n "checking whether to build documentation... " >&6; } # Check whether --enable-docs was given. if test "${enable_docs+set}" = set; then : enableval=$enable_docs; ENABLE_DOCS="${enableval}" else ENABLE_DOCS='yes' fi if test x$ENABLE_DOCS = xyes; then ENABLE_DOCS_TRUE= ENABLE_DOCS_FALSE='#' else ENABLE_DOCS_TRUE='#' ENABLE_DOCS_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ENABLE_DOCS}" >&5 $as_echo "${ENABLE_DOCS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to filter by whitelisting on directory name when processing, compiling and running reproducers" >&5 $as_echo_n "checking whether to filter by whitelisting on directory name when processing, compiling and running reproducers... " >&6; } # Check whether --enable-whitelist-processing was given. if test "${enable_whitelist_processing+set}" = set; then : enableval=$enable_whitelist_processing; ENABLE_WHITELIST="${enableval}" else ENABLE_WHITELIST='no' fi if test x$ENABLE_WHITELIST = xyes; then ENABLE_WHITELIST_TRUE= ENABLE_WHITELIST_FALSE='#' else ENABLE_WHITELIST_TRUE='#' ENABLE_WHITELIST_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ENABLE_WHITELIST}" >&5 $as_echo "${ENABLE_WHITELIST}" >&6; } # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_BIN_BASH+:} false; then : $as_echo_n "(cached) " >&6 else case $BIN_BASH in [\\/]* | ?:[\\/]*) ac_cv_path_BIN_BASH="$BIN_BASH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_BIN_BASH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi BIN_BASH=$ac_cv_path_BIN_BASH if test -n "$BIN_BASH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BIN_BASH" >&5 $as_echo "$BIN_BASH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$BIN_BASH" = x ; then as_fn_error $? "/bin/bash is used in runtime and for about generation. Dying sooner rather then later" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to place file with modular switches" >&5 $as_echo_n "checking where to place file with modular switches... " >&6; } # Check whether --with-modularjdk-file was given. if test "${with_modularjdk_file+set}" = set; then : withval=$with_modularjdk_file; MODULARJDK_ARGS_DIR="${withval}" else MODULARJDK_ARGS_DIR="${bindir}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${MODULARJDK_ARGS_DIR}" >&5 $as_echo "${MODULARJDK_ARGS_DIR}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build legacy shell launchers" >&5 $as_echo_n "checking whether build legacy shell launchers... " >&6; } # Check whether --enable-shell-launchers was given. if test "${enable_shell_launchers+set}" = set; then : enableval=$enable_shell_launchers; ENABLE_SHELL_LAUNCHERS="${enableval}" else ENABLE_SHELL_LAUNCHERS='no' fi if test x$ENABLE_SHELL_LAUNCHERS = xyes; then ENABLE_SHELL_LAUNCHERS_TRUE= ENABLE_SHELL_LAUNCHERS_FALSE='#' else ENABLE_SHELL_LAUNCHERS_TRUE='#' ENABLE_SHELL_LAUNCHERS_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ENABLE_SHELL_LAUNCHERS}" >&5 $as_echo "${ENABLE_SHELL_LAUNCHERS}" >&6; } # Extract the first word of "rustc", so it can be a program name with args. set dummy rustc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RUSTC+:} false; then : $as_echo_n "(cached) " >&6 else case $RUSTC in [\\/]* | ?:[\\/]*) ac_cv_path_RUSTC="$RUSTC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_RUSTC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi RUSTC=$ac_cv_path_RUSTC if test -n "$RUSTC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUSTC" >&5 $as_echo "$RUSTC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$RUSTC" = x ; then if test x${ENABLE_SHELL_LAUNCHERS} = xno ; then as_fn_error $? "rust is used to compile launchers. No go" "$LINENO" 5 else echo "rust is used to compile launchers, is missing but you have enable-shell-launchers as yes, continuing with UNMAINTAINED shell launchers only" fi else # Extract the first word of "cargo", so it can be a program name with args. set dummy cargo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CARGO+:} false; then : $as_echo_n "(cached) " >&6 else case $CARGO in [\\/]* | ?:[\\/]*) ac_cv_path_CARGO="$CARGO" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CARGO="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CARGO=$ac_cv_path_CARGO if test -n "$CARGO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CARGO" >&5 $as_echo "$CARGO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$CARGO" = x ; then if test x${ENABLE_SHELL_LAUNCHERS} = xno ; then as_fn_error $? "cargo is used to call rustc for launchers. No go" "$LINENO" 5 else echo "cargo is used to manage launchers sources, is missing but you have enable-shell-launchers as yes, continuing with UNMAINTAINED shell launchers only" fi fi fi if test ! x"$RUSTC" = x -a ! x"$CARGO" = x; then ENABLE_NATIVE_LAUNCHERS_TRUE= ENABLE_NATIVE_LAUNCHERS_FALSE='#' else ENABLE_NATIVE_LAUNCHERS_TRUE='#' ENABLE_NATIVE_LAUNCHERS_FALSE= fi build_linux=no build_windows=no case "${host_os}" in linux*) build_linux=yes ;; cygwin*) build_windows=yes ;; *) as_fn_error $? "\"OS $host_os is not supported\"" "$LINENO" 5 ;; esac if test "$build_linux" = "yes"; then LINUX_TRUE= LINUX_FALSE='#' else LINUX_TRUE='#' LINUX_FALSE= fi if test "$build_windows" = "yes"; then WINDOWS_TRUE= WINDOWS_FALSE='#' else WINDOWS_TRUE='#' WINDOWS_FALSE= fi # the images built with this switch on linux, are not exactly windows friendly (see removed jars in make log, which are made in favor of clean linux build) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to include also bat lunchers during linux build" >&5 $as_echo_n "checking whether to include also bat lunchers during linux build... " >&6; } # Check whether --enable-bats-on-linux was given. if test "${enable_bats_on_linux+set}" = set; then : enableval=$enable_bats_on_linux; WINDOWS_OR_INCLUDE_BATS="${enableval}" else WINDOWS_OR_INCLUDE_BATS='no' fi if test "x$WINDOWS_OR_INCLUDE_BATS" = "xyes" -o "$build_windows" = "yes" ; then WINDOWS_OR_INCLUDE_BATS_TRUE= WINDOWS_OR_INCLUDE_BATS_FALSE='#' else WINDOWS_OR_INCLUDE_BATS_TRUE='#' WINDOWS_OR_INCLUDE_BATS_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${WINDOWS_OR_INCLUDE_BATS}" >&5 $as_echo "${WINDOWS_OR_INCLUDE_BATS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether enable rust code coverage" >&5 $as_echo_n "checking whether enable rust code coverage... " >&6; } # Check whether --with-kcov was given. if test "${with_kcov+set}" = set; then : withval=$with_kcov; KCOV="${withval}" else KCOV="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${KCOV}" >&5 $as_echo "${KCOV}" >&6; } if ! test "x${KCOV}" = "xno" ; then if ! test -d "${KCOV}" ; then as_fn_error $? "\"kcov schould point to direcotry or - default - no\"" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to search for libraries in native launchers" >&5 $as_echo_n "checking how to search for libraries in native launchers... " >&6; } # Check whether --with-itw-libs was given. if test "${with_itw_libs+set}" = set; then : withval=$with_itw_libs; ITW_LIBS="${withval}" else ITW_LIBS='none' fi if test "x$build_windows" = xyes ; then if test x"$ITW_LIBS" = xnone -o x"$ITW_LIBS" = x; then ITW_LIBS="BUNDLED" echo -n "On Windows, presetting missing --with-itw-libs ITW_LIBS to $ITW_LIBS. " echo -n "On Windows, DISTRIBUTION nor BOTH do not have much sense... " fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ITW_LIBS}" >&5 $as_echo "${ITW_LIBS}" >&6; } if test x"$ITW_LIBS" = xnone -o x"$ITW_LIBS" = x; then as_fn_error $? "missing --with-itw-libs; mandatory on linux. Use BUNDLED, DISTRIBUTION or BOTH. use BOTH with care. " "$LINENO" 5 fi if test ! "$ITW_LIBS" = BUNDLED -a ! "$ITW_LIBS" = DISTRIBUTION -a ! "$ITW_LIBS" = BOTH; then as_fn_error $? "incorrect --with-itw-libs; mandatory are BUNDLED, DISTRIBUTION or BOTH " "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile ecj natively" >&5 $as_echo_n "checking whether to compile ecj natively... " >&6; } # Check whether --with-gcj was given. if test "${with_gcj+set}" = set; then : withval=$with_gcj; GCJ="${withval}" else GCJ="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${GCJ}" >&5 $as_echo "${GCJ}" >&6; } if test "x${GCJ}" = xyes; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcj", so it can be a program name with args. set dummy ${ac_tool_prefix}gcj; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GCJ+:} false; then : $as_echo_n "(cached) " >&6 else case $GCJ in [\\/]* | ?:[\\/]*) ac_cv_path_GCJ="$GCJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GCJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GCJ=$ac_cv_path_GCJ if test -n "$GCJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCJ" >&5 $as_echo "$GCJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_GCJ"; then ac_pt_GCJ=$GCJ # Extract the first word of "gcj", so it can be a program name with args. set dummy gcj; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_GCJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_GCJ in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_GCJ="$ac_pt_GCJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_GCJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_GCJ=$ac_cv_path_ac_pt_GCJ if test -n "$ac_pt_GCJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GCJ" >&5 $as_echo "$ac_pt_GCJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_GCJ" = x; then GCJ="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac GCJ=$ac_pt_GCJ fi else GCJ="$ac_cv_path_GCJ" fi fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}zip", so it can be a program name with args. set dummy ${ac_tool_prefix}zip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ZIP+:} false; then : $as_echo_n "(cached) " >&6 else case $ZIP in [\\/]* | ?:[\\/]*) ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ZIP=$ac_cv_path_ZIP if test -n "$ZIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 $as_echo "$ZIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_ZIP"; then ac_pt_ZIP=$ZIP # Extract the first word of "zip", so it can be a program name with args. set dummy zip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_ZIP+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_ZIP in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_ZIP="$ac_pt_ZIP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_ZIP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_ZIP=$ac_cv_path_ac_pt_ZIP if test -n "$ac_pt_ZIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ZIP" >&5 $as_echo "$ac_pt_ZIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_ZIP" = x; then ZIP="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac ZIP=$ac_pt_ZIP fi else ZIP="$ac_cv_path_ZIP" fi if test x"$ZIP" = x ; then as_fn_error $? "zip program not found in PATH" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a JDK home directory" >&5 $as_echo_n "checking for a JDK home directory... " >&6; } # Check whether --with-jdk-home was given. if test "${with_jdk_home+set}" = set; then : withval=$with_jdk_home; if test "x${withval}" = xyes then SYSTEM_JDK_DIR= elif test "x${withval}" = xno then SYSTEM_JDK_DIR= else SYSTEM_JDK_DIR=${withval} fi else SYSTEM_JDK_DIR= fi if test -z "${SYSTEM_JDK_DIR}"; then if test -z "$WINDOWS_TRUE"; then : # does not work, use which instead # AC_CHECK_PROGS([SYSTEM_JAVA_IN_PATH], [java.exe]) SYSTEM_JAVA_IN_PATH=$(which javac 2>&5) if test x"${SYSTEM_JAVA_IN_PATH}" != x ; then SYSTEM_JDK_DIR=$(dirname $(dirname ${SYSTEM_JAVA_IN_PATH})) fi else for dir in /etc/alternatives/java_sdk \ /usr/lib/jvm/java-1.9.0-openjdk \ /usr/lib/jvm/icedtea9 \ /usr/lib/jvm/java-9-openjdk \ /usr/lib/jvm/java-1.8.0-openjdk \ /usr/lib/jvm/icedtea8 \ /usr/lib/jvm/java-8-openjdk \ /usr/lib/jvm/java-icedtea \ /usr/lib/jvm/java-openjdk \ /usr/lib/jvm/openjdk \ /usr/lib/jvm/cacao \ /usr/lib/jvm/jamvm ; do if test -d $dir; then SYSTEM_JDK_DIR=$dir break fi done fi fi if ! test -d "${SYSTEM_JDK_DIR}"; then as_fn_error $? "\"A JDK home directory could not be found. ${SYSTEM_JDK_DIR}\"" "$LINENO" 5 else if test -z "$WINDOWS_TRUE"; then : SYSTEM_JDK_DIR=$(cygpath -m ${SYSTEM_JDK_DIR}) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${SYSTEM_JDK_DIR}" >&5 $as_echo "${SYSTEM_JDK_DIR}" >&6; } else READ=`readlink -f ${SYSTEM_JDK_DIR}` { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${SYSTEM_JDK_DIR} (link to ${READ})" >&5 $as_echo "${SYSTEM_JDK_DIR} (link to ${READ})" >&6; } fi fi JAVAC=${SYSTEM_JDK_DIR}/bin/javac # Check whether --with-javac was given. if test "${with_javac+set}" = set; then : withval=$with_javac; if test "x${withval}" != x && test "x${withval}" != xyes && test "x${withval}" != xno; then if test "x${withval}" != x; then if test -f "${withval}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for javac" >&5 $as_echo_n "checking for javac... " >&6; } JAVAC="${withval}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JAVAC}" >&5 $as_echo "${JAVAC}" >&6; } else # Extract the first word of ""${withval}"", so it can be a program name with args. set dummy "${withval}"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVAC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVAC=$ac_cv_path_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi else # Extract the first word of ""javac"", so it can be a program name with args. set dummy "javac"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVAC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVAC=$ac_cv_path_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi else if test "x${withval}" != xno; then if test "x" != x; then if test -f ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for javac" >&5 $as_echo_n "checking for javac... " >&6; } JAVAC="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JAVAC}" >&5 $as_echo "${JAVAC}" >&6; } else # Extract the first word of """", so it can be a program name with args. set dummy ""; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVAC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVAC=$ac_cv_path_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi else # Extract the first word of ""javac"", so it can be a program name with args. set dummy "javac"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVAC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVAC=$ac_cv_path_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi fi else if test "x" != x; then if test -f ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for javac" >&5 $as_echo_n "checking for javac... " >&6; } JAVAC="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JAVAC}" >&5 $as_echo "${JAVAC}" >&6; } else # Extract the first word of """", so it can be a program name with args. set dummy ""; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVAC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVAC=$ac_cv_path_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi else # Extract the first word of ""javac"", so it can be a program name with args. set dummy "javac"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVAC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVAC=$ac_cv_path_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi # Check whether --with-ecj was given. if test "${with_ecj+set}" = set; then : withval=$with_ecj; if test "x${withval}" != x && test "x${withval}" != xyes && test "x${withval}" != xno; then if test "x${withval}" != x; then if test -f "${withval}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ecj" >&5 $as_echo_n "checking for ecj... " >&6; } ECJ="${withval}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ECJ}" >&5 $as_echo "${ECJ}" >&6; } else # Extract the first word of ""${withval}"", so it can be a program name with args. set dummy "${withval}"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi else # Extract the first word of ""ecj"", so it can be a program name with args. set dummy "ecj"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "${ECJ}"; then # Extract the first word of ""ecj-3.1"", so it can be a program name with args. set dummy "ecj-3.1"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${ECJ}"; then # Extract the first word of ""ecj-3.2"", so it can be a program name with args. set dummy "ecj-3.2"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${ECJ}"; then # Extract the first word of ""ecj-3.3"", so it can be a program name with args. set dummy "ecj-3.3"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi else if test "x${withval}" != xno; then if test "x" != x; then if test -f ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ecj" >&5 $as_echo_n "checking for ecj... " >&6; } ECJ="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ECJ}" >&5 $as_echo "${ECJ}" >&6; } else # Extract the first word of """", so it can be a program name with args. set dummy ""; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi else # Extract the first word of ""ecj"", so it can be a program name with args. set dummy "ecj"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "${ECJ}"; then # Extract the first word of ""ecj-3.1"", so it can be a program name with args. set dummy "ecj-3.1"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${ECJ}"; then # Extract the first word of ""ecj-3.2"", so it can be a program name with args. set dummy "ecj-3.2"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${ECJ}"; then # Extract the first word of ""ecj-3.3"", so it can be a program name with args. set dummy "ecj-3.3"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi fi fi else if test "x" != x; then if test -f ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ecj" >&5 $as_echo_n "checking for ecj... " >&6; } ECJ="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ECJ}" >&5 $as_echo "${ECJ}" >&6; } else # Extract the first word of """", so it can be a program name with args. set dummy ""; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi else # Extract the first word of ""ecj"", so it can be a program name with args. set dummy "ecj"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "${ECJ}"; then # Extract the first word of ""ecj-3.1"", so it can be a program name with args. set dummy "ecj-3.1"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${ECJ}"; then # Extract the first word of ""ecj-3.2"", so it can be a program name with args. set dummy "ecj-3.2"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${ECJ}"; then # Extract the first word of ""ecj-3.3"", so it can be a program name with args. set dummy "ecj-3.3"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ECJ+:} false; then : $as_echo_n "(cached) " >&6 else case $ECJ in [\\/]* | ?:[\\/]*) ac_cv_path_ECJ="$ECJ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ECJ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ECJ=$ac_cv_path_ECJ if test -n "$ECJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ECJ" >&5 $as_echo "$ECJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi fi if test "x${JAVAC}" = "x"; then if test "x{ECJ}" != "x"; then JAVAC="${ECJ} -nowarn" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we are using ecj as javac" >&5 $as_echo_n "checking if we are using ecj as javac... " >&6; } if ${it_cv_ecj+:} false; then : $as_echo_n "(cached) " >&6 else if $JAVAC -version 2>&1| grep '^Eclipse' >&5 ; then it_cv_ecj=yes; else it_cv_ecj=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_ecj" >&5 $as_echo "$it_cv_ecj" >&6; } USING_ECJ=$it_cv_ecj { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jar" >&5 $as_echo_n "checking for jar... " >&6; } # Check whether --with-jar was given. if test "${with_jar+set}" = set; then : withval=$with_jar; JAR="${withval}" else JAR=${SYSTEM_JDK_DIR}/bin/jar fi if ! test -f "${JAR}"; then # Extract the first word of ""${JAR}"", so it can be a program name with args. set dummy "${JAR}"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAR+:} false; then : $as_echo_n "(cached) " >&6 else case $JAR in [\\/]* | ?:[\\/]*) ac_cv_path_JAR="$JAR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAR=$ac_cv_path_JAR if test -n "$JAR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5 $as_echo "$JAR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${JAR}"; then # Extract the first word of ""gjar"", so it can be a program name with args. set dummy "gjar"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAR+:} false; then : $as_echo_n "(cached) " >&6 else case $JAR in [\\/]* | ?:[\\/]*) ac_cv_path_JAR="$JAR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAR=$ac_cv_path_JAR if test -n "$JAR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5 $as_echo "$JAR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${JAR}"; then # Extract the first word of ""jar"", so it can be a program name with args. set dummy "jar"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAR+:} false; then : $as_echo_n "(cached) " >&6 else case $JAR in [\\/]* | ?:[\\/]*) ac_cv_path_JAR="$JAR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAR=$ac_cv_path_JAR if test -n "$JAR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5 $as_echo "$JAR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${JAR}"; then as_fn_error $? "\"No Java archive tool was found.\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JAR}" >&5 $as_echo "${JAR}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether jar supports @ argument" >&5 $as_echo_n "checking whether jar supports @ argument... " >&6; } touch _config.txt cat >_config.list <&5 2>&1; then JAR_KNOWS_ATFILE=1 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else JAR_KNOWS_ATFILE= { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether jar supports stdin file arguments" >&5 $as_echo_n "checking whether jar supports stdin file arguments... " >&6; } if cat _config.list | $JAR cf@ _config.jar >&5 2>&1; then JAR_ACCEPTS_STDIN_LIST=1 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else JAR_ACCEPTS_STDIN_LIST= { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f _config.list _config.jar { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether jar supports -J options at the end" >&5 $as_echo_n "checking whether jar supports -J options at the end... " >&6; } if $JAR cf _config.jar _config.txt -J-Xmx896m >&5 2>&1; then JAR_KNOWS_J_OPTIONS=1 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else JAR_KNOWS_J_OPTIONS= { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f _config.txt _config.jar { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ecj JAR file" >&5 $as_echo_n "checking for an ecj JAR file... " >&6; } # Check whether --with-ecj-jar was given. if test "${with_ecj_jar+set}" = set; then : withval=$with_ecj_jar; if test -f "${withval}"; then ECJ_JAR="${withval}" fi else ECJ_JAR= fi if test -z "${ECJ_JAR}"; then for jar in /usr/share/java/eclipse-ecj.jar \ /usr/share/java/ecj.jar \ /usr/share/eclipse-ecj-3.{2,3,4,5}/lib/ecj.jar; do if test -e $jar; then ECJ_JAR=$jar break fi done if test -z "${ECJ_JAR}"; then ECJ_JAR=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ECJ_JAR}" >&5 $as_echo "${ECJ_JAR}" >&6; } if test "x${JAVAC}" = x && test "x${ECJ_JAR}" = "xno" ; then as_fn_error $? "cannot find a Java compiler or ecj JAR file, try --with-javac, --with-ecj or --with-ecj-jar" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a JRE home directory" >&5 $as_echo_n "checking for a JRE home directory... " >&6; } # Check whether --with-jre-home was given. if test "${with_jre_home+set}" = set; then : withval=$with_jre_home; SYSTEM_JRE_DIR=${withval} else SYSTEM_JRE_DIR= fi if test -z "${SYSTEM_JRE_DIR}" ; then SYSTEM_JRE_DIR_EIGHT_AND_LESS="${SYSTEM_JDK_DIR}/jre" SYSTEM_JRE_DIR_MODULAR="${SYSTEM_JDK_DIR}" # try jdk8 or older compliant if test -d "${SYSTEM_JRE_DIR_EIGHT_AND_LESS}" -a -e "${SYSTEM_JRE_DIR_EIGHT_AND_LESS}/bin/java" -a -e "${SYSTEM_JRE_DIR_EIGHT_AND_LESS}/lib/rt.jar" ; then SYSTEM_JRE_DIR="${SYSTEM_JRE_DIR_EIGHT_AND_LESS}" fi # still not found? if test -z "${SYSTEM_JRE_DIR}" ; then # try modular, jdk9 or higher compliant if test -d "${SYSTEM_JRE_DIR_MODULAR}" -a -f "${SYSTEM_JRE_DIR_MODULAR}/bin/java" -a -e "${SYSTEM_JRE_DIR_MODULAR}/lib/modules" ; then SYSTEM_JRE_DIR="${SYSTEM_JRE_DIR_MODULAR}" fi fi fi if ! test -d "${SYSTEM_JRE_DIR}"; then as_fn_error $? "\"A JRE home directory could not be found. ${SYSTEM_JRE_DIR}\"" "$LINENO" 5 else READ=`readlink -f ${SYSTEM_JRE_DIR}` { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${SYSTEM_JRE_DIR} (link to ${READ})" >&5 $as_echo "${SYSTEM_JRE_DIR} (link to ${READ})" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Java virtual machine" >&5 $as_echo_n "checking for a Java virtual machine... " >&6; } # Check whether --with-java was given. if test "${with_java+set}" = set; then : withval=$with_java; JAVA="${withval}" else JAVA="${SYSTEM_JRE_DIR}/bin/java" fi if ! test -f "${JAVA}"; then # Extract the first word of ""${JAVA}"", so it can be a program name with args. set dummy "${JAVA}"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVA+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVA in [\\/]* | ?:[\\/]*) ac_cv_path_JAVA="$JAVA" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVA="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVA=$ac_cv_path_JAVA if test -n "$JAVA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5 $as_echo "$JAVA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${JAVA}"; then # Extract the first word of ""java"", so it can be a program name with args. set dummy "java"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVA+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVA in [\\/]* | ?:[\\/]*) ac_cv_path_JAVA="$JAVA" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVA="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVA=$ac_cv_path_JAVA if test -n "$JAVA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5 $as_echo "$JAVA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${JAVA}"; then as_fn_error $? "\"A 1.8+-compatible Java VM is required.\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JAVA}" >&5 $as_echo "${JAVA}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking JDK version" >&5 $as_echo_n "checking JDK version... " >&6; } JAVA_VERSION=`$JAVA -version 2>&1 | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f1` if test "${JAVA_VERSION}" -eq "1"; then JAVA_VERSION=`$JAVA -version 2>&1 | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f2` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA_VERSION" >&5 $as_echo "$JAVA_VERSION" >&6; } if test "${JAVA_VERSION}" -eq "8"; then HAVE_JAVA8="yes" elif test "$JAVA_VERSION" -ge "9"; then HAVE_JAVA9="yes" fi if test -z "$HAVE_JAVA8" -a -z "$HAVE_JAVA9"; then as_fn_error $? "JDK8 or newer is required, detected was: $JAVA_VERSION" "$LINENO" 5 fi if ! test -z "$HAVE_JAVA8"; then VERSION_DEFS="-DHAVE_JAVA8" fi if ! test -z "$HAVE_JAVA9"; then VERSION_DEFS="-DHAVE_JAVA9" fi if test x"${HAVE_JAVA8}" = "xyes"; then HAVE_JAVA8_TRUE= HAVE_JAVA8_FALSE='#' else HAVE_JAVA8_TRUE='#' HAVE_JAVA8_FALSE= fi if test x"${HAVE_JAVA9}" = "xyes"; then HAVE_JAVA9_TRUE= HAVE_JAVA9_FALSE='#' else HAVE_JAVA9_TRUE='#' HAVE_JAVA9_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for javadoc" >&5 $as_echo_n "checking for javadoc... " >&6; } # Check whether --with-javadoc was given. if test "${with_javadoc+set}" = set; then : withval=$with_javadoc; JAVADOC="${withval}" else JAVADOC=${SYSTEM_JDK_DIR}/bin/javadoc fi if ! test -f "${JAVADOC}"; then # Extract the first word of ""${JAVADOC}"", so it can be a program name with args. set dummy "${JAVADOC}"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVADOC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVADOC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVADOC="$JAVADOC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVADOC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVADOC=$ac_cv_path_JAVADOC if test -n "$JAVADOC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVADOC" >&5 $as_echo "$JAVADOC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${JAVADOC}"; then # Extract the first word of ""javadoc"", so it can be a program name with args. set dummy "javadoc"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVADOC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVADOC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVADOC="$JAVADOC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVADOC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVADOC=$ac_cv_path_JAVADOC if test -n "$JAVADOC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVADOC" >&5 $as_echo "$JAVADOC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${JAVADOC}"; then # Extract the first word of ""gjdoc"", so it can be a program name with args. set dummy "gjdoc"; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JAVADOC+:} false; then : $as_echo_n "(cached) " >&6 else case $JAVADOC in [\\/]* | ?:[\\/]*) ac_cv_path_JAVADOC="$JAVADOC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JAVADOC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi JAVADOC=$ac_cv_path_JAVADOC if test -n "$JAVADOC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVADOC" >&5 $as_echo "$JAVADOC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "${JAVADOC}" && test "x$ENABLE_DOCS" = "xyes"; then as_fn_error $? "\"No Java documentation tool was found.\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JAVADOC}" >&5 $as_echo "${JAVADOC}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether javadoc supports -J options" >&5 $as_echo_n "checking whether javadoc supports -J options... " >&6; } CLASS=pkg/Test.java mkdir tmp.$$ cd tmp.$$ mkdir pkg cat << \EOF > $CLASS /* [#]line 5270 "configure" */ package pkg; public class Test { /** * Does stuff. * * * @param args arguments from cli. */ public static void main(String[] args) { System.out.println("Hello World!"); } } EOF if $JAVADOC -J-Xmx896m pkg >&5 2>&1; then JAVADOC_KNOWS_J_OPTIONS=yes else JAVADOC_KNOWS_J_OPTIONS=no fi cd .. rm -rf tmp.$$ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JAVADOC_KNOWS_J_OPTIONS}" >&5 $as_echo "${JAVADOC_KNOWS_J_OPTIONS}" >&6; } if test x"${JAVADOC_KNOWS_J_OPTIONS}" = "xyes"; then JAVADOC_SUPPORTS_J_OPTIONS_TRUE= JAVADOC_SUPPORTS_J_OPTIONS_FALSE='#' else JAVADOC_SUPPORTS_J_OPTIONS_TRUE='#' JAVADOC_SUPPORTS_J_OPTIONS_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for keytool" >&5 $as_echo_n "checking for keytool... " >&6; } # Check whether --with-keytool was given. if test "${with_keytool+set}" = set; then : withval=$with_keytool; if test "${withval}" = "yes" ; then KEYTOOL=${SYSTEM_JDK_DIR}/bin/keytool else KEYTOOL="${withval}" fi else KEYTOOL=${SYSTEM_JDK_DIR}/bin/keytool fi if ! test -f "${KEYTOOL}"; then # Extract the first word of "keytool", so it can be a program name with args. set dummy keytool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_KEYTOOL+:} false; then : $as_echo_n "(cached) " >&6 else case $KEYTOOL in [\\/]* | ?:[\\/]*) ac_cv_path_KEYTOOL="$KEYTOOL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_KEYTOOL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi KEYTOOL=$ac_cv_path_KEYTOOL if test -n "$KEYTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $KEYTOOL" >&5 $as_echo "$KEYTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if ! test -f "${KEYTOOL}"; then KEYTOOL="" fi if test -z "${KEYTOOL}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"keytool not found so signed part of run-netx-dist will fail\"" >&5 $as_echo "$as_me: WARNING: \"keytool not found so signed part of run-netx-dist will fail\"" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${KEYTOOL}" >&5 $as_echo "${KEYTOOL}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jarsigner" >&5 $as_echo_n "checking for jarsigner... " >&6; } # Check whether --with-jarsigner was given. if test "${with_jarsigner+set}" = set; then : withval=$with_jarsigner; if test "${withval}" = "yes" ; then JARSIGNER=${SYSTEM_JDK_DIR}/bin/jarsigner else JARSIGNER="${withval}" fi else JARSIGNER=${SYSTEM_JDK_DIR}/bin/jarsigner fi if ! test -f "${JARSIGNER}"; then # Extract the first word of "jarsigner", so it can be a program name with args. set dummy jarsigner; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_JARSIGNER+:} false; then : $as_echo_n "(cached) " >&6 else case $JARSIGNER in [\\/]* | ?:[\\/]*) ac_cv_path_JARSIGNER="$JARSIGNER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_JARSIGNER="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_JARSIGNER" && ac_cv_path_JARSIGNER="""" ;; esac fi JARSIGNER=$ac_cv_path_JARSIGNER if test -n "$JARSIGNER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JARSIGNER" >&5 $as_echo "$JARSIGNER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if ! test -f "${JARSIGNER}"; then JARSIGNER="" fi if test -z "${JARSIGNER}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"jarsigner not found so signed part of run-netx-dist will fail\"" >&5 $as_echo "$as_me: WARNING: \"jarsigner not found so signed part of run-netx-dist will fail\"" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JARSIGNER}" >&5 $as_echo "${JARSIGNER}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pack200" >&5 $as_echo_n "checking for pack200... " >&6; } # Check whether --with-pack200 was given. if test "${with_pack200+set}" = set; then : withval=$with_pack200; if test "${withval}" = "yes" ; then PACK200=${SYSTEM_JDK_DIR}/bin/pack200 else PACK200="${withval}" fi else PACK200=${SYSTEM_JDK_DIR}/bin/pack200 fi if ! test -f "${PACK200}"; then # Extract the first word of "pack200", so it can be a program name with args. set dummy pack200; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PACK200+:} false; then : $as_echo_n "(cached) " >&6 else case $PACK200 in [\\/]* | ?:[\\/]*) ac_cv_path_PACK200="$PACK200" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PACK200="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PACK200=$ac_cv_path_PACK200 if test -n "$PACK200"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PACK200" >&5 $as_echo "$PACK200" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if ! test -f "${PACK200}"; then PACK200="" fi if test -z "${PACK200}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"pack200 not found so custom part of run-netx-dist will fail\"" >&5 $as_echo "$as_me: WARNING: \"pack200 not found so custom part of run-netx-dist will fail\"" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${PACK200}" >&5 $as_echo "${PACK200}" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}hg", so it can be a program name with args. set dummy ${ac_tool_prefix}hg; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_HG+:} false; then : $as_echo_n "(cached) " >&6 else case $HG in [\\/]* | ?:[\\/]*) ac_cv_path_HG="$HG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_HG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi HG=$ac_cv_path_HG if test -n "$HG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HG" >&5 $as_echo "$HG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_HG"; then ac_pt_HG=$HG # Extract the first word of "hg", so it can be a program name with args. set dummy hg; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_HG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_HG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_HG="$ac_pt_HG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_HG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_HG=$ac_cv_path_ac_pt_HG if test -n "$ac_pt_HG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_HG" >&5 $as_echo "$ac_pt_HG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_HG" = x; then HG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac HG=$ac_pt_HG fi else HG="$ac_cv_path_HG" fi ICEDTEA_REVISION="none"; if which ${HG} >&5 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IcedTea Mercurial revision ID" >&5 $as_echo_n "checking for IcedTea Mercurial revision ID... " >&6; } if test -e ${abs_top_srcdir}/.hg ; then ICEDTEA_REVISION="r`(cd ${abs_top_srcdir}; ${HG} id -i)`" ; fi ; { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ICEDTEA_REVISION}" >&5 $as_echo "${ICEDTEA_REVISION}" >&6; } fi; if test "x${ICEDTEA_REVISION}" != xnone; then HAS_ICEDTEA_REVISION_TRUE= HAS_ICEDTEA_REVISION_FALSE='#' else HAS_ICEDTEA_REVISION_TRUE='#' HAS_ICEDTEA_REVISION_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for distribution package version" >&5 $as_echo_n "checking for distribution package version... " >&6; } # Check whether --with-pkgversion was given. if test "${with_pkgversion+set}" = set; then : withval=$with_pkgversion; case "$withval" in yes) as_fn_error $? "package version not specified" "$LINENO" 5 ;; no) PKGVERSION=none ;; *) PKGVERSION="$withval" ;; esac else PKGVERSION=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${PKGVERSION}" >&5 $as_echo "${PKGVERSION}" >&6; } if test "x${PKGVERSION}" != "xnone"; then HAS_PKGVERSION_TRUE= HAS_PKGVERSION_FALSE='#' else HAS_PKGVERSION_TRUE='#' HAS_PKGVERSION_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking what version string to use" >&5 $as_echo_n "checking what version string to use... " >&6; } if test "x${ICEDTEA_REVISION}" != xnone; then ICEDTEA_REV="+${ICEDTEA_REVISION}" fi if test "x${PKGVERSION}" != "xnone"; then ICEDTEA_PKG=" (${PKGVERSION})" fi FULL_VERSION="${PACKAGE_VERSION}${ICEDTEA_REV}${ICEDTEA_PKG}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${FULL_VERSION}" >&5 $as_echo "${FULL_VERSION}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the browser plugin" >&5 $as_echo_n "checking whether to build the browser plugin... " >&6; } # Check whether --enable-native_plugin was given. if test "${enable_native_plugin+set}" = set; then : enableval=$enable_native_plugin; enable_native_plugin="${enableval}" else if test -z "$WINDOWS_TRUE"; then : enable_native_plugin="no" else enable_native_plugin="yes" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enable_native_plugin}" >&5 $as_echo "${enable_native_plugin}" >&6; } DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test "x${enable_native_plugin}" = "xyes" ; then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0) were not met: $GLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MOZILLA" >&5 $as_echo_n "checking for MOZILLA... " >&6; } if test -n "$MOZILLA_CFLAGS"; then pkg_cv_MOZILLA_CFLAGS="$MOZILLA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"npapi-sdk\""; } >&5 ($PKG_CONFIG --exists --print-errors "npapi-sdk") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MOZILLA_CFLAGS=`$PKG_CONFIG --cflags "npapi-sdk" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$MOZILLA_LIBS"; then pkg_cv_MOZILLA_LIBS="$MOZILLA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"npapi-sdk\""; } >&5 ($PKG_CONFIG --exists --print-errors "npapi-sdk") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MOZILLA_LIBS=`$PKG_CONFIG --libs "npapi-sdk" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MOZILLA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "npapi-sdk" 2>&1` else MOZILLA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "npapi-sdk" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$MOZILLA_PKG_ERRORS" >&5 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MOZILLA" >&5 $as_echo_n "checking for MOZILLA... " >&6; } if test -n "$MOZILLA_CFLAGS"; then pkg_cv_MOZILLA_CFLAGS="$MOZILLA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozilla-plugin\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozilla-plugin") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MOZILLA_CFLAGS=`$PKG_CONFIG --cflags "mozilla-plugin" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$MOZILLA_LIBS"; then pkg_cv_MOZILLA_LIBS="$MOZILLA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozilla-plugin\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozilla-plugin") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MOZILLA_LIBS=`$PKG_CONFIG --libs "mozilla-plugin" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MOZILLA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "mozilla-plugin" 2>&1` else MOZILLA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "mozilla-plugin" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$MOZILLA_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (mozilla-plugin) were not met: $MOZILLA_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables MOZILLA_CFLAGS and MOZILLA_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables MOZILLA_CFLAGS and MOZILLA_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else MOZILLA_CFLAGS=$pkg_cv_MOZILLA_CFLAGS MOZILLA_LIBS=$pkg_cv_MOZILLA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MOZILLA" >&5 $as_echo_n "checking for MOZILLA... " >&6; } if test -n "$MOZILLA_CFLAGS"; then pkg_cv_MOZILLA_CFLAGS="$MOZILLA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozilla-plugin\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozilla-plugin") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MOZILLA_CFLAGS=`$PKG_CONFIG --cflags "mozilla-plugin" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$MOZILLA_LIBS"; then pkg_cv_MOZILLA_LIBS="$MOZILLA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mozilla-plugin\""; } >&5 ($PKG_CONFIG --exists --print-errors "mozilla-plugin") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MOZILLA_LIBS=`$PKG_CONFIG --libs "mozilla-plugin" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MOZILLA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "mozilla-plugin" 2>&1` else MOZILLA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "mozilla-plugin" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$MOZILLA_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (mozilla-plugin) were not met: $MOZILLA_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables MOZILLA_CFLAGS and MOZILLA_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables MOZILLA_CFLAGS and MOZILLA_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else MOZILLA_CFLAGS=$pkg_cv_MOZILLA_CFLAGS MOZILLA_LIBS=$pkg_cv_MOZILLA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else MOZILLA_CFLAGS=$pkg_cv_MOZILLA_CFLAGS MOZILLA_LIBS=$pkg_cv_MOZILLA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xulrunner version" >&5 $as_echo_n "checking for xulrunner version... " >&6; } if ${xulrunner_cv_collapsed_version+:} false; then : $as_echo_n "(cached) " >&6 else # XXX: use NPAPI versions instead xulrunner_cv_collapsed_version=20000000 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xulrunner_cv_collapsed_version" >&5 $as_echo "$xulrunner_cv_collapsed_version" >&6; } fi fi if test "x${enable_native_plugin}" = "xyes"; then ENABLE_NATIVE_PLUGIN_TRUE= ENABLE_NATIVE_PLUGIN_FALSE='#' else ENABLE_NATIVE_PLUGIN_TRUE='#' ENABLE_NATIVE_PLUGIN_FALSE= fi if test "x${enable_native_plugin}" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xulrunner version" >&5 $as_echo_n "checking for xulrunner version... " >&6; } if ${xulrunner_cv_collapsed_version+:} false; then : $as_echo_n "(cached) " >&6 else if pkg-config --modversion libxul >/dev/null 2>&1 then xulrunner_cv_collapsed_version=`pkg-config --modversion libxul | awk -F. '{power=6; v=0; for (i=1; i <= NF; i++) {v += $i * 10 ^ power; power -=2}; print v}'` elif pkg-config --modversion mozilla-plugin >/dev/null 2>&1 then xulrunner_cv_collapsed_version=`pkg-config --modversion mozilla-plugin | awk -F. '{power=6; v=0; for (i=1; i <= NF; i++) {v += $i * 10 ^ power; power -=2}; print v}'` else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot determine xulrunner version See \`config.log' for more details" "$LINENO" 5; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xulrunner_cv_collapsed_version" >&5 $as_echo "$xulrunner_cv_collapsed_version" >&6; } MOZILLA_VERSION_COLLAPSED=$xulrunner_cv_collapsed_version fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build plugin jar for javaws -html" >&5 $as_echo_n "checking whether to build plugin jar for javaws -html... " >&6; } # Check whether --enable-pluginjar was given. if test "${enable_pluginjar+set}" = set; then : enableval=$enable_pluginjar; enable_pluginjar="${enableval}" else enable_pluginjar="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enable_pluginjar}" >&5 $as_echo "${enable_pluginjar}" >&6; } if test "x${enable_pluginjar}" = "xyes"; then ENABLE_PLUGINJAR_TRUE= ENABLE_PLUGINJAR_FALSE='#' else ENABLE_PLUGINJAR_TRUE='#' ENABLE_PLUGINJAR_FALSE= fi if test "$enable_native_plugin" = yes -a ! "$enable_pluginjar" = yes ; then as_fn_error $? "$enable_native_plugin/$enable_pluginjar you can not build native_plugin without pluginjar" "$LINENO" 5 fi if test x"$HAVE_JAVA9" = xyes ; then JAVA_BASE=java.base JAVA_DESKTOP=java.desktop JAVA_NAMING=java.naming fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if java.util.jar.Pack200 is available from some.pkg (module \"\")" >&5 $as_echo_n "checking if java.util.jar.Pack200 is available from some.pkg (module \"\")... " >&6; } if ${it_cv_JAVA_UTIL_JAR_PACK200+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 7719 "configure" */ package some.pkg; import java.util.jar.Pack200; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("java.util.jar.Pack200")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_JAVA_UTIL_JAR_PACK200=yes; else it_cv_JAVA_UTIL_JAR_PACK200=no; fi else it_cv_JAVA_UTIL_JAR_PACK200=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_JAVA_UTIL_JAR_PACK200" >&5 $as_echo "$it_cv_JAVA_UTIL_JAR_PACK200" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_JAVA_UTIL_JAR_PACK200}" = "xno"; then as_fn_error $? "java.util.jar.Pack200 not found." "$LINENO" 5 fi JAVA_UTIL_JAR_PACK200=${it_cv_JAVA_UTIL_JAR_PACK200} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if java.net.CookieManager is available from some.pkg (module \"\")" >&5 $as_echo_n "checking if java.net.CookieManager is available from some.pkg (module \"\")... " >&6; } if ${it_cv_JAVA_NET_COOKIEMANAGER+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 7780 "configure" */ package some.pkg; import java.net.CookieManager; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("java.net.CookieManager")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_JAVA_NET_COOKIEMANAGER=yes; else it_cv_JAVA_NET_COOKIEMANAGER=no; fi else it_cv_JAVA_NET_COOKIEMANAGER=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_JAVA_NET_COOKIEMANAGER" >&5 $as_echo "$it_cv_JAVA_NET_COOKIEMANAGER" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_JAVA_NET_COOKIEMANAGER}" = "xno"; then as_fn_error $? "java.net.CookieManager not found." "$LINENO" 5 fi JAVA_NET_COOKIEMANAGER=${it_cv_JAVA_NET_COOKIEMANAGER} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if java.net.HttpCookie is available from some.pkg (module \"\")" >&5 $as_echo_n "checking if java.net.HttpCookie is available from some.pkg (module \"\")... " >&6; } if ${it_cv_JAVA_NET_HTTPCOOKIE+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 7841 "configure" */ package some.pkg; import java.net.HttpCookie; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("java.net.HttpCookie")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_JAVA_NET_HTTPCOOKIE=yes; else it_cv_JAVA_NET_HTTPCOOKIE=no; fi else it_cv_JAVA_NET_HTTPCOOKIE=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_JAVA_NET_HTTPCOOKIE" >&5 $as_echo "$it_cv_JAVA_NET_HTTPCOOKIE" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_JAVA_NET_HTTPCOOKIE}" = "xno"; then as_fn_error $? "java.net.HttpCookie not found." "$LINENO" 5 fi JAVA_NET_HTTPCOOKIE=${it_cv_JAVA_NET_HTTPCOOKIE} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if java.net.CookieHandler is available from some.pkg (module \"\")" >&5 $as_echo_n "checking if java.net.CookieHandler is available from some.pkg (module \"\")... " >&6; } if ${it_cv_JAVA_NET_COOKIEHANDLER+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 7902 "configure" */ package some.pkg; import java.net.CookieHandler; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("java.net.CookieHandler")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_JAVA_NET_COOKIEHANDLER=yes; else it_cv_JAVA_NET_COOKIEHANDLER=no; fi else it_cv_JAVA_NET_COOKIEHANDLER=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_JAVA_NET_COOKIEHANDLER" >&5 $as_echo "$it_cv_JAVA_NET_COOKIEHANDLER" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_JAVA_NET_COOKIEHANDLER}" = "xno"; then as_fn_error $? "java.net.CookieHandler not found." "$LINENO" 5 fi JAVA_NET_COOKIEHANDLER=${it_cv_JAVA_NET_COOKIEHANDLER} # in jdk9, those classes are using internal apis, must be enabled via module cheats { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.security.util.SecurityConstants is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.security.util.SecurityConstants is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_SECURITY_UTIL_SECURITYCONSTANTS+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 7964 "configure" */ package some.pkg; import sun.security.util.SecurityConstants; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.security.util.SecurityConstants")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_SECURITY_UTIL_SECURITYCONSTANTS=yes; else it_cv_SUN_SECURITY_UTIL_SECURITYCONSTANTS=no; fi else it_cv_SUN_SECURITY_UTIL_SECURITYCONSTANTS=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_SECURITY_UTIL_SECURITYCONSTANTS" >&5 $as_echo "$it_cv_SUN_SECURITY_UTIL_SECURITYCONSTANTS" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_SECURITY_UTIL_SECURITYCONSTANTS}" = "xno"; then as_fn_error $? "sun.security.util.SecurityConstants not found." "$LINENO" 5 fi SUN_SECURITY_UTIL_SECURITYCONSTANTS=${it_cv_SUN_SECURITY_UTIL_SECURITYCONSTANTS} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.security.util.HostnameChecker is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.security.util.HostnameChecker is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_SECURITY_UTIL_HOSTNAMECHECKER+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8025 "configure" */ package some.pkg; import sun.security.util.HostnameChecker; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.security.util.HostnameChecker")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_SECURITY_UTIL_HOSTNAMECHECKER=yes; else it_cv_SUN_SECURITY_UTIL_HOSTNAMECHECKER=no; fi else it_cv_SUN_SECURITY_UTIL_HOSTNAMECHECKER=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_SECURITY_UTIL_HOSTNAMECHECKER" >&5 $as_echo "$it_cv_SUN_SECURITY_UTIL_HOSTNAMECHECKER" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_SECURITY_UTIL_HOSTNAMECHECKER}" = "xno"; then as_fn_error $? "sun.security.util.HostnameChecker not found." "$LINENO" 5 fi SUN_SECURITY_UTIL_HOSTNAMECHECKER=${it_cv_SUN_SECURITY_UTIL_HOSTNAMECHECKER} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.security.x509.X500Name is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.security.x509.X500Name is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_SECURITY_X509_X500NAME+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8086 "configure" */ package some.pkg; import sun.security.x509.X500Name; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.security.x509.X500Name")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_SECURITY_X509_X500NAME=yes; else it_cv_SUN_SECURITY_X509_X500NAME=no; fi else it_cv_SUN_SECURITY_X509_X500NAME=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_SECURITY_X509_X500NAME" >&5 $as_echo "$it_cv_SUN_SECURITY_X509_X500NAME" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_SECURITY_X509_X500NAME}" = "xno"; then as_fn_error $? "sun.security.x509.X500Name not found." "$LINENO" 5 fi SUN_SECURITY_X509_X500NAME=${it_cv_SUN_SECURITY_X509_X500NAME} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.security.action.GetPropertyAction is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.security.action.GetPropertyAction is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_SECURITY_ACTION_GETPROPERTYACTION+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8147 "configure" */ package some.pkg; import sun.security.action.GetPropertyAction; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.security.action.GetPropertyAction")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_SECURITY_ACTION_GETPROPERTYACTION=yes; else it_cv_SUN_SECURITY_ACTION_GETPROPERTYACTION=no; fi else it_cv_SUN_SECURITY_ACTION_GETPROPERTYACTION=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_SECURITY_ACTION_GETPROPERTYACTION" >&5 $as_echo "$it_cv_SUN_SECURITY_ACTION_GETPROPERTYACTION" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_SECURITY_ACTION_GETPROPERTYACTION}" = "xno"; then as_fn_error $? "sun.security.action.GetPropertyAction not found." "$LINENO" 5 fi SUN_SECURITY_ACTION_GETPROPERTYACTION=${it_cv_SUN_SECURITY_ACTION_GETPROPERTYACTION} # the classname cant be substitued by variable, as it is substituted to inner class if test x"$HAVE_JAVA9" = xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.security.util.HexDumpEncoder is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.security.util.HexDumpEncoder is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_HEXDUMPENCODER+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8210 "configure" */ package some.pkg; import sun.security.util.HexDumpEncoder; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.security.util.HexDumpEncoder")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_HEXDUMPENCODER=yes; else it_cv_HEXDUMPENCODER=no; fi else it_cv_HEXDUMPENCODER=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_HEXDUMPENCODER" >&5 $as_echo "$it_cv_HEXDUMPENCODER" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_HEXDUMPENCODER}" = "xno"; then as_fn_error $? "sun.security.util.HexDumpEncoder not found." "$LINENO" 5 fi HEXDUMPENCODER=${it_cv_HEXDUMPENCODER} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if jdk.internal.util.jar.JarIndex is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if jdk.internal.util.jar.JarIndex is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_MISC_JARINDEX+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8271 "configure" */ package some.pkg; import jdk.internal.util.jar.JarIndex; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("jdk.internal.util.jar.JarIndex")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_MISC_JARINDEX=yes; else it_cv_SUN_MISC_JARINDEX=no; fi else it_cv_SUN_MISC_JARINDEX=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_MISC_JARINDEX" >&5 $as_echo "$it_cv_SUN_MISC_JARINDEX" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_MISC_JARINDEX}" = "xno"; then as_fn_error $? "jdk.internal.util.jar.JarIndex not found." "$LINENO" 5 fi SUN_MISC_JARINDEX=${it_cv_SUN_MISC_JARINDEX} else { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.misc.HexDumpEncoder is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.misc.HexDumpEncoder is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_HEXDUMPENCODER+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8333 "configure" */ package some.pkg; import sun.misc.HexDumpEncoder; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.misc.HexDumpEncoder")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_HEXDUMPENCODER=yes; else it_cv_HEXDUMPENCODER=no; fi else it_cv_HEXDUMPENCODER=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_HEXDUMPENCODER" >&5 $as_echo "$it_cv_HEXDUMPENCODER" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_HEXDUMPENCODER}" = "xno"; then as_fn_error $? "sun.misc.HexDumpEncoder not found." "$LINENO" 5 fi HEXDUMPENCODER=${it_cv_HEXDUMPENCODER} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.misc.JarIndex is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.misc.JarIndex is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_MISC_JARINDEX+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8394 "configure" */ package some.pkg; import sun.misc.JarIndex; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.misc.JarIndex")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_MISC_JARINDEX=yes; else it_cv_SUN_MISC_JARINDEX=no; fi else it_cv_SUN_MISC_JARINDEX=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_MISC_JARINDEX" >&5 $as_echo "$it_cv_SUN_MISC_JARINDEX" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_MISC_JARINDEX}" = "xno"; then as_fn_error $? "sun.misc.JarIndex not found." "$LINENO" 5 fi SUN_MISC_JARINDEX=${it_cv_SUN_MISC_JARINDEX} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.misc.Launcher is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.misc.Launcher is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_MISC_LAUNCHER+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8455 "configure" */ package some.pkg; import sun.misc.Launcher; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.misc.Launcher")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_MISC_LAUNCHER=yes; else it_cv_SUN_MISC_LAUNCHER=no; fi else it_cv_SUN_MISC_LAUNCHER=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_MISC_LAUNCHER" >&5 $as_echo "$it_cv_SUN_MISC_LAUNCHER" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_MISC_LAUNCHER}" = "xno"; then as_fn_error $? "sun.misc.Launcher not found." "$LINENO" 5 fi SUN_MISC_LAUNCHER=${it_cv_SUN_MISC_LAUNCHER} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.security.validator.ValidatorException is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.security.validator.ValidatorException is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8517 "configure" */ package some.pkg; import sun.security.validator.ValidatorException; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.security.validator.ValidatorException")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION=yes; else it_cv_SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION=no; fi else it_cv_SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION" >&5 $as_echo "$it_cv_SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION}" = "xno"; then as_fn_error $? "sun.security.validator.ValidatorException not found." "$LINENO" 5 fi SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION=${it_cv_SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8578 "configure" */ package some.pkg; import com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER=yes; else it_cv_COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER=no; fi else it_cv_COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER" >&5 $as_echo "$it_cv_COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER}" = "xno"; then as_fn_error $? "com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager not found." "$LINENO" 5 fi COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER=${it_cv_COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.net.www.protocol.jar.URLJarFile is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.net.www.protocol.jar.URLJarFile is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8639 "configure" */ package some.pkg; import sun.net.www.protocol.jar.URLJarFile; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.net.www.protocol.jar.URLJarFile")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE=yes; else it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE=no; fi else it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE" >&5 $as_echo "$it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE}" = "xno"; then as_fn_error $? "sun.net.www.protocol.jar.URLJarFile not found." "$LINENO" 5 fi SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE=${it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILE} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.net.www.protocol.jar.URLJarFileCallBack is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.net.www.protocol.jar.URLJarFileCallBack is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8700 "configure" */ package some.pkg; import sun.net.www.protocol.jar.URLJarFileCallBack; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.net.www.protocol.jar.URLJarFileCallBack")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK=yes; else it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK=no; fi else it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK" >&5 $as_echo "$it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK}" = "xno"; then as_fn_error $? "sun.net.www.protocol.jar.URLJarFileCallBack not found." "$LINENO" 5 fi SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK=${it_cv_SUN_NET_WWW_PROTOCOL_JAR_URLJARFILECALLBACK} if test "x$build_linux" = xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.awt.X11.XEmbeddedFrame is available from some.pkg (module \"$JAVA_DESKTOP\")" >&5 $as_echo_n "checking if sun.awt.X11.XEmbeddedFrame is available from some.pkg (module \"$JAVA_DESKTOP\")... " >&6; } if ${it_cv_SUN_AWT_X11_XEMBEDDEDFRAME+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_DESKTOP" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8762 "configure" */ package some.pkg; import sun.awt.X11.XEmbeddedFrame; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.awt.X11.XEmbeddedFrame")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_AWT_X11_XEMBEDDEDFRAME=yes; else it_cv_SUN_AWT_X11_XEMBEDDEDFRAME=no; fi else it_cv_SUN_AWT_X11_XEMBEDDEDFRAME=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_AWT_X11_XEMBEDDEDFRAME" >&5 $as_echo "$it_cv_SUN_AWT_X11_XEMBEDDEDFRAME" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_AWT_X11_XEMBEDDEDFRAME}" = "xno"; then as_fn_error $? "sun.awt.X11.XEmbeddedFrame not found." "$LINENO" 5 fi SUN_AWT_X11_XEMBEDDEDFRAME=${it_cv_SUN_AWT_X11_XEMBEDDEDFRAME} fi if test "x$build_windows" = xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.awt.windows.WEmbeddedFrame is available from some.pkg (module \"$JAVA_DESKTOP\")" >&5 $as_echo_n "checking if sun.awt.windows.WEmbeddedFrame is available from some.pkg (module \"$JAVA_DESKTOP\")... " >&6; } if ${it_cv_SUN_AWT_WEMBEDDEDFRAME+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_DESKTOP" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8825 "configure" */ package some.pkg; import sun.awt.windows.WEmbeddedFrame; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.awt.windows.WEmbeddedFrame")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_AWT_WEMBEDDEDFRAME=yes; else it_cv_SUN_AWT_WEMBEDDEDFRAME=no; fi else it_cv_SUN_AWT_WEMBEDDEDFRAME=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_AWT_WEMBEDDEDFRAME" >&5 $as_echo "$it_cv_SUN_AWT_WEMBEDDEDFRAME" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_AWT_WEMBEDDEDFRAME}" = "xno"; then as_fn_error $? "sun.awt.windows.WEmbeddedFrame not found." "$LINENO" 5 fi SUN_AWT_WEMBEDDEDFRAME=${it_cv_SUN_AWT_WEMBEDDEDFRAME} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if com.sun.jndi.toolkit.url.UrlUtil is available from some.pkg (module \"$JAVA_NAMING\")" >&5 $as_echo_n "checking if com.sun.jndi.toolkit.url.UrlUtil is available from some.pkg (module \"$JAVA_NAMING\")... " >&6; } if ${it_cv_COM_SUN_JNDI_TOOLKIT_URL_URLUTIL+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_NAMING" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8887 "configure" */ package some.pkg; import com.sun.jndi.toolkit.url.UrlUtil; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("com.sun.jndi.toolkit.url.UrlUtil")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_COM_SUN_JNDI_TOOLKIT_URL_URLUTIL=yes; else it_cv_COM_SUN_JNDI_TOOLKIT_URL_URLUTIL=no; fi else it_cv_COM_SUN_JNDI_TOOLKIT_URL_URLUTIL=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_COM_SUN_JNDI_TOOLKIT_URL_URLUTIL" >&5 $as_echo "$it_cv_COM_SUN_JNDI_TOOLKIT_URL_URLUTIL" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_COM_SUN_JNDI_TOOLKIT_URL_URLUTIL}" = "xno"; then as_fn_error $? "com.sun.jndi.toolkit.url.UrlUtil not found." "$LINENO" 5 fi COM_SUN_JNDI_TOOLKIT_URL_URLUTIL=${it_cv_COM_SUN_JNDI_TOOLKIT_URL_URLUTIL} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.net.www.protocol.http.Handler is available from some.pkg (module \"$JAVA_BASE\")" >&5 $as_echo_n "checking if sun.net.www.protocol.http.Handler is available from some.pkg (module \"$JAVA_BASE\")... " >&6; } if ${it_cv_SUN_NET_WWW_PROTOCOL_HTTP_HANDLER+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_BASE" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo some.pkg | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 8948 "configure" */ package some.pkg; import sun.net.www.protocol.http.Handler; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.net.www.protocol.http.Handler")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_NET_WWW_PROTOCOL_HTTP_HANDLER=yes; else it_cv_SUN_NET_WWW_PROTOCOL_HTTP_HANDLER=no; fi else it_cv_SUN_NET_WWW_PROTOCOL_HTTP_HANDLER=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_NET_WWW_PROTOCOL_HTTP_HANDLER" >&5 $as_echo "$it_cv_SUN_NET_WWW_PROTOCOL_HTTP_HANDLER" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_NET_WWW_PROTOCOL_HTTP_HANDLER}" = "xno"; then as_fn_error $? "sun.net.www.protocol.http.Handler not found." "$LINENO" 5 fi SUN_NET_WWW_PROTOCOL_HTTP_HANDLER=${it_cv_SUN_NET_WWW_PROTOCOL_HTTP_HANDLER} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if sun.applet.AppletImageRef is available from sun.applet (module \"$JAVA_DESKTOP\")" >&5 $as_echo_n "checking if sun.applet.AppletImageRef is available from sun.applet (module \"$JAVA_DESKTOP\")... " >&6; } if ${it_cv_SUN_APPLET_APPLETIMAGEREF+:} false; then : $as_echo_n "(cached) " >&6 else # first is the variableto save in, second param is name of class to find, # third is name of package to make check in. # mostly some.pkg is ok, but some tests must bedone in sun.applet or other special directory # fourth, optional is module MODULE_NAME="$JAVA_DESKTOP" if test -n "$MODULE_NAME" ; then PATCH_MODULE="--patch-module $MODULE_NAME=." fi PKGPATH=`echo sun.applet | sed "s;\\.;/;g" ` CLASS=$PKGPATH/Test.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$/$(dirname $CLASS) cd tmp.$$ cat << \EOF > $CLASS /* [#]line 9009 "configure" */ package sun.applet; import sun.applet.AppletImageRef; public class Test { public static void main(String[] args) throws Exception { System.out.println(Class.forName("sun.applet.AppletImageRef")); } } EOF if $JAVAC $PATCH_MODULE -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA $PATCH_MODULE -classpath . $BYTECODE >&5 2>&1; then it_cv_SUN_APPLET_APPLETIMAGEREF=yes; else it_cv_SUN_APPLET_APPLETIMAGEREF=no; fi else it_cv_SUN_APPLET_APPLETIMAGEREF=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_SUN_APPLET_APPLETIMAGEREF" >&5 $as_echo "$it_cv_SUN_APPLET_APPLETIMAGEREF" >&6; } rm -f $CLASS *.class cd .. # should be rmdir but has to be rm -rf due to sun.applet usage rm -rf tmp.$$ if test x"${it_cv_SUN_APPLET_APPLETIMAGEREF}" = "xno"; then as_fn_error $? "sun.applet.AppletImageRef not found." "$LINENO" 5 fi SUN_APPLET_APPLETIMAGEREF=${it_cv_SUN_APPLET_APPLETIMAGEREF} { $as_echo "$as_me:${as_lineno-$LINENO}: checking if selected classes, fields and methods from sun.applet are accessible via reflection" >&5 $as_echo_n "checking if selected classes, fields and methods from sun.applet are accessible via reflection... " >&6; } if ${it_cv_applet_hole+:} false; then : $as_echo_n "(cached) " >&6 else CLASS=TestAppletViewer.java BYTECODE=$(echo $CLASS|sed 's#\.java##') mkdir -p tmp.$$ cd tmp.$$ cat << \EOF > $CLASS /* [#]line 9062 "configure" */ import java.lang.reflect.*; public class TestAppletViewer { public static void main(String[] args) throws Exception { Class ap = Class.forName("sun.applet.AppletPanel"); Class avp = Class.forName("sun.applet.AppletViewerPanel"); Field f1 = ap.getDeclaredField("applet"); Field f2 = avp.getDeclaredField("documentURL"); Method m1 = ap.getDeclaredMethod("run"); Method m2 = ap.getDeclaredMethod("runLoader"); Field f3 = avp.getDeclaredField("baseURL"); } } EOF if $JAVAC -cp . $JAVACFLAGS -nowarn $CLASS >&5 2>&1; then if $JAVA -classpath . $BYTECODE >&5 2>&1; then it_cv_applet_hole=yes; else it_cv_applet_hole=no; fi else it_cv_applet_hole=no; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $it_cv_applet_hole" >&5 $as_echo "$it_cv_applet_hole" >&6; } rm -f $CLASS *.class cd .. rmdir tmp.$$ if test x"${it_cv_applet_hole}" = "xno"; then as_fn_error $? "Some of the checked items is not avaiable. Check logs." "$LINENO" 5 fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB2_V_216" >&5 $as_echo_n "checking for GLIB2_V_216... " >&6; } if test -n "$GLIB2_V_216_CFLAGS"; then pkg_cv_GLIB2_V_216_CFLAGS="$GLIB2_V_216_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.16\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.16") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB2_V_216_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.16" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB2_V_216_LIBS"; then pkg_cv_GLIB2_V_216_LIBS="$GLIB2_V_216_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.16\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.16") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB2_V_216_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.16" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB2_V_216_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.16" 2>&1` else GLIB2_V_216_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.16" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB2_V_216_PKG_ERRORS" >&5 $as_echo "#define LEGACY_GLIB 1" >>confdefs.h elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define LEGACY_GLIB 1" >>confdefs.h else GLIB2_V_216_CFLAGS=$pkg_cv_GLIB2_V_216_CFLAGS GLIB2_V_216_LIBS=$pkg_cv_GLIB2_V_216_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for legacy xulrunner api" >&5 $as_echo_n "checking for legacy xulrunner api... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS_BACKUP="$CXXFLAGS" CXXFLAGS="$CXXFLAGS"" ""$MOZILLA_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include const char* NP_GetMIMEDescription () {return (char*) "yap!";} _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define LEGACY_XULRUNNERAPI 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$CXXFLAGS_BACKUP" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xulrunner enforcing C++11 standard" >&5 $as_echo_n "checking for xulrunner enforcing C++11 standard... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS_BACKUP="$CXXFLAGS" CXXFLAGS="$CXXFLAGS"" ""$MOZILLA_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include void setnpptr (NPVariant *result) { VOID_TO_NPVARIANT(*result);} _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } CXXFLAGS="$CXXFLAGS_BACKUP" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CXXFLAGS="$CXXFLAGS_BACKUP -std=c++11" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # # Find optional depedencies # for ac_prog in xsltproc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_XSLTPROC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$XSLTPROC"; then ac_cv_prog_XSLTPROC="$XSLTPROC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_XSLTPROC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi XSLTPROC=$ac_cv_prog_XSLTPROC if test -n "$XSLTPROC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5 $as_echo "$XSLTPROC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$XSLTPROC" && break done # browser to be linked/tested # Example: IT_FIND_BROWSER([browser-name],[variable-to-store-path],[default-run-command-if-different-from-the-browser-name]) # Check whether --with-firefox was given. if test "${with_firefox+set}" = set; then : withval=$with_firefox; if test "${withval}" = "no" || test "${withval}" = "yes" || test "${withval}" = "" ; then FIREFOX="" elif test -f "${withval}" ; then FIREFOX="${withval}" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for firefox" >&5 $as_echo_n "checking for firefox... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "invalid location specified to firefox: ${withval} See \`config.log' for more details" "$LINENO" 5; } fi else withval="yes" fi if test -f "${FIREFOX}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for firefox" >&5 $as_echo_n "checking for firefox... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${FIREFOX}" >&5 $as_echo "${FIREFOX}" >&6; } elif test "${withval}" != "no"; then if test 2 -gt 2; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}", so it can be a program name with args. set dummy ${ac_tool_prefix}; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FIREFOX+:} false; then : $as_echo_n "(cached) " >&6 else case $FIREFOX in [\\/]* | ?:[\\/]*) ac_cv_path_FIREFOX="$FIREFOX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FIREFOX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi FIREFOX=$ac_cv_path_FIREFOX if test -n "$FIREFOX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIREFOX" >&5 $as_echo "$FIREFOX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_FIREFOX"; then ac_pt_FIREFOX=$FIREFOX # Extract the first word of "", so it can be a program name with args. set dummy ; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_FIREFOX+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_FIREFOX in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_FIREFOX="$ac_pt_FIREFOX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_FIREFOX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_FIREFOX=$ac_cv_path_ac_pt_FIREFOX if test -n "$ac_pt_FIREFOX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_FIREFOX" >&5 $as_echo "$ac_pt_FIREFOX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_FIREFOX" = x; then FIREFOX="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac FIREFOX=$ac_pt_FIREFOX fi else FIREFOX="$ac_cv_path_FIREFOX" fi else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}firefox", so it can be a program name with args. set dummy ${ac_tool_prefix}firefox; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FIREFOX+:} false; then : $as_echo_n "(cached) " >&6 else case $FIREFOX in [\\/]* | ?:[\\/]*) ac_cv_path_FIREFOX="$FIREFOX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FIREFOX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi FIREFOX=$ac_cv_path_FIREFOX if test -n "$FIREFOX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIREFOX" >&5 $as_echo "$FIREFOX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_FIREFOX"; then ac_pt_FIREFOX=$FIREFOX # Extract the first word of "firefox", so it can be a program name with args. set dummy firefox; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_FIREFOX+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_FIREFOX in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_FIREFOX="$ac_pt_FIREFOX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_FIREFOX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_FIREFOX=$ac_cv_path_ac_pt_FIREFOX if test -n "$ac_pt_FIREFOX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_FIREFOX" >&5 $as_echo "$ac_pt_FIREFOX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_FIREFOX" = x; then FIREFOX="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac FIREFOX=$ac_pt_FIREFOX fi else FIREFOX="$ac_cv_path_FIREFOX" fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for firefox" >&5 $as_echo_n "checking for firefox... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-chrome was given. if test "${with_chrome+set}" = set; then : withval=$with_chrome; if test "${withval}" = "no" || test "${withval}" = "yes" || test "${withval}" = "" ; then CHROME="" elif test -f "${withval}" ; then CHROME="${withval}" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chrome" >&5 $as_echo_n "checking for chrome... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "invalid location specified to chrome: ${withval} See \`config.log' for more details" "$LINENO" 5; } fi else withval="yes" fi if test -f "${CHROME}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chrome" >&5 $as_echo_n "checking for chrome... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${CHROME}" >&5 $as_echo "${CHROME}" >&6; } elif test "${withval}" != "no"; then if test 3 -gt 2; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}google-chrome", so it can be a program name with args. set dummy ${ac_tool_prefix}google-chrome; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CHROME+:} false; then : $as_echo_n "(cached) " >&6 else case $CHROME in [\\/]* | ?:[\\/]*) ac_cv_path_CHROME="$CHROME" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CHROME="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CHROME=$ac_cv_path_CHROME if test -n "$CHROME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHROME" >&5 $as_echo "$CHROME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_CHROME"; then ac_pt_CHROME=$CHROME # Extract the first word of "google-chrome", so it can be a program name with args. set dummy google-chrome; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_CHROME+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_CHROME in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_CHROME="$ac_pt_CHROME" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_CHROME="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_CHROME=$ac_cv_path_ac_pt_CHROME if test -n "$ac_pt_CHROME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CHROME" >&5 $as_echo "$ac_pt_CHROME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_CHROME" = x; then CHROME="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CHROME=$ac_pt_CHROME fi else CHROME="$ac_cv_path_CHROME" fi else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}chrome", so it can be a program name with args. set dummy ${ac_tool_prefix}chrome; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CHROME+:} false; then : $as_echo_n "(cached) " >&6 else case $CHROME in [\\/]* | ?:[\\/]*) ac_cv_path_CHROME="$CHROME" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CHROME="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CHROME=$ac_cv_path_CHROME if test -n "$CHROME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHROME" >&5 $as_echo "$CHROME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_CHROME"; then ac_pt_CHROME=$CHROME # Extract the first word of "chrome", so it can be a program name with args. set dummy chrome; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_CHROME+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_CHROME in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_CHROME="$ac_pt_CHROME" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_CHROME="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_CHROME=$ac_cv_path_ac_pt_CHROME if test -n "$ac_pt_CHROME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CHROME" >&5 $as_echo "$ac_pt_CHROME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_CHROME" = x; then CHROME="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CHROME=$ac_pt_CHROME fi else CHROME="$ac_cv_path_CHROME" fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chrome" >&5 $as_echo_n "checking for chrome... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-chromium was given. if test "${with_chromium+set}" = set; then : withval=$with_chromium; if test "${withval}" = "no" || test "${withval}" = "yes" || test "${withval}" = "" ; then CHROMIUM="" elif test -f "${withval}" ; then CHROMIUM="${withval}" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chromium" >&5 $as_echo_n "checking for chromium... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "invalid location specified to chromium: ${withval} See \`config.log' for more details" "$LINENO" 5; } fi else withval="yes" fi if test -f "${CHROMIUM}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chromium" >&5 $as_echo_n "checking for chromium... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${CHROMIUM}" >&5 $as_echo "${CHROMIUM}" >&6; } elif test "${withval}" != "no"; then if test 3 -gt 2; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}chromium-browser", so it can be a program name with args. set dummy ${ac_tool_prefix}chromium-browser; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CHROMIUM+:} false; then : $as_echo_n "(cached) " >&6 else case $CHROMIUM in [\\/]* | ?:[\\/]*) ac_cv_path_CHROMIUM="$CHROMIUM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CHROMIUM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CHROMIUM=$ac_cv_path_CHROMIUM if test -n "$CHROMIUM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHROMIUM" >&5 $as_echo "$CHROMIUM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_CHROMIUM"; then ac_pt_CHROMIUM=$CHROMIUM # Extract the first word of "chromium-browser", so it can be a program name with args. set dummy chromium-browser; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_CHROMIUM+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_CHROMIUM in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_CHROMIUM="$ac_pt_CHROMIUM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_CHROMIUM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_CHROMIUM=$ac_cv_path_ac_pt_CHROMIUM if test -n "$ac_pt_CHROMIUM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CHROMIUM" >&5 $as_echo "$ac_pt_CHROMIUM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_CHROMIUM" = x; then CHROMIUM="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CHROMIUM=$ac_pt_CHROMIUM fi else CHROMIUM="$ac_cv_path_CHROMIUM" fi else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}chromium", so it can be a program name with args. set dummy ${ac_tool_prefix}chromium; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CHROMIUM+:} false; then : $as_echo_n "(cached) " >&6 else case $CHROMIUM in [\\/]* | ?:[\\/]*) ac_cv_path_CHROMIUM="$CHROMIUM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CHROMIUM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CHROMIUM=$ac_cv_path_CHROMIUM if test -n "$CHROMIUM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHROMIUM" >&5 $as_echo "$CHROMIUM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_CHROMIUM"; then ac_pt_CHROMIUM=$CHROMIUM # Extract the first word of "chromium", so it can be a program name with args. set dummy chromium; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_CHROMIUM+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_CHROMIUM in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_CHROMIUM="$ac_pt_CHROMIUM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_CHROMIUM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_CHROMIUM=$ac_cv_path_ac_pt_CHROMIUM if test -n "$ac_pt_CHROMIUM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_CHROMIUM" >&5 $as_echo "$ac_pt_CHROMIUM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_CHROMIUM" = x; then CHROMIUM="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CHROMIUM=$ac_pt_CHROMIUM fi else CHROMIUM="$ac_cv_path_CHROMIUM" fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chromium" >&5 $as_echo_n "checking for chromium... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-opera was given. if test "${with_opera+set}" = set; then : withval=$with_opera; if test "${withval}" = "no" || test "${withval}" = "yes" || test "${withval}" = "" ; then OPERA="" elif test -f "${withval}" ; then OPERA="${withval}" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opera" >&5 $as_echo_n "checking for opera... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "invalid location specified to opera: ${withval} See \`config.log' for more details" "$LINENO" 5; } fi else withval="yes" fi if test -f "${OPERA}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opera" >&5 $as_echo_n "checking for opera... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${OPERA}" >&5 $as_echo "${OPERA}" >&6; } elif test "${withval}" != "no"; then if test 2 -gt 2; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}", so it can be a program name with args. set dummy ${ac_tool_prefix}; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_OPERA+:} false; then : $as_echo_n "(cached) " >&6 else case $OPERA in [\\/]* | ?:[\\/]*) ac_cv_path_OPERA="$OPERA" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_OPERA="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi OPERA=$ac_cv_path_OPERA if test -n "$OPERA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPERA" >&5 $as_echo "$OPERA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_OPERA"; then ac_pt_OPERA=$OPERA # Extract the first word of "", so it can be a program name with args. set dummy ; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_OPERA+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_OPERA in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_OPERA="$ac_pt_OPERA" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_OPERA="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_OPERA=$ac_cv_path_ac_pt_OPERA if test -n "$ac_pt_OPERA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_OPERA" >&5 $as_echo "$ac_pt_OPERA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_OPERA" = x; then OPERA="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OPERA=$ac_pt_OPERA fi else OPERA="$ac_cv_path_OPERA" fi else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}opera", so it can be a program name with args. set dummy ${ac_tool_prefix}opera; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_OPERA+:} false; then : $as_echo_n "(cached) " >&6 else case $OPERA in [\\/]* | ?:[\\/]*) ac_cv_path_OPERA="$OPERA" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_OPERA="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi OPERA=$ac_cv_path_OPERA if test -n "$OPERA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPERA" >&5 $as_echo "$OPERA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_OPERA"; then ac_pt_OPERA=$OPERA # Extract the first word of "opera", so it can be a program name with args. set dummy opera; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_OPERA+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_OPERA in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_OPERA="$ac_pt_OPERA" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_OPERA="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_OPERA=$ac_cv_path_ac_pt_OPERA if test -n "$ac_pt_OPERA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_OPERA" >&5 $as_echo "$ac_pt_OPERA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_OPERA" = x; then OPERA="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OPERA=$ac_pt_OPERA fi else OPERA="$ac_cv_path_OPERA" fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opera" >&5 $as_echo_n "checking for opera... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-midori was given. if test "${with_midori+set}" = set; then : withval=$with_midori; if test "${withval}" = "no" || test "${withval}" = "yes" || test "${withval}" = "" ; then MIDORI="" elif test -f "${withval}" ; then MIDORI="${withval}" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for midori" >&5 $as_echo_n "checking for midori... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "invalid location specified to midori: ${withval} See \`config.log' for more details" "$LINENO" 5; } fi else withval="yes" fi if test -f "${MIDORI}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for midori" >&5 $as_echo_n "checking for midori... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${MIDORI}" >&5 $as_echo "${MIDORI}" >&6; } elif test "${withval}" != "no"; then if test 2 -gt 2; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}", so it can be a program name with args. set dummy ${ac_tool_prefix}; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MIDORI+:} false; then : $as_echo_n "(cached) " >&6 else case $MIDORI in [\\/]* | ?:[\\/]*) ac_cv_path_MIDORI="$MIDORI" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MIDORI="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MIDORI=$ac_cv_path_MIDORI if test -n "$MIDORI"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MIDORI" >&5 $as_echo "$MIDORI" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_MIDORI"; then ac_pt_MIDORI=$MIDORI # Extract the first word of "", so it can be a program name with args. set dummy ; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_MIDORI+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_MIDORI in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_MIDORI="$ac_pt_MIDORI" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_MIDORI="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_MIDORI=$ac_cv_path_ac_pt_MIDORI if test -n "$ac_pt_MIDORI"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_MIDORI" >&5 $as_echo "$ac_pt_MIDORI" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_MIDORI" = x; then MIDORI="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MIDORI=$ac_pt_MIDORI fi else MIDORI="$ac_cv_path_MIDORI" fi else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}midori", so it can be a program name with args. set dummy ${ac_tool_prefix}midori; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MIDORI+:} false; then : $as_echo_n "(cached) " >&6 else case $MIDORI in [\\/]* | ?:[\\/]*) ac_cv_path_MIDORI="$MIDORI" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MIDORI="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MIDORI=$ac_cv_path_MIDORI if test -n "$MIDORI"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MIDORI" >&5 $as_echo "$MIDORI" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_MIDORI"; then ac_pt_MIDORI=$MIDORI # Extract the first word of "midori", so it can be a program name with args. set dummy midori; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_MIDORI+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_MIDORI in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_MIDORI="$ac_pt_MIDORI" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_MIDORI="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_MIDORI=$ac_cv_path_ac_pt_MIDORI if test -n "$ac_pt_MIDORI"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_MIDORI" >&5 $as_echo "$ac_pt_MIDORI" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_MIDORI" = x; then MIDORI="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MIDORI=$ac_pt_MIDORI fi else MIDORI="$ac_cv_path_MIDORI" fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for midori" >&5 $as_echo_n "checking for midori... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-epiphany was given. if test "${with_epiphany+set}" = set; then : withval=$with_epiphany; if test "${withval}" = "no" || test "${withval}" = "yes" || test "${withval}" = "" ; then EPIPHANY="" elif test -f "${withval}" ; then EPIPHANY="${withval}" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for epiphany" >&5 $as_echo_n "checking for epiphany... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "invalid location specified to epiphany: ${withval} See \`config.log' for more details" "$LINENO" 5; } fi else withval="yes" fi if test -f "${EPIPHANY}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for epiphany" >&5 $as_echo_n "checking for epiphany... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${EPIPHANY}" >&5 $as_echo "${EPIPHANY}" >&6; } elif test "${withval}" != "no"; then if test 2 -gt 2; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}", so it can be a program name with args. set dummy ${ac_tool_prefix}; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_EPIPHANY+:} false; then : $as_echo_n "(cached) " >&6 else case $EPIPHANY in [\\/]* | ?:[\\/]*) ac_cv_path_EPIPHANY="$EPIPHANY" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_EPIPHANY="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi EPIPHANY=$ac_cv_path_EPIPHANY if test -n "$EPIPHANY"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EPIPHANY" >&5 $as_echo "$EPIPHANY" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_EPIPHANY"; then ac_pt_EPIPHANY=$EPIPHANY # Extract the first word of "", so it can be a program name with args. set dummy ; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_EPIPHANY+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_EPIPHANY in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_EPIPHANY="$ac_pt_EPIPHANY" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_EPIPHANY="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_EPIPHANY=$ac_cv_path_ac_pt_EPIPHANY if test -n "$ac_pt_EPIPHANY"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_EPIPHANY" >&5 $as_echo "$ac_pt_EPIPHANY" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_EPIPHANY" = x; then EPIPHANY="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac EPIPHANY=$ac_pt_EPIPHANY fi else EPIPHANY="$ac_cv_path_EPIPHANY" fi else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}epiphany", so it can be a program name with args. set dummy ${ac_tool_prefix}epiphany; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_EPIPHANY+:} false; then : $as_echo_n "(cached) " >&6 else case $EPIPHANY in [\\/]* | ?:[\\/]*) ac_cv_path_EPIPHANY="$EPIPHANY" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_EPIPHANY="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi EPIPHANY=$ac_cv_path_EPIPHANY if test -n "$EPIPHANY"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EPIPHANY" >&5 $as_echo "$EPIPHANY" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_EPIPHANY"; then ac_pt_EPIPHANY=$EPIPHANY # Extract the first word of "epiphany", so it can be a program name with args. set dummy epiphany; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_EPIPHANY+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_EPIPHANY in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_EPIPHANY="$ac_pt_EPIPHANY" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_EPIPHANY="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_EPIPHANY=$ac_cv_path_ac_pt_EPIPHANY if test -n "$ac_pt_EPIPHANY"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_EPIPHANY" >&5 $as_echo "$ac_pt_EPIPHANY" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_EPIPHANY" = x; then EPIPHANY="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac EPIPHANY=$ac_pt_EPIPHANY fi else EPIPHANY="$ac_cv_path_EPIPHANY" fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for epiphany" >&5 $as_echo_n "checking for epiphany... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how browser test will be run" >&5 $as_echo_n "checking how browser test will be run... " >&6; } # Check whether --with-browser-tests was given. if test "${with_browser_tests+set}" = set; then : withval=$with_browser_tests; BROWSER_SWITCH=${withval} else BROWSER_SWITCH="yes" fi D_PARAM_PART="-Dmodified.browsers.run" case "$BROWSER_SWITCH" in "yes" ) BROWSER_TESTS_MODIFICATION="" ;; "no" ) BROWSER_TESTS_MODIFICATION="$D_PARAM_PART=ignore" ;; "one" ) BROWSER_TESTS_MODIFICATION="$D_PARAM_PART=one" ;; "all" ) BROWSER_TESTS_MODIFICATION="$D_PARAM_PART=all" ;; *) as_fn_error $? "unknown valkue of with-browser-tests ($BROWSER_SWITCH), so not use (yes) or set yes|no|one|all" "$LINENO" 5 esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${BROWSER_SWITCH}" >&5 $as_echo "${BROWSER_SWITCH}" >&6; } if test x"$XSLTPROC" != x ; then WITH_XSLTPROC_TRUE= WITH_XSLTPROC_FALSE='#' else WITH_XSLTPROC_TRUE='#' WITH_XSLTPROC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rhino jar" >&5 $as_echo_n "checking for rhino jar... " >&6; } # Check whether --with-rhino was given. if test "${with_rhino+set}" = set; then : withval=$with_rhino; case "${withval}" in yes) RHINO_JAR=yes ;; no) RHINO_JAR=no ;; *) if test -f "${withval}"; then RHINO_JAR="${withval}" elif test -z "${withval}"; then RHINO_JAR=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "\"The rhino jar ${withval} was not found.\"" "$LINENO" 5 fi ;; esac else RHINO_JAR=yes fi it_extra_paths_rhino="/usr/share/java/js.jar /usr/share/rhino-1.6/lib/js.jar" if test "x${RHINO_JAR}" = "xyes"; then for path in ${it_extra_paths_rhino}; do if test -f ${path}; then RHINO_JAR=${path} break fi done fi if test x"${RHINO_JAR}" = "xyes"; then if test -f "/usr/share/java/rhino.jar"; then RHINO_JAR=/usr/share/java/rhino.jar fi fi if test x"${RHINO_JAR}" = "xyes"; then RHINO_JAR=no fi if test -z "$WINDOWS_TRUE"; then : if test x"${RHINO_JAR}" != "xno"; then RHINO_JAR=$(cygpath -m ${RHINO_JAR}) fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${RHINO_JAR}" >&5 $as_echo "${RHINO_JAR}" >&6; } if test x"${RHINO_JAR}" != "xno"; then WITH_RHINO_TRUE= WITH_RHINO_FALSE='#' else WITH_RHINO_TRUE='#' WITH_RHINO_FALSE= fi # Clear RHINO_JAR if it doesn't contain a valid filename if test x"${RHINO_JAR}" = "xno"; then RHINO_JAR= fi if test -n "${RHINO_JAR}" ; then RHINO_AVAILABLE=true else RHINO_AVAILABLE=false fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for junit jar" >&5 $as_echo_n "checking for junit jar... " >&6; } # Check whether --with-junit was given. if test "${with_junit+set}" = set; then : withval=$with_junit; case "${withval}" in yes) JUNIT_JAR=yes ;; no) JUNIT_JAR=no ;; *) if test -f "${withval}"; then JUNIT_JAR="${withval}" elif test -z "${withval}"; then JUNIT_JAR=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "\"The junit jar ${withval} was not found.\"" "$LINENO" 5 fi ;; esac else JUNIT_JAR=yes fi it_extra_paths_junit="/usr/share/java/junit4.jar /usr/share/junit-4/lib/junit.jar" if test "x${JUNIT_JAR}" = "xyes"; then for path in ${it_extra_paths_junit}; do if test -f ${path}; then JUNIT_JAR=${path} break fi done fi if test x"${JUNIT_JAR}" = "xyes"; then if test -f "/usr/share/java/junit.jar"; then JUNIT_JAR=/usr/share/java/junit.jar fi fi if test x"${JUNIT_JAR}" = "xyes"; then JUNIT_JAR=no fi if test -z "$WINDOWS_TRUE"; then : if test x"${JUNIT_JAR}" != "xno"; then JUNIT_JAR=$(cygpath -m ${JUNIT_JAR}) fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JUNIT_JAR}" >&5 $as_echo "${JUNIT_JAR}" >&6; } if test x"${JUNIT_JAR}" != "xno"; then WITH_JUNIT_TRUE= WITH_JUNIT_FALSE='#' else WITH_JUNIT_TRUE='#' WITH_JUNIT_FALSE= fi # Clear JUNIT_JAR if it doesn't contain a valid filename if test x"${JUNIT_JAR}" = "xno"; then JUNIT_JAR= fi if test -n "${JUNIT_JAR}" ; then JUNIT_AVAILABLE=true else JUNIT_AVAILABLE=false fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hamcrest jar" >&5 $as_echo_n "checking for hamcrest jar... " >&6; } # Check whether --with-hamcrest was given. if test "${with_hamcrest+set}" = set; then : withval=$with_hamcrest; case "${withval}" in yes) HAMCREST_JAR=yes ;; no) HAMCREST_JAR=no ;; *) if test -f "${withval}"; then HAMCREST_JAR="${withval}" elif test -z "${withval}"; then HAMCREST_JAR=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "\"The hamcrest jar ${withval} was not found.\"" "$LINENO" 5 fi ;; esac else HAMCREST_JAR=yes fi it_extra_paths_hamcrest="/usr/share/java/hamcrest/all.jar /usr/share/java/hamcrest-core.jar" if test "x${HAMCREST_JAR}" = "xyes"; then for path in ${it_extra_paths_hamcrest}; do if test -f ${path}; then HAMCREST_JAR=${path} break fi done fi if test x"${HAMCREST_JAR}" = "xyes"; then if test -f "/usr/share/java/hamcrest.jar"; then HAMCREST_JAR=/usr/share/java/hamcrest.jar fi fi if test x"${HAMCREST_JAR}" = "xyes"; then HAMCREST_JAR=no fi if test -z "$WINDOWS_TRUE"; then : if test x"${HAMCREST_JAR}" != "xno"; then HAMCREST_JAR=$(cygpath -m ${HAMCREST_JAR}) fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${HAMCREST_JAR}" >&5 $as_echo "${HAMCREST_JAR}" >&6; } if test x"${HAMCREST_JAR}" != "xno"; then WITH_HAMCREST_TRUE= WITH_HAMCREST_FALSE='#' else WITH_HAMCREST_TRUE='#' WITH_HAMCREST_FALSE= fi # Clear HAMCREST_JAR if it doesn't contain a valid filename if test x"${HAMCREST_JAR}" = "xno"; then HAMCREST_JAR= fi if test -n "${HAMCREST_JAR}" ; then HAMCREST_AVAILABLE=true else HAMCREST_AVAILABLE=false fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jacoco jar" >&5 $as_echo_n "checking for jacoco jar... " >&6; } # Check whether --with-jacoco was given. if test "${with_jacoco+set}" = set; then : withval=$with_jacoco; case "${withval}" in yes) JACOCO_JAR=yes ;; no) JACOCO_JAR=no ;; *) if test -f "${withval}"; then JACOCO_JAR="${withval}" elif test -z "${withval}"; then JACOCO_JAR=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "\"The jacoco jar ${withval} was not found.\"" "$LINENO" 5 fi ;; esac else JACOCO_JAR=yes fi it_extra_paths_jacoco="/usr/share/java/jacoco/org.jacoco.core.jar" if test "x${JACOCO_JAR}" = "xyes"; then for path in ${it_extra_paths_jacoco}; do if test -f ${path}; then JACOCO_JAR=${path} break fi done fi if test x"${JACOCO_JAR}" = "xyes"; then if test -f "/usr/share/java/jacoco.jar"; then JACOCO_JAR=/usr/share/java/jacoco.jar fi fi if test x"${JACOCO_JAR}" = "xyes"; then JACOCO_JAR=no fi if test -z "$WINDOWS_TRUE"; then : if test x"${JACOCO_JAR}" != "xno"; then JACOCO_JAR=$(cygpath -m ${JACOCO_JAR}) fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${JACOCO_JAR}" >&5 $as_echo "${JACOCO_JAR}" >&6; } if test x"${JACOCO_JAR}" != "xno"; then WITH_JACOCO_TRUE= WITH_JACOCO_FALSE='#' else WITH_JACOCO_TRUE='#' WITH_JACOCO_FALSE= fi # Clear JACOCO_JAR if it doesn't contain a valid filename if test x"${JACOCO_JAR}" = "xno"; then JACOCO_JAR= fi if test -n "${JACOCO_JAR}" ; then JACOCO_AVAILABLE=true else JACOCO_AVAILABLE=false fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for asm jar" >&5 $as_echo_n "checking for asm jar... " >&6; } # Check whether --with-asm was given. if test "${with_asm+set}" = set; then : withval=$with_asm; case "${withval}" in yes) ASM_JAR=yes ;; no) ASM_JAR=no ;; *) if test -f "${withval}"; then ASM_JAR="${withval}" elif test -z "${withval}"; then ASM_JAR=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "\"The asm jar ${withval} was not found.\"" "$LINENO" 5 fi ;; esac else ASM_JAR=yes fi it_extra_paths_asm="/usr/share/java/objectweb-asm4/asm-all.jar /usr/share/java/objectweb-asm4/asm-all-4.0.jar /usr/share/java/objectweb-asm/asm-all.jar" if test "x${ASM_JAR}" = "xyes"; then for path in ${it_extra_paths_asm}; do if test -f ${path}; then ASM_JAR=${path} break fi done fi if test x"${ASM_JAR}" = "xyes"; then if test -f "/usr/share/java/asm.jar"; then ASM_JAR=/usr/share/java/asm.jar fi fi if test x"${ASM_JAR}" = "xyes"; then ASM_JAR=no fi if test -z "$WINDOWS_TRUE"; then : if test x"${ASM_JAR}" != "xno"; then ASM_JAR=$(cygpath -m ${ASM_JAR}) fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ASM_JAR}" >&5 $as_echo "${ASM_JAR}" >&6; } if test x"${ASM_JAR}" != "xno"; then WITH_ASM_TRUE= WITH_ASM_FALSE='#' else WITH_ASM_TRUE='#' WITH_ASM_FALSE= fi # Clear ASM_JAR if it doesn't contain a valid filename if test x"${ASM_JAR}" = "xno"; then ASM_JAR= fi if test -n "${ASM_JAR}" ; then ASM_AVAILABLE=true else ASM_AVAILABLE=false fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tagsoup" >&5 $as_echo_n "checking for tagsoup... " >&6; } # Check whether --with-tagsoup was given. if test "${with_tagsoup+set}" = set; then : withval=$with_tagsoup; TAGSOUP_JAR=${withval} else TAGSOUP_JAR= fi if test -z "${TAGSOUP_JAR}"; then for dir in /usr/share/java /usr/local/share/java ; do if test -f $dir/tagsoup.jar; then TAGSOUP_JAR=$dir/tagsoup.jar break fi done fi if test -z "$WINDOWS_TRUE"; then : TAGSOUP_JAR=$(cygpath -m ${TAGSOUP_JAR}) fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TAGSOUP_JAR}" >&5 $as_echo "${TAGSOUP_JAR}" >&6; } if test -z "${TAGSOUP_JAR}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ***********************************************" >&5 $as_echo "***********************************************" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: * Warning you are building without tagsoup *" >&5 $as_echo "* Warning you are building without tagsoup *" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: * Some jnlps and most htmls will be malformed *" >&5 $as_echo "* Some jnlps and most htmls will be malformed *" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ***********************************************" >&5 $as_echo "***********************************************" >&6; } fi if test x$TAGSOUP_JAR != xno -a x$TAGSOUP_JAR != x ; then HAVE_TAGSOUP_TRUE= HAVE_TAGSOUP_FALSE='#' else HAVE_TAGSOUP_TRUE='#' HAVE_TAGSOUP_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mslinks" >&5 $as_echo_n "checking for mslinks... " >&6; } # Check whether --with-mslinks was given. if test "${with_mslinks+set}" = set; then : withval=$with_mslinks; MSLINKS_JAR=${withval} else MSLINKS_JAR= fi if test -z "${MSLINKS_JAR}"; then for dir in /usr/share/java /usr/local/share/java ; do if test -f $dir/mslinks.jar; then MSLINKS_JAR=$dir/mslinks.jar break fi done fi if test -z "$WINDOWS_TRUE"; then : MSLINKS_JAR=$(cygpath -m ${MSLINKS_JAR}) fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${MSLINKS_JAR}" >&5 $as_echo "${MSLINKS_JAR}" >&6; } if test -z "$WINDOWS_TRUE"; then : if test -z "${MSLINKS_JAR}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: **********************************************" >&5 $as_echo "**********************************************" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: * Warning you are building without mslinks *" >&5 $as_echo "* Warning you are building without mslinks *" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: * Your windows desktop integration will fail *" >&5 $as_echo "* Your windows desktop integration will fail *" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: **********************************************" >&5 $as_echo "**********************************************" >&6; } fi fi if test x$MSLINKS_JAR != xno -a x$MSLINKS_JAR != x ; then HAVE_MSLINKS_TRUE= HAVE_MSLINKS_FALSE='#' else HAVE_MSLINKS_TRUE='#' HAVE_MSLINKS_FALSE= fi if test "x$build_windows" = xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a WiX Toolset directory" >&5 $as_echo_n "checking for a WiX Toolset directory... " >&6; } # Check whether --with-wix was given. if test "${with_wix+set}" = set; then : withval=$with_wix; WIX_TOOLSET_DIR=${withval} fi if test x"${WIX_TOOLSET_DIR}" = x; then SYSTEM_CANDLE_IN_PATH="$(which candle.exe 2>&5)" if test -f "${SYSTEM_CANDLE_IN_PATH}" ; then WIX_TOOLSET_DIR="$(dirname "$(cygpath -m "${SYSTEM_CANDLE_IN_PATH}")")" fi fi if ! test -d "${WIX_TOOLSET_DIR}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"A WiX Toolset directory could not be found. ${WIX_TOOLSET_DIR}\"" >&5 $as_echo "$as_me: WARNING: \"A WiX Toolset directory could not be found. ${WIX_TOOLSET_DIR}\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"You can build itw, but can not generate MSI\"" >&5 $as_echo "$as_me: WARNING: \"You can build itw, but can not generate MSI\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"you can get WiX tools at http://wixtoolset.org/\"" >&5 $as_echo "$as_me: WARNING: \"you can get WiX tools at http://wixtoolset.org/\"" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${WIX_TOOLSET_DIR}" >&5 $as_echo "${WIX_TOOLSET_DIR}" >&6; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wixgen jar" >&5 $as_echo_n "checking for wixgen jar... " >&6; } # Check whether --with-wixgen was given. if test "${with_wixgen+set}" = set; then : withval=$with_wixgen; case "${withval}" in yes) WIXGEN_JAR=yes ;; no) WIXGEN_JAR=no ;; *) if test -f "${withval}"; then WIXGEN_JAR="${withval}" elif test -z "${withval}"; then WIXGEN_JAR=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "\"The wixgen jar ${withval} was not found.\"" "$LINENO" 5 fi ;; esac else WIXGEN_JAR=yes fi it_extra_paths_wixgen="/usr/share/java/wixgen.jar $WIX_TOOLSET_DIR/wixgen.jar $WIX_TOOLSET_DIR/../wixgen.jar" if test "x${WIXGEN_JAR}" = "xyes"; then for path in ${it_extra_paths_wixgen}; do if test -f ${path}; then WIXGEN_JAR=${path} break fi done fi if test x"${WIXGEN_JAR}" = "xyes"; then if test -f "/usr/share/java/wixgen.jar"; then WIXGEN_JAR=/usr/share/java/wixgen.jar fi fi if test x"${WIXGEN_JAR}" = "xyes"; then WIXGEN_JAR=no fi if test -z "$WINDOWS_TRUE"; then : if test x"${WIXGEN_JAR}" != "xno"; then WIXGEN_JAR=$(cygpath -m ${WIXGEN_JAR}) fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${WIXGEN_JAR}" >&5 $as_echo "${WIXGEN_JAR}" >&6; } if test x"${WIXGEN_JAR}" != "xno"; then WITH_WIXGEN_TRUE= WITH_WIXGEN_FALSE='#' else WITH_WIXGEN_TRUE='#' WITH_WIXGEN_FALSE= fi # Clear WIXGEN_JAR if it doesn't contain a valid filename if test x"${WIXGEN_JAR}" = "xno"; then WIXGEN_JAR= fi if test -n "${WIXGEN_JAR}" ; then WIXGEN_AVAILABLE=true else WIXGEN_AVAILABLE=false fi echo -n "checking for MSI deps... " if test "x$WIX_TOOLSET_DIR" = "x" ; then if test "x$WIXGEN_JAR" = "x" ; then echo "No WiX tools, nor wixgen jar, correct - build on linux or on windows witout MSI" else echo "No WiX tools, but wixgen jar - wixgen jar will do its job, but is useless. No MSI can be generated" fi else if test "x$WIXGEN_JAR" = "x" ; then echo "WiX tools, but no wixgen jar, fatal. You need wixgen.jar from https://github.com/akashche/wixgen" exit 1 else echo "WiX tools and wixgen jar - build on windows with MSI generation support" fi fi if test -n "$bashcompdir"; then pkg_cv_bashcompdir="$bashcompdir" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"bash-completion\""; } >&5 ($PKG_CONFIG --exists --print-errors "bash-completion") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_bashcompdir=`$PKG_CONFIG --variable="completionsdir" "bash-completion" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi bashcompdir=$pkg_cv_bashcompdir if test "x$bashcompdir" = x""; then : bashcompdir="${sysconfdir}/bash_completion.d" fi ac_config_files="$ac_config_files jrunscript" ac_config_files="$ac_config_files build.properties" # this is nasty hack to make GCC trully optional echo -n "destroying gcc config? ... " if test "x${enable_native_plugin}" = "xno" ; then am__fastdepCC_TRUE="#" am__fastdepCC_FALSE="#" am__fastdepCC="#" am__fastdepCXX_TRUE="#" am__fastdepCXX_FALSE="#" am__fastdepCXX="#" echo "destroyed!" else echo "no" fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CP_SUPPORTS_REFLINK_TRUE}" && test -z "${CP_SUPPORTS_REFLINK_FALSE}"; then as_fn_error $? "conditional \"CP_SUPPORTS_REFLINK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SRC_DIR_HARDLINKABLE_TRUE}" && test -z "${SRC_DIR_HARDLINKABLE_FALSE}"; then as_fn_error $? "conditional \"SRC_DIR_HARDLINKABLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_DOCS_TRUE}" && test -z "${ENABLE_DOCS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_DOCS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_WHITELIST_TRUE}" && test -z "${ENABLE_WHITELIST_FALSE}"; then as_fn_error $? "conditional \"ENABLE_WHITELIST\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SHELL_LAUNCHERS_TRUE}" && test -z "${ENABLE_SHELL_LAUNCHERS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SHELL_LAUNCHERS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_NATIVE_LAUNCHERS_TRUE}" && test -z "${ENABLE_NATIVE_LAUNCHERS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_NATIVE_LAUNCHERS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LINUX_TRUE}" && test -z "${LINUX_FALSE}"; then as_fn_error $? "conditional \"LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WINDOWS_TRUE}" && test -z "${WINDOWS_FALSE}"; then as_fn_error $? "conditional \"WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WINDOWS_OR_INCLUDE_BATS_TRUE}" && test -z "${WINDOWS_OR_INCLUDE_BATS_FALSE}"; then as_fn_error $? "conditional \"WINDOWS_OR_INCLUDE_BATS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_JAVA8_TRUE}" && test -z "${HAVE_JAVA8_FALSE}"; then as_fn_error $? "conditional \"HAVE_JAVA8\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_JAVA9_TRUE}" && test -z "${HAVE_JAVA9_FALSE}"; then as_fn_error $? "conditional \"HAVE_JAVA9\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${JAVADOC_SUPPORTS_J_OPTIONS_TRUE}" && test -z "${JAVADOC_SUPPORTS_J_OPTIONS_FALSE}"; then as_fn_error $? "conditional \"JAVADOC_SUPPORTS_J_OPTIONS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAS_ICEDTEA_REVISION_TRUE}" && test -z "${HAS_ICEDTEA_REVISION_FALSE}"; then as_fn_error $? "conditional \"HAS_ICEDTEA_REVISION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAS_PKGVERSION_TRUE}" && test -z "${HAS_PKGVERSION_FALSE}"; then as_fn_error $? "conditional \"HAS_PKGVERSION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_NATIVE_PLUGIN_TRUE}" && test -z "${ENABLE_NATIVE_PLUGIN_FALSE}"; then as_fn_error $? "conditional \"ENABLE_NATIVE_PLUGIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_PLUGINJAR_TRUE}" && test -z "${ENABLE_PLUGINJAR_FALSE}"; then as_fn_error $? "conditional \"ENABLE_PLUGINJAR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_XSLTPROC_TRUE}" && test -z "${WITH_XSLTPROC_FALSE}"; then as_fn_error $? "conditional \"WITH_XSLTPROC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_RHINO_TRUE}" && test -z "${WITH_RHINO_FALSE}"; then as_fn_error $? "conditional \"WITH_RHINO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_JUNIT_TRUE}" && test -z "${WITH_JUNIT_FALSE}"; then as_fn_error $? "conditional \"WITH_JUNIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_HAMCREST_TRUE}" && test -z "${WITH_HAMCREST_FALSE}"; then as_fn_error $? "conditional \"WITH_HAMCREST\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_JACOCO_TRUE}" && test -z "${WITH_JACOCO_FALSE}"; then as_fn_error $? "conditional \"WITH_JACOCO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_ASM_TRUE}" && test -z "${WITH_ASM_FALSE}"; then as_fn_error $? "conditional \"WITH_ASM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_TAGSOUP_TRUE}" && test -z "${HAVE_TAGSOUP_FALSE}"; then as_fn_error $? "conditional \"HAVE_TAGSOUP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_MSLINKS_TRUE}" && test -z "${HAVE_MSLINKS_FALSE}"; then as_fn_error $? "conditional \"HAVE_MSLINKS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_WIXGEN_TRUE}" && test -z "${WITH_WIXGEN_FALSE}"; then as_fn_error $? "conditional \"WITH_WIXGEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by icedtea-web $as_me 1.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to . icedtea-web home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ icedtea-web config.status 1.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "netx.manifest") CONFIG_FILES="$CONFIG_FILES netx.manifest" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "jrunscript") CONFIG_FILES="$CONFIG_FILES jrunscript" ;; "build.properties") CONFIG_FILES="$CONFIG_FILES build.properties" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "jrunscript":F) chmod u+x jrunscript ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi icedtea-web-1.8/PaxHeaders.7406/Makefile.am0000644000000000000000000000013113441742745015256 xustar0029 mtime=1552401893.02183286 30 atime=1552410814.796352645 30 ctime=1552410886.992183726 icedtea-web-1.8/Makefile.am0000644000175000002070000025101413441742745016072 0ustar00jvanekmock00000000000000if WINDOWS export CLASSPATH_SEPARATOR = ; else export CLASSPATH_SEPARATOR = : endif # Functions to compose path/classpath EMPTY := SPACE := $(EMPTY) $(EMPTY) define joinsegments $(subst $(SPACE),$(CLASSPATH_SEPARATOR),$(strip $1)) endef define composeclasspath $(if $(call joinsegments,$1),-classpath "$(call joinsegments,$1)",) endef # Source directories if WINDOWS export TOP_BUILD_DIR := $(shell cygpath -p -m "$(abs_top_builddir)") export TOP_SRC_DIR := $(shell cygpath -p -m "$(abs_top_srcdir)") export prefix := $(shell cygpath -p -m "$(prefix)") export CPA="-v" else export TOP_BUILD_DIR = $(abs_top_builddir) export TOP_SRC_DIR = $(abs_top_srcdir) export CPA="-av" WIN_LAUNCHERS= endif MODULARJDK_ARGS_FILE=itw-modularjdk.args if WINDOWS_OR_INCLUDE_BATS WIN_LAUNCHERS=launcher.build/$(javaws).bat launcher.build/$(itweb_settings).bat launcher.build/$(policyeditor).bat else WIN_LAUNCHERS= endif if ENABLE_SHELL_LAUNCHERS SHELL_LAUNCHERS=$(WIN_LAUNCHERS) launcher.build/$(MODULARJDK_ARGS_FILE) launcher.build/$(javaws).sh launcher.build/$(itweb_settings).sh launcher.build/$(policyeditor).sh else SHELL_LAUNCHERS= endif if ENABLE_NATIVE_LAUNCHERS NATIVE_LAUNCHERS=launcher.build/$(MODULARJDK_ARGS_FILE) launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor) DESKTOP_SUFFIX= else NATIVE_LAUNCHERS= DESKTOP_SUFFIX=.sh endif # javaws is program name, JAVAWS is used executable name. in 99.9% those are equals. # in unsupported case (no rust, and enforced shell launchers), it will become javaws.sh. # similar case is for other two binaries. JAVAWS=$(javaws)$(DESKTOP_SUFFIX) ITWEB_SETTINGS=$(itweb_settings)$(DESKTOP_SUFFIX) POLICYEDITOR=$(policyeditor)$(DESKTOP_SUFFIX) LAUNCHERS=$(NATIVE_LAUNCHERS) $(SHELL_LAUNCHERS) DESKTOP_FILES=javaws.desktop itweb-settings.desktop policyeditor.desktop DESKTOP_IN_FILES=javaws.desktop.in itweb-settings.desktop.in policyeditor.desktop.in export WIN_INSTALLER_DIR = $(TOP_BUILD_DIR)/win-installer.build export WIN_INSTALLER_SRC_DIR = $(TOP_SRC_DIR)/win-installer export NETX_DIR = $(TOP_BUILD_DIR)/netx.build export DOCS_DIR=$(TOP_BUILD_DIR)/icedtea-web-docs/$(FULL_VERSION) export NETX_SRCDIR = $(TOP_SRC_DIR)/netx export NETX_RESOURCE_DIR=$(NETX_SRCDIR)/net/sourceforge/jnlp/resources export ICONS_DEST_DIR=$(DESTDIR)$(datadir)/pixmaps export BASH_CMPL_DEST_DIR=$(DESTDIR)@bashcompdir@ export WIN_ALL_DEPS=$(DESTDIR)$(prefix)/win-deps-all export WIN_RUN_DEPS=$(DESTDIR)$(prefix)/win-deps-runtime export LINUX_BIN_DIST_DEPS=$(DESTDIR)$(prefix)/linux-deps-runtime export REPORT_STYLES_DIRNAME=report-styles export TESTS_SRCDIR=$(TOP_SRC_DIR)/tests export TESTS_DIR=$(TOP_BUILD_DIR)/tests.build export NETX_UNIT_TEST_SRCDIR=$(TESTS_SRCDIR)/netx/unit export NETX_TEST_DIR=$(TESTS_DIR)/netx export NETX_UNIT_TEST_DIR=$(NETX_TEST_DIR)/unit export JUNIT_RUNNER_DIR=$(TESTS_DIR)/junit-runner export JUNIT_RUNNER_SRCDIR=$(TESTS_SRCDIR)/junit-runner export JACOCO_OPERATOR_DIR=$(TESTS_DIR)/jacoco-operator export JACOCO_OPERATOR_SRCDIR=$(TESTS_SRCDIR)/jacoco-operator export TEST_EXTENSIONS_SRCDIR=$(TESTS_SRCDIR)/test-extensions export TEST_EXTENSIONS_TESTS_SRCDIR=$(TESTS_SRCDIR)/test-extensions-tests export REPRODUCERS_TESTS_SRCDIR=$(TESTS_SRCDIR)/reproducers export TEST_EXTENSIONS_DIR=$(TESTS_DIR)/test-extensions export CPP_UNITTEST_FRAMEWORK_SRCDIR=$(TESTS_SRCDIR)/UnitTest++ export CPP_UNITTEST_SRCDIR=$(TESTS_SRCDIR)/cpp-unit-tests export CPP_UNITTEST_DIR=$(TESTS_DIR)/cpp-unit-tests export TEST_EXTENSIONS_COMPATIBILITY_SYMLINK=$(TESTS_DIR)/netx/jnlp_testsengine export TEST_EXTENSIONS_TESTS_DIR=$(TESTS_DIR)/test-extensions-tests export REPRODUCERS_TESTS_SERVER_DEPLOYDIR=$(TESTS_DIR)/reproducers_test_server_deploydir export REPRODUCERS_BUILD_DIR=$(TESTS_DIR)/reproducers.classes export PRIVATE_KEYSTORE_NAME=teststore.ks export PRIVATE_KEYSTORE_PASS=123456789 export EXPORTED_TEST_CERT_PREFIX=icedteatests export EXPORTED_TEST_CERT_SUFFIX=crt export TEST_CERT_ALIAS=icedteaweb export PUBLIC_KEYSTORE_STUB=icedtea-web/security/trusted.certs export PUBLIC_KEYSTORE_PASS=changeit export JUNIT_RUNNER_JAR=$(TOP_BUILD_DIR)/junit-runner.jar export UNIT_CLASS_NAMES = $(TOP_BUILD_DIR)/unit_class_names export REPRODUCERS_CLASS_NAMES = $(TOP_BUILD_DIR)/reproducers_class_names export REPRODUCERS_CLASS_WHITELIST = $(TOP_SRC_DIR)/netx-dist-tests-whitelist export COVERAGE_JAVA_ARGS=-Xmx2G export COVERAGE_MODIFIED_FILES=tests-output.xml ServerAccess-logs.xml stdout.log stderr.log all.log export EMMA_BACKUP_SUFFIX=_noEmma export EMMA_SUFFIX=_withEmma export META_MANIFEST = META-INF/MANIFEST.MF export SIGNED_REPRODUCERS=signed signed2 export SIMPLE_REPRODUCERS=simple export CUSTOM_REPRODUCERS=custom export ALL_NONCUSTOM_REPRODUCERS=$(SIMPLE_REPRODUCERS) $(SIGNED_REPRODUCERS) export ALL_REPRODUCERS=$(ALL_NONCUSTOM_REPRODUCERS) $(CUSTOM_REPRODUCERS) export JACOCO_PATH:=$(shell dirname "$(JACOCO_JAR)") export JACOCO_AGENT=org.jacoco.agent.jar export JACOCO_ANT=org.jacoco.ant.jar export JACOCO_REPORT=org.jacoco.report.jar export JACOCO_AGENTRT=org.jacoco.agent.rt.jar export JACOCO_CORE=org.jacoco.core.jar export JACOCO_JAVAWS_RESULTS=$(TEST_EXTENSIONS_DIR)/jacoco_javaws.exec export JACOCO_PLUGIN_RESULTS=$(TEST_EXTENSIONS_DIR)/jacoco_plugin.exec # space separated fragments for composeclasspath export JACOCO_CLASSPATH=$(JACOCO_PATH)/$(JACOCO_CORE) $(JACOCO_PATH)/$(JACOCO_AGENT) $(JACOCO_PATH)/$(JACOCO_REPORT) $(JACOCO_PATH)/$(JACOCO_AGENTRT) $(JACOCO_PATH)/$(JACOCO_ANT) $(ASM_JAR) export JACOCO_AGENT_SWITCH_BODY=-javaagent:$(JACOCO_PATH)/$(JACOCO_AGENTRT) export JACOCO_BASE_EXCLUDE=org.junit.*:junit.* export JACOCO_ADVANCED_EXCLUDE=:*jacoco*:java.lang.*:java.reflect.*:java.util.*:sun.reflect.*:javax.swing.* export JACOCO_AGENT_SWITCH="$(JACOCO_AGENT_SWITCH_BODY)=excludes=$(JACOCO_BASE_EXCLUDE)$(JACOCO_ADVANCED_EXCLUDE),inclbootstrapclasses=true" export JACOCO_AGENT_JAVAWS_SWITCH=\"$(JACOCO_AGENT_SWITCH),destfile=$(JACOCO_JAVAWS_RESULTS)\" export JACOCO_AGENT_PLUGIN_SWITCH=\"$(JACOCO_AGENT_SWITCH),destfile=$(JACOCO_PLUGIN_RESULTS)\" export JACOCO_OPERATOR_EXEC=$(SYSTEM_JRE_DIR)/bin/java $(COVERAGE_JAVA_ARGS) -cp $(call joinsegments, $(JACOCO_OPERATOR_DIR) $(JACOCO_CLASSPATH) .) org.jacoco.operator.Main # linking variables export PLUGIN_LINK_NAME=libjavaplugin.so export MOZILLA_LOCAL_PLUGINDIR=${HOME}/.mozilla/plugins export MOZILLA_GLOBAL64_PLUGINDIR=/usr/lib64/mozilla/plugins export MOZILLA_GLOBAL32_PLUGINDIR=/usr/lib/mozilla/plugins export OPERA_GLOBAL64_PLUGINDIR=/usr/lib64/opera/plugins export OPERA_GLOBAL32_PLUGINDIR=/usr/lib/opera/plugins export BUILT_PLUGIN_LIBRARY=IcedTeaPlugin.so export CPP_UNITTEST_FRAMEWORK_BUILDDIR=$(CPP_UNITTEST_DIR)/UnitTest++ export CPP_UNITTEST_FRAMEWORK_LIB_NAME=libUnitTest++.a export CPP_UNITTEST_FRAMEWORK_LIB=$(CPP_UNITTEST_FRAMEWORK_BUILDDIR)/$(CPP_UNITTEST_FRAMEWORK_LIB_NAME) export CPP_UNITTEST_EXECUTABLE=$(CPP_UNITTEST_DIR)/IcedTeaPluginUnitTests export MOZILLA_LOCAL_BACKUP_FILE=${HOME}/$(PLUGIN_LINK_NAME).origU export MOZILLA_GLOBAL_BACKUP_FILE=${HOME}/$(PLUGIN_LINK_NAME).origMG export OPERA_GLOBAL_BACKUP_FILE=${HOME}/$(PLUGIN_LINK_NAME).origOG export MOZILLA_FAMILY_TEST= "$(FIREFOX)" != "" -o "$(CHROMIUM)" != "" -o "$(CHROME)" != "" -o "$(MIDORI)" != "" -o "$(EPIPHANY)" != "" # end of linking variables # Build directories # note this is *space* separated list, as composeclasspath is called on them in classpath usage JUNIT_RUNTIME:=$(JUNIT_JAR) $(HAMCREST_JAR) # support for javaws -html needs plugin.jar on classpath. rest of javaws works of course without it. # plugin jar is split into plugin.jar and jsobject.jar so it can run with modular (9+) jdk if ENABLE_PLUGINJAR PLUGIN_JAR=$(datadir)/$(PACKAGE_NAME)/plugin.jar JSOBJECT_JAR=$(datadir)/$(PACKAGE_NAME)/jsobject.jar endif NETX_JAR=$(datadir)/$(PACKAGE_NAME)/javaws.jar SPLASH_PNG=$(datadir)/$(PACKAGE_NAME)/javaws_splash.png MODULARJDK_ARGS_LOCATION=$(DESTDIR)$(MODULARJDK_ARGS_DIR)/$(MODULARJDK_ARGS_FILE) # Conditional defintions if HAVE_TAGSOUP if HAVE_MSLINKS NETX_EXCLUDE_SRCS= else NETX_EXCLUDE_SRCS=net.sourceforge.jnlp.util.WindowsDesktopEntry.java endif else if HAVE_MSLINKS NETX_EXCLUDE_SRCS=net.sourceforge.jnlp.MalformedXMLParser.java else NETX_EXCLUDE_SRCS=net.sourceforge.jnlp.MalformedXMLParser.java net.sourceforge.jnlp.util.WindowsDesktopEntry.java endif endif # Flags export IT_CFLAGS=$(CFLAGS) $(ARCHFLAG) export IT_JAVAC_SETTINGS=-g -encoding utf-8 $(JAVACFLAGS) $(MEMORY_LIMIT) $(PREFER_SOURCE) export IT_LANGUAGE_SOURCE_VERSION=8 export IT_CLASS_TARGET_VERSION=8 export IT_JAVACFLAGS=$(IT_JAVAC_SETTINGS) -source $(IT_LANGUAGE_SOURCE_VERSION) -target $(IT_CLASS_TARGET_VERSION) # # We need the jars in bootclasspath for a couple of reasons # - we use classes (in the sun.applet package) loaded by the bootclassloader # using another classloader to load classes from the same package causes an # IllegalAccessException # - we want full privileges # export UNIFIED_CLASSPATH_SEGMENTS=$(NETX_JAR) $(PLUGIN_JAR) $(JSOBJECT_JAR) $(RHINO_JAR) $(TAGSOUP_JAR) $(MSLINKS_JAR) export UNIFIED_JACOCO_CLASSPATH_SEGMENTS=$(UNIFIED_CLASSPATH_SEGMENTS) $(JACOCO_CLASSPATH) export UNIFIED_CLASSPATH=$(call joinsegments, $(UNIFIED_CLASSPATH_SEGMENTS)) export UNIFIED_JACOCO_CLASSPATH=$(call joinsegments, $(UNIFIED_JACOCO_CLASSPATH_SEGMENTS)) export UNIFIED_BOOTCLASSPATH=-Xbootclasspath/a:$(UNIFIED_CLASSPATH) # note javaws, itwebsettings and policyeditor (== LAUNCHER_BOOTCLASSPATH) must be always able to compile and run *without* plugin export LAUNCHER_BOOTCLASSPATH=$(UNIFIED_BOOTCLASSPATH) export PLUGIN_BOOTCLASSPATH='"$(UNIFIED_BOOTCLASSPATH)"' export PLUGIN_COVERAGE_BOOTCLASSPATH='"-Xbootclasspath/a:$(UNIFIED_JACOCO_CLASSPATH)"' # Fake update version to work with the Deployment Toolkit script used by Oracle # http://download.oracle.com/javase/tutorial/deployment/deploymentInDepth/depltoolkit_index.html export JDK_UPDATE_VERSION=50 # Sources list export PLUGIN_TEST_SRCS = $(TOP_SRC_DIR)/plugin/tests/LiveConnect/*.java export NETX_PKGS = javax.jnlp net.sourceforge.nanoxml net.sourceforge.jnlp \ net.sourceforge.jnlp.about \ net.sourceforge.jnlp.cache net.sourceforge.jnlp.config \ net.sourceforge.jnlp.controlpanel net.sourceforge.jnlp.event \ net.sourceforge.jnlp.runtime net.sourceforge.jnlp.security \ net.sourceforge.jnlp.security.viewer net.sourceforge.jnlp.services \ net.sourceforge.jnlp.tools net.sourceforge.jnlp.util \ sun.applet if ENABLE_PLUGINJAR export ICEDTEAPLUGIN_TARGET = stamps/liveconnect-dist.stamp export PLUGIN_DIR=$(TOP_BUILD_DIR)/plugin/icedteanp export PLUGIN_SRCDIR=$(TOP_SRC_DIR)/plugin/icedteanp export JSOBJECT_DIRS = netscape export SUN_APPLET_DIRS = sun/applet export PLUGIN_PKGS = sun.applet netscape.security netscape.javascript export LIVECONNECT_SRCS = $(PLUGIN_SRCDIR)/java export LIVECONNECT_DIR = $(JSOBJECT_DIRS) $(SUN_APPLET_DIRS) endif #overriding ICEDTEAPLUGIN_TARGET if ENABLE_NATIVE_PLUGIN export ICEDTEAPLUGIN_TARGET = $(PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) stamps/liveconnect-dist.stamp export ICEDTEAPLUGIN_CLEAN = clean-IcedTeaPlugin #this is for plugin testcoverage export COVERABLE_PLUGIN_DIR=$(TESTS_DIR)/icedteanp-build-with-jacoco endif if ENABLE_NATIVE_PLUGIN CPPUNIT_IMPL = run-cpp-unit-tests-impl CPPUNIT_CLEAN_IMPL = clean-cpp-unit-tests-impl CPPUNIT_FRAMEWORK_CLEAN_IMPL = clean-unittest++-impl else CPPUNIT_IMPL = run-cpp-unit-tests-impl-placeholder CPPUNIT_CLEAN_IMPL = clean-cpp-unit-tests-placeholder CPPUNIT_FRAMEWORK_CLEAN_IMPL = clean-unittest++-placeholder endif if CP_SUPPORTS_REFLINK REFLINK = --reflink=auto endif if SRC_DIR_HARDLINKABLE SRC_DIR_LINK = -l else SRC_DIR_LINK = $(REFLINK) endif if ENABLE_DOCS JAVADOC_OPTS=-use -keywords -encoding UTF-8 -splitIndex \ -bottom ' Submit a bug or feature' if HAVE_JAVA9 JAVADOC_OPTS+=-source $(IT_LANGUAGE_SOURCE_VERSION) endif if JAVADOC_SUPPORTS_J_OPTIONS JAVADOC_MEM_OPTS=-J-Xmx1024m -J-Xms128m endif endif # if you create netx-dist-tests-whitelist in top directory, and place "expr match" regexes # (separate by one of IFS's values (most commonly space)) into it, you can control reproducers which compile or/xor run. # if you need declare space in your regex, use \s as described in "expr match" documentation ECHO_WHITELIST=if [ -f $(REPRODUCERS_CLASS_WHITELIST) ] ; then cat $(REPRODUCERS_CLASS_WHITELIST) ; else echo ".*" ; fi if ENABLE_WHITELIST COMPILE_WHITELIST_FILTER=`$(ECHO_WHITELIST)` RUN_WHITELIST_FILTER=.* else COMPILE_WHITELIST_FILTER=.* RUN_WHITELIST_FILTER=`$(ECHO_WHITELIST)` endif if WITH_RHINO RHINO_TESTS=stamps/check-pac-functions.stamp else RHINO_TESTS= endif if WITH_JUNIT JUNIT_TESTS=stamps/run-netx-unit-tests.stamp else JUNIT_TESTS= endif export PLUGIN_VERSION = IcedTea-Web $(FULL_VERSION) export EXTRA_DIST = $(MODULARJDK_ARGS_FILE) $(top_srcdir)/netx $(top_srcdir)/plugin javaws.png $(DESKTOP_IN_FILES) $(top_srcdir)/completion \ shell-launcher rust-launcher $(top_srcdir)/tests html-gen.sh NEW_LINE_IFS $(top_srcdir)/metadata.in $(top_srcdir)/win-installer # reproducers `D`shortcuts export DTEST_SERVER=-Dtest.server.dir=$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) export DJAVAWS_BUILD=-Djavaws.build.bin=$(DESTDIR)$(bindir)/$(JAVAWS) export DBROWSERS=-Dused.browsers=$(FIREFOX):$(CHROMIUM):$(CHROME):$(OPERA):$(MIDORI):$(EPIPHANY) export REPRODUCERS_DPARAMETERS= $(DTEST_SERVER) $(DJAVAWS_BUILD) $(DBROWSERS) $(BROWSER_TESTS_MODIFICATION) # end of `D`shortcuts #exported autoconf copies export EXPORTED_JAVAC=$(SYSTEM_JDK_DIR)/bin/javac export EXPORTED_JAR=$(SYSTEM_JDK_DIR)/bin/jar export EXPORTED_KEYTOOL=$(SYSTEM_JDK_DIR)/bin/keytool export EXPORTED_JARSIGNER=$(SYSTEM_JDK_DIR)/bin/jarsigner export EXPORTED_PACK200=$(SYSTEM_JDK_DIR)/bin/pack200 #end of exported autoconf copies # binary names javaws:= $(shell echo javaws | sed '@program_transform_name@') itweb_settings:= $(shell echo itweb-settings | sed '@program_transform_name@') policyeditor:= $(shell echo policyeditor | sed '@program_transform_name@') if WINDOWS_OR_INCLUDE_BATS # convert Unix newlines (LF) to DOS format: fix_CRLF=-e "s/\$$/\r/" else fix_CRLF= endif # the launcher needs to know $(bindir) and $(datadir) which can be different at # make-time from configure-time edit_launcher_script = sed \ -e "s|[@]LAUNCHER_BOOTCLASSPATH[@]|$(LAUNCHER_BOOTCLASSPATH)|g" \ -e "s|[@]JAVAWS_SPLASH_LOCATION[@]|$(SPLASH_PNG)|g" \ -e "s|[@]JAVA[@]|$(JAVA)|g" \ -e "s|[@]JRE[@]|$(SYSTEM_JRE_DIR)|g" \ -e "s|[@]MAIN_CLASS[@]|$${MAIN_CLASS}|g" \ -e "s|[@]BIN_LOCATION[@]|$${BIN_LOCATION}|g" \ -e "s|[@]NETX_JAR[@]|$(NETX_JAR)|g" \ -e "s|[@]PLUGIN_JAR[@]|$(PLUGIN_JAR)|g" \ -e "s|[@]JSOBJECT_JAR[@]|$(JSOBJECT_JAR)|g" \ -e "s|[@]MSLINKS_JAR[@]|$(MSLINKS_JAR)|g" \ -e "s|[@]TAGSOUP_JAR[@]|$(TAGSOUP_JAR)|g" \ -e "s|[@]RHINO_JAR[@]|$(RHINO_JAR)|g" \ -e "s|[@]PROGRAM_NAME[@]|$${PROGRAM_NAME}|g" \ -e "s|[@]MODULARJDK_ARGS_LOCATION[@]|$(MODULARJDK_ARGS_LOCATION)|g" # Top-Level Targets # ================= all-local: stamps/netx-dist.stamp stamps/plugin.stamp stamps/docs.stamp \ $(LAUNCHERS) $(DESKTOP_FILES) check-local: $(RHINO_TESTS) $(JUNIT_TESTS) clean-local: clean-netx clean-plugin clean-liveconnect \ clean-native-ecj clean-launchers clean-desktop-files clean-docs clean-generated-docs clean-metadata clean-icedteaweb-completion clean-tests clean-bootstrap-directory clean-win-installer if [ -e stamps ] ; then \ rmdir stamps ; \ fi .PHONY: clean-IcedTeaPlugin clean-add-netx clean-add-netx-debug clean-add-plugin clean-add-plugin-debug \ clean-bootstrap-directory clean-native-ecj clean-desktop-files clean-netx-docs clean-docs clean-plugin-docs clean-generated-docs clean-icedteaweb-completion\ clean-tests check-local clean-launchers stamps/check-pac-functions.stamp stamps/run-netx-unit-tests.stamp clean-netx-tests \ clean-junit-runner clean-netx-unit-tests clean-metadata win-installer clean-win-installer install-exec-local: ${mkinstalldirs} $(DESTDIR)$(bindir) $(DESTDIR)$(datadir)/$(PACKAGE_NAME)/ $(DESTDIR)$(libdir) $(ICONS_DEST_DIR) $(BASH_CMPL_DEST_DIR) if ENABLE_NATIVE_PLUGIN ${INSTALL_PROGRAM} $(PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) $(DESTDIR)$(libdir) endif if ENABLE_PLUGINJAR ${INSTALL_DATA} $(TOP_BUILD_DIR)/liveconnect/lib/classes-applet.jar $(DESTDIR)$(PLUGIN_JAR) ${INSTALL_DATA} $(TOP_BUILD_DIR)/liveconnect/lib/classes-jsobject.jar $(DESTDIR)$(JSOBJECT_JAR) endif ${INSTALL_DATA} $(NETX_DIR)/lib/classes.jar $(DESTDIR)$(NETX_JAR) ${INSTALL_DATA} $(NETX_SRCDIR)/javaws_splash.png $(DESTDIR)$(SPLASH_PNG) ${INSTALL_DATA} $(TOP_SRC_DIR)/javaws.png $(ICONS_DEST_DIR)/ mkdir -p $(DESTDIR)$(MODULARJDK_ARGS_DIR) cp launcher.build/$(MODULARJDK_ARGS_FILE) $(MODULARJDK_ARGS_LOCATION) if ENABLE_NATIVE_LAUNCHERS ${INSTALL_PROGRAM} launcher.build/$(javaws) $(DESTDIR)$(bindir) ${INSTALL_PROGRAM} launcher.build/$(itweb_settings) $(DESTDIR)$(bindir) ${INSTALL_PROGRAM} launcher.build/$(policyeditor) $(DESTDIR)$(bindir) endif if ENABLE_SHELL_LAUNCHERS ${INSTALL_PROGRAM} launcher.build/$(javaws).sh $(DESTDIR)$(bindir) ${INSTALL_PROGRAM} launcher.build/$(itweb_settings).sh $(DESTDIR)$(bindir) ${INSTALL_PROGRAM} launcher.build/$(policyeditor).sh $(DESTDIR)$(bindir) if WINDOWS_OR_INCLUDE_BATS ${INSTALL_PROGRAM} launcher.build/$(javaws).bat $(DESTDIR)$(bindir) ${INSTALL_PROGRAM} launcher.build/$(itweb_settings).bat $(DESTDIR)$(bindir) ${INSTALL_PROGRAM} launcher.build/$(policyeditor).bat $(DESTDIR)$(bindir) endif endif ${INSTALL_DATA} $(TOP_BUILD_DIR)/completion/itweb-settings.bash $(BASH_CMPL_DEST_DIR)/ ${INSTALL_DATA} $(TOP_BUILD_DIR)/completion/javaws.bash $(BASH_CMPL_DEST_DIR)/ ${INSTALL_DATA} $(TOP_BUILD_DIR)/completion/policyeditor.bash $(BASH_CMPL_DEST_DIR)/ # all generated manpages are installed in swarm # all windows depndences are copied for windows build, and known one are copied/removed as necessary # the makefile variables are used in favor of global variables, but maybe they will need to get mixed together install-data-local: printvarsfile ${mkinstalldirs} -d $(DESTDIR)$(mandir) cp -r "$(DOCS_DIR)/man/"* $(DESTDIR)$(mandir)/ if ENABLE_DOCS ${mkinstalldirs} $(DESTDIR)$(htmldir) (cd ${TOP_BUILD_DIR}/docs/netx; \ for files in $$(find . -type f); \ do \ ${INSTALL_DATA} -D $${files} $(DESTDIR)$(htmldir)/netx/$${files}; \ done) if ENABLE_PLUGINJAR (cd ${TOP_BUILD_DIR}/docs/plugin; \ for files in $$(find . -type f); \ do \ ${INSTALL_DATA} -D $${files} $(DESTDIR)$(htmldir)/plugin/$${files}; \ done) endif endif if WINDOWS_OR_INCLUDE_BATS mkdir -p $(WIN_ALL_DEPS) mkdir -p $(WIN_RUN_DEPS) JARSVARS=` ( set -o posix ; set ) | sed "s/.*=//" | grep \\.jar$$ | grep \\.jar.exe$$ ` ; \ JARSMAKE=` cat $(TOP_BUILD_DIR)/printvarsfile | sed "s/.*=//" | grep \\.jar$$ ` ; \ for JAR in $$JARSMAKE ; do \ if [ -f $ $$JAR ] ; then \ cp -v $$JAR $(WIN_ALL_DEPS)/ ; \ fi ; \ done ; rm -f $(WIN_ALL_DEPS)/jar ; for JAR in `ls $(DESTDIR)$(datadir)/$(PACKAGE_NAME)/*.jar` ; do \ rm -fv $(WIN_ALL_DEPS)/`basename $$JAR` ; \ done; if WITH_RHINO filteredName=`basename $(RHINO_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ cp -v $(RHINO_JAR) $(WIN_RUN_DEPS)/$$filteredName endif if HAVE_TAGSOUP filteredName=`basename $(TAGSOUP_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ cp -v $(TAGSOUP_JAR) $(WIN_RUN_DEPS)/$$filteredName endif if HAVE_MSLINKS filteredName=`basename $(MSLINKS_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ cp -v $(MSLINKS_JAR) $(WIN_RUN_DEPS)/$$filteredName endif endif #no npapi plugin at all! linux-bin-dist: install rm -f $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) mkdir -p $(LINUX_BIN_DIST_DEPS) if WITH_RHINO filteredName=`basename $(RHINO_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ cp -v $(RHINO_JAR) $(LINUX_BIN_DIST_DEPS)/$$filteredName endif if HAVE_TAGSOUP filteredName=`basename $(TAGSOUP_JAR) | sed "s/[^a-zA-Z]//g" | sed "s/jar$$/.jar/"` ; \ cp -v $(TAGSOUP_JAR) $(LINUX_BIN_DIST_DEPS)/$$filteredName endif cp $(NETX_DIR)/lib/src.zip $(DESTDIR)$(prefix)/netx.src.zip if ENABLE_PLUGINJAR cp $(TOP_BUILD_DIR)/liveconnect/lib/src.zip $(DESTDIR)$(prefix)/plugin.src.zip endif if ENABLE_DOCS cp -r $(DOCS_DIR)/html $(DESTDIR)$(prefix)/icedtea-web-docs endif if [ ! -e $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ] ; then cp $(MODULARJDK_ARGS_LOCATION) $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ; fi (cd $(DESTDIR)$(prefix)/.. && $(ZIP) -qr $(TOP_BUILD_DIR)/$(distdir).linux.bin.zip `basename $(DESTDIR)$(prefix)` ); win-bin-dist: win-only-image (cd $(DESTDIR)$(prefix)/.. && $(ZIP) -qr $(TOP_BUILD_DIR)/$(distdir).win.bin.zip `basename $(DESTDIR)$(prefix)` ); if WINDOWS # strips cygwin and other linux-like blobs. keeping only windows-usefull stuff win-only-image: install uninstall-linux-only remove-empty-linux-only-dirs rm -rf $(WIN_ALL_DEPS) if [ ! -e $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ] ; then cp $(MODULARJDK_ARGS_LOCATION) $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ; fi if ENABLE_DOCS cp -r $(DOCS_DIR)/html $(DESTDIR)$(prefix)/icedtea-web-docs endif cp $(NETX_DIR)/lib/src.zip $(DESTDIR)$(prefix)/netx.src.zip if ENABLE_PLUGINJAR cp $(TOP_BUILD_DIR)/liveconnect/lib/src.zip $(DESTDIR)$(prefix)/plugin.src.zip endif clean-win-installer: rm -rf $(WIN_INSTALLER_DIR) $(WIN_INSTALLER_DIR)/itw-installer.json: clean-win-installer mkdir $(WIN_INSTALLER_DIR) sed \ -e "s|../win-installer|$(WIN_INSTALLER_SRC_DIR)|g" \ -e s/[@]PACKAGE_VERSION[@]/$(PACKAGE_VERSION)/g $(WIN_INSTALLER_SRC_DIR)/installer.json.in > $@ win-installer: win-only-image $(WIN_INSTALLER_DIR)/itw-installer.json "$(JAVA)" -jar "$(WIXGEN_JAR)" "$(DESTDIR)$(prefix)" -c $(WIN_INSTALLER_DIR)/itw-installer.json -o $(WIN_INSTALLER_DIR)/itw-installer.wxs cd $(WIN_INSTALLER_DIR) && "$(WIX_TOOLSET_DIR)"/candle.exe /nologo itw-installer.wxs cd $(WIN_INSTALLER_DIR) && "$(WIX_TOOLSET_DIR)"/light.exe /nologo -ext WixUIExtension itw-installer.wixobj endif # note that this is called only from windows specific target (hidden otherwise) remove-empty-linux-only-dirs: echo "*************************************************************************" ; \ echo "* If run without prefix or on non-windows machine, may harm your system *" ; \ echo "*************************************************************************" ; \ MAN_DIRS_TO_CHECK_AND_CLEAN="de/man1 pl/man1 cs/man1 de pl cs man1 " ; \ for manDirName in $$MAN_DIRS_TO_CHECK_AND_CLEAN ; do \ dirCandidate=$(DESTDIR)$(mandir)/$$manDirName ; \ if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ; \ done dirCandidate=$(DESTDIR)$(mandir)/$$manDirName ; \ if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ; DEFAULT_CMPL_DIRS_TO_CHECK_AND_CLEAN="$(BASH_CMPL_DEST_DIR) `dirname $(BASH_CMPL_DEST_DIR)` $$(dirname $$(dirname $(BASH_CMPL_DEST_DIR)))" ; \ for cmplDirName in $$DEFAULT_CMPL_DIRS_TO_CHECK_AND_CLEAN ; do \ dirCandidate=$$cmplDirName ; \ if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ; \ done dirCandidate=$(DESTDIR)$(libdir)/ ; \ if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ; # all generated manpages must be removed one by one # shell (only shell!) launchers must go away uninstall-linux-only: KNOWN_MANS="icedtea-web.1 icedtea-web-plugin.1 itweb-settings.1 javaws.1 policyeditor.1" ; \ KNOWN_DIRS="man1 de/man1 pl/man1 cs/man1" ; \ for file in $$KNOWN_MANS ; do \ for dir in $$KNOWN_DIRS ; do \ rm -f $(DESTDIR)$(mandir)/$$dir/$$file ; \ done ; \ done rm -f $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) rm -f $(DESTDIR)$(bindir)/$(javaws).sh rm -f $(DESTDIR)$(bindir)/$(itweb_settings).sh rm -f $(DESTDIR)$(bindir)/$(policyeditor).sh rm -f $(BASH_CMPL_DEST_DIR)/itweb-settings.bash rm -f $(BASH_CMPL_DEST_DIR)/javaws.bash rm -f $(BASH_CMPL_DEST_DIR)/policyeditor.bash uninstall-local: uninstall-linux-only rm -f $(DESTDIR)$(PLUGIN_JAR) rm -f $(DESTDIR)$(JSOBJECT_JAR) rm -f $(DESTDIR)$(NETX_JAR) rm -r $(DESTDIR)$(SPLASH_PNG) rm -r $(ICONS_DEST_DIR)/javaws.png rm -rf $(DESTDIR)$(htmldir) if WINDOWS_OR_INCLUDE_BATS rm -rf $(WIN_ALL_DEPS) rm -rf $(WIN_RUN_DEPS) rm -f $(DESTDIR)$(bindir)/$(javaws).bat rm -f $(DESTDIR)$(bindir)/$(itweb_settings).bat rm -f $(DESTDIR)$(bindir)/$(policyeditor).bat endif # Plugin if ENABLE_NATIVE_PLUGIN # IcedTeaPlugin.so. # Separate compile and link invocations to ensure intermediate object # is listed before -l options. See: # http://developer.mozilla.org/en/docs/XPCOM_Glue PLUGIN_SRC=IcedTeaNPPlugin.cc IcedTeaScriptablePluginObject.cc \ IcedTeaJavaRequestProcessor.cc IcedTeaPluginRequestProcessor.cc \ IcedTeaPluginUtils.cc IcedTeaParseProperties.cc PLUGIN_OBJECTS=IcedTeaNPPlugin.o IcedTeaScriptablePluginObject.o \ IcedTeaJavaRequestProcessor.o IcedTeaPluginRequestProcessor.o \ IcedTeaPluginUtils.o IcedTeaParseProperties.o $(PLUGIN_DIR)/%.o: $(PLUGIN_SRCDIR)/%.cc mkdir -p $(PLUGIN_DIR) && \ cd $(PLUGIN_DIR) && \ $(CXX) $(CXXFLAGS) \ $(DEFS) $(VERSION_DEFS) \ -DJDK_UPDATE_VERSION="\"$(JDK_UPDATE_VERSION)\"" \ -DPLUGIN_NAME="\"IcedTea-Web Plugin\"" \ -DJAVAWS_BIN="\"$(bindir)/$(JAVAWS)\"" \ -DJAVAWS_NAME="\"$(javaws)\"" \ -DPLUGIN_VERSION="\"$(PLUGIN_VERSION)\"" \ -DPACKAGE_URL="\"$(PACKAGE_URL)\"" \ -DMOZILLA_VERSION_COLLAPSED="$(MOZILLA_VERSION_COLLAPSED)" \ -DICEDTEA_WEB_JRE="\"$(SYSTEM_JRE_DIR)\"" \ -DPLUGIN_BOOTCLASSPATH=$(PLUGIN_BOOTCLASSPATH) \ -DNETX_JAR="\"$(NETX_JAR)\"" \ -DPLUGIN_JAR="\"$(PLUGIN_JAR)\"" \ -DJSOBJECT_JAR="\"$(JSOBJECT_JAR)\""\ $(GLIB_CFLAGS) \ $(MOZILLA_CFLAGS) \ -fvisibility=hidden \ -fPIC -o $@ -c $< $(PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY): $(addprefix $(PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) cd $(PLUGIN_DIR) && \ $(CXX) $(CXXFLAGS) \ $(PLUGIN_OBJECTS) \ $(GLIB_LIBS) \ $(MOZILLA_LIBS) \ -shared -o $@ # Start of CPP Unit test targets # Note that UnitTest++ has its own makefile, however this is avoided because it creates an in-source build. $(CPP_UNITTEST_FRAMEWORK_LIB): $(CPP_UNITTEST_FRAMEWORK_SRCDIR) mkdir -p $(CPP_UNITTEST_FRAMEWORK_BUILDDIR) && \ pushd $(CPP_UNITTEST_FRAMEWORK_SRCDIR) && \ for cppfile in $$(find $(CPP_UNITTEST_FRAMEWORK_SRCDIR) -name '*.cpp') ; \ do \ objfile="$(CPP_UNITTEST_FRAMEWORK_BUILDDIR)/$$(basename $${cppfile%.cpp}).o" ; \ $(CXX) $(CXXFLAGS) -c $$cppfile -o $$objfile || exit 1 ; \ done ; \ ar cr $(CPP_UNITTEST_FRAMEWORK_LIB) $(CPP_UNITTEST_FRAMEWORK_BUILDDIR)/*.o ; \ popd clean-unittest++-impl: rm -f $(CPP_UNITTEST_FRAMEWORK_BUILDDIR)/*.o rm -f $(CPP_UNITTEST_FRAMEWORK_LIB) if [ -e $(CPP_UNITTEST_FRAMEWORK_BUILDDIR) ] ; then \ rmdir $(CPP_UNITTEST_FRAMEWORK_BUILDDIR) ; \ fi stamps/cpp-unit-tests-compile.stamp: $(CPP_UNITTEST_FRAMEWORK_LIB) $(CPP_UNITTEST_SRCDIR) $(addprefix $(PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) mkdir -p $(CPP_UNITTEST_DIR) && \ pushd $(CPP_UNITTEST_SRCDIR) && \ for cppfile in $$(find $(CPP_UNITTEST_SRCDIR) -name '*.cc') ; \ do \ objfile="$(CPP_UNITTEST_DIR)/$$(basename $${cppfile%.cc}).o" ; \ echo "Compiling $$cppfile to $$objfile"; \ $(CXX) $(CXXFLAGS) \ $(DEFS) $(VERSION_DEFS) \ -DJDK_UPDATE_VERSION="\"$(JDK_UPDATE_VERSION)\"" \ -DPLUGIN_NAME="\"IcedTea-Web Plugin\"" \ -DJAVAWS_BIN="\"$(bindir)/$(JAVAWS)\"" \ -DJAVAWS_NAME="\"$(javaws)\"" \ -DPLUGIN_VERSION="\"$(PLUGIN_VERSION)\"" \ -DPACKAGE_URL="\"$(PACKAGE_URL)\"" \ -DMOZILLA_VERSION_COLLAPSED="$(MOZILLA_VERSION_COLLAPSED)" \ -DICEDTEA_WEB_JRE="\"$(SYSTEM_JRE_DIR)\"" \ -DPLUGIN_BOOTCLASSPATH=$(PLUGIN_BOOTCLASSPATH) \ -DNETX_JAR="\"$(NETX_JAR)\"" \ -DPLUGIN_JAR="\"$(PLUGIN_JAR)\"" \ -DJSOBJECT_JAR="\"$(JSOBJECT_JAR)\""\ $(GLIB_CFLAGS) \ $(MOZILLA_CFLAGS) \ "-I$(CPP_UNITTEST_FRAMEWORK_SRCDIR)/src" \ "-I$(PLUGIN_SRCDIR)" \ -o $$objfile -c $$cppfile || exit 1 ; \ done ; \ popd ; \ mkdir -p stamps ; \ touch $@ $(CPP_UNITTEST_EXECUTABLE): $(CPP_UNITTEST_FRAMEWORK_LIB) stamps/cpp-unit-tests-compile.stamp cd $(CPP_UNITTEST_DIR) && \ $(CXX) $(CXXFLAGS) \ $(addprefix $(PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) \ $(CPP_UNITTEST_DIR)/*.o \ -lrt \ -lpthread \ $(GLIB_LIBS) \ $(MOZILLA_LIBS) \ $(CPP_UNITTEST_FRAMEWORK_LIB)\ $(BUILT_CPP_UNIT_TEST_FRAMEWORK) -o $@ clean-cpp-unit-tests-impl: rm -f stamps/cpp-unit-tests-compile.stamp rm -f $(CPP_UNITTEST_EXECUTABLE) rm -f $(CPP_UNITTEST_DIR)/*.o run-cpp-unit-tests-impl: $(CPP_UNITTEST_EXECUTABLE) $(CPP_UNITTEST_EXECUTABLE) # End of CPP Unit test targets clean-IcedTeaPlugin: rm -f $(PLUGIN_DIR)/*.o rm -f $(PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) if [ $(TOP_SRC_DIR) != $(TOP_BUILD_DIR) ]; then \ if [ -e $(TOP_BUILD_DIR)/plugin/icedteanp ] ; then \ rmdir $(TOP_BUILD_DIR)/plugin/icedteanp ; \ rmdir $(TOP_BUILD_DIR)/plugin ; \ fi ; \ fi endif clean-unittest++-placeholder: clean-cpp-unit-tests-placeholder: echo "plugin disabled" run-cpp-unit-tests-impl-placeholder: echo "plugin disabled" clean-unittest++: $(CPPUNIT_FRAMEWORK_CLEAN_IMPL) clean-cpp-unit-tests: $(CPPUNIT_CLEAN_IMPL) run-cpp-unit-tests: $(CPPUNIT_IMPL) stamps/plugin.stamp: $(ICEDTEAPLUGIN_TARGET) mkdir -p stamps touch stamps/plugin.stamp clean-plugin: $(ICEDTEAPLUGIN_CLEAN) rm -f stamps/plugin.stamp liveconnect-source-files.txt: if WINDOWS echo "Using WEmbeddedFrame" ; \ sed "s;sun.awt.X11.XEmbeddedFrame;sun.awt.windows.WEmbeddedFrame;" -i $(LIVECONNECT_SRCS)/$(SUN_APPLET_DIRS)/PluginAppletViewer.java ; \ sed "s;XEmbeddedFrame;WEmbeddedFrame;" -i $(LIVECONNECT_SRCS)/$(SUN_APPLET_DIRS)/PluginAppletViewer.java ; \ sed "s;super(handle, true);super(handle);" -i $(LIVECONNECT_SRCS)/$(SUN_APPLET_DIRS)/PluginAppletViewer.java ; else echo "Using XEmbeddedFrame" ; endif if test "x${LIVECONNECT_DIR}" != x; then \ find $(LIVECONNECT_SRCS) -name '*.java' | sort > $@ ; \ fi ; \ touch $@ stamps/liveconnect.stamp: liveconnect-source-files.txt stamps/netx.stamp if test "x${LIVECONNECT_DIR}" != x; then \ mkdir -p $(TOP_BUILD_DIR)/liveconnect && \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(TOP_BUILD_DIR)/liveconnect \ $(call composeclasspath,$(NETX_DIR) $(MSLINKS_JAR) $(TAGSOUP_JAR) $(RHINO_JAR)) \ -sourcepath $(LIVECONNECT_SRCS) \ @liveconnect-source-files.txt ; \ fi mkdir -p stamps touch $@ # although sun and netscape packages were compiled together, we pack and install them as two jars, to follow java.desktop and jdk.jsobject jdk9 modules # the all together jar is kept for usage in tests. Feel free to remove and refactor stamps/liveconnect-dist.stamp: stamps/liveconnect.stamp if test "x${LIVECONNECT_DIR}" != x; then \ (cd $(TOP_BUILD_DIR)/liveconnect ; \ mkdir -p lib ; \ $(SYSTEM_JDK_DIR)/bin/jar cf lib/classes.jar $(LIVECONNECT_DIR) ; \ $(SYSTEM_JDK_DIR)/bin/jar cf lib/classes-applet.jar $(SUN_APPLET_DIRS) ; \ $(SYSTEM_JDK_DIR)/bin/jar cf lib/classes-jsobject.jar $(JSOBJECT_DIRS) ; \ cp -pPR $(SRC_DIR_LINK) $(LIVECONNECT_SRCS) src; \ find src -type f -exec chmod 640 '{}' ';' -o -type d -exec chmod 750 '{}' ';'; \ cd src ; \ $(ZIP) -qr $(TOP_BUILD_DIR)/liveconnect/lib/src.zip $(LIVECONNECT_DIR) ) ; \ fi mkdir -p stamps touch $@ clean-liveconnect: rm -rf $(TOP_BUILD_DIR)/liveconnect rm -f stamps/liveconnect-dist.stamp rm -f liveconnect-source-files.txt rm -f stamps/liveconnect.stamp # NetX netx-source-files.txt: find $(NETX_SRCDIR) -name '*.java' | sort > $@ ; \ for src in $(NETX_EXCLUDE_SRCS) ; \ do \ sed -i "/$${src}/ d" $@ ; \ done if !WITH_RHINO sed -i '/RhinoBasedPacEvaluator/ d' $@ endif # if 'sed' will be missing on machine, use old IFS hack as on other places # the 'sed' cycles is changing some custom version like 1.6.2 fedora23.4 to simple 1.6 # if changed, keep in mind that also 1.7 should bubble to 1.7 # also 1.7pre or 1.7preHASH should end up like 1.7 $(TOP_BUILD_DIR)/metadata: $(top_srcdir)/metadata.in mkdir -p $(TOP_BUILD_DIR)/metadata-work ; \ METAFILES=`ls $(top_srcdir)/metadata.in` ; \ SEDDED_VERSION=`echo "$(FULL_VERSION)" | sed 's/[^0-9]\+/ /g'` ; \ x=0; for i in $$SEDDED_VERSION ; do \ let x++; \ if [ $$x -eq 1 ] ; then V1=$$i; fi; \ if [ $$x -eq 2 ] ; then V2=$$i; fi; \ done; \ XVERSION=$$V1.$$V2; \ for F in $$METAFILES ; do \ cat $(top_srcdir)/metadata.in/$$F | sed "s;%{name};$(PACKAGE_NAME);g" | sed "s;%{version};$$XVERSION;g" > $(TOP_BUILD_DIR)/metadata-work/$$F ; \ done ; \ mv $(TOP_BUILD_DIR)/metadata-work $(TOP_BUILD_DIR)/metadata ; check-metadata: $(TOP_BUILD_DIR)/metadata xmllint --noout $(TOP_BUILD_DIR)/metadata/* ; \ if [ $$? -eq 0 ] ; then \ echo "Passed: well formed" ; \ else \ echo "FAILED: well formed" ; \ fi ; \ xmllint --noout --schema http://maven.apache.org/xsd/maven-4.0.0.xsd $(TOP_BUILD_DIR)/metadata/*.pom ; \ if [ $$? -eq 0 ] ; then \ echo "Passed: valid poms" ; \ else \ echo "FAILED: valid poms" ; \ fi ; \ appstream-util validate $(TOP_BUILD_DIR)/metadata/*.appdata.xml $(TOP_BUILD_DIR)/metadata/*.metainfo.xml ; \ if [ $$? -eq 0 ] ; then \ echo "Passed: valid software descriptors" ; \ else \ echo "FAILED: valid software descriptors" ; \ fi ; # very strange results: # appstreamcli validate $(TOP_BUILD_DIR)/metadata/*.appdata.xml $(TOP_BUILD_DIR)/metadata/*.metainfo.xml $(TOP_BUILD_DIR)/completion/itweb-settings.bash: $(TOP_SRC_DIR)/completion/itweb-settings.bash.in stamps/netx.stamp OPTIONS_COMMAND="$(SYSTEM_JRE_DIR)/bin/java -cp $(NETX_DIR) net.sourceforge.jnlp.OptionsDefinitions" ; \ OPTIONS=`$$OPTIONS_COMMAND itweb-settings`; \ echo $$OPTIONS ; \ cat $(TOP_SRC_DIR)/completion/itweb-settings.bash.in | \ sed "s/@OPTIONS@/$${OPTIONS}/" > $@ ; $(TOP_BUILD_DIR)/completion/javaws.bash: $(TOP_SRC_DIR)/completion/javaws.bash.in stamps/netx.stamp OPTIONS_COMMAND="$(SYSTEM_JRE_DIR)/bin/java -cp $(NETX_DIR) net.sourceforge.jnlp.OptionsDefinitions" ; \ OPTIONS=`$$OPTIONS_COMMAND javaws` ; \ echo $$OPTIONS ; \ cat $(TOP_SRC_DIR)/completion/javaws.bash.in | \ sed "s/@OPTIONS@/$${OPTIONS}/" > $@ ; $(TOP_BUILD_DIR)/completion/policyeditor.bash: $(TOP_SRC_DIR)/completion/policyeditor.bash.in stamps/netx.stamp OPTIONS_COMMAND="$(SYSTEM_JRE_DIR)/bin/java -cp $(NETX_DIR) net.sourceforge.jnlp.OptionsDefinitions" ; \ OPTIONS=`$$OPTIONS_COMMAND policyeditor` ; \ echo $$OPTIONS ; \ cat $(TOP_SRC_DIR)/completion/policyeditor.bash.in | \ sed "s/@OPTIONS@/$${OPTIONS}/" > $@ ; stamps/generate-docs.stamp: stamps/netx.stamp mkdir -p "$(DOCS_DIR)" ; \ HTML_DOCS_TARGET_DIR="$(DOCS_DIR)/html" ; \ PLAIN_DOCS_TARGET_DIR="$(DOCS_DIR)/plain" ; \ MAN_DOCS_TARGET_DIR="$(DOCS_DIR)/man" ; \ AUTHORS_FILE_TARGET="$(TOP_SRC_DIR)/AUTHORS" ; \ mkdir "$$HTML_DOCS_TARGET_DIR" ; \ mkdir "$$PLAIN_DOCS_TARGET_DIR" ; \ mkdir "$$MAN_DOCS_TARGET_DIR" ; \ HTML_DOCS_INDEX="$$HTML_DOCS_TARGET_DIR/index.html" ; \ TP_COMMAND="$(SYSTEM_JRE_DIR)/bin/java -cp $(NETX_DIR) net.sourceforge.jnlp.util.docprovider.TextsProvider" ; \ TP_TAIL="false $(FULL_VERSION)" ; \ LANG_BACKUP=$$LANG ; \ echo "$(PLUGIN_VERSION)" > "$$HTML_DOCS_INDEX" ; \ echo "

    $(PLUGIN_VERSION) docs:

    " >> "$$HTML_DOCS_INDEX" ; \ for LANG_ID in en_US.UTF-8 cs_CZ.UTF-8 pl_PL.UTF-8 de_DE.UTF-8 ; do \ ID=`echo "$$LANG_ID" | head -c 2` ; \ ENCOD=`echo "$$LANG_ID" | tail -c 6 -` ; \ export LANG=$$LANG_ID; \ mkdir "$$HTML_DOCS_TARGET_DIR/$$ID" ; \ echo "
  • $$LANG_ID
  • " >> "$$HTML_DOCS_INDEX" ; \ $$TP_COMMAND html "$$HTML_DOCS_TARGET_DIR/$$ID" $$TP_TAIL "-authorFile=$$AUTHORS_FILE_TARGET" ; \ mkdir "$$PLAIN_DOCS_TARGET_DIR/$$ID" ; \ $$TP_COMMAND plain "$$PLAIN_DOCS_TARGET_DIR/$$ID" 160 $$TP_TAIL "-authorFile=$$AUTHORS_FILE_TARGET" ; \ if [ $$ID = "en" ] ; then \ MAN_DESC="$$MAN_DOCS_TARGET_DIR/man1" ; \ else \ MAN_DESC="$$MAN_DOCS_TARGET_DIR/$$ID/man1" ; \ fi ; \ mkdir -p "$$MAN_DESC" ; \ $$TP_COMMAND man $$ENCOD "$$MAN_DESC" $$TP_TAIL "-authorFile=$$AUTHORS_FILE_TARGET" ; \ $$TP_COMMAND htmlIntro "$(NETX_DIR)/net/sourceforge/jnlp/resources/about_$$ID.html" $$TP_TAIL; \ done ; \ export LANG=$$LANG_BACKUP ; \ echo "" >> $$HTML_DOCS_INDEX ; \ touch $@ stamps/netx-html-gen.stamp: (cd $$NETX_SRCDIR/..; \ mkdir -p html-gen; \ cp AUTHORS NEWS COPYING ChangeLog html-gen/; \ export HTML_GEN_DEBUG=true; \ ${SHELL} html-gen.sh 140; \ unset HTML_GEN_DEBUG) ${INSTALL_DATA} $(NETX_SRCDIR)/../html-gen/*.html $(NETX_RESOURCE_DIR) rm -r $(NETX_SRCDIR)/../html-gen/ mkdir -p stamps touch $@ stamps/netx.stamp: netx-source-files.txt stamps/netx-html-gen.stamp mkdir -p $(NETX_DIR) $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(NETX_DIR) \ -sourcepath $(NETX_SRCDIR) \ $(call composeclasspath, $(MSLINKS_JAR) $(TAGSOUP_JAR) $(RHINO_JAR)) \ @netx-source-files.txt (cd $(NETX_RESOURCE_DIR); \ for files in $$(find . -type f); \ do \ ${INSTALL_DATA} -D $${files} \ $(NETX_DIR)/net/sourceforge/jnlp/resources/$${files}; \ done) cp $(CPA) $(NETX_SRCDIR)/net/sourceforge/jnlp/runtime/pac-funcs.js \ $(NETX_DIR)/net/sourceforge/jnlp/runtime cp $(CPA) build.properties $(NETX_DIR)/net/sourceforge/jnlp/ mkdir -p stamps touch $@ stamps/netx-dist.stamp: stamps/netx.stamp $(TOP_BUILD_DIR)/netx.manifest stamps/generate-docs.stamp $(TOP_BUILD_DIR)/completion/itweb-settings.bash $(TOP_BUILD_DIR)/completion/javaws.bash $(TOP_BUILD_DIR)/completion/policyeditor.bash $(TOP_BUILD_DIR)/metadata (cd $(NETX_DIR) ; \ mkdir -p lib ; \ $(SYSTEM_JDK_DIR)/bin/jar cfm lib/classes.jar \ $(TOP_BUILD_DIR)/netx.manifest javax/jnlp net sun; \ cp -pPR $(SRC_DIR_LINK) $(NETX_SRCDIR) src; \ find src -type f -exec chmod 640 '{}' ';' -o -type d -exec chmod 750 '{}' ';'; \ cd src ; \ $(ZIP) -qr $(NETX_DIR)/lib/src.zip javax net sun) mkdir -p stamps touch $@ clean-netx: rm -rf $(NETX_DIR) rm -f stamps/netx-dist.stamp rm -f netx-source-files.txt rm -f stamps/netx.stamp rm -f stamps/netx-html-gen.stamp rm -f $(NETX_RESOURCE_DIR)/{NEWS,AUTHORS,COPYING,ChangeLog}.html clean-desktop-files: rm -f javaws.desktop rm -f itweb-settings.desktop rm -f policyeditor.desktop # launcher run args: launcher.build/$(MODULARJDK_ARGS_FILE): $(srcdir)/$(MODULARJDK_ARGS_FILE) mkdir -p launcher.build cp $(srcdir)/$(MODULARJDK_ARGS_FILE) launcher.build/$(MODULARJDK_ARGS_FILE) if ENABLE_NATIVE_LAUNCHERS # todo, handling of suffixes # there is curently harecoded sh, so it can somehow basically work # see the DESKTOP_SUFFIX for final tuning launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor): rust-launcher/src/main.rs rust-launcher/Cargo.toml export ITW_TMP_REPLACEMENT=$(TESTS_DIR)/rust_tests_tmp ; \ mkdir -p $$ITW_TMP_REPLACEMENT; \ filename=`basename $@` ; \ type=$${filename%.*} ; \ srcs=$(TOP_SRC_DIR)/rust-launcher ; \ outs=$(TOP_BUILD_DIR)/launcher.in.$$type ; \ mkdir -p launcher.build ; \ cp -r $$srcs $$outs ; \ pushd $$outs ; \ export JAVA=$(JAVA) ; \ export JRE=$(SYSTEM_JRE_DIR) ; \ export SPLASH_PNG=$(SPLASH_PNG) ; \ export ITW_LIBS=$(ITW_LIBS) ; \ export PLUGIN_JAR=$(PLUGIN_JAR) ; \ export NETX_JAR=$(NETX_JAR) ; \ export JSOBJECT_JAR=$(JSOBJECT_JAR) ; \ export TAGSOUP_JAR=$(TAGSOUP_JAR) ; \ export RHINO_JAR=$(RHINO_JAR) ; \ export MSLINKS_JAR=$(MSLINKS_JAR) ; \ export MODULARJDK_ARGS_LOCATION=$(MODULARJDK_ARGS_LOCATION) ; \ unset MAIN_CLASS ; \ unset BIN_LOCATION ; \ unset PROGRAM_NAME ; \ if [ $$filename = $(javaws) ] ; then \ export MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ; \ export BIN_LOCATION=$(bindir)/$(javaws) ; \ export PROGRAM_NAME=$(javaws) ; \ fi ; \ if [ $$filename = $(itweb_settings) ] ; then \ export MAIN_CLASS=net.sourceforge.jnlp.controlpanel.CommandLine ; \ export BIN_LOCATION=$(bindir)/$(itweb_settings) ; \ export PROGRAM_NAME=$(itweb_settings) ; \ fi ; \ if [ $$filename = $(policyeditor) ] ; then \ export MAIN_CLASS=net.sourceforge.jnlp.security.policyeditor.PolicyEditor ; \ export BIN_LOCATION=$(bindir)/$(policyeditor) ; \ export PROGRAM_NAME=$(policyeditor) ; \ fi ; \ $(CARGO) test ; \ r=$$? ; \ $(CARGO) build --release ; \ popd ;\ cp -v $$outs/target/release/launcher $@ ; \ if [ $$r -ne 0 ] ; then \ mv $@ $@.broken ; \ fi; \ exit $$r # https://github.com/SimonKagstrom/kcov/ # build is not part of upstream, declaring rust-code-coverage: kcov="none" ; \ if [ -f $(KCOV)/kcov ] ; then \ kcov=$(KCOV)/kcov ; \ elif [ -f $(KCOV)/bin/kcov ] ; then \ kcov=$(KCOV)/bin/kcov ; \ elif [ -f $(KCOV)/build/kcov ] ; then \ kcov=$(KCOV)/build/kcov ; \ elif [ -f $(KCOV)/build/src/kcov ] ; then \ kcov=$(KCOV)/build/src/kcov ; \ else \ mkdir $(KCOV)/build ; \ pushd $(KCOV)/build ; \ cmake .. ; \ make ; \ popd ; \ kcov=$(KCOV)/build/src/kcov ; \ fi ; \ export ITW_TMP_REPLACEMENT=$(TESTS_DIR)/rust_tests_tmp ; \ mkdir -p $$ITW_TMP_REPLACEMENT; \ srcs=$(TOP_SRC_DIR)/rust-launcher ; \ outs=$(TOP_BUILD_DIR)/launcher.in.codecoverage ; \ rm -rvf $$outs ; \ cp -r $$srcs $$outs ; \ pushd $$outs ; \ export JAVA=$(JAVA) ; \ export JRE=$(SYSTEM_JRE_DIR) ; \ export SPLASH_PNG=$(SPLASH_PNG) ; \ export ITW_LIBS=$(ITW_LIBS) ; \ export PLUGIN_JAR=$(PLUGIN_JAR) ; \ export NETX_JAR=$(NETX_JAR) ; \ export JSOBJECT_JAR=$(JSOBJECT_JAR) ; \ export TAGSOUP_JAR=$(TAGSOUP_JAR) ; \ export RHINO_JAR=$(RHINO_JAR) ; \ export MODULARJDK_ARGS_LOCATION=$(MODULARJDK_ARGS_LOCATION) ; \ export MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ; \ export BIN_LOCATION=$(bindir)/none ; \ export PROGRAM_NAME=test ; \ $(CARGO) test --no-run ; \ popd ; \ rm -fv $(TOP_BUILD_DIR)/launcher.in.codecoverage/target/debug/launcher-*.d ; \ $$kcov $$outs $(TOP_BUILD_DIR)/launcher.in.codecoverage/target/debug/launcher-* endif if ENABLE_SHELL_LAUNCHERS launcher.build/$(javaws).sh: shell-launcher/launchers.sh.in mkdir -p launcher.build MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ;\ BIN_LOCATION=$(bindir)/$(javaws).sh ;\ PROGRAM_NAME=$(javaws) ;\ $(edit_launcher_script) < $< > $@ launcher.build/$(itweb_settings).sh: shell-launcher/launchers.sh.in mkdir -p launcher.build MAIN_CLASS=net.sourceforge.jnlp.controlpanel.CommandLine ;\ BIN_LOCATION=$(bindir)/$(itweb_settings).sh ;\ PROGRAM_NAME=$(itweb_settings) ;\ $(edit_launcher_script) < $< > $@ launcher.build/$(policyeditor).sh: shell-launcher/launchers.sh.in mkdir -p launcher.build MAIN_CLASS=net.sourceforge.jnlp.security.policyeditor.PolicyEditor ;\ BIN_LOCATION=$(bindir)/$(policyeditor).sh ;\ PROGRAM_NAME=$(policyeditor) ;\ $(edit_launcher_script) < $< > $@ if WINDOWS_OR_INCLUDE_BATS # TODO get rid of this copypaste launcher.build/$(javaws).bat: shell-launcher/launchers.bat.in mkdir -p launcher.build MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ;\ BIN_LOCATION=$(bindir)/$(javaws) ;\ PROGRAM_NAME=$(javaws) ;\ $(edit_launcher_script) $(fix_CRLF) < $< > $@ # TODO get rid of this copypaste launcher.build/$(itweb_settings).bat: shell-launcher/launchers.bat.in mkdir -p launcher.build MAIN_CLASS=net.sourceforge.jnlp.controlpanel.CommandLine ;\ BIN_LOCATION=$(bindir)/$(itweb_settings) ;\ PROGRAM_NAME=$(itweb_settings) ;\ $(edit_launcher_script) $(fix_CRLF) < $< > $@ # TODO get rid of this copypaste launcher.build/$(policyeditor).bat: shell-launcher/launchers.bat.in mkdir -p launcher.build MAIN_CLASS=net.sourceforge.jnlp.security.policyeditor.PolicyEditor ;\ BIN_LOCATION=$(bindir)/$(policyeditor) ;\ PROGRAM_NAME=$(policyeditor) ;\ $(edit_launcher_script) $(fix_CRLF) < $< > $@ endif endif clean-launchers: rm -f launcher.build/$(MODULARJDK_ARGS_FILE) if ENABLE_NATIVE_LAUNCHERS rm -f launcher.build/$(javaws) rm -f launcher.build/$(itweb_settings) rm -f launcher.build/$(policyeditor) rm -rf launcher.in* rm -rf $(TESTS_DIR)/rust_tests_tmp endif if ENABLE_SHELL_LAUNCHERS rm -f launcher.build/$(javaws).sh rm -f launcher.build/$(itweb_settings).sh rm -f launcher.build/$(policyeditor).sh endif if WINDOWS_OR_INCLUDE_BATS rm -f launcher.build/$(javaws).bat rm -f launcher.build/$(itweb_settings).bat rm -f launcher.build/$(policyeditor).bat endif if [ -e launcher.build ] ; then \ rmdir launcher.build ; \ fi javaws.desktop: javaws.desktop.in sed "s#PATH_TO_JAVAWS#$(bindir)/$(JAVAWS)#" < $(srcdir)/javaws.desktop.in > javaws.desktop itweb-settings.desktop: $(srcdir)/itweb-settings.desktop.in sed "s#PATH_TO_ITWEB_SETTINGS#$(bindir)/$(ITWEB_SETTINGS)#" \ < $(srcdir)/itweb-settings.desktop.in > itweb-settings.desktop policyeditor.desktop: $(srcdir)/policyeditor.desktop.in sed "s#PATH_TO_POLICYEDITOR#$(bindir)/$(POLICYEDITOR)#" \ < $(srcdir)/policyeditor.desktop.in > policyeditor.desktop # documentation stamps/docs.stamp: stamps/netx-docs.stamp stamps/plugin-docs.stamp touch stamps/docs.stamp clean-docs: clean-netx-docs clean-plugin-docs if [ -e ${TOP_BUILD_DIR}/docs ] ; then \ rmdir ${TOP_BUILD_DIR}/docs ; \ fi rm -f stamps/docs.stamp stamps/netx-docs.stamp: if ENABLE_DOCS $(SYSTEM_JDK_DIR)/bin/javadoc $(JAVADOC_MEM_OPTS) $(JAVADOC_OPTS) \ -d ${TOP_BUILD_DIR}/docs/netx -sourcepath $(NETX_SRCDIR) \ -doctitle 'IcedTea-Web: NetX API Specification' \ -windowtitle 'IcedTea-Web: NetX ' \ -header 'IcedTea-Web
    NetX
    ' \ $(call composeclasspath, $(MSLINKS_JAR) $(TAGSOUP_JAR) $(RHINO_JAR)) \ $(NETX_PKGS) endif mkdir -p stamps touch stamps/netx-docs.stamp clean-netx-docs: rm -rf ${TOP_BUILD_DIR}/docs/netx rm -f stamps/netx-docs.stamp stamps/plugin-docs.stamp: if ENABLE_DOCS if ENABLE_PLUGINJAR $(SYSTEM_JDK_DIR)/bin/javadoc $(JAVADOC_MEM_OPTS) $(JAVADOC_OPTS) \ -d ${TOP_BUILD_DIR}/docs/plugin -sourcepath "$(NETX_SRCDIR)$(CLASSPATH_SEPARATOR)$(LIVECONNECT_SRCS)" \ -doctitle 'IcedTea-Web: Plugin API Specification' \ -windowtitle 'IcedTea-Web: Plugin ' \ -header 'IcedTea-Web
    Plugin
    ' \ $(call composeclasspath, $(MSLINKS_JAR) $(TAGSOUP_JAR) $(RHINO_JAR)) \ $(PLUGIN_PKGS) endif endif mkdir -p stamps touch stamps/plugin-docs.stamp clean-plugin-docs: rm -rf ${TOP_BUILD_DIR}/docs/plugin rm -f stamps/plugin-docs.stamp clean-generated-docs: rm -rf "$(DOCS_DIR)" rm -f stamps/generate-docs.stamp clean-icedteaweb-completion: rm -f $(TOP_BUILD_DIR)/completion/itweb-settings.bash rm -f $(TOP_BUILD_DIR)/completion/javaws.bash rm -f $(TOP_BUILD_DIR)/completion/policyeditor.bash clean-metadata: rm -rf $(TOP_BUILD_DIR)/metadata # check # ========================== clean-tests: clean-netx-tests clean-cpp-unit-tests clean-unittest++ if [ -e $(CPP_UNITTEST_DIR) ] ; then \ rmdir $(CPP_UNITTEST_DIR) ; \ fi if [ -e $(TESTS_DIR) ]; then \ rmdir $(TESTS_DIR) ; \ fi stamps/check-pac-functions.stamp: ./jrunscript $(TOP_SRC_DIR)/tests/netx/pac/pac-funcs-test.js \ $$(readlink -f $(TOP_SRC_DIR)/netx/net/sourceforge/jnlp/runtime/pac-funcs.js) ; \ mkdir -p stamps && \ touch $@ junit-runner-source-files.txt: find $(JUNIT_RUNNER_SRCDIR) -name '*.java' | sort > $@ jacoco-operator-source-files.txt: find $(JACOCO_OPERATOR_SRCDIR) -name '*.java' | sort > $@ $(JUNIT_RUNNER_JAR): junit-runner-source-files.txt stamps/test-extensions-compile.stamp mkdir -p $(JUNIT_RUNNER_DIR) && \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(JUNIT_RUNNER_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(TEST_EXTENSIONS_DIR)) \ @junit-runner-source-files.txt && \ $(SYSTEM_JDK_DIR)/bin/jar cf $@ -C $(JUNIT_RUNNER_DIR) . stamps/junit-jnlp-dist-dirs: junit-jnlp-dist-simple.txt stamps/junit-jnlp-dist-signed.stamp junit-jnlp-dist-custom.txt mkdir -p $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) mkdir -p $(REPRODUCERS_BUILD_DIR) touch $@ junit-jnlp-dist-custom.txt: rm -f $(abs_top_builddir)/$@ ; \ cd $(REPRODUCERS_TESTS_SRCDIR)/$(CUSTOM_REPRODUCERS)/ ; \ for x in $(COMPILE_WHITELIST_FILTER) ; do \ find . -maxdepth 1 -mindepth 1 | sed "s/.\/*//" | grep $$x >> $(abs_top_builddir)/$@ || true ; \ done junit-jnlp-dist-simple.txt: rm -f $(abs_top_builddir)/$@ ; \ cd $(REPRODUCERS_TESTS_SRCDIR)/simple/ ; \ for x in $(COMPILE_WHITELIST_FILTER) ; do \ find . -maxdepth 1 -mindepth 1 | sed "s/.\/*//" | grep $$x >> $(abs_top_builddir)/$@ || true ; \ done stamps/junit-jnlp-dist-signed.stamp: types=($(SIGNED_REPRODUCERS)) ; \ for which in "$${types[@]}" ; do \ rm -f $(abs_top_builddir)/junit-jnlp-dist-$$which.txt ; \ pushd $(REPRODUCERS_TESTS_SRCDIR)/$$which/ ; \ for x in $(COMPILE_WHITELIST_FILTER) ; do \ find . -maxdepth 1 -mindepth 1 | sed "s/.\/*//" | grep $$x >> $(abs_top_builddir)/junit-jnlp-dist-$$which.txt ; \ done ; \ popd ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/netx-dist-tests-prepare-reproducers.stamp: stamps/junit-jnlp-dist-dirs stamps/liveconnect-dist.stamp stamps/netx-dist.stamp stamps/plugin.stamp types=($(ALL_NONCUSTOM_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ echo "processing: $$dir" ; \ mkdir -p "$(REPRODUCERS_BUILD_DIR)/$$dir" ; \ if [ -e "$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/srcs/" ]; then \ d=`pwd` ; \ cd "$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/srcs/" ; \ srcFiles=`find . -mindepth 1 -type f -name "*.java" | sed "s/.\/*//"` ; \ notSrcFiles=`find . -mindepth 1 -type f \! -name "*.java" | sed "s/.\/*//"` ; \ $(SYSTEM_JDK_DIR)/bin/javac -cp $(NETX_DIR)/lib/classes.jar\$(CLASSPATH_SEPARATOR)$(TOP_BUILD_DIR)/liveconnect -d "$(REPRODUCERS_BUILD_DIR)/$$dir/" $$srcFiles ; \ if [ -n "$$notSrcFiles" ] ; then \ cp -R --parents $$notSrcFiles "$(REPRODUCERS_BUILD_DIR)/$$dir/" ; \ fi ; \ cd "$(REPRODUCERS_BUILD_DIR)/$$dir/" ; \ if [ -f $(META_MANIFEST) ]; \ then \ $(SYSTEM_JDK_DIR)/bin/jar cfm "$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/$$dir.jar" $(META_MANIFEST) * ; \ else \ $(SYSTEM_JDK_DIR)/bin/jar cf "$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/$$dir.jar" * ; \ fi; \ AN="Application-Name:" ; \ grep $$AN $(META_MANIFEST) 2>/dev/null >/dev/null ; \ GREP_R=$$?; \ if [ ! -f $(META_MANIFEST) -o $$GREP_R -ne 0 ]; \ then \ export TMP_MANIFEST=`mktemp` ; \ echo "$$AN $$dir" > $$TMP_MANIFEST ; \ if which cygpath &> /dev/null ; then \ export TMP_MANIFEST=$$(cygpath -p -m "$$TMP_MANIFEST") ; \ fi ; \ $(SYSTEM_JDK_DIR)/bin/jar ufm "$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/$$dir.jar" $$TMP_MANIFEST ; \ rm -f $$TMP_MANIFEST ; \ fi ; \ cd "$$d" ; \ fi; \ done ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/netx-dist-tests-sign-some-reproducers.stamp: stamps/netx-dist-tests-prepare-reproducers.stamp export keystore=$(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME); \ types=($(SIGNED_REPRODUCERS)) ; \ for which in "$${types[@]}" ; do \ tcaw=$(TEST_CERT_ALIAS)_$$which ; \ $(SYSTEM_JRE_DIR)/bin/keytool -genkey -alias $$tcaw -keystore $$keystore -keypass $(PRIVATE_KEYSTORE_PASS) -storepass $(PRIVATE_KEYSTORE_PASS) -dname "cn=$$tcaw, ou=$$tcaw, o=$$tcaw, c=$$tcaw" ; \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ signedReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${signedReproducers[@]}" ; do \ $(SYSTEM_JDK_DIR)/bin/jarsigner -keystore $$keystore -storepass $(PRIVATE_KEYSTORE_PASS) -keypass $(PRIVATE_KEYSTORE_PASS) "$(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/$$dir.jar" $$tcaw ; \ done ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/change-dots-to-paths.stamp: stamps/netx-dist-tests-sign-some-reproducers.stamp pushd $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR); \ types=($(ALL_NONCUSTOM_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ if test "$${dir:0:1}" = "." ; then \ echo "reproducer $$dir starts with dot. It is forbidden" ; \ exit 5; \ fi; \ if test "$${dir:(-1)}" = "." ; then \ echo "reproducer $$dir ends with dot. It is forbidden" ; \ exit 5; \ fi; \ q=`expr index "$$dir" .`; \ r=$$? ; \ if [ $$r = 0 ]; then \ slashed_dir="./$${dir//.//}" ; \ path="`dirname $$slashed_dir`" ; \ file="`basename $$slashed_dir`.jar" ; \ echo "copying $$dir.jar to $$path as $$file" ; \ mkdir --parents $$path ; \ cp $$dir".jar" "$$path"/"$$file" ; \ fi ; \ done ; \ done ; \ popd ; \ mkdir -p stamps && \ touch $@ #this always tries to remove previous testcert #the code is copypasted from netx-dist-tests-remove-cert-from-public, because #with depending to not stamped target we always have to rerun reproducers targets stamps/exported-test-certs.stamp: stamps/change-dots-to-paths.stamp types=($(SIGNED_REPRODUCERS)) ; \ PUBLIC_KEYSTORE=$$XDG_CONFIG_HOME ; \ if test "x$$PUBLIC_KEYSTORE" = x; then \ PUBLIC_KEYSTORE=${HOME}/.config ; \ fi ;\ export PUBLIC_KEYSTORE=$$PUBLIC_KEYSTORE/$(PUBLIC_KEYSTORE_STUB); \ if which cygpath &> /dev/null ; then \ export PUBLIC_KEYSTORE=$$(cygpath -p -m "$$PUBLIC_KEYSTORE") ; \ fi ; \ keystoredir=`dirname $$PUBLIC_KEYSTORE`; \ [ ! -d $$keystoredir ] && mkdir -p $$keystoredir; \ for which in "$${types[@]}" ; do \ $(SYSTEM_JDK_DIR)/bin/keytool -delete -alias $(TEST_CERT_ALIAS)_$$which -keystore $$PUBLIC_KEYSTORE -storepass $(PUBLIC_KEYSTORE_PASS) ; \ done ; types=($(SIGNED_REPRODUCERS)) ; \ for which in "$${types[@]}" ; do \ $(SYSTEM_JDK_DIR)/bin/keytool -export -alias $(TEST_CERT_ALIAS)_$$which -file $(EXPORTED_TEST_CERT_PREFIX)_$$which.$(EXPORTED_TEST_CERT_SUFFIX) -storepass $(PRIVATE_KEYSTORE_PASS) -keystore $(PRIVATE_KEYSTORE_NAME) ; \ done ; mkdir -p stamps && \ touch $@ stamps/netx-dist-tests-import-cert-to-public: stamps/exported-test-certs.stamp types=($(SIGNED_REPRODUCERS)) ; \ PUBLIC_KEYSTORE=$$XDG_CONFIG_HOME ; \ if test "x$$PUBLIC_KEYSTORE" = x; then \ PUBLIC_KEYSTORE=${HOME}/.config ; \ fi ;\ export PUBLIC_KEYSTORE=$$PUBLIC_KEYSTORE/$(PUBLIC_KEYSTORE_STUB); \ if which cygpath &> /dev/null ; then \ export PUBLIC_KEYSTORE=$$(cygpath -p -m "$$PUBLIC_KEYSTORE") ; \ fi ; \ keystoredir=`dirname $$PUBLIC_KEYSTORE`; \ [ ! -d $$keystoredir ] && mkdir -p $$keystoredir; \ for which in "$${types[@]}" ; do \ yes | $(SYSTEM_JDK_DIR)/bin/keytool -import -alias $(TEST_CERT_ALIAS)_$$which -keystore $$PUBLIC_KEYSTORE -storepass $(PUBLIC_KEYSTORE_PASS) -file $(EXPORTED_TEST_CERT_PREFIX)_$$which.$(EXPORTED_TEST_CERT_SUFFIX) ;\ done ; mkdir -p stamps && \ touch $@ netx-dist-tests-remove-cert-from-public: types=($(SIGNED_REPRODUCERS)) ; \ PUBLIC_KEYSTORE=$$XDG_CONFIG_HOME ; \ if test "x$$PUBLIC_KEYSTORE" = x; then \ PUBLIC_KEYSTORE=${HOME}/.config ; \ fi ;\ export PUBLIC_KEYSTORE=$$PUBLIC_KEYSTORE/$(PUBLIC_KEYSTORE_STUB); \ if which cygpath &> /dev/null ; then \ export PUBLIC_KEYSTORE=$$(cygpath -p -m "$$PUBLIC_KEYSTORE") ; \ fi ; \ keystoredir=`dirname $$PUBLIC_KEYSTORE`; \ [ ! -d $$keystoredir ] && mkdir -p $$keystoredir; \ for which in "$${types[@]}" ; do \ $(SYSTEM_JDK_DIR)/bin/keytool -delete -alias $(TEST_CERT_ALIAS)_$$which -keystore $$PUBLIC_KEYSTORE -storepass $(PUBLIC_KEYSTORE_PASS) ; \ done ; -rm -rf stamps/netx-dist-tests-import-cert-to-public test-extensions-source-files.txt: find $(TEST_EXTENSIONS_SRCDIR) -name '*.java' | sort > $@ stamps/test-extensions-compile.stamp: stamps/netx-dist.stamp stamps/plugin.stamp stamps/junit-jnlp-dist-dirs test-extensions-source-files.txt mkdir -p $(TEST_EXTENSIONS_DIR); mkdir -p $(NETX_TEST_DIR); ln -s $(TEST_EXTENSIONS_DIR) $(TEST_EXTENSIONS_COMPATIBILITY_SYMLINK); $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(TEST_EXTENSIONS_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar) \ @test-extensions-source-files.txt && \ mkdir -p stamps && \ touch $@ test-extensions-tests-source-files.txt: for x in $(COMPILE_WHITELIST_FILTER) ; do \ find $(TEST_EXTENSIONS_TESTS_SRCDIR) -name '*.java' | grep $$x | sort > $@ ; \ done stamps/test-extensions-tests-compile.stamp: stamps/junit-jnlp-dist-dirs test-extensions-tests-source-files.txt stamps/test-extensions-compile.stamp mkdir -p $(TEST_EXTENSIONS_TESTS_DIR); for x in `cat $(TOP_BUILD_DIR)/test-extensions-tests-source-files.txt` ; do \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(TEST_EXTENSIONS_TESTS_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(NETX_DIR)/lib/classes.jar $(TEST_EXTENSIONS_DIR)) \ $$x ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/compile-reproducers-testcases.stamp: stamps/netx-dist.stamp stamps/plugin.stamp stamps/junit-jnlp-dist-dirs \ test-extensions-source-files.txt stamps/test-extensions-compile.stamp stamps/test-extensions-tests-compile.stamp types=($(ALL_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ TESTCASEPATH="$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/testcases" ; \ if [ -d "$$TESTCASEPATH" ]; then \ echo "compiling" $$dir ; \ pushd "$$TESTCASEPATH" ; \ REGEX=".*\\.java$$" ; \ JAVAFILES=`find . | grep "$$REGEX"` ; \ NONJAVA_RESOURCES=`find . | grep -v "$$REGEX"` ; \ echo $$JAVAFILES ; \ echo $$NONJAVA_RESOURCES ; \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(TEST_EXTENSIONS_TESTS_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(NETX_DIR)/lib/classes.jar $(TEST_EXTENSIONS_DIR)) $$JAVAFILES ; \ if [ -n "$$NONJAVA_RESOURCES" ]; then \ cp --parents $$NONJAVA_RESOURCES $(TEST_EXTENSIONS_TESTS_DIR)/ ; \ fi ; \ popd ; \ fi ; \ done ; \ done ; \ mkdir -p stamps && \ touch $@ stamps/copy-reproducers-resources.stamp: stamps/junit-jnlp-dist-dirs types=($(ALL_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ cp -R "$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/resources/"* $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR)/ ; \ done ; \ done ; \ mkdir -p stamps && \ touch $@ $(REPRODUCERS_CLASS_NAMES): whiteListed=$(RUN_WHITELIST_FILTER); \ cd $(TEST_EXTENSIONS_TESTS_DIR) ; \ class_names= ; \ for test in `find -type f` ; do \ class_name=`echo $$test | sed -e 's|\.class$$||' -e 's|^\./||'` ; \ class_name=`echo $$class_name | sed -e 's|/|.|g' ` ; \ INCLUDE="NO" ; \ for x in $$whiteListed ; do \ q=`expr match "$$class_name" "$$x"`; \ r=$$? ; \ if [ $$r = 0 ]; then \ echo "$$class_name will be included in reproducers testcases because of $$x pattern in $(REPRODUCERS_CLASS_WHITELIST). Matching was $$q"; \ INCLUDE="YES" ; \ fi; \ done; \ if [ "$$INCLUDE" = "YES" ]; then \ class_names="$$class_names $$class_name" ; \ else \ echo "$$class_name had no match in $(REPRODUCERS_CLASS_WHITELIST). Excluding"; \ fi; \ done ; \ echo $$class_names > $(REPRODUCERS_CLASS_NAMES) stamps/run-netx-dist-tests.stamp: stamps/netx-dist.stamp stamps/plugin.stamp stamps/docs.stamp \ $(LAUNCHERS) $(DESKTOP_FILES) \ stamps/netx.stamp stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp\ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) $(REPRODUCERS_CLASS_NAMES) stamps/process-custom-reproducers.stamp cd $(TEST_EXTENSIONS_DIR) ; \ class_names=`cat $(REPRODUCERS_CLASS_NAMES)` ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_TESTS_DIR) $(TEST_EXTENSIONS_SRCDIR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(REPRODUCERS_DPARAMETERS) \ -Xbootclasspath/a:$$CLASSPATH CommandLine $$class_names if WITH_XSLTPROC -$(XSLTPROC) --stringparam logs logs_reproducers.html $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/jreport.xsl $(TEST_EXTENSIONS_DIR)/tests-output.xml > $(TESTS_DIR)/index_reproducers.html -$(XSLTPROC) $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/logs.xsl $(TEST_EXTENSIONS_DIR)/ServerAccess-logs.xml > $(TESTS_DIR)/logs_reproducers.html -$(XSLTPROC) $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/textreport.xsl $(TEST_EXTENSIONS_DIR)/tests-output.xml > $(TESTS_DIR)/summary_reproducers.txt endif touch $@ stamps/process-custom-reproducers.stamp: stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp\ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) $(REPRODUCERS_CLASS_NAMES) . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ customReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-custom.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${customReproducers[@]}" ; do \ pushd $(REPRODUCERS_TESTS_SRCDIR)/$(CUSTOM_REPRODUCERS)/$$dir/srcs; \ $(MAKE) prepare-reproducer ; \ popd ; \ done ; \ mkdir -p stamps && \ touch $@ clean-custom-reproducers: junit-jnlp-dist-custom.txt . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ customReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-custom.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${customReproducers[@]}" ; do \ pushd $(REPRODUCERS_TESTS_SRCDIR)/custom/$$dir/srcs; \ $(MAKE) clean-reproducer ; \ popd ; \ done ; \ rm -f stamps/process-custom-reproducers.stamp #for global-links you must be root, for opera there do not exists user-links #although this targets will indeed create symbolic links to enable #icedtea-web plugin inside browser it is intended for testing purposes if ENABLE_NATIVE_PLUGIN stamps/user-links.stamp: stamps/netx-dist.stamp stamps/plugin.stamp \ $(LAUNCHERS) stamps/netx.stamp $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) if [ $(MOZILLA_FAMILY_TEST) ] ; then \ if [ -e $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) ] ; then \ mv -f $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) $(MOZILLA_LOCAL_BACKUP_FILE) ; \ echo "$(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) backed up as $(MOZILLA_LOCAL_BACKUP_FILE)" ; \ else \ echo "$(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) doesn't exists, nothing to be backed up to $(MOZILLA_LOCAL_BACKUP_FILE)" ; \ fi ; \ pushd $(MOZILLA_LOCAL_PLUGINDIR) ; \ ln -s $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) $(PLUGIN_LINK_NAME) ; \ echo "$(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) linked as $$PWD/$(PLUGIN_LINK_NAME)" ; \ popd ; \ fi ; \ touch $@ restore-user-links: if [ $(MOZILLA_FAMILY_TEST) ] ; then \ if [ -e $(MOZILLA_LOCAL_BACKUP_FILE) ] ; then \ mv -f $(MOZILLA_LOCAL_BACKUP_FILE) $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) ; \ echo "$(MOZILLA_LOCAL_BACKUP_FILE) restored as $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME)" ; \ else \ rm -f $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) ; \ echo "$(MOZILLA_LOCAL_BACKUP_FILE) do not exists, nothing to be restored. $(MOZILLA_LOCAL_PLUGINDIR)/$(PLUGIN_LINK_NAME) removed" ; \ fi ; \ fi ; if [ -e stamps/user-links.stamp ] ; then \ rm -f stamps/user-links.stamp ; \ fi stamps/global-links.stamp: stamps/netx-dist.stamp stamps/plugin.stamp $(LAUNCHERS) \ stamps/netx.stamp $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) if [ $(MOZILLA_FAMILY_TEST) ] ; then \ dir="$(MOZILLA_GLOBAL32_PLUGINDIR)" ; \ arch=`arch` ; \ if [ "$$arch" = "x86_64" ] ; then \ dir="$(MOZILLA_GLOBAL64_PLUGINDIR)" ; \ fi ; \ if [ -e "$$dir"/$(PLUGIN_LINK_NAME) ] ; then \ mv -f "$$dir"/$(PLUGIN_LINK_NAME) $(MOZILLA_GLOBAL_BACKUP_FILE) ; \ echo "$$dir/$(PLUGIN_LINK_NAME) backed up as $(MOZILLA_GLOBAL_BACKUP_FILE)" ; \ else \ echo "$$dir/$(PLUGIN_LINK_NAME) do not exists, nothing to be backed up to $(MOZILLA_GLOBAL_BACKUP_FILE)" ; \ fi ; \ pushd "$$dir" ; \ ln -s $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) $(PLUGIN_LINK_NAME) ; \ echo "$(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) linked as $$PWD/$(PLUGIN_LINK_NAME)" ; \ popd ; \ fi ; if [ "$(OPERA)" != "" ] ; then \ dir="$(OPERA_GLOBAL32_PLUGINDIR)" ; \ arch=`arch` ; \ if [ "$$arch" = "x86_64" ] ; then \ dir="$(OPERA_GLOBAL64_PLUGINDIR)" ; \ fi ; \ if [ -e "$$dir"/$(PLUGIN_LINK_NAME) ] ; then \ mv -f "$$dir"/$(PLUGIN_LINK_NAME) $(OPERA_GLOBAL_BACKUP_FILE) ; \ echo "$$dir/$(PLUGIN_LINK_NAME) backed up as $(OPERA_GLOBAL_BACKUP_FILE) "; \ else \ echo "$$dir/$(PLUGIN_LINK_NAME) do not exists, nothing to be backed up to $(OPERA_GLOBAL_BACKUP_FILE) "; \ fi ; \ pushd "$$dir" ; \ ln -s $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) $(PLUGIN_LINK_NAME) ; \ echo "$(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) linked as $$PWD/$(PLUGIN_LINK_NAME)" ; \ popd ; \ fi ; \ touch $@ restore-global-links: if [ $(MOZILLA_FAMILY_TEST) ] ; then \ dir="$(MOZILLA_GLOBAL32_PLUGINDIR)" ; \ arch=`arch` ; \ if [ "$$arch" = "x86_64" ] ; then \ dir="$(MOZILLA_GLOBAL64_PLUGINDIR)" ; \ fi ; \ if [ -e $(MOZILLA_GLOBAL_BACKUP_FILE) ] ; then \ mv -f $(MOZILLA_GLOBAL_BACKUP_FILE) "$$dir"/$(PLUGIN_LINK_NAME) ; \ echo "$(MOZILLA_GLOBAL_BACKUP_FILE) restored as $$dir/$(PLUGIN_LINK_NAME)" ; \ else \ rm -f "$$dir"/$(PLUGIN_LINK_NAME) ; \ echo "$(MOZILLA_GLOBAL_BACKUP_FILE) do not exists, nothing to be restored. $$dir/$(PLUGIN_LINK_NAME) removed" ; \ fi ; \ fi ; if [ "$(OPERA)" != "" ] ; then \ dir="$(OPERA_GLOBAL32_PLUGINDIR)" ; \ arch=`arch` ; \ if [ "$$arch" = "x86_64" ] ; then \ dir="$(OPERA_GLOBAL64_PLUGINDIR)" ; \ fi ; \ if [ -e $(OPERA_GLOBAL_BACKUP_FILE) ] ; then \ mv -f $(OPERA_GLOBAL_BACKUP_FILE) "$$dir"/$(PLUGIN_LINK_NAME) ; \ echo "$(OPERA_GLOBAL_BACKUP_FILE) restored as $$dir/$(PLUGIN_LINK_NAME)" ; \ else \ rm -f "$$dir"/$(PLUGIN_LINK_NAME) ; \ echo "$(OPERA_GLOBAL_BACKUP_FILE) do not exist, nothing to be restored. $$dir/$(PLUGIN_LINK_NAME) removed" ; \ fi ; \ fi ; if [ -e stamps/global-links.stamp ] ; then \ rm -f stamps/global-links.stamp ; \ fi endif netx-unit-tests-source-files.txt: find $(NETX_UNIT_TEST_SRCDIR) -name '*.java' | sort > $@ stamps/netx-unit-tests-compile.stamp: stamps/netx.stamp \ netx-unit-tests-source-files.txt stamps/test-extensions-compile.stamp mkdir -p $(NETX_UNIT_TEST_DIR) && \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(NETX_UNIT_TEST_DIR) \ $(call composeclasspath, $(JUNIT_RUNTIME) $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(NETX_DIR)/lib/classes.jar $(MSLINKS_JAR) $(TEST_EXTENSIONS_DIR) $(TAGSOUP_JAR)) \ @netx-unit-tests-source-files.txt && \ mkdir -p stamps && \ touch $@ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME): mkdir $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) cp $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/*.css $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME)/ cp $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/*.js $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME)/ $(UNIT_CLASS_NAMES): cd $(NETX_UNIT_TEST_DIR) ; \ class_names= ; \ for test in `find -type f` ; do \ class_name=`echo $$test | sed -e 's|\.class$$||' -e 's|^\./||'` ; \ class_name=`echo $$class_name | sed -e 's|/|.|g' ` ; \ class_names="$$class_names $$class_name" ; \ done ; \ echo $$class_names > $(UNIT_CLASS_NAMES); stamps/run-netx-unit-tests.stamp: stamps/netx-unit-tests-compile.stamp $(JUNIT_RUNNER_JAR) \ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) $(UNIT_CLASS_NAMES) filename=" " ; \ cd $(NETX_UNIT_TEST_SRCDIR) ; \ for file in `find . -type f \! -iname "*.java"`; do\ filename=`echo $$file `; \ cp --parents $$filename $(NETX_UNIT_TEST_DIR) ; \ done ; \ cd $(NETX_UNIT_TEST_DIR) ; \ class_names=`cat $(UNIT_CLASS_NAMES)` ; \ CLASSPATH="$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(JUNIT_RUNTIME) $(MSLINKS_JAR) $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) . $(TEST_EXTENSIONS_SRCDIR) $(TAGSOUP_JAR))" ; \ $(SYSTEM_JRE_DIR)/bin/java "-Xbootclasspath/a:$$CLASSPATH" CommandLine $$class_names if WITH_XSLTPROC -$(XSLTPROC) --stringparam logs logs_unit.html $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/jreport.xsl $(NETX_UNIT_TEST_DIR)/tests-output.xml > $(TESTS_DIR)/index_unit.html -$(XSLTPROC) $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/logs.xsl $(NETX_UNIT_TEST_DIR)/ServerAccess-logs.xml > $(TESTS_DIR)/logs_unit.html -$(XSLTPROC) $(TESTS_SRCDIR)/$(REPORT_STYLES_DIRNAME)/textreport.xsl $(NETX_UNIT_TEST_DIR)/tests-output.xml > $(TESTS_DIR)/summary_unit.txt endif mkdir -p stamps && \ touch $@ stamps/compile-jacoco-operator.stamp: jacoco-operator-source-files.txt if WITH_JACOCO mkdir -p $(JACOCO_OPERATOR_DIR) && \ $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d $(JACOCO_OPERATOR_DIR) \ $(call composeclasspath, $(JACOCO_CLASSPATH)) \ @jacoco-operator-source-files.txt ; else echo "Sorry, jacoco coverage report generator cant be compiled without jacoco installed. Try installing jacoco or specify with-jacoco value" ; exit 5 endif touch $@ #warning, during this target tests.build/netx/unit/tests-output.xml is backup and rewriten (but not coresponding html file) #xml results run with jacoco agent however, can be wrong, co the new tests-output.xml is then renamed and orginal one restored stamps/run-unit-test-code-coverage-jacoco.stamp: stamps/netx-unit-tests-compile.stamp $(JUNIT_RUNNER_JAR) \ $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME) $(UNIT_CLASS_NAMES) stamps/compile-jacoco-operator.stamp if WITH_JACOCO filename=" " ; \ cd $(NETX_UNIT_TEST_SRCDIR) ; \ for file in `find . -type f \! -iname "*.java"`; do\ filename=`echo $$file `; \ cp --parents $$filename $(NETX_UNIT_TEST_DIR) ; \ done ; \ cd $(NETX_UNIT_TEST_DIR) ; \ for file in $(COVERAGE_MODIFIED_FILES) ; do \ mv $(NETX_UNIT_TEST_DIR)/$$file $(NETX_UNIT_TEST_DIR)/"$$file""$(EMMA_BACKUP_SUFFIX)" ; \ done ;\ class_names=`cat $(UNIT_CLASS_NAMES)` ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) $(JACOCO_CLASSPATH) . $(TEST_EXTENSIONS_SRCDIR) $(MSLINKS_JAR) $(TAGSOUP_JAR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(JACOCO_AGENT_SWITCH) -Xbootclasspath/a:$$CLASSPATH CommandLine $$class_names ; \ for file in $(COVERAGE_MODIFIED_FILES) ; do \ mv $(NETX_UNIT_TEST_DIR)/$$file $(NETX_UNIT_TEST_DIR)/"$$file""$(EMMA_SUFFIX)" ; \ mv $(NETX_UNIT_TEST_DIR)/"$$file""$(EMMA_BACKUP_SUFFIX)" $(NETX_UNIT_TEST_DIR)/$$file ; \ done ; \ $(JACOCO_OPERATOR_EXEC) \ report --die-soon --html-output coverage --xml-output coverage.xml --input-file jacoco.exec \ --input-srcs $(NETX_SRCDIR) $(PLUGIN_SRCDIR)/java $(NETX_UNIT_TEST_SRCDIR) $(JUNIT_RUNNER_SRCDIR) $(TEST_EXTENSIONS_SRCDIR) \ --input-builds $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(NETX_UNIT_TEST_DIR) $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) \ --title "IcedTea-Web unit-tests codecoverage" ; else echo "Sorry, coverage report cant be run without jacoco installed. Try installing jacoco or specify with-jacoco value" ; exit 5 endif touch $@ $(COVERABLE_PLUGIN_DIR): mkdir -p $(COVERABLE_PLUGIN_DIR); $(COVERABLE_PLUGIN_DIR)/%.o: $(PLUGIN_SRCDIR)/%.cc cd $(COVERABLE_PLUGIN_DIR) && \ $(CXX) $(CXXFLAGS) \ $(DEFS) $(VERSION_DEFS) \ -DJDK_UPDATE_VERSION="\"$(JDK_UPDATE_VERSION)\"" \ -DPLUGIN_NAME="\"IcedTea-Web Plugin with jacoco coverage agent\"" \ -DJAVAWS_BIN="\"$(bindir)/$(JAVAWS)\"" \ -DJAVAWS_NAME="\"$(javaws)\"" \ -DPLUGIN_VERSION="\"$(PLUGIN_VERSION)\"" \ -DPACKAGE_URL="\"$(PACKAGE_URL)\"" \ -DMOZILLA_VERSION_COLLAPSED="$(MOZILLA_VERSION_COLLAPSED)" \ -DICEDTEA_WEB_JRE="\"$(SYSTEM_JRE_DIR)\"" \ -DPLUGIN_BOOTCLASSPATH=$(PLUGIN_COVERAGE_BOOTCLASSPATH) \ -DCOVERAGE_AGENT=$(JACOCO_AGENT_PLUGIN_SWITCH) \ -DNETX_JAR="\"$(NETX_JAR)\"" \ -DPLUGIN_JAR="\"$(PLUGIN_JAR)\"" \ -DJSOBJECT_JAR="\"$(JSOBJECT_JAR)\""\ $(GLIB_CFLAGS) \ $(MOZILLA_CFLAGS) \ -fvisibility=hidden \ -fPIC -o $@ -c $< $(COVERABLE_PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY): $(addprefix $(COVERABLE_PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) cd $(COVERABLE_PLUGIN_DIR) && \ $(CXX) $(CXXFLAGS) \ $(PLUGIN_OBJECTS) \ $(GLIB_LIBS) \ $(MOZILLA_LIBS) \ -shared -o $@ stamps/build-fake-plugin.stamp: $(COVERABLE_PLUGIN_DIR) $(addprefix $(PLUGIN_SRCDIR)/,$(PLUGIN_SRC)) $(addprefix $(COVERABLE_PLUGIN_DIR)/,$(PLUGIN_OBJECTS)) stamps/liveconnect-dist.stamp $(COVERABLE_PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) touch $@ #warning, during this target tests.build/netx/jnlp_testsengine/tests-output.xml is backup and rewriten (but not coresponding html file) #xml results run with jacoco agent, however, can be wrong, co the new tests-output.xml is then renamed and orginal one restored stamps/run-reproducers-test-code-coverage-jacoco.stamp: stamps/run-netx-dist-tests.stamp $(REPRODUCERS_CLASS_NAMES) \ stamps/compile-jacoco-operator.stamp stamps/build-fake-plugin.stamp if WITH_JACOCO cd $(TESTS_DIR) ; \ for file in $(COVERAGE_MODIFIED_FILES) ; do \ mv $(TEST_EXTENSIONS_DIR)/$$file $(TEST_EXTENSIONS_DIR)/"$$file""$(EMMA_BACKUP_SUFFIX)" ; \ done ;\ echo "backuping $(JAVAWS) in $(DESTDIR)$(bindir)" ; \ javaws_backup=$(DESTDIR)$(bindir)/javaws_backup ; \ mv $(DESTDIR)$(bindir)/$(JAVAWS) $$javaws_backup ; \ echo "patching $(JAVAWS)" ; \ nw_bootclasspath="-Xbootclasspath/a:$(UNIFIED_JACOCO_CLASSPATH)" ; \ cat $$javaws_backup | sed "s|COMMAND.k.=\"..JAVA.\"|COMMAND[k]=\"\\$$\\{JAVA\\}\" ; k=1 ; COMMAND[k]=$(JACOCO_AGENT_JAVAWS_SWITCH)|" | sed "s,$(LAUNCHER_BOOTCLASSPATH),$$nw_bootclasspath," > $(DESTDIR)$(bindir)/$(JAVAWS) ; \ chmod 777 $(DESTDIR)$(bindir)/$(JAVAWS) ; \ echo "backuping plugin in $(DESTDIR)/$(libdir)$(BUILT_PLUGIN_LIBRARY)" ; \ plugin_backup=$(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY)_backup ; \ mv $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) $$plugin_backup ; \ echo "fakeing plugin" ; \ cp $(COVERABLE_PLUGIN_DIR)/$(BUILT_PLUGIN_LIBRARY) $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) ; \ testcases_srcs=( ) ; \ k=0 ; \ types=($(ALL_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ testcases_srcs[k]="$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/testcases/" ; \ k=$$((k+1)) ; \ done ; \ done ; \ cd $(TEST_EXTENSIONS_DIR) ; \ class_names=`cat $(REPRODUCERS_CLASS_NAMES)` ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_DIR) $(JACOCO_CLASSPATH) $(TEST_EXTENSIONS_TESTS_DIR) $(TEST_EXTENSIONS_SRCDIR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(JACOCO_AGENT_SWITCH) $(REPRODUCERS_DPARAMETERS) \ -Xbootclasspath/a:$$CLASSPATH CommandLine $$class_names ; \ if [ -f $(JACOCO_JAVAWS_RESULTS) ] ; then \ jacoco_javaws_results=$(JACOCO_JAVAWS_RESULTS) ; \ $(JACOCO_OPERATOR_EXEC) \ report --die-soon --html-output coverage-javaws --xml-output coverage-javaws.xml --input-file $(JACOCO_JAVAWS_RESULTS) \ --input-srcs $(NETX_SRCDIR) \ --input-builds $(NETX_DIR)/lib/classes.jar \ --title "IcedTea-Web javaws reproducers codecoverage" ; \ fi; \ if [ -f $(JACOCO_PLUGIN_RESULTS) ] ; then \ jacoco_plugin_results=$(JACOCO_PLUGIN_RESULTS) ; \ $(JACOCO_OPERATOR_EXEC) \ report --die-soon --html-output coverage-plugin --xml-output coverage-plugin.xml --input-file $(JACOCO_PLUGIN_RESULTS) \ --input-srcs $(NETX_SRCDIR) $(PLUGIN_SRCDIR)/java \ --input-builds $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar \ --title "IcedTea-Web plugin reproducers codecoverage" ; \ fi; \ $(JACOCO_OPERATOR_EXEC) \ merge --die-soon --input-files jacoco.exec $$jacoco_javaws_results $$jacoco_plugin_results --output-file jacoco-merged-reproducers.exec ; \ $(JACOCO_OPERATOR_EXEC) \ report --html-output coverage --xml-output coverage.xml --input-file jacoco-merged-reproducers.exec \ --input-srcs $(NETX_SRCDIR) $(PLUGIN_SRCDIR)/java $(JUNIT_RUNNER_SRCDIR) $(TEST_EXTENSIONS_SRCDIR) $(TEST_EXTENSIONS_TESTS_SRCDIR) "$${testcases_srcs[@]}" \ --input-builds $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) $(TEST_EXTENSIONS_TESTS_DIR) \ --title "IcedTea-Web reproducers-tests codecoverage" ; \ echo "restoring $(JAVAWS) in $(DESTDIR)$(bindir)" ; \ rm -f $(DESTDIR)$(bindir)/$(javaws); \ mv $$javaws_backup $(DESTDIR)$(bindir)/$(JAVAWS); \ echo "restoring plugin in $(DESTDIR)/$(libdir)$(BUILT_PLUGIN_LIBRARY)" ; \ mv $$plugin_backup $(DESTDIR)$(libdir)/$(BUILT_PLUGIN_LIBRARY) ; \ for file in $(COVERAGE_MODIFIED_FILES) ; do \ mv $(TEST_EXTENSIONS_DIR)/$$file $(TEST_EXTENSIONS_DIR)/"$$file""$(EMMA_SUFFIX)" ; \ mv $(TEST_EXTENSIONS_DIR)/"$$file""$(EMMA_BACKUP_SUFFIX)" $(TEST_EXTENSIONS_DIR)/$$file ; \ done ; else echo "Sorry, coverage report cant be run without jacoco installed. Try installing jacoco or specify with-jacoco value" ; exit 5 endif touch $@ run-test-code-coverage-jacoco: stamps/run-unit-test-code-coverage-jacoco.stamp stamps/run-reproducers-test-code-coverage-jacoco.stamp if WITH_JACOCO cd $(TESTS_DIR) ; \ k=0 ; \ types=($(ALL_REPRODUCERS)); \ for which in "$${types[@]}" ; do \ . $(TOP_SRC_DIR)/NEW_LINE_IFS ; \ simpleReproducers=(`cat $(TOP_BUILD_DIR)/junit-jnlp-dist-$$which.txt `); \ IFS="$$IFS_BACKUP" ; \ for dir in "$${simpleReproducers[@]}" ; do \ testcases_srcs[k]="$(REPRODUCERS_TESTS_SRCDIR)/$$which/$$dir/testcases/" ; \ k=$$((k+1)) ; \ done ; \ done ; \ class_names=`cat $(REPRODUCERS_CLASS_NAMES)` ; \ $(JACOCO_OPERATOR_EXEC) \ merge --die-soon --input-files $(TEST_EXTENSIONS_DIR)/jacoco-merged-reproducers.exec $(NETX_UNIT_TEST_DIR)/jacoco.exec --output-file jacoco-merged.exec; \ $(JACOCO_OPERATOR_EXEC) \ report --html-output coverage --xml-output coverage.xml --input-file jacoco-merged.exec \ --input-srcs $(NETX_SRCDIR) $(PLUGIN_SRCDIR)/java $(JUNIT_RUNNER_SRCDIR) $(TEST_EXTENSIONS_SRCDIR) $(TEST_EXTENSIONS_TESTS_SRCDIR) "$${testcases_srcs[@]}" \ --input-builds $(NETX_DIR)/lib/classes.jar $(TOP_BUILD_DIR)/liveconnect/lib/classes.jar $(JUNIT_RUNNER_JAR) $(TEST_EXTENSIONS_DIR) $(TEST_EXTENSIONS_TESTS_DIR) \ --input-srcs $(NETX_UNIT_TEST_SRCDIR) \ --input-builds $(NETX_UNIT_TEST_DIR) \ --title "IcedTea-Web complete codecoverage" ; else echo "Sorry, coverage report cant be run without jacoco installed. Try installing jacoco or specify with-jacoco value" ; exit 5 endif run-test-server-on-44321: stamps/netx.stamp stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp cd $(TEST_EXTENSIONS_DIR) ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_TESTS_DIR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(REPRODUCERS_DPARAMETERS) \ -Xbootclasspath/a:$$CLASSPATH net.sourceforge.jnlp.ServerAccess run-test-server-on-random-port: stamps/netx.stamp stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp cd $(TEST_EXTENSIONS_DIR) ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_TESTS_DIR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(REPRODUCERS_DPARAMETERS) \ -Xbootclasspath/a:$$CLASSPATH net.sourceforge.jnlp.ServerAccess randomport run-test-server-on-itwtestsport: stamps/netx.stamp stamps/junit-jnlp-dist-dirs stamps/netx-dist-tests-import-cert-to-public \ stamps/test-extensions-compile.stamp stamps/compile-reproducers-testcases.stamp $(JUNIT_RUNNER_JAR) stamps/copy-reproducers-resources.stamp cd $(TEST_EXTENSIONS_DIR) ; \ CLASSPATH=$(call joinsegments, $(NETX_DIR)/lib/classes.jar $(JUNIT_RUNTIME) $(JUNIT_RUNNER_JAR) . $(TEST_EXTENSIONS_TESTS_DIR)) ; \ $(SYSTEM_JRE_DIR)/bin/java $(REPRODUCERS_DPARAMETERS) \ -Xbootclasspath/a:$$CLASSPATH net.sourceforge.jnlp.ServerAccess $$ITWTESTSPORT clean-netx-tests: clean-netx-unit-tests clean-junit-runner clean-netx-dist-tests clean-test-code-coverage-jacoco if [ -e $(TESTS_DIR)/netx ]; then \ rmdir $(TESTS_DIR)/netx ; \ fi clean-junit-runner: rm -f junit-runner-source-files.txt rm -rf $(JUNIT_RUNNER_DIR) rm -f $(JUNIT_RUNNER_JAR) clean-netx-unit-tests: clean_tests_reports rm -f netx-unit-tests-source-files.txt rm -rf $(NETX_UNIT_TEST_DIR) rm -f $(UNIT_CLASS_NAMES) rm -f stamps/check-pac-functions.stamp rm -f stamps/run-netx-unit-tests.stamp rm -f stamps/netx-unit-tests-compile.stamp clean_tests_reports: rm -rf $(TESTS_DIR)/$(REPORT_STYLES_DIRNAME)/ rm -f $(TESTS_DIR)/*.html rm -f $(TESTS_DIR)/summary_unit.txt rm -f $(TESTS_DIR)/summary_reproducers.txt clean-netx-dist-tests: clean_tests_reports netx-dist-tests-remove-cert-from-public clean-custom-reproducers rm -f test-extensions-source-files.txt rm -f test-extensions-tests-source-files.txt rm -f $(TEST_EXTENSIONS_COMPATIBILITY_SYMLINK) rm -rf $(TEST_EXTENSIONS_TESTS_DIR) rm -rf $(REPRODUCERS_BUILD_DIR) rm -rf $(REPRODUCERS_TESTS_SERVER_DEPLOYDIR) rm -rf $(TEST_EXTENSIONS_DIR) rm -f stamps/junit-jnlp-dist-dirs rm -f stamps/test-extensions-compile.stamp rm -f stamps/test-extensions-tests-compile.stamp rm -f stamps/netx-dist-tests-prepare-reproducers.stamp rm -f stamps/compile-reproducers-testcases.stamp rm -f stamps/copy-reproducers-resources.stamp rm -f stamps/netx-dist-tests-sign-some-reproducers.stamp rm -f stamps/change-dots-to-paths.stamp rm -f junit-jnlp-dist-simple.txt rm -f junit-jnlp-dist-custom.txt rm -f netx-dist-tests-tests-source-files.txt types=($(SIGNED_REPRODUCERS)) ; \ for which in "$${types[@]}" ; do \ rm -f junit-jnlp-dist-$$which.txt ; \ rm -f $(EXPORTED_TEST_CERT_PREFIX)_$$which.$(EXPORTED_TEST_CERT_SUFFIX) ; \ done ; rm -f stamps/exported-test-certs.stamp rm -f stamps/junit-jnlp-dist-signed.stamp rm -f $(REPRODUCERS_CLASS_NAMES) rm -f $(TOP_BUILD_DIR)/$(PRIVATE_KEYSTORE_NAME) rm -f stamps/run-netx-dist-tests.stamp clean-unit-test-code-coverage-jacoco: if [ -e stamps/run-unit-test-code-coverage-jacoco.stamp ]; then \ rm -rf $(NETX_UNIT_TEST_DIR)/coverage ; \ rm -f $(NETX_UNIT_TEST_DIR)/coverage.xml ; \ rm -f $(NETX_UNIT_TEST_DIR)/jacoco.exec ; \ rm -f $(NETX_UNIT_TEST_DIR)/tests-output_withEmma.xml ; \ rm -f stamps/run-unit-test-code-coverage-jacoco.stamp ; \ fi clean-reproducers-test-code-coverage-jacoco: if [ -e stamps/run-reproducers-test-code-coverage-jacoco.stamp ]; then \ rm -rf $(TEST_EXTENSIONS_DIR)/coverage-javaws ; \ rm -f $(TEST_EXTENSIONS_DIR)/coverage-javaws.xml ; \ rm -f $(TEST_EXTENSIONS_DIR)/jacoco_javaws.exec ; \ rm -rf $(TEST_EXTENSIONS_DIR)/coverage-plugin ; \ rm -f $(TEST_EXTENSIONS_DIR)/coverage-plugin.xml ; \ rm -f $(TEST_EXTENSIONS_DIR)/jacoco_plugin.exec ; \ rm -rf $(TEST_EXTENSIONS_DIR)/coverage ; \ rm -f $(TEST_EXTENSIONS_DIR)/coverage.xml ; \ rm -f $(TEST_EXTENSIONS_DIR)/jacoco-merged-reproducers.exec ; \ rm -f $(TEST_EXTENSIONS_DIR)/tests-output_withEmma.xml ; \ rm -f stamps/run-reproducers-test-code-coverage-jacoco.stamp ; \ fi clean-test-code-coverage-jacoco: clean-unit-test-code-coverage-jacoco clean-reproducers-test-code-coverage-jacoco clean-test-code-coverage-tools-jacoco if [ -e $(TESTS_DIR)/coverage.xml ]; then \ rm -rf $(TESTS_DIR)/coverage ; \ rm -f $(TESTS_DIR)/jacoco-merged.exec; \ fi clean-test-code-coverage-tools-jacoco: rm -rf $(JACOCO_OPERATOR_DIR) rm -rf $(COVERABLE_PLUGIN_DIR) rm -f stamps/compile-jacoco-operator.stamp; rm -f jacoco-operator-source-files.txt rm -f stamps/build-fake-plugin.stamp # plugin tests if ENABLE_NATIVE_PLUGIN stamps/plugin-tests.stamp: $(PLUGIN_TEST_SRCS) stamps/plugin.stamp mkdir -p plugin/tests/LiveConnect $(SYSTEM_JDK_DIR)/bin/javac $(IT_JAVACFLAGS) \ -d plugin/tests/LiveConnect \ -classpath liveconnect/lib/classes.jar \ $(PLUGIN_TEST_SRCS) ; $(SYSTEM_JDK_DIR)/bin/jar cf plugin/tests/LiveConnect/PluginTest.jar \ plugin/tests/LiveConnect/*.class ; cp -pPR $(SRC_DIR_LINK) $(TOP_SRC_DIR)/plugin/tests/LiveConnect/*.{js,html} \ plugin/tests/LiveConnect ; echo "Done. Now launch \"firefox file://`pwd`/index.html\"" ; mkdir -p stamps touch stamps/plugin-tests.stamp endif printvarsfile: $(MAKE) printvars > $@ printvars: $(foreach v, $(.VARIABLES), $(info $(v)=$($(v)))) # Target Aliases # =============== add-netx: stamps/add-netx.stamp add-netx-debug: stamps/add-netx-debug.stamp netx: stamps/netx.stamp netx-dist: stamps/netx-dist.stamp plugin: stamps/plugin.stamp plugin-tests: stamps/plugin-tests.stamp check-pac-functions: stamps/check-pac-functions.stamp run-netx-unit-tests: stamps/run-netx-unit-tests.stamp links: stamps/global-links.stamp user-links: stamps/user-links.stamp run-netx-dist-tests: stamps/run-netx-dist-tests.stamp run-unit-test-code-coverage-jacoco: stamps/run-unit-test-code-coverage-jacoco.stamp run-reproducers-test-code-coverage-jacoco: stamps/run-reproducers-test-code-coverage-jacoco.stamp